Exemple #1
0
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
Exemple #2
0
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) == []
Exemple #3
0
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
Exemple #4
0
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')
Exemple #5
0
 def _get_overrides():
     return split_parameter_replacement_list(row.noiseParameters)
Exemple #6
0
 def _get_overrides():
     return split_parameter_replacement_list(row.observableParameters)