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 invariants, the particle filter (convergence, resampling variants, the evidence-vs-direct-computation identity, weight-collapse handling), the noise model, the public API surface, and every animator; two long-running 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.yml runs tests and lint on every push to main and on every pull request.
  • site.yml re-renders and redeploys this site on every push to main, 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: they are pre-rendered, committed assets, reproducible on your machine via the uv run demo-* commands (the range-study PNG via uv run scripts/scan_echolocation_range.py --seed-block 300, the certification block the published figure used; see the echolocation page).

Locked dependencies

uv.lock is committed; CI enforces it (--locked in ci.yml, --frozen in the site build). The environment that rendered this page is the environment the lockfile describes, down to the patch version.