"""PEtab problems consisting of multiple models"""
import os
import pandas as pd
from . import parameters, problem, yaml
from .C import * # noqa: F403
__all__ = ["CompositeProblem"]
[docs]
class CompositeProblem:
"""Representation of a PEtab problem consisting of multiple models
Attributes:
problems:
List of :py:class:`petab.Problem` s
parameter_df:
PEtab parameter DataFrame
"""
def __init__(
self,
parameter_df: pd.DataFrame = None,
problems: list[problem.Problem] = None,
):
"""Constructor
Arguments:
parameter_df:
see CompositeProblem.parameter_df
problems:
see CompositeProblem.problems
"""
self.problems: list[problem.Problem] = problems
self.parameter_df: pd.DataFrame = parameter_df
[docs]
@staticmethod
def from_yaml(yaml_config: dict | str) -> "CompositeProblem":
"""Create from YAML file
Factory method to create a CompositeProblem instance from a PEtab
YAML config file
Arguments:
yaml_config: PEtab configuration as dictionary or YAML file name
"""
if isinstance(yaml_config, str):
path_prefix = os.path.dirname(yaml_config)
yaml_config = yaml.load_yaml(yaml_config)
else:
path_prefix = ""
parameter_df = parameters.get_parameter_df(
os.path.join(path_prefix, yaml_config[PARAMETER_FILE])
)
problems = []
for problem_config in yaml_config[PROBLEMS]:
yaml.assert_single_condition_and_sbml_file(problem_config)
# don't set parameter file if we have multiple models
cur_problem = problem.Problem.from_files(
sbml_file=os.path.join(
path_prefix, problem_config[SBML_FILES][0]
),
measurement_file=[
os.path.join(path_prefix, f)
for f in problem_config[MEASUREMENT_FILES]
],
condition_file=os.path.join(
path_prefix, problem_config[CONDITION_FILES][0]
),
visualization_files=[
os.path.join(path_prefix, f)
for f in problem_config[VISUALIZATION_FILES]
],
observable_files=[
os.path.join(path_prefix, f)
for f in problem_config[OBSERVABLE_FILES]
],
)
problems.append(cur_problem)
return CompositeProblem(parameter_df=parameter_df, problems=problems)