Arquitetura Interna¶
Esta página descreve a organização interna do sintetizador-newave, cobrindo as camadas que compõem a aplicação, o fluxo de dados desde a leitura dos arquivos do NEWAVE até a exportação das sínteses, e o papel de cada pacote principal.
Visao Geral¶
O sintetizador-newave é 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 NEWAVE) 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 inewave │ lê/escreve
▼ ▼
┌─────────────────────┐ ┌─────────────────────────┐
│ Arquivos do NEWAVE │ │ Arquivos de saída │
│ (caso.dat, dger, │ │ sintese/*.parquet │
│ nwlistop, etc.) │ │ sintese/*.csv │
└─────────────────────┘ └─────────────────────────┘
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-newave operacao CMO_SBM EARMF_SIN
│
▼
CLI (app/app.py)
│ Cria: commands.SynthetizeOperation(["CMO_SBM", "EARMF_SIN"])
│ Cria: FSUnitOfWork (diretório de trabalho atual)
│
▼
Handler (app/services/handlers.py)
│ Chama: OperationSynthetizer.synthetize(variables, uow)
│
▼
Synthetizer (app/services/synthesis/operation.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 NEWAVE
│ │ (dger.dat, confhd.dat, patamar.dat, ree.dat, ...)
│ │ via AbstractFilesRepository (app/adapters/repository/files.py)
│ │ que usa a biblioteca `inewave` 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, etapas temporais 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, agregação espacial e etapa
( |
|
Enumeração de variáveis de execução; 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 |
|
|
|
|
|
|
|
|
|
|
|
Classe |
|
Funções auxiliares de acesso e cache dos objetos de arquivo do NEWAVE. |
|
Constrói DataFrames de entidades do sistema (usinas, REEs, submercados). |
|
Funções de processamento de dados hidráulicos (volumes, cotas, produção). |
|
Funções de processamento de dados de usinas termoelétricas. |
|
Funções de processamento de energia natural afluente e armazenada. |
|
Funções de processamento de dados de intercâmbio entre submercados. |
|
Funções de processamento de dados de armazenamento em reservatórios. |
|
Funções de construção de índices temporais (estágios, datas de início e fim). |
|
Funções auxiliares diversas para o processamento do deck. |
|
Funções de acesso a dados da política operativa (cortes, estados). |
|
Funções de cálculo de limites operativos (mínimos e máximos) das variáveis. |
|
Funções de construção do contexto de execução (número de séries, aberturas, estágios individualizados). |
|
Funções de leitura dos arquivos nwlistop via mapeamento (variável, agregação espacial) → função leitora. |
app/adapters¶
Implementa o padrão Repository: abstrai o acesso aos arquivos de entrada do NEWAVE 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 |
|
Contém o mapeamento |
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 |
|
Funções de construção e travessia do grafo de usinas hidroelétricas (relação jusante/montante) para cálculos de agregação em bacias. |
|
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, reservatórios equivalentes de energia (REEs), patamares de carga e estágios do estudo. |
Execucao |
Metadados sobre a execução do modelo: versão, título, tempo de CPU, convergência iterativa e composição de custos. |
Cenarios |
Séries temporais dos cenários estocásticos gerados ou processados pelo modelo: energia natural afluente e vazão incremental, nas etapas forward, backward e simulação final. |
Operacao |
Resultados da operação: custo marginal, energia armazenada, 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 recebidos e os estados visitados na construção dos cortes. |
Cada variável sintetizada é identificada por um mnemônico no formato
VARIAVEL_AGREGACAO (e.g., CMO_SBM, EARMF_SIN, GHID_UHE).
O mapeamento completo entre mnemônicos e grandezas físicas está em
Modelo Unificado de Dados.