← What's New

v0.4.2 — EM hardening (opt-in)

2026-05-31 · nstat/extras/em/dynamax_bridge.py · branch feat/tier-0.3-ppem-init-ridge

What shipped

Two opt-in keyword arguments on the PP_EM / mPPCO_EM trainers and their _best_of variants. Defaults unchanged — v0.4.1 fits remain bit-exact reproducible.

KnobWhereWhat it does
init="log_empirical_rate" fit_point_process_em, fit_point_process_em_best_of Seeds x0 from pinv(C) @ log(empirical_mean_rate) so the implied initial rate matches the data, not exp(0) = 1.
ridge_lambda=λ All four EM entry points Biases the A M-step toward the identity: A = (S10 + λI)(S11 + λI)−1. When S10, S11 → 0 (the weak-observability collapse mode) the limit becomes I rather than 0.
result = fit_point_process_em_best_of(
    spike_counts, state_dim=3, n_restarts=8,
    init="log_empirical_rate",   # data-driven x0
    ridge_lambda=0.5,            # bias A toward identity
)

Verification

CheckResult
28 existing dynamax tests pass unchanged (backward compat)PASS
4 new Tier 0.3 follow-up testsPASS
Ridge directionality on weak-observability fixture (rho_ridged > rho_plain)PASS
Log-empirical init residual lower than legacy in log-rate spacePASS
ridge_lambda=0.0 bit-exact = implicit default (backward compat)PASS

Docs fix

RELEASE_READINESS.md PyPI setup instructions now distinguish the project-level URL (used when the project already exists on PyPI) from the account-level Pending Publisher URL (pypi.org/manage/account/publishing/, required for a project's first publish). The v0.4.1 PyPI publish hit this exact trap: the project-level URL 404s when the project doesn't exist yet, and the first OIDC token gets rejected with invalid-publisher.

Files changed