Arquitetura Interna¶
Esta página descreve a organização interna do sintetizador-decomp, cobrindo as camadas que compõem a aplicação, o fluxo de dados desde a leitura dos arquivos do DECOMP até a exportação das sínteses, e o papel de cada pacote principal.
Visao Geral¶
O sintetizador-decomp é estruturado em seis pacotes principais dentro do
diretório app/. A organização segue uma arquitetura em camadas: a interface
de linha de comando recebe os comandos do usuário, os despacha para a camada de
serviços, que coordena a leitura dos arquivos de entrada (deck do DECOMP) e a
produção dos DataFrames de saída, que por sua vez são exportados pelo repositório
de persistência.
Cada camada tem uma responsabilidade claramente delimitada e depende apenas das camadas abaixo dela, o que facilita o teste unitário e a substituição de implementações concretas por alternativas (por exemplo, diferentes formatos de exportação ou diferentes fontes de arquivos).
O diagrama a seguir ilustra a dependência entre os pacotes:
┌──────────────────────────────────────────────────────────┐
│ app/app.py (CLI - click) │
└────────────────────────┬─────────────────────────────────┘
│ despacha Commands
▼
┌──────────────────────────────────────────────────────────┐
│ app/services/handlers.py (Handlers) │
└──────────┬───────────────────────────────────┬───────────┘
│ instancia Synthetizers │ usa UnitOfWork
▼ ▼
┌─────────────────────┐ ┌─────────────────────────┐
│ app/services/ │ │ app/services/ │
│ synthesis/ │◄──────────│ unitofwork.py │
│ (Synthetizers) │ usa Deck │ │
└──────────┬──────────┘ └──────────┬──────────────┘
│ lê dados do Deck │ provê repositórios
▼ ▼
┌─────────────────────┐ ┌─────────────────────────┐
│ app/services/ │ │ app/adapters/ │
│ deck/ │ │ repository/ │
│ (Deck + módulos) │ │ (Files + Export) │
└──────────┬──────────┘ └──────────┬──────────────┘
│ via idecomp │ lê/escreve
▼ ▼
┌─────────────────────┐ ┌─────────────────────────┐
│ Arquivos do DECOMP │ │ Arquivos de saída │
│ (dadger.rv0, │ │ sintese/*.parquet │
│ relato, dec_oper, │ │ sintese/*.csv │
│ hidr.dat, etc.) │ │ │
└─────────────────────┘ └─────────────────────────┘
Dependências transversais (usadas em todas as camadas):
app/model/ – enumerações e dataclasses do modelo de dados
app/internal/ – constantes e nomes de colunas compartilhados
app/utils/ – logging, temporização, encoding, singleton, etc.
Fluxo de Dados¶
O fluxo completo de uma execução de síntese percorre as seguintes etapas:
Usuário
│
│ $ sintetizador-decomp operacao CMO_SBM EVER_SBM
│
▼
CLI (app/app.py)
│ Cria: commands.SynthetizeOperation(["CMO_SBM", "EVER_SBM"])
│ Cria: FSUnitOfWork (diretório de trabalho atual)
│
▼
Handler (app/services/handlers.py)
│ Chama: OperationSynthetizer.synthetize(variables, uow)
│
▼
Synthetizer (app/services/synthesis/operation/orchestrator.py)
│ Resolve mnemônicos → OperationSynthesis (variável + agregação espacial)
│ Para cada síntese:
│
├──► Deck (app/services/deck/deck.py)
│ │ Lê e armazena em cache os arquivos do deck do DECOMP
│ │ (dadger.rv0, hidr.dat, relato, dec_oper_usih, ...)
│ │ via AbstractFilesRepository (app/adapters/repository/files.py)
│ │ que usa a biblioteca `idecomp` para parsing
│ └─► Retorna DataFrames Polars com dados do sistema
│
├──► Processa os dados brutos:
│ – Filtra, agrega e calcula limites operativos
│ – Aplica unidades e resolução espacial
│ – Monta o DataFrame final normalizado
│
└──► AbstractExportRepository (app/adapters/repository/export.py)
│ Recebe o DataFrame Polars ou pandas
│ Escreve em disco no formato configurado:
│ PARQUET → sintese/CMO_SBM.parquet
│ CSV → sintese/CMO_SBM.csv
└─► Arquivo de saída gravado
Modulos Principais¶
Esta seção descreve o papel de cada pacote do diretório app/.
app/domain¶
Contém os comandos da aplicação, implementados como dataclasses simples. Os comandos carregam apenas os dados de entrada fornecidos pelo usuário (lista de mnemônicos de variáveis) e não possuem lógica de negócio. Seguem o padrão Command do Domain-Driven Design.
Arquivo |
Papel |
|---|---|
|
Define |
app/model¶
Define o modelo unificado de dados: enumerações de variáveis, agregações espaciais e dataclasses de síntese para cada categoria. Este pacote não realiza I/O nem processamento; é a linguagem compartilhada entre as camadas de serviço e de domínio.
Subpacote |
Papel |
|---|---|
|
Enumerações de variáveis da operação ( |
|
Enumerações de variáveis de cenários; dataclass |
|
Enumeração de variáveis de execução e infeasibilidades;
dataclass |
|
Enumeração de variáveis da política; dataclass |
|
Enumeração de variáveis do sistema; dataclass |
|
Classe |
app/services¶
Contém toda a lógica de orquestração e processamento: os handlers que recebem comandos e os despacham, os sintetizadores que implementam o pipeline de síntese para cada categoria, o Deck que fornece acesso cacheado aos dados de entrada, e o Unit of Work que gerencia o ciclo de vida dos repositórios.
Arquivo / Subpacote |
Papel |
|---|---|
|
Funções de despacho de alto nível. Cada função recebe um Command e um
|
|
Define |
|
|
|
|
|
|
|
|
|
Gerenciamento de cache dos DataFrames intermediários de operação, evitando recálculo de sínteses já processadas dentro de uma mesma execução. |
|
Funções de exportação do resultado final de cada síntese de operação para o repositório de exportação configurado. |
|
Funções do pipeline de transformação dos dados brutos de operação: filtragem, agregação e normalização. |
|
Funções de resolução e agregação espacial das variáveis de operação (por submercado, REE, usina, bacia, sistema interligado). |
|
Stubs de sínteses não disponíveis ou com processamento especial, usados para preencher sínteses faltantes com DataFrames vazios tipados. |
|
Classe |
|
Funções auxiliares de acesso e cache dos objetos de arquivo do DECOMP
via a biblioteca |
|
Constrói DataFrames de entidades do sistema (usinas hidroelétricas, termoelétricas, submercados, patamares). |
|
Funções de construção do contexto de execução (número de revisões, estágios e períodos do estudo). |
|
Funções de processamento dos dados brutos lidos dos arquivos do deck, incluindo conversões de unidades e normalização de séries temporais. |
|
Funções de leitura e interpretação dos resultados de operação a partir
dos arquivos |
|
Funções de leitura dos arquivos de relatório do DECOMP ( |
|
Funções de cálculo dos limites operativos (mínimos e máximos) das variáveis de operação, implementadas com DataFrames Polars. |
app/adapters¶
Implementa o padrão Repository: abstrai o acesso aos arquivos de entrada do DECOMP e a gravação dos arquivos de saída sintetizados, permitindo que a camada de serviços não dependa de detalhes de I/O ou de formatos específicos.
Arquivo |
Papel |
|---|---|
|
Define |
|
Define |
app/utils¶
Fornece utilitários transversais utilizados em todas as camadas da aplicação.
Arquivo |
Papel |
|---|---|
|
Classe |
|
Decorador e função auxiliar |
|
Metaclasse |
|
Função assíncrona de conversão de codificação para normalizar arquivos
de entrada antes da leitura pelo |
|
Função |
|
Utilitários para formatação de saída no terminal. |
|
Funções auxiliares de sistema de arquivos. |
|
Funções de operações numéricas auxiliares. |
|
Função |
app/internal¶
Centraliza as constantes compartilhadas por todas as camadas da aplicação, evitando strings mágicas espalhadas pelo código.
Arquivo |
Papel |
|---|---|
|
Define nomes de colunas dos DataFrames (e.g., |
Modelo de Dados¶
O modelo de dados unificado é descrito em detalhe na página Modelo Unificado de Dados. Em resumo, as sínteses são organizadas em cinco categorias:
Categoria |
Descricao |
|---|---|
Sistema |
Dados estáticos da representação do sistema: submercados, usinas hidroelétricas e termoelétricas, patamares de carga e estágios do estudo. |
Execucao |
Metadados sobre a execução do modelo: versão, título, tempo de processamento, infeasibilidades e relatório de convergência. |
Cenarios |
Séries temporais dos cenários de afluências e vazões naturais utilizados pelo DECOMP na otimização. |
Operacao |
Resultados da operação: custo marginal, energia vertida, geração hidráulica e térmica, vazões, intercâmbios e violações operativas, por estágio, cenário e agregação espacial. |
Politica |
Dados da política operativa: cortes de Benders calculados e estados visitados na construção dos cortes. |
Cada variável sintetizada é identificada por um mnemônico no formato
VARIAVEL_AGREGACAO (e.g., CMO_SBM, EVER_SBM, GHID_UHE).
O mapeamento completo entre mnemônicos e grandezas físicas está em
Modelo Unificado de Dados.