from typing import Type, TypeVar, Optional, List, Union
from cfinterface.components.register import Register
from cfinterface.files.registerfile import RegisterFile
from datetime import datetime
import pandas as pd # type: ignore
from inewave.libs.modelos.usinas_hidreletricas import (
HidreletricaCurvaJusante,
HidreletricaCurvaJusantePolinomioPorPartes,
HidreletricaCurvaJusantePolinomioPorPartesSegmento,
HidreletricaCurvaJusanteAfogamentoExplicitoUsina,
HidreletricaCurvaJusanteAfogamentoExplicitoPadrao,
EstacaoBombeamentoLimitesPeriodoPatamar,
EstacaoBombeamentoSubmercado,
EstacaoBombeamento,
HidreletricaProdutibilidadeEspecificaGrade,
HidreletricaPerdaHidraulicaGrade,
VolumeReferencialTipoPadrao,
VolumeReferencialPeriodo,
)
[documentos]
class UsinasHidreletricas(RegisterFile):
"""
Armazena os dados de entrada do NEWAVE referentes aos dados
das usinas hidrelétricas do problema.
"""
T = TypeVar("T", bound=Register)
REGISTERS = [
HidreletricaCurvaJusanteAfogamentoExplicitoUsina,
HidreletricaCurvaJusanteAfogamentoExplicitoPadrao,
HidreletricaCurvaJusantePolinomioPorPartesSegmento,
HidreletricaCurvaJusantePolinomioPorPartes,
HidreletricaCurvaJusante,
HidreletricaProdutibilidadeEspecificaGrade,
HidreletricaPerdaHidraulicaGrade,
EstacaoBombeamentoLimitesPeriodoPatamar,
EstacaoBombeamentoSubmercado,
EstacaoBombeamento,
VolumeReferencialTipoPadrao,
VolumeReferencialPeriodo,
]
def __registros_ou_df(
self, t: Type[T], **kwargs
) -> Optional[Union[T, List[T], pd.DataFrame]]:
if kwargs.get("df"):
return self._as_df(t)
else:
kwargs_sem_df = {k: v for k, v in kwargs.items() if k != "df"}
return self.data.get_registers_of_type(t, **kwargs_sem_df)
[documentos]
def hidreletrica_curvajusante(
self,
codigo_usina: Optional[int] = None,
indice_familia: Optional[int] = None,
nivel_montante_referencia: Optional[float] = None,
df: bool = False,
) -> Optional[
Union[
HidreletricaCurvaJusante,
List[HidreletricaCurvaJusante],
pd.DataFrame,
]
]:
"""
Obtém registros que cadastram uma família de curvas
de jusante para uma usina hidrelétrica. Opcionalmente,
o retorno pode ser transformado em um `DataFrame`, apenas
para leitura das informações.
:param codigo_usina: código que especifica a usina
:type codigo_usina: int | None
:param indice_familia: índice da família de polinômios
:type indice_familia: int | None
:param nivel_montante_referencia: nível de montante de usina de
jusante para cálculo da queda
:type nivel_montante_referencia: float | None
:param df: ignorar os filtros e retornar
todos os dados de registros como um DataFrame
:type df: bool
:return: Um ou mais registros, se existirem.
:rtype: `HidreletricaCurvaJusante` |
List[`HidreletricaCurvaJusante`] | `None` | `DataFrame`
"""
return self.__registros_ou_df(
HidreletricaCurvaJusante,
codigo_usina=codigo_usina,
indice_familia=indice_familia,
nivel_montante_referencia=nivel_montante_referencia,
df=df,
)
[documentos]
def hidreletrica_curvajusante_polinomio(
self,
codigo_usina: Optional[int] = None,
indice_familia: Optional[int] = None,
numero_polinomios: Optional[int] = None,
df: bool = False,
) -> Optional[
Union[
HidreletricaCurvaJusantePolinomioPorPartes,
List[HidreletricaCurvaJusantePolinomioPorPartes],
pd.DataFrame,
]
]:
"""
Obtém registros que cadastram uma família de curvas
de jusante para uma usina hidrelétrica. Opcionalmente,
o retorno pode ser transformado em um `DataFrame`, apenas
para leitura das informações.
:param codigo_usina: código que especifica a usina
:type codigo_usina: int | None
:param indice_familia: índice da família de polinômios
:type indice_familia: int | None
:param numero_polinomios: número de polinômios da família
:type numero_polinomios: int | None
:param df: ignorar os filtros e retornar
todos os dados de registros como um DataFrame
:type df: bool
:return: Um ou mais registros, se existirem.
:rtype: `HidreletricaCurvaJusantePolinomioPorPartes` |
List[`HidreletricaCurvaJusantePolinomioPorPartes`] | `None` | `DataFrame`
"""
return self.__registros_ou_df(
HidreletricaCurvaJusantePolinomioPorPartes,
codigo_usina=codigo_usina,
indice_familia=indice_familia,
numero_polinomios=numero_polinomios,
df=df,
)
[documentos]
def hidreletrica_curvajusante_polinomio_segmento(
self,
codigo_usina: Optional[int] = None,
indice_familia: Optional[int] = None,
indice_polinomio: Optional[int] = None,
limite_inferior_vazao_jusante: Optional[float] = None,
limite_superior_vazao_jusante: Optional[float] = None,
coeficiente_a0: Optional[float] = None,
coeficiente_a1: Optional[float] = None,
coeficiente_a2: Optional[float] = None,
coeficiente_a3: Optional[float] = None,
coeficiente_a4: Optional[float] = None,
df: bool = False,
) -> Optional[
Union[
HidreletricaCurvaJusantePolinomioPorPartesSegmento,
List[HidreletricaCurvaJusantePolinomioPorPartesSegmento],
pd.DataFrame,
]
]:
"""
Obtém registros que cadastram os polinômios para cada família de curvas
de jusante para uma usina hidrelétrica. Opcionalmente,
o retorno pode ser transformado em um `DataFrame`, apenas
para leitura das informações.
:param codigo_usina: código que especifica a usina
:type codigo_usina: int | None
:param indice_familia: índice da família de polinômios
:type indice_familia: int | None
:param indice_polinomio: índice do polinômio da família
:type indice_polinomio: int | None
:param limite_inferior_vazao_jusante: limite inferior de vazão de
jusante para janela de validade do polinômio
:type limite_inferior_vazao_jusante: float | None
:param limite_superior_vazao_jusante: limite superior de vazão de
jusante para janela de validade do polinômio
:type limite_superior_vazao_jusante: float | None
:param coeficiente_a0: coeficiente de grau 0 do polinômio
:type coeficiente_a0: float | None
:param coeficiente_a1: coeficiente de grau 1 do polinômio
:type coeficiente_a1: float | None
:param coeficiente_a2: coeficiente de grau 2 do polinômio
:type coeficiente_a2: float | None
:param coeficiente_a3: coeficiente de grau 3 do polinômio
:type coeficiente_a3: float | None
:param coeficiente_a4: coeficiente de grau 4 do polinômio
:type coeficiente_a4: float | None
:param df: ignorar os filtros e retornar
todos os dados de registros como um DataFrame
:type df: bool
:return: Um ou mais registros, se existirem.
:rtype: :class:`HidreletricaCurvaJusantePolinomioPorPartesSegmento` |
list[:class:`HidreletricaCurvaJusantePolinomioPorPartesSegmento`] |
None
"""
return self.__registros_ou_df(
HidreletricaCurvaJusantePolinomioPorPartesSegmento,
codigo_usina=codigo_usina,
indice_familia=indice_familia,
indice_polinomio=indice_polinomio,
limite_inferior_vazao_jusante=limite_inferior_vazao_jusante,
limite_superior_vazao_jusante=limite_superior_vazao_jusante,
coeficiente_a0=coeficiente_a0,
coeficiente_a1=coeficiente_a1,
coeficiente_a2=coeficiente_a2,
coeficiente_a3=coeficiente_a3,
coeficiente_a4=coeficiente_a4,
df=df,
)
[documentos]
def hidreletrica_curvajusante_afogamentoexplicito_usina(
self,
codigo_usina: Optional[int] = None,
considera_afogamento: Optional[str] = None,
df: bool = False,
) -> Optional[
Union[
HidreletricaCurvaJusanteAfogamentoExplicitoUsina,
List[HidreletricaCurvaJusanteAfogamentoExplicitoUsina],
pd.DataFrame,
]
]:
"""
Obtém registros que habilitam ou desabilitam a consideração
do tratamento do afogamento explícito por usina. Opcionalmente,
o retorno pode ser transformado em um `DataFrame`, apenas
para leitura das informações.
:param codigo_usina: código que especifica a usina
:type codigo_usina: int | None
:param considera_afogamento: habilitação do afogamento
:type considera_afogamento: str | None
:type df: bool
:return: Um ou mais registros, se existirem.
:rtype: `HidreletricaCurvaJusante` |
List[`HidreletricaCurvaJusante`] | `None` | `DataFrame`
"""
return self.__registros_ou_df(
HidreletricaCurvaJusanteAfogamentoExplicitoUsina,
codigo_usina=codigo_usina,
considera_afogamento=considera_afogamento,
df=df,
)
[documentos]
def hidreletrica_curvajusante_afogamentoexplicito_padrao(
self, considera_afogamento: Optional[str] = None, df: bool = False
) -> Optional[
Union[
HidreletricaCurvaJusanteAfogamentoExplicitoPadrao,
List[HidreletricaCurvaJusanteAfogamentoExplicitoPadrao],
pd.DataFrame,
]
]:
"""
Obtém registros que habilitam ou desabilitam a consideração
do tratamento do afogamento explícito padrão.
:param considera_afogamento: habilitação do afogamento
:type considera_afogamento: str | None
"""
return self.__registros_ou_df(
HidreletricaCurvaJusanteAfogamentoExplicitoPadrao,
considera_afogamento=considera_afogamento,
df=df,
)
# -----------
[documentos]
def hidreletrica_produtibilidade_especifica_grade(
self, codigo_usina: Optional[int] = None, df: bool = False
) -> Optional[
Union[
HidreletricaProdutibilidadeEspecificaGrade,
List[HidreletricaProdutibilidadeEspecificaGrade],
pd.DataFrame,
]
]:
"""
Obtém registros que determinam os valores de produtibilidade
específica de uma UHE em grade.
:param codigo_usina: código da usina associada
:type codigo_usina: int | None
"""
return self.__registros_ou_df(
HidreletricaProdutibilidadeEspecificaGrade,
codigo_usina=codigo_usina,
df=df,
)
[documentos]
def hidreletrica_perda_hidraulica_grade(
self, codigo_usina: Optional[int] = None, df: bool = False
) -> Optional[
Union[
HidreletricaPerdaHidraulicaGrade,
List[HidreletricaPerdaHidraulicaGrade],
pd.DataFrame,
]
]:
"""
Obtém registros que determinam os valores de perda
hidráulica de uma UHE em grade.
:param codigo_usina: código da usina associada
:type codigo_usina: int | None
"""
return self.__registros_ou_df(
HidreletricaPerdaHidraulicaGrade,
codigo_usina=codigo_usina,
df=df,
)
[documentos]
def estacao_bombeamento_limites_periodo_patamar(
self,
codigo_estacao: Optional[int] = None,
data_inicio: Optional[datetime] = None,
data_fim: Optional[datetime] = None,
patamar: Optional[int] = None,
df: bool = False,
) -> Optional[
Union[
EstacaoBombeamentoLimitesPeriodoPatamar,
List[EstacaoBombeamentoLimitesPeriodoPatamar],
pd.DataFrame,
]
]:
"""
Obtém registros que determinam os limites de bombeamento
de uma estação por período e patamar.
:param codigo_estacao: código da estação associada
:type codigo_estacao: int | None
:param data_inicio: data de início da validade dos limites
:type data_inicio: datetime | None
:param data_fim: data de fim da validade dos limites
:type data_fim: datetime | None
:param patamar: patamar de validade dos limites
:type patamar: int | None
"""
return self.__registros_ou_df(
EstacaoBombeamentoLimitesPeriodoPatamar,
codigo_estacao=codigo_estacao,
data_inicio=data_inicio,
data_fim=data_fim,
patamar=patamar,
df=df,
)
[documentos]
def estacao_bombeamento_submercado(
self,
codigo_estacao: Optional[int] = None,
codigo_submercado: Optional[int] = None,
df: bool = False,
) -> Optional[
Union[
EstacaoBombeamentoSubmercado,
List[EstacaoBombeamentoSubmercado],
pd.DataFrame,
]
]:
"""
Obtém registros que relacionam estações de bombeamento
e submercados.
:param codigo_estacao: código da estação associada
:type codigo_estacao: int | None
:param codigo_submercado: código do submercado associado
:type codigo_submercado: int | None
"""
return self.__registros_ou_df(
EstacaoBombeamentoSubmercado,
codigo_estacao=codigo_estacao,
codigo_submercado=codigo_submercado,
df=df,
)
[documentos]
def estacao_bombeamento(
self,
codigo_estacao: Optional[int] = None,
nome_estacao: Optional[str] = None,
codigo_usina_origem: Optional[int] = None,
codigo_usina_destino: Optional[int] = None,
df: bool = False,
) -> Optional[
Union[
EstacaoBombeamento,
List[EstacaoBombeamento],
pd.DataFrame,
]
]:
"""
Obtém registros que definem uma estação de bombeamento.
:param codigo_estacao: código da estação associada
:type codigo_estacao: int | None
"""
return self.__registros_ou_df(
EstacaoBombeamento,
codigo_estacao=codigo_estacao,
nome_estacao=nome_estacao,
codigo_usina_origem=codigo_usina_origem,
codigo_usina_destino=codigo_usina_destino,
df=df,
)
[documentos]
def volume_referencial_tipo_padrao(
self,
df: bool = False,
) -> Optional[
Union[
VolumeReferencialTipoPadrao,
List[VolumeReferencialTipoPadrao],
pd.DataFrame,
]
]:
"""
Obtém registros que definem o tipo de volume de referência.
"""
return self.__registros_ou_df(
VolumeReferencialTipoPadrao,
df=df,
)
[documentos]
def volume_referencial_periodo(
self,
codigo_usina: Optional[int] = None,
data_inicio: Optional[datetime] = None,
data_fim: Optional[datetime] = None,
df: bool = False,
) -> Optional[
Union[
VolumeReferencialPeriodo,
List[VolumeReferencialPeriodo],
pd.DataFrame,
]
]:
"""
Obtém registros que definem o volume de referência por perídoo
para cada usina hidrelétrica.
:param codigo_usina: código da usina associada
:type codigo_usina: int | None
:param data_inicio: data de início da validade da referência
:type data_inicio: datetime | None
:param data_fim: data de fim da validade da referência
:type data_fim: datetime | None
"""
return self.__registros_ou_df(
VolumeReferencialPeriodo,
codigo_usina=codigo_usina,
data_inicio=data_inicio,
data_fim=data_fim,
df=df,
)