Skip to content

Commit 1f7ade4

Browse files
authored
Parameter mapping: Add option to ignore time-point specific noiseParameters (#51)
Parameter mapping: Add option to ignore time-point specific noiseParameters... ... in case those are fixed values and noiseFormula consists only of one single parameter.
1 parent 4316416 commit 1f7ade4

File tree

3 files changed

+70
-17
lines changed

3 files changed

+70
-17
lines changed

petab/lint.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -558,10 +558,10 @@ def measurement_table_has_timepoint_specific_mappings(
558558
PEtab measurement table
559559
560560
allow_scalar_numeric_noise_parameters:
561-
ignore scalar numeric assignments to noiseParamater placeholders
561+
ignore scalar numeric assignments to noiseParameter placeholders
562562
563563
allow_scalar_numeric_observable_parameters:
564-
ignore scalar numeric assignments to observableParamater
564+
ignore scalar numeric assignments to observableParameter
565565
placeholders
566566
567567
Returns:
@@ -601,7 +601,6 @@ def measurement_table_has_timepoint_specific_mappings(
601601
SIMULATION_CONDITION_ID,
602602
PREEQUILIBRATION_CONDITION_ID])
603603
grouped_df2 = measurement_df.groupby(grouping_cols)
604-
605604
# data frame has timepoint specific overrides if grouping by noise
606605
# parameters and observable parameters in addition to observable,
607606
# condition and preeq id yields more groups

petab/parameter_mapping.py

Lines changed: 58 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def get_optimization_to_simulation_parameter_mapping(
4242
warn_unmapped: Optional[bool] = True,
4343
scaled_parameters: bool = False,
4444
fill_fixed_parameters: bool = True,
45+
allow_timepoint_specific_numeric_noise_parameters: bool = False
4546
) -> List[ParMappingDictQuadruple]:
4647
"""
4748
Create list of mapping dicts from PEtab-problem to SBML parameters.
@@ -65,6 +66,13 @@ def get_optimization_to_simulation_parameter_mapping(
6566
fill_fixed_parameters:
6667
Whether to fill in nominal values for fixed parameters
6768
(estimate=0 in parameters table).
69+
allow_timepoint_specific_numeric_noise_parameters:
70+
Mapping of timepoint-specific parameters overrides is generally
71+
not supported. If this option is set to True, this function will
72+
not fail in case of timepoint-specific fixed noise parameters,
73+
if the noise formula consists only of one single parameter.
74+
It is expected that the respective mapping is performed elsewhere.
75+
The value mapped to the respective parameter here is undefined.
6876
6977
Returns:
7078
Parameter value and parameter scale mapping for all conditions.
@@ -84,7 +92,10 @@ def get_optimization_to_simulation_parameter_mapping(
8492
"""
8593

8694
# Ensure inputs are okay
87-
_perform_mapping_checks(measurement_df)
95+
_perform_mapping_checks(
96+
measurement_df,
97+
allow_timepoint_specific_numeric_noise_parameters= # noqa: E251,E501
98+
allow_timepoint_specific_numeric_noise_parameters)
8899

89100
if simulation_conditions is None:
90101
simulation_conditions = measurements.get_simulation_conditions(
@@ -109,7 +120,8 @@ def get_optimization_to_simulation_parameter_mapping(
109120
_map_condition_arg_packer(
110121
simulation_conditions, measurement_df, condition_df,
111122
parameter_df, sbml_model, simulation_parameters, warn_unmapped,
112-
scaled_parameters, fill_fixed_parameters))
123+
scaled_parameters, fill_fixed_parameters,
124+
allow_timepoint_specific_numeric_noise_parameters))
113125
return list(mapping)
114126

115127
# Run multi-threaded
@@ -120,19 +132,29 @@ def get_optimization_to_simulation_parameter_mapping(
120132
_map_condition_arg_packer(
121133
simulation_conditions, measurement_df, condition_df,
122134
parameter_df, sbml_model, simulation_parameters, warn_unmapped,
123-
scaled_parameters, fill_fixed_parameters))
135+
scaled_parameters, fill_fixed_parameters,
136+
allow_timepoint_specific_numeric_noise_parameters))
124137
return list(mapping)
125138

126139

127-
def _map_condition_arg_packer(simulation_conditions, measurement_df,
128-
condition_df, parameter_df, sbml_model,
129-
simulation_parameters, warn_unmapped,
130-
scaled_parameters, fill_fixed_parameters):
140+
def _map_condition_arg_packer(
141+
simulation_conditions,
142+
measurement_df,
143+
condition_df,
144+
parameter_df,
145+
sbml_model,
146+
simulation_parameters,
147+
warn_unmapped,
148+
scaled_parameters,
149+
fill_fixed_parameters,
150+
allow_timepoint_specific_numeric_noise_parameters
151+
):
131152
"""Helper function to pack extra arguments for _map_condition"""
132153
for _, condition in simulation_conditions.iterrows():
133154
yield(condition, measurement_df, condition_df, parameter_df,
134155
sbml_model, simulation_parameters, warn_unmapped,
135-
scaled_parameters, fill_fixed_parameters)
156+
scaled_parameters, fill_fixed_parameters,
157+
allow_timepoint_specific_numeric_noise_parameters)
136158

137159

138160
def _map_condition(packed_args):
@@ -142,7 +164,8 @@ def _map_condition(packed_args):
142164

143165
(condition, measurement_df, condition_df, parameter_df, sbml_model,
144166
simulation_parameters, warn_unmapped, scaled_parameters,
145-
fill_fixed_parameters) = packed_args
167+
fill_fixed_parameters,
168+
allow_timepoint_specific_numeric_noise_parameters) = packed_args
146169

147170
cur_measurement_df = measurements.get_rows_for_condition(
148171
measurement_df, condition)
@@ -164,6 +187,8 @@ def _map_condition(packed_args):
164187
warn_unmapped=warn_unmapped,
165188
scaled_parameters=scaled_parameters,
166189
fill_fixed_parameters=fill_fixed_parameters,
190+
allow_timepoint_specific_numeric_noise_parameters= # noqa: E251,E501
191+
allow_timepoint_specific_numeric_noise_parameters
167192
)
168193

169194
par_map_sim, scale_map_sim = get_parameter_mapping_for_condition(
@@ -177,6 +202,8 @@ def _map_condition(packed_args):
177202
warn_unmapped=warn_unmapped,
178203
scaled_parameters=scaled_parameters,
179204
fill_fixed_parameters=fill_fixed_parameters,
205+
allow_timepoint_specific_numeric_noise_parameters= # noqa: E251,E501
206+
allow_timepoint_specific_numeric_noise_parameters
180207
)
181208

182209
return par_map_preeq, par_map_sim, scale_map_preeq, scale_map_sim
@@ -193,6 +220,7 @@ def get_parameter_mapping_for_condition(
193220
warn_unmapped: bool = True,
194221
scaled_parameters: bool = False,
195222
fill_fixed_parameters: bool = True,
223+
allow_timepoint_specific_numeric_noise_parameters: bool = False,
196224
) -> Tuple[ParMappingDict, ScaleMappingDict]:
197225
"""
198226
Create dictionary of parameter value and parameter scale mappings from
@@ -218,9 +246,18 @@ def get_parameter_mapping_for_condition(
218246
Optional, saves time if precomputed.
219247
warn_unmapped:
220248
If ``True``, log warning regarding unmapped parameters
249+
scaled_parameters:
250+
Whether parameter values should be scaled.
221251
fill_fixed_parameters:
222252
Whether to fill in nominal values for fixed parameters
223253
(estimate=0 in parameters table).
254+
allow_timepoint_specific_numeric_noise_parameters:
255+
Mapping of timepoint-specific parameters overrides is generally
256+
not supported. If this option is set to True, this function will
257+
not fail in case of timepoint-specific fixed noise parameters,
258+
if the noise formula consists only of one single parameter.
259+
It is expected that the respective mapping is performed elsewhere.
260+
The value mapped to the respective parameter here is undefined.
224261
225262
Returns:
226263
Tuple of two dictionaries. First dictionary mapping model parameter IDs
@@ -229,7 +266,10 @@ def get_parameter_mapping_for_condition(
229266
Second dictionary mapping model parameter IDs to their scale.
230267
NaN is used where no mapping exists.
231268
"""
232-
_perform_mapping_checks(cur_measurement_df)
269+
_perform_mapping_checks(
270+
cur_measurement_df,
271+
allow_timepoint_specific_numeric_noise_parameters= # noqa: E251,E501
272+
allow_timepoint_specific_numeric_noise_parameters)
233273

234274
if simulation_parameters is None:
235275
simulation_parameters = sbml.get_model_parameters(sbml_model,
@@ -426,11 +466,17 @@ def _apply_parameter_table(par_mapping: ParMappingDict,
426466
scale_mapping[problem_par] = scale
427467

428468

429-
def _perform_mapping_checks(measurement_df: pd.DataFrame) -> None:
469+
def _perform_mapping_checks(
470+
measurement_df: pd.DataFrame,
471+
allow_timepoint_specific_numeric_noise_parameters: bool = False
472+
) -> None:
430473
"""Check for PEtab features which we can't account for during parameter
431474
mapping."""
432475

433-
if lint.measurement_table_has_timepoint_specific_mappings(measurement_df):
476+
if lint.measurement_table_has_timepoint_specific_mappings(
477+
measurement_df,
478+
allow_scalar_numeric_noise_parameters= # noqa: E251,E501
479+
allow_timepoint_specific_numeric_noise_parameters):
434480
# we could allow that for floats, since they don't matter in this
435481
# function and would be simply ignored
436482
raise ValueError(

petab/problem.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,12 @@ def get_simulation_conditions_from_measurement_df(self):
608608
return measurements.get_simulation_conditions(self.measurement_df)
609609

610610
def get_optimization_to_simulation_parameter_mapping(
611-
self, warn_unmapped: bool = True, scaled_parameters: bool = False):
611+
self,
612+
warn_unmapped: bool = True,
613+
scaled_parameters: bool = False,
614+
allow_timepoint_specific_numeric_noise_parameters:
615+
bool = False,
616+
):
612617
"""
613618
See get_simulation_to_optimization_parameter_mapping.
614619
"""
@@ -620,7 +625,10 @@ def get_optimization_to_simulation_parameter_mapping(
620625
self.observable_df,
621626
self.sbml_model,
622627
warn_unmapped=warn_unmapped,
623-
scaled_parameters=scaled_parameters)
628+
scaled_parameters=scaled_parameters,
629+
allow_timepoint_specific_numeric_noise_parameters= # noqa: E251,E501
630+
allow_timepoint_specific_numeric_noise_parameters
631+
)
624632

625633
def create_parameter_df(self, *args, **kwargs):
626634
"""Create a new PEtab parameter table

0 commit comments

Comments
 (0)