diff --git a/dynamics.py b/dynamics.py index ce8ed25f23877b2fc3061768dee2e96bcf40b962..25637071071b55504f1d59bb402828fe41603193 100644 --- a/dynamics.py +++ b/dynamics.py @@ -848,6 +848,9 @@ class AssignmentSame(Assignment): def __init__(self): pass + def is_view_resample(self) -> bool: + return True + def resample( self, values, @@ -931,6 +934,9 @@ class AssignmentToBacked(Assignment): self.expressions ) + def is_view_resample(self) -> bool: + return False + def resample( self, values, @@ -1045,6 +1051,9 @@ class AssignmentFromBacked(Assignment): self.source_to_target[source_position] = first_target_position self.source_to_target[-1] = self.distributions[-1][1] + def is_view_resample(self) -> bool: + return True + def resample( self, values, @@ -1161,6 +1170,9 @@ class AssignmentCommon(Assignment): last_existing_expression + 1 ) + def is_view_resample(self) -> bool: + return False + def resample( self, values, @@ -1419,6 +1431,30 @@ class PeriodDynamic(Dynamic): return self.dynamic._all_indices() +def is_view_resample(dynamic: Dynamic, target_dynamic: Dynamic) -> bool: + if dynamic == target_dynamic: + return True + elif isinstance(dynamic, TreeDynamic) and isinstance(target_dynamic, TreeDynamic): + if dynamic.root() != target_dynamic.root(): + raise ValueError("Both dynamics have to be part of the same dynamic tree!") + assignment, _, _, _, _ = dynamic.dynamic_tree.get_assignment( + dynamic, target_dynamic + ) + return assignment.is_view_resample() + elif isinstance(dynamic, AggregatedDynamic) and isinstance( + target_dynamic, PeriodDynamic + ): + if dynamic.period_aggregation != target_dynamic.period_aggregation: + raise ValueError( + f"The aggregated dynamic and the period dynamic have to be part of the same period aggregation!" + ) + return True + else: + raise ValueError( + f"Invalid dynamic type combination {type(dynamic)} -> {type(target_dynamic)}!" + ) + + def resample( values, dynamic: Dynamic, target_dynamic: Dynamic ): # values: type hinting a np-array, type hinting a np-array