A JAX library for state-space model inference (filtering, smoothing, static parameter estimation).
Disclaimer: The name
cuthbertwas chosen as a playful nod to the well-known caterpillar cake rivalry between Aldi and M&S in the UK, as the classic state-space model diagram looks vaguely like a caterpillar. However, this software project has no formal connection to Aldi, M&S, or any food products (notwithstanding the coffee drunk during its writeup).cuthbertis simply a fun name for this state-space model library and should not be interpreted as an endorsement, association, or affiliation with any brand or animal themed baked goods.
If you want to jump right in, check out our examples. Maybe a simple Kalman filter for tracking or a factorial state-space model for modelling international football.
Goals
- Simple, flexible and performant interface for state-space model inference.
- Decoupling of model specification and inference.
cuthbertis built to swap between different inference methods without be tied to a specific model specification. - Compose with the JAX ecosystem for extensive external tools.
- Functional API: The only classes in
cuthbertareNamedTuples andProtocols. All functions are pure and work seamlessly withjax.grad,jax.jit,jax.vmapetc. - Methods for filtering: $p(x_t \mid y_{1:t}, \theta)$.
- Methods for smoothing: $p(x_{0:T} \mid y_{1:T}, \theta)$ or $p(x_{t} \mid y_{1:T}, \theta)$.
- Methods for static parameter estimation: $p(\theta \mid y_{1:T})$ or $\text{argmax} p(y_{1:T} \mid \theta)$.
- This includes support for forward-backward/Baum-Welch, particle filtering/sequential Monte Carlo, Kalman filtering (+ extended/unscented/ensemble), expectation-maximization and more!
Non-goals
- Tools for defining models and distributions.
cuthbertis not a probabilistic programming language (PPL). But can easily compose withdynamax,distrax,numpyroandpymcin a similar way to howblackjaxdoes. - "SMC Samplers" which sample from a posterior
distribution which is not (necessarily) a state-space model -
blackjaxis great for this.
Codebase structure
The codebase is structured as follows:
cuthbert: The main package with unified interface for filtering and smoothing.cuthbertlib: A collection of atomic, smaller-scoped tools useful for state-space model inference, that represent the building blocks that power the maincuthbertpackage.
docs: Source code for the documentation forcuthbertandcuthbertlib.pkg: Packaging configuration for publishingcuthbertandcuthbertlibto PyPI.tests: Tests for thecuthbertandcuthbertlibpackages.
Installation
cuthbert depends on JAX, so you'll need to install JAX for the available hardware (CPU, GPU, or TPU).
For example, on computers with NVIDIA GPUs:
pip install -U "jax[cuda13]"
From PyPI
pip install -U cuthbert
Installing cuthbert will also install cuthbertlib.
You can also install cuthbertlib on its own:
pip install -U cuthbertlib
Local development (uv)
git clone https://github.com/state-space-models/cuthbert.git
cd cuthbert
uv sync --package cuthbert --extra tests
Local development (pip)
git clone https://github.com/state-space-models/cuthbert.git
cd cuthbert
pip install -e ./pkg/cuthbertlib
pip install -e "./pkg/cuthbert[tests]"
Ecosystem
cuthbertis built on top ofjaxand composes easily with other JAX packages, e.g.optaxfor optimization,flaxfor neural networks, andblackjaxfor (SG)MCMC as well as the PPLs mentioned above.- What about
dynamax?dynamaxis a great library for state-space model specification and inference with discrete or Gaussian state-space models.cuthbertis focused on inference with arbitrary state-space models via e.g. SMC that is not supported indynamax. However as they are both built onjaxthey can be used together! Adynamaxmodel can be passed tocuthbertfor inference.
- And
particles?particlesand the accompanying book Sequential Monte Carlo Methods in Practice are wonderful learning materials for state-space models and SMC.cuthbertis more focused on performance and composability with the JAX ecosystem.
- Much of the code in
cuthbertis built on work fromsqrt-parallel-smoothers,mocatandabile.
Contributing
We're always looking for contributions! Check out the contributing guide for more information.
Metadata
Release files for cuthbert 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cuthbert-0.1.0.tar.gz | 42.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cuthbert-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 110.5 kB
Release files / cuthbert-0.1.0.tar.gz
| Download URL | cuthbert-0.1.0.tar.gz |
|---|---|
| Size | 42.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
05ff923979c00032d299f47a3c9238b2a8d2466bafa75536f8e992752234db32
|
|
BLAKE2b-256 checksum How to use checksums |
9e6a2a86be76523e8177b88f37809d4b9d9ee83fdf845e52807d8eb219b32357
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 18, 2026.
Transparency logRelease files / cuthbert-0.1.0-py3-none-any.whl
| Download URL | cuthbert-0.1.0-py3-none-any.whl |
|---|---|
| Size | 67.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fba1c458d677948197c0eaee69abd9548099e3b239b3aee8b29b5aea05c318f0
|
|
BLAKE2b-256 checksum How to use checksums |
9975d8c7ee7f43c64add590603327eebf982d6818c05e8a165924583180ee503
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 18, 2026.
Transparency log