Skip to content

Commit 3914829

Browse files
committed
validation and handling of cond ids specified in array files
1 parent 9a5eb5b commit 3914829

4 files changed

Lines changed: 38 additions & 4 deletions

File tree

petab/v2/converters.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,12 @@ def _convert_experiment(self, experiment: Experiment) -> None:
249249
# single-period experiments.
250250
if i_period == 0:
251251
exp_ind_id = self.get_experiment_indicator(experiment.id)
252+
# If condition ids are set by array data, skip as importers handle this
253+
if set(period.condition_ids).issubset(
254+
self._new_problem._get_array_data_condition_ids()
255+
):
256+
continue
257+
252258
for change in self._new_problem.get_changes_for_period(period):
253259
period0_assignments.setdefault(
254260
change.target_id, []

petab/v2/core.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2288,6 +2288,14 @@ def add_experiment(self, id_: str, *args):
22882288
Experiment(id=id_, periods=periods)
22892289
)
22902290

2291+
def _get_array_data_condition_ids(self) -> set[str]:
2292+
"""Get the set of condition IDs that are referenced in the array data files."""
2293+
condition_ids = set()
2294+
for array_data in self.array_data_files:
2295+
for input in array_data.inputs.values():
2296+
condition_ids.update(input.keys())
2297+
return condition_ids
2298+
22912299
def __iadd__(self, other):
22922300
"""Add Observable, Parameter, Measurement, Condition, or Experiment"""
22932301
from .core import (

petab/v2/lint.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,13 @@ class CheckExperimentConditionsExist(ValidationTask):
532532
def run(self, problem: Problem) -> ValidationIssue | None:
533533
messages = []
534534
available_conditions = {c.id for c in problem.conditions}
535+
if problem.array_data_files:
536+
available_conditions |= {
537+
key
538+
for array_data in problem.array_data_files
539+
for input_array in array_data.inputs.values()
540+
for key in input_array.keys()
541+
}
535542
for experiment in problem.experiments:
536543
missing_conditions = (
537544
set(
@@ -972,6 +979,14 @@ def run(self, problem: Problem) -> ValidationIssue | None:
972979
return None
973980

974981

982+
class CheckExperimentalConditionsDefined(ValidationTask):
983+
"""A task to check that all conditions referenced by the experiments
984+
are defined."""
985+
986+
def run(self, problem: Problem) -> ValidationIssue | None:
987+
return None
988+
989+
975990
def get_valid_parameters_for_parameter_table(
976991
problem: Problem,
977992
) -> set[str]:
@@ -1189,4 +1204,5 @@ def get_placeholders(
11891204
#: Validation tasks that should be run PEtab SciML problems
11901205
sciml_validation_tasks = default_validation_tasks + [
11911206
CheckHybridizationTable(),
1207+
CheckExperimentalConditionsDefined(),
11921208
]

tests/v2/test_sciml.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ def _get_test_problem():
4848
-> B; gamma_;
4949
end
5050
""")
51-
problem.add_experiment("e1", 0, "")
51+
problem.add_experiment("e1", 0, "cond1")
5252
problem.add_mapping("net1_input1", "net1.inputs[0][0]")
53-
problem.add_mapping("net1_input2", "net1.inputs[0][1]")
53+
problem.add_mapping("net1_input2", "net1.inputs[1]")
5454
problem.add_mapping("net1_output1", "net1.outputs[0][0]")
5555
problem.add_mapping("net1_ps", "net1.parameters")
5656
problem.add_measurement("B_obs", time=1, measurement=1, experiment_id="e1")
@@ -62,7 +62,7 @@ def _get_test_problem():
6262
"net1_ps", estimate=True, lb=-np.inf, ub=np.inf, nominal_value="array"
6363
)
6464
problem.extensions.sciml.add_hybridization("net1_input1", "A")
65-
problem.extensions.sciml.add_hybridization("net1_input2", "B")
65+
problem.extensions.sciml.add_hybridization("net1_input2", "array")
6666
problem.extensions.sciml.add_hybridization("gamma_", "net1_output1")
6767
problem.extensions.sciml.add_neural_network_from_dict(
6868
"net1",
@@ -106,7 +106,11 @@ def _get_test_problem():
106106
problem.extensions.sciml.add_array_data_from_dict(
107107
{
108108
"metadata": {"pytorch_format": True},
109-
"inputs": {},
109+
"inputs": {
110+
"net1_input2": {
111+
"cond1": np.random.randn(2),
112+
}
113+
},
110114
"parameters": {
111115
"net1": {
112116
"layer1": {

0 commit comments

Comments
 (0)