sbmlsim 0.8.2__tar.gz → 0.8.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/.bumpversion.toml +1 -1
- sbmlsim-0.8.3/.github/actions/setup/action.yml +43 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/.github/pull_request_template.md +1 -1
- sbmlsim-0.8.3/.github/workflows/ci-cd.yml +266 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/.github/workflows/docs.yml +6 -15
- sbmlsim-0.8.3/.github/workflows/lint.yml +58 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/.github/workflows/testsuite-pin.yml +6 -15
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/.pre-commit-config.yaml +1 -1
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/CITATION.cff +1 -1
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/CLAUDE.md +5 -6
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/PKG-INFO +2 -2
- sbmlsim-0.8.3/docs/api/testsuite.submission.md +3 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/development.md +11 -13
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/sensitivity.md +2 -2
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/testsuite.md +1 -1
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sensitivity/sensitivity_example.py +36 -6
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/pyproject.toml +4 -2
- sbmlsim-0.8.3/release-notes/0.8.3.md +24 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/scripts/testsuite.py +13 -78
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/__init__.py +1 -1
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sensitivity/analysis.py +61 -47
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sensitivity/sensitivity_fast.py +2 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sensitivity/sensitivity_morris.py +2 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sensitivity/sensitivity_sampling.py +3 -2
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sensitivity/sensitivity_sobol.py +1 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/testsuite/__init__.py +5 -2
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/testsuite/runner.py +38 -7
- sbmlsim-0.8.3/src/sbmlsim/testsuite/submission.py +110 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/examples/test_example_scripts.py +8 -1
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/conftest.py +13 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_cli.py +40 -10
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_fit.py +12 -1
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_report.py +6 -1
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_robustness.py +4 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sensitivity/test_sensitivity_example.py +58 -0
- sbmlsim-0.8.3/tests/testsuite/test_runner.py +120 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tox.ini +3 -18
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/zensical.toml +1 -0
- sbmlsim-0.8.2/.github/workflows/ci-cd.yml +0 -184
- sbmlsim-0.8.2/.github/workflows/ruff.yml +0 -37
- sbmlsim-0.8.2/.github/workflows/ty.yml +0 -45
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/.claude/settings.json +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/.github/CODEOWNERS +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/.github/dependabot.yml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/.github/rulesets/apply.sh +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/.github/rulesets/develop.json +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/.github/rulesets/main.json +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/.github/rulesets/tags.json +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/.gitignore +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/.python-version +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/.ruff.toml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/.zenodo.json +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/LICENSE +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/README.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/conftest.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/comparison.diff.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/console.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/data.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/display.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/experiment.experiment.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/experiment.runner.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.cli.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.derived.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.display.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.fisher.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.helpers.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.identifiability.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.metrics.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.objects.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.optimization.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.options.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.parameter_mapping.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.parameters.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.petab_omex.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.petab_v2.export.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.petab_v2.extension.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.petab_v2.gaps.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.petab_v2.likelihood.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.petab_v2.observables.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.petab_v2.reader.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.petab_v2.sciml.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.petab_v2.sciml_export.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.petab_v2.symbols.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.report.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.result.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.runner.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/fit.sampling.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/index.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/log.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/mathml.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/model.model.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/model.model_change.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/model.model_resources.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/model.model_roadrunner.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/model.provenance.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/plot.plotting.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/plot.serialization_matplotlib.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/report.experiment_report.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/result.datagenerator.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/result.report.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/result.timecourse.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/result.xresult.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sciml.backend.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sciml.compiler.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sciml.errors.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sciml.hybridization.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sciml.interpreter.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sciml.layers.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sciml.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sciml.network.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sciml.parameters.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sciml.testsuite.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sensitivity.analysis.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sensitivity.classification.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sensitivity.parameters.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sensitivity.plots.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sensitivity.sensitivity_fast.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sensitivity.sensitivity_local.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sensitivity.sensitivity_morris.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sensitivity.sensitivity_sampling.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/sensitivity.sensitivity_sobol.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/serialization.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/simulation.algorithm.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/simulation.base.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/simulation.calculation.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/simulation.change.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/simulation.range.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/simulation.scan.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/simulation.sensitivity.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/simulation.simulation.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/simulation.timecourse.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/simulator.simulation_serial.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/task.task.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/testsuite.cache.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/testsuite.cases.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/testsuite.comparison.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/testsuite.report.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/testsuite.runner.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/units.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/api/utils.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/data.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/experiments.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/fitting.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/images/favicon/about.txt +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/images/favicon/android-chrome-192x192.png +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/images/favicon/android-chrome-512x512.png +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/images/favicon/apple-touch-icon.png +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/images/favicon/favicon-16x16.png +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/images/favicon/favicon-32x32.png +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/images/favicon/favicon.ico +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/images/favicon/sbmlsim-100x100-300dpi.png +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/images/favicon/site.webmanifest +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/index.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/installation.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/models.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/petab.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/plotting.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/references.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/robots.txt +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/scans.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/simulation.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/superpowers/plans/2026-09-13-versioned-fit-parameters.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/superpowers/plans/2026-09-30-petab-sciml-phase1.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/superpowers/plans/2026-09-30-petab-sciml-phase2.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/superpowers/plans/2026-09-30-petab-sciml-phase3.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/superpowers/plans/2026-09-30-petab-sciml-phase4.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/superpowers/specs/2026-09-13-versioned-fit-parameters-design.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/superpowers/specs/2026-09-30-petab-sciml-design.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/docs/units.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/README.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/diff/example_1.json +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/diff/example_2.json +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/diff/example_3.json +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/diff/example_4.json +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/diff/example_5.json +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/diff/example_6.json +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/diff/jws/example_1.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/diff/jws/example_2.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/diff/jws/example_3.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/diff/jws/example_4.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/diff/jws/example_5.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/diff/jws/example_6.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/diff_example.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/example_comparison.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/example_copasi.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/icg_amici_simulation.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/resources/condition.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/resources/condition_liver.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/resources/icg_events_sd.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/resources/icg_liver.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/resources/icg_sd.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/simulate.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/simulate_amici.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/simulate_copasi.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/comparison/simulate_roadrunner.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/curve_types/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/curve_types/experiment.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/curve_types/model.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/datagenerator.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/demo/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/demo/demo.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/fit_sampling.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/glucose/DoseResponseExperiment.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/glucose/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/glucose/data/DoseResponse/.DoseResponse_TabEpinephrine.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/glucose/data/DoseResponse/.DoseResponse_TabGlucagon.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/glucose/data/DoseResponse/.DoseResponse_TabInsulin.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/glucose/experiments/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/glucose/experiments/dose_response.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/glucose/experiments/plotting.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/glucose/glucose.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/glucose/index.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/glucose/model/liver_glucose.html +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/glucose/model/liver_glucose.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/data/Beermann1976/.Beermann1976_Fig2.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/data/Beermann1976/.Beermann1976_Fig3.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/data/Beermann1976/.Beermann1976_Tab1A.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/data/Patel1984/.Patel1984_Fig1.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/data/Patel1984/.Patel1984_Fig2.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/data/Patel1984/.Patel1984_Tab4.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/data/Weir1998/.Weir1998_Fig2.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/data/Weir1998/.Weir1998_Fig3.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/data/Weir1998/.Weir1998_Tab4.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/experiments/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/experiments/base_experiment.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/experiments/metadata.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/experiments/studies/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/experiments/studies/beermann1976.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/experiments/studies/patel1984.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/experiments/studies/weir1998.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/fitting/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/fitting/fitting.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/fitting/identifiability.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/fitting/identifiability_report.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/fitting/mapping_collections.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/fitting/parameters.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/fitting/petab_problem.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/fitting/run_report.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/helpers.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/models/hctz_body_flat.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/hctz_fitting/simulations.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/initial_assignment/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/initial_assignment/initial_assignment.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/initial_assignment/initial_assignment.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/interpolation/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/interpolation/interpolation.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/interpolation/interpolation_example.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/julia/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/julia/julia.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/julia/juliacall_example.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/model_change.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/model_sensitivity.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/petab/Boehm_JProteomeRes2014/Boehm_JProteomeRes2014.yaml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/petab/Boehm_JProteomeRes2014/README.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/petab/Boehm_JProteomeRes2014/experimentalCondition_Boehm_JProteomeRes2014.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/petab/Boehm_JProteomeRes2014/measurementData_Boehm_JProteomeRes2014.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/petab/Boehm_JProteomeRes2014/model_Boehm_JProteomeRes2014.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/petab/Boehm_JProteomeRes2014/observables_Boehm_JProteomeRes2014.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/petab/Boehm_JProteomeRes2014/parameters_Boehm_JProteomeRes2014.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/petab/Boehm_JProteomeRes2014/visualizationSpecification_Boehm_JProteomeRes2014.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/petab/Perelson_Science1996/Perelson_Science1996.yaml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/petab/Perelson_Science1996/README.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/petab/Perelson_Science1996/experimentalCondition_Perelson_Science1996.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/petab/Perelson_Science1996/measurementData_Perelson_Science1996.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/petab/Perelson_Science1996/model_Perelson_Science1996.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/petab/Perelson_Science1996/observables_Perelson_Science1996.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/petab/Perelson_Science1996/parameters_Perelson_Science1996.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/petab/Perelson_Science1996/visualizationSpecification_Perelson_Science1996.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/petab/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/petab/benchmark.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/repressilator/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/repressilator/repressilator.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/repressilator/repressilator_scans.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/scan.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/lotka_volterra/README.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/lotka_volterra/experiments.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/lotka_volterra/hybridization.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/lotka_volterra/lv.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/lotka_volterra/mapping.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/lotka_volterra/measurements.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/lotka_volterra/net1.yaml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/lotka_volterra/net1_ps.hdf5 +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/lotka_volterra/observables.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/lotka_volterra/parameters.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/lotka_volterra/problem.yaml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/lotka_volterra_fit.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/neural_ode/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/neural_ode/data.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/neural_ode/experiment.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/neural_ode/fitting.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/neural_ode/lotka_volterra_neural_ode.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sciml/neural_ode/network.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sensitivity/.gitignore +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sensitivity/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sensitivity/simple_chain.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sensitivity/simple_chain.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/sensitivity/simple_chain.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/timecourse.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/examples/units.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.1.10.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.1.11.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.1.13.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.1.14.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.1.3.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.1.4.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.1.6.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.1.7.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.1.8.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.1.9.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.2.0.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.2.1.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.2.2.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.3.0.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.4.0.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.5.0.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.6.0.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.6.1.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.7.0.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.7.1.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.7.2.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.8.0.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.8.1.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/release-notes/0.8.2.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/scripts/llms_txt.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/scripts/sciml_testsuite.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/comparison/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/comparison/diff.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/console.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/data.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/display.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/experiment/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/experiment/experiment.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/experiment/runner.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/cli.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/derived.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/display.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/fisher.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/helpers.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/identifiability.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/metrics.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/objects.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/optimization.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/options.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/parameter_mapping.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/parameters.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/petab_omex.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/petab_v2/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/petab_v2/export.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/petab_v2/extension.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/petab_v2/gaps.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/petab_v2/likelihood.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/petab_v2/observables.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/petab_v2/reader.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/petab_v2/sciml.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/petab_v2/sciml_export.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/petab_v2/symbols.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/report.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/result.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/runner.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/fit/sampling.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/log.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/mathml.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/model/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/model/model.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/model/model_change.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/model/model_resources.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/model/model_roadrunner.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/model/provenance.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/plot/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/plot/plotting.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/plot/serialization_matplotlib.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/plot/serialization_plotly.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/report/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/report/experiment_report.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/report/templates.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/resources/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/resources/models/Koenig_demo_14.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/resources/models/midazolam_body_flat.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/resources/models/repressilator.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/resources/templates/experiment.html +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/resources/templates/experiment.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/resources/templates/fit_report.html +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/resources/templates/index.html +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/resources/templates/index.md +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/resources/templates/index.tex +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/resources/templates/report_base.html +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/resources/templates/testsuite_report.html +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/result/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/result/datagenerator.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/result/report.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/result/timecourse.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/result/xresult.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sciml/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sciml/backend.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sciml/compiler.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sciml/errors.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sciml/hybridization.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sciml/interpreter.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sciml/layers/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sciml/layers/convolution.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sciml/layers/core.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sciml/layers/functions.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sciml/layers/normalization.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sciml/layers/pooling.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sciml/layers/registry.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sciml/layers/windows.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sciml/network.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sciml/parameters.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sciml/testsuite.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sensitivity/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sensitivity/classification.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sensitivity/parameters.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sensitivity/plots.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/sensitivity/sensitivity_local.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/serialization.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/simulation/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/simulation/algorithm.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/simulation/base.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/simulation/calculation.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/simulation/change.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/simulation/range.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/simulation/scan.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/simulation/sensitivity.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/simulation/simulation.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/simulation/timecourse.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/simulator/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/simulator/simulation_serial.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/task/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/task/task.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/task/task_new.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/testsuite/cache.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/testsuite/cases.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/testsuite/comparison.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/testsuite/report.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/units.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/src/sbmlsim/utils.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/conftest.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/data/numlData1D.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/data/numlData2D.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/data/numlData2D2RC.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/data/oscli.csv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/data/oscli.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/data/oscli.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/data/parameter-from-data-csv.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/data/parameters.csv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/data/reading-numlData1D.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/data/reading-numlData2D.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/data/reading-numlData2DRC.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/data/reading-oscli-csv.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/data/reading-oscli-numl.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/data/reading-oscli-tsv.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/datasets/Allonen1981/.Allonen1981_Fig3A.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/datasets/Faber1978/.Faber1978_Fig1.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/models/BioModel1_repressor_activator_oscillations.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/models/BorisEJB.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/models/Koenig_demo_14.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/models/app2sim.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/models/asedml3repeat.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/models/asedmlComplex.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/models/body21_livertoy_flat.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/models/curien.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/models/example1.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/models/icg_body_flat.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/models/lorenz.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/models/lotka_volterra.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/models/midazolam_body_flat.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/models/model1.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/models/oscli.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/models/repressilator.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/petab/icg_example1/icg.omex +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/petab/icg_example1/icg.xml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/petab/icg_example1/icg.yaml +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/petab/icg_example1/icg_condition.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/petab/icg_example1/icg_data.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/petab/icg_example1/icg_measurement.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/petab/icg_example1/icg_observable.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/petab/icg_example1/icg_parameter.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/petab/sciml_001_llh.tsv +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/sciml_baseline.json +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/data/testsuite_baseline.json +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/examples/test_interpolation.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/experiment/test_experiment_examples.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/experiment/test_experiment_run.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/hooks.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_derived_changes.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_display.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_fisher.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_helpers.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_identifiability.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_mapping_kinds.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_metrics.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_objects.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_optimization.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_optimization_result.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_parameter_mapping.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_parameter_scale.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_parameter_sets.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_petab_omex.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_petab_v2.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_petab_v2_definition.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_petab_v2_dosing.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_petab_v2_likelihood.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_petab_v2_noise.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_petab_v2_reader.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_petab_v2_symbols.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_predictions.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/fit/test_sampling.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/model/test_provenance.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/models/test_biomodels.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/models/test_model_roadrunner.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/plot/test_plotting.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/plot/test_serialization_matplotlib.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/report/test_experiment_report.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/result/test_datagenerator.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/result/test_timecourse.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/conftest.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/experiment.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/hybrid.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/petab.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_backend.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_compiler.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_export.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_expressions.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_fit.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_functions.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_hybridization.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_ids.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_interpreter.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_layers_convolution.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_layers_core.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_layers_normalization.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_layers_pooling.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_network.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_package.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_parameters.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_reader.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_report.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_script.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_suite_cases.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sciml/test_testsuite.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sensitivity/test_analysis.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sensitivity/test_classification.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/sensitivity/test_parameters.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/simulation/test_algorithm.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/simulation/test_scan.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/simulation/test_simulation.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/test_data.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/test_display_links.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/test_log.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/test_mathml.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/test_mathml_formula.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/test_model_change.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/test_sensitivity.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/test_units.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/test_utils.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/testsuite/__init__.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/testsuite/conftest.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/testsuite/test_cache.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/testsuite/test_cases.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/testsuite/test_report_path.py +0 -0
- {sbmlsim-0.8.2 → sbmlsim-0.8.3}/tests/testsuite/test_semantic.py +0 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
name: Set up the environment
|
|
2
|
+
description: >-
|
|
3
|
+
Install uv with its cache, set the python version of the job, put the
|
|
4
|
+
libpython of the interpreter on the library search path and sync the
|
|
5
|
+
environment of the project
|
|
6
|
+
inputs:
|
|
7
|
+
python-version:
|
|
8
|
+
description: the python version, e.g. 3.14
|
|
9
|
+
required: true
|
|
10
|
+
sync:
|
|
11
|
+
description: >-
|
|
12
|
+
the arguments of `uv sync`, e.g. `--extra dev`; empty does not sync
|
|
13
|
+
required: false
|
|
14
|
+
default: ""
|
|
15
|
+
runs:
|
|
16
|
+
using: composite
|
|
17
|
+
steps:
|
|
18
|
+
- name: Install uv and set the python version
|
|
19
|
+
# astral-sh/setup-uv publishes no floating major tag beyond v7
|
|
20
|
+
uses: astral-sh/setup-uv@v10.2.0
|
|
21
|
+
with:
|
|
22
|
+
python-version: ${{ inputs.python-version }}
|
|
23
|
+
enable-cache: true
|
|
24
|
+
- name: Put libpython on the library search path (linux only)
|
|
25
|
+
# the extension of libroadrunner links against libpython. The standalone
|
|
26
|
+
# interpreters uv installs link it statically and ship it in their `lib`,
|
|
27
|
+
# where the loader does not look; without it the import of roadrunner
|
|
28
|
+
# fails with `libpython3.14.so.1.0: cannot open shared object file`
|
|
29
|
+
if: runner.os == 'Linux'
|
|
30
|
+
shell: bash
|
|
31
|
+
env:
|
|
32
|
+
PYTHON_VERSION: ${{ inputs.python-version }}
|
|
33
|
+
run: |
|
|
34
|
+
prefix=$(uv run --no-project --python "$PYTHON_VERSION" python -c "import sys; print(sys.base_prefix)")
|
|
35
|
+
echo "LD_LIBRARY_PATH=$prefix/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" >> "$GITHUB_ENV"
|
|
36
|
+
echo "libpython: $(ls "$prefix"/lib/libpython*.so.1.0)"
|
|
37
|
+
- name: Sync the environment
|
|
38
|
+
if: inputs.sync != ''
|
|
39
|
+
shell: bash
|
|
40
|
+
env:
|
|
41
|
+
SYNC: ${{ inputs.sync }}
|
|
42
|
+
# word splitting of the arguments is intended
|
|
43
|
+
run: uv sync $SYNC
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
- [ ] the pull request targets `develop`
|
|
8
8
|
- [ ] tests were added or updated for the change
|
|
9
|
-
- [ ] `tox run-parallel`
|
|
9
|
+
- [ ] `pytest` and `ty check` pass locally, `tox run-parallel` runs the tests on every supported python
|
|
10
10
|
- [ ] `ruff check` and `ruff format` are clean, e.g., via `pre-commit run --all-files`
|
|
11
11
|
- [ ] public functions and classes have type annotations and a docstring
|
|
12
12
|
- [ ] user visible changes are in `release-notes/` and, if needed, in `docs/`
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
name: CI-CD
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
# feature branches are tested through their pull request, tags release
|
|
6
|
+
branches: [develop, main]
|
|
7
|
+
tags: ['*']
|
|
8
|
+
pull_request:
|
|
9
|
+
branches: [develop, main]
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
|
|
12
|
+
# least privilege by default, the release job raises what it needs
|
|
13
|
+
permissions:
|
|
14
|
+
contents: read
|
|
15
|
+
|
|
16
|
+
concurrency:
|
|
17
|
+
# a superseded run of a pull request is cancelled. A push is a group of its
|
|
18
|
+
# own: a release waits for the run of its commit on develop (see the job
|
|
19
|
+
# `tested`), and a group keeps one run waiting and cancels it for the next
|
|
20
|
+
# one even without `cancel-in-progress`, so two merges in a row would leave
|
|
21
|
+
# the first commit untested
|
|
22
|
+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || format('{0}-{1}', github.ref, github.sha) }}
|
|
23
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
24
|
+
|
|
25
|
+
jobs:
|
|
26
|
+
test:
|
|
27
|
+
# a tag is not tested again, see the job `tested`
|
|
28
|
+
if: ${{ !startsWith(github.ref, 'refs/tags/') }}
|
|
29
|
+
runs-on: ${{ matrix.os }}
|
|
30
|
+
timeout-minutes: 45
|
|
31
|
+
strategy:
|
|
32
|
+
fail-fast: false
|
|
33
|
+
matrix:
|
|
34
|
+
os: [ubuntu-latest, windows-latest, macos-latest]
|
|
35
|
+
python-version: ["3.13", "3.14"]
|
|
36
|
+
# linux covers the full range, windows and macos only the newest version
|
|
37
|
+
exclude:
|
|
38
|
+
- os: windows-latest
|
|
39
|
+
python-version: "3.13"
|
|
40
|
+
- os: macos-latest
|
|
41
|
+
python-version: "3.13"
|
|
42
|
+
|
|
43
|
+
steps:
|
|
44
|
+
- uses: actions/checkout@v7
|
|
45
|
+
with:
|
|
46
|
+
persist-credentials: false
|
|
47
|
+
- name: Set up the environment
|
|
48
|
+
# the package is installed as a wheel and not editable, so the tests run
|
|
49
|
+
# against what is published
|
|
50
|
+
uses: ./.github/actions/setup
|
|
51
|
+
with:
|
|
52
|
+
python-version: ${{ matrix.python-version }}
|
|
53
|
+
sync: --extra dev --no-editable
|
|
54
|
+
- name: Test
|
|
55
|
+
# the slowest tests are listed at the end of the log
|
|
56
|
+
run: uv run --no-sync pytest --durations=20
|
|
57
|
+
|
|
58
|
+
tests:
|
|
59
|
+
# the one check the branch protection requires; the names of the matrix
|
|
60
|
+
# jobs change with the matrix, this name does not, see .github/rulesets/
|
|
61
|
+
name: tests
|
|
62
|
+
needs: test
|
|
63
|
+
if: ${{ always() && !startsWith(github.ref, 'refs/tags/') }}
|
|
64
|
+
runs-on: ubuntu-latest
|
|
65
|
+
timeout-minutes: 5
|
|
66
|
+
steps:
|
|
67
|
+
- name: Check the result of the test matrix
|
|
68
|
+
env:
|
|
69
|
+
RESULT: ${{ needs.test.result }}
|
|
70
|
+
run: |
|
|
71
|
+
echo "test matrix: $RESULT"
|
|
72
|
+
test "$RESULT" = "success"
|
|
73
|
+
|
|
74
|
+
tested:
|
|
75
|
+
# a release does not run the test matrix again. The tag is on a commit of
|
|
76
|
+
# develop, and the push of that commit ran the matrix on exactly this
|
|
77
|
+
# tree; the job waits for that run and fails unless it succeeded, so the
|
|
78
|
+
# tag can be pushed right after the merge of the release
|
|
79
|
+
name: tested on develop
|
|
80
|
+
if: startsWith(github.ref, 'refs/tags/')
|
|
81
|
+
runs-on: ubuntu-latest
|
|
82
|
+
timeout-minutes: 60
|
|
83
|
+
permissions:
|
|
84
|
+
actions: read # the runs of this workflow
|
|
85
|
+
contents: read
|
|
86
|
+
steps:
|
|
87
|
+
- uses: actions/checkout@v7
|
|
88
|
+
with:
|
|
89
|
+
fetch-depth: 0
|
|
90
|
+
persist-credentials: false
|
|
91
|
+
- name: Check that the tag is on develop
|
|
92
|
+
run: |
|
|
93
|
+
if ! git merge-base --is-ancestor "$GITHUB_SHA" origin/develop; then
|
|
94
|
+
echo "::error::$GITHUB_REF_NAME is not on develop, a release is tagged on develop"
|
|
95
|
+
exit 1
|
|
96
|
+
fi
|
|
97
|
+
- name: Wait for the run of the commit on develop
|
|
98
|
+
env:
|
|
99
|
+
GH_TOKEN: ${{ github.token }}
|
|
100
|
+
run: |
|
|
101
|
+
api="repos/$GITHUB_REPOSITORY/actions"
|
|
102
|
+
# the run starts with the merge, a tag pushed right after it may be first
|
|
103
|
+
run_id=""
|
|
104
|
+
for attempt in $(seq 1 20); do
|
|
105
|
+
run_id=$(gh api "$api/workflows/ci-cd.yml/runs?branch=develop&event=push&head_sha=$GITHUB_SHA" \
|
|
106
|
+
--jq '.workflow_runs[0].id // empty' || true)
|
|
107
|
+
[ -n "$run_id" ] && break
|
|
108
|
+
sleep 15
|
|
109
|
+
done
|
|
110
|
+
if [ -z "$run_id" ]; then
|
|
111
|
+
echo "::error::no CI-CD run of the push of $GITHUB_SHA to develop"
|
|
112
|
+
exit 1
|
|
113
|
+
fi
|
|
114
|
+
url="$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$run_id"
|
|
115
|
+
echo "waiting for $url"
|
|
116
|
+
# a failed request answers nothing, which is not `completed` either
|
|
117
|
+
until [ "$(gh api "$api/runs/$run_id" --jq .status || true)" = "completed" ]; do
|
|
118
|
+
sleep 30
|
|
119
|
+
done
|
|
120
|
+
conclusion=$(gh api "$api/runs/$run_id" --jq .conclusion)
|
|
121
|
+
echo "$url: $conclusion"
|
|
122
|
+
if [ "$conclusion" != "success" ]; then
|
|
123
|
+
echo "::error::the tests of $GITHUB_SHA on develop did not pass ($url); once they do, re-run the failed jobs of this release"
|
|
124
|
+
exit 1
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
testsuite:
|
|
128
|
+
# the semantic cases of the SBML Test Suite against the pinned release and
|
|
129
|
+
# the cases of the PEtab SciML test suite against the pinned commit, which
|
|
130
|
+
# the baselines record, as two jobs which run next to each other. A normal
|
|
131
|
+
# run of the tests deselects them: they answer what libroadrunner and the
|
|
132
|
+
# networks support, which a change to sbmlsim rarely moves, and they take
|
|
133
|
+
# longer than the rest together. A release does not go out without them
|
|
134
|
+
name: sbml test suite
|
|
135
|
+
if: startsWith(github.ref, 'refs/tags/')
|
|
136
|
+
runs-on: ubuntu-latest
|
|
137
|
+
timeout-minutes: 30
|
|
138
|
+
steps:
|
|
139
|
+
- uses: actions/checkout@v7
|
|
140
|
+
with:
|
|
141
|
+
persist-credentials: false
|
|
142
|
+
- name: Set up the environment
|
|
143
|
+
uses: ./.github/actions/setup
|
|
144
|
+
with:
|
|
145
|
+
python-version: "3.14"
|
|
146
|
+
sync: --extra dev --no-editable
|
|
147
|
+
- name: Download the pinned release
|
|
148
|
+
run: uv run --no-sync python scripts/testsuite.py download
|
|
149
|
+
- name: Run the semantic cases against the pinned release
|
|
150
|
+
run: uv run --no-sync pytest -m testsuite
|
|
151
|
+
|
|
152
|
+
sciml:
|
|
153
|
+
# see the job `testsuite`; a job of its own and not a matrix, the check of
|
|
154
|
+
# a matrix job which is skipped is named by the unevaluated expression
|
|
155
|
+
name: petab sciml test suite
|
|
156
|
+
if: startsWith(github.ref, 'refs/tags/')
|
|
157
|
+
runs-on: ubuntu-latest
|
|
158
|
+
timeout-minutes: 30
|
|
159
|
+
steps:
|
|
160
|
+
- uses: actions/checkout@v7
|
|
161
|
+
with:
|
|
162
|
+
persist-credentials: false
|
|
163
|
+
- name: Set up the environment
|
|
164
|
+
uses: ./.github/actions/setup
|
|
165
|
+
with:
|
|
166
|
+
python-version: "3.14"
|
|
167
|
+
sync: --extra dev --no-editable
|
|
168
|
+
- name: Download the pinned commit
|
|
169
|
+
run: uv run --no-sync python scripts/sciml_testsuite.py download
|
|
170
|
+
- name: Run the cases of the PEtab SciML test suite against the pinned commit
|
|
171
|
+
run: uv run --no-sync pytest -m sciml_testsuite tests/sciml
|
|
172
|
+
|
|
173
|
+
submission:
|
|
174
|
+
# the results a submission to the SBML Test Suite Database is made of. A
|
|
175
|
+
# release submits against the newest suite, not against the pinned one.
|
|
176
|
+
# The archive is an attachment of the release and never blocks it
|
|
177
|
+
name: sbml test suite submission
|
|
178
|
+
if: startsWith(github.ref, 'refs/tags/')
|
|
179
|
+
runs-on: ubuntu-latest
|
|
180
|
+
timeout-minutes: 20
|
|
181
|
+
continue-on-error: true
|
|
182
|
+
steps:
|
|
183
|
+
- uses: actions/checkout@v7
|
|
184
|
+
with:
|
|
185
|
+
persist-credentials: false
|
|
186
|
+
- name: Set up the environment
|
|
187
|
+
uses: ./.github/actions/setup
|
|
188
|
+
with:
|
|
189
|
+
python-version: "3.14"
|
|
190
|
+
sync: --no-editable
|
|
191
|
+
- name: Run the SBML Test Suite against its newest release
|
|
192
|
+
# the cases run in one process per core
|
|
193
|
+
run: uv run --no-sync python scripts/testsuite.py submission --version latest --output submission
|
|
194
|
+
- name: Upload the submission
|
|
195
|
+
uses: actions/upload-artifact@v7
|
|
196
|
+
with:
|
|
197
|
+
name: submission
|
|
198
|
+
path: submission/*.zip
|
|
199
|
+
if-no-files-found: error
|
|
200
|
+
|
|
201
|
+
release:
|
|
202
|
+
needs: [tested, testsuite, sciml, submission]
|
|
203
|
+
# the submission is an attachment, the release goes out without it
|
|
204
|
+
if: >-
|
|
205
|
+
${{ !cancelled() && startsWith(github.ref, 'refs/tags/')
|
|
206
|
+
&& needs.tested.result == 'success'
|
|
207
|
+
&& needs.testsuite.result == 'success'
|
|
208
|
+
&& needs.sciml.result == 'success' }}
|
|
209
|
+
runs-on: ubuntu-latest
|
|
210
|
+
timeout-minutes: 15
|
|
211
|
+
environment:
|
|
212
|
+
name: pypi
|
|
213
|
+
url: https://pypi.org/p/sbmlsim
|
|
214
|
+
permissions:
|
|
215
|
+
id-token: write # trusted publishing to PyPI
|
|
216
|
+
contents: write # create the GitHub release
|
|
217
|
+
steps:
|
|
218
|
+
- uses: actions/checkout@v7
|
|
219
|
+
with:
|
|
220
|
+
persist-credentials: false
|
|
221
|
+
- name: Set up uv
|
|
222
|
+
uses: ./.github/actions/setup
|
|
223
|
+
with:
|
|
224
|
+
python-version: "3.14"
|
|
225
|
+
- name: Build package
|
|
226
|
+
run: uvx hatch build
|
|
227
|
+
- name: Check the package
|
|
228
|
+
run: uvx twine check dist/*
|
|
229
|
+
- name: Publish to PyPI
|
|
230
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
231
|
+
with:
|
|
232
|
+
packages-dir: dist
|
|
233
|
+
- name: Download the submission
|
|
234
|
+
# missing when the submission failed, which is no reason to stop here:
|
|
235
|
+
# the package is on PyPI by this point
|
|
236
|
+
continue-on-error: true
|
|
237
|
+
uses: actions/download-artifact@v8
|
|
238
|
+
with:
|
|
239
|
+
name: submission
|
|
240
|
+
path: submission
|
|
241
|
+
- name: Create GitHub release
|
|
242
|
+
uses: softprops/action-gh-release@v3
|
|
243
|
+
with:
|
|
244
|
+
body_path: "release-notes/${{ github.ref_name }}.md"
|
|
245
|
+
files: submission/*.zip
|
|
246
|
+
# the submission may be missing, the notes are the release
|
|
247
|
+
fail_on_unmatched_files: false
|
|
248
|
+
draft: false
|
|
249
|
+
prerelease: false
|
|
250
|
+
|
|
251
|
+
sync-main:
|
|
252
|
+
# main tracks the latest published release, see docs/development.md
|
|
253
|
+
needs: release
|
|
254
|
+
if: startsWith(github.ref, 'refs/tags/')
|
|
255
|
+
runs-on: ubuntu-latest
|
|
256
|
+
timeout-minutes: 5
|
|
257
|
+
permissions:
|
|
258
|
+
contents: write # fast-forward main to the released commit
|
|
259
|
+
steps:
|
|
260
|
+
- uses: actions/checkout@v7
|
|
261
|
+
with:
|
|
262
|
+
# a shallow clone cannot be pushed to another branch
|
|
263
|
+
fetch-depth: 0
|
|
264
|
+
- name: Fast-forward main to the release
|
|
265
|
+
# no --force: the push fails loudly if it would not be a fast-forward
|
|
266
|
+
run: git push origin HEAD:main
|
|
@@ -29,34 +29,25 @@ jobs:
|
|
|
29
29
|
persist-credentials: false
|
|
30
30
|
- name: Configure GitHub Pages
|
|
31
31
|
uses: actions/configure-pages@v6
|
|
32
|
-
- name:
|
|
33
|
-
|
|
34
|
-
# standalone interpreters do not put on the library search path
|
|
35
|
-
run: |
|
|
36
|
-
sudo add-apt-repository -y ppa:deadsnakes/ppa
|
|
37
|
-
sudo apt-get update
|
|
38
|
-
sudo apt-get install -y python3.14-dev
|
|
39
|
-
- name: Install uv and set the python version
|
|
40
|
-
uses: astral-sh/setup-uv@v10.2.0
|
|
32
|
+
- name: Set up the environment
|
|
33
|
+
uses: ./.github/actions/setup
|
|
41
34
|
with:
|
|
42
35
|
python-version: "3.14"
|
|
43
|
-
|
|
44
|
-
- name: Install dependencies
|
|
45
|
-
run: uv sync --extra dev
|
|
36
|
+
sync: --extra dev
|
|
46
37
|
- name: Build the documentation
|
|
47
38
|
# the API reference is rendered from the docstrings by mkdocstrings,
|
|
48
39
|
# so the package has to be importable
|
|
49
|
-
run: uv run zensical build --clean
|
|
40
|
+
run: uv run --no-sync zensical build --clean
|
|
50
41
|
- name: Generate the agent facing files
|
|
51
42
|
# llms.txt, llms-full.txt and the markdown of every page
|
|
52
|
-
run: uv run python scripts/llms_txt.py
|
|
43
|
+
run: uv run --no-sync python scripts/llms_txt.py
|
|
53
44
|
- name: Run the SBML Test Suite and write its report
|
|
54
45
|
# the interactive report is generated into the site and not committed,
|
|
55
46
|
# so the published one always describes the code it was built from.
|
|
56
47
|
# Only a build which can be published pays the three minutes: a pull
|
|
57
48
|
# request builds the site to check that it builds, it does not deploy
|
|
58
49
|
if: github.event_name != 'pull_request'
|
|
59
|
-
run: uv run python scripts/testsuite.py report --output site/testsuite/report
|
|
50
|
+
run: uv run --no-sync python scripts/testsuite.py report --output site/testsuite/report
|
|
60
51
|
- name: Upload the site
|
|
61
52
|
uses: actions/upload-pages-artifact@v5
|
|
62
53
|
with:
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
name: lint
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
# feature branches are checked through their pull request
|
|
6
|
+
branches: [develop, main]
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [develop, main]
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
|
|
14
|
+
concurrency:
|
|
15
|
+
# a superseded run of a pull request is cancelled, a push is checked on its own
|
|
16
|
+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
|
|
17
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
18
|
+
|
|
19
|
+
jobs:
|
|
20
|
+
ruff:
|
|
21
|
+
# the names of the jobs are the checks the branch protection requires,
|
|
22
|
+
# see .github/rulesets/develop.json
|
|
23
|
+
name: ruff
|
|
24
|
+
runs-on: ubuntu-latest
|
|
25
|
+
timeout-minutes: 10
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v7
|
|
28
|
+
with:
|
|
29
|
+
persist-credentials: false
|
|
30
|
+
# the ruff version is read from the dev dependencies in pyproject.toml
|
|
31
|
+
- name: Lint
|
|
32
|
+
# astral-sh/ruff-action publishes no floating major tag beyond v3
|
|
33
|
+
uses: astral-sh/ruff-action@v4.1.0
|
|
34
|
+
with:
|
|
35
|
+
args: check --output-format=github
|
|
36
|
+
- name: Format
|
|
37
|
+
uses: astral-sh/ruff-action@v4.1.0
|
|
38
|
+
with:
|
|
39
|
+
args: format --check --diff
|
|
40
|
+
|
|
41
|
+
ty:
|
|
42
|
+
name: ty
|
|
43
|
+
runs-on: ubuntu-latest
|
|
44
|
+
timeout-minutes: 10
|
|
45
|
+
steps:
|
|
46
|
+
- uses: actions/checkout@v7
|
|
47
|
+
with:
|
|
48
|
+
persist-credentials: false
|
|
49
|
+
- name: Set up the environment
|
|
50
|
+
# ty resolves the imports of `src`, `tests`, `examples` and `scripts`
|
|
51
|
+
# in the environment, the dev extra has all of them; there is no ty
|
|
52
|
+
# action, and an environment is what it would need as well
|
|
53
|
+
uses: ./.github/actions/setup
|
|
54
|
+
with:
|
|
55
|
+
python-version: "3.14"
|
|
56
|
+
sync: --extra dev
|
|
57
|
+
- name: Type check
|
|
58
|
+
run: uv run --no-sync ty check --output-format github
|
|
@@ -27,25 +27,16 @@ jobs:
|
|
|
27
27
|
pull-requests: write # open the pull request
|
|
28
28
|
steps:
|
|
29
29
|
- uses: actions/checkout@v7
|
|
30
|
-
- name:
|
|
31
|
-
|
|
32
|
-
# standalone interpreters do not put on the library search path
|
|
33
|
-
run: |
|
|
34
|
-
sudo add-apt-repository -y ppa:deadsnakes/ppa
|
|
35
|
-
sudo apt-get update
|
|
36
|
-
sudo apt-get install -y python3.14-dev
|
|
37
|
-
- name: Install uv and set the python version
|
|
38
|
-
uses: astral-sh/setup-uv@v10.2.0
|
|
30
|
+
- name: Set up the environment
|
|
31
|
+
uses: ./.github/actions/setup
|
|
39
32
|
with:
|
|
40
33
|
python-version: "3.14"
|
|
41
|
-
|
|
42
|
-
- name: Install dependencies
|
|
43
|
-
run: uv sync --extra dev
|
|
34
|
+
sync: --extra dev
|
|
44
35
|
- name: Compare the pinned release with the newest one
|
|
45
36
|
id: versions
|
|
46
37
|
run: |
|
|
47
|
-
PINNED=$(uv run python -c "from sbmlsim.testsuite.cases import SUITE_VERSION; print(SUITE_VERSION)")
|
|
48
|
-
LATEST=$(uv run python -c "from sbmlsim.testsuite import SemanticSuite; print(SemanticSuite.latest_version())")
|
|
38
|
+
PINNED=$(uv run --no-sync python -c "from sbmlsim.testsuite.cases import SUITE_VERSION; print(SUITE_VERSION)")
|
|
39
|
+
LATEST=$(uv run --no-sync python -c "from sbmlsim.testsuite import SemanticSuite; print(SemanticSuite.latest_version())")
|
|
49
40
|
echo "pinned=$PINNED" >> "$GITHUB_OUTPUT"
|
|
50
41
|
echo "latest=$LATEST" >> "$GITHUB_OUTPUT"
|
|
51
42
|
echo "The pinned release is '$PINNED', the newest is '$LATEST'"
|
|
@@ -65,7 +56,7 @@ jobs:
|
|
|
65
56
|
PY
|
|
66
57
|
# the baseline records the outcome of every case, so it is recorded
|
|
67
58
|
# again for the release which is adopted
|
|
68
|
-
uv run python scripts/testsuite.py baseline
|
|
59
|
+
uv run --no-sync python scripts/testsuite.py baseline
|
|
69
60
|
- name: Open the pull request
|
|
70
61
|
if: steps.versions.outputs.pinned != steps.versions.outputs.latest
|
|
71
62
|
uses: peter-evans/create-pull-request@v8
|
|
@@ -56,7 +56,7 @@ repos:
|
|
|
56
56
|
|
|
57
57
|
- repo: https://github.com/astral-sh/ty-pre-commit
|
|
58
58
|
# ty version.
|
|
59
|
-
rev: v0.0.
|
|
59
|
+
rev: v0.0.85
|
|
60
60
|
hooks:
|
|
61
61
|
# Run the type checker on the whole project (see `[tool.ty]` in pyproject.toml).
|
|
62
62
|
# `--extra dev` syncs the environment with the dev dependencies, so that the
|
|
@@ -8,7 +8,7 @@ authors:
|
|
|
8
8
|
given-names: "Matthias"
|
|
9
9
|
orcid: "https://orcid.org/0000-0003-1725-179X"
|
|
10
10
|
affiliation: "Humboldt-University Berlin, Faculty of Life Science, Institute for Biology, Biology, Berlin; University Lübeck; University Hospital Schleswig-Holstein, Campus Lübeck, First Department of Medicine, Germany"
|
|
11
|
-
version: "0.8.
|
|
11
|
+
version: "0.8.3"
|
|
12
12
|
date-released: "2026-10-06"
|
|
13
13
|
doi: "10.5281/zenodo.3597770"
|
|
14
14
|
license: MIT
|
|
@@ -22,22 +22,21 @@ pytest tests/simulation/test_simulation.py # single file
|
|
|
22
22
|
pytest tests/simulation/test_scan.py::test_scan1d # single test
|
|
23
23
|
pytest -rs # list the skipped tests
|
|
24
24
|
tox r -e py3.14 # single tox env (py3.13, py3.14 available)
|
|
25
|
-
tox run-parallel #
|
|
25
|
+
tox run-parallel # the tests on every supported python
|
|
26
26
|
|
|
27
27
|
# lint / format / types
|
|
28
28
|
ruff check
|
|
29
29
|
ruff format
|
|
30
|
-
|
|
31
|
-
uvx ty check # same check, straight from the working tree
|
|
30
|
+
uv run ty check # ty type check (config in [tool.ty] in pyproject.toml)
|
|
32
31
|
|
|
33
32
|
# examples, they are modules of the `examples` package and not part of sbmlsim
|
|
34
33
|
python -m examples.timecourse
|
|
35
34
|
python -m examples.sensitivity.sensitivity_example
|
|
36
35
|
```
|
|
37
36
|
|
|
38
|
-
`develop` is the default branch and takes every change through a pull request; direct pushes are rejected by the rulesets in `.github/rulesets/` (applied with `.github/rulesets/apply.sh`), which require the `tests`, `ruff`, `ty` and `docs` checks. `main` only tracks the latest release and is fast-forwarded by the `sync-main` job of the release workflow, never by hand.
|
|
37
|
+
`develop` is the default branch and takes every change through a pull request; direct pushes are rejected by the rulesets in `.github/rulesets/` (applied with `.github/rulesets/apply.sh`), which require the `tests`, `ruff`, `ty` and `docs` checks (`ruff` and `ty` are the jobs of `lint.yml`). Every job of the workflows sets up uv, python and the environment with the action `.github/actions/setup` and runs the commands a developer runs, without tox; a push to `develop` is never cancelled, since a release waits for the run of its commit. `main` only tracks the latest release and is fast-forwarded by the `sync-main` job of the release workflow, never by hand.
|
|
39
38
|
|
|
40
|
-
Release steps are in `docs/development.md` (there is no separate `RELEASE.md`): the release is prepared on a branch, `uvx bump-my-version bump [major|minor|patch]` updates `src/sbmlsim/__init__.py` and `CITATION.cff` and commits without tagging (`tag = false`, a squash merge would rewrite the commit), and the tag is created on `develop` after the pull request was merged, which triggers the PyPI release workflow.
|
|
39
|
+
Release steps are in `docs/development.md` (there is no separate `RELEASE.md`): the release is prepared on a branch, `uvx bump-my-version bump [major|minor|patch]` updates `src/sbmlsim/__init__.py` and `CITATION.cff` and commits without tagging (`tag = false`, a squash merge would rewrite the commit), and the tag is created on `develop` after the pull request was merged, which triggers the PyPI release workflow; it does not run the test matrix again, its job `tested on develop` waits for the run of the push of the same commit to `develop`, which is why the runs of `develop` are never cancelled.
|
|
41
40
|
|
|
42
41
|
Documentation is [Zensical](https://zensical.org/): markdown sources in `docs/`, configured in `zensical.toml`, built into the gitignored `site/` (`uv run zensical build --clean`, `uv run zensical serve` for the preview). The API reference is rendered from the docstrings by mkdocstrings; a page in `docs/api/` is just `::: sbmlsim.<module>`, so nothing is generated into the repository. `scripts/llms_txt.py` runs after the build and writes the agent facing files (`llms.txt`, `llms-full.txt` and the markdown of every page) into `site/`. The `documentation` workflow runs both and publishes the site from `develop`.
|
|
43
42
|
|
|
@@ -59,7 +58,7 @@ Documentation is [Zensical](https://zensical.org/): markdown sources in `docs/`,
|
|
|
59
58
|
|
|
60
59
|
**`comparison/` — comparison of results.** `diff.py` holds `DataSetsComparison`, which matches the columns of the results of two simulators and reports the absolute and relative differences above the tolerances. The scripts which produce such results with AMICI and COPASI are `examples/comparison/`, they import the optional dependencies; `examples/comparison/diff_example.py` compares roadrunner with JWS Online.
|
|
61
60
|
|
|
62
|
-
**`testsuite/` — the SBML Test Suite.** `SemanticCase` (`testsuite/cases.py`) is a semantic case on disk, read from its `NNNNN-settings.txt` and its `NNNNN-model.m` (`componentTags`, `testTags`), not from the SED-ML it also ships; `SemanticSuite` is a directory of cases with the download and the cache of a release under `~/.cache/sbmlsim/test-suite/<version>/` (`SBMLSIM_TEST_SUITE_PATH` overrides it). `SUITE_VERSION` pins the release the tests and the documentation run against, a release resolves `latest_version()` instead and `.github/workflows/testsuite-pin.yml` opens the pull request which adopts a newer one. `run_case` (`testsuite/runner.py`) simulates a case in the newest encoding it provides and answers with a `CaseResult` and its `CaseStatus` (`PASS`, `TOLERANCE`, `NOT_READ`, `SIMULATION_ERROR`, `MISSING_VARIABLE`) rather than raising; it simulates with `reset=False`, because a model with a species or parameter named `reset` hides the roadrunner method of that name for every instance created afterwards (case 00952). `compare_case` (`testsuite/comparison.py`) applies `comparison.diff.within_tolerance`, i.e. `|c-u| <= abs_tol + rel_tol*|c|`, which `DataSetsComparison` shares. `TestSuiteReport` (`testsuite/report.py`) renders the run into the interactive page `resources/templates/testsuite_report.html`, aggregated over the tags and filtered by outcome. `scripts/testsuite.py` is the command line (`download`, `run`, `report`, `baseline`, `submission`)
|
|
61
|
+
**`testsuite/` — the SBML Test Suite.** `SemanticCase` (`testsuite/cases.py`) is a semantic case on disk, read from its `NNNNN-settings.txt` and its `NNNNN-model.m` (`componentTags`, `testTags`), not from the SED-ML it also ships; `SemanticSuite` is a directory of cases with the download and the cache of a release under `~/.cache/sbmlsim/test-suite/<version>/` (`SBMLSIM_TEST_SUITE_PATH` overrides it). `SUITE_VERSION` pins the release the tests and the documentation run against, a release resolves `latest_version()` instead and `.github/workflows/testsuite-pin.yml` opens the pull request which adopts a newer one. `run_case` (`testsuite/runner.py`) simulates a case in the newest encoding it provides and answers with a `CaseResult` and its `CaseStatus` (`PASS`, `TOLERANCE`, `NOT_READ`, `SIMULATION_ERROR`, `MISSING_VARIABLE`) rather than raising; it simulates with `reset=False`, because a model with a species or parameter named `reset` hides the roadrunner method of that name for every instance created afterwards (case 00952). `compare_case` (`testsuite/comparison.py`) applies `comparison.diff.within_tolerance`, i.e. `|c-u| <= abs_tol + rel_tol*|c|`, which `DataSetsComparison` shares. `TestSuiteReport` (`testsuite/report.py`) renders the run into the interactive page `resources/templates/testsuite_report.html`, aggregated over the tags and filtered by outcome. `scripts/testsuite.py` is the command line (`download`, `run`, `report`, `baseline`, `submission`), `run_suite` and `write_submission` (`testsuite/submission.py`) run the cases in one process per core through `map_cases`; only the timecourse cases are run, once per case, and `tests/testsuite/test_semantic.py` is one test per case against `tests/data/testsuite_baseline.json`, which fails both on a regression and on a case which passes and is still listed. The cases carry the `testsuite` marker and `addopts` deselects it, so they are not part of a normal run: they answer what libroadrunner supports, which a change to `sbmlsim` rarely moves. The `testsuite` job of `ci-cd.yml` runs them on a tag and the release waits for it; the documentation generates the report on `develop` and not on a pull request.
|
|
63
62
|
|
|
64
63
|
`console.py` (rich console, for scripts and examples) and `log.py` provide the shared output/logging. Modules get their logger from the standard library with `logging.getLogger(__name__)`. The package never configures logging: `log.enable_rich_logging()` is the opt-in for scripts. Library code logs, it does not print, and log calls use lazy `%s` formatting rather than f-strings (enforced by ruff `G`).
|
|
65
64
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sbmlsim
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.3
|
|
4
4
|
Summary: sbmlsim are python utilities for the simulation of SBML models.
|
|
5
5
|
Project-URL: Homepage, https://matthiaskoenig.github.io/sbmlsim
|
|
6
6
|
Project-URL: Documentation, https://matthiaskoenig.github.io/sbmlsim
|
|
@@ -57,7 +57,7 @@ Requires-Dist: ruff>=0.16.10; extra == 'dev'
|
|
|
57
57
|
Requires-Dist: torch>=2.14.1; extra == 'dev'
|
|
58
58
|
Requires-Dist: tox-uv>=1.36.1; extra == 'dev'
|
|
59
59
|
Requires-Dist: tox>=4.64.9; extra == 'dev'
|
|
60
|
-
Requires-Dist: ty>=0.0.
|
|
60
|
+
Requires-Dist: ty>=0.0.85; extra == 'dev'
|
|
61
61
|
Requires-Dist: zensical>=0.0.68; extra == 'dev'
|
|
62
62
|
Provides-Extra: sciml
|
|
63
63
|
Requires-Dist: h5py>=3.16.0; extra == 'sciml'
|
|
@@ -20,12 +20,14 @@ A pull request can only be merged once the four required checks are green:
|
|
|
20
20
|
| check | workflow | content |
|
|
21
21
|
| ------- | ------------- | -------------------------------------------------------------------- |
|
|
22
22
|
| `tests` | `ci-cd.yml` | the test matrix, linux with python 3.13 and 3.14, macos and windows with 3.14 |
|
|
23
|
-
| `ruff` | `
|
|
24
|
-
| `ty` | `
|
|
23
|
+
| `ruff` | `lint.yml` | `ruff check` and `ruff format --check` |
|
|
24
|
+
| `ty` | `lint.yml` | `ty check` |
|
|
25
25
|
| `docs` | `docs.yml` | the zensical build including the api reference and the agent files |
|
|
26
26
|
|
|
27
27
|
`tests` aggregates the test matrix into a single job, so the name of the required check stays the same when the matrix changes.
|
|
28
28
|
|
|
29
|
+
Every job sets up its environment with the action `.github/actions/setup`: uv with its cache, the python of the job, the libpython roadrunner needs on linux, and `uv sync` with the extras of the job. The jobs run the same commands as a local environment (`pytest`, `ty check`, `zensical build`), the tests against the package installed as a wheel (`uv sync --no-editable`). A run of a pull request is cancelled by the next push to it; a push to `develop` or `main` is never cancelled, a release waits for the run of its commit.
|
|
30
|
+
|
|
29
31
|
Further rules of a pull request:
|
|
30
32
|
|
|
31
33
|
- conversations have to be resolved before the merge
|
|
@@ -98,13 +100,13 @@ The tox environments are named after the interpreter (`py3.13` to `py3.14`, see
|
|
|
98
100
|
tox r -e py3.14
|
|
99
101
|
```
|
|
100
102
|
|
|
101
|
-
and the complete matrix
|
|
103
|
+
and the complete matrix in parallel with
|
|
102
104
|
|
|
103
105
|
```bash
|
|
104
106
|
tox run-parallel
|
|
105
107
|
```
|
|
106
108
|
|
|
107
|
-
This needs the interpreters to be available, which uv installs with `uv python install 3.13 3.14`. Continuous integration runs the
|
|
109
|
+
This needs the interpreters to be available, which uv installs with `uv python install 3.13 3.14`. Continuous integration does not use tox, it runs `pytest` in an environment of the python of the job, see [pull requests](#pull-requests).
|
|
108
110
|
|
|
109
111
|
To run the tests directly against the development environment use
|
|
110
112
|
|
|
@@ -115,7 +117,7 @@ pytest tests/simulation/test_simulation.py # a single module
|
|
|
115
117
|
pytest tests/simulation/test_simulation.py::test_timecourse # a single test
|
|
116
118
|
```
|
|
117
119
|
|
|
118
|
-
The tests run in parallel,
|
|
120
|
+
The tests run in parallel, `-n auto --dist worksteal` in the `addopts` of `pyproject.toml` gives pytest-xdist one worker per core, and a worker which is idle takes over the tests which wait at a busy one; `-n 0` on the command line runs everything in one process, which the debugger needs.
|
|
119
121
|
|
|
120
122
|
The `conftest.py` at the root of the repository selects the non-interactive matplotlib backend for the session and puts the repository on `sys.path`, so that the tests can import the examples.
|
|
121
123
|
|
|
@@ -139,14 +141,10 @@ The docstring rules (`D`) are enforced for the package, not for `examples/` and
|
|
|
139
141
|
Type checking is performed with [ty](https://docs.astral.sh/ty/):
|
|
140
142
|
|
|
141
143
|
```bash
|
|
142
|
-
|
|
144
|
+
uv run ty check
|
|
143
145
|
```
|
|
144
146
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
```bash
|
|
148
|
-
uvx ty check
|
|
149
|
-
```
|
|
147
|
+
ty resolves the imports in the environment of the project, which `uv sync --extra dev` creates; the `ty` check of continuous integration runs the same command and the pre-commit hook runs it on every commit.
|
|
150
148
|
|
|
151
149
|
The configuration lives in `[tool.ty]` in `pyproject.toml`. Warnings are treated as errors, so the codebase is kept free of diagnostics. Suppress an unavoidable diagnostic with a rule specific `# ty: ignore[rule-name]` rather than a blanket comment.
|
|
152
150
|
|
|
@@ -206,7 +204,7 @@ A release is made from `develop`. Since `develop` only accepts pull requests, th
|
|
|
206
204
|
|
|
207
205
|
1. branch off `develop`: `git switch -c release/x.y.z develop`
|
|
208
206
|
2. write the release notes for the version in `release-notes/x.y.z.md`
|
|
209
|
-
3. make sure everything passes: `tox run-parallel`, `ruff check`, `
|
|
207
|
+
3. make sure everything passes: `tox run-parallel`, `ruff check`, `uv run ty check`
|
|
210
208
|
4. check the version bump: `uvx bump-my-version bump [major|minor|patch] --dry-run -vv`
|
|
211
209
|
5. bump the version: `uvx bump-my-version bump [major|minor|patch]`, which updates `src/sbmlsim/__init__.py` and `CITATION.cff` and commits. It does not create the tag; a squash or rebase merge would rewrite the commit and leave the tag behind on a commit which is not part of `develop`
|
|
212
210
|
6. push the branch, open the pull request against `develop` and merge it once the checks are green
|
|
@@ -219,7 +217,7 @@ A release is made from `develop`. Since `develop` only accepts pull requests, th
|
|
|
219
217
|
git push origin x.y.z
|
|
220
218
|
```
|
|
221
219
|
|
|
222
|
-
This starts the `CI-CD` workflow, which
|
|
220
|
+
This starts the `CI-CD` workflow, which publishes to [pypi](https://pypi.org/project/sbmlsim/), creates the GitHub release from `release-notes/x.y.z.md` and fast-forwards `main` to the tagged commit. It does not run the test matrix again: the merge into `develop` ran it on the same commit, and the job `tested on develop` waits for that run and stops the release unless it passed, so the tag can be pushed right after the merge. Next to it the SBML Test Suite and the PEtab SciML test suite run against their pins and the submission to the SBML Test Suite Database is written, which the release attaches; a release takes a few minutes once the run on `develop` has finished. Check the version before pushing, a tag cannot be moved or deleted afterwards.
|
|
223
221
|
|
|
224
222
|
8. test the installation from pypi in a fresh environment:
|
|
225
223
|
|
|
@@ -80,7 +80,7 @@ groups = [
|
|
|
80
80
|
|
|
81
81
|
## Running an analysis
|
|
82
82
|
|
|
83
|
-
Every analysis is created with the simulation, the parameters, the groups and a `results_path`; `execute` creates the samples, simulates them (in parallel on `n_cores`, cached with `cache_results=True`) and computes the sensitivities, `plot` writes the figures into the results path:
|
|
83
|
+
Every analysis is created with the simulation, the parameters, the groups and a `results_path`; `execute` creates the samples, simulates them (in parallel on `n_cores`, one pool of processes for all groups, in the process itself for `n_cores=1`, cached with `cache_results=True`) and computes the sensitivities, `plot` writes the figures into the results path. The `seed` decides the samples and the bootstrap of the confidence intervals, so an analysis is reproducible:
|
|
84
84
|
|
|
85
85
|
```python
|
|
86
86
|
from pathlib import Path
|
|
@@ -137,4 +137,4 @@ An output which does not vary over the samples has no Sobol or FAST indices: the
|
|
|
137
137
|
|
|
138
138
|
The sensitivities are stored as `xarray.DataArray` objects per group and key (`sa.sensitivity[group_id][key]`), returned as data frames with `sensitivity_df`, and written as tables and figures into the results path. `sbmlsim.sensitivity.classification` groups parameters by their sensitivities across outputs.
|
|
139
139
|
|
|
140
|
-
The complete example with all methods is `examples/sensitivity/sensitivity_example.py
|
|
140
|
+
The complete example with all methods is `examples/sensitivity/sensitivity_example.py`; `--cores` sets the number of processes and `--quick` runs it with the smallest samples every method accepts, which shows that it runs and not what the parameters do.
|