@@ -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
138160def _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 (
0 commit comments