Skip to content

Commit

Permalink
..
Browse files Browse the repository at this point in the history
  • Loading branch information
dweindl committed Dec 18, 2024
1 parent 68c0c6e commit 48a04fe
Show file tree
Hide file tree
Showing 35 changed files with 116 additions and 115 deletions.
53 changes: 15 additions & 38 deletions petabtests/cases/v2.0.0/pysb/0001/0001.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
from inspect import cleandoc

import pandas as pd
from petab.v1.C import *

from petabtests import DEFAULT_PYSB_FILE, PetabTestCase, analytical_a
from petab.v2 import Problem
from petab.v2.C import *

DESCRIPTION = cleandoc("""
## Objective
Expand All @@ -19,43 +18,21 @@

# problem --------------------------------------------------------------------

condition_df = pd.DataFrame(
data={
CONDITION_ID: ["c0"],
}
).set_index([CONDITION_ID])
problem = Problem()

measurement_df = pd.DataFrame(
data={
OBSERVABLE_ID: ["obs_a", "obs_a"],
SIMULATION_CONDITION_ID: ["c0", "c0"],
TIME: [0, 10],
MEASUREMENT: [0.7, 0.1],
}
)
problem.add_observable("obs_a", "A", noise_formula=0.5)

observable_df = pd.DataFrame(
data={
OBSERVABLE_ID: ["obs_a"],
OBSERVABLE_FORMULA: ["A"],
NOISE_FORMULA: [0.5],
}
).set_index([OBSERVABLE_ID])
problem.add_measurement("obs_a", "", time=0, measurement=0.7)
problem.add_measurement("obs_a", "", time=10, measurement=0.1)

parameter_df = pd.DataFrame(
data={
PARAMETER_ID: ["a0", "b0", "k1", "k2"],
PARAMETER_SCALE: [LIN] * 4,
LOWER_BOUND: [0] * 4,
UPPER_BOUND: [10] * 4,
NOMINAL_VALUE: [1, 0, 0.8, 0.6],
ESTIMATE: [1] * 4,
}
).set_index(PARAMETER_ID)
problem.add_parameter("a0", lb=0, ub=10, nominal_value=1, scale=LIN)
problem.add_parameter("b0", lb=0, ub=10, nominal_value=0, scale=LIN)
problem.add_parameter("k1", lb=0, ub=10, nominal_value=0.8, scale=LIN)
problem.add_parameter("k2", lb=0, ub=10, nominal_value=0.6, scale=LIN)

# solutions ------------------------------------------------------------------

simulation_df = measurement_df.copy(deep=True).rename(
simulation_df = problem.measurement_df.copy(deep=True).rename(
columns={MEASUREMENT: SIMULATION}
)
simulation_df[SIMULATION] = [
Expand All @@ -68,9 +45,9 @@
brief="Simulation. Nothing special.",
description=DESCRIPTION,
model=DEFAULT_PYSB_FILE,
condition_dfs=[condition_df],
observable_dfs=[observable_df],
measurement_dfs=[measurement_df],
condition_dfs=[problem.condition_df],
observable_dfs=[problem.observable_df],
measurement_dfs=[problem.measurement_df],
simulation_dfs=[simulation_df],
parameter_df=parameter_df,
parameter_df=problem.parameter_df,
)
4 changes: 2 additions & 2 deletions petabtests/cases/v2.0.0/pysb/0001/_0001.yaml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
format_version: 2.0.0
parameter_file: _parameters.tsv
problems:
- condition_files:
- _conditions.tsv
- condition_files: []
experiment_files: []
measurement_files:
- _measurements.tsv
model_files:
Expand Down
6 changes: 3 additions & 3 deletions petabtests/cases/v2.0.0/pysb/0001/_measurements.tsv
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
observableId simulationConditionId time measurement
obs_a c0 0 0.7
obs_a c0 10 0.1
observableId experimentId time measurement
obs_a 0 0.7
obs_a 10 0.1
10 changes: 5 additions & 5 deletions petabtests/cases/v2.0.0/pysb/0001/_parameters.tsv
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
parameterId parameterScale lowerBound upperBound nominalValue estimate
a0 lin 0 10 1.0 1
b0 lin 0 10 0.0 1
k1 lin 0 10 0.8 1
k2 lin 0 10 0.6 1
parameterId estimate nominalValue parameterScale lowerBound upperBound
a0 1 1.0 lin 0 10
b0 1 0.0 lin 0 10
k1 1 0.8 lin 0 10
k2 1 0.6 lin 0 10
6 changes: 3 additions & 3 deletions petabtests/cases/v2.0.0/pysb/0001/_simulations.tsv
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
observableId simulationConditionId time simulation
obs_a c0 0 1.0
obs_a c0 10 0.42857190373069665
observableId experimentId time simulation
obs_a 0 1.0
obs_a 10 0.42857190373069665
62 changes: 22 additions & 40 deletions petabtests/cases/v2.0.0/pysb/0003/0003.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from inspect import cleandoc

import pandas as pd
from petab.v1.C import *
from petab.v2 import Problem
from petab.v2.C import *

from petabtests import DEFAULT_PYSB_FILE, PetabTestCase, analytical_a

Expand All @@ -24,47 +24,29 @@
""")

# problem --------------------------------------------------------------------
problem = Problem()

condition_df = pd.DataFrame(
data={
CONDITION_ID: ["c0"],
}
).set_index([CONDITION_ID])

measurement_df = pd.DataFrame(
data={
OBSERVABLE_ID: ["obs_a", "obs_a"],
SIMULATION_CONDITION_ID: ["c0", "c0"],
TIME: [0, 10],
MEASUREMENT: [0.7, 0.1],
OBSERVABLE_PARAMETERS: ["0.5;2", "0.5;2"],
}
problem.add_observable(
"obs_a",
"observableParameter1_obs_a * A + observableParameter2_obs_a",
noise_formula=0.5,
)

observable_df = pd.DataFrame(
data={
OBSERVABLE_ID: ["obs_a"],
OBSERVABLE_FORMULA: [
"observableParameter1_obs_a * A + " "observableParameter2_obs_a"
],
NOISE_FORMULA: [0.5],
}
).set_index([OBSERVABLE_ID])
problem.add_measurement(
"obs_a", "", time=0, measurement=0.7, observable_parameters=(0.5, 2)
)
problem.add_measurement(
"obs_a", "", time=10, measurement=0.1, observable_parameters=(0.5, 2)
)

parameter_df = pd.DataFrame(
data={
PARAMETER_ID: ["a0", "b0", "k1", "k2"],
PARAMETER_SCALE: [LIN] * 4,
LOWER_BOUND: [0] * 4,
UPPER_BOUND: [10] * 4,
NOMINAL_VALUE: [1, 0, 0.8, 0.6],
ESTIMATE: [1] * 4,
}
).set_index(PARAMETER_ID)
problem.add_parameter("a0", lb=0, ub=10, nominal_value=1, scale=LIN)
problem.add_parameter("b0", lb=0, ub=10, nominal_value=0, scale=LIN)
problem.add_parameter("k1", lb=0, ub=10, nominal_value=0.8, scale=LIN)
problem.add_parameter("k2", lb=0, ub=10, nominal_value=0.6, scale=LIN)

# solutions ------------------------------------------------------------------

simulation_df = measurement_df.copy(deep=True).rename(
simulation_df = problem.measurement_df.copy(deep=True).rename(
columns={MEASUREMENT: SIMULATION}
)
simulation_df[SIMULATION] = [
Expand All @@ -77,9 +59,9 @@
"table.",
description=DESCRIPTION,
model=DEFAULT_PYSB_FILE,
condition_dfs=[condition_df],
observable_dfs=[observable_df],
measurement_dfs=[measurement_df],
condition_dfs=[problem.condition_df],
observable_dfs=[problem.observable_df],
measurement_dfs=[problem.measurement_df],
simulation_dfs=[simulation_df],
parameter_df=parameter_df,
parameter_df=problem.parameter_df,
)
4 changes: 2 additions & 2 deletions petabtests/cases/v2.0.0/pysb/0003/_0003.yaml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
format_version: 2.0.0
parameter_file: _parameters.tsv
problems:
- condition_files:
- _conditions.tsv
- condition_files: []
experiment_files: []
measurement_files:
- _measurements.tsv
model_files:
Expand Down
6 changes: 3 additions & 3 deletions petabtests/cases/v2.0.0/pysb/0003/_measurements.tsv
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
observableId simulationConditionId time measurement observableParameters
obs_a c0 0 0.7 0.5;2
obs_a c0 10 0.1 0.5;2
observableId experimentId time measurement observableParameters
obs_a 0 0.7 0.5;2
obs_a 10 0.1 0.5;2
10 changes: 5 additions & 5 deletions petabtests/cases/v2.0.0/pysb/0003/_parameters.tsv
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
parameterId parameterScale lowerBound upperBound nominalValue estimate
a0 lin 0 10 1.0 1
b0 lin 0 10 0.0 1
k1 lin 0 10 0.8 1
k2 lin 0 10 0.6 1
parameterId estimate nominalValue parameterScale lowerBound upperBound
a0 1 1.0 lin 0 10
b0 1 0.0 lin 0 10
k1 1 0.8 lin 0 10
k2 1 0.6 lin 0 10
6 changes: 3 additions & 3 deletions petabtests/cases/v2.0.0/pysb/0003/_simulations.tsv
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
observableId simulationConditionId time simulation observableParameters
obs_a c0 0 2.5 0.5;2
obs_a c0 10 2.214285951865348 0.5;2
observableId experimentId time simulation observableParameters
obs_a 0 2.5 0.5;2
obs_a 10 2.214285951865348 0.5;2
1 change: 1 addition & 0 deletions petabtests/cases/v2.0.0/sbml/0019/_0019.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ format_version: 2.0.0
parameter_file: _parameters.tsv
problems:
- condition_files: []
experiment_files: []
mapping_files:
- _mapping.tsv
measurement_files:
Expand Down
2 changes: 0 additions & 2 deletions petabtests/cases/v2.0.0/sbml/0019/_conditions.tsv

This file was deleted.

2 changes: 1 addition & 1 deletion petabtests/cases/v2.0.0/sbml/0019/_simulations.tsv
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
observableId simulationConditionId time simulation
observableId experimentId time simulation
obs_a c0 0 1.0
obs_a c0 10 0.42857190373069665
2 changes: 2 additions & 0 deletions petabtests/cases/v2.0.0/sbml/0020/_experiments.tsv
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
experimentId conditionId time
experiment_c0 c0 0
6 changes: 3 additions & 3 deletions petabtests/cases/v2.0.0/sbml/0020/_measurements.tsv
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
observableId simulationConditionId time measurement
obs_a c0 0 0.7
obs_a c0 10 0.1
experimentId observableId time measurement
experiment_c0 obs_a 0 0.7
experiment_c0 obs_a 10 0.1
12 changes: 11 additions & 1 deletion petabtests/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ def create():
case_dir = get_case_dir(
format_=format_, version=version, id_=case_id
)
logger.info("# ", format_, version, case_id, case_dir)
logger.info(
f"Processing {version}/{format_} #{case_id} at {case_dir}"
)

# load test case module
# directory needs to be removed from path again and the module
Expand All @@ -76,6 +78,7 @@ def create():
test_id=case.id,
parameter_df=case.parameter_df,
condition_dfs=case.condition_dfs,
experiment_dfs=case.experiment_dfs,
observable_dfs=case.observable_dfs,
measurement_dfs=case.measurement_dfs,
model_files=case.model,
Expand Down Expand Up @@ -125,3 +128,10 @@ def clear():
for file_ in os.scandir(case_dir):
if file_.name.startswith("_") and not file_.is_dir():
os.remove(file_.path)


def _cli_create():
"""`petabtests_create` entry point."""
# initialize logging
logging.basicConfig(level=logging.INFO)
create()
37 changes: 34 additions & 3 deletions petabtests/file.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@
import yaml
from petab.v1.C import * # noqa: F403
from .C import * # noqa: F403
from pprint import pprint
import logging
from petab.v2.C import EXPERIMENT_FILES

logger = logging.getLogger("petab_test_suite")


__all__ = [
"get_case_dir",
Expand Down Expand Up @@ -39,6 +45,7 @@ class PetabTestCase:
simulation_dfs: list[pd.DataFrame]
parameter_df: pd.DataFrame
mapping_df: pd.DataFrame = None
experiment_dfs: list[pd.DataFrame] = None


def get_case_dir(id_: int | str, format_: str, version: str) -> Path:
Expand Down Expand Up @@ -76,6 +83,7 @@ def write_problem(
test_id: int,
parameter_df: pd.DataFrame,
condition_dfs: list[pd.DataFrame] | pd.DataFrame,
experiment_dfs: list[pd.DataFrame] | pd.DataFrame,
observable_dfs: list[pd.DataFrame] | pd.DataFrame,
measurement_dfs: list[pd.DataFrame] | pd.DataFrame,
model_files: list[Path] | Path,
Expand All @@ -90,6 +98,7 @@ def write_problem(
test_id: Identifier of the test.
parameter_df: PEtab parameter table.
condition_dfs: PEtab condition tables.
experiment_dfs: PEtab experiment tables.
observable_dfs: PEtab observable tables.
measurement_dfs: PEtab measurement tables.
model_files: PEtab SBML/PySB files.
Expand Down Expand Up @@ -163,6 +172,7 @@ def write_problem(
else:
petab = v2
config[PROBLEMS][0][MODEL_FILES] = {}
config[PROBLEMS][0][EXPERIMENT_FILES] = []
for model_idx, model_file in enumerate(copied_model_files):
config[PROBLEMS][0][MODEL_FILES][f"model_{model_idx}"] = {
MODEL_LANGUAGE: format_,
Expand Down Expand Up @@ -201,6 +211,16 @@ def write_problem(
config[PROBLEMS][0][MEASUREMENT_FILES],
)

# write experiments
if experiment_dfs is not None:
_write_dfs_to_files(
dir_,
"experiments",
v2.write_experiment_df,
experiment_dfs,
config[PROBLEMS][0][EXPERIMENT_FILES],
)

if format_version != 1 and mapping_df is not None:
# write mapping table
mappings_file = "_mapping.tsv"
Expand All @@ -225,7 +245,15 @@ def write_problem(
):
from petab.v2.petab1to2 import petab1to2

# delete previously auto-generated experiments.tsv
exp_file = Path(dir_, "_experiments.tsv")
if exp_file.exists():
exp_file.unlink()
petab1to2(yaml_path, dir_)
# rename auto-generated experiments.tsv
tmp_exp_file = Path(dir_, "experiments.tsv")
if tmp_exp_file.exists():
tmp_exp_file.rename(exp_file)
format_version = 2

# FIXME Until a first libpetab with petab.v1 subpackage is released
Expand All @@ -244,9 +272,11 @@ def write_problem(
)
else:
# v2
validation_result = lint_problem_v2(yaml_path)
if validation_result:
print(validation_result)
validation_results = lint_problem_v2(yaml_path)
if validation_results:
logger.error(f"Validation failed for {dir_}:")
for issue in validation_results:
pprint(issue)
raise RuntimeError(
"Invalid PEtab problem, see messages above."
)
Expand Down Expand Up @@ -322,6 +352,7 @@ def _write_dfs_to_files(
config_list: list[str] = None,
):
"""Write data frames to files and add them to config."""
dfs = [df for df in dfs if df is not None]
for idx, df in enumerate(dfs):
if len(dfs) == 1:
idx = ""
Expand Down
Loading

0 comments on commit 48a04fe

Please sign in to comment.