diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ae5194f9e5..8f120f8dcc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,7 +2,7 @@ # See https://pre-commit.com/hooks.html for more hooks repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: v6.0.0 hooks: - id: check-added-large-files - id: check-merge-conflict @@ -12,7 +12,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.12.0 + rev: v0.14.1 hooks: # Run the linter. - id: ruff @@ -28,7 +28,7 @@ repos: - python/sdist/pyproject.toml - repo: https://github.com/asottile/pyupgrade - rev: v3.20.0 + rev: v3.21.0 hooks: - id: pyupgrade args: ["--py310-plus"] diff --git a/doc/conf.py b/doc/conf.py index 78e8534768..a5e620384b 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -10,6 +10,7 @@ import sys from enum import EnumType from unittest import mock + import sphinx from sphinx.transforms.post_transforms import ReferencesResolver @@ -19,8 +20,8 @@ # for unclear reasons, the import of exhale_multiproject_monkeypatch # fails on some systems, because the the location of the editable install # is not automatically added to sys.path ¯\_(ツ)_/¯ - from importlib.metadata import Distribution import json + from importlib.metadata import Distribution from urllib.parse import unquote_plus, urlparse dist = Distribution.from_name("sphinx-contrib-exhale-multiproject") diff --git a/doc/examples/example_errors.ipynb b/doc/examples/example_errors.ipynb index 1ca6a64b14..184954b0fb 100644 --- a/doc/examples/example_errors.ipynb +++ b/doc/examples/example_errors.ipynb @@ -22,22 +22,22 @@ "from contextlib import suppress\n", "from pathlib import Path\n", "\n", + "import amici\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", - "\n", - "import amici\n", "from amici import (\n", - " simulation_status_to_str,\n", - " SteadyStateSensitivityMode,\n", + " SbmlImporter,\n", " SensitivityMethod,\n", " SensitivityOrder,\n", + " SteadyStateSensitivityMode,\n", + " import_model_module,\n", " run_simulation,\n", + " simulation_status_to_str,\n", ")\n", "from amici.petab.petab_import import import_petab_problem\n", - "from amici.petab.simulations import simulate_petab, RDATAS, EDATAS\n", - "from amici.plotting import plot_state_trajectories, plot_jacobian\n", + "from amici.petab.simulations import EDATAS, RDATAS, simulate_petab\n", + "from amici.plotting import plot_jacobian, plot_state_trajectories\n", "from petab.v1.sbml import get_sbml_model\n", - "from amici import SbmlImporter, import_model_module\n", "\n", "try:\n", " import benchmark_models_petab\n", diff --git a/doc/examples/example_jax/ExampleJax.ipynb b/doc/examples/example_jax/ExampleJax.ipynb index 1c7d71c563..c708d2dd79 100644 --- a/doc/examples/example_jax/ExampleJax.ipynb +++ b/doc/examples/example_jax/ExampleJax.ipynb @@ -317,8 +317,8 @@ "metadata": {}, "outputs": [], "source": [ - "from amici.petab.simulations import simulate_petab\n", "import amici\n", + "from amici.petab.simulations import simulate_petab\n", "\n", "amici_solver = amici_model.create_solver()\n", "amici_solver.set_sensitivity_order(amici.SensitivityOrder.first)\n", diff --git a/doc/examples/example_jax_petab/ExampleJaxPEtab.ipynb b/doc/examples/example_jax_petab/ExampleJaxPEtab.ipynb index 4898977c39..c21d1f1f67 100644 --- a/doc/examples/example_jax_petab/ExampleJaxPEtab.ipynb +++ b/doc/examples/example_jax_petab/ExampleJaxPEtab.ipynb @@ -26,11 +26,13 @@ }, { "cell_type": "code", + "execution_count": null, "id": "c71c96da0da3144a", "metadata": {}, + "outputs": [], "source": [ - "from amici.petab.petab_import import import_petab_problem\n", "import petab.v1 as petab\n", + "from amici.petab.petab_import import import_petab_problem\n", "\n", "# Define the model name and YAML file location\n", "model_name = \"Boehm_JProteomeRes2014\"\n", @@ -48,9 +50,7 @@ " verbose=False, # no text output\n", " jax=True, # return jax model\n", ")" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -64,8 +64,10 @@ }, { "cell_type": "code", + "execution_count": null, "id": "ccecc9a29acc7b73", "metadata": {}, + "outputs": [], "source": [ "from amici.jax import JAXProblem, run_simulations\n", "\n", @@ -74,9 +76,7 @@ "\n", "# Run simulations and compute the log-likelihood\n", "llh, results = run_simulations(jax_problem)" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -88,14 +88,14 @@ }, { "cell_type": "code", + "execution_count": null, "id": "596b86e45e18fe3d", "metadata": {}, + "outputs": [], "source": [ "# Access the results\n", "results" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -109,8 +109,10 @@ }, { "cell_type": "code", + "execution_count": null, "id": "f4f5ff705a3f7402", "metadata": {}, + "outputs": [], "source": [ "import jax\n", "\n", @@ -121,9 +123,7 @@ "llh, results = run_simulations(jax_problem)\n", "\n", "results" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -135,8 +135,10 @@ }, { "cell_type": "code", + "execution_count": null, "id": "72f1ed397105e14a", "metadata": {}, + "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", @@ -174,9 +176,7 @@ "\n", "# Plot the simulation results\n", "plot_simulation(results)" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -188,14 +188,14 @@ }, { "cell_type": "code", + "execution_count": null, "id": "7950774a3e989042", "metadata": {}, + "outputs": [], "source": [ "llh, results = run_simulations(jax_problem, simulation_conditions=tuple())\n", "results" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -209,10 +209,13 @@ }, { "cell_type": "code", + "execution_count": null, "id": "3d278a3d21e709d", "metadata": {}, + "outputs": [], "source": [ "from dataclasses import FrozenInstanceError\n", + "\n", "import jax\n", "\n", "# Generate random noise to update the parameters\n", @@ -228,9 +231,7 @@ " jax_problem.parameters += noise\n", "except FrozenInstanceError as e:\n", " print(\"Error:\", e)" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -244,8 +245,10 @@ }, { "cell_type": "code", + "execution_count": null, "id": "e47748376059628b", "metadata": {}, + "outputs": [], "source": [ "# Update the parameters and create a new JAXProblem instance\n", "jax_problem = jax_problem.update_parameters(jax_problem.parameters + noise)\n", @@ -255,9 +258,7 @@ "\n", "# Plot the simulation results\n", "plot_simulation(results)" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -271,17 +272,17 @@ }, { "cell_type": "code", + "execution_count": null, "id": "7033d09cc81b7f69", "metadata": {}, + "outputs": [], "source": [ "try:\n", " # Attempt to compute the gradient of the run_simulations function\n", " jax.grad(run_simulations, has_aux=True)(jax_problem)\n", "except TypeError as e:\n", " print(\"Error:\", e)" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -293,16 +294,16 @@ }, { "cell_type": "code", + "execution_count": null, "id": "a6704182200e6438", "metadata": {}, + "outputs": [], "source": [ "import equinox as eqx\n", "\n", "# Compute the gradient using equinox's filter_grad, preserving auxiliary outputs\n", "grad, _ = eqx.filter_grad(run_simulations, has_aux=True)(jax_problem)" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -314,13 +315,13 @@ }, { "cell_type": "code", + "execution_count": null, "id": "c00c1581d7173d7a", "metadata": {}, + "outputs": [], "source": [ "grad.parameters" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -332,13 +333,13 @@ }, { "cell_type": "code", + "execution_count": null, "id": "f7c17f7459d0151f", "metadata": {}, + "outputs": [], "source": [ "grad" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -350,13 +351,13 @@ }, { "cell_type": "code", + "execution_count": null, "id": "3badd4402cf6b8c6", "metadata": {}, + "outputs": [], "source": [ "grad._my" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -368,11 +369,13 @@ }, { "cell_type": "code", + "execution_count": null, "id": "1a91aff44b93157", "metadata": {}, + "outputs": [], "source": [ - "import jax.numpy as jnp\n", "import diffrax\n", + "import jax.numpy as jnp\n", "import optimistix\n", "from amici.jax import ReturnValue\n", "\n", @@ -418,9 +421,7 @@ "# Compute the gradient with respect to `ts_dyn`\n", "g = grad_ts_dyn(ts_dyn)\n", "g" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -436,8 +437,10 @@ }, { "cell_type": "code", + "execution_count": null, "id": "24cf05f7866bd250", "metadata": {}, + "outputs": [], "source": [ "from optax import adam\n", "\n", @@ -465,9 +468,7 @@ " current_loss, jax_problem, opt_state = make_step(jax_problem, opt_state)\n", " current_loss = current_loss[0].item()\n", " print(f\"step={step}, loss={current_loss}\")" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -481,8 +482,10 @@ }, { "cell_type": "code", + "execution_count": null, "id": "58ebdc110ea7457e", "metadata": {}, + "outputs": [], "source": [ "from time import time\n", "\n", @@ -491,14 +494,14 @@ "\n", "# Define a JIT-compiled gradient function with auxiliary outputs\n", "gradfun = eqx.filter_jit(eqx.filter_grad(run_simulations, has_aux=True))" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, "id": "e1242075f7e0faf", "metadata": {}, + "outputs": [], "source": [ "# Measure the time taken for the first function call (including compilation)\n", "start = time()\n", @@ -509,14 +512,14 @@ "start = time()\n", "gradfun(jax_problem)\n", "print(f\"Gradient compilation time: {time() - start:.2f} seconds\")" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, "id": "27181f367ccb1817", "metadata": {}, + "outputs": [], "source": [ "%%timeit\n", "run_simulations(\n", @@ -529,14 +532,14 @@ " dcoeff=0.0, # recommended value for stiff systems\n", " ),\n", ")" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, "id": "5b8d3a6162a3ae55", "metadata": {}, + "outputs": [], "source": [ "%%timeit\n", "gradfun(\n", @@ -549,17 +552,17 @@ " dcoeff=0.0, # recommended value for stiff systems\n", " ),\n", ")" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, "id": "d733a450635a749b", "metadata": {}, + "outputs": [], "source": [ - "from amici.petab import simulate_petab\n", "import amici\n", + "from amici.petab import simulate_petab\n", "\n", "# Import the PEtab problem as a standard AMICI model\n", "amici_model = import_petab_problem(\n", @@ -577,25 +580,25 @@ "problem_parameters = dict(\n", " zip(jax_problem.parameter_ids, jax_problem.parameters)\n", ")" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, "id": "413ed7c60b2cf4be", "metadata": {}, + "outputs": [], "source": [ "# Profile simulation only\n", "solver.set_sensitivity_order(amici.SensitivityOrder.none)" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, "id": "768fa60e439ca8b4", "metadata": {}, + "outputs": [], "source": [ "%%timeit\n", "simulate_petab(\n", @@ -606,26 +609,26 @@ " scaled_parameters=True,\n", " scaled_gradients=True,\n", ")" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, "id": "b8382b0b2b68f49e", "metadata": {}, + "outputs": [], "source": [ "# Profile gradient computation using forward sensitivity analysis\n", "solver.set_sensitivity_order(amici.SensitivityOrder.first)\n", "solver.set_sensitivity_method(amici.SensitivityMethod.forward)" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, "id": "3bae1fab8c416122", "metadata": {}, + "outputs": [], "source": [ "%%timeit\n", "simulate_petab(\n", @@ -636,26 +639,26 @@ " scaled_parameters=True,\n", " scaled_gradients=True,\n", ")" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, "id": "71e0358227e1dc74", "metadata": {}, + "outputs": [], "source": [ "# Profile gradient computation using adjoint sensitivity analysis\n", "solver.set_sensitivity_order(amici.SensitivityOrder.first)\n", "solver.set_sensitivity_method(amici.SensitivityMethod.adjoint)" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, "id": "e3cc7971002b6d06", "metadata": {}, + "outputs": [], "source": [ "%%timeit\n", "simulate_petab(\n", @@ -666,9 +669,7 @@ " scaled_parameters=True,\n", " scaled_gradients=True,\n", ")" - ], - "outputs": [], - "execution_count": null + ] } ], "metadata": { diff --git a/doc/examples/example_large_models/example_performance_optimization.ipynb b/doc/examples/example_large_models/example_performance_optimization.ipynb index 3cb8816275..fe35582a5b 100644 --- a/doc/examples/example_large_models/example_performance_optimization.ipynb +++ b/doc/examples/example_large_models/example_performance_optimization.ipynb @@ -35,9 +35,9 @@ "metadata": {}, "outputs": [], "source": [ - "from IPython.core.pylabtools import figsize\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", + "from IPython.core.pylabtools import figsize\n", "\n", "plt.rcParams.update({\"font.size\": 12})" ] diff --git a/doc/examples/example_petab/petab.ipynb b/doc/examples/example_petab/petab.ipynb index f7130ed8a6..6ad8b257cd 100644 --- a/doc/examples/example_petab/petab.ipynb +++ b/doc/examples/example_petab/petab.ipynb @@ -13,18 +13,17 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "import petab\n", - "\n", "from amici import run_simulation\n", "from amici.petab.petab_import import import_petab_problem\n", "from amici.petab.petab_problem import PetabProblem\n", "from amici.petab.simulations import simulate_petab\n", "from amici.plotting import plot_state_trajectories" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -44,16 +43,16 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "model_name = \"Boehm_JProteomeRes2014\"\n", "# local path or URL to the yaml file for the PEtab problem\n", "petab_yaml = f\"https://benchmarking-initiative.github.io/Benchmark-Models-PEtab/tree/Benchmark-Models/{model_name}/{model_name}.yaml\"\n", "# load the problem using the PEtab library\n", "petab_problem = petab.Problem.from_yaml(petab_yaml)" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -64,15 +63,17 @@ ] }, { - "metadata": {}, "cell_type": "code", - "source": "amici_model = import_petab_problem(petab_problem, verbose=False, compile_=True)", + "execution_count": null, + "metadata": {}, "outputs": [], - "execution_count": null + "source": [ + "amici_model = import_petab_problem(petab_problem, verbose=False, compile_=True)" + ] }, { - "metadata": {}, "cell_type": "markdown", + "metadata": {}, "source": [ "That's it. Now, we can use the model to perform simulations.\n", "\n", @@ -84,11 +85,13 @@ ] }, { - "metadata": {}, "cell_type": "code", - "source": "simulate_petab(petab_problem, amici_model)", + "execution_count": null, + "metadata": {}, "outputs": [], - "execution_count": null + "source": [ + "simulate_petab(petab_problem, amici_model)" + ] }, { "cell_type": "markdown", @@ -99,7 +102,9 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "parameters = {\n", " x_id: x_val\n", @@ -114,9 +119,7 @@ " problem_parameters=parameters,\n", " scaled_parameters=True,\n", ")" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -129,8 +132,10 @@ ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "app = PetabProblem(petab_problem, amici_model)\n", "\n", @@ -139,32 +144,30 @@ "\n", "# ExpData for a single condition:\n", "edata = app.get_edata(\"model1_data1\")" - ], - "outputs": [], - "execution_count": null + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "rdata = run_simulation(\n", " amici_model, solver=amici_model.create_solver(), edata=edata\n", ")\n", "rdata" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, "metadata": { "collapsed": false }, + "outputs": [], "source": [ "plot_state_trajectories(rdata)" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", diff --git a/doc/examples/example_presimulation/ExampleExperimentalConditions.ipynb b/doc/examples/example_presimulation/ExampleExperimentalConditions.ipynb index 7f6d1a42fe..24627af62e 100644 --- a/doc/examples/example_presimulation/ExampleExperimentalConditions.ipynb +++ b/doc/examples/example_presimulation/ExampleExperimentalConditions.ipynb @@ -23,10 +23,9 @@ "\n", "from pprint import pprint\n", "\n", + "import amici.plotting\n", "import libsbml\n", - "import numpy as np\n", - "\n", - "import amici.plotting" + "import numpy as np" ] }, { @@ -178,11 +177,13 @@ ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, - "source": "fixed_parameters = [\"DRUG_0\", \"KIN_0\"]" + "metadata": {}, + "outputs": [], + "source": [ + "fixed_parameters = [\"DRUG_0\", \"KIN_0\"]" + ] }, { "cell_type": "markdown", @@ -223,10 +224,10 @@ ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "sbml_importer.sbml2amici(\n", " model_name,\n", @@ -247,10 +248,10 @@ ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Create Model instance\n", "model = model_module.get_model()\n", @@ -260,15 +261,15 @@ ] }, { - "metadata": {}, "cell_type": "markdown", + "metadata": {}, "source": "The only thing we need to simulate the model is a timepoint vector, which can be specified using the [setTimepoints](https://amici.readthedocs.io/en/latest/generated/amici.amici.Model.html#amici.amici.Model.setTimepoints) method. If we do not specify any additional options, the default values for `fixedParameters` and `parameters` that were specified in the SBML file will be used." }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Run simulation using default model parameters and solver options\n", "model.set_timepoints(np.linspace(0, 60, 60))\n", @@ -284,10 +285,10 @@ ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "edata = amici.ExpData(rdata, 0.1, 0.0)\n", "edata.fixed_parameters = [0, 2]\n", @@ -304,10 +305,10 @@ ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "edata.fixed_parameters_pre_equilibration = [3, 0]\n", "rdata = amici.run_simulation(model, solver, edata)\n", @@ -322,11 +323,13 @@ ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, - "source": "edata.reinitialize_fixed_parameter_initial_states = True" + "metadata": {}, + "outputs": [], + "source": [ + "edata.reinitialize_fixed_parameter_initial_states = True" + ] }, { "cell_type": "markdown", @@ -336,10 +339,10 @@ ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "rdata = amici.run_simulation(model, solver, edata)\n", "amici.plotting.plot_observable_trajectories(rdata)" @@ -351,10 +354,10 @@ "source": "On top of preequilibration, we can also specify presimulation. This option can be used to specify pretreatments where the system is not assumed to reach steadystate. Presimulation can be activated by specifying `t_presim` and `edata.fixed_parameters_presimulation`. If both `fixed_parameters_presimulation` and `fixed_parameters_pre_equilibration` are specified, pre-equilibration will be performed first, followed by presimulation, followed by regular simulation. For this example we specify `DRUG_0=10` and `KIN_0=0` for the presimulation and `DRUG_0=10` and `KIN_0=2` for the regular simulation. We do not overwrite the `DRUG_0=3` and `KIN_0=0` that was previously specified for pre-equilibration." }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "edata.t_presim = 10\n", "edata.fixed_parameters_presimulation = [10.0, 0.0]\n", diff --git a/doc/examples/example_splines/ExampleSplines.ipynb b/doc/examples/example_splines/ExampleSplines.ipynb index e121c3096b..b343e1695c 100644 --- a/doc/examples/example_splines/ExampleSplines.ipynb +++ b/doc/examples/example_splines/ExampleSplines.ipynb @@ -29,13 +29,12 @@ "from tempfile import TemporaryDirectory\n", "from uuid import uuid1\n", "\n", + "import amici\n", "import matplotlib as mpl\n", "import numpy as np\n", "import sympy as sp\n", "from matplotlib import pyplot as plt\n", "\n", - "import amici\n", - "\n", "# Choose build directory\n", "BUILD_PATH = None # temporary folder\n", "# BUILD_PATH = 'build' # specified folder for debugging\n", @@ -1131,9 +1130,10 @@ }, "outputs": [], "source": [ - "import pandas as pd\n", "import tempfile\n", - "import time" + "import time\n", + "\n", + "import pandas as pd" ] }, { diff --git a/doc/examples/example_splines_swameye/ExampleSplinesSwameye2003.ipynb b/doc/examples/example_splines_swameye/ExampleSplinesSwameye2003.ipynb index bd43664797..5cbb78cd69 100644 --- a/doc/examples/example_splines_swameye/ExampleSplinesSwameye2003.ipynb +++ b/doc/examples/example_splines_swameye/ExampleSplinesSwameye2003.ipynb @@ -52,15 +52,14 @@ "import logging\n", "import os\n", "\n", + "import amici\n", "import libsbml\n", "import numpy as np\n", "import pandas as pd\n", "import petab\n", "import pypesto.petab\n", "import sympy as sp\n", - "from matplotlib import pyplot as plt\n", - "\n", - "import amici" + "from matplotlib import pyplot as plt" ] }, { @@ -362,10 +361,11 @@ ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "id": "c6741bce012b6ffa", + "metadata": {}, + "outputs": [], "source": [ "# Import PEtab problem into pyPESTO\n", "pypesto_problem = pypesto.petab.PetabImporter(\n", @@ -377,8 +377,7 @@ "\n", "# Increase maximum number of steps for AMICI\n", "pypesto_problem.objective.amici_solver.set_max_steps(10**5)" - ], - "id": "c6741bce012b6ffa" + ] }, { "cell_type": "markdown", diff --git a/doc/examples/example_steady_states/ExampleEquilibrationLogic.ipynb b/doc/examples/example_steady_states/ExampleEquilibrationLogic.ipynb index c7875a6bce..f2b696c98c 100644 --- a/doc/examples/example_steady_states/ExampleEquilibrationLogic.ipynb +++ b/doc/examples/example_steady_states/ExampleEquilibrationLogic.ipynb @@ -80,35 +80,40 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "# Import necessary libraries and define the model\n", - "import amici\n", "import os\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", "import tempfile\n", - "from pathlib import Path\n", - "from amici.antimony_import import antimony2sbml\n", "from contextlib import suppress\n", - "from amici.plotting import (\n", - " plot_observable_trajectories,\n", - " plot_state_trajectories,\n", - ")\n", + "from pathlib import Path\n", + "\n", + "import amici\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", "from amici import (\n", - " SteadyStateStatus,\n", - " simulation_status_to_str,\n", - " SteadyStateSensitivityMode,\n", - " SteadyStateComputationMode,\n", - " SensitivityOrder,\n", + " AMICI_ERROR,\n", + " AMICI_SUCCESS,\n", + " ExpData,\n", " SensitivityMethod,\n", + " SensitivityOrder,\n", + " SteadyStateComputationMode,\n", + " SteadyStateSensitivityMode,\n", + " SteadyStateStatus,\n", " import_model_module,\n", " run_simulation,\n", - " AMICI_SUCCESS,\n", - " AMICI_ERROR,\n", - " ExpData,\n", + " simulation_status_to_str,\n", + ")\n", + "from amici import (\n", " MeasurementChannel as MC,\n", ")\n", + "from amici.antimony_import import antimony2sbml\n", + "from amici.plotting import (\n", + " plot_observable_trajectories,\n", + " plot_state_trajectories,\n", + ")\n", "\n", "# We encode the model in Antimony format (https://tellurium.readthedocs.io/en/latest/antimony.html),\n", "# which is a human-readable format for biochemical models that can be converted to SBML.\n", @@ -157,13 +162,13 @@ "temp_dir = Path(tempfile.mkdtemp())\n", "model_output_dir = temp_dir / model_name\n", "model_reduced_output_dir = temp_dir / model_reduced_name" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "# Import the model\n", "sbml_importer = amici.SbmlImporter(antimony2sbml(ant_model), from_file=False)\n", @@ -195,13 +200,13 @@ " observation_model=observation_model,\n", " constant_parameters=constant_parameters,\n", ")" - ], - "outputs": [], - "execution_count": null + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# import the models and run some test simulations\n", "model_reduced_module = import_model_module(\n", @@ -231,22 +236,20 @@ "plot_state_trajectories(rdata_reduced, model=model_reduced, ax=axes[0, 1])\n", "plot_observable_trajectories(rdata_reduced, model=model_reduced, ax=axes[1, 1])\n", "fig.tight_layout()" - ], - "outputs": [], - "execution_count": null + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# the enzyme state was removed from the ODEs of the reduced model\n", "print(model.get_state_ids_solver())\n", "print(model_reduced.get_state_ids_solver())\n", "print(model.get_state_ids())\n", "print(model_reduced.get_state_ids())" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -290,7 +293,9 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "# Call post-equilibration by setting an infinity timepoint\n", "model.set_timepoints([np.inf])\n", @@ -319,9 +324,7 @@ " \"posteq_cpu_time_b\",\n", "]:\n", " print(f\"{key:>16}: {rdata[key]}\")" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -348,12 +351,12 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "list(SteadyStateStatus)" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -371,7 +374,9 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "# steady state value found by pre-equilibration\n", "steady_state = rdata[\"x\"][0]\n", @@ -383,9 +388,7 @@ "\n", "for stst_value in steady_state:\n", " plt.axhline(y=stst_value, color=\"gray\", linestyle=\"--\", linewidth=1)" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -394,7 +397,9 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "# reduce maxsteps for integration\n", "model.set_timepoints([np.inf])\n", @@ -406,9 +411,7 @@ "print(\n", " \"Number of steps employed in post-equilibration:\", rdata[\"posteq_numsteps\"]\n", ")" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -420,7 +423,9 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "model_reduced.set_timepoints([np.inf])\n", "model_reduced.set_steady_state_computation_mode(\n", @@ -444,9 +449,7 @@ " \"Number of steps employed in post-equilibration:\",\n", " rdata_reduced[\"posteq_numsteps\"],\n", ")" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -459,7 +462,9 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "# create edata, with 3 timepoints and 2 observables:\n", "edata = ExpData(2, 0, 0, np.array([0.0, 0.1, 1.0]))\n", @@ -468,13 +473,13 @@ "# set parameters for pre-equilibration\n", "edata.fixed_parameters_pre_equilibration = np.array([0.0, 2.0])\n", "edata.reinitialize_fixed_parameter_initial_states = True" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "# create the solver object and run the simulation\n", "solver_reduced = model_reduced.create_solver()\n", @@ -496,9 +501,7 @@ "\n", "plot_state_trajectories(rdata_reduced, model=model_reduced)\n", "plot_observable_trajectories(rdata_reduced, model=model_reduced)" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -512,7 +515,9 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "# Change the last timepoint to an infinity timepoint.\n", "edata.set_timepoints(np.array([0.0, 0.1, float(\"inf\")]))\n", @@ -520,9 +525,7 @@ "# run the simulation\n", "rdata_reduced = run_simulation(model_reduced, solver_reduced, edata)\n", "assert rdata_reduced.status == AMICI_SUCCESS" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -574,7 +577,9 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "# Call simulation with singular Jacobian and `integrateIfNewtonFails` mode\n", "model.set_timepoints([np.inf])\n", @@ -596,9 +601,7 @@ ")\n", "print(\"Computed state sensitivities:\")\n", "print(rdata[\"sx\"][0, :, :])" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -610,7 +613,9 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "# Call simulation with singular Jacobian and newtonOnly mode (will fail)\n", "model.set_timepoints([np.inf])\n", @@ -631,9 +636,7 @@ ")\n", "print(\"Computed state sensitivities:\")\n", "print(rdata[\"sx\"][0, :, :])" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -646,7 +649,9 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "# Try `newtonOnly` option with reduced model\n", "model_reduced.set_timepoints([np.inf])\n", @@ -678,9 +683,7 @@ ")\n", "print(\"Computed state sensitivities:\")\n", "print(rdata_reduced[\"sx\"][0, :, :])" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -752,7 +755,9 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "# Call post-equilibration and sensitivities computation using adjoint sensitivity analysis\n", "# by setting an infinity timepoint\n", @@ -785,9 +790,7 @@ " rdata_reduced[\"posteq_numsteps_b\"],\n", ")\n", "print(\"Computed gradient:\", rdata_reduced[\"sllh\"])" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -799,7 +802,9 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "# Call adjoint post-equilibration with model with singular Jacobian\n", "model.set_steady_state_sensitivity_mode(SteadyStateSensitivityMode.newtonOnly)\n", @@ -820,9 +825,7 @@ " rdata[\"posteq_numsteps_b\"],\n", ")\n", "print(\"Computed gradient:\", rdata[\"sllh\"])" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -841,7 +844,9 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "# No post-equilibration this time.\n", "# create edata, with 3 timepoints and 2 observables:\n", @@ -864,13 +869,13 @@ "for key, value in rdata.items():\n", " if key[0:6] == \"preeq_\":\n", " print(f\"{key:20s}:\", value)" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "# Singular Jacobian, use simulation\n", "model.set_steady_state_sensitivity_mode(\n", @@ -891,13 +896,13 @@ "for key, value in rdata.items():\n", " if key[0:6] == \"preeq_\":\n", " print(f\"{key:20s}:\", value)" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "# Non-singular Jacobian, use Newton solver\n", "solver_reduced = model_reduced.create_solver()\n", @@ -909,9 +914,7 @@ "for key, value in rdata_reduced.items():\n", " if key[0:6] == \"preeq_\":\n", " print(f\"{key:20s}:\", value)" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -939,7 +942,9 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "# Non-singular Jacobian, use Newton solver and adjoints with initial state sensitivities\n", "solver_reduced = model_reduced.create_solver()\n", @@ -958,13 +963,13 @@ " if key[0:6] == \"preeq_\":\n", " print(f\"{key:20s}:\", value)\n", "print(\"Gradient:\", rdata_reduced[\"sllh\"])" - ], - "outputs": [], - "execution_count": null + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Non-singular Jacobian, use simulation solver and adjoints with initial state sensitivities\n", "solver_reduced = model_reduced.create_solver()\n", @@ -985,13 +990,13 @@ " if key[0:6] == \"preeq_\":\n", " print(f\"{key:20s}:\", value)\n", "print(\"Gradient:\", rdata_reduced[\"sllh\"])" - ], - "outputs": [], - "execution_count": null + ] }, { - "metadata": {}, "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Non-singular Jacobian, use Newton solver and adjoints with fully adjoint pre-equilibration\n", "solver_reduced = model_reduced.create_solver()\n", @@ -1014,18 +1019,18 @@ " if key[0:6] == \"preeq_\":\n", " print(f\"{key:20s}:\", value)\n", "print(\"Gradient:\", rdata_reduced[\"sllh\"])" - ], - "outputs": [], - "execution_count": null + ] }, { - "metadata": {}, "cell_type": "markdown", + "metadata": {}, "source": "As for post-equilibration, adjoint pre-equilibration has an analytic solution (via the linear system), which will be preferred. If used for models with singular Jacobian, numerical integration will be carried out, which is indicated by `preeq_numsteps_b`." }, { - "metadata": {}, "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Singular Jacobian, use try Newton solver and adjoints with fully adjoint pre-equilibration\n", "solver = model.create_solver()\n", @@ -1046,9 +1051,7 @@ " if key[0:6] == \"preeq_\":\n", " print(f\"{key:20s}:\", value)\n", "print(\"Gradient:\", rdata[\"sllh\"])" - ], - "outputs": [], - "execution_count": null + ] }, { "cell_type": "markdown", @@ -1070,7 +1073,9 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ "# Non-singular Jacobian, use simulation\n", "model_reduced.set_steady_state_sensitivity_mode(\n", @@ -1107,9 +1112,7 @@ "print(\"\\nCPU time to reach steady state (ms):\")\n", "print(\" lax tolerances: \", rdata_reduced_lax[\"preeq_cpu_time\"])\n", "print(\" strict tolerances:\", rdata_reduced_strict[\"preeq_cpu_time\"])" - ], - "outputs": [], - "execution_count": null + ] } ], "metadata": { diff --git a/doc/examples/getting_started_extended/GettingStartedExtended.ipynb b/doc/examples/getting_started_extended/GettingStartedExtended.ipynb index 5a1c814590..5449baf957 100644 --- a/doc/examples/getting_started_extended/GettingStartedExtended.ipynb +++ b/doc/examples/getting_started_extended/GettingStartedExtended.ipynb @@ -27,10 +27,10 @@ "# Directory to which the generated model code is written\n", "model_output_dir = model_name\n", "\n", - "import libsbml\n", "import amici\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt" + "import libsbml\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np" ] }, { @@ -365,10 +365,10 @@ ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "model = model_module.get_model()\n", "\n", diff --git a/python/sdist/amici/__init__.py b/python/sdist/amici/__init__.py index c4bfa62b2d..7bdf4ea5ed 100644 --- a/python/sdist/amici/__init__.py +++ b/python/sdist/amici/__init__.py @@ -7,16 +7,16 @@ """ import contextlib -import importlib.util import importlib +import importlib.util import os import re import sys +import warnings +from collections.abc import Callable from pathlib import Path from types import ModuleType from typing import Any -from collections.abc import Callable -import warnings def _get_amici_path(): @@ -129,11 +129,11 @@ def _imported_from_setup() -> bool: from typing import Protocol, runtime_checkable from .de_export import DEExporter # noqa: F401 + from .import_utils import MeasurementChannel # noqa: F401 from .sbml_import import ( # noqa: F401 SbmlImporter, assignment_rules_to_observables, ) - from .import_utils import MeasurementChannel # noqa: F401 try: from .jax import JAXModel diff --git a/python/sdist/amici/__init__.template.py b/python/sdist/amici/__init__.template.py index dd468d5e7b..be73a806af 100644 --- a/python/sdist/amici/__init__.template.py +++ b/python/sdist/amici/__init__.template.py @@ -1,9 +1,10 @@ """AMICI-generated module for model TPL_MODELNAME""" import sys +import warnings from pathlib import Path + import amici -import warnings # Ensure we are binary-compatible, see #556 if "TPL_AMICI_VERSION" != amici.__version__: diff --git a/python/sdist/amici/__main__.py b/python/sdist/amici/__main__.py index 19b8e13592..8c5a00ba55 100644 --- a/python/sdist/amici/__main__.py +++ b/python/sdist/amici/__main__.py @@ -3,11 +3,11 @@ import sys from . import ( + CpuTimer, __version__, compiled_with_openmp, has_clibs, hdf5_enabled, - CpuTimer, ) diff --git a/python/sdist/amici/_codegen/cxx_functions.py b/python/sdist/amici/_codegen/cxx_functions.py index 5151df84a4..df5de58c5d 100644 --- a/python/sdist/amici/_codegen/cxx_functions.py +++ b/python/sdist/amici/_codegen/cxx_functions.py @@ -2,8 +2,8 @@ from __future__ import annotations -from dataclasses import dataclass, field import re +from dataclasses import dataclass, field @dataclass diff --git a/python/sdist/amici/compile.py b/python/sdist/amici/compile.py index 4accf809a2..aa6752987f 100644 --- a/python/sdist/amici/compile.py +++ b/python/sdist/amici/compile.py @@ -3,10 +3,10 @@ package. """ +import os import subprocess import sys from pathlib import Path -import os def build_model_extension( diff --git a/python/sdist/amici/custom_commands.py b/python/sdist/amici/custom_commands.py index 917d1ea565..fabe39b48e 100644 --- a/python/sdist/amici/custom_commands.py +++ b/python/sdist/amici/custom_commands.py @@ -5,7 +5,6 @@ import sys from pathlib import Path -from amici.swig import fix_typehints from cmake_build_extension import BuildExtension, CMakeExtension from setuptools.command.build_py import build_py from setuptools.command.develop import develop @@ -13,6 +12,8 @@ from setuptools.command.install_lib import install_lib from setuptools.command.sdist import sdist +from amici.swig import fix_typehints + class AmiciInstall(install): """Custom `install` command to handle extra arguments""" diff --git a/python/sdist/amici/cxxcodeprinter.py b/python/sdist/amici/cxxcodeprinter.py index 2a5cb4b4a2..d70ee8b364 100644 --- a/python/sdist/amici/cxxcodeprinter.py +++ b/python/sdist/amici/cxxcodeprinter.py @@ -4,8 +4,7 @@ import os import re import warnings -from collections.abc import Sequence -from collections.abc import Iterable +from collections.abc import Iterable, Sequence import sympy as sp from sympy.codegen.rewriting import Optimization, optimize diff --git a/python/sdist/amici/de_export.py b/python/sdist/amici/de_export.py index d2d67cfaec..0defef2fc8 100644 --- a/python/sdist/amici/de_export.py +++ b/python/sdist/amici/de_export.py @@ -11,6 +11,7 @@ """ from __future__ import annotations + import copy import logging import os @@ -33,34 +34,34 @@ ) from ._codegen.cxx_functions import ( _FunctionInfo, + event_functions, + event_sensi_functions, functions, - sparse_functions, + multiobs_functions, nobody_functions, sensi_functions, + sparse_functions, sparse_sensi_functions, - event_functions, - event_sensi_functions, - multiobs_functions, ) from ._codegen.model_class import ( get_function_extern_declaration, - get_sunindex_extern_declaration, get_model_override_implementation, + get_sunindex_extern_declaration, get_sunindex_override_implementation, ) from ._codegen.template import apply_template +from .compile import build_model_extension from .cxxcodeprinter import ( AmiciCxxCodePrinter, - get_switch_statement, get_initializer_list, + get_switch_statement, ) -from .de_model_components import * from .de_model import DEModel +from .de_model_components import * from .import_utils import ( strip_pysb, ) from .logging import get_logger, log_execution_time, set_log_level -from .compile import build_model_extension from .sympy_utils import ( _custom_pow_eval_derivative, _monkeypatched, diff --git a/python/sdist/amici/de_model.py b/python/sdist/amici/de_model.py index e62f14312b..b7fafb299a 100644 --- a/python/sdist/amici/de_model.py +++ b/python/sdist/amici/de_model.py @@ -5,62 +5,61 @@ import contextlib import copy import itertools +import logging import re +from collections.abc import Callable, Sequence from itertools import chain from typing import TYPE_CHECKING -from collections.abc import Callable -from collections.abc import Sequence import numpy as np import sympy as sp from sympy import ImmutableDenseMatrix, MutableDenseMatrix from ._codegen.cxx_functions import ( - sparse_functions, - sensi_functions, nobody_functions, + sensi_functions, + sparse_functions, var_in_function_signature, ) from .cxxcodeprinter import csc_matrix from .de_model_components import ( - DifferentialState, - AlgebraicState, AlgebraicEquation, - Observable, - EventObservable, - SigmaY, - SigmaZ, - Parameter, + AlgebraicState, + ConservationLaw, Constant, + DifferentialState, + Event, + EventObservable, + Expression, + LogLikelihoodRZ, LogLikelihoodY, LogLikelihoodZ, - LogLikelihoodRZ, + ModelQuantity, NoiseParameter, + Observable, ObservableParameter, - Expression, - ConservationLaw, - Event, + Parameter, + SigmaY, + SigmaZ, State, - ModelQuantity, ) from .import_utils import ( - _default_simplify, - SBMLException, - toposort_symbols, - smart_subs_dict, ObservableTransformation, + SBMLException, + _default_simplify, amici_time_symbol, + smart_subs_dict, strip_pysb, + toposort_symbols, unique_preserve_order, ) +from .logging import get_logger, log_execution_time, set_log_level from .sympy_utils import ( - smart_jacobian, + _parallel_applyfunc, smart_is_zero_matrix, + smart_jacobian, smart_multiply, - _parallel_applyfunc, ) -from .logging import get_logger, log_execution_time, set_log_level -import logging if TYPE_CHECKING: from .splines import AbstractSpline diff --git a/python/sdist/amici/de_model_components.py b/python/sdist/amici/de_model_components.py index a269338274..bf11cca3d0 100644 --- a/python/sdist/amici/de_model_components.py +++ b/python/sdist/amici/de_model_components.py @@ -6,16 +6,16 @@ import sympy as sp +from .constants import SymbolId from .import_utils import ( RESERVED_SYMBOLS, ObservableTransformation, amici_time_symbol, cast_to_sym, + contains_periodic_subexpression, generate_measurement_symbol, generate_regularization_symbol, - contains_periodic_subexpression, ) -from .constants import SymbolId __all__ = [ "ConservationLaw", diff --git a/python/sdist/amici/debugging/__init__.py b/python/sdist/amici/debugging/__init__.py index 46a93f45af..fbeb553bf8 100644 --- a/python/sdist/amici/debugging/__init__.py +++ b/python/sdist/amici/debugging/__init__.py @@ -1,8 +1,9 @@ """Functions for debugging AMICI simulation failures.""" -import amici import numpy as np +import amici + def get_model_for_preeq(model: amici.Model, edata: amici.ExpData): """Get a model set-up to simulate the preequilibration condition as diff --git a/python/sdist/amici/import_utils.py b/python/sdist/amici/import_utils.py index dc516362ae..5e5e6d399c 100644 --- a/python/sdist/amici/import_utils.py +++ b/python/sdist/amici/import_utils.py @@ -5,12 +5,11 @@ import itertools as itt import numbers import sys +from collections.abc import Callable, Iterable, Sequence from typing import ( Any, SupportsFloat, ) -from collections.abc import Callable -from collections.abc import Iterable, Sequence import sympy as sp from sympy.functions.elementary.piecewise import ExprCondPair diff --git a/python/sdist/amici/jax/__init__.py b/python/sdist/amici/jax/__init__.py index a5b5dc1cae..b05de6c87e 100644 --- a/python/sdist/amici/jax/__init__.py +++ b/python/sdist/amici/jax/__init__.py @@ -9,13 +9,13 @@ from warnings import warn +from amici.jax.model import JAXModel from amici.jax.petab import ( JAXProblem, - run_simulations, - petab_simulate, ReturnValue, + petab_simulate, + run_simulations, ) -from amici.jax.model import JAXModel warn( "The JAX module is experimental and the API may change in the future.", diff --git a/python/sdist/amici/jax/_simulation.py b/python/sdist/amici/jax/_simulation.py index 9210daba0d..605791d33e 100644 --- a/python/sdist/amici/jax/_simulation.py +++ b/python/sdist/amici/jax/_simulation.py @@ -3,16 +3,15 @@ # ruff: noqa: F821 F722 import os +from collections.abc import Callable import diffrax import equinox.internal as eqxi -import jax.numpy as jnp import jax +import jax.numpy as jnp import jax.tree_util as jtu -from optimistix import AbstractRootFinder import jaxtyping as jt - -from collections.abc import Callable +from optimistix import AbstractRootFinder STARTING_STATS = { "max_steps": 0, diff --git a/python/sdist/amici/jax/jax.template.py b/python/sdist/amici/jax/jax.template.py index 3c98d36e8c..804b06f5a4 100644 --- a/python/sdist/amici/jax/jax.template.py +++ b/python/sdist/amici/jax/jax.template.py @@ -1,12 +1,13 @@ # ruff: noqa: F401, F821, F841 -import jax.numpy as jnp +from pathlib import Path + import equinox as eqx +import jax.numpy as jnp from interpax import interp1d -from pathlib import Path from jax.numpy import inf as oo from jax.numpy import nan as nan -from amici.jax.model import JAXModel, safe_log, safe_div +from amici.jax.model import JAXModel, safe_div, safe_log class JAXModel_TPL_MODEL_NAME(JAXModel): diff --git a/python/sdist/amici/jax/model.py b/python/sdist/amici/jax/model.py index 9c547b6c89..24be436bdf 100644 --- a/python/sdist/amici/jax/model.py +++ b/python/sdist/amici/jax/model.py @@ -2,20 +2,20 @@ # ruff: noqa: F821 F722 -from abc import abstractmethod -from pathlib import Path import enum +from abc import abstractmethod +from collections.abc import Callable from dataclasses import field +from pathlib import Path import diffrax import equinox as eqx -import jax.numpy as jnp import jax -from optimistix import AbstractRootFinder +import jax.numpy as jnp import jaxtyping as jt +from optimistix import AbstractRootFinder -from collections.abc import Callable -from ._simulation import solve, eq +from ._simulation import eq, solve class ReturnValue(enum.Enum): diff --git a/python/sdist/amici/jax/ode_export.py b/python/sdist/amici/jax/ode_export.py index cd534fea0c..cbe9b2b310 100644 --- a/python/sdist/amici/jax/ode_export.py +++ b/python/sdist/amici/jax/ode_export.py @@ -11,6 +11,7 @@ """ from __future__ import annotations + import logging import os from pathlib import Path @@ -20,16 +21,14 @@ from amici import ( amiciModulePath, ) - from amici._codegen.template import apply_template -from amici.jax.jaxcodeprinter import AmiciJaxCodePrinter, _jnp_array_str -from amici.jax.model import JAXModel -from amici.de_model import DEModel - from amici.de_export import is_valid_identifier +from amici.de_model import DEModel from amici.import_utils import ( strip_pysb, ) +from amici.jax.jaxcodeprinter import AmiciJaxCodePrinter, _jnp_array_str +from amici.jax.model import JAXModel from amici.logging import get_logger, log_execution_time, set_log_level from amici.sympy_utils import ( _custom_pow_eval_derivative, diff --git a/python/sdist/amici/jax/petab.py b/python/sdist/amici/jax/petab.py index 1f964ed2de..0335851271 100644 --- a/python/sdist/amici/jax/petab.py +++ b/python/sdist/amici/jax/petab.py @@ -2,29 +2,27 @@ import copy import shutil +from collections.abc import Callable, Iterable, Sized from numbers import Number -from collections.abc import Sized, Iterable from pathlib import Path -from collections.abc import Callable - import diffrax -import optimistix -from optimistix import AbstractRootFinder import equinox as eqx -import jaxtyping as jt import jax.lax import jax.numpy as jnp +import jaxtyping as jt import numpy as np +import optimistix import pandas as pd import petab.v1 as petab +from optimistix import AbstractRootFinder from amici import _module_from_path +from amici.jax.model import JAXModel, ReturnValue from amici.petab.parameter_mapping import ( ParameterMappingForCondition, create_parameter_mapping, ) -from amici.jax.model import JAXModel, ReturnValue DEFAULT_CONTROLLER_SETTINGS = { "atol": 1e-8, diff --git a/python/sdist/amici/numpy.py b/python/sdist/amici/numpy.py index 247ee6a05e..8243b29b21 100644 --- a/python/sdist/amici/numpy.py +++ b/python/sdist/amici/numpy.py @@ -5,16 +5,21 @@ """ from __future__ import annotations + import collections import copy import itertools -from typing import Literal from collections.abc import Iterator from numbers import Number -import amici +from typing import Literal + import numpy as np import sympy as sp +import xarray as xr from sympy.abc import _clash + +import amici + from . import ( ExpData, ExpDataPtr, @@ -23,8 +28,6 @@ ReturnDataPtr, SteadyStateStatus, ) -import xarray as xr - __all__ = [ "ReturnDataView", diff --git a/python/sdist/amici/pandas.py b/python/sdist/amici/pandas.py index 0e2c777b18..51451ac07b 100644 --- a/python/sdist/amici/pandas.py +++ b/python/sdist/amici/pandas.py @@ -9,10 +9,11 @@ import math from typing import SupportsFloat -import amici import numpy as np import pandas as pd +import amici + from .numpy import ExpDataView __all__ = [ diff --git a/python/sdist/amici/petab/conditions.py b/python/sdist/amici/petab/conditions.py index dc8d00a0d8..38e7603d13 100644 --- a/python/sdist/amici/petab/conditions.py +++ b/python/sdist/amici/petab/conditions.py @@ -5,11 +5,9 @@ import warnings from collections.abc import Sequence -import amici import numpy as np import pandas as pd import petab.v1 as petab -from amici import AmiciModel from petab.v1.C import ( MEASUREMENT, NOISE_PARAMETERS, @@ -19,6 +17,9 @@ TIME, ) +import amici +from amici import AmiciModel + from .parameter_mapping import ( ParameterMapping, ParameterMappingForCondition, diff --git a/python/sdist/amici/petab/import_helpers.py b/python/sdist/amici/petab/import_helpers.py index fa2e37e995..5e2f770f21 100644 --- a/python/sdist/amici/petab/import_helpers.py +++ b/python/sdist/amici/petab/import_helpers.py @@ -8,7 +8,6 @@ import re from pathlib import Path -import amici import pandas as pd import petab.v1 as petab import sympy as sp @@ -23,6 +22,8 @@ ) from petab.v1.parameters import get_valid_parameters_for_parameter_table from sympy.abc import _clash + +import amici from amici.import_utils import MeasurementChannel logger = logging.getLogger(__name__) diff --git a/python/sdist/amici/petab/parameter_mapping.py b/python/sdist/amici/petab/parameter_mapping.py index ca5ced6a60..6eae4da380 100644 --- a/python/sdist/amici/petab/parameter_mapping.py +++ b/python/sdist/amici/petab/parameter_mapping.py @@ -19,29 +19,29 @@ import logging import numbers import re -from collections.abc import Sequence +from collections.abc import Collection, Iterator, Sequence from itertools import chain from typing import Any -from collections.abc import Collection, Iterator -import amici import numpy as np import pandas as pd import petab.v1 as petab import sympy as sp -from amici.sbml_import import get_species_initial from petab.v1.C import * # noqa: F403 from petab.v1.C import ( + ESTIMATE, LIN, + NOMINAL_VALUE, PARAMETER_SCALE, PREEQUILIBRATION_CONDITION_ID, SIMULATION_CONDITION_ID, - NOMINAL_VALUE, - ESTIMATE, ) from petab.v1.models import MODEL_TYPE_PYSB, MODEL_TYPE_SBML from sympy.abc import _clash +import amici +from amici.sbml_import import get_species_initial + from .. import AmiciModel from . import PREEQ_INDICATOR_ID from .util import get_states_in_condition_table diff --git a/python/sdist/amici/petab/petab_import.py b/python/sdist/amici/petab/petab_import.py index b1564f7891..88e0044740 100644 --- a/python/sdist/amici/petab/petab_import.py +++ b/python/sdist/amici/petab/petab_import.py @@ -10,16 +10,17 @@ import shutil from pathlib import Path -import amici import petab.v1 as petab from petab.v1.models import MODEL_TYPE_PYSB, MODEL_TYPE_SBML +import amici + from ..logging import get_logger from .import_helpers import ( _can_import_model, _create_model_name, - check_model, _get_package_name_and_path, + check_model, ) from .sbml_import import import_model_sbml diff --git a/python/sdist/amici/petab/petab_problem.py b/python/sdist/amici/petab/petab_problem.py index b93eb06a87..e52a6b4c15 100644 --- a/python/sdist/amici/petab/petab_problem.py +++ b/python/sdist/amici/petab/petab_problem.py @@ -2,11 +2,12 @@ import copy -import amici import pandas as pd import petab.v1 as petab 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 diff --git a/python/sdist/amici/petab/pysb_import.py b/python/sdist/amici/petab/pysb_import.py index a46aae0fdd..6ae3fcb15c 100644 --- a/python/sdist/amici/petab/pysb_import.py +++ b/python/sdist/amici/petab/pysb_import.py @@ -13,7 +13,6 @@ import pysb import pysb.bng import sympy as sp -from amici import MeasurementChannel from petab.v1.C import ( CONDITION_NAME, NOISE_FORMULA, @@ -21,6 +20,8 @@ ) from petab.v1.models.pysb_model import PySBModel +from amici import MeasurementChannel + from ..import_utils import strip_pysb from ..logging import get_logger, log_execution_time, set_log_level from . import PREEQ_INDICATOR_ID diff --git a/python/sdist/amici/petab/sbml_import.py b/python/sdist/amici/petab/sbml_import.py index 477f5d0d4a..1ca879d280 100644 --- a/python/sdist/amici/petab/sbml_import.py +++ b/python/sdist/amici/petab/sbml_import.py @@ -1,22 +1,21 @@ import logging -import re - import math import os +import re import tempfile +from _collections import OrderedDict from itertools import chain from pathlib import Path -import amici import libsbml import petab.v1 as petab import sympy as sp -from _collections import OrderedDict +from petab.v1.models import MODEL_TYPE_SBML +from sympy.abc import _clash +import amici from amici import MeasurementChannel from amici.logging import log_execution_time, set_log_level -from petab.v1.models import MODEL_TYPE_SBML -from sympy.abc import _clash from . import PREEQ_INDICATOR_ID from .import_helpers import ( diff --git a/python/sdist/amici/petab/simulations.py b/python/sdist/amici/petab/simulations.py index 5b8906dced..f6e953309b 100644 --- a/python/sdist/amici/petab/simulations.py +++ b/python/sdist/amici/petab/simulations.py @@ -6,18 +6,18 @@ import copy import logging -from typing import Any from collections.abc import Sequence +from typing import Any -import amici import numpy as np import pandas as pd import petab.v1 as petab from petab.v1.C import * # noqa: F403 +import amici + from .. import AmiciExpData, AmiciModel from ..logging import get_logger, log_execution_time - from .conditions import ( create_edatas, fill_in_parameters, diff --git a/python/sdist/amici/petab/simulator.py b/python/sdist/amici/petab/simulator.py index 6d9432b4a7..e64cb30734 100644 --- a/python/sdist/amici/petab/simulator.py +++ b/python/sdist/amici/petab/simulator.py @@ -15,6 +15,7 @@ import pandas as pd import petab.v1 as petab + from amici import AmiciModel, SensitivityMethod from .petab_import import import_petab_problem diff --git a/python/sdist/amici/plotting.py b/python/sdist/amici/plotting.py index cef3752157..f3388c346d 100644 --- a/python/sdist/amici/plotting.py +++ b/python/sdist/amici/plotting.py @@ -13,6 +13,7 @@ from matplotlib.axes import Axes import amici + from . import Model, ReturnDataView from .numpy import StrOrExpr, evaluate diff --git a/python/sdist/amici/pysb_import.py b/python/sdist/amici/pysb_import.py index 3bc2156981..dfc176ea4a 100644 --- a/python/sdist/amici/pysb_import.py +++ b/python/sdist/amici/pysb_import.py @@ -10,12 +10,11 @@ import os import re import sys +from collections.abc import Callable, Iterable from pathlib import Path from typing import ( Any, ) -from collections.abc import Callable -from collections.abc import Iterable import numpy as np import pysb @@ -36,13 +35,13 @@ from .de_model import DEModel from .de_model_components import NoiseParameter, ObservableParameter from .import_utils import ( + MeasurementChannel, + _default_simplify, _get_str_symbol_identifiers, _parse_special_functions, generate_measurement_symbol, noise_distribution_to_cost_function, noise_distribution_to_observable_transformation, - _default_simplify, - MeasurementChannel, ) from .logging import get_logger, log_execution_time, set_log_level diff --git a/python/sdist/amici/sbml_import.py b/python/sdist/amici/sbml_import.py index efce53a601..ab47366f0f 100644 --- a/python/sdist/amici/sbml_import.py +++ b/python/sdist/amici/sbml_import.py @@ -13,33 +13,39 @@ import re import warnings import xml.etree.ElementTree as ET +from collections.abc import Callable, Iterable, Sequence from pathlib import Path from typing import ( Any, ) -from collections.abc import Callable -from collections.abc import Iterable, Sequence import libsbml -from sbmlmath import SBMLMathMLParser, TimeSymbol, avogadro import numpy as np import sympy as sp -from sympy.logic.boolalg import BooleanFalse, BooleanTrue, Boolean +from sbmlmath import SBMLMathMLParser, TimeSymbol, avogadro +from sympy.logic.boolalg import Boolean, BooleanFalse, BooleanTrue +from sympy.matrices.dense import MutableDenseMatrix from . import has_clibs -from .de_model import DEModel from .constants import SymbolId from .de_export import ( DEExporter, ) -from .de_model_components import symbol_to_type, Expression -from .sympy_utils import smart_is_zero_matrix, smart_multiply +from .de_model import DEModel +from .de_model_components import Expression, symbol_to_type from .import_utils import ( RESERVED_SYMBOLS, + MeasurementChannel, _check_unsupported_functions, + _default_simplify, + _eq_to_and, _get_str_symbol_identifiers, + _ne_to_or, + _parse_piecewise_to_heaviside, + _xor_to_or, amici_time_symbol, annotation_namespace, + generate_flux_symbol, generate_measurement_symbol, generate_regularization_symbol, noise_distribution_to_cost_function, @@ -49,18 +55,11 @@ smart_subs_dict, symbol_with_assumptions, toposort_symbols, - _default_simplify, - generate_flux_symbol, - _parse_piecewise_to_heaviside, - _xor_to_or, - _eq_to_and, - _ne_to_or, - MeasurementChannel, ) from .logging import get_logger, log_execution_time, set_log_level from .sbml_utils import SBMLException from .splines import AbstractSpline -from sympy.matrices.dense import MutableDenseMatrix +from .sympy_utils import smart_is_zero_matrix, smart_multiply SymbolicFormula = dict[sp.Symbol, sp.Expr] diff --git a/python/sdist/amici/sbml_utils.py b/python/sdist/amici/sbml_utils.py index 068c9ffb6b..a49008a040 100644 --- a/python/sdist/amici/sbml_utils.py +++ b/python/sdist/amici/sbml_utils.py @@ -19,7 +19,6 @@ import libsbml from sympy.core.parameters import evaluate - from sympy.printing.mathml import MathMLContentPrinter from .import_utils import ( diff --git a/python/sdist/amici/setup.template.py b/python/sdist/amici/setup.template.py index 14d324d608..ac03fc9866 100644 --- a/python/sdist/amici/setup.template.py +++ b/python/sdist/amici/setup.template.py @@ -1,14 +1,15 @@ """AMICI model package setup""" +import importlib.metadata import os import sys from pathlib import Path -from amici import _get_amici_path -from amici.custom_commands import AmiciBuildCMakeExtension from cmake_build_extension import CMakeExtension from setuptools import find_namespace_packages, setup -import importlib.metadata + +from amici import _get_amici_path +from amici.custom_commands import AmiciBuildCMakeExtension def get_extension() -> CMakeExtension: diff --git a/python/sdist/amici/splines.py b/python/sdist/amici/splines.py index d973b101d7..0e5cdea809 100644 --- a/python/sdist/amici/splines.py +++ b/python/sdist/amici/splines.py @@ -11,12 +11,11 @@ from typing import TYPE_CHECKING if TYPE_CHECKING: + from collections.abc import Callable, Sequence from numbers import Real from typing import ( Any, ) - from collections.abc import Callable - from collections.abc import Sequence from . import sbml_import @@ -29,13 +28,14 @@ import xml.etree.ElementTree as ET from abc import ABC, abstractmethod from itertools import count -from numbers import Integral -from numbers import Real +from numbers import Integral, Real + import libsbml import numpy as np import sympy as sp from sympy.core.parameters import evaluate +from .constants import SymbolId from .import_utils import ( amici_time_symbol, annotation_namespace, @@ -52,7 +52,6 @@ pretty_xml, sbml_mathml, ) -from .constants import SymbolId logger = get_logger(__name__, logging.WARNING) diff --git a/python/sdist/amici/swig.py b/python/sdist/amici/swig.py index 703d4eeffc..90fde75265 100644 --- a/python/sdist/amici/swig.py +++ b/python/sdist/amici/swig.py @@ -1,6 +1,7 @@ """Functions related to SWIG or SWIG-generated code""" from __future__ import annotations + import ast import contextlib import re diff --git a/python/sdist/amici/swig_wrappers.py b/python/sdist/amici/swig_wrappers.py index e388285f0d..9c1df065d5 100644 --- a/python/sdist/amici/swig_wrappers.py +++ b/python/sdist/amici/swig_wrappers.py @@ -1,16 +1,16 @@ """Convenience wrappers for the swig interface""" from __future__ import annotations + +import contextlib import logging import warnings -from typing import Any from collections.abc import Sequence -import contextlib +from typing import Any import amici import amici.amici as amici_swig from amici.amici import ( - _get_ptr, AmiciExpData, AmiciExpDataVector, AmiciModel, @@ -18,8 +18,10 @@ SensitivityMethod, SensitivityOrder, Solver, + _get_ptr, ) -from . import numpy, ReturnDataView + +from . import ReturnDataView, numpy from .logging import get_logger logger = get_logger(__name__, log_level=logging.DEBUG) diff --git a/python/sdist/amici/sympy_utils.py b/python/sdist/amici/sympy_utils.py index 9794fadef0..0f241090ff 100644 --- a/python/sdist/amici/sympy_utils.py +++ b/python/sdist/amici/sympy_utils.py @@ -1,14 +1,15 @@ """Functionality for working with sympy objects.""" +import contextlib +import logging import os +from collections.abc import Callable from itertools import starmap from typing import Any -from collections.abc import Callable -import contextlib + import sympy as sp -import logging -from .logging import log_execution_time, get_logger +from .logging import get_logger, log_execution_time logger = get_logger(__name__, logging.ERROR) diff --git a/python/sdist/amici/testing/fixtures.py b/python/sdist/amici/testing/fixtures.py index 5548b827e1..53de59270a 100644 --- a/python/sdist/amici/testing/fixtures.py +++ b/python/sdist/amici/testing/fixtures.py @@ -5,6 +5,7 @@ """ import pytest + from .testing import TemporaryDirectoryWinSafe diff --git a/python/sdist/amici/testing/models.py b/python/sdist/amici/testing/models.py index 130e223c92..b418ce0a7a 100644 --- a/python/sdist/amici/testing/models.py +++ b/python/sdist/amici/testing/models.py @@ -1,16 +1,19 @@ """Test models used by AMICI.""" -from .. import import_model_module, Model -from ..antimony_import import antimony2amici, antimony2sbml -from pathlib import Path -import libsbml -from amici import SbmlImporter, AmiciModel, MeasurementChannel import sys import tempfile -from amici.sbml_utils import amici_time_symbol +from pathlib import Path + +import libsbml import sympy as sp + +from amici import AmiciModel, MeasurementChannel, SbmlImporter +from amici.sbml_utils import amici_time_symbol from amici.splines import CubicHermiteSpline +from .. import Model, import_model_module +from ..antimony_import import antimony2amici, antimony2sbml + model_dirac_ant = r""" p1 = 1; p2 = 0.5; diff --git a/python/sdist/pyproject.toml b/python/sdist/pyproject.toml index 1063708020..736bf0ca51 100644 --- a/python/sdist/pyproject.toml +++ b/python/sdist/pyproject.toml @@ -135,5 +135,5 @@ line-length = 79 extend-include = ["*.ipynb"] [tool.ruff.lint] -extend-select = ["B028", "UP"] +extend-select = ["B028", "UP", "I"] ignore = ["E402", "F403", "F405", "E741"] diff --git a/python/sdist/setup.py b/python/sdist/setup.py index 1eafe9094c..bd32908ca1 100755 --- a/python/sdist/setup.py +++ b/python/sdist/setup.py @@ -11,12 +11,12 @@ """ import os +import shutil import sys from pathlib import Path from cmake_build_extension import CMakeExtension from setuptools import setup -import shutil # Add containing directory to path, as we need some modules from the AMICI # package already for installation diff --git a/python/tests/conftest.py b/python/tests/conftest.py index 59fcadaa9b..07654edc9c 100644 --- a/python/tests/conftest.py +++ b/python/tests/conftest.py @@ -3,15 +3,13 @@ import copy import importlib import sys +from pathlib import Path import amici import pytest -from pathlib import Path - from amici import MeasurementChannel from amici.testing import TemporaryDirectoryWinSafe as TemporaryDirectory - pytest_plugins = ["amici.testing.fixtures"] EXAMPLES_DIR = Path(__file__).parents[2] / "doc" / "examples" diff --git a/python/tests/petab_/test_petab_problem.py b/python/tests/petab_/test_petab_problem.py index f17ca6d58b..35c1fa7d34 100644 --- a/python/tests/petab_/test_petab_problem.py +++ b/python/tests/petab_/test_petab_problem.py @@ -1,7 +1,7 @@ +from amici.petab.petab_import import import_petab_problem from amici.petab.petab_problem import PetabProblem -from benchmark_models_petab import get_problem from amici.testing import skip_on_valgrind -from amici.petab.petab_import import import_petab_problem +from benchmark_models_petab import get_problem @skip_on_valgrind diff --git a/python/tests/splines_utils.py b/python/tests/splines_utils.py index 535d0952c1..6b5cf19f54 100644 --- a/python/tests/splines_utils.py +++ b/python/tests/splines_utils.py @@ -8,9 +8,9 @@ import os import platform import uuid +from collections.abc import Sequence from tempfile import mkdtemp from typing import Any -from collections.abc import Sequence import amici import numpy as np diff --git a/python/tests/test_bngl.py b/python/tests/test_bngl.py index 5baf20d055..c1eec8feea 100644 --- a/python/tests/test_bngl.py +++ b/python/tests/test_bngl.py @@ -5,11 +5,12 @@ pysb = pytest.importorskip("pysb") +from contextlib import suppress + from amici.bngl_import import bngl2amici from amici.testing import TemporaryDirectoryWinSafe, skip_on_valgrind from pysb.importers.bngl import model_from_bngl from pysb.simulator import ScipyOdeSimulator -from contextlib import suppress tests = [ "CaOscillate_Func", diff --git a/python/tests/test_compare_conservation_laws_sbml.py b/python/tests/test_compare_conservation_laws_sbml.py index 2a6994533c..7c5a128970 100644 --- a/python/tests/test_compare_conservation_laws_sbml.py +++ b/python/tests/test_compare_conservation_laws_sbml.py @@ -4,9 +4,10 @@ import amici import numpy as np import pytest -from amici import SteadyStateStatus, ExpData, MeasurementChannel as MC -from numpy.testing import assert_allclose +from amici import ExpData, SteadyStateStatus +from amici import MeasurementChannel as MC from amici.testing import skip_on_valgrind +from numpy.testing import assert_allclose @pytest.fixture diff --git a/python/tests/test_conserved_quantities_demartino.py b/python/tests/test_conserved_quantities_demartino.py index f197cf0257..64fc7861e4 100644 --- a/python/tests/test_conserved_quantities_demartino.py +++ b/python/tests/test_conserved_quantities_demartino.py @@ -6,11 +6,12 @@ import numpy as np import pytest import sympy as sp -from amici.conserved_quantities_demartino import _fill, _kernel -from amici.conserved_quantities_demartino import _output as output from amici.conserved_quantities_demartino import ( + _fill, + _kernel, compute_moiety_conservation_laws, ) +from amici.conserved_quantities_demartino import _output as output from amici.logging import get_logger, log_execution_time from amici.testing import skip_on_valgrind @@ -156,6 +157,7 @@ def data_demartino2014(): """Get tests from DeMartino2014 Suppl. Material""" import gzip + import pooch # stoichiometric matrix diff --git a/python/tests/test_cxxcodeprinter.py b/python/tests/test_cxxcodeprinter.py index e01fb74c1a..8164bbb664 100644 --- a/python/tests/test_cxxcodeprinter.py +++ b/python/tests/test_cxxcodeprinter.py @@ -1,8 +1,8 @@ +import pytest import sympy as sp from amici.cxxcodeprinter import AmiciCxxCodePrinter -from sympy.codegen.rewriting import optims_c99 from amici.testing import skip_on_valgrind -import pytest +from sympy.codegen.rewriting import optims_c99 @skip_on_valgrind @@ -20,7 +20,7 @@ def test_optimizations(): @skip_on_valgrind def test_print_infinity(): """Check that AmiciCxxCodePrinter prints infinity correctly.""" - from sympy.core.numbers import NegativeInfinity, Infinity, ComplexInfinity + from sympy.core.numbers import ComplexInfinity, Infinity, NegativeInfinity cp = AmiciCxxCodePrinter() assert cp.doprint(Infinity()) == "std::numeric_limits::infinity()" diff --git a/python/tests/test_events.py b/python/tests/test_events.py index f4ae430da2..dff8e9ae81 100644 --- a/python/tests/test_events.py +++ b/python/tests/test_events.py @@ -6,21 +6,23 @@ import numpy as np import pytest from amici import ( - import_model_module, + MeasurementChannel as MC, +) +from amici import ( SensitivityMethod, SensitivityOrder, - MeasurementChannel as MC, + import_model_module, ) from amici.antimony_import import antimony2amici from amici.gradient_check import check_derivatives from amici.testing import skip_on_valgrind +from amici.testing.models import create_amici_model, create_sbml_model +from numpy.testing import assert_allclose from util import ( check_trajectories_with_adjoint_sensitivities, check_trajectories_with_forward_sensitivities, check_trajectories_without_sensitivities, ) -from amici.testing.models import create_sbml_model, create_amici_model -from numpy.testing import assert_allclose pytestmark = pytest.mark.filterwarnings( # https://github.com/AMICI-dev/AMICI/issues/18 diff --git a/python/tests/test_heavisides.py b/python/tests/test_heavisides.py index 12a2ed2c3f..a6e3b1953d 100644 --- a/python/tests/test_heavisides.py +++ b/python/tests/test_heavisides.py @@ -2,12 +2,12 @@ import numpy as np import pytest +from amici.testing.models import create_amici_model, create_sbml_model from util import ( check_trajectories_with_adjoint_sensitivities, check_trajectories_with_forward_sensitivities, check_trajectories_without_sensitivities, ) -from amici.testing.models import create_sbml_model, create_amici_model pytestmark = pytest.mark.filterwarnings( # https://github.com/AMICI-dev/AMICI/issues/18 diff --git a/python/tests/test_jax.py b/python/tests/test_jax.py index d2c1eb1cb6..055d0c9a61 100644 --- a/python/tests/test_jax.py +++ b/python/tests/test_jax.py @@ -1,26 +1,25 @@ -import pytest -import amici from pathlib import Path +import amici +import pytest + pytest.importorskip("jax") import amici.jax - +import diffrax +import jax import jax.numpy as jnp import jax.random as jr -import jax -import diffrax -import optimistix import numpy as np -from beartype import beartype -from petab.v1.C import PREEQUILIBRATION_CONDITION_ID, SIMULATION_CONDITION_ID - +import optimistix +from amici import MeasurementChannel as MC +from amici.jax import JAXProblem, ReturnValue, run_simulations +from amici.petab.petab_import import import_petab_problem from amici.pysb_import import pysb2amici, pysb2jax from amici.testing import TemporaryDirectoryWinSafe, skip_on_valgrind -from amici.petab.petab_import import import_petab_problem -from amici.jax import JAXProblem, ReturnValue, run_simulations +from beartype import beartype from numpy.testing import assert_allclose +from petab.v1.C import PREEQUILIBRATION_CONDITION_ID, SIMULATION_CONDITION_ID from test_petab_objective import lotka_volterra # noqa: F401 -from amici import MeasurementChannel as MC pysb = pytest.importorskip("pysb") @@ -325,9 +324,9 @@ def test_time_dependent_discontinuity(tmp_path): """Models with time dependent discontinuities are handled.""" from amici.antimony_import import antimony2sbml - from amici.sbml_import import SbmlImporter - from amici.jax.petab import DEFAULT_CONTROLLER_SETTINGS from amici.jax._simulation import solve + from amici.jax.petab import DEFAULT_CONTROLLER_SETTINGS + from amici.sbml_import import SbmlImporter ant_model = """ model time_disc @@ -378,9 +377,9 @@ def test_time_dependent_discontinuity_equilibration(tmp_path): """Time dependent discontinuities are handled during equilibration.""" from amici.antimony_import import antimony2sbml - from amici.sbml_import import SbmlImporter - from amici.jax.petab import DEFAULT_CONTROLLER_SETTINGS from amici.jax._simulation import eq + from amici.jax.petab import DEFAULT_CONTROLLER_SETTINGS + from amici.sbml_import import SbmlImporter ant_model = """ model time_disc_eq diff --git a/python/tests/test_ode_export.py b/python/tests/test_ode_export.py index 9e6917718e..ce510741f8 100644 --- a/python/tests/test_ode_export.py +++ b/python/tests/test_ode_export.py @@ -2,8 +2,8 @@ import sympy as sp from amici.cxxcodeprinter import csc_matrix -from amici.testing import skip_on_valgrind from amici.import_utils import symbol_with_assumptions +from amici.testing import skip_on_valgrind @skip_on_valgrind diff --git a/python/tests/test_pandas.py b/python/tests/test_pandas.py index 114396fb18..a727dc0706 100644 --- a/python/tests/test_pandas.py +++ b/python/tests/test_pandas.py @@ -7,7 +7,6 @@ import pytest from amici.testing import skip_on_valgrind - # test parameters for test_pandas_import_export combos = itertools.product([(10, 5), (5, 10), ()], repeat=3) cases = [ diff --git a/python/tests/test_preequilibration.py b/python/tests/test_preequilibration.py index 38b82f4304..3c326a49c3 100644 --- a/python/tests/test_preequilibration.py +++ b/python/tests/test_preequilibration.py @@ -5,15 +5,17 @@ import amici import numpy as np import pytest +from amici import SensitivityMethod, SensitivityOrder, SteadyStateStatus from amici.debugging import get_model_for_preeq -from numpy.testing import assert_allclose, assert_equal -from test_pysb import get_data +from amici.gradient_check import check_derivatives from amici.testing import ( TemporaryDirectoryWinSafe as TemporaryDirectory, +) +from amici.testing import ( skip_on_valgrind, ) -from amici.gradient_check import check_derivatives -from amici import SensitivityMethod, SensitivityOrder, SteadyStateStatus +from numpy.testing import assert_allclose, assert_equal +from test_pysb import get_data pytestmark = pytest.mark.filterwarnings( # https://github.com/AMICI-dev/AMICI/issues/18 diff --git a/python/tests/test_pysb.py b/python/tests/test_pysb.py index e931862f4a..156a650ff9 100644 --- a/python/tests/test_pysb.py +++ b/python/tests/test_pysb.py @@ -9,6 +9,8 @@ pysb = pytest.importorskip("pysb") +from pathlib import Path + import amici import numpy as np import pysb.examples # noqa: F811 @@ -20,7 +22,6 @@ from amici.testing import TemporaryDirectoryWinSafe, skip_on_valgrind from numpy.testing import assert_allclose from pysb.simulator import ScipyOdeSimulator -from pathlib import Path @skip_on_valgrind diff --git a/python/tests/test_rdata.py b/python/tests/test_rdata.py index 8e552c793e..d57605d479 100644 --- a/python/tests/test_rdata.py +++ b/python/tests/test_rdata.py @@ -4,8 +4,8 @@ import numpy as np import pytest from amici.numpy import evaluate -from numpy.testing import assert_almost_equal, assert_array_equal from amici.testing import skip_on_valgrind +from numpy.testing import assert_almost_equal, assert_array_equal @pytest.fixture(scope="session") diff --git a/python/tests/test_sbml_import.py b/python/tests/test_sbml_import.py index fa52232d4f..983c9eacac 100644 --- a/python/tests/test_sbml_import.py +++ b/python/tests/test_sbml_import.py @@ -5,22 +5,25 @@ import sys from numbers import Number from pathlib import Path + import amici import libsbml import numpy as np import pytest +import sympy as sp +from amici import import_model_module from amici.gradient_check import check_derivatives -from amici.sbml_import import SbmlImporter, SymbolId from amici.import_utils import ( - symbol_with_assumptions, MeasurementChannel as MC, ) -from numpy.testing import assert_allclose, assert_array_equal -from amici import import_model_module -from amici.testing import skip_on_valgrind +from amici.import_utils import ( + symbol_with_assumptions, +) +from amici.sbml_import import SbmlImporter, SymbolId from amici.testing import TemporaryDirectoryWinSafe as TemporaryDirectory +from amici.testing import skip_on_valgrind from conftest import MODEL_STEADYSTATE_SCALED_XML -import sympy as sp +from numpy.testing import assert_allclose, assert_array_equal def simple_sbml_model(): @@ -874,8 +877,8 @@ def test_hardcode_parameters(): def test_constraints(tempdir): """Test non-negativity constraint handling.""" - from amici.antimony_import import antimony2amici from amici import Constraint + from amici.antimony_import import antimony2amici ant_model = """ model test_non_negative_species diff --git a/python/tests/test_sbml_import_special_functions.py b/python/tests/test_sbml_import_special_functions.py index 644fc72411..8e9ff1412f 100644 --- a/python/tests/test_sbml_import_special_functions.py +++ b/python/tests/test_sbml_import_special_functions.py @@ -7,16 +7,17 @@ import amici import numpy as np import pytest +from amici import MeasurementChannel as MC +from amici import SbmlImporter from amici.antimony_import import antimony2amici from amici.gradient_check import check_derivatives -from amici.testing import skip_on_valgrind, TemporaryDirectoryWinSafe -from amici import SbmlImporter, MeasurementChannel as MC +from amici.testing import TemporaryDirectoryWinSafe, skip_on_valgrind +from conftest import MODEL_STEADYSTATE_SCALED_XML from numpy.testing import ( + assert_allclose, assert_approx_equal, assert_array_almost_equal_nulp, - assert_allclose, ) -from conftest import MODEL_STEADYSTATE_SCALED_XML from scipy.special import loggamma diff --git a/python/tests/test_swig_interface.py b/python/tests/test_swig_interface.py index f09dfcd7b5..a622abb1ef 100644 --- a/python/tests/test_swig_interface.py +++ b/python/tests/test_swig_interface.py @@ -6,11 +6,11 @@ import copy import numbers from math import nan -import pytest -import xarray import amici import numpy as np +import pytest +import xarray def test_version_number(pysb_example_presimulation_module): diff --git a/python/tests/test_sympy_utils.py b/python/tests/test_sympy_utils.py index da89741352..3f21d0b928 100644 --- a/python/tests/test_sympy_utils.py +++ b/python/tests/test_sympy_utils.py @@ -1,7 +1,7 @@ """Tests related to the sympy_utils module.""" -from amici.sympy_utils import _custom_pow_eval_derivative, _monkeypatched import sympy as sp +from amici.sympy_utils import _custom_pow_eval_derivative, _monkeypatched from amici.testing import skip_on_valgrind diff --git a/python/tests/util.py b/python/tests/util.py index 30ca3f03fd..a98d47fac5 100644 --- a/python/tests/util.py +++ b/python/tests/util.py @@ -4,10 +4,9 @@ import tempfile from pathlib import Path +import amici import numpy as np import pandas as pd - -import amici from amici import ( AmiciModel, ExpData, diff --git a/tests/benchmark_models/conftest.py b/tests/benchmark_models/conftest.py index 2325c1e104..09ba3eec3b 100644 --- a/tests/benchmark_models/conftest.py +++ b/tests/benchmark_models/conftest.py @@ -1,13 +1,12 @@ import copy -from pathlib import Path import sys - -import pytest -import petab.v1 as petab -from petab.v1.lint import measurement_table_has_timepoint_specific_mappings +from pathlib import Path import benchmark_models_petab +import petab.v1 as petab +import pytest from amici.petab.petab_import import import_petab_problem +from petab.v1.lint import measurement_table_has_timepoint_specific_mappings script_dir = Path(__file__).parent.resolve() if str(script_dir) not in sys.path: diff --git a/tests/benchmark_models/evaluate_benchmark.py b/tests/benchmark_models/evaluate_benchmark.py index 7045bc0e8d..1894859f91 100644 --- a/tests/benchmark_models/evaluate_benchmark.py +++ b/tests/benchmark_models/evaluate_benchmark.py @@ -5,11 +5,11 @@ """ import os +from pathlib import Path import matplotlib.pyplot as plt import pandas as pd import seaborn as sns -from pathlib import Path # read benchmark results for different models diff --git a/tests/benchmark_models/test_petab_benchmark.py b/tests/benchmark_models/test_petab_benchmark.py index 0c490d2ee3..d9466ebd4d 100644 --- a/tests/benchmark_models/test_petab_benchmark.py +++ b/tests/benchmark_models/test_petab_benchmark.py @@ -5,23 +5,21 @@ for a subset of the benchmark problems. """ -from pathlib import Path - import contextlib import logging import os from collections import defaultdict from dataclasses import dataclass, field +from pathlib import Path +import amici +import benchmark_models_petab +import fiddy import numpy as np import pandas as pd import petab.v1 as petab import pytest import yaml -from petab.v1.lint import measurement_table_has_timepoint_specific_mappings -from petab.v1.visualize import plot_problem - -import amici from amici import SensitivityMethod from amici.logging import get_logger from amici.petab.petab_import import import_petab_problem @@ -31,13 +29,12 @@ rdatas_to_measurement_df, simulate_petab, ) -import benchmark_models_petab -import fiddy from fiddy import MethodId, get_derivative from fiddy.derivative_check import NumpyIsCloseDerivativeCheck from fiddy.extensions.amici import simulate_petab_to_cached_functions from fiddy.success import Consistency - +from petab.v1.lint import measurement_table_has_timepoint_specific_mappings +from petab.v1.visualize import plot_problem # Enable various debug output debug = False diff --git a/tests/benchmark_models/test_petab_benchmark_jax.py b/tests/benchmark_models/test_petab_benchmark_jax.py index 42ea56a0c4..831c9849a1 100644 --- a/tests/benchmark_models/test_petab_benchmark_jax.py +++ b/tests/benchmark_models/test_petab_benchmark_jax.py @@ -1,17 +1,16 @@ import logging from functools import partial -import numpy as np -import pytest +import amici +import equinox as eqx import jax import jax.numpy as jnp -import equinox as eqx -from beartype import beartype - -import amici -from amici.jax.petab import run_simulations, JAXProblem +import numpy as np +import pytest +from amici.jax.petab import JAXProblem, run_simulations from amici.petab.petab_import import import_petab_problem -from amici.petab.simulations import simulate_petab, LLH, SLLH +from amici.petab.simulations import LLH, SLLH, simulate_petab +from beartype import beartype from test_petab_benchmark import ( benchmark_outdir, problems_for_gradient_check, diff --git a/tests/cpp/generate_expected_results.py b/tests/cpp/generate_expected_results.py index da9cde971e..a155a455c5 100755 --- a/tests/cpp/generate_expected_results.py +++ b/tests/cpp/generate_expected_results.py @@ -1,27 +1,28 @@ #!/usr/bin/env python3 """Generate HDF5 file with expected results for the C++ tests.""" +import subprocess +from pathlib import Path + +import amici +import h5py +from amici import ( + readModelDataFromHDF5, + readSimulationExpData, + readSolverSettingsFromHDF5, + runAmiciSimulation, + writeReturnData, +) from amici.testing.models import ( + import_model_calvetti, import_model_dirac, import_model_events, - import_model_neuron, - import_model_calvetti, import_model_jakstat, import_model_nested_events, - import_model_steadystate, + import_model_neuron, import_model_robertson, + import_model_steadystate, ) -from pathlib import Path -from amici import ( - writeReturnData, - readModelDataFromHDF5, - readSolverSettingsFromHDF5, - readSimulationExpData, -) -import subprocess -import h5py -from amici import runAmiciSimulation -import amici repo_root = Path(__file__).parents[2] outfile = Path(__file__).parent / "expected_results_py.h5" diff --git a/tests/generateTestConfig/example_steadystate.py b/tests/generateTestConfig/example_steadystate.py index c294872923..70d1c9b476 100755 --- a/tests/generateTestConfig/example_steadystate.py +++ b/tests/generateTestConfig/example_steadystate.py @@ -2,11 +2,10 @@ import sys import numpy as np - from amici import ( SensitivityOrder, - SteadyStateSensitivityMode, SteadyStateComputationMode, + SteadyStateSensitivityMode, ) from example import AmiciExample diff --git a/tests/petab_test_suite/test_petab_suite.py b/tests/petab_test_suite/test_petab_suite.py index 1a761e0a26..0962f57215 100755 --- a/tests/petab_test_suite/test_petab_suite.py +++ b/tests/petab_test_suite/test_petab_suite.py @@ -4,9 +4,8 @@ import logging import sys -import diffrax - import amici +import diffrax import pandas as pd import petab.v1 as petab import petabtests @@ -68,7 +67,7 @@ def _test_case(case, model_type, version, jax): jax=jax, ) if jax: - from amici.jax import JAXProblem, run_simulations, petab_simulate + from amici.jax import JAXProblem, petab_simulate, run_simulations steady_state_event = diffrax.steady_state_event(rtol=1e-6, atol=1e-6) jax_problem = JAXProblem(model, problem) diff --git a/tests/sbml/conftest.py b/tests/sbml/conftest.py index 8fe6bbbbca..60e4b0c906 100644 --- a/tests/sbml/conftest.py +++ b/tests/sbml/conftest.py @@ -5,7 +5,6 @@ from pathlib import Path from typing import TYPE_CHECKING - import pytest if TYPE_CHECKING: diff --git a/tests/sbml/testSBMLSuite.py b/tests/sbml/testSBMLSuite.py index 5ee8e7199d..bce52440a4 100755 --- a/tests/sbml/testSBMLSuite.py +++ b/tests/sbml/testSBMLSuite.py @@ -11,30 +11,29 @@ """ from __future__ import annotations + import shutil from pathlib import Path -import optimistix - import amici -import pandas as pd -import pytest -from amici.gradient_check import check_derivatives +import diffrax import jax import jax.numpy as jnp import numpy as np -import diffrax +import optimistix +import pandas as pd +import pytest +from amici.gradient_check import check_derivatives from amici.jax.petab import ( DEFAULT_CONTROLLER_SETTINGS, DEFAULT_ROOT_FINDER_SETTINGS, ) - from utils import ( - verify_results, - write_result_file, + apply_settings, find_model_file, read_settings_file, - apply_settings, + verify_results, + write_result_file, ) diff --git a/tests/sbml/testSBMLSuiteJax.py b/tests/sbml/testSBMLSuiteJax.py index 77773c2da0..03ee853103 100644 --- a/tests/sbml/testSBMLSuiteJax.py +++ b/tests/sbml/testSBMLSuiteJax.py @@ -5,20 +5,19 @@ from pathlib import Path import amici +import diffrax import jax import jax.numpy as jnp -import diffrax -import optimistix import numpy as np +import optimistix import pandas as pd import pytest from amici.jax.petab import DEFAULT_CONTROLLER_SETTINGS - from utils import ( - verify_results, - write_result_file, find_model_file, read_settings_file, + verify_results, + write_result_file, ) jax.config.update("jax_enable_x64", True) diff --git a/tests/sbml/utils.py b/tests/sbml/utils.py index e4169da386..3998c4ea63 100644 --- a/tests/sbml/utils.py +++ b/tests/sbml/utils.py @@ -1,11 +1,11 @@ from __future__ import annotations + from pathlib import Path +import amici import libsbml as sbml import numpy as np import pandas as pd - -import amici from amici.constants import SymbolId from numpy.testing import assert_allclose