Skip to main content

causal-automata

PyPI Version Python Versions License

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:

  1. Gravity — keep only downhill edges (E[parent] > E[child]), then drift elevations toward the midpoint of parent/child means.
  2. 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-structure i → k ← j.
  3. Death / birth — kill weak edges and birth strong ones using partial correlations conditioned on the top-k union 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)

Source distribution for causal-automata 0.1.2
File Size Uploaded
causal_automata-0.1.2.tar.gz 20.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for causal-automata 0.1.2
File Interpreter ABI Platform
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}

Release history Release notifications | RSS feed

This release

0.1.2 This release

2 release files

0.1.1

2 release files

0.1.0

2 release 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