causal-automata
A blazing-fast, JAX-accelerated Cellular Automaton engine for causal discovery.
Installation
pip install causal-automata
With CPU JAX:
pip install "causal-automata[jax]"
With NVIDIA CUDA JAX (and the Colab-style stack):
pip install "causal-automata[cuda]"
Or using uv:
uv add "causal-automata[jax]"
Benchmark — N=100 on Tesla T4
Final figures (Colab Tesla T4, GOLEM num_iter=20000):
| Algorithm | Skeleton F1 | Directed F1 | Wall Time (s) |
|---|---|---|---|
| PC (gcastle) | 0.968 | 0.813 | 528.631 |
| GOLEM (gcastle) | 0.577 | 0.403 | 251.182 |
| Bayesian CA (JAX) | 0.812 | 0.483 | 0.323 |
In this setup, Bayesian CA runs in 0.323s, compared with 251.182s for GOLEM and 528.631s for PC, with skeleton / directed F1 of 0.812 / 0.483 versus GOLEM 0.577 / 0.403 (PC: 0.968 / 0.813).
Documentation
Full docs (theory, physics, API, CLI): https://causal-automata.readthedocs.io/en/latest/
How it works — CA physics + V-well
State is a binary DAG adjacency A, node elevations E ∈ [0,1], and a fixed empirical covariance Cov from continuous observations. Each tick is a local cellular update:
- Gravity — keep only downhill edges (
E[parent] > E[child]), then drift elevations toward the midpoint of parent/child means. - V-structure gravity well — absent undirected pairs that share neighbors and are marginally independent (
|ρ|below the death threshold with empty conditioning set) mark shared neighbors as colliders. Those elevations are sunk (E -= 2·lr), so later birth prefers arrows into the collider — the classic V-structurei → k ← j. - Death / birth — kill weak edges and birth strong ones using partial correlations conditioned on the top-
kunion neighbors ranked by|Cov|. Birth orients by elevation after the|ρ|gate.
The NumPy prototype (bayesian.step) and the pure functional JAX port (jax_core.step, @jax.jit) share this physics.
Run
# Synthetic DAG harness (NumPy default; use --backend jax for JIT)
python -m causal_automata.bayesian_synth --n 10
python -m causal_automata.bayesian_synth --n 50 --backend jax
python -m causal_automata.bayesian_synth --n 100
# Benchmark vs gCastle PC / GOLEM (default N=100)
python -m causal_automata.benchmark
python -m causal_automata.benchmark --n 100 --seed 0 --ticks 100
python -m causal_automata.benchmark --smoke # device checks + GOLEM init only
Smoke the JAX compile:
python -c "from causal_automata import warmup; print(warmup())"
Package layout
causal-automata/
├── causal_automata/
│ ├── __init__.py
│ ├── bayesian.py # NumPy Bayesian CA step
│ ├── bayesian_synth.py # Synthetic linear-DAG harness
│ ├── jax_core.py # JAX @jit port of step
│ └── benchmark.py # vs gCastle PC / GOLEM
├── docs/ # Sphinx / Read the Docs
├── .readthedocs.yaml
├── pyproject.toml
├── README.md
└── NOTICE
License / notice
See NOTICE. Copyright 2026 Masakazu Yamagiwa.
Metadata
Release files for causal-automata 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| causal_automata-0.1.2.tar.gz | 20.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| causal_automata-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 42.6 kB
Release files / causal_automata-0.1.2.tar.gz
| Download URL | causal_automata-0.1.2.tar.gz |
|---|---|
| Size | 20.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3191697bcd1a2a605f6959f4c42d8db489f7f493ae479cd23e0c72bd6b7b810e
|
|
BLAKE2b-256 checksum How to use checksums |
eccb4412006a7bd7ae227d8792e56b125d8e95f063ec4fbbd7359fca12929c02
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / causal_automata-0.1.2-py3-none-any.whl
| Download URL | causal_automata-0.1.2-py3-none-any.whl |
|---|---|
| Size | 21.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
32cfbb529a8d541ebe230ffc96ace93d42d8317af9a0169591130865edaa00bb
|
|
BLAKE2b-256 checksum How to use checksums |
2e289a738962943b42549ff365d30e0bae750af5ba49b4a4dec6e9fa5593f3c9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|