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 |
Bayesian CA is ~778× faster than GOLEM and ~1636× faster than PC, while beating GOLEM on both skeleton (0.812 vs 0.577) and directed (0.483 vs 0.403) F1.
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.1
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.1.tar.gz | 20.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| causal_automata-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 42.5 kB
Release files / causal_automata-0.1.1.tar.gz
| Download URL | causal_automata-0.1.1.tar.gz |
|---|---|
| Size | 20.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d3cda1c987b6ec9a908d7064c1e6c8eeeec1f3b260dcd19beb22624e38c056b2
|
|
BLAKE2b-256 checksum How to use checksums |
b4a63feb1ab6a20e18ca83e61a6a10c28080638bd76cde35ea845c7647f6a5a6
|
| 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.1-py3-none-any.whl
| Download URL | causal_automata-0.1.1-py3-none-any.whl |
|---|---|
| Size | 21.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
de9cc48d18f65e15e954bf0b42662a5edca502ad2dc809eb6d01ca828ed4dec8
|
|
BLAKE2b-256 checksum How to use checksums |
d0daa087425fad7e44b57ff7b34aff708df36c0c2339b9c78eb31f6694605408
|
| 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}
|