Source code for parpe.petab

"""Functions related to handling of PEtab files"""
from numbers import Number
from typing import Tuple, Dict, List

from petab import C as ptc
import petab
import pandas as pd


[docs] 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.get(ptc.OBSERVABLE_PARAMETERS, [None] * measurement_df.shape[0]), measurement_df.get(ptc.NOISE_PARAMETERS, [None] * measurement_df.shape[0])): # 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
[docs] def get_observable_placeholders_by_observable( observable_df: pd.DataFrame) -> Dict[str, List[str]]: """Get observable placeholder parameters for all observables Arguments: observable_df: PEtab observable table Returns: Dictionary mapping observable ID to list of placeholder parameters """ return {obs_id: petab.get_formula_placeholders(formula, obs_id, 'observable') for obs_id, formula in zip(observable_df.index, observable_df[ptc.OBSERVABLE_FORMULA])}
[docs] def get_noise_placeholders_by_observable( observable_df: pd.DataFrame) -> Dict[str, List[str]]: """Get noise placeholder parameters for all observables Arguments: observable_df: PEtab observable table Returns: Dictionary mapping observable ID to list of placeholder parameters """ return {obs_id: petab.get_formula_placeholders(formula, obs_id, 'noise') for obs_id, formula in zip(observable_df.index, observable_df[ptc.NOISE_FORMULA])}