Skip to content

v3.2.0 — Exemplar Gold Standard

Choose a tag to compare

@docxology docxology released this 02 Sep 18:35
· 1501 commits to main since this release
fa06d80

Compare: v3.1.0...v3.2.0

Exemplar Gold Standard. Every exemplar GNN file renders and executes on
every framework that can represent it and is explicitly flagged unsupported
(not faked, not failed) on the ones that cannot. Continuous-state exemplars
are genuinely continuous (linear-Gaussian) with native JAX / NumPyro /
PyTorch / Stan / RxInfer.jl backends; the Stan renderer is rewritten from a
non-compiling stub into runnable HMM and LGSSM programs with a cmdstanpy
executor; Step 12 summaries merge across input folders; the Julia pre-exec
gate no longer blocks scripts on a toolchain-less launcher.

Verified end to end on macOS with Julia 1.12.7 (RxInfer 5.5.0,
ActiveInference.jl 0.1.2), CmdStan 2.39 and an ephemeral torch: 29 files,
249 renders OK / 0 failed / 12 unsupported; 194 executions OK / 0 failed /
55 dependency skips (torch, bnlearn); PyTorch 29/29 via
uv run --with torch; pytest 3120 passed.

Changed (2026-09-01 — exemplar gold standard: continuous models are continuous, Stan is real)

  • Continuous exemplars are now genuinely continuous. The three files under
    input/gnn_files/continuous/ declare only the linear-Gaussian state-space
    model (x, y, optional u, F/H/Q/R, prior_mean/prior_cov, optional
    goal_mean/control_gain) — the discretized POMDP stand-ins introduced on
    2026-08-03 are gone. continuous_navigation is a closed-loop navigator
    (u_t = 0.3 · (goal − μ_t)); the other two are passive. Extractor
    (gnn/pomdp_extractor.py) reads dimensions from F/H and sets
    model_kind = "continuous"; the render processor passes the block through
    verbatim instead of building canonical A/B/C/D.
  • unsupported is a first-class render status. Frameworks that cannot
    represent a model kind (PyMDP, ActiveInference.jl, DisCoPy, bnlearn on continuous
    models) return {"unsupported": true, "status": "unsupported"} with the
    reason "continuous-state model: … supports discrete POMDPs only". They are
    excluded from the success denominator, listed under
    unsupported_framework_renderings, and never handed to Step 12.
    framework_registry entries carry supports_continuous.
  • Native continuous backends. JAX, NumPyro, PyTorch and Stan render and
    execute the LGSSM (online Kalman filter, Joseph-form update, closed-loop
    control) via the shared generator render/continuous_script.py; NumPyro
    additionally fits the same model with NUTS (mcmc_posterior_means,
    mcmc_r_hat_max). RxInfer.jl's existing continuous strategy is reached
    without the A/B/C/D canonicalisation guard. Verified end to end on this
    machine for all five.
  • Stan renderer rewritten (render/stan/stan_renderer.py). The previous
    generator emitted target ~ normal(source, 1.0) per edge with undeclared
    variables and could not compile. Discrete models now render an HMM whose
    latent chain is marginalised with the forward algorithm and whose per-state
    observation distributions carry Dirichlet priors centred on the declared
    A; continuous models render the explicit Kalman marginal likelihood. Each
    render emits <stem>_stan.stan plus a cmdstanpy driver <stem>_stan.py.
    New execute/stan/ runner, stan added to Step 12 discovery and to
    utils.framework_availability (skips with uv sync --extra stan), new
    optional extra stan = ["cmdstanpy>=1.2"]. render_stan() remains as a
    declaration-only sketch.

Fixed (2026-09-01)

  • Step 12 summary no longer overwritten per input folder.
    execute/processor.py merges the prior execution_summary.json (details
    keyed by script path; counts, per-framework status and overall status
    recomputed) so the durable summary covers every folder, mirroring Step 11.
  • Julia pre-exec gate false positive. A julia launcher without a
    working toolchain made Meta.parseall return a non-zero exit with no
    GNN_PARSE_FAIL marker; the gate treated that as malformed code and blocked
    every Julia script. The probe now degrades to the advisory regex sweep
    unless the parser itself reported a failure.
  • INDEX.md excluded from model discovery (gnn/discovery.py), fixing
    four tests that counted 30 exemplars instead of 29.
  • CI hygiene. ruff format drift across 45 files cleared; Bandit B108
    (hard-coded /tmp in the CLI models command) replaced with
    tempfile.gettempdir(); the two Julia-live test modules now skip when the
    committed Julia project environments are not instantiated (CI ships julia
    without RxInfer/ActiveInference.jl); the framework-availability test honours
    toolchain probes; repository-terminology audit clean.
  • ActiveInference.jl precompile on Julia 1.12. Distributions pinned to
    0.25.100 – 0.25.125 in src/execute/activeinference_jl/Project.toml
    (DistributionsAD 0.6.58's ReverseDiff extension breaks against the
    @check_args change in 0.25.126); Manifest re-resolved.