Source code for policyengine_core.projectors.projector
from typing import TYPE_CHECKING
from policyengine_core.projectors import helpers
if TYPE_CHECKING:
from policyengine_core.populations import Population
from numpy.typing import ArrayLike
[docs]class Projector:
reference_entity: "Population" = None
parent: "Projector" = None
def __getattr__(self, attribute):
projector = helpers.get_projector_from_shortcut(
self.reference_entity, attribute, parent=self
)
if projector:
return projector
reference_attr = getattr(self.reference_entity, attribute)
if not hasattr(reference_attr, "projectable"):
return reference_attr
def projector_function(*args, **kwargs):
result = reference_attr(*args, **kwargs)
return self.transform_and_bubble_up(result)
return projector_function
def __call__(self, *args, **kwargs):
result = self.reference_entity(*args, **kwargs)
return self.transform_and_bubble_up(result)
def transform_and_bubble_up(self, result):
transformed_result = self.transform(result)
if self.parent is None:
return transformed_result
else:
return self.parent.transform_and_bubble_up(transformed_result)
def transform(self, result: ArrayLike):
return NotImplementedError()