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 00000000..2350c411 --- /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 00000000..6680ff46 --- /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 00000000..92659941 --- /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 00000000..b46ff38f --- /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 00000000..291ff46c --- /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 00000000..bc551d87 --- /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 00000000..ca510143 --- /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 00000000..f569070d --- /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 00000000..aff90e1e --- /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 55bcb7bd..b17dfe82 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 38170b10670478eae35f98f44691008fcb90dc5c Mon Sep 17 00:00:00 2001 From: sebapersson Date: Thu, 12 Feb 2026 15:15:13 +0000 Subject: [PATCH 2/3] Add test with parameter in both cond. and obs. tables --- petabtests/cases/v2.0.0/sbml/0032/0032.py | 87 +++++++++++++++++++ petabtests/cases/v2.0.0/sbml/0032/README.md | 14 +++ petabtests/cases/v2.0.0/sbml/0032/_0032.yaml | 15 ++++ .../v2.0.0/sbml/0032/_0032_solution.yaml | 7 ++ .../cases/v2.0.0/sbml/0032/_conditions.tsv | 3 + .../cases/v2.0.0/sbml/0032/_experiments.tsv | 2 + .../cases/v2.0.0/sbml/0032/_measurements.tsv | 5 ++ petabtests/cases/v2.0.0/sbml/0032/_model.xml | 63 ++++++++++++++ .../cases/v2.0.0/sbml/0032/_observables.tsv | 3 + .../cases/v2.0.0/sbml/0032/_parameters.tsv | 5 ++ .../cases/v2.0.0/sbml/0032/_simulations.tsv | 5 ++ petabtests/cases/v2.0.0/sbml/README.md | 16 ++-- 12 files changed, 217 insertions(+), 8 deletions(-) create mode 100644 petabtests/cases/v2.0.0/sbml/0032/0032.py create mode 100644 petabtests/cases/v2.0.0/sbml/0032/README.md create mode 100644 petabtests/cases/v2.0.0/sbml/0032/_0032.yaml create mode 100644 petabtests/cases/v2.0.0/sbml/0032/_0032_solution.yaml create mode 100644 petabtests/cases/v2.0.0/sbml/0032/_conditions.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0032/_experiments.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0032/_measurements.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0032/_model.xml create mode 100644 petabtests/cases/v2.0.0/sbml/0032/_observables.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0032/_parameters.tsv create mode 100644 petabtests/cases/v2.0.0/sbml/0032/_simulations.tsv diff --git a/petabtests/cases/v2.0.0/sbml/0032/0032.py b/petabtests/cases/v2.0.0/sbml/0032/0032.py new file mode 100644 index 00000000..b8568672 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0032/0032.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 handling of parameters to be estimated both assigning +initial concentrations, and appearing in the observable formula. +For species `A`, the initial concentration is estimated, and the parameter +setting the concentration of A appears in the observable formulas. For species +`B`, the initial concentration is specified in the parameters table. + +## Model + +A simple conversion reaction `A <=> B` in a single compartment, following +mass action kinetics. +""") + +# problem -------------------------------------------------------------------- +ant_model = """ +model *petab_test_0032() + 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_A", B="initial_B") +problem.add_experiment("e1", 0, "c0") + +problem.add_observable("obs_a", "A + initial_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_A", lb=1, ub=10, nominal_value=2, estimate=True) +problem.add_parameter( + "initial_B", lb=0, ub=10, nominal_value=3, estimate=False +) + + +# solutions ------------------------------------------------------------------ + +simulation_df = problem.measurement_df.copy(deep=True).rename( + columns={MEASUREMENT: SIMULATION} +) +initial_A = 2.0 +simulation_df[SIMULATION] = [ + *(analytical_a(t, 2, 3, 0.8, 0.6) + initial_A for t in (0, 10)), + *(analytical_b(t, 2, 3, 0.8, 0.6) for t in (0, 10)), +] + +case = PetabV2TestCase.from_problem( + id=32, + brief="Simulation. A parameter to estimate both sets initial value and appears in observable \ + formulas", + description=DESCRIPTION, + model=model_file, + problem=problem, + simulation_df=simulation_df, +) diff --git a/petabtests/cases/v2.0.0/sbml/0032/README.md b/petabtests/cases/v2.0.0/sbml/0032/README.md new file mode 100644 index 00000000..208100f0 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0032/README.md @@ -0,0 +1,14 @@ +# PEtab test case 0032 + +## Objective + +This case tests handling of parameters to be estimated both assigning +initial concentrations, and appearing in the observable formula. +For species `A`, the initial concentration is estimated, and the parameter +setting the concentration of A appears in the observable formulas. For species +`B`, the initial concentration is specified in the parameters table. + +## Model + +A simple conversion reaction `A <=> B` in a single compartment, following +mass action kinetics. diff --git a/petabtests/cases/v2.0.0/sbml/0032/_0032.yaml b/petabtests/cases/v2.0.0/sbml/0032/_0032.yaml new file mode 100644 index 00000000..2a7c4ad0 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0032/_0032.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/0032/_0032_solution.yaml b/petabtests/cases/v2.0.0/sbml/0032/_0032_solution.yaml new file mode 100644 index 00000000..52443fa1 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0032/_0032_solution.yaml @@ -0,0 +1,7 @@ +chi2: 160.50612122714156 +llh: -81.1562260241497 +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/0032/_conditions.tsv b/petabtests/cases/v2.0.0/sbml/0032/_conditions.tsv new file mode 100644 index 00000000..4c79dbfa --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0032/_conditions.tsv @@ -0,0 +1,3 @@ +conditionId targetId targetValue +c0 A initial_A +c0 B initial_B diff --git a/petabtests/cases/v2.0.0/sbml/0032/_experiments.tsv b/petabtests/cases/v2.0.0/sbml/0032/_experiments.tsv new file mode 100644 index 00000000..5d8c1e07 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0032/_experiments.tsv @@ -0,0 +1,2 @@ +experimentId time conditionId +e1 0.0 c0 diff --git a/petabtests/cases/v2.0.0/sbml/0032/_measurements.tsv b/petabtests/cases/v2.0.0/sbml/0032/_measurements.tsv new file mode 100644 index 00000000..d9f5e7b1 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0032/_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/0032/_model.xml b/petabtests/cases/v2.0.0/sbml/0032/_model.xml new file mode 100644 index 00000000..9bf8f5a8 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0032/_model.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + a0 + + + + + + + + + + + + + + + + compartment_ + k1 + A + + + + + + + + + + + + + + + + compartment_ + k2 + B + + + + + + + diff --git a/petabtests/cases/v2.0.0/sbml/0032/_observables.tsv b/petabtests/cases/v2.0.0/sbml/0032/_observables.tsv new file mode 100644 index 00000000..c462bfdc --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0032/_observables.tsv @@ -0,0 +1,3 @@ +observableId observableName observableFormula noiseFormula noiseDistribution observablePlaceholders noisePlaceholders +obs_a A + initial_A 0.500000000000000 normal +obs_b B 0.500000000000000 normal diff --git a/petabtests/cases/v2.0.0/sbml/0032/_parameters.tsv b/petabtests/cases/v2.0.0/sbml/0032/_parameters.tsv new file mode 100644 index 00000000..639c2abc --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0032/_parameters.tsv @@ -0,0 +1,5 @@ +parameterId lowerBound upperBound nominalValue estimate priorDistribution priorParameters +k1 0.0 10.0 0.8 true +k2 0.0 10.0 0.6 true +initial_A 1.0 10.0 2.0 true +initial_B 0.0 10.0 3.0 false diff --git a/petabtests/cases/v2.0.0/sbml/0032/_simulations.tsv b/petabtests/cases/v2.0.0/sbml/0032/_simulations.tsv new file mode 100644 index 00000000..e61827db --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0032/_simulations.tsv @@ -0,0 +1,5 @@ +modelId observableId experimentId time simulation observableParameters noiseParameters + obs_a e1 0.0 4.0 + obs_a e1 10.0 4.142857024067325 + 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 86ae961f..afa4609d 100644 --- a/petabtests/cases/v2.0.0/sbml/README.md +++ b/petabtests/cases/v2.0.0/sbml/README.md @@ -36,8 +36,7 @@ Simulation. Preequilibration. # [0010](0010/) -Simulation. Preequilibration. One species reinitialized, one not. InitialAssignment to -species overridden. +Simulation. Preequilibration. One species reinitialized, one not. InitialAssignment to species overridden. # [0011](0011/) @@ -61,18 +60,15 @@ Simulation. Single parametric noise parameter override. # [0016](0016/) -Simultaneous state-dependent re-initialization of compartment size and contained species -followed by event. +Simultaneous state-dependent re-initialization of compartment size and contained species followed by event. # [0017](0017/) -Simulation. Pre-equilibration. One species reinitialized, one not.InitialAssignment to -species overridden. +Simulation. Pre-equilibration. One species reinitialized, one not.InitialAssignment to species overridden. # [0018](0018/) -Simulation. Preequilibration and RateRules. Non-zero simulation start time. -InitialAssignment to species overridden. +Simulation. Preequilibration and RateRules. Non-zero simulation start time. InitialAssignment to species overridden. # [0020](0020/) @@ -122,3 +118,7 @@ Simultaneous trigger of PEtab condition and SBML event. Simulation. Two PEtab conditions applied at the same time point. +# [0032](0032/) + +Simulation. A parameter to estimate both sets initial value and appears in observable formulas + From 4bd6252d398aa6a9bb7c538ec3d981c0974d94a7 Mon Sep 17 00:00:00 2001 From: Sebastian Persson <46872750+sebapersson@users.noreply.github.com> Date: Thu, 12 Feb 2026 19:05:07 +0000 Subject: [PATCH 3/3] Apply suggestion from @dweindl Co-authored-by: Daniel Weindl --- petabtests/cases/v2.0.0/sbml/0032/0032.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/petabtests/cases/v2.0.0/sbml/0032/0032.py b/petabtests/cases/v2.0.0/sbml/0032/0032.py index b8568672..eacca5b0 100644 --- a/petabtests/cases/v2.0.0/sbml/0032/0032.py +++ b/petabtests/cases/v2.0.0/sbml/0032/0032.py @@ -72,8 +72,8 @@ ) initial_A = 2.0 simulation_df[SIMULATION] = [ - *(analytical_a(t, 2, 3, 0.8, 0.6) + initial_A for t in (0, 10)), - *(analytical_b(t, 2, 3, 0.8, 0.6) for t in (0, 10)), + *(analytical_a(t, initial_A, 3, 0.8, 0.6) + initial_A for t in (0, 10)), + *(analytical_b(t, initial_A, 3, 0.8, 0.6) for t in (0, 10)), ] case = PetabV2TestCase.from_problem(