A tool for running simulation experiments formated as PEtab Problems.
Project description
. ° ....... °
| .° | :. .: ( .° )
| ° | .' '. |° |
|° . | | | /° ° \
(______) `_____' (_______)
▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄ ▄▄ ▄ ▄▄▄▄▄▄▄▄▄▄ ▄ ▄ ▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄
▐░░░░░░░░░▌ ▐░░░░░░░░░░▌▐░░▌ ▐░▌▐░░░░░░░░░░▌▐░▌ ▐░▌▐░░░░░░░░░░▌▐░░░░░░░░░░▌▐░░░░░░░░░░▌
▐░█▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀ ▐░▌░▌ ▐░▌▐░█▀▀▀▀▀▀▀▀ ▐░▌ ▐░▌ ▀▀▀▀█░█▀▀▀ ▐░█▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀█░▌
▐░█▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄▄ ▐░▌ ▐░▌ ▐░▌▐░▌ ▐░█▄▄▄▄▄▄█░▌ ▐░▌ ▐░▌ ▐░▌▐░█▄▄▄▄▄▄█░▌
▐░░░░░░░░░▌ ▐░░░░░░░░░░▌▐░▌ ▐░▌ ▐░▌▐░▌ ▐░░░░░░░░░░▌ ▐░▌ ▐░▌ ▐░▌▐░░░░░░░░░░▌
▐░█▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀ ▐░▌ ▐░▌ ▐░▌▐░▌ ▐░█▀▀▀▀▀▀█░▌ ▐░▌ ▐░▌ ▐░▌▐░█▀▀▀▀▀▀▀▀
▐░█▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄▄ ▐░▌ ▐░▐░▌▐░█▄▄▄▄▄▄▄▄ ▐░▌ ▐░▌ ▐░▌ ▐░█▄▄▄▄▄▄█░▌▐░▌
▐░░░░░░░░░▌ ▐░░░░░░░░░░▌▐░▌ ▐░░▌▐░░░░░░░░░░▌▐░▌ ▐░▌ ▐░▌ ▐░░░░░░░░░░▌▐░▌
▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀ ▀ ▀▀ ▀▀▀▀▀▀▀▀▀▀ ▀ ▀ ▀ ▀▀▀▀▀▀▀▀▀▀ ▀
Benchtop
Parallel in-silico experiments for biological models
Benchtop runs simulation benchmarks defined in a PEtab-inspired format. Given a YAML configuration and companion TSV/SBML files, it schedules conditions in dependency order, simulates across multiple CPU cores, caches intermediate results, and computes observables for model–data comparison.
Features
- PEtab-style benchmarks — Define experiments with YAML plus standard TSV files for conditions, measurements, observables, and parameters.
- Parallel execution — Distributes simulation tasks across processes using a round-robin worker pool.
- Preequilibration support — Topologically sorts conditions so preequilibration runs before dependent simulations.
- Single-cell replication — Run multiple stochastic replicates per condition via
cell_count. - Result caching — Persists per-simulation pickle files and a cache index; supports resuming incomplete runs.
- Observable calculation — Evaluates observable formulas from simulation trajectories and aligns them with experimental measurements.
- Pluggable simulators — Built-in Tellurium wrapper; optional AMICI support via extras.
How it works
flowchart LR
YAML[Benchmark YAML] --> Loader[FileLoader]
Loader --> Exp[Experiment]
Exp --> Org[Organizer]
Org -->|topological task order| Pool[Worker pool]
Pool --> Sim[Simulator wrapper]
Sim --> Cache[ResultCache]
Cache --> Obs[ObservableCalculator]
Obs --> Results[results/*.pkl]
- FileLoader reads the benchmark YAML and loads PEtab TSV/SBML files into memory.
- Organizer builds a dependency-aware task list (conditions × cell replicates) and assigns work to workers.
- Workers load the SBML model, apply condition parameters, run preequilibration when needed, and simulate.
- ResultCache stores raw trajectories as pickle files alongside a JSON index.
- ObservableCalculator downsamples trajectories, evaluates observable formulas, and packages results next to experimental data.
Requirements
- Python ≥ 3.12
- See pyproject.toml for pinned dependencies
Installation
From the repository root:
pip install -e .
For AMICI support (optional):
pip install -e ".[amici]"
This installs the benchtop CLI entry point.
Quick start
Command line
Run a single benchmark:
benchtop experiment -p src/tests/data/LR-benchmark.yaml -s tellurium -c 4
Run all benchmarks in a directory:
benchtop experiment --run_all path/to/benchmarks/ -s tellurium
Useful flags:
| Flag | Description |
|---|---|
-p, --path |
Path to benchmark YAML |
-s, --simulator |
Simulator backend (tellurium or amici) |
-c, --cores |
Number of parallel processes (default: CPU count) |
--cache_dir |
Directory for simulation cache (default: ./.cache) |
--load_index |
Resume from an existing cache index |
--No_Observables |
Skip observable calculation after simulation |
-v, --verbose |
Enable debug logging |
Python API
from benchtop.experiment import Experiment
experiment = Experiment(
"src/tests/data/LR-benchmark.yaml",
cores=4,
cache_dir="./.cache",
verbose=True,
)
experiment.run("tellurium")
experiment.observable_calculation()
You can also pass a custom simulator class that extends AbstractSimulator instead of a registry name.
A worked example is available in demo/in-silico-experiment-demo.ipynb.
Benchmark configuration
A benchmark is a directory containing a YAML file that references PEtab-style data files. Example (src/tests/data/LR-benchmark.yaml):
format_version: 1
parameter_file: LR Model - Parameters.tsv
problems:
- name: test-benchmark
condition_files:
- conditions.tsv
measurement_files:
- measurements.tsv
observable_files:
- observables.tsv
sbml_files:
- LR-model.xml
cell_count: 3
Note: The cell_count attribute is only applicable to Benchtop and specifies the number of replicates to simulate per-condition.
Data files
| File | Purpose |
|---|---|
| Parameter TSV | Model parameters (parameterId, parameterScale, nominalValue, …) |
| conditions.tsv | Simulation conditions — maps conditionId to parameter overrides |
| measurements.tsv | Links observables to conditions, optional preequilibration, and measurement timepoints |
| observables.tsv | Observable definitions (observableId, observableFormula, noiseFormula) |
| SBML | One or more model files (.xml or .sbml) |
When preequilibrationConditionId is set in measurements.tsv, Benchtop runs the preequilibration condition first and uses its final state as the initial condition for the simulation.
Results
After observable calculation, results are written as a pickle file in a results/ subdirectory next to the benchmark YAML (named after the problem or today's date). Each entry in the results dictionary contains:
conditionIdandcellreplicate index- Per-observable
experiment,simulation, andtimearrays
Simulators
Benchtop uses a small registry of simulator wrappers in src/wrappers/. Each wrapper implements AbstractSimulator with load, modify, and simulate methods.
| Name | Class | Install |
|---|---|---|
tellurium |
TelluriumSimulator |
Included by default |
amici |
AmiciSimulator |
pip install -e ".[amici]" |
To add a new backend, create a wrapper under src/wrappers/ and register it in src/benchtop/registry.py.
Project structure
Benchtop/
├── demo/ # Jupyter notebook walkthrough
├── src/
│ ├── benchtop/ # Core library
│ │ ├── experiment.py # Main experiment orchestrator
│ │ ├── _organizer.py # Task scheduling and topological sort
│ │ ├── _worker.py # Per-simulation worker logic
│ │ ├── _record.py # Results dictionary management
│ │ ├── _results_cacher.py # Pickle cache and index
│ │ ├── _observable_calculator.py
│ │ ├── _abstract_simulator.py # Simulator interface
│ │ ├── file_loader.py # YAML and TSV loading
│ │ ├── registry.py # Simulator lookup
│ │ ├── launcher.py # CLI entry point
│ │ └── arguments.py # CLI argument parsing
│ ├── wrappers/ # Simulator backends
│ └── tests/ # Test suite and example data
├── pyproject.toml
└── README.md
Running tests
From the repository root:
cd src/tests
python run_tests.py
The test suite uses the LR receptor benchmark in src/tests/data/ and exercises experiment execution, caching, workers, organizers, records, and observable calculation.
Authors
- Jonah Huggins — JonahRileyHuggins@gmail.com
- Marc Birtwistle — marc.birtwistle@gmail.com
License
See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file benchtop-0.1.0.tar.gz.
File metadata
- Download URL: benchtop-0.1.0.tar.gz
- Upload date:
- Size: 33.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
77e704ca8244778005ff3b8131de458b55fb5e35e1882d65954a52704c23d585
|
|
| MD5 |
7d7fd95b1caedba3e82e33cd5f4bfd5c
|
|
| BLAKE2b-256 |
5fd5a18953e7081782bc3b52110ae3937718d9b1b31bb82bdb99ab2377d8c6fd
|
File details
Details for the file benchtop-0.1.0-py3-none-any.whl.
File metadata
- Download URL: benchtop-0.1.0-py3-none-any.whl
- Upload date:
- Size: 43.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4f44355599f45ba51520d18df9577dfeab8a21ba054b9a5be1d06102226eb267
|
|
| MD5 |
0be7a953ef74449e35d8a39028749b30
|
|
| BLAKE2b-256 |
b6800801966e3c3861266d4d50089caf50c67bb5d8b54b8c04cf3acfdfc6422f
|