2026-05-31
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
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
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
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
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
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
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
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.
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
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
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).