From 90a249de97000ea712b40c476b5b4f849786eb92 Mon Sep 17 00:00:00 2001 From: Daniel Weindl Date: Thu, 24 Jul 2025 16:55:09 +0200 Subject: [PATCH] Add Experiment.sorted_periods Add Experiment.sorted_periods and extend tests. --- petab/v2/core.py | 5 +++++ tests/v2/test_core.py | 26 ++++++++++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/petab/v2/core.py b/petab/v2/core.py index 43ed7732..c80c8d1d 100644 --- a/petab/v2/core.py +++ b/petab/v2/core.py @@ -597,6 +597,11 @@ def has_preequilibration(self) -> bool: """Check if the experiment has preequilibration enabled.""" return any(period.is_preequilibration for period in self.periods) + @property + def sorted_periods(self) -> list[ExperimentPeriod]: + """Get the periods of the experiment sorted by time.""" + return sorted(self.periods, key=lambda period: period.time) + def sort_periods(self) -> None: """Sort the periods of the experiment by time.""" self.periods.sort(key=lambda period: period.time) diff --git a/tests/v2/test_core.py b/tests/v2/test_core.py index 643f9172..84a14772 100644 --- a/tests/v2/test_core.py +++ b/tests/v2/test_core.py @@ -10,7 +10,7 @@ from sympy.abc import x, y import petab.v2 as petab -from petab.v2 import Problem +from petab.v2 import C, Problem from petab.v2.C import ( CONDITION_ID, ESTIMATE, @@ -255,18 +255,36 @@ def test_parameter(): def test_experiment(): Experiment(id="experiment1") - Experiment( - id="experiment1", periods=[ExperimentPeriod(time=1, condition_id="c1")] - ) + # extra fields allowed assert Experiment(id="experiment1", non_petab=1).non_petab == 1 + # ID required with pytest.raises(ValidationError, match="Field required"): Experiment() + # valid ID required with pytest.raises(ValidationError, match="Invalid ID"): Experiment(id="experiment 1") + periods = [ + ExperimentPeriod(time=C.TIME_PREEQUILIBRATION, condition_ids=["c1"]), + ExperimentPeriod(time=-1, condition_id="c1"), + ExperimentPeriod(time=1, condition_id="c1"), + ] + e = Experiment(id="experiment1", periods=list(reversed(periods))) + + assert e.has_preequilibration is True + + assert e.sorted_periods == periods + assert e.periods != periods + + e.sort_periods() + assert e.periods == periods + + e.periods.pop(0) + assert e.has_preequilibration is False + def test_condition_table(): assert ConditionTable().free_symbols == set()