def get_parameter_override_id_to_placeholder_id( observable_df: pd.DataFrame, measurement_df: pd.DataFrame ) -> Tuple[Dict[str, List[str]], Dict[str, List[str]]]: """Get map of parameter overrides from PEtab measurement table to placeholder parameter IDs from observable table that they are overriding. Arguments: observable_df: PEtab observable table measurement_df: PEtab measurement table Returns: Dictionaries mapping parameter overrides to placeholder parameter IDs that they are overriding, for observable parameters and noise parameters. """ observable_placeholders = \ get_observable_placeholders_by_observable(observable_df) noise_placeholders = \ get_noise_placeholders_by_observable(observable_df) observable_parameter_override_id_to_placeholder_id = {} noise_parameter_override_id_to_placeholder_id = {} def _add(override_to_placeholders): """Add current overrides to destination map""" assert (len(overrides) == len(placeholders)) for override, placeholder in zip(overrides, placeholders): if isinstance(override, Number): # TODO: we ignore numeric overrides, cannot currently use for # hierarchical optimization continue try: override_to_placeholders[override].append(placeholder) except KeyError: override_to_placeholders[override] = [placeholder] for obs_id, obs_par, noise_par \ in zip(measurement_df[ptc.OBSERVABLE_ID], measurement_df[ptc.OBSERVABLE_PARAMETERS], measurement_df[ptc.NOISE_PARAMETERS]): # observable parameters overrides = petab.split_parameter_replacement_list(obs_par) placeholders = observable_placeholders[obs_id] _add(observable_parameter_override_id_to_placeholder_id) # noise parameters overrides = petab.split_parameter_replacement_list(noise_par) placeholders = noise_placeholders[obs_id] assert (len(overrides) == len(placeholders)) _add(noise_parameter_override_id_to_placeholder_id) return observable_parameter_override_id_to_placeholder_id, \ noise_parameter_override_id_to_placeholder_id
def test_split_parameter_replacement_list(): assert petab.split_parameter_replacement_list('') == [] assert petab.split_parameter_replacement_list('param1') == ['param1'] assert petab.split_parameter_replacement_list('param1;param2') \ == ['param1', 'param2'] assert petab.split_parameter_replacement_list('1.0') == [1.0] assert petab.split_parameter_replacement_list('1.0;2.0') == [1.0, 2.0] assert petab.split_parameter_replacement_list('param1;2.2') \ == ['param1', 2.2] assert petab.split_parameter_replacement_list(np.nan) == [] assert petab.split_parameter_replacement_list(1.5) == [1.5] assert petab.split_parameter_replacement_list(None) == []
def evaluate_noise_formula(measurement: pd.Series, noise_formulas: dict, parameter_df: pd.DataFrame, simulation: float) -> float: """Fill in parameters for `measurement` and evaluate noise_formula. Arguments: measurement: A measurement table row. noise_formulas: The noise formulas as computed by `get_symbolic_noise_formulas`. parameter_df: The parameter table. simulation: The simulation corresponding to the measurement, scaled. Returns: noise_value: The noise value. """ # the observable id observable_id = measurement[OBSERVABLE_ID] # extract measurement specific overrides observable_parameter_overrides = petab.split_parameter_replacement_list( measurement.get(NOISE_PARAMETERS, None)) overrides = {} # fill in measurement specific parameters for i_obs_par, obs_par in enumerate(observable_parameter_overrides): overrides[f"noiseParameter{i_obs_par+1}_{observable_id}"] = obs_par # fill in observables overrides[observable_id] = simulation # fill in general parameters for row in parameter_df.itertuples(): overrides[row.Index] = row.nominalValue # replace parametric measurement specific parameters for key, value in overrides.items(): if not isinstance(value, numbers.Number): # is parameter overrides[key] = parameter_df.loc[value, NOMINAL_VALUE] # replace parameters by values in formula noise_formula = noise_formulas[observable_id] noise_value = noise_formula.subs(overrides) # conversion is possible if all parameters are replaced try: noise_value = float(noise_value) except TypeError: raise TypeError( f"Cannot replace all parameters in noise formula {noise_value} " f"for observable {observable_id}.") return noise_value
def test_split_parameter_replacement_list(): assert petab.split_parameter_replacement_list('') == [] assert petab.split_parameter_replacement_list('param1') == ['param1'] assert petab.split_parameter_replacement_list('param1;param2') \ == ['param1', 'param2'] assert petab.split_parameter_replacement_list('1.0') == [1.0] assert petab.split_parameter_replacement_list('1.0;2.0') == [1.0, 2.0] assert petab.split_parameter_replacement_list('param1;2.2') \ == ['param1', 2.2] assert petab.split_parameter_replacement_list(np.nan) == [] assert petab.split_parameter_replacement_list(1.5) == [1.5] assert petab.split_parameter_replacement_list(None) == [] with pytest.raises(ValueError): assert petab.split_parameter_replacement_list('1.0;') with pytest.raises(ValueError): assert petab.split_parameter_replacement_list(';1.0')
def _get_overrides(): return split_parameter_replacement_list(row.noiseParameters)
def _get_overrides(): return split_parameter_replacement_list(row.observableParameters)