Skip to content

Commit aeced6d

Browse files
authored
Add Experiment.sorted_periods (#420)
Add `Experiment.sorted_periods` and extend tests.
1 parent 3156df2 commit aeced6d

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

petab/v2/core.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,11 @@ def has_preequilibration(self) -> bool:
631631
"""Check if the experiment has preequilibration enabled."""
632632
return any(period.is_preequilibration for period in self.periods)
633633

634+
@property
635+
def sorted_periods(self) -> list[ExperimentPeriod]:
636+
"""Get the periods of the experiment sorted by time."""
637+
return sorted(self.periods, key=lambda period: period.time)
638+
634639
def sort_periods(self) -> None:
635640
"""Sort the periods of the experiment by time."""
636641
self.periods.sort(key=lambda period: period.time)

tests/v2/test_core.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from sympy.abc import x, y
1111

1212
import petab.v2 as petab
13-
from petab.v2 import Problem
13+
from petab.v2 import C, Problem
1414
from petab.v2.C import (
1515
CONDITION_ID,
1616
ESTIMATE,
@@ -256,18 +256,36 @@ def test_parameter():
256256

257257
def test_experiment():
258258
Experiment(id="experiment1")
259-
Experiment(
260-
id="experiment1", periods=[ExperimentPeriod(time=1, condition_id="c1")]
261-
)
262259

260+
# extra fields allowed
263261
assert Experiment(id="experiment1", non_petab=1).non_petab == 1
264262

263+
# ID required
265264
with pytest.raises(ValidationError, match="Field required"):
266265
Experiment()
267266

267+
# valid ID required
268268
with pytest.raises(ValidationError, match="Invalid ID"):
269269
Experiment(id="experiment 1")
270270

271+
periods = [
272+
ExperimentPeriod(time=C.TIME_PREEQUILIBRATION, condition_ids=["c1"]),
273+
ExperimentPeriod(time=-1, condition_id="c1"),
274+
ExperimentPeriod(time=1, condition_id="c1"),
275+
]
276+
e = Experiment(id="experiment1", periods=list(reversed(periods)))
277+
278+
assert e.has_preequilibration is True
279+
280+
assert e.sorted_periods == periods
281+
assert e.periods != periods
282+
283+
e.sort_periods()
284+
assert e.periods == periods
285+
286+
e.periods.pop(0)
287+
assert e.has_preequilibration is False
288+
271289

272290
def test_condition_table():
273291
assert ConditionTable().free_symbols == set()

0 commit comments

Comments
 (0)