From cca9bce5d30da05684bb7cbc7fab3151b70a3048 Mon Sep 17 00:00:00 2001 From: sebapersson Date: Mon, 15 Dec 2025 08:23:26 +0000 Subject: [PATCH 1/3] 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 79e1960f8898b8003f9ebc965f90cdb8802761eb Mon Sep 17 00:00:00 2001 From: sebapersson Date: Mon, 15 Dec 2025 10:31:57 +0000 Subject: [PATCH 2/3] Add test for math expression in initial value assignments --- petabtests/cases/v2.0.0/sbml/0026/0026.py | 87 +++++++++++++++++++ petabtests/cases/v2.0.0/sbml/0026/README.md | 16 ++++ petabtests/cases/v2.0.0/sbml/0026/_0026.yaml | 15 ++++ .../v2.0.0/sbml/0026/_0026_solution.yaml | 7 ++ .../cases/v2.0.0/sbml/0026/_conditions.tsv | 3 + .../cases/v2.0.0/sbml/0026/_experiments.tsv | 2 + .../cases/v2.0.0/sbml/0026/_measurements.tsv | 5 ++ petabtests/cases/v2.0.0/sbml/0026/_model.xml | 63 ++++++++++++++ .../cases/v2.0.0/sbml/0026/_observables.tsv | 3 + .../cases/v2.0.0/sbml/0026/_parameters.tsv | 7 ++ .../cases/v2.0.0/sbml/0026/_simulations.tsv | 5 ++ petabtests/cases/v2.0.0/sbml/README.md | 4 +- 12 files changed, 215 insertions(+), 2 deletions(-) create mode 100644 petabtests/cases/v2.0.0/sbml/0026/0026.py create mode 100644 petabtests/cases/v2.0.0/sbml/0026/README.md create mode 100644 petabtests/cases/v2.0.0/sbml/0026/_0026.yaml create mode 100644 petabtests/cases/v2.0.0/sbml/0026/_0026_solution.yaml create mode 100644 petabtests/cases/v2.0.0/sbml/0026/_conditions.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0026/_experiments.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0026/_measurements.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0026/_model.xml create mode 100644 petabtests/cases/v2.0.0/sbml/0026/_observables.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0026/_parameters.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0026/_simulations.tsv diff --git a/petabtests/cases/v2.0.0/sbml/0026/0026.py b/petabtests/cases/v2.0.0/sbml/0026/0026.py new file mode 100644 index 0000000..29ff50f --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/0026.py @@ -0,0 +1,87 @@ +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 the handling of initial concentrations that are specified +via mathematical expressions (rather than a single value or parameter) in +the conditions table. For species `A`, the initial concentration is given +by an expression containing both parameters to be estimated and parameters +that are not estimated. For species `B`, the initial concentration is +specified via an expression involving only parameters that are not +estimated. + +## Model + +A simple conversion reaction `A <=> B` in a single compartment, following +mass action kinetics. +""") + +# problem -------------------------------------------------------------------- +ant_model = """ +model *petab_test_0026() + compartment compartment_ = 1; + species A in compartment_, B in compartment_; + + fwd: A => B; compartment_ * k1 * A; + rev: B => A; compartment_ * k2 * B; + + A = a0; + B = 1; + a0 = 1; + k1 = 0; + k2 = 0; +end +""" +model_file = Path(__file__).parent / "_model.xml" +model_file.write_text(antimony_to_sbml_str(ant_model)) + +problem = Problem() + +problem.add_condition("c0", A="initial_A1 + initial_A2", B="initial_B1 / initial_B2") +problem.add_experiment("e1", 0, "c0") + +problem.add_observable("obs_a", "A", noise_formula="0.5") +problem.add_observable("obs_b", "B", noise_formula="0.5") +problem.add_measurement("obs_a", experiment_id="e1", time=0, measurement=0.7) +problem.add_measurement("obs_a", experiment_id="e1", time=10, measurement=0.1) +problem.add_measurement("obs_b", experiment_id="e1", time=0, measurement=0.7) +problem.add_measurement("obs_b", experiment_id="e1", time=10, measurement=0.1) + +problem.add_parameter("k1", lb=0, ub=10, nominal_value=0.8, estimate=True) +problem.add_parameter("k2", lb=0, ub=10, nominal_value=0.6, estimate=True) +problem.add_parameter("initial_A1", lb=1, ub=10, nominal_value=0.5, estimate=True) +problem.add_parameter("initial_A2", lb=1, ub=10, nominal_value=1.5, estimate=False) +problem.add_parameter("initial_B1", lb=0, ub=10, nominal_value=9, estimate=False) +problem.add_parameter("initial_B2", lb=0, ub=10, nominal_value=3, estimate=False) + + +# solutions ------------------------------------------------------------------ + +simulation_df = problem.measurement_df.copy(deep=True).rename( + columns={MEASUREMENT: SIMULATION} +) +simulation_df[SIMULATION] = [ + *(analytical_a(t, 2, 3, 0.8, 0.6) for t in (0, 10)), + *(analytical_b(t, 2, 3, 0.8, 0.6) for t in (0, 10)), +] + +case = PetabV2TestCase.from_problem( + id=26, + brief="Simulation. Estimated initial value via math expressions in conditions table.", + description=DESCRIPTION, + model=model_file, + problem=problem, + simulation_df=simulation_df, +) diff --git a/petabtests/cases/v2.0.0/sbml/0026/README.md b/petabtests/cases/v2.0.0/sbml/0026/README.md new file mode 100644 index 0000000..9b14c1f --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/README.md @@ -0,0 +1,16 @@ +# PEtab test case 0026 + +## Objective + +This case tests the handling of initial concentrations that are specified +via mathematical expressions (rather than a single value or parameter) in +the conditions table. For species `A`, the initial concentration is given +by an expression containing both parameters to be estimated and parameters +that are not estimated. For species `B`, the initial concentration is +specified via an expression involving only parameters that are not +estimated. + +## Model + +A simple conversion reaction `A <=> B` in a single compartment, following +mass action kinetics. diff --git a/petabtests/cases/v2.0.0/sbml/0026/_0026.yaml b/petabtests/cases/v2.0.0/sbml/0026/_0026.yaml new file mode 100644 index 0000000..2a7c4ad --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/_0026.yaml @@ -0,0 +1,15 @@ +condition_files: +- _conditions.tsv +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/0026/_0026_solution.yaml b/petabtests/cases/v2.0.0/sbml/0026/_0026_solution.yaml new file mode 100644 index 0000000..6bc1f12 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/_0026_solution.yaml @@ -0,0 +1,7 @@ +chi2: 75.02040884206437 +llh: -38.41336983161109 +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/0026/_conditions.tsv b/petabtests/cases/v2.0.0/sbml/0026/_conditions.tsv new file mode 100644 index 0000000..bc499e5 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/_conditions.tsv @@ -0,0 +1,3 @@ +conditionId targetId targetValue +c0 A initial_A1 + initial_A2 +c0 B initial_B1/initial_B2 diff --git a/petabtests/cases/v2.0.0/sbml/0026/_experiments.tsv b/petabtests/cases/v2.0.0/sbml/0026/_experiments.tsv new file mode 100644 index 0000000..5d8c1e0 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/_experiments.tsv @@ -0,0 +1,2 @@ +experimentId time conditionId +e1 0.0 c0 diff --git a/petabtests/cases/v2.0.0/sbml/0026/_measurements.tsv b/petabtests/cases/v2.0.0/sbml/0026/_measurements.tsv new file mode 100644 index 0000000..d9f5e7b --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/_measurements.tsv @@ -0,0 +1,5 @@ +modelId observableId experimentId time measurement observableParameters noiseParameters + obs_a e1 0.0 0.7 + obs_a e1 10.0 0.1 + obs_b e1 0.0 0.7 + obs_b e1 10.0 0.1 diff --git a/petabtests/cases/v2.0.0/sbml/0026/_model.xml b/petabtests/cases/v2.0.0/sbml/0026/_model.xml new file mode 100644 index 0000000..4a0dbcc --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/_model.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + a0 + + + + + + + + + + + + + + + + compartment_ + k1 + A + + + + + + + + + + + + + + + + compartment_ + k2 + B + + + + + + + diff --git a/petabtests/cases/v2.0.0/sbml/0026/_observables.tsv b/petabtests/cases/v2.0.0/sbml/0026/_observables.tsv new file mode 100644 index 0000000..1234233 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/_observables.tsv @@ -0,0 +1,3 @@ +observableId observableName observableFormula noiseFormula noiseDistribution observablePlaceholders noisePlaceholders +obs_a A 0.500000000000000 normal +obs_b B 0.500000000000000 normal diff --git a/petabtests/cases/v2.0.0/sbml/0026/_parameters.tsv b/petabtests/cases/v2.0.0/sbml/0026/_parameters.tsv new file mode 100644 index 0000000..d210cf0 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/_parameters.tsv @@ -0,0 +1,7 @@ +parameterId lowerBound upperBound nominalValue estimate priorDistribution priorParameters +k1 0.0 10.0 0.8 true +k2 0.0 10.0 0.6 true +initial_A1 1.0 10.0 0.5 true +initial_A2 1.0 10.0 1.5 false +initial_B1 0.0 10.0 9.0 false +initial_B2 0.0 10.0 3.0 false diff --git a/petabtests/cases/v2.0.0/sbml/0026/_simulations.tsv b/petabtests/cases/v2.0.0/sbml/0026/_simulations.tsv new file mode 100644 index 0000000..642a386 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/_simulations.tsv @@ -0,0 +1,5 @@ +modelId observableId experimentId time simulation observableParameters noiseParameters + obs_a e1 0.0 2.0 + obs_a e1 10.0 2.1428570240673257 + obs_b e1 0.0 3.0 + obs_b e1 10.0 2.8571429759326743 diff --git a/petabtests/cases/v2.0.0/sbml/README.md b/petabtests/cases/v2.0.0/sbml/README.md index 05ba7eb..3a48e23 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/) +# [0026](0026/) -Non-truncated prior distributions. +Simulation. Estimated initial value via math expressions in conditions table. From 58321e73f7a9872fd334db91605d0aa40795e27b Mon Sep 17 00:00:00 2001 From: sebapersson Date: Mon, 15 Dec 2025 11:16:27 +0000 Subject: [PATCH 3/3] Add test for math expression setting parameter values --- petabtests/cases/v2.0.0/sbml/0027/0027.py | 86 +++++++++++++++++++ petabtests/cases/v2.0.0/sbml/0027/README.md | 19 ++++ petabtests/cases/v2.0.0/sbml/0027/_0027.yaml | 15 ++++ .../v2.0.0/sbml/0027/_0027_solution.yaml | 7 ++ .../cases/v2.0.0/sbml/0027/_conditions.tsv | 3 + .../cases/v2.0.0/sbml/0027/_experiments.tsv | 3 + .../cases/v2.0.0/sbml/0027/_measurements.tsv | 3 + petabtests/cases/v2.0.0/sbml/0027/_model.xml | 70 +++++++++++++++ .../cases/v2.0.0/sbml/0027/_observables.tsv | 2 + .../cases/v2.0.0/sbml/0027/_parameters.tsv | 8 ++ .../cases/v2.0.0/sbml/0027/_simulations.tsv | 3 + petabtests/cases/v2.0.0/sbml/README.md | 4 + 12 files changed, 223 insertions(+) create mode 100644 petabtests/cases/v2.0.0/sbml/0027/0027.py create mode 100644 petabtests/cases/v2.0.0/sbml/0027/README.md create mode 100644 petabtests/cases/v2.0.0/sbml/0027/_0027.yaml create mode 100644 petabtests/cases/v2.0.0/sbml/0027/_0027_solution.yaml create mode 100644 petabtests/cases/v2.0.0/sbml/0027/_conditions.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0027/_experiments.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0027/_measurements.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0027/_model.xml create mode 100644 petabtests/cases/v2.0.0/sbml/0027/_observables.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0027/_parameters.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0027/_simulations.tsv diff --git a/petabtests/cases/v2.0.0/sbml/0027/0027.py b/petabtests/cases/v2.0.0/sbml/0027/0027.py new file mode 100644 index 0000000..83a5934 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/0027.py @@ -0,0 +1,86 @@ +from inspect import cleandoc +from pathlib import Path + +from petab.v2.C import * +from petab.v2 import Problem +from petabtests import PetabV2TestCase, analytical_a, antimony_to_sbml_str + +DESCRIPTION = cleandoc(""" +## Objective + +This case tests support for parametric overrides from condition table +via math expressions. + +The model is simulated for two different experimental conditions +(here: different initial concentrations). The observable is offset via +a parametric override in the condition table (i.e. the actual value +has to be taken from the parameter table). The formulas in the +condition table are mathematical expressions consisting of +numerical values, parameters to be estimated, and parameters that +are not to be estimated. + +## Model + +A simple conversion reaction `A <=> B` in a single compartment, following +mass action kinetics. +""") + +# problem -------------------------------------------------------------------- +ant_model = """ +model *petab_test_0027() + compartment compartment_ = 1; + species A in compartment_, B in compartment_; + + fwd: A => B; compartment_ * k1 * A; + rev: B => A; compartment_ * k2 * B; + + A = a0; + B = b0; + offset_A = 0; + a0 = 1; + b0 = 0; + k1 = 0; + k2 = 0; +end +""" +model_file = Path(__file__).parent / "_model.xml" +model_file.write_text(antimony_to_sbml_str(ant_model)) + +problem = Problem() +problem.add_condition("c0", offset_A="offset_A1_c0 + offset_A2_c0") +problem.add_condition("c1", offset_A="offset_A1_c1 / 3.0") + +problem.add_experiment("e1", 0, "c0") +problem.add_experiment("e2", 0, "c1") + +problem.add_observable("obs_a", "A + offset_A", noise_formula="1") + +problem.add_measurement("obs_a", experiment_id="e1", time=10, measurement=2.1) +problem.add_measurement("obs_a", experiment_id="e2", time=10, measurement=3.2) + +problem.add_parameter("a0", lb=0, ub=10, nominal_value=1, estimate=True) +problem.add_parameter("b0", lb=0, ub=10, nominal_value=0, estimate=True) +problem.add_parameter("k1", lb=0, ub=10, nominal_value=0.8, estimate=True) +problem.add_parameter("k2", lb=0, ub=10, nominal_value=0.6, estimate=True) +problem.add_parameter("offset_A1_c0", lb=0, ub=10, nominal_value=0.5, estimate=True) +problem.add_parameter("offset_A2_c0", lb=0, ub=10, nominal_value=1.5, estimate=False) +problem.add_parameter("offset_A1_c1", lb=0, ub=10, nominal_value=9, estimate=True) + +# solutions ------------------------------------------------------------------ + +simulation_df = problem.measurement_df.copy(deep=True).rename( + columns={MEASUREMENT: SIMULATION} +) +simulation_df[SIMULATION] = [ + analytical_a(10, 1, 0, 0.8, 0.6) + offset for offset in [2, 3] +] + +case = PetabV2TestCase.from_problem( + id=27, + brief="Simulation. Condition-specific parameters defined via " + "math expressions in the parameter table.", + description=DESCRIPTION, + model=model_file, + problem=problem, + simulation_df=simulation_df, +) diff --git a/petabtests/cases/v2.0.0/sbml/0027/README.md b/petabtests/cases/v2.0.0/sbml/0027/README.md new file mode 100644 index 0000000..7cc3041 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/README.md @@ -0,0 +1,19 @@ +# PEtab test case 0027 + +## Objective + +This case tests support for parametric overrides from condition table +via math expressions. + +The model is simulated for two different experimental conditions +(here: different initial concentrations). The observable is offset via +a parametric override in the condition table (i.e. the actual value +has to be taken from the parameter table). The formulas in the +condition table are mathematical expressions consisting of +numerical values, parameters to be estimated, and parameters that +are not to be estimated. + +## Model + +A simple conversion reaction `A <=> B` in a single compartment, following +mass action kinetics. diff --git a/petabtests/cases/v2.0.0/sbml/0027/_0027.yaml b/petabtests/cases/v2.0.0/sbml/0027/_0027.yaml new file mode 100644 index 0000000..2a7c4ad --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/_0027.yaml @@ -0,0 +1,15 @@ +condition_files: +- _conditions.tsv +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/0027/_0027_solution.yaml b/petabtests/cases/v2.0.0/sbml/0027/_0027_solution.yaml new file mode 100644 index 0000000..5f6c46b --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/_0027_solution.yaml @@ -0,0 +1,7 @@ +chi2: 0.16020461109629 +llh: -1.91797937195749 +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/0027/_conditions.tsv b/petabtests/cases/v2.0.0/sbml/0027/_conditions.tsv new file mode 100644 index 0000000..0bd0965 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/_conditions.tsv @@ -0,0 +1,3 @@ +conditionId targetId targetValue +c0 offset_A offset_A1_c0 + offset_A2_c0 +c1 offset_A 0.333333333333333*offset_A1_c1 diff --git a/petabtests/cases/v2.0.0/sbml/0027/_experiments.tsv b/petabtests/cases/v2.0.0/sbml/0027/_experiments.tsv new file mode 100644 index 0000000..7c2a6e8 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/_experiments.tsv @@ -0,0 +1,3 @@ +experimentId time conditionId +e1 0.0 c0 +e2 0.0 c1 diff --git a/petabtests/cases/v2.0.0/sbml/0027/_measurements.tsv b/petabtests/cases/v2.0.0/sbml/0027/_measurements.tsv new file mode 100644 index 0000000..679f1c2 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/_measurements.tsv @@ -0,0 +1,3 @@ +modelId observableId experimentId time measurement observableParameters noiseParameters + obs_a e1 10.0 2.1 + obs_a e2 10.0 3.2 diff --git a/petabtests/cases/v2.0.0/sbml/0027/_model.xml b/petabtests/cases/v2.0.0/sbml/0027/_model.xml new file mode 100644 index 0000000..9661881 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/_model.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + a0 + + + + + b0 + + + + + + + + + + + + + + + + compartment_ + k1 + A + + + + + + + + + + + + + + + + compartment_ + k2 + B + + + + + + + diff --git a/petabtests/cases/v2.0.0/sbml/0027/_observables.tsv b/petabtests/cases/v2.0.0/sbml/0027/_observables.tsv new file mode 100644 index 0000000..e8b2bea --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/_observables.tsv @@ -0,0 +1,2 @@ +observableId observableName observableFormula noiseFormula noiseDistribution observablePlaceholders noisePlaceholders +obs_a A + offset_A 1.00000000000000 normal diff --git a/petabtests/cases/v2.0.0/sbml/0027/_parameters.tsv b/petabtests/cases/v2.0.0/sbml/0027/_parameters.tsv new file mode 100644 index 0000000..f8920c5 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/_parameters.tsv @@ -0,0 +1,8 @@ +parameterId lowerBound upperBound nominalValue estimate priorDistribution priorParameters +a0 0.0 10.0 1.0 true +b0 0.0 10.0 0.0 true +k1 0.0 10.0 0.8 true +k2 0.0 10.0 0.6 true +offset_A1_c0 0.0 10.0 0.5 true +offset_A2_c0 0.0 10.0 1.5 false +offset_A1_c1 0.0 10.0 9.0 true diff --git a/petabtests/cases/v2.0.0/sbml/0027/_simulations.tsv b/petabtests/cases/v2.0.0/sbml/0027/_simulations.tsv new file mode 100644 index 0000000..b1fd1b6 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/_simulations.tsv @@ -0,0 +1,3 @@ +modelId observableId experimentId time simulation observableParameters noiseParameters + obs_a e1 10.0 2.4285719037306968 + obs_a e2 10.0 3.4285719037306968 diff --git a/petabtests/cases/v2.0.0/sbml/README.md b/petabtests/cases/v2.0.0/sbml/README.md index 3a48e23..6c0ab27 100644 --- a/petabtests/cases/v2.0.0/sbml/README.md +++ b/petabtests/cases/v2.0.0/sbml/README.md @@ -98,3 +98,7 @@ Non-truncated prior distributions. Simulation. Estimated initial value via math expressions in conditions table. +# [0027](0027/) + +Simulation. Condition-specific parameters defined via math expressions in the parameter table. +