Reproducibility
Seeds everywhere
Every demo and every executed cell on this site fixes its RNG seed. SimulationConfig.seed and InferenceConfig.seed thread a single generator through observation noise and the particle filter respectively, so a given configuration produces the same observations, the same particle trajectories, and the same posterior every time. Rerun any page’s code with the seeds shown and you will get the numbers printed on the page.
Tests
The default suite — uv run pytest — covers the forward model’s physical domain, public data contracts, all resampling variants, adaptive tempering, conjugate evidence checks, MH invariance and rejection, observation atomicity, prior support, contrast-space likelihoods, the public API, wheel entry points, and visualization. Long-running fixed-seed acceptance scans are excluded by default (uv run pytest -m slow runs them). See tests/ for the current inventory; the README deliberately does not quote a test count, because hardcoded counts go stale.
CI
Two workflows run on GitHub Actions:
ci.ymlruns tests and lint on every push tomainand on every pull request.site.ymlre-renders and redeploys this site on every push tomain, so every executed-cell figure you see is regenerated from source at deploy time. The demo GIFs, the density PNG, and the echolocation range-study PNG are the exceptions: the currently committed copies were generated explicitly from the corrected code after one-shot certification. Theuv run demo-*commands regenerate their scenarios, but image encoders are not claimed to be byte-deterministic across tool versions. The development range grid usesuv run scripts/scan_echolocation_range.py --seed-block 0; its controls and tolerances are frozen, and the reserved 400–411 block was run exactly once. See the echolocation page.
The protected fixed-seed results establish deterministic regression cases, not a population reliability estimate. SMC evidence is similarly a consistent Monte Carlo estimator with finite-particle sampling error, not a deterministic exact integral.
Locked Python dependencies
uv.lock is committed; CI enforces the Python package resolution with --locked in ci.yml and --frozen in the site build. The lock covers package versions for its supported Python-version markers. It does not pin the Python interpreter’s patch release or the separately installed Quarto binary, so the repository does not claim a fully bit-reproducible rendering toolchain.