From 043d13a21ef241fa83688097e153233027789e0e Mon Sep 17 00:00:00 2001 From: Daniel Weindl <daniel.weindl@helmholtz-munich.de> Date: Sun, 16 Jun 2024 20:22:42 +0200 Subject: [PATCH 01/12] Update valgrind suppressions --- python/tests/valgrind-python.supp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/python/tests/valgrind-python.supp b/python/tests/valgrind-python.supp index ada85d34fa..16c92e3d1f 100644 --- a/python/tests/valgrind-python.supp +++ b/python/tests/valgrind-python.supp @@ -975,3 +975,13 @@ fun:_PyObject_GC_NewVar ... } + +{ + Python + Memcheck:Leak + match-leak-kinds: definite + fun:realloc + fun:_PyObject_GC_Resize + fun:_PyTuple_Resize + ... +} From 9e310132153d5ee5a8771b72828a480263b6e786 Mon Sep 17 00:00:00 2001 From: Daniel Weindl <dweindl@users.noreply.github.com> Date: Wed, 26 Jun 2024 11:47:33 +0200 Subject: [PATCH 02/12] Require sympy>=1.12.1 for numpy>=2.0 compatibility (#2462) So far, sympy was restricted to 1.11 via pysb, but sympy 1.11 is incompatible with numpy>=2.0 --- python/sdist/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/sdist/pyproject.toml b/python/sdist/pyproject.toml index f93d0c7e1b..e24bf6811a 100644 --- a/python/sdist/pyproject.toml +++ b/python/sdist/pyproject.toml @@ -16,7 +16,7 @@ description = "Advanced multi-language Interface to CVODES and IDAS" requires-python = ">=3.10" dependencies = [ "cmake-build-extension==0.6.0", - "sympy>=1.9", + "sympy>=1.12.1", "numpy>=1.19.3; python_version=='3.9'", "numpy>=1.21.4; python_version>='3.10'", "numpy>=1.23.2; python_version=='3.11'", From 474b473b33eab4c92b03aca59577e8333aedc2fb Mon Sep 17 00:00:00 2001 From: Daniel Weindl <dweindl@users.noreply.github.com> Date: Wed, 26 Jun 2024 11:48:19 +0200 Subject: [PATCH 03/12] Update AMICI papers (#2466) --- documentation/background.rst | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/documentation/background.rst b/documentation/background.rst index 2a2e748672..f47c077d46 100644 --- a/documentation/background.rst +++ b/documentation/background.rst @@ -32,14 +32,22 @@ publications: * Lakrisenko, Polina, Paul Stapor, Stephan Grein, Łukasz Paszkowski, Dilan Pathirana, Fabian Fröhlich, Glenn Terje Lines, Daniel Weindl, - and Jan Hasenauer. 2022. + and Jan Hasenauer. 2023. **Efficient Computation of Adjoint Sensitivities at Steady-State in ODE Models - of Biochemical Reaction Networks.** *bioRxiv* 2022.08.08.503176. - DOI: `10.1101/2022.08.08.503176 <https://doi.org/10.1101/2022.08.08.503176>`_. + of Biochemical Reaction Networks.** *PLoS Comput Biol* 19(1): e1010783. + DOI: `10.1371/journal.pcbi.1010783 <https://doi.org/10.1371/journal.pcbi.1010783>`_. + +* L. Contento, P. Stapor, D. Weindl, and J. Hasenauer. 2023. + **A more expressive spline representation for SBML models improves code generation performance in AMICI**, + In: Pang, J., Niehren, J. (eds) Computational Methods in Systems Biology. + CMSB 2023. *Lecture Notes in Computer Science*, vol 14137. Springer, Cham. + DOI: `10.1007/978-3-031-42697-1_3 <https://doi.org/10.1007/978-3-031-42697-1_3>`_. + Preprint available at `bioRxiv <https://doi.org/10.1101/2023.06.29.547120>`_. + +* Lakrisenko, Polina, Dilan Pathirana, Daniel Weindl, and Jan Hasenauer. 2024. + **Exploration of methods for computing sensitivities in ODE models at dynamic and steady states.** *arXiv:2405.16524 [q-bio.QM]*. + DOI: `10.48550/arXiv.2405.16524 <https://doi.org/10.48550/arXiv.2405.16524>`_. -* L. Contento, P. Stapor, D. Weindl, and J. Hasenauer, "A more expressive spline - representation for SBML models improves code generation performance in AMICI," - bioRxiv, 2023, DOI: `10.1101/2023.06.29.547120 <https://doi.org/10.1101/2023.06.29.547120>`_. .. note:: From f54abe6534b6552acab647c63b09a5226c86cda1 Mon Sep 17 00:00:00 2001 From: Daniel Weindl <dweindl@users.noreply.github.com> Date: Wed, 26 Jun 2024 14:45:57 +0200 Subject: [PATCH 04/12] Add deprecation policy (#2465) Add deprecation policy As suggested in https://github.com/AMICI-dev/AMICI/issues/2458. --- CHANGELOG.md | 2 ++ documentation/index.rst | 1 + documentation/versioning_policy.rst | 28 ++++++++++++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 documentation/versioning_policy.rst diff --git a/CHANGELOG.md b/CHANGELOG.md index b466d2d491..fcdc7a222a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog +See also our [versioning policy](https://amici.readthedocs.io/en/latest/versioning_policy.html). + ## v0.X Series ### v0.25.2 (2024-06-16) diff --git a/documentation/index.rst b/documentation/index.rst index 73343e76c1..63fc3261ab 100644 --- a/documentation/index.rst +++ b/documentation/index.rst @@ -27,6 +27,7 @@ Welcome to AMICI's documentation! references background changelog + versioning_policy glossary contributing diff --git a/documentation/versioning_policy.rst b/documentation/versioning_policy.rst new file mode 100644 index 0000000000..bed419f02a --- /dev/null +++ b/documentation/versioning_policy.rst @@ -0,0 +1,28 @@ +.. _versioning_policy: + +Versioning policy +================= + +Versioning +---------- + +We use `Semantic Versioning <http://semver.org/>`_ with the modifications +described under :ref:`deprecation_policy`. + +.. _deprecation_policy: + +Deprecation policy +------------------ + +AMICI aims to provide a stable API for users. However, not all features can be +maintained indefinitely. We will deprecate features in minor releases and +where possible, issue a warning when they are used. We will keep deprecated +features for at least six months after the release that includes the +respective deprecation warning and then remove them earliest in the next minor +or major release. If a deprecated feature is the source of a major bug, we may +remove it earlier. + +Python compatibility +-------------------- + +We follow `numpy's Python support policy <https://numpy.org/neps/nep-0029-deprecation_policy.html>`_. From 538fd59d2b230951720ab8f23994dc3259f17dfc Mon Sep 17 00:00:00 2001 From: Daniel Weindl <dweindl@users.noreply.github.com> Date: Wed, 26 Jun 2024 15:07:19 +0200 Subject: [PATCH 05/12] Deprecate passing individual tables to `amici_import_petab` (#2464) Deprecated passing individual tables to `amici_import_petab` and replace deprecated `petab.Problem.from_files` in `amici.petab.cli.import_petab._main`. Fixes #2460 --- python/sdist/amici/petab/cli/import_petab.py | 69 +++++++++++++++---- .../test_benchmark_collection.sh | 19 ++++- 2 files changed, 72 insertions(+), 16 deletions(-) diff --git a/python/sdist/amici/petab/cli/import_petab.py b/python/sdist/amici/petab/cli/import_petab.py index 9f29d26e71..39fa9b9bfe 100644 --- a/python/sdist/amici/petab/cli/import_petab.py +++ b/python/sdist/amici/petab/cli/import_petab.py @@ -3,6 +3,7 @@ import petab from ..petab_import import import_model_sbml +from petab.models.sbml_model import SbmlModel def _parse_cli_args(): @@ -59,28 +60,33 @@ def _parse_cli_args(): ) # Call with set of files - parser.add_argument( + group = parser.add_argument_group( + "Providing individual PEtab tables *DEPRECATED*. " + "Pass a PEtab yaml file instead." + ) + + group.add_argument( "-s", "--sbml", dest="sbml_file_name", help="SBML model filename" ) - parser.add_argument( + group.add_argument( "-m", "--measurements", dest="measurement_file_name", help="Measurement table", ) - parser.add_argument( + group.add_argument( "-c", "--conditions", dest="condition_file_name", help="Conditions table", ) - parser.add_argument( + group.add_argument( "-p", "--parameters", dest="parameter_file_name", help="Parameter table", ) - parser.add_argument( + group.add_argument( "-b", "--observables", dest="observable_file_name", @@ -90,8 +96,15 @@ def _parse_cli_args(): parser.add_argument( "-y", "--yaml", + dest="yaml_file_name_deprecated", + help="PEtab YAML problem filename. *DEPRECATED* Pass the YAML file " + "as positional argument instead.", + ) + + parser.add_argument( dest="yaml_file_name", - help="PEtab YAML problem filename", + help="PEtab YAML problem filename.", + nargs="?", ) parser.add_argument( @@ -102,18 +115,42 @@ def _parse_cli_args(): ) args = parser.parse_args() - - if not args.yaml_file_name and not all( + if any( + [ + args.sbml_file_name, + args.condition_file_name, + args.observable_file_name, + args.measurement_file_name, + args.parameter_file_name, + ] + ): + print( + "WARNING: Passing individual tables to amico_import_petab is " + "deprecated, please pass a PEtab YAML file instead." + ) + if ( + not args.yaml_file_name and not args.yaml_file_name_deprecated + ) and not all( ( args.sbml_file_name, args.condition_file_name, args.observable_file_name, + args.measurement_file_name, + args.parameter_file_name, ) ): parser.error( "When not specifying a model name or YAML file, then " - "SBML, condition and observable file must be specified" + "SBML, condition, observable, measurement and parameter file must " + "be specified." + ) + + if args.yaml_file_name_deprecated: + print( + "WARNING: -y/--yaml is deprecated. Pass the YAML file as " + "positional argument instead." ) + args.yaml_file_name = args.yaml_file_name_deprecated return args @@ -128,12 +165,14 @@ def _main(): if args.yaml_file_name: pp = petab.Problem.from_yaml(args.yaml_file_name) else: - pp = petab.Problem.from_files( - sbml_file=args.sbml_file_name, - condition_file=args.condition_file_name, - measurement_file=args.measurement_file_name, - parameter_file=args.parameter_file_name, - observable_files=args.observable_file_name, + pp = petab.Problem( + model=SbmlModel.from_file(args.sbml_file_name), + condition_df=petab.get_condition_df(args.condition_file_name), + measurement_df=petab.get_measurement_df( + args.measurement_file_name + ), + parameter_df=petab.get_parameter_df(args.parameter_file_name), + observable_df=petab.get_observable_df(args.observable_file_name), ) # Check for valid PEtab before potentially modifying it diff --git a/tests/benchmark-models/test_benchmark_collection.sh b/tests/benchmark-models/test_benchmark_collection.sh index 6b9284f4e6..f8ccd0c1cd 100755 --- a/tests/benchmark-models/test_benchmark_collection.sh +++ b/tests/benchmark-models/test_benchmark_collection.sh @@ -89,7 +89,7 @@ for model in $models; do yaml="${model_dir}"/"${model}"/"${model}".yaml amici_model_dir=test_bmc/"${model}" mkdir -p "$amici_model_dir" - cmd_import="amici_import_petab -y ${yaml} -o ${amici_model_dir} -n ${model} --flatten" + cmd_import="amici_import_petab ${yaml} -o ${amici_model_dir} -n ${model} --flatten" cmd_run="$script_path/test_petab_model.py -y ${yaml} -d ${amici_model_dir} -m ${model} -c" printf '=%.0s' {1..40} @@ -111,3 +111,20 @@ for model in $models; do done cd "$script_path" && python evaluate_benchmark.py + +# Test deprecated import from individual PEtab files +model="Zheng_PNAS2012" +problem_dir="${model_dir}/${model}" +amici_model_dir=test_bmc/"${model}-deprecated" +cmd_import="amici_import_petab -s "${problem_dir}/model_${model}.xml" \ + -m "${problem_dir}/measurementData_${model}.tsv" \ + -c "${problem_dir}/experimentalCondition_${model}.tsv" \ + -p "${problem_dir}/parameters_${model}.tsv" \ + -b "${problem_dir}/observables_${model}.tsv" \ + -o ${amici_model_dir} -n ${model} --no-compile" + +if [[ -z "$dry_run" ]]; then + $cmd_import +else + echo "$cmd_import" +fi From 3cfb8e724f15be955e7028ac4db856173c4631bd Mon Sep 17 00:00:00 2001 From: Daniel Weindl <daniel.weindl@helmholtz-munich.de> Date: Wed, 26 Jun 2024 15:18:48 +0200 Subject: [PATCH 06/12] GHA: sympy>=1.12.1 --- .github/workflows/test_python_ver_matrix.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test_python_ver_matrix.yml b/.github/workflows/test_python_ver_matrix.yml index 01d455b18a..da2669b866 100644 --- a/.github/workflows/test_python_ver_matrix.yml +++ b/.github/workflows/test_python_ver_matrix.yml @@ -57,6 +57,9 @@ jobs: - run: source venv/bin/activate && pip3 install git+https://github.com/sympy/sympy.git@master if: matrix.python-version == '3.12' + - run: source venv/bin/activate && pip3 install "sympy>=1.12.1" + if: matrix.python-version != '3.12' + - name: Python tests run: | source venv/bin/activate \ From e1ab9fb1f54a02bad56326fafbe556eddae8797d Mon Sep 17 00:00:00 2001 From: Daniel Weindl <dweindl@users.noreply.github.com> Date: Wed, 26 Jun 2024 17:20:53 +0200 Subject: [PATCH 07/12] Doc: fix formatting (#2470) --- documentation/python_installation.rst | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/documentation/python_installation.rst b/documentation/python_installation.rst index eb7d499227..3c893bcd61 100644 --- a/documentation/python_installation.rst +++ b/documentation/python_installation.rst @@ -31,8 +31,8 @@ If this does not work for you, please follow the full instructions below. Installation on Linux +++++++++++++++++++++ -Ubuntu 22.04 ------------- +Ubuntu 22.04 / 24.04 +-------------------- Install the AMICI dependencies via ``apt`` (this requires superuser privileges): @@ -44,8 +44,8 @@ Install the AMICI dependencies via ``apt`` # optionally for HDF5 support: sudo apt install libhdf5-serial-dev - # optionally for boost support (thread-specific CPU times, extended math functions, serialization) - libboost-chrono-dev libboost-math-dev libboost-serialization-dev + # optionally for boost support (thread-specific CPU times, extended math functions, serialization) + libboost-chrono-dev libboost-math-dev libboost-serialization-dev Install AMICI: @@ -203,9 +203,8 @@ Newer installations could be located under so that it matches your directory structure. This will download OpenBLAS and compile it, creating - - C:\\BLAS\\OpenBLAS\\lib\\openblas.lib - C:\\BLAS\\OpenBLAS\\bin\\openblas.dll +``C:\\BLAS\\OpenBLAS\\lib\\openblas.lib`` and +``C:\\BLAS\\OpenBLAS\\bin\\openblas.dll``. You will also need to define two environment variables: @@ -231,8 +230,8 @@ Now you need to make sure that all required DLLs are within the scope of the ``PATH`` variable. In particular, the following directories need to be included in ``PATH``: - C:\\BLAS\\OpenBLAS\\bin - C:\\Program Files (x86)\\Windows Kits\\10\\Redist\\ucrt\\DLLs\\x64 +* ``C:\BLAS\OpenBLAS\bin`` +* ``C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64`` The first one is needed for ``openblas.dll`` and the second is needed for the Windows Universal C Runtime. @@ -240,7 +239,7 @@ Windows Universal C Runtime. If any DLLs are missing in the ``PATH`` variable, Python will return the following error upon ``import amici``: - ImportError: DLL load failed: The specified module could not be found. +``ImportError: DLL load failed: The specified module could not be found.`` Almost all of the DLLs are standard Windows DLLs and should be included in either Windows or Visual Studio. But, in case it is necessary to test this, From f8ce650154815899faa7e332b8a61f9fab2e7de0 Mon Sep 17 00:00:00 2001 From: Daniel Weindl <dweindl@users.noreply.github.com> Date: Thu, 27 Jun 2024 13:11:14 +0200 Subject: [PATCH 08/12] CMake: Set SUNDIALS_ROOT (#2468) Set SUNDIALS_ROOT to ensure we are finding the sundials CMake config from the vendored library and not any other installation. Fixes #2467. --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4b0c95321b..9b0374b3a9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -142,9 +142,9 @@ else() set(VENDORED_SUNDIALS_BUILD_DIR ${VENDORED_SUNDIALS_DIR}/build) set(VENDORED_SUNDIALS_INSTALL_DIR ${VENDORED_SUNDIALS_BUILD_DIR}) endif() +set(SUNDIALS_ROOT "${VENDORED_SUNDIALS_INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}") find_package( - SUNDIALS REQUIRED PATHS - "${VENDORED_SUNDIALS_INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/cmake/sundials/") + SUNDIALS REQUIRED CONFIG PATHS "${SUNDIALS_ROOT}/cmake/sundials/") message(STATUS "Found SUNDIALS: ${SUNDIALS_DIR}") set(GSL_LITE_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ThirdParty/gsl") From 65a113848cc17a0115d1f42f39abb0c9761d0e6b Mon Sep 17 00:00:00 2001 From: Daniel Weindl <dweindl@users.noreply.github.com> Date: Mon, 1 Jul 2024 11:17:49 +0200 Subject: [PATCH 09/12] Update reference list (#2472) * Update reference list * BaltussenJon2024 * issue link * .. --- documentation/amici_refs.bib | 50 ++++++++++++++++++------ documentation/recreate_reference_list.py | 5 ++- documentation/references.md | 18 ++++++++- 3 files changed, 58 insertions(+), 15 deletions(-) diff --git a/documentation/amici_refs.bib b/documentation/amici_refs.bib index b14d0e18b0..7321d97194 100644 --- a/documentation/amici_refs.bib +++ b/documentation/amici_refs.bib @@ -1069,18 +1069,19 @@ @Article{LakrisenkoSta2023 } @Article{ContentoCas2023, - author = {Lorenzo Contento and Noemi Castelletti and Elba Raimúndez and Ronan {Le Gleut} and Yannik Schälte and Paul Stapor and Ludwig Christian Hinske and Michael Hoelscher and Andreas Wieser and Katja Radon and Christiane Fuchs and Jan Hasenauer}, - journal = {Epidemics}, - title = {Integrative modelling of reported case numbers and seroprevalence reveals time-dependent test efficiency and infectious contacts}, - year = {2023}, - issn = {1755-4365}, - pages = {100681}, - volume = {43}, - abstract = {Mathematical models have been widely used during the ongoing SARS-CoV-2 pandemic for data interpretation, forecasting, and policy making. However, most models are based on officially reported case numbers, which depend on test availability and test strategies. The time dependence of these factors renders interpretation difficult and might even result in estimation biases. Here, we present a computational modelling framework that allows for the integration of reported case numbers with seroprevalence estimates obtained from representative population cohorts. To account for the time dependence of infection and testing rates, we embed flexible splines in an epidemiological model. The parameters of these splines are estimated, along with the other parameters, from the available data using a Bayesian approach. The application of this approach to the official case numbers reported for Munich (Germany) and the seroprevalence reported by the prospective COVID-19 Cohort Munich (KoCo19) provides first estimates for the time dependence of the under-reporting factor. Furthermore, we estimate how the effectiveness of non-pharmaceutical interventions and of the testing strategy evolves over time. Overall, our results show that the integration of temporally highly resolved and representative data is beneficial for accurate epidemiological analyses.}, - creationdate = {2023-04-15T07:59:57}, - doi = {10.1016/j.epidem.2023.100681}, - keywords = {Compartmental model, Parameter estimation, Uncertainty quantification, COVID-19}, - url = {https://www.sciencedirect.com/science/article/pii/S1755436523000178}, + author = {Lorenzo Contento and Noemi Castelletti and Elba Raimúndez and Ronan {Le Gleut} and Yannik Schälte and Paul Stapor and Ludwig Christian Hinske and Michael Hoelscher and Andreas Wieser and Katja Radon and Christiane Fuchs and Jan Hasenauer}, + journal = {Epidemics}, + title = {Integrative modelling of reported case numbers and seroprevalence reveals time-dependent test efficiency and infectious contacts}, + year = {2023}, + issn = {1755-4365}, + pages = {100681}, + volume = {43}, + abstract = {Mathematical models have been widely used during the ongoing SARS-CoV-2 pandemic for data interpretation, forecasting, and policy making. However, most models are based on officially reported case numbers, which depend on test availability and test strategies. The time dependence of these factors renders interpretation difficult and might even result in estimation biases. Here, we present a computational modelling framework that allows for the integration of reported case numbers with seroprevalence estimates obtained from representative population cohorts. To account for the time dependence of infection and testing rates, we embed flexible splines in an epidemiological model. The parameters of these splines are estimated, along with the other parameters, from the available data using a Bayesian approach. The application of this approach to the official case numbers reported for Munich (Germany) and the seroprevalence reported by the prospective COVID-19 Cohort Munich (KoCo19) provides first estimates for the time dependence of the under-reporting factor. Furthermore, we estimate how the effectiveness of non-pharmaceutical interventions and of the testing strategy evolves over time. Overall, our results show that the integration of temporally highly resolved and representative data is beneficial for accurate epidemiological analyses.}, + creationdate = {2023-04-15T07:59:57}, + doi = {10.1016/j.epidem.2023.100681}, + keywords = {Compartmental model, Parameter estimation, Uncertainty quantification, COVID-19}, + modificationdate = {2024-06-28T08:27:57}, + url = {https://www.sciencedirect.com/science/article/pii/S1755436523000178}, } @Article{FroehlichGer2023, @@ -1332,6 +1333,31 @@ @PhdThesis{Mutsuddy2024 url = {https://tigerprints.clemson.edu/all_dissertations/3572}, } +@Misc{PhilippsKoe2024, + author = {Maren Philipps and Antonia Körner and Jakob Vanhoefer and Dilan Pathirana and Jan Hasenauer}, + title = {Non-Negative Universal Differential Equations With Applications in Systems Biology}, + year = {2024}, + archiveprefix = {arXiv}, + creationdate = {2024-06-28T08:27:59}, + eprint = {2406.14246}, + modificationdate = {2024-06-28T08:27:59}, + primaryclass = {q-bio.QM}, + url = {https://arxiv.org/abs/2406.14246}, +} + +@Article{BaltussenJon2024, + author = {Baltussen, Mathieu G. and de Jong, Thijs J. and Duez, Quentin and Robinson, William E. and Huck, Wilhelm T. S.}, + journal = {Nature}, + title = {Chemical reservoir computation in a self-organizing reaction network}, + year = {2024}, + issn = {1476-4687}, + month = jun, + creationdate = {2024-06-29T14:03:08}, + doi = {10.1038/s41586-024-07567-x}, + modificationdate = {2024-06-29T14:03:08}, + publisher = {Springer Science and Business Media LLC}, +} + @Comment{jabref-meta: databaseType:bibtex;} @Comment{jabref-meta: grouping: diff --git a/documentation/recreate_reference_list.py b/documentation/recreate_reference_list.py index 7750173ce1..a188f1daa0 100755 --- a/documentation/recreate_reference_list.py +++ b/documentation/recreate_reference_list.py @@ -75,7 +75,10 @@ def main(): ) f.write( "If you applied AMICI in your work and your publication is " - "missing, please let us know via a new GitHub issue.\n\n" + "missing, please let us know via a new\n" + "[GitHub issue](https://github.com/AMICI-dev/AMICI/issues/new" + "?labels=documentation&title=Add+publication" + "&body=AMICI+was+used+in+this+manuscript:+DOI).\n\n" ) f.write( """ diff --git a/documentation/references.md b/documentation/references.md index f17da06c55..cd103843fa 100644 --- a/documentation/references.md +++ b/documentation/references.md @@ -1,8 +1,9 @@ # References -List of publications using AMICI. Total number is 87. +List of publications using AMICI. Total number is 89. -If you applied AMICI in your work and your publication is missing, please let us know via a new GitHub issue. +If you applied AMICI in your work and your publication is missing, please let us know via a new +[GitHub issue](https://github.com/AMICI-dev/AMICI/issues/new?labels=documentation&title=Add+publication&body=AMICI+was+used+in+this+manuscript:+DOI). <style> @@ -14,6 +15,13 @@ If you applied AMICI in your work and your publication is missing, please let us <h1 class="unnumbered" id="section">2024</h1> <div id="refs" class="references csl-bib-body hanging-indent" role="list"> +<div id="ref-BaltussenJon2024" class="csl-entry" role="listitem"> +Baltussen, Mathieu G., Thijs J. de Jong, Quentin Duez, William E. +Robinson, and Wilhelm T. S. Huck. 2024. <span>“Chemical Reservoir +Computation in a Self-Organizing Reaction Network.”</span> +<em>Nature</em>, June. <a +href="https://doi.org/10.1038/s41586-024-07567-x">https://doi.org/10.1038/s41586-024-07567-x</a>. +</div> <div id="ref-DoresicGre2024" class="csl-entry" role="listitem"> Dorešić, Domagoj, Stephan Grein, and Jan Hasenauer. 2024. <span>“Efficient Parameter Estimation for ODE Models of Cellular @@ -55,6 +63,12 @@ Mutsuddy, Arnab. 2024. <span>“Single Cell Pharmacodynamic Modeling of Cancer Cell Lines.”</span> PhD thesis, Clemson University. <a href="https://tigerprints.clemson.edu/all_dissertations/3572">https://tigerprints.clemson.edu/all_dissertations/3572</a>. </div> +<div id="ref-PhilippsKoe2024" class="csl-entry" role="listitem"> +Philipps, Maren, Antonia Körner, Jakob Vanhoefer, Dilan Pathirana, and +Jan Hasenauer. 2024. <span>“Non-Negative Universal Differential +Equations with Applications in Systems Biology.”</span> <a +href="https://arxiv.org/abs/2406.14246">https://arxiv.org/abs/2406.14246</a>. +</div> <div id="ref-SluijsZho2024" class="csl-entry" role="listitem"> Sluijs, Bob van, Tao Zhou, Britta Helwig, Mathieu G. Baltussen, Frank H. T. Nelissen, Hans A. Heus, and Wilhelm T. S. Huck. 2024. From 9fe31b634d062510b49821eb890ca56a4d8ea01e Mon Sep 17 00:00:00 2001 From: Daniel Weindl <dweindl@users.noreply.github.com> Date: Mon, 1 Jul 2024 11:37:11 +0200 Subject: [PATCH 10/12] Doc: Update installation under conda (#2474) * anaconda -> conda (to include miniconda) * not recommended * Include installation hint from #2404. Closes #2402. --- documentation/python_installation.rst | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/documentation/python_installation.rst b/documentation/python_installation.rst index 3c893bcd61..d1e5f37f0a 100644 --- a/documentation/python_installation.rst +++ b/documentation/python_installation.rst @@ -360,16 +360,19 @@ environment variables: | | Default: ``ON`` | | +----------------------------+----------------------------------+---------------------------------+ -Installation under Anaconda ---------------------------- +Installation under conda +------------------------ -To use an Anaconda installation of Python -`https://www.anaconda.com/distribution/ <https://www.anaconda.com/distribution/>`_, -Python>=3.7), proceed as follows: +There is no amici conda recipe available yet. However, you can install AMICI +using pip in a conda environment. -Since Anaconda provides own versions of some packages which might not -work with AMICI (in particular the ``gcc`` compiler), create a minimal -virtual environment via: +.. note:: + + It is possible, but we currently don't recommend using conda for installing + AMICI, as it commonly leads to conflicts with system installations of + libraries and compilers. + +Create a minimal conda environment via: .. code-block:: bash @@ -415,7 +418,7 @@ Now, you are ready to use AMICI in the virtual environment. .. note:: - **Anaconda on Mac** + **conda on Mac** If the above installation does not work for you, try installing AMICI via: @@ -437,6 +440,9 @@ Now, you are ready to use AMICI in the virtual environment. (For further discussion see https://github.com/AMICI-dev/AMICI/issues/357) +Known issues: + +* ``CMAKE_AR-NOTFOUND: not found``: Try ``conda install binutils``. Optional Boost support ---------------------- From 6fe648e98abc926203a2dae38cfc003dcfd1011f Mon Sep 17 00:00:00 2001 From: Daniel Weindl <dweindl@users.noreply.github.com> Date: Tue, 2 Jul 2024 10:41:45 +0200 Subject: [PATCH 11/12] Use `petab.v1` (#2471) Make amici ready for using libpetab's `petab.v1` package instead of the previous, now deprecated imports. Move tests/petab to tests/petab_ to avoid import issues (tests.petab namespace package vs actual petab package) --- .../workflows/test_benchmark_collection_models.yml | 4 ++++ .github/workflows/test_petab_test_suite.yml | 13 +++++++++++-- pytest.ini | 4 +++- python/sdist/amici/petab/cli/import_petab.py | 2 +- python/sdist/amici/petab/conditions.py | 4 ++-- python/sdist/amici/petab/import_helpers.py | 6 +++--- python/sdist/amici/petab/parameter_mapping.py | 8 ++++---- python/sdist/amici/petab/petab_import.py | 4 ++-- python/sdist/amici/petab/petab_problem.py | 4 ++-- python/sdist/amici/petab/pysb_import.py | 6 +++--- python/sdist/amici/petab/sbml_import.py | 6 +++--- python/sdist/amici/petab/simulations.py | 4 ++-- python/sdist/amici/petab/simulator.py | 2 +- python/sdist/amici/petab/util.py | 8 ++++---- python/sdist/pyproject.toml | 2 +- .../tests/{petab => petab_}/test_petab_problem.py | 0 python/tests/splines_utils.py | 4 ++-- python/tests/test_petab_import.py | 6 +++--- python/tests/test_petab_objective.py | 2 +- python/tests/test_petab_simulate.py | 2 +- tests/benchmark-models/test_petab_benchmark.py | 2 +- tests/benchmark-models/test_petab_model.py | 4 ++-- tests/petab_test_suite/test_petab_suite.py | 2 +- 23 files changed, 57 insertions(+), 42 deletions(-) rename python/tests/{petab => petab_}/test_petab_problem.py (100%) diff --git a/.github/workflows/test_benchmark_collection_models.yml b/.github/workflows/test_benchmark_collection_models.yml index 023fe077e6..7c7aacb992 100644 --- a/.github/workflows/test_benchmark_collection_models.yml +++ b/.github/workflows/test_benchmark_collection_models.yml @@ -52,6 +52,10 @@ jobs: AMICI_PARALLEL_COMPILE="" pip3 install -v --user \ $(ls -t python/sdist/dist/amici-*.tar.gz | head -1)[petab,test,vis] + - run: | + python3 -m pip uninstall -y petab && python3 -m pip install git+https://github.com/petab-dev/libpetab-python.git@develop \ + && python3 -m pip install -U sympy + # retrieve test models - name: Download and test benchmark collection run: | diff --git a/.github/workflows/test_petab_test_suite.yml b/.github/workflows/test_petab_test_suite.yml index 7e9a93c494..64277fe267 100644 --- a/.github/workflows/test_petab_test_suite.yml +++ b/.github/workflows/test_petab_test_suite.yml @@ -58,7 +58,7 @@ jobs: - name: Install petab run: | source ./venv/bin/activate \ - && pip3 install wheel pytest shyaml pytest-cov pysb + && pip3 install wheel pytest shyaml pytest-cov pysb>=1.16 # retrieve test models - name: Download and install PEtab test suite @@ -68,11 +68,20 @@ jobs: && source ./venv/bin/activate \ && cd petab_test_suite && pip3 install -e . + - name: Install petab + run: | + source ./venv/bin/activate \ + && python3 -m pip uninstall -y petab \ + && python3 -m pip install git+https://github.com/petab-dev/libpetab-python.git@develop \ + && python3 -m pip install git+https://github.com/FFroehlich/pysb@fix_pattern_matching \ + && python3 -m pip install sympy>=1.12.1 + + - name: Run PEtab-related unit tests run: | source ./venv/bin/activate \ && pytest --cov-report=xml:coverage.xml \ - --cov=./ python/tests/test_*petab*.py python/tests/petab/ + --cov=./ python/tests/test_*petab*.py python/tests/petab_/ # run test models - name: Run PEtab test suite diff --git a/pytest.ini b/pytest.ini index 4f682576a3..adbf313922 100644 --- a/pytest.ini +++ b/pytest.ini @@ -3,7 +3,10 @@ addopts = -vv --strict-markers filterwarnings = + # warnings are errors error + # petab + ignore:Using petab.v1.Problem with PEtab2.0 is deprecated:DeprecationWarning # amici ignore:Conservation laws for non-constant species in models with RateRules are currently not supported and will be turned off.:UserWarning ignore:Conservation laws for non-constant species in models with Species-AssignmentRules are currently not supported and will be turned off.:UserWarning @@ -13,7 +16,6 @@ filterwarnings = ignore:.*inspect.getargspec\(\) is deprecated.*:DeprecationWarning # pysb warnings ignore:the imp module is deprecated in favour of importlib.*:DeprecationWarning:pysb\.core - ignore:Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working.*:DeprecationWarning:pysb\.core ignore:Model.initial_conditions will be removed in a future version. Instead, you can get a list of Initial objects with Model.initials.:DeprecationWarning:pysb\.core # https://github.com/pytest-dev/pytest-xdist/issues/825#issuecomment-1292283870 ignore:The --rsyncdir command line argument and rsyncdirs config variable are deprecated.:DeprecationWarning diff --git a/python/sdist/amici/petab/cli/import_petab.py b/python/sdist/amici/petab/cli/import_petab.py index 39fa9b9bfe..b124b4d98b 100644 --- a/python/sdist/amici/petab/cli/import_petab.py +++ b/python/sdist/amici/petab/cli/import_petab.py @@ -3,7 +3,7 @@ import petab from ..petab_import import import_model_sbml -from petab.models.sbml_model import SbmlModel +from petab.v1.models.sbml_model import SbmlModel def _parse_cli_args(): diff --git a/python/sdist/amici/petab/conditions.py b/python/sdist/amici/petab/conditions.py index c0b702b69d..08c2f90302 100644 --- a/python/sdist/amici/petab/conditions.py +++ b/python/sdist/amici/petab/conditions.py @@ -9,9 +9,9 @@ import amici import numpy as np import pandas as pd -import petab +import petab.v1 as petab from amici import AmiciModel -from petab.C import ( +from petab.v1.C import ( MEASUREMENT, NOISE_PARAMETERS, OBSERVABLE_ID, diff --git a/python/sdist/amici/petab/import_helpers.py b/python/sdist/amici/petab/import_helpers.py index 94d8e8e0ce..b52d74004d 100644 --- a/python/sdist/amici/petab/import_helpers.py +++ b/python/sdist/amici/petab/import_helpers.py @@ -11,9 +11,9 @@ import amici import pandas as pd -import petab +import petab.v1 as petab import sympy as sp -from petab.C import ( +from petab.v1.C import ( CONDITION_NAME, ESTIMATE, NOISE_DISTRIBUTION, @@ -22,7 +22,7 @@ OBSERVABLE_NAME, OBSERVABLE_TRANSFORMATION, ) -from petab.parameters import get_valid_parameters_for_parameter_table +from petab.v1.parameters import get_valid_parameters_for_parameter_table from sympy.abc import _clash logger = logging.getLogger(__name__) diff --git a/python/sdist/amici/petab/parameter_mapping.py b/python/sdist/amici/petab/parameter_mapping.py index 54930073da..dc88c1064d 100644 --- a/python/sdist/amici/petab/parameter_mapping.py +++ b/python/sdist/amici/petab/parameter_mapping.py @@ -27,17 +27,17 @@ import amici import numpy as np import pandas as pd -import petab +import petab.v1 as petab import sympy as sp from amici.sbml_import import get_species_initial -from petab.C import * # noqa: F403 -from petab.C import ( +from petab.v1.C import * # noqa: F403 +from petab.v1.C import ( LIN, PARAMETER_SCALE, PREEQUILIBRATION_CONDITION_ID, SIMULATION_CONDITION_ID, ) -from petab.models import MODEL_TYPE_PYSB, MODEL_TYPE_SBML +from petab.v1.models import MODEL_TYPE_PYSB, MODEL_TYPE_SBML from sympy.abc import _clash from .. import AmiciModel diff --git a/python/sdist/amici/petab/petab_import.py b/python/sdist/amici/petab/petab_import.py index 0e63496d75..52b08cfd47 100644 --- a/python/sdist/amici/petab/petab_import.py +++ b/python/sdist/amici/petab/petab_import.py @@ -12,8 +12,8 @@ from warnings import warn import amici -import petab -from petab.models import MODEL_TYPE_PYSB, MODEL_TYPE_SBML +import petab.v1 as petab +from petab.v1.models import MODEL_TYPE_PYSB, MODEL_TYPE_SBML from ..logging import get_logger from .import_helpers import _can_import_model, _create_model_name, check_model diff --git a/python/sdist/amici/petab/petab_problem.py b/python/sdist/amici/petab/petab_problem.py index 618b8b5247..b93eb06a87 100644 --- a/python/sdist/amici/petab/petab_problem.py +++ b/python/sdist/amici/petab/petab_problem.py @@ -4,8 +4,8 @@ import amici import pandas as pd -import petab -from petab.C import PREEQUILIBRATION_CONDITION_ID, SIMULATION_CONDITION_ID +import petab.v1 as petab +from petab.v1.C import PREEQUILIBRATION_CONDITION_ID, SIMULATION_CONDITION_ID 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 f5b1c84dbf..aac3a8f330 100644 --- a/python/sdist/amici/petab/pysb_import.py +++ b/python/sdist/amici/petab/pysb_import.py @@ -9,12 +9,12 @@ import re from pathlib import Path -import petab +import petab.v1 as petab import pysb import pysb.bng import sympy as sp -from petab.C import CONDITION_NAME, NOISE_FORMULA, OBSERVABLE_FORMULA -from petab.models.pysb_model import PySBModel +from petab.v1.C import CONDITION_NAME, NOISE_FORMULA, OBSERVABLE_FORMULA +from petab.v1.models.pysb_model import PySBModel 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 6acf4587f7..92009bf7cd 100644 --- a/python/sdist/amici/petab/sbml_import.py +++ b/python/sdist/amici/petab/sbml_import.py @@ -8,11 +8,11 @@ import amici import libsbml -import petab +import petab.v1 as petab import sympy as sp from _collections import OrderedDict from amici.logging import log_execution_time, set_log_level -from petab.models import MODEL_TYPE_SBML +from petab.v1.models import MODEL_TYPE_SBML from sympy.abc import _clash from . import PREEQ_INDICATOR_ID @@ -90,7 +90,7 @@ def import_model_sbml( :return: The created :class:`amici.sbml_import.SbmlImporter` instance. """ - from petab.models.sbml_model import SbmlModel + from petab.v1.models.sbml_model import SbmlModel set_log_level(logger, verbose) diff --git a/python/sdist/amici/petab/simulations.py b/python/sdist/amici/petab/simulations.py index 2cbed98dce..0f09c83b7a 100644 --- a/python/sdist/amici/petab/simulations.py +++ b/python/sdist/amici/petab/simulations.py @@ -12,8 +12,8 @@ import amici import numpy as np import pandas as pd -import petab -from petab.C import * # noqa: F403 +import petab.v1 as petab +from petab.v1.C import * # noqa: F403 from .. import AmiciExpData, AmiciModel from ..logging import get_logger, log_execution_time diff --git a/python/sdist/amici/petab/simulator.py b/python/sdist/amici/petab/simulator.py index 9c655b1483..407bf9f7f2 100644 --- a/python/sdist/amici/petab/simulator.py +++ b/python/sdist/amici/petab/simulator.py @@ -14,7 +14,7 @@ from collections.abc import Callable import pandas as pd -import petab +import petab.v1 as petab from amici import AmiciModel, SensitivityMethod_none from .petab_import import import_petab_problem diff --git a/python/sdist/amici/petab/util.py b/python/sdist/amici/petab/util.py index e30b829a04..5392dcdb86 100644 --- a/python/sdist/amici/petab/util.py +++ b/python/sdist/amici/petab/util.py @@ -5,10 +5,10 @@ import libsbml import pandas as pd -import petab -from petab.C import PREEQUILIBRATION_CONDITION_ID, SIMULATION_CONDITION_ID -from petab.mapping import resolve_mapping -from petab.models import MODEL_TYPE_PYSB, MODEL_TYPE_SBML +import petab.v1 as petab +from petab.v1.C import PREEQUILIBRATION_CONDITION_ID, SIMULATION_CONDITION_ID +from petab.v1.mapping import resolve_mapping +from petab.v1.models import MODEL_TYPE_PYSB, MODEL_TYPE_SBML if TYPE_CHECKING: pysb = None diff --git a/python/sdist/pyproject.toml b/python/sdist/pyproject.toml index e24bf6811a..621fd43952 100644 --- a/python/sdist/pyproject.toml +++ b/python/sdist/pyproject.toml @@ -58,7 +58,7 @@ classifiers = [ # Don't include any URLs here - they are not supported by PyPI: # HTTPError: 400 Bad Request from https://upload.pypi.org/legacy/ # Invalid value for requires_dist. Error: Can't have direct dependency: ... -petab = ["petab>=0.2.9"] +petab = ["petab>=0.4.0"] pysb = ["pysb>=1.13.1"] test = [ "benchmark_models_petab @ git+https://github.com/Benchmarking-Initiative/Benchmark-Models-PEtab.git@master#subdirectory=src/python", diff --git a/python/tests/petab/test_petab_problem.py b/python/tests/petab_/test_petab_problem.py similarity index 100% rename from python/tests/petab/test_petab_problem.py rename to python/tests/petab_/test_petab_problem.py diff --git a/python/tests/splines_utils.py b/python/tests/splines_utils.py index 19fd84eee6..8aac6edfe3 100644 --- a/python/tests/splines_utils.py +++ b/python/tests/splines_utils.py @@ -15,7 +15,7 @@ import amici import numpy as np import pandas as pd -import petab +import petab.v1 as petab import sympy as sp from amici.gradient_check import _check_results from amici.petab.petab_import import import_petab_problem @@ -31,7 +31,7 @@ ) from amici.splines import AbstractSpline, CubicHermiteSpline, UniformGrid from amici.testing import TemporaryDirectoryWinSafe as TemporaryDirectory -from petab.models.sbml_model import SbmlModel +from petab.v1.models.sbml_model import SbmlModel def evaluate_spline( diff --git a/python/tests/test_petab_import.py b/python/tests/test_petab_import.py index fca319e11f..7979e6fbf1 100644 --- a/python/tests/test_petab_import.py +++ b/python/tests/test_petab_import.py @@ -5,7 +5,7 @@ import pytest from amici.testing import TemporaryDirectoryWinSafe, skip_on_valgrind -petab = pytest.importorskip("petab", reason="Missing petab") +petab = pytest.importorskip("petab.v1", reason="Missing petab") @pytest.fixture @@ -76,7 +76,7 @@ def test_get_fixed_parameters(get_fixed_parameters_model): from amici.petab.sbml_import import ( _get_fixed_parameters_sbml as get_fixed_parameters, ) - from petab.models.sbml_model import SbmlModel + from petab.v1.models.sbml_model import SbmlModel sbml_doc, sbml_model = get_fixed_parameters_model condition_df = petab.get_condition_df( @@ -117,7 +117,7 @@ def test_get_fixed_parameters(get_fixed_parameters_model): @skip_on_valgrind def test_default_output_parameters(simple_sbml_model): from amici.petab.petab_import import import_model - from petab.models.sbml_model import SbmlModel + from petab.v1.models.sbml_model import SbmlModel sbml_doc, sbml_model = simple_sbml_model condition_df = petab.get_condition_df( diff --git a/python/tests/test_petab_objective.py b/python/tests/test_petab_objective.py index 07770ac413..260036a267 100755 --- a/python/tests/test_petab_objective.py +++ b/python/tests/test_petab_objective.py @@ -6,7 +6,7 @@ import amici import numpy as np import pandas as pd -import petab +import petab.v1 as petab import pytest from amici.petab.petab_import import import_petab_problem from amici.petab.simulations import SLLH, simulate_petab diff --git a/python/tests/test_petab_simulate.py b/python/tests/test_petab_simulate.py index e1da7768e3..f0310eaca5 100644 --- a/python/tests/test_petab_simulate.py +++ b/python/tests/test_petab_simulate.py @@ -3,7 +3,7 @@ import tempfile from pathlib import Path -import petab +import petab.v1 as petab import petabtests import pytest from amici.petab.simulator import PetabSimulator diff --git a/tests/benchmark-models/test_petab_benchmark.py b/tests/benchmark-models/test_petab_benchmark.py index 47bf503984..d0e2a6d46a 100644 --- a/tests/benchmark-models/test_petab_benchmark.py +++ b/tests/benchmark-models/test_petab_benchmark.py @@ -6,7 +6,7 @@ import amici import numpy as np import pandas as pd -import petab +import petab.v1 as petab import pytest from amici.petab.petab_import import import_petab_problem diff --git a/tests/benchmark-models/test_petab_model.py b/tests/benchmark-models/test_petab_model.py index da3d37b5fb..c4ec2f5dd2 100755 --- a/tests/benchmark-models/test_petab_model.py +++ b/tests/benchmark-models/test_petab_model.py @@ -15,7 +15,7 @@ import amici import numpy as np import pandas as pd -import petab +import petab.v1 as petab import yaml from amici.logging import get_logger from amici.petab.simulations import ( @@ -24,7 +24,7 @@ rdatas_to_measurement_df, simulate_petab, ) -from petab.visualize import plot_problem +from petab.v1.visualize import plot_problem logger = get_logger(f"amici.{__name__}", logging.WARNING) diff --git a/tests/petab_test_suite/test_petab_suite.py b/tests/petab_test_suite/test_petab_suite.py index fee6c6d763..cf1c7d4266 100755 --- a/tests/petab_test_suite/test_petab_suite.py +++ b/tests/petab_test_suite/test_petab_suite.py @@ -6,7 +6,7 @@ import amici import pandas as pd -import petab +import petab.v1 as petab import petabtests import pytest from _pytest.outcomes import Skipped From 3882d94329ddf11b0219cead7efd9cf4a0416b6d Mon Sep 17 00:00:00 2001 From: Daniel Weindl <daniel.weindl@helmholtz-munich.de> Date: Mon, 1 Jul 2024 09:56:49 +0200 Subject: [PATCH 12/12] Bump version number, update changelog --- CHANGELOG.md | 28 ++++++++++++++++++++++++++++ version.txt | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fcdc7a222a..e60a72eb4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,34 @@ See also our [versioning policy](https://amici.readthedocs.io/en/latest/versioni ## v0.X Series +### v0.26.0 (2024-07-06) + +AMICI v0.26.0 requires sympy>=1.12.1 and petab>=0.4.0. + +**Policy changes** + +* Updated AMICI's [versioning / deprecation policy](https://amici.readthedocs.io/en/develop/versioning_policy.html) + + We will start removing deprecated features that had a deprecation warning + for longer than six months in the next minor release. + +**Deprecations** + +* Passing individual tables to `amici_import_petab` is now deprecated. + Use a `petab.Problem` instance instead. + + by @dweindl in https://github.com/AMICI-dev/AMICI/pull/2464 + +**Fixes** + +* Fixed a bug where during installation of AMICI, an incorrect sundials CMake + would be used resulting in installation errors. + + by @dweindl in https://github.com/AMICI-dev/AMICI/pull/2468 + +**Full Changelog**: https://github.com/AMICI-dev/AMICI/compare/v0.25.2...v0.26.0 + + ### v0.25.2 (2024-06-16) **Fixes** diff --git a/version.txt b/version.txt index 166c9e29b7..4e8f395fa5 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.25.2 +0.26.0