nSTAT-python — What's New

Per-iteration change summaries on the road to and beyond the production-quality v0.4.0 release (helpfiles + nstat.extras + core GOF + CI hygiene + landing-page polish). Newest first.

2026-05-31

v0.4.3 — Documentation cleanup docs

Removes cross-references to internal-only material from public-facing surfaces (README, helpfiles, module docstrings, parity notes); genericizes a couple of forward-looking placeholders. No public API changes, no behavior changes — every importable symbol behaves identically to v0.4.2.

2026-05-31

v0.4.2 — EM hardening (opt-in) extras / EM

Tier 0.3 follow-ups deferred from v0.4.0 now ship as opt-in keyword arguments (defaults unchanged): init="log_empirical_rate" seeds x0 from pinv(C) @ log(empirical_mean_rate), and ridge_lambda=λ biases the A M-step toward identity to counter the weak-observability A→0 collapse. Plus a PyPI-URL doc fix in RELEASE_READINESS.md.

2026-05-31

v0.4.1 — PyPI publishing + CI hygiene release

Post-v0.4.0 audit revealed the single biggest "drift" in the project: nstat-toolbox has never been on PyPI despite the README's pip install claim. v0.4.1 ships a Trusted-Publisher PyPI workflow (no API tokens), a dedicated extras-clusterless CI job (closes Tier 2.1's CI story), and pins statsmodels>=0.15 to kill the recurring local-only _lazywhere failure. Maintainer completes a 3-click one-time PyPI setup; every subsequent tag auto-publishes.

2026-05-31

Friendly 5-minute intro landing page docs

New intro.html: a hand-curated guided tour of the toolbox with six runnable code cards (spike trains, trials, Poisson GLMs, population GOF, state-space EM, clusterless decoding), the full nstat.extras tour, and the paper-example thumbnail gallery. Linked from the README. Drift-guarded so the snippets keep pointing at real public symbols.

2026-05-30

Tier 2.1 — Clusterless decoding bridge (flagship extras) extras / decoding

New nstat.extras.decoding.clusterless_bridge: fit_clusterless_decoder and fit_clusterless_classifier wrap Denovellis 2021's MIT-licensed replay_trajectory_classification for marked point-process decoding (no spike sorting required) and trajectory-type classification (replay vs. local). The modern descendant of nSTAT's PPAF / PPHF filters. New [clusterless] opt-dep group (JAX-heavy; not in [all-extras]).

2026-05-30

Pre-release audit + version-drift guards (v0.4.0 plan) release

Audit of the path to a production v0.4.0 release. Fixes existing silent drift (docs/conf.py and AGENT_GUIDE.md were on 0.3.1 vs. pyproject.toml 0.3.2); strengthens tests/test_version_sync.py to catch both in future; ships RELEASE_READINESS.md with the v0.4.0 scope + checklist.

2026-05-30

Notebook-fidelity date-volatility fix hygiene / CI

The notebook_fidelity_audit generator stamped every regen with generated_on: today, so parity/notebook_fidelity.yml drifted every day and test_notebook_fidelity_audit_matches_generator_when_matlab_repo_is_available spuriously failed on any dev machine with the MATLAB checkout. Drop the field (no consumer reads it; git log is authoritative).

2026-05-28

Tier 1.1 — Multivariate (marked) time-rescaling GOF core / GOF

New core function population_time_rescale (→ PopulationTimeRescaleResult): the Tao, Weber, Arai & Eden (2018) marked point-process time-rescaling test. It scores a neural population jointly — a ground-process KS plus a marked χ² — and catches inter-neuron coupling misfit that the per-neuron univariate KS (FitResult.computeKSStats) misses. Pure NumPy/SciPy.

Tier 0.3 — Harden PP_EM (multi-restart + predictive-LL selection) extras / EM

New fit_point_process_em_best_of / fit_hybrid_em_best_of + MultiRestartResult: compose Tier 0.1's canonical gauge with Tier 0.2's true held-out predictive log-likelihood — run EM with several seeds, score each on the held-out tail, return the best. This is now the recommended workflow for PP_EM on real data; it automatically discards the weak-observability A→0 collapses that Tier 0.2 surfaced. Single-fit fit_point_process_em remains as a low-level primitive.

2026-05-28

Tier 0.2 — Held-out predictive log-likelihood diagnostic extras / EM

A true, gauge-invariant fit-quality metric for the PP_EM / mPPCO_EM trainers: point_process_predictive_ll and hybrid_predictive_ll. Pure NumPy (no dynamax), it scores the actual Poisson/Gaussian likelihood of observations under the one-step-ahead predictive state — replacing the non-monotonic surrogate EM trace, and exposing a real PP_EM weak-observability limitation.

2026-05-28

Tier 0.1 — Full PLDS identifiability (canonical gauge) extras / EM

Pins the full GL(d) gauge of the Poisson-LDS trainers to a canonical form (whiten + SVD-rotate + sign-fix) once after convergence, so the returned A/C are a unique, seed-stable representative (CᵀC = diag(S²)). Fixes the prior per-iteration-canonicalization blow-up (NaN, |ΔC|~460).