Skip to content

v6.0.0

Choose a tag to compare

@michael-denyer michael-denyer released this 25 Jul 00:07
· 448 commits to master since this release
f36e8d8

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 dsyrk fallback 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.c coupling 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_inputs folds 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.