Skip to content

Commit 3c279ea

Browse files
authored
Fix handling of NaN values for parameters in condition table (#150)
In such cases, the parameter value from the model should be used. So far, NaN was kept.
1 parent 44ff4af commit 3c279ea

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

petab/parameter_mapping.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,20 @@ def _apply_condition_parameters(par_mapping: ParMappingDict,
409409

410410
par_mapping[overridee_id] = core.to_float_if_float(
411411
condition_df.loc[condition_id, overridee_id])
412+
413+
if isinstance(par_mapping[overridee_id], numbers.Number) \
414+
and np.isnan(par_mapping[overridee_id]):
415+
# NaN in the condition table for an entity without time derivative
416+
# indicates that the model value should be used
417+
parameter = sbml_model.getParameter(overridee_id)
418+
if parameter:
419+
par_mapping[overridee_id] = parameter.getValue()
420+
else:
421+
raise NotImplementedError(
422+
"Not sure how to handle NaN in condition table for "
423+
f"{overridee_id}."
424+
)
425+
412426
scale_mapping[overridee_id] = LIN
413427

414428

tests/test_parameter_mapping.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import petab
55
from petab.parameter_mapping import _apply_parameter_table
66
from petab.C import *
7+
from math import nan
78

89
# import fixtures
910
pytest_plugins = [
@@ -268,10 +269,18 @@ def test_all_override(condition_df_2_conditions):
268269
@staticmethod
269270
def test_partial_override(condition_df_2_conditions):
270271
# Condition-specific parameters, keeping original parameters
271-
condition_df = condition_df_2_conditions
272+
condition_df = pd.DataFrame(data={
273+
'conditionId': ['condition1', 'condition2'],
274+
'conditionName': ['', 'Condition 2'],
275+
'fixedParameter1': [1.0, 2.0],
276+
'fixedParameter2': [nan, 2.5],
277+
})
278+
condition_df.set_index('conditionId', inplace=True)
272279

273280
import simplesbml
274281
ss_model = simplesbml.SbmlModel()
282+
ss_model.addParameter('fixedParameter1', 0.5)
283+
ss_model.addParameter('fixedParameter2', 1.0)
275284
ss_model.addParameter('dynamicParameter1', 0.0)
276285
ss_model.addParameter('observableParameter1_obs1', 0.0)
277286
ss_model.addParameter('observableParameter2_obs1', 0.0)
@@ -300,26 +309,30 @@ def test_partial_override(condition_df_2_conditions):
300309

301310
expected = [({},
302311
{'fixedParameter1': 1.0,
312+
'fixedParameter2': 1.0,
303313
'dynamicParameter1': 'dynamicParameter1',
304314
'observableParameter1_obs1': 'obs1par1override',
305315
'observableParameter2_obs1': 'obs1par2cond1override',
306316
'observableParameter1_obs2': np.nan,
307317
},
308318
{},
309319
{'fixedParameter1': LIN,
320+
'fixedParameter2': LIN,
310321
'dynamicParameter1': LIN,
311322
'observableParameter1_obs1': LIN,
312323
'observableParameter2_obs1': LIN,
313324
'observableParameter1_obs2': LIN}),
314325
({},
315326
{'fixedParameter1': 2.0,
327+
'fixedParameter2': 2.5,
316328
'dynamicParameter1': 'dynamicParameter1',
317329
'observableParameter1_obs1': 'obs1par1override',
318330
'observableParameter2_obs1': 'obs1par2cond2override',
319331
'observableParameter1_obs2': 'obs2par1cond2override'
320332
},
321333
{},
322334
{'fixedParameter1': LIN,
335+
'fixedParameter2': LIN,
323336
'dynamicParameter1': LIN,
324337
'observableParameter1_obs1': LIN,
325338
'observableParameter2_obs1': LIN,

0 commit comments

Comments
 (0)