from inewave._utils.arquivo import Arquivo
from inewave._utils.bloco import Bloco
from inewave._utils.dadosarquivo import DadosArquivo
from inewave.newave.modelos.pmo import BlocoEcoDgerPMO
from inewave.newave.modelos.pmo import BlocoEafPastTendenciaHidrolPMO
from inewave.newave.modelos.pmo import BlocoEafPastCfugaMedioPMO
from inewave.newave.modelos.pmo import BlocoConvergenciaPMO
from inewave.newave.modelos.pmo import BlocoConfiguracoesExpansaoPMO
from inewave.newave.modelos.pmo import BlocoMARSPMO
from inewave.newave.modelos.pmo import BlocoRiscoDeficitENSPMO
from inewave.newave.modelos.pmo import BlocoCustoOperacaoPMO
from inewave.newave.modelos.pmo import BlocoCustoOperacaoTotalPMO
from inewave.newave.modelos.pmo import LeituraPMO
from typing import List, Type
import numpy as np # type: ignore
import pandas as pd # type: ignore
[documentos]class PMO(Arquivo):
"""
Armazena os dados de entrada do NEWAVE referentes ao
acompanhamento do programa.
Esta classe lida com as informações de entrada fornecidas ao
NEWAVE e reproduzidas no `pmo.dat`, bem como as saídas finais
da execução: custos de operação, energias, déficit, etc.
Em versões futuras, esta classe pode passar a ler os dados
de execução intermediárias do programa.
"""
def __init__(self,
dados: DadosArquivo):
super().__init__(dados)
self.__eco_dger = self.__por_tipo(BlocoEcoDgerPMO)
self.__eafpast_th = self.__por_tipo(BlocoEafPastTendenciaHidrolPMO)
self.__eafpast_cfuga = self.__por_tipo(BlocoEafPastCfugaMedioPMO)
self.__convergencia = self.__por_tipo(BlocoConvergenciaPMO)
self.__configs_exp = self.__por_tipo(BlocoConfiguracoesExpansaoPMO)
self.__mars = self.__por_tipo(BlocoMARSPMO)
self.__risco_deficit = self.__por_tipo(BlocoRiscoDeficitENSPMO)
self.__custos = self.__por_tipo(BlocoCustoOperacaoPMO)
self.__custo_total = self.__por_tipo(BlocoCustoOperacaoTotalPMO)
def __por_tipo(self, tipo: Type[Bloco]) -> List[Bloco]:
return [b for b in self._blocos if isinstance(b, tipo)]
@classmethod
def le_arquivo(cls,
diretorio: str,
nome_arquivo="pmo.dat") -> 'PMO':
leitor = LeituraPMO(diretorio)
r = leitor.le_arquivo(nome_arquivo)
return cls(r)
@property
def eafpast_tendencia_hidrologica(self) -> pd.DataFrame:
"""
Energias afluentes passadas por REE para análise da tendência
hidrológica, em relação à primeira configuração do sistema,
em MWmes.
**Retorna**
`pd.DataFrame`
"""
return self.__eafpast_th[0].dados
@eafpast_tendencia_hidrologica.setter
def eafpast_tendencia_hidrologica(self, eaf: pd.DataFrame):
self.__eafpast_th[0].dados = eaf
@property
def eafpast_cfuga_medio(self) -> pd.DataFrame:
"""
Energias afluentes passadas por REE considerando canal de
fuga médio, em relação à primeira configuração do sistema,
em MWmes.
**Retorna**
`pd.DataFrame`
"""
return self.__eafpast_cfuga[0].dados
@eafpast_cfuga_medio.setter
def eafpast_cfuga_medio(self, eaf: pd.DataFrame):
self.__eafpast_cfuga[0].dados = eaf
@property
def configuracoes_entrada_reservatorio(self) -> np.ndarray:
"""
Configurações do sistema em cada período devido a entrada
de reservatórios e/ou potência de base.
**Retorna**
`np.ndarray`
"""
return self.__configs_exp[0].dados
@configuracoes_entrada_reservatorio.setter
def configuracoes_entrada_reservatorio(self, configs: np.ndarray):
self.__configs_exp[0].dados = configs
@property
def configuracoes_alteracao_potencia(self) -> np.ndarray:
"""
Configurações do sistema em cada período devido a alterações
de potência.
**Retorna**
`np.ndarray`
"""
return self.__configs_exp[1].dados
@configuracoes_alteracao_potencia.setter
def configuracoes_alteracao_potencia(self, configs: np.ndarray):
self.__configs_exp[1].dados = configs
@property
def configuracoes_qualquer_modificacao(self) -> np.ndarray:
"""
Configurações do sistema em cada período devido a alterações
de potência.
**Retorna**
`np.ndarray`
"""
return self.__configs_exp[2].dados
@configuracoes_qualquer_modificacao.setter
def configuracoes_qualquer_modificacao(self, configs: np.ndarray):
self.__configs_exp[2].dados = configs
@property
def retas_perdas_engolimento(self) -> pd.DataFrame:
"""
Retas ajustadas segundo o modelo MARS para corrigir a
energia fio d'água com as perdas por engolimento máximo.
OBS:
Retorna apenas o modelo ajustado para a configuração do
primeiro período de estudo (temporariamente).
**Retorna**
`pd.DataFrame`
"""
return self.__mars[0].dados
@property
def convergencia(self) -> pd.DataFrame:
"""
Tabela de convergência da execução do NEWAVE.
**Retorna**
`pd.DataFrame`
"""
return self.__convergencia[0].dados
@property
def risco_deficit_ens(self) -> pd.DataFrame:
"""
Tabela de riscos de déficit e enegia não suprida (ENS).
**Retorna**
`pandas.DataFrame`
"""
df = pd.DataFrame(self.__risco_deficit[0].dados,
columns=[
"Ano",
"Risco (%) SE",
"EENS (MWMes) SE",
"Risco (%) S",
"EENS (MWMes) S",
"Risco (%) NE",
"EENS (MWMes) NE",
"Risco (%) N",
"EENS (MWMes) N"
])
return df
@property
def custo_operacao_series_simuladas(self) -> pd.DataFrame:
"""
Tabela de custos de operação categorizados para as
séries simuladas.
**Retorna**
`pandas.DataFrame`
"""
df = pd.DataFrame(self.__custos[0].dados,
columns=[
"Valor Esperado",
"Desvio Padrão do VE",
"(%)"
])
indices = pd.Series(BlocoCustoOperacaoPMO.componentes_custo)
df.set_index(indices,
inplace=True)
return df
@property
def valor_esperado_periodo_estudo(self) -> pd.DataFrame:
"""
Tabela de custos de operação esperados para o período
de estudo.
**Retorna**
`pandas.DataFrame`
"""
df = pd.DataFrame(self.__custos[1].dados,
columns=[
"Valor Esperado",
"Desvio Padrão do VE",
"(%)"
])
indices = pd.Series(BlocoCustoOperacaoPMO.componentes_custo)
df.set_index(indices,
inplace=True)
return df
@property
def custo_operacao_referenciado_primeiro_mes(self) -> pd.DataFrame:
"""
Tabela de custos de operação esperados para o período
de estudo, referenciados ao primeiro mês.
**Retorna**
`pandas.DataFrame`
"""
df = pd.DataFrame(self.__custos[2].dados,
columns=[
"Valor Esperado",
"Desvio Padrão do VE",
"(%)"
])
indices = pd.Series(BlocoCustoOperacaoPMO.componentes_custo)
df.set_index(indices,
inplace=True)
return df
@property
def custo_operacao_total(self) -> float:
"""
Custo de operacao total da SF.
**Retorna**
`float`
"""
custo = self.__custo_total[0].dados
return custo[0]
@property
def desvio_custo_operacao_total(self) -> float:
"""
Custo de operacao total da SF.
**Retorna**
`float`
"""
custo = self.__custo_total[0].dados
return custo[1]