Source code for energia.dimensions.time
"""Time"""
import logging
from dataclasses import dataclass
from .._core._dimension import _Dimension
from ..components.temporal.modes import Modes
from ..components.temporal.periods import Periods
logger = logging.getLogger("energia")
[docs]
@dataclass
class Time(_Dimension):
"""
Temporal representation of a system.
All time periods are attached to this object.
:param model: Model to which the representation belongs.
:type model: Model
:ivar name: Name of the dimension, generated based on the class and model name.
:vartype name: str
:ivar periods: List of time periods. Defaults to [].
:vartype periods: list[Periods]
:ivar modes: List of modes. Defaults to [].
:vartype modes: list[Modes]
.. note::
- name is generated based on the Class and Model name
- periods are populated as the program is built.
- _indexed is made the first time Time is indexed.
"""
def __post_init__(self):
self.periods: list[Periods] = []
self.modes: list[Modes] = []
_Dimension.__post_init__(self)
# -----------------------------------------------------
# Helpers
# -----------------------------------------------------
@property
def tree(self) -> dict[int | float, Periods]:
"""Return the tree of periods"""
hrz = self.horizon
return {int(hrz.howmany(prd)): prd for prd in self.periods}
@property
def sorted_periods(self) -> list[Periods]:
"""Sorted periods from densest to sparsest"""
return sorted(self.periods)
# -----------------------------------------------------
# Superlatives
# -----------------------------------------------------
@property
def densest(self) -> Periods:
"""The densest period"""
if self.periods:
return min(self.periods, key=lambda x: x.true_size)
return self.horizon
@property
def sparsest(self) -> Periods:
"""The sparsest period"""
if self.periods:
return max(self.periods, key=lambda x: x.true_size)
return self.horizon
@property
def horizon(self) -> Periods:
"""The sparsest scale is treated as the horizon"""
if self.periods:
return self.sparsest
# if nothing found, make a default period
return self.model._t0()
[docs]
def find(self, size: int | float) -> Periods:
"""Find the period that has the length"""
if size not in self.tree:
# if no math make a default period
logger.info(
"💡 Generating period set t%s of size %s",
len(self.periods),
size,
)
_ = self.model._t0(size=size)
return self.tree[size]
[docs]
def split(self, period: Periods) -> tuple[list[Periods], list[Periods]]:
"""Gives a list of periods which are denser and sparser than period"""
periods = self.sorted_periods
index = periods.index(period)
return periods[:index], periods[index + 1 :]