Skip to content

v0.1.8

Latest

Choose a tag to compare

@jturner-uofl jturner-uofl released this 27 May 13:18
· 36 commits to main since this release

What's fixed

Memory (P0)

  • pairs(emm, max_contrasts=None) no longer allocates an O(m²) contrast-covariance matrix when the adjustment method doesn't need the off-diagonal correlation. Previously every adjust path built the full L_c @ V @ L_c.T; for k=250 group levels via pairwise that's ~7.2 GB on float64 and OOM'd typical hardware. The contrast covariance is now built lazily: only "dunnett" / "mvt" paths build the full matrix; every other adjustment computes the diagonal SEs via einsum. Empirical: k=250 peak RSS dropped from ~7.7 GB to ~270 MB with identical numerical output. Tukey HSD at k=250 is now feasible on a laptop.

Defaults (P1)

  • dunnett_max_k default tightened from 100 to 50. Empirical exact-Dunnett wall time on the reference machine: k=30 → ~5 s, k=50 → ~4 min, k=100 → effectively unbounded for an interactive call. The previous 100 cap suggested feasibility the QMC integrator can't deliver. Override via set_emm_options(dunnett_max_k=...) for batch jobs.

Refusal completeness (P2)

  • joint_tests(EmmList(...)) now scans every member's inference_kind instead of only the first. A mixed EmmList(freq_em, post_em) with the posterior member at any position now raises the steering ValueError and names the offending position(s).

Errors (P2)

  • bootstrap_ci(em, kind='case', refit_fn=...) now accepts an explicit data= kwarg so the post-pickle path is actually usable. Resolves the resampling source in order: live info.data → caller-supplied data= → clear error. Passing both populates a UserWarning and prefers info.data (avoids a wrong-numerics footgun).

Documentation (P2)

  • src/pymmeans/options.py module docstring + set_emm_options admonition now document the ContextVar process-boundary gap explicitly (joblib loky, ProcessPoolExecutor, multiprocessing spawn). Users hitting the new dunnett_max_k option in a parallel sensitivity-analysis pipeline see the limitation at the call site rather than at the worker-side ValueError.