Skip to main content
        .   °                .......                                     °   
       |  |                :.   .:                                   (   )
       | °  |                .'   '.                                    |°  |
       |° . |                |     |                                     ° \
      (______)               `_____'                                  (_______) 
▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
  ▄▄▄▄▄▄▄▄▄   ▄▄▄▄▄▄▄▄▄▄  ▄▄          ▄▄▄▄▄▄▄▄▄▄            ▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄ 
 ▐░░░░░░░░░▌ ▐░░░░░░░░░░▌▐░░▌      ▐░▌▐░░░░░░░░░░▌▐░▌      ▐░▌▐░░░░░░░░░░▌▐░░░░░░░░░░▌▐░░░░░░░░░░▌
 ▐░█▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀ ▐░▌░▌     ▐░▌▐░█▀▀▀▀▀▀▀▀ ▐░▌      ▐░▌ ▀▀▀▀█░█▀▀▀ ▐░█▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀█░▌
 ▐░█▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄▄ ▐░▌ ▐░▌   ▐░▌▐░▌         ▐░█▄▄▄▄▄▄█░▌     ▐░▌    ▐░▌      ▐░▌▐░█▄▄▄▄▄▄█░▌
 ▐░░░░░░░░░▌ ▐░░░░░░░░░░▌▐░▌  ▐░▌  ▐░▌▐░▌         ▐░░░░░░░░░░▌     ▐░▌    ▐░▌      ▐░▌▐░░░░░░░░░░▌
 ▐░█▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀ ▐░▌   ▐░▌ ▐░▌▐░▌         ▐░█▀▀▀▀▀▀█░▌     ▐░▌    ▐░▌      ▐░▌▐░█▀▀▀▀▀▀▀▀ 
 ▐░█▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄▄ ▐░▌     ▐░▐░▌▐░█▄▄▄▄▄▄▄▄ ▐░▌      ▐░▌     ▐░▌    ▐░█▄▄▄▄▄▄█░▌▐░▌          
 ▐░░░░░░░░░▌ ▐░░░░░░░░░░▌▐░▌      ▐░░▌▐░░░░░░░░░░▌▐░▌      ▐░▌     ▐░▌    ▐░░░░░░░░░░▌▐░▌          
  ▀▀▀▀▀▀▀▀▀   ▀▀▀▀▀▀▀▀▀▀          ▀▀  ▀▀▀▀▀▀▀▀▀▀                       ▀▀▀▀▀▀▀▀▀▀             

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.

Documentation

Full documentation: https://benchtop.readthedocs.io/en/latest/

Sphinx sources live in docs/. To build locally after pip install -e ".[docs]":

python -m sphinx -b html docs docs/_build/html

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]
  1. FileLoader reads the benchmark YAML and loads PEtab TSV/SBML files into memory.
  2. Organizer builds a dependency-aware task list (conditions × cell replicates) and assigns work to workers.
  3. Workers load the SBML model, apply condition parameters, run preequilibration when needed, and simulate.
  4. ResultCache stores raw trajectories as pickle files alongside a JSON index.
  5. ObservableCalculator downsamples trajectories, evaluates observable formulas, and packages results next to experimental data.

Requirements

Installation

Benchtop is registered on PyPI and pip installable:

pip install benchtop

To build from source,navigate to 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_confirm Overwrite an existing cache directory without erroring
--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.calculate_observables()

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:

  • conditionId and cell replicate index
  • Per-observable experiment, simulation, and time arrays

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

License

See LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

benchtop-0.1.3.tar.gz (34.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

benchtop-0.1.3-py3-none-any.whl (45.7 kB view details)

Uploaded Python 3

File details

Details for the file benchtop-0.1.3.tar.gz.

File metadata

  • Download URL: benchtop-0.1.3.tar.gz
  • Upload date:
  • Size: 34.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for benchtop-0.1.3.tar.gz
Algorithm Hash digest
SHA256 726a6344c2175ebe194420850e5b12cd8ac97b1c7250bf0ad9c72cefc81b54d4
MD5 83af49420b92820603fb1e7d6a73d50f
BLAKE2b-256 1e7d94b511ea6f24e969402b8a7c2ba7d794fa019802891cf2076671ccb7c053

See more details on using hashes here.

Provenance

The following attestation bundles were made for benchtop-0.1.3.tar.gz:

Publisher: publish.yml on JonahRileyHuggins/Benchtop

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file benchtop-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: benchtop-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 45.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for benchtop-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 de8e72d990bed8618c7ccc6d082bd900f00009be254c926afc1792974c1ce4ae
MD5 a09f9ececb1f92abeb41f1f22690459b
BLAKE2b-256 3059167ff93d98e3f7f92339ebd0f95e54ec3dd388ee21aad30c8e164c693500

See more details on using hashes here.

Provenance

The following attestation bundles were made for benchtop-0.1.3-py3-none-any.whl:

Publisher: publish.yml on JonahRileyHuggins/Benchtop

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.1.4.1

2 files

0.1.4

2 files

This release

0.1.3 This release

2 files

0.1.2.2

2 files

0.1.2.1

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page