From cca9bce5d30da05684bb7cbc7fab3151b70a3048 Mon Sep 17 00:00:00 2001 From: sebapersson Date: Mon, 15 Dec 2025 08:23:26 +0000 Subject: [PATCH 1/6] Add test for unbounded priors --- petabtests/cases/v2.0.0/sbml/0025/0025.py | 94 +++++++++++++++++++ petabtests/cases/v2.0.0/sbml/0025/README.md | 10 ++ petabtests/cases/v2.0.0/sbml/0025/_0025.yaml | 13 +++ .../v2.0.0/sbml/0025/_0025_solution.yaml | 23 +++++ .../cases/v2.0.0/sbml/0025/_measurements.tsv | 2 + petabtests/cases/v2.0.0/sbml/0025/_model.xml | 19 ++++ .../cases/v2.0.0/sbml/0025/_observables.tsv | 2 + .../cases/v2.0.0/sbml/0025/_parameters.tsv | 14 +++ .../cases/v2.0.0/sbml/0025/_simulations.tsv | 2 + petabtests/cases/v2.0.0/sbml/README.md | 4 + 10 files changed, 183 insertions(+) create mode 100644 petabtests/cases/v2.0.0/sbml/0025/0025.py create mode 100644 petabtests/cases/v2.0.0/sbml/0025/README.md create mode 100644 petabtests/cases/v2.0.0/sbml/0025/_0025.yaml create mode 100644 petabtests/cases/v2.0.0/sbml/0025/_0025_solution.yaml create mode 100644 petabtests/cases/v2.0.0/sbml/0025/_measurements.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0025/_model.xml create mode 100644 petabtests/cases/v2.0.0/sbml/0025/_observables.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0025/_parameters.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0025/_simulations.tsv diff --git a/petabtests/cases/v2.0.0/sbml/0025/0025.py b/petabtests/cases/v2.0.0/sbml/0025/0025.py new file mode 100644 index 0000000..2350c41 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0025/0025.py @@ -0,0 +1,94 @@ +from inspect import cleandoc +from numpy import inf + +from petab.v2.C import * +from petab.v2 import Problem +from petabtests import ( + PetabV2TestCase, + antimony_to_sbml_str, +) +from pathlib import Path +from petab.v2 import PriorDistribution + +DESCRIPTION = cleandoc(r""" +## Objective + +This case tests different non-truncated prior distributions, as well as +implicit uniform priors and fixed parameters. + +## Model + +A simple model with all constant parameters. +""") + +# problem -------------------------------------------------------------------- + +priors = [ + (PriorDistribution.UNIFORM, (2, 8), 2, 8), + (PriorDistribution.NORMAL, (4, 2), -inf, inf), + (PriorDistribution.LOG_NORMAL, (5, 2), 0.0, inf), + (PriorDistribution.CAUCHY, (3, 5), -inf, inf), + (PriorDistribution.CHI_SQUARED, (4), 0.0, inf), + (PriorDistribution.EXPONENTIAL, (3), 0.0, inf), + (PriorDistribution.GAMMA, (3, 5), 0, inf), + (PriorDistribution.LAPLACE, (3, 5), -inf, inf), + (PriorDistribution.LOG_LAPLACE, (3, 5), 0, inf), + (PriorDistribution.LOG_UNIFORM, (3, 5), 3, 5), + (PriorDistribution.RAYLEIGH, (3), 0, inf), +] + +tested_prior_distrs = {pd for pd, _, _, _ in priors} +untested_distrs = [ + pd.value for pd in PriorDistribution if pd not in tested_prior_distrs +] +if untested_distrs: + print("Untested prior distributions:", untested_distrs) + +sbml_file = Path(__file__).parent / "_model.xml" + +parameters = "\n".join( + f"p_{prior_type.value.replace('-', '_')} = 5;" for prior_type, _, _, _ in priors +) +ant_model = f""" +model petab_test_0025 + {parameters} +end +""" +sbml_file.write_text(antimony_to_sbml_str(ant_model)) + +problem = Problem() +for prior_type, prior_pars, support_lb, support_ub in priors: + problem.add_parameter( + f"p_{prior_type.value.replace('-', '_')}", + estimate=True, + lb=support_lb, + ub=support_ub, + nominal_value=5, + prior_distribution=prior_type, + prior_parameters=prior_pars, + ) +# implicit uniform prior +problem.add_parameter("p1", estimate=True, nominal_value=1, lb=0, ub=2) +# fixed, i.e., no prior +problem.add_parameter("p_fixed", estimate=False, nominal_value=1) +# we need some observable and measurement +problem.add_observable("obs_p1", "p1", noise_formula="p_fixed") +problem.add_measurement("obs_p1", experiment_id="", time=0, measurement=1) + +# solutions ------------------------------------------------------------------ + +simulation_df = problem.measurement_df.copy(deep=True).rename( + columns={MEASUREMENT: SIMULATION} +) +simulation_df[SIMULATION] = [ + 1, +] + +case = PetabV2TestCase.from_problem( + id=25, + brief="Non-truncated prior distributions.", + description=DESCRIPTION, + model=sbml_file, + problem=problem, + simulation_df=simulation_df, +) diff --git a/petabtests/cases/v2.0.0/sbml/0025/README.md b/petabtests/cases/v2.0.0/sbml/0025/README.md new file mode 100644 index 0000000..6680ff4 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0025/README.md @@ -0,0 +1,10 @@ +# PEtab test case 0025 + +## Objective + +This case tests different non-truncated prior distributions, as well as +implicit uniform priors and fixed parameters. + +## Model + +A simple model with all constant parameters. diff --git a/petabtests/cases/v2.0.0/sbml/0025/_0025.yaml b/petabtests/cases/v2.0.0/sbml/0025/_0025.yaml new file mode 100644 index 0000000..9265994 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0025/_0025.yaml @@ -0,0 +1,13 @@ +condition_files: [] +experiment_files: [] +format_version: 2.0.0 +measurement_files: +- _measurements.tsv +model_files: + model_0: + language: sbml + location: _model.xml +observable_files: +- _observables.tsv +parameter_files: +- _parameters.tsv diff --git a/petabtests/cases/v2.0.0/sbml/0025/_0025_solution.yaml b/petabtests/cases/v2.0.0/sbml/0025/_0025_solution.yaml new file mode 100644 index 0000000..b46ff38 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0025/_0025_solution.yaml @@ -0,0 +1,23 @@ +chi2: 0.0 +llh: -0.91893853320467 +log_prior: + p1: -0.69314718055995 + p_cauchy: -2.90258780340177 + p_chisquare: -2.27685644868579 + p_exponential: -2.76527895533478 + p_gamma: -3.30258509299405 + p_laplace: -2.70258509299405 + p_log_laplace: -4.19013542294133 + p_log_normal: -4.65851253490362 + p_log_uniform: -0.93771092034198 + p_normal: -1.73708571376462 + p_rayleigh: -1.97667555379101 + p_uniform: -1.79175946922805 +simulation_files: +- _simulations.tsv +tol_chi2: 0.001 +tol_llh: 0.001 +tol_log_prior: 1.0e-14 +tol_simulations: 0.001 +tol_unnorm_log_posterior: 0.001 +unnorm_log_posterior: -30.85385872214566 diff --git a/petabtests/cases/v2.0.0/sbml/0025/_measurements.tsv b/petabtests/cases/v2.0.0/sbml/0025/_measurements.tsv new file mode 100644 index 0000000..291ff46 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0025/_measurements.tsv @@ -0,0 +1,2 @@ +modelId observableId experimentId time measurement observableParameters noiseParameters + obs_p1 0.0 1.0 diff --git a/petabtests/cases/v2.0.0/sbml/0025/_model.xml b/petabtests/cases/v2.0.0/sbml/0025/_model.xml new file mode 100644 index 0000000..bc551d8 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0025/_model.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/petabtests/cases/v2.0.0/sbml/0025/_observables.tsv b/petabtests/cases/v2.0.0/sbml/0025/_observables.tsv new file mode 100644 index 0000000..ca51014 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0025/_observables.tsv @@ -0,0 +1,2 @@ +observableId observableName observableFormula noiseFormula noiseDistribution observablePlaceholders noisePlaceholders +obs_p1 p1 p_fixed normal diff --git a/petabtests/cases/v2.0.0/sbml/0025/_parameters.tsv b/petabtests/cases/v2.0.0/sbml/0025/_parameters.tsv new file mode 100644 index 0000000..f569070 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0025/_parameters.tsv @@ -0,0 +1,14 @@ +parameterId lowerBound upperBound nominalValue estimate priorDistribution priorParameters +p_uniform 2.0 8.0 5.0 true uniform 2.0;8.0 +p_normal -inf inf 5.0 true normal 4.0;2.0 +p_log_normal 0.0 inf 5.0 true log-normal 5.0;2.0 +p_cauchy -inf inf 5.0 true cauchy 3.0;5.0 +p_chisquare 0.0 inf 5.0 true chisquare 4.0 +p_exponential 0.0 inf 5.0 true exponential 3.0 +p_gamma 0.0 inf 5.0 true gamma 3.0;5.0 +p_laplace -inf inf 5.0 true laplace 3.0;5.0 +p_log_laplace 0.0 inf 5.0 true log-laplace 3.0;5.0 +p_log_uniform 3.0 5.0 5.0 true log-uniform 3.0;5.0 +p_rayleigh 0.0 inf 5.0 true rayleigh 3.0 +p1 0.0 2.0 1.0 true +p_fixed 1.0 false diff --git a/petabtests/cases/v2.0.0/sbml/0025/_simulations.tsv b/petabtests/cases/v2.0.0/sbml/0025/_simulations.tsv new file mode 100644 index 0000000..aff90e1 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0025/_simulations.tsv @@ -0,0 +1,2 @@ +modelId observableId experimentId time simulation observableParameters noiseParameters + obs_p1 0.0 1 diff --git a/petabtests/cases/v2.0.0/sbml/README.md b/petabtests/cases/v2.0.0/sbml/README.md index 55bcb7b..b17dfe8 100644 --- a/petabtests/cases/v2.0.0/sbml/README.md +++ b/petabtests/cases/v2.0.0/sbml/README.md @@ -90,3 +90,7 @@ Events during steady-state simulations. Prior distributions. +# [0025](0025/) + +Non-truncated prior distributions. + From defdc8f0d2fcbe17898a02a23726a5a34da8c5cb Mon Sep 17 00:00:00 2001 From: sebapersson Date: Mon, 15 Dec 2025 12:04:44 +0000 Subject: [PATCH 2/6] Add test case triggered at time-point without measurements --- petabtests/cases/v2.0.0/sbml/0028/0028.py | 84 +++++++++++++++++++ petabtests/cases/v2.0.0/sbml/0028/README.md | 12 +++ petabtests/cases/v2.0.0/sbml/0028/_0028.yaml | 17 ++++ .../v2.0.0/sbml/0028/_0028_solution.yaml | 7 ++ .../cases/v2.0.0/sbml/0028/_conditions.tsv | 2 + .../cases/v2.0.0/sbml/0028/_experiments.tsv | 3 + .../cases/v2.0.0/sbml/0028/_mapping.tsv | 2 + .../cases/v2.0.0/sbml/0028/_measurements.tsv | 3 + petabtests/cases/v2.0.0/sbml/0028/_model.xml | 55 ++++++++++++ .../cases/v2.0.0/sbml/0028/_observables.tsv | 2 + .../cases/v2.0.0/sbml/0028/_parameters.tsv | 3 + .../cases/v2.0.0/sbml/0028/_simulations.tsv | 3 + petabtests/cases/v2.0.0/sbml/README.md | 4 +- 13 files changed, 195 insertions(+), 2 deletions(-) create mode 100644 petabtests/cases/v2.0.0/sbml/0028/0028.py create mode 100644 petabtests/cases/v2.0.0/sbml/0028/README.md create mode 100644 petabtests/cases/v2.0.0/sbml/0028/_0028.yaml create mode 100644 petabtests/cases/v2.0.0/sbml/0028/_0028_solution.yaml create mode 100644 petabtests/cases/v2.0.0/sbml/0028/_conditions.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0028/_experiments.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0028/_mapping.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0028/_measurements.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0028/_model.xml create mode 100644 petabtests/cases/v2.0.0/sbml/0028/_observables.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0028/_parameters.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0028/_simulations.tsv diff --git a/petabtests/cases/v2.0.0/sbml/0028/0028.py b/petabtests/cases/v2.0.0/sbml/0028/0028.py new file mode 100644 index 0000000..c768449 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0028/0028.py @@ -0,0 +1,84 @@ +from inspect import cleandoc + +from petab.v2.C import * +from petab.v2 import Problem +from petabtests import PetabV2TestCase, analytical_a, analytical_b, antimony_to_sbml_str +from pathlib import Path + +DESCRIPTION = cleandoc(""" +## Objective + +This case tests applies a PEtab condition at a non-initial time point, +where the condition is triggered at a time point that does not have any +measurements. + +## Model + +A simple conversion reaction `A <=> B` in a single compartment, following +mass action kinetics. +""") + +# problem -------------------------------------------------------------------- +a0 = 1 +b0 = 1 +k1 = 0.8 +k2 = 0.6 + +ant_model = f""" +model *petab_test_0028() + compartment compartment_ = 1; + species A in compartment_, B in compartment_; + + fwd: A => B; compartment_ * k1 * A; + rev: B => A; compartment_ * k2 * B; + + A = 1; + B = 1; + k1 = 0; # overridden by parameter table + k2 = 0; # overridden by parameter table +end +""" +model_file = Path(__file__).parent / "_model.xml" +model_file.write_text(antimony_to_sbml_str(ant_model)) + +problem = Problem() + +problem.add_condition( + "condition1", + "condition1", + A="A + 5.0", +) +problem.add_experiment("experiment1", 0, "", 7, "condition1") + + +problem.add_observable("obs_a", "A", noise_formula="0.5") +problem.add_measurement("obs_a", experiment_id="experiment1", time=0, measurement=0.7) +problem.add_measurement("obs_a", experiment_id="experiment1", time=10, measurement=0.1) + +problem.add_parameter("k1", lb=0, ub=10, nominal_value=k1, estimate=True) +problem.add_parameter("k2", lb=0, ub=10, nominal_value=k2, estimate=True) + + +# solutions ------------------------------------------------------------------ + +simulation_df = problem.measurement_df.copy(deep=True).rename( + columns={MEASUREMENT: SIMULATION} +) +# in the model, concentrations are used, which do not depend on the +# compartment size, so that the species values should stay the same +a7 = analytical_a(7.0, a0=a0, b0=b0, k1=k1, k2=k2) +b7 = analytical_b(7.0, a0=a0, b0=b0, k1=k1, k2=k2) +simulation_df[SIMULATION] = [ + a0, + analytical_a(3.0, a0=(a7 + 5.0), b0=b7, k1=k1, k2=k2) +] + +case = PetabV2TestCase.from_problem( + id=28, + brief="Simulation. None t0 condition applied at time-point " + "without measurements.", + description=DESCRIPTION, + model=model_file, + problem=problem, + simulation_df=simulation_df, +) diff --git a/petabtests/cases/v2.0.0/sbml/0028/README.md b/petabtests/cases/v2.0.0/sbml/0028/README.md new file mode 100644 index 0000000..1f39815 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0028/README.md @@ -0,0 +1,12 @@ +# PEtab test case 0028 + +## Objective + +This case tests applies a PEtab condition at a non-initial time point, +where the condition is triggered at a time point that does not have any +measurements. + +## Model + +A simple conversion reaction `A <=> B` in a single compartment, following +mass action kinetics. diff --git a/petabtests/cases/v2.0.0/sbml/0028/_0028.yaml b/petabtests/cases/v2.0.0/sbml/0028/_0028.yaml new file mode 100644 index 0000000..f698cb3 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0028/_0028.yaml @@ -0,0 +1,17 @@ +condition_files: +- _conditions.tsv +experiment_files: +- _experiments.tsv +format_version: 2.0.0 +mapping_files: +- _mapping.tsv +measurement_files: +- _measurements.tsv +model_files: + model_0: + language: sbml + location: _model.xml +observable_files: +- _observables.tsv +parameter_files: +- _parameters.tsv diff --git a/petabtests/cases/v2.0.0/sbml/0028/_0028_solution.yaml b/petabtests/cases/v2.0.0/sbml/0028/_0028_solution.yaml new file mode 100644 index 0000000..2c02c72 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0028/_0028_solution.yaml @@ -0,0 +1,7 @@ +chi2: 35.00133792381521 +llh: -17.95225166719706 +simulation_files: +- _simulations.tsv +tol_chi2: 0.001 +tol_llh: 0.001 +tol_simulations: 0.001 diff --git a/petabtests/cases/v2.0.0/sbml/0028/_conditions.tsv b/petabtests/cases/v2.0.0/sbml/0028/_conditions.tsv new file mode 100644 index 0000000..61a5bb5 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0028/_conditions.tsv @@ -0,0 +1,2 @@ +conditionId targetId targetValue +condition1 A A + 5.0 diff --git a/petabtests/cases/v2.0.0/sbml/0028/_experiments.tsv b/petabtests/cases/v2.0.0/sbml/0028/_experiments.tsv new file mode 100644 index 0000000..0a16024 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0028/_experiments.tsv @@ -0,0 +1,3 @@ +experimentId time conditionId +experiment1 0.0 +experiment1 7.0 condition1 diff --git a/petabtests/cases/v2.0.0/sbml/0028/_mapping.tsv b/petabtests/cases/v2.0.0/sbml/0028/_mapping.tsv new file mode 100644 index 0000000..a826206 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0028/_mapping.tsv @@ -0,0 +1,2 @@ +petabEntityId modelEntityId name +condition1 condition1 diff --git a/petabtests/cases/v2.0.0/sbml/0028/_measurements.tsv b/petabtests/cases/v2.0.0/sbml/0028/_measurements.tsv new file mode 100644 index 0000000..d003321 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0028/_measurements.tsv @@ -0,0 +1,3 @@ +modelId observableId experimentId time measurement observableParameters noiseParameters + obs_a experiment1 0.0 0.7 + obs_a experiment1 10.0 0.1 diff --git a/petabtests/cases/v2.0.0/sbml/0028/_model.xml b/petabtests/cases/v2.0.0/sbml/0028/_model.xml new file mode 100644 index 0000000..fcb174b --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0028/_model.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment_ + k1 + A + + + + + + + + + + + + + + + + compartment_ + k2 + B + + + + + + + diff --git a/petabtests/cases/v2.0.0/sbml/0028/_observables.tsv b/petabtests/cases/v2.0.0/sbml/0028/_observables.tsv new file mode 100644 index 0000000..251acc7 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0028/_observables.tsv @@ -0,0 +1,2 @@ +observableId observableName observableFormula noiseFormula noiseDistribution observablePlaceholders noisePlaceholders +obs_a A 0.500000000000000 normal diff --git a/petabtests/cases/v2.0.0/sbml/0028/_parameters.tsv b/petabtests/cases/v2.0.0/sbml/0028/_parameters.tsv new file mode 100644 index 0000000..852192d --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0028/_parameters.tsv @@ -0,0 +1,3 @@ +parameterId lowerBound upperBound nominalValue estimate priorDistribution priorParameters +k1 0.0 10.0 0.8 true +k2 0.0 10.0 0.6 true diff --git a/petabtests/cases/v2.0.0/sbml/0028/_simulations.tsv b/petabtests/cases/v2.0.0/sbml/0028/_simulations.tsv new file mode 100644 index 0000000..9cfe9c4 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0028/_simulations.tsv @@ -0,0 +1,3 @@ +modelId observableId experimentId time simulation observableParameters noiseParameters + obs_a experiment1 0.0 1.0 + obs_a experiment1 10.0 3.0428446239911824 diff --git a/petabtests/cases/v2.0.0/sbml/README.md b/petabtests/cases/v2.0.0/sbml/README.md index 05ba7eb..b0255c5 100644 --- a/petabtests/cases/v2.0.0/sbml/README.md +++ b/petabtests/cases/v2.0.0/sbml/README.md @@ -94,7 +94,7 @@ Truncated prior distributions. Non-truncated prior distributions. -# [0025](0025/) +# [0028](0028/) -Non-truncated prior distributions. +Simulation. None t0 condition applied at time-point without measurements. From d9ee27ca44c5b1aeac7c8769d59ce8a78c8c2098 Mon Sep 17 00:00:00 2001 From: sebapersson Date: Mon, 15 Dec 2025 12:17:27 +0000 Subject: [PATCH 3/6] Use default SBML model --- petabtests/cases/v2.0.0/sbml/0028/0028.py | 22 +----- petabtests/cases/v2.0.0/sbml/0028/_model.xml | 71 +++++++++++++++----- 2 files changed, 57 insertions(+), 36 deletions(-) diff --git a/petabtests/cases/v2.0.0/sbml/0028/0028.py b/petabtests/cases/v2.0.0/sbml/0028/0028.py index c768449..f17a66b 100644 --- a/petabtests/cases/v2.0.0/sbml/0028/0028.py +++ b/petabtests/cases/v2.0.0/sbml/0028/0028.py @@ -2,7 +2,7 @@ from petab.v2.C import * from petab.v2 import Problem -from petabtests import PetabV2TestCase, analytical_a, analytical_b, antimony_to_sbml_str +from petabtests import PetabV2TestCase, analytical_a, analytical_b, DEFAULT_SBML_FILE from pathlib import Path DESCRIPTION = cleandoc(""" @@ -23,24 +23,6 @@ b0 = 1 k1 = 0.8 k2 = 0.6 - -ant_model = f""" -model *petab_test_0028() - compartment compartment_ = 1; - species A in compartment_, B in compartment_; - - fwd: A => B; compartment_ * k1 * A; - rev: B => A; compartment_ * k2 * B; - - A = 1; - B = 1; - k1 = 0; # overridden by parameter table - k2 = 0; # overridden by parameter table -end -""" -model_file = Path(__file__).parent / "_model.xml" -model_file.write_text(antimony_to_sbml_str(ant_model)) - problem = Problem() problem.add_condition( @@ -78,7 +60,7 @@ brief="Simulation. None t0 condition applied at time-point " "without measurements.", description=DESCRIPTION, - model=model_file, + model=DEFAULT_SBML_FILE, problem=problem, simulation_df=simulation_df, ) diff --git a/petabtests/cases/v2.0.0/sbml/0028/_model.xml b/petabtests/cases/v2.0.0/sbml/0028/_model.xml index fcb174b..9a91311 100644 --- a/petabtests/cases/v2.0.0/sbml/0028/_model.xml +++ b/petabtests/cases/v2.0.0/sbml/0028/_model.xml @@ -1,49 +1,87 @@ - - - + + + + + + + + + + + + + + + + - + + + - - + + + + + - - + + + + + + + + + + + + + a0 + + + + + b0 + + + + - + - + - + - compartment_ + compartment k1 A - + - + - + - compartment_ + compartment k2 B @@ -51,5 +89,6 @@ + From c7fd7822381f200748a5370f6c1d8151c679d3a7 Mon Sep 17 00:00:00 2001 From: sebapersson Date: Mon, 15 Dec 2025 12:23:48 +0000 Subject: [PATCH 4/6] Fix style --- petabtests/cases/v2.0.0/sbml/0028/0028.py | 1 - 1 file changed, 1 deletion(-) diff --git a/petabtests/cases/v2.0.0/sbml/0028/0028.py b/petabtests/cases/v2.0.0/sbml/0028/0028.py index f17a66b..9de2b96 100644 --- a/petabtests/cases/v2.0.0/sbml/0028/0028.py +++ b/petabtests/cases/v2.0.0/sbml/0028/0028.py @@ -3,7 +3,6 @@ from petab.v2.C import * from petab.v2 import Problem from petabtests import PetabV2TestCase, analytical_a, analytical_b, DEFAULT_SBML_FILE -from pathlib import Path DESCRIPTION = cleandoc(""" ## Objective From 5da198473a769ff66ffe6c79a21fa71abf75c69b Mon Sep 17 00:00:00 2001 From: sebapersson Date: Mon, 15 Dec 2025 13:46:11 +0000 Subject: [PATCH 5/6] Add test case with non-zero start time --- petabtests/cases/v2.0.0/sbml/0029/0029.py | 54 +++++++++++ petabtests/cases/v2.0.0/sbml/0029/README.md | 11 +++ petabtests/cases/v2.0.0/sbml/0029/_0029.yaml | 14 +++ .../v2.0.0/sbml/0029/_0029_solution.yaml | 7 ++ .../cases/v2.0.0/sbml/0029/_experiments.tsv | 2 + .../cases/v2.0.0/sbml/0029/_measurements.tsv | 3 + petabtests/cases/v2.0.0/sbml/0029/_model.xml | 94 +++++++++++++++++++ .../cases/v2.0.0/sbml/0029/_observables.tsv | 2 + .../cases/v2.0.0/sbml/0029/_parameters.tsv | 3 + .../cases/v2.0.0/sbml/0029/_simulations.tsv | 3 + petabtests/cases/v2.0.0/sbml/README.md | 4 +- 11 files changed, 195 insertions(+), 2 deletions(-) create mode 100644 petabtests/cases/v2.0.0/sbml/0029/0029.py create mode 100644 petabtests/cases/v2.0.0/sbml/0029/README.md create mode 100644 petabtests/cases/v2.0.0/sbml/0029/_0029.yaml create mode 100644 petabtests/cases/v2.0.0/sbml/0029/_0029_solution.yaml create mode 100644 petabtests/cases/v2.0.0/sbml/0029/_experiments.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0029/_measurements.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0029/_model.xml create mode 100644 petabtests/cases/v2.0.0/sbml/0029/_observables.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0029/_parameters.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0029/_simulations.tsv diff --git a/petabtests/cases/v2.0.0/sbml/0029/0029.py b/petabtests/cases/v2.0.0/sbml/0029/0029.py new file mode 100644 index 0000000..120d503 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0029/0029.py @@ -0,0 +1,54 @@ +from inspect import cleandoc + +from petab.v2.C import * +from petab.v2.core import * +from petab.v2 import Problem +from petabtests import DEFAULT_SBML_FILE, PetabV2TestCase, analytical_a + +DESCRIPTION = cleandoc(""" +## Objective + +This case features a simple test with two data points with a non-zero +simulation start time. + +## Model + +A simple conversion reaction `A <=> B` in a single compartment, following +mass action kinetics. +""") + +# problem -------------------------------------------------------------------- +a0 = 1.0 +b0 = 1.0 +k1 = 0.8 +k2 = 0.6 + +problem = Problem() +problem.add_experiment("e1", 5.0, "") + +problem.add_observable("obs_a", "A", noise_formula="1") + +problem.add_measurement("obs_a", experiment_id="e1", time=5, measurement=0.01) +problem.add_measurement("obs_a", experiment_id="e1", time=10, measurement=0.1) + +problem.add_parameter("k1", lb=0, ub=10, nominal_value=k1, estimate=True) +problem.add_parameter("k2", lb=0, ub=10, nominal_value=k2, estimate=True) + +# solutions ------------------------------------------------------------------ + +simulation_df = problem.measurement_df.copy(deep=True).rename( + columns={MEASUREMENT: SIMULATION} +) +simulation_df[SIMULATION] = [ + analytical_a(t=(t - 5.0), a0=a0, b0=b0, k1=k1, k2=k2) for t in simulation_df[TIME] +] + + +case = PetabV2TestCase.from_problem( + id=29, + problem=problem, + brief="Simulation. Non-zero simulation start time", + description=DESCRIPTION, + model=DEFAULT_SBML_FILE, + simulation_df=simulation_df, +) diff --git a/petabtests/cases/v2.0.0/sbml/0029/README.md b/petabtests/cases/v2.0.0/sbml/0029/README.md new file mode 100644 index 0000000..831050f --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0029/README.md @@ -0,0 +1,11 @@ +# PEtab test case 0029 + +## Objective + +This case features a simple test with two data points with a non-zero +simulation start time. + +## Model + +A simple conversion reaction `A <=> B` in a single compartment, following +mass action kinetics. diff --git a/petabtests/cases/v2.0.0/sbml/0029/_0029.yaml b/petabtests/cases/v2.0.0/sbml/0029/_0029.yaml new file mode 100644 index 0000000..1c917f1 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0029/_0029.yaml @@ -0,0 +1,14 @@ +condition_files: [] +experiment_files: +- _experiments.tsv +format_version: 2.0.0 +measurement_files: +- _measurements.tsv +model_files: + model_0: + language: sbml + location: _model.xml +observable_files: +- _observables.tsv +parameter_files: +- _parameters.tsv diff --git a/petabtests/cases/v2.0.0/sbml/0029/_0029_solution.yaml b/petabtests/cases/v2.0.0/sbml/0029/_0029_solution.yaml new file mode 100644 index 0000000..819e56b --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0029/_0029_solution.yaml @@ -0,0 +1,7 @@ +chi2: 1.55356258735436 +llh: -2.61465836008652 +simulation_files: +- _simulations.tsv +tol_chi2: 0.001 +tol_llh: 0.001 +tol_simulations: 0.001 diff --git a/petabtests/cases/v2.0.0/sbml/0029/_experiments.tsv b/petabtests/cases/v2.0.0/sbml/0029/_experiments.tsv new file mode 100644 index 0000000..2c386fa --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0029/_experiments.tsv @@ -0,0 +1,2 @@ +experimentId time conditionId +e1 5.0 diff --git a/petabtests/cases/v2.0.0/sbml/0029/_measurements.tsv b/petabtests/cases/v2.0.0/sbml/0029/_measurements.tsv new file mode 100644 index 0000000..a8f8e02 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0029/_measurements.tsv @@ -0,0 +1,3 @@ +modelId observableId experimentId time measurement observableParameters noiseParameters + obs_a e1 5.0 0.01 + obs_a e1 10.0 0.1 diff --git a/petabtests/cases/v2.0.0/sbml/0029/_model.xml b/petabtests/cases/v2.0.0/sbml/0029/_model.xml new file mode 100644 index 0000000..9a91311 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0029/_model.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a0 + + + + + b0 + + + + + + + + + + + + + + + + + compartment + k1 + A + + + + + + + + + + + + + + + + compartment + k2 + B + + + + + + + + diff --git a/petabtests/cases/v2.0.0/sbml/0029/_observables.tsv b/petabtests/cases/v2.0.0/sbml/0029/_observables.tsv new file mode 100644 index 0000000..29fbcf1 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0029/_observables.tsv @@ -0,0 +1,2 @@ +observableId observableName observableFormula noiseFormula noiseDistribution observablePlaceholders noisePlaceholders +obs_a A 1.00000000000000 normal diff --git a/petabtests/cases/v2.0.0/sbml/0029/_parameters.tsv b/petabtests/cases/v2.0.0/sbml/0029/_parameters.tsv new file mode 100644 index 0000000..852192d --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0029/_parameters.tsv @@ -0,0 +1,3 @@ +parameterId lowerBound upperBound nominalValue estimate priorDistribution priorParameters +k1 0.0 10.0 0.8 true +k2 0.0 10.0 0.6 true diff --git a/petabtests/cases/v2.0.0/sbml/0029/_simulations.tsv b/petabtests/cases/v2.0.0/sbml/0029/_simulations.tsv new file mode 100644 index 0000000..bac1c06 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0029/_simulations.tsv @@ -0,0 +1,3 @@ +modelId observableId experimentId time simulation observableParameters noiseParameters + obs_a e1 5.0 1.0 + obs_a e1 10.0 0.8572731259950793 diff --git a/petabtests/cases/v2.0.0/sbml/README.md b/petabtests/cases/v2.0.0/sbml/README.md index 05ba7eb..187e267 100644 --- a/petabtests/cases/v2.0.0/sbml/README.md +++ b/petabtests/cases/v2.0.0/sbml/README.md @@ -94,7 +94,7 @@ Truncated prior distributions. Non-truncated prior distributions. -# [0025](0025/) +# [0029](0029/) -Non-truncated prior distributions. +Simulation. Non-zero simulation start time From 1c5de275109db40ec266588c7901ff8a6fc26c30 Mon Sep 17 00:00:00 2001 From: sebapersson Date: Mon, 15 Dec 2025 15:33:55 +0000 Subject: [PATCH 6/6] Update 0018 README to mention case 0029 --- petabtests/cases/v2.0.0/sbml/0018/0018.py | 3 +++ petabtests/cases/v2.0.0/sbml/0018/README.md | 3 +++ 2 files changed, 6 insertions(+) diff --git a/petabtests/cases/v2.0.0/sbml/0018/0018.py b/petabtests/cases/v2.0.0/sbml/0018/0018.py index 34ee2ac..e869490 100644 --- a/petabtests/cases/v2.0.0/sbml/0018/0018.py +++ b/petabtests/cases/v2.0.0/sbml/0018/0018.py @@ -22,6 +22,9 @@ `A` is reinitialized to the value in the condition table after preequilibration, `B` is not updated. +This test is a more tricky version of test 0029, which also includes a +non-zero simulation start time without a preequilibration condition. + ## Model A simple conversion reaction `A <=> B` in a single compartment, following diff --git a/petabtests/cases/v2.0.0/sbml/0018/README.md b/petabtests/cases/v2.0.0/sbml/0018/README.md index f30420b..7ab634d 100644 --- a/petabtests/cases/v2.0.0/sbml/0018/README.md +++ b/petabtests/cases/v2.0.0/sbml/0018/README.md @@ -11,6 +11,9 @@ For preequilibration, species `B` is initialized with `0`. For simulation, `A` is reinitialized to the value in the condition table after preequilibration, `B` is not updated. +This test is a more tricky version of test 0029, which also includes a +non-zero simulation start time without a preequilibration condition. + ## Model A simple conversion reaction `A <=> B` in a single compartment, following