Repository navigation
v6.0.0
First release since 5.6.0. One breaking change, plus a run of maintainability work on the LMM accelerator.
Breaking
The LMM runner entry points take an LmmConfig and nothing else. run_lmm_association_numpy, run_lmm_association_numpy_streaming and run_lmm previously accepted an optional config and nine flat keyword overrides of the same values, unpacking one over the other in three places. Pass config=LmmConfig(...) instead of maf_threshold=, miss_threshold=, l_min=, l_max=, n_grid=, n_refine=, check_memory=, show_progress= or lmm_mode=. LmmConfig.as_kwargs() is removed.
This closes a validation hole. LmmConfig.__post_init__ bounds-checks every knob, but the flat path bypassed it, so a maf_threshold of 0.99 was accepted even though MAF never exceeds 0.5. Such calls now raise ValueError.
Fixed
- The NumPy
dsyrkfallback no longer exceeds the memory the kinship pre-flight budgets. It allocated an undeclared N x N result plus N²/2 index arrays, so the pre-flight could approve a run that then OOMed. - The
_lmm_accel.ccoupling census counted comment prose and module-registration entries as code references, reporting 58 shared statics where there were 24.
Changed
- The p-value layer (
betainc,f_to_pvalue,chi2_sf_c) moved into_lmm_stats.c/.h, following the allocation and marshalling layer that moved in 5.x. All 139 bit-exact fingerprint records are unchanged and GEMMA parity is unaffected. PipelineRunner.validate_inputsfolds its seven file-existence checks into one ordered table.
Internal
- cppcheck now runs over
src/jamma/lmm, which had never been statically analysed. - clang-format is explicitly disabled for
src/jamma/lmm, which is hand-formatted. - 15 stale pyrefly baseline suppressions dropped.
Numerical results are unchanged throughout. Every C change in this release was verified bit-exact against the pre-change build, and GEMMA equivalence passes all tolerances.
Full detail in CHANGELOG.md.