From 58df9dd592586183afacb2a1a66de554a7c76c1c Mon Sep 17 00:00:00 2001 From: Daniel Weindl Date: Mon, 8 Dec 2025 21:02:47 +0100 Subject: [PATCH] Move petab v1 simulation code to amici.sim... Related to #3041. --- doc/examples/example_errors.ipynb | 8 +++-- doc/examples/example_jax/ExampleJax.ipynb | 2 +- .../example_jax_petab/ExampleJaxPEtab.ipynb | 2 +- doc/examples/example_petab/petab.ipynb | 7 ++-- doc/python_modules.rst | 4 +-- python/sdist/amici/adapters/fiddy.py | 8 ++--- .../amici/importers/petab/_petab_importer.py | 10 +++++- .../amici/importers/petab/v1/__init__.py | 24 ------------- .../amici/sim/sundials/petab/__init__.py | 0 .../amici/sim/sundials/petab/v1/__init__.py | 34 +++++++++++++++++++ .../sundials/petab/v1/_conditions.py} | 19 ++++++----- .../sundials/petab/v1/_petab_problem.py} | 10 +++--- .../sundials/petab/v1/_simulations.py} | 11 +++--- .../sundials/petab/v1/_simulator.py} | 4 +-- python/tests/adapters/test_fiddy.py | 2 +- python/tests/petab_/test_petab_problem.py | 2 +- python/tests/splines_utils.py | 12 ++++--- python/tests/test_petab_objective.py | 3 +- python/tests/test_petab_simulate.py | 2 +- .../benchmark_models/test_petab_benchmark.py | 12 ++++--- .../test_petab_benchmark_jax.py | 8 +++-- tests/petab_test_suite/test_petab_suite.py | 10 +++--- 22 files changed, 109 insertions(+), 85 deletions(-) create mode 100644 python/sdist/amici/sim/sundials/petab/__init__.py create mode 100644 python/sdist/amici/sim/sundials/petab/v1/__init__.py rename python/sdist/amici/{importers/petab/v1/conditions.py => sim/sundials/petab/v1/_conditions.py} (98%) rename python/sdist/amici/{importers/petab/v1/petab_problem.py => sim/sundials/petab/v1/_petab_problem.py} (97%) rename python/sdist/amici/{importers/petab/v1/simulations.py => sim/sundials/petab/v1/_simulations.py} (99%) rename python/sdist/amici/{importers/petab/v1/simulator.py => sim/sundials/petab/v1/_simulator.py} (96%) diff --git a/doc/examples/example_errors.ipynb b/doc/examples/example_errors.ipynb index 13daedfe4e..74a7ef6704 100644 --- a/doc/examples/example_errors.ipynb +++ b/doc/examples/example_errors.ipynb @@ -29,10 +29,7 @@ " import_model_module,\n", ")\n", "from amici.importers.petab.v1 import (\n", - " EDATAS,\n", - " RDATAS,\n", " import_petab_problem,\n", - " simulate_petab,\n", ")\n", "from amici.sim.sundials import (\n", " AMICI_SUCCESS,\n", @@ -44,6 +41,11 @@ " simulation_status_to_str,\n", " unscale_parameter,\n", ")\n", + "from amici.sim.sundials.petab.v1 import (\n", + " EDATAS,\n", + " RDATAS,\n", + " simulate_petab,\n", + ")\n", "from amici.sim.sundials.plotting import plot_jacobian, plot_state_trajectories\n", "from petab.v1.sbml import get_sbml_model\n", "\n", diff --git a/doc/examples/example_jax/ExampleJax.ipynb b/doc/examples/example_jax/ExampleJax.ipynb index 83822638f1..4bf249d619 100644 --- a/doc/examples/example_jax/ExampleJax.ipynb +++ b/doc/examples/example_jax/ExampleJax.ipynb @@ -310,8 +310,8 @@ "metadata": {}, "outputs": [], "source": [ - "from amici.importers.petab.v1 import simulate_petab\n", "from amici.sim.sundials import SensitivityOrder\n", + "from amici.sim.sundials.petab.v1 import simulate_petab\n", "\n", "amici_solver = amici_model.create_solver()\n", "amici_solver.set_sensitivity_order(SensitivityOrder.first)\n", diff --git a/doc/examples/example_jax_petab/ExampleJaxPEtab.ipynb b/doc/examples/example_jax_petab/ExampleJaxPEtab.ipynb index 3865eb9dbf..fb655839d2 100644 --- a/doc/examples/example_jax_petab/ExampleJaxPEtab.ipynb +++ b/doc/examples/example_jax_petab/ExampleJaxPEtab.ipynb @@ -565,8 +565,8 @@ "metadata": {}, "outputs": [], "source": [ - "from amici.importers.petab.v1 import simulate_petab\n", "from amici.sim.sundials import SensitivityMethod, SensitivityOrder\n", + "from amici.sim.sundials.petab.v1 import simulate_petab\n", "\n", "# Import the PEtab problem as a standard AMICI model\n", "amici_model = import_petab_problem(\n", diff --git a/doc/examples/example_petab/petab.ipynb b/doc/examples/example_petab/petab.ipynb index 57f171d63d..79427496be 100644 --- a/doc/examples/example_petab/petab.ipynb +++ b/doc/examples/example_petab/petab.ipynb @@ -18,12 +18,9 @@ "outputs": [], "source": [ "import petab\n", - "from amici.importers.petab.v1 import (\n", - " import_petab_problem,\n", - " simulate_petab,\n", - ")\n", - "from amici.importers.petab.v1.petab_problem import PetabProblem\n", + "from amici.importers.petab.v1 import import_petab_problem\n", "from amici.sim.sundials import run_simulation\n", + "from amici.sim.sundials.petab.v1 import PetabProblem, simulate_petab\n", "from amici.sim.sundials.plotting import plot_state_trajectories" ] }, diff --git a/doc/python_modules.rst b/doc/python_modules.rst index 63a936825d..bcf4a819bd 100644 --- a/doc/python_modules.rst +++ b/doc/python_modules.rst @@ -18,18 +18,16 @@ AMICI Python API amici.importers.antimony amici.importers.petab amici.importers.petab.v1 - amici.importers.petab.v1.conditions amici.importers.petab.v1.import_helpers amici.importers.petab.v1.parameter_mapping amici.importers.petab.v1.petab_import amici.importers.petab.v1.pysb_import amici.importers.petab.v1.sbml_import - amici.importers.petab.v1.simulations - amici.importers.petab.v1.simulator amici.jax amici.exporters.sundials.de_export amici.sim.sundials amici.sim.sundials.plotting amici.sim.sundials.gradient_check + amici.sim.sundials.petab.v1 amici.logging amici.adapters.fiddy diff --git a/python/sdist/amici/adapters/fiddy.py b/python/sdist/amici/adapters/fiddy.py index b6e29591e4..eccd3f33b9 100644 --- a/python/sdist/amici/adapters/fiddy.py +++ b/python/sdist/amici/adapters/fiddy.py @@ -17,10 +17,7 @@ from fiddy import CachedFunction, Type, fiddy_array from petab.v1.C import LIN, LOG, LOG10 -import amici -import amici.importers.petab.v1.simulations from amici.importers.petab import LLH, SLLH -from amici.importers.petab.v1.conditions import create_edatas from amici.importers.petab.v1.parameter_mapping import create_parameter_mapping from amici.sim.sundials import ( AmiciExpData, @@ -31,6 +28,7 @@ SensitivityOrder, run_simulation, ) +from amici.sim.sundials.petab.v1._conditions import create_edatas if TYPE_CHECKING: from amici.importers.petab import PetabSimulator @@ -297,7 +295,7 @@ def simulate_petab_to_cached_functions( **kwargs, ) -> tuple[Type.FUNCTION, Type.FUNCTION]: """ - Convert :func:`amici.petab.simulations.simulate_petab` + Convert :func:`amici.sim.sundials.petab.v1.simulate_petab` (PEtab v1 simulations) to fiddy functions. Note that all gradients are provided on linear scale. The correction from @@ -333,7 +331,7 @@ def simulate_petab_to_cached_functions( free_parameter_ids = list(petab_problem.parameter_df.index) if simulate_petab is None: - simulate_petab = amici.importers.petab.v1.simulations.simulate_petab + from amici.sim.sundials.petab.v1._simulations import simulate_petab edatas = None if precreate_edatas: diff --git a/python/sdist/amici/importers/petab/_petab_importer.py b/python/sdist/amici/importers/petab/_petab_importer.py index 4adf0708d3..40dba773e5 100644 --- a/python/sdist/amici/importers/petab/_petab_importer.py +++ b/python/sdist/amici/importers/petab/_petab_importer.py @@ -26,9 +26,17 @@ from amici.importers.utils import MeasurementChannel, amici_time_symbol from amici.logging import get_logger from amici.sim.sundials import SensitivityOrder +from amici.sim.sundials.petab.v1._simulations import ( + EDATAS, + LLH, + RDATAS, + RES, + S2LLH, + SLLH, + SRES, +) from .v1.sbml_import import _add_global_parameter -from .v1.simulations import EDATAS, LLH, RDATAS, RES, S2LLH, SLLH, SRES if TYPE_CHECKING: import pysb diff --git a/python/sdist/amici/importers/petab/v1/__init__.py b/python/sdist/amici/importers/petab/v1/__init__.py index 82a0b7d6ae..3844f08735 100644 --- a/python/sdist/amici/importers/petab/v1/__init__.py +++ b/python/sdist/amici/importers/petab/v1/__init__.py @@ -5,31 +5,7 @@ PREEQ_INDICATOR_ID = "preequilibration_indicator" from .petab_import import import_petab_problem -from .simulations import ( - EDATAS, - FIM, - LLH, - RDATAS, - RES, - S2LLH, - SLLH, - SRES, - rdatas_to_measurement_df, - rdatas_to_simulation_df, - simulate_petab, -) __all__ = [ "import_petab_problem", - "simulate_petab", - "rdatas_to_simulation_df", - "rdatas_to_measurement_df", - "LLH", - "SLLH", - "FIM", - "S2LLH", - "RES", - "SRES", - "RDATAS", - "EDATAS", ] diff --git a/python/sdist/amici/sim/sundials/petab/__init__.py b/python/sdist/amici/sim/sundials/petab/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/python/sdist/amici/sim/sundials/petab/v1/__init__.py b/python/sdist/amici/sim/sundials/petab/v1/__init__.py new file mode 100644 index 0000000000..7d0a413b6b --- /dev/null +++ b/python/sdist/amici/sim/sundials/petab/v1/__init__.py @@ -0,0 +1,34 @@ +from ._conditions import create_edatas, create_parameterized_edatas +from ._petab_problem import PetabProblem +from ._simulations import ( + EDATAS, + FIM, + LLH, + RDATAS, + RES, + S2LLH, + SLLH, + SRES, + rdatas_to_measurement_df, + rdatas_to_simulation_df, + simulate_petab, +) +from ._simulator import PetabSimulator + +__all__ = [ + "simulate_petab", + "rdatas_to_simulation_df", + "rdatas_to_measurement_df", + "LLH", + "SLLH", + "FIM", + "S2LLH", + "RES", + "SRES", + "RDATAS", + "EDATAS", + "PetabProblem", + "PetabSimulator", + "create_edatas", + "create_parameterized_edatas", +] diff --git a/python/sdist/amici/importers/petab/v1/conditions.py b/python/sdist/amici/sim/sundials/petab/v1/_conditions.py similarity index 98% rename from python/sdist/amici/importers/petab/v1/conditions.py rename to python/sdist/amici/sim/sundials/petab/v1/_conditions.py index 911a36cad0..6d29528c71 100644 --- a/python/sdist/amici/importers/petab/v1/conditions.py +++ b/python/sdist/amici/sim/sundials/petab/v1/_conditions.py @@ -19,20 +19,19 @@ TIME, ) -from amici.sim.sundials import ( - AmiciModel, - ExpData, - parameter_scaling_from_int_vector, -) - -from .parameter_mapping import ( +from amici.importers.petab.v1.parameter_mapping import ( ParameterMapping, ParameterMappingForCondition, petab_to_amici_scale, scale_parameters_dict, unscale_parameters_dict, ) -from .util import get_states_in_condition_table +from amici.importers.petab.v1.util import get_states_in_condition_table +from amici.sim.sundials import ( + AmiciModel, + ExpData, + parameter_scaling_from_int_vector, +) logger = logging.getLogger(__name__) @@ -283,7 +282,9 @@ def create_parameterized_edatas( # Get parameter mapping if parameter_mapping is None: - from .parameter_mapping import create_parameter_mapping + from amici.importers.petab.v1.parameter_mapping import ( + create_parameter_mapping, + ) parameter_mapping = create_parameter_mapping( petab_problem=petab_problem, diff --git a/python/sdist/amici/importers/petab/v1/petab_problem.py b/python/sdist/amici/sim/sundials/petab/v1/_petab_problem.py similarity index 97% rename from python/sdist/amici/importers/petab/v1/petab_problem.py rename to python/sdist/amici/sim/sundials/petab/v1/_petab_problem.py index 31ba44a36c..063dc1b2b9 100644 --- a/python/sdist/amici/importers/petab/v1/petab_problem.py +++ b/python/sdist/amici/sim/sundials/petab/v1/_petab_problem.py @@ -9,9 +9,11 @@ from petab.v1.C import PREEQUILIBRATION_CONDITION_ID, SIMULATION_CONDITION_ID import amici - -from .conditions import create_edatas, fill_in_parameters -from .parameter_mapping import create_parameter_mapping +from amici.importers.petab.v1.parameter_mapping import create_parameter_mapping +from amici.sim.sundials.petab.v1._conditions import ( + create_edatas, + fill_in_parameters, +) class PetabProblem: @@ -50,7 +52,7 @@ def __init__( if amici_model is not None: self._amici_model = amici_model else: - from .petab_import import import_petab_problem + from amici.importers.petab.v1 import import_petab_problem self._amici_model = import_petab_problem(petab_problem) diff --git a/python/sdist/amici/importers/petab/v1/simulations.py b/python/sdist/amici/sim/sundials/petab/v1/_simulations.py similarity index 99% rename from python/sdist/amici/importers/petab/v1/simulations.py rename to python/sdist/amici/sim/sundials/petab/v1/_simulations.py index 3d5f31605c..389c740503 100644 --- a/python/sdist/amici/importers/petab/v1/simulations.py +++ b/python/sdist/amici/sim/sundials/petab/v1/_simulations.py @@ -17,6 +17,10 @@ from petab.v1.C import * # noqa: F403 import amici +from amici.importers.petab.v1.parameter_mapping import ( + ParameterMapping, + create_parameter_mapping, +) from amici.logging import get_logger, log_execution_time from amici.sim.sundials import ( AMICI_SUCCESS, @@ -27,15 +31,10 @@ SensitivityOrder, run_simulations, ) - -from .conditions import ( +from amici.sim.sundials.petab.v1._conditions import ( create_edatas, fill_in_parameters, ) -from .parameter_mapping import ( - ParameterMapping, - create_parameter_mapping, -) logger = get_logger(__name__) diff --git a/python/sdist/amici/importers/petab/v1/simulator.py b/python/sdist/amici/sim/sundials/petab/v1/_simulator.py similarity index 96% rename from python/sdist/amici/importers/petab/v1/simulator.py rename to python/sdist/amici/sim/sundials/petab/v1/_simulator.py index c676e2b218..d92dfdcc77 100644 --- a/python/sdist/amici/importers/petab/v1/simulator.py +++ b/python/sdist/amici/sim/sundials/petab/v1/_simulator.py @@ -18,10 +18,10 @@ import pandas as pd import petab.v1 as petab +from amici.importers.petab.v1.petab_import import import_petab_problem from amici.sim.sundials import AmiciModel, SensitivityMethod -from .petab_import import import_petab_problem -from .simulations import RDATAS, rdatas_to_measurement_df, simulate_petab +from ._simulations import RDATAS, rdatas_to_measurement_df, simulate_petab AMICI_MODEL = "amici_model" AMICI_SOLVER = "solver" diff --git a/python/tests/adapters/test_fiddy.py b/python/tests/adapters/test_fiddy.py index df8daaaa9f..4212a6de09 100644 --- a/python/tests/adapters/test_fiddy.py +++ b/python/tests/adapters/test_fiddy.py @@ -4,7 +4,7 @@ import amici import amici.importers.petab.v1.petab_import -import amici.importers.petab.v1.simulations +import amici.sim.sundials.petab.v1._simulations import numpy as np import pytest from amici.adapters.fiddy import ( diff --git a/python/tests/petab_/test_petab_problem.py b/python/tests/petab_/test_petab_problem.py index cf2707f0ff..4aa7650042 100644 --- a/python/tests/petab_/test_petab_problem.py +++ b/python/tests/petab_/test_petab_problem.py @@ -1,5 +1,5 @@ from amici.importers.petab.v1 import import_petab_problem -from amici.importers.petab.v1.petab_problem import PetabProblem +from amici.sim.sundials.petab.v1._petab_problem import PetabProblem from amici.testing import skip_on_valgrind from benchmark_models_petab import get_problem diff --git a/python/tests/splines_utils.py b/python/tests/splines_utils.py index 26c209cdc5..4fdcea87b9 100644 --- a/python/tests/splines_utils.py +++ b/python/tests/splines_utils.py @@ -18,12 +18,7 @@ import petab.v1 as petab import sympy as sp from amici.importers.petab.v1 import ( - EDATAS, - LLH, - RDATAS, - SLLH, import_petab_problem, - simulate_petab, ) from amici.importers.sbml.splines import ( AbstractSpline, @@ -41,6 +36,13 @@ ) from amici.sim.sundials import run_simulation from amici.sim.sundials.gradient_check import _check_results +from amici.sim.sundials.petab.v1 import ( + EDATAS, + LLH, + RDATAS, + SLLH, + simulate_petab, +) from amici.testing import TemporaryDirectoryWinSafe as TemporaryDirectory from petab.v1.models.sbml_model import SbmlModel diff --git a/python/tests/test_petab_objective.py b/python/tests/test_petab_objective.py index 58299e7897..2e0eab2744 100755 --- a/python/tests/test_petab_objective.py +++ b/python/tests/test_petab_objective.py @@ -7,8 +7,9 @@ import pandas as pd import petab.v1 as petab import pytest -from amici.importers.petab.v1 import SLLH, import_petab_problem, simulate_petab +from amici.importers.petab.v1 import import_petab_problem from amici.sim.sundials import SensitivityOrder +from amici.sim.sundials.petab.v1 import SLLH, simulate_petab from amici.testing import skip_on_valgrind # Absolute and relative tolerances for finite difference gradient checks. diff --git a/python/tests/test_petab_simulate.py b/python/tests/test_petab_simulate.py index e79abb9ac6..3c352677d9 100644 --- a/python/tests/test_petab_simulate.py +++ b/python/tests/test_petab_simulate.py @@ -6,7 +6,7 @@ import petab.v1 as petab import petabtests import pytest -from amici.importers.petab.v1.simulator import PetabSimulator +from amici.sim.sundials.petab.v1 import PetabSimulator from amici.testing import skip_on_valgrind diff --git a/tests/benchmark_models/test_petab_benchmark.py b/tests/benchmark_models/test_petab_benchmark.py index d92b92ebdc..a3428ebd93 100644 --- a/tests/benchmark_models/test_petab_benchmark.py +++ b/tests/benchmark_models/test_petab_benchmark.py @@ -25,12 +25,7 @@ simulate_petab_v2_to_cached_functions, ) from amici.importers.petab.v1 import ( - LLH, - RDATAS, - SLLH, import_petab_problem, - rdatas_to_measurement_df, - simulate_petab, ) from amici.logging import get_logger from amici.sim.sundials import ( @@ -40,6 +35,13 @@ SteadyStateComputationMode, SteadyStateSensitivityMode, ) +from amici.sim.sundials.petab.v1 import ( + LLH, + RDATAS, + SLLH, + rdatas_to_measurement_df, + simulate_petab, +) from fiddy import MethodId, get_derivative from fiddy.derivative_check import NumpyIsCloseDerivativeCheck from fiddy.success import Consistency diff --git a/tests/benchmark_models/test_petab_benchmark_jax.py b/tests/benchmark_models/test_petab_benchmark_jax.py index c077f7fe37..61fc26dd2d 100644 --- a/tests/benchmark_models/test_petab_benchmark_jax.py +++ b/tests/benchmark_models/test_petab_benchmark_jax.py @@ -7,13 +7,15 @@ import numpy as np import pytest from amici.importers.petab.v1 import ( - LLH, - SLLH, import_petab_problem, - simulate_petab, ) from amici.jax.petab import run_simulations from amici.sim.sundials import SensitivityMethod, SensitivityOrder +from amici.sim.sundials.petab.v1 import ( + LLH, + SLLH, + simulate_petab, +) from beartype import beartype from test_petab_benchmark import ( benchmark_outdir, diff --git a/tests/petab_test_suite/test_petab_suite.py b/tests/petab_test_suite/test_petab_suite.py index 8d866b6c09..ed4ed5cd92 100755 --- a/tests/petab_test_suite/test_petab_suite.py +++ b/tests/petab_test_suite/test_petab_suite.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Run PEtab test suite (https://github.com/PEtab-dev/petab_test_suite)""" +"""Run PEtab v1 test suite (https://github.com/PEtab-dev/petab_test_suite)""" import logging import sys @@ -12,10 +12,7 @@ from _pytest.outcomes import Skipped from amici.importers.petab.v1 import ( import_petab_problem, - rdatas_to_measurement_df, - simulate_petab, ) -from amici.importers.petab.v1.conditions import create_parameterized_edatas from amici.logging import get_logger, set_log_level from amici.sim.sundials import ( Model, @@ -27,6 +24,11 @@ from amici.sim.sundials.gradient_check import ( check_derivatives as amici_check_derivatives, ) +from amici.sim.sundials.petab.v1 import ( + create_parameterized_edatas, + rdatas_to_measurement_df, + simulate_petab, +) logger = get_logger(__name__, logging.DEBUG) set_log_level(get_logger("amici.petab_import"), logging.DEBUG)