Skip to content

v7.0.0

Choose a tag to compare

@michael-denyer michael-denyer released this 25 Jul 22:06
3b406c0

JAMMA 7.0.0 is a breaking release. It finishes the configuration-object
consolidation 6.0.0 started, and removes a redundant dispatcher.

Breaking changes

run_lmm_loco() takes LmmConfig and LocoConfig

The old signature took 23 flat parameters. It now takes 6. The 23 split as:

  • 4 stay direct: bed_path, phenotypes, covariates, output_path
  • 9 move into LmmConfig — the same object every other runner already took
    since 6.0.0. LOCO was the last entry point still taking them loose.
  • 10 move into the new LocoConfig: save_kinship, kinship_output_dir,
    kinship_output_prefix, snps_indices, ksnps_indices, col_chunk_size,
    write_eigen, eigen_dir, eigen_prefix, legacy_text
# before
run_lmm_loco(bed_path=..., phenotypes=..., maf_threshold=0.05, lmm_mode=1,
             save_kinship=True, kinship_output_dir=d, show_progress=False)

# after
from jamma.lmm import LmmConfig, LocoConfig

run_lmm_loco(bed_path=..., phenotypes=...,
             config=LmmConfig(maf_threshold=0.05, lmm_mode=1, show_progress=False),
             loco=LocoConfig(save_kinship=True, kinship_output_dir=d))

LocoConfig validates at construction, so write_eigen=True without
eigen_dir fails before the first chromosome is eigendecomposed rather than
partway through a long run. col_chunk_size <= 0 is rejected too.

LocoConfig and DEFAULT_LOCO_CONFIG are exported from jamma.lmm.

jamma.lmm.run_lmm() is removed

It was a second dispatcher routing pre-loaded arrays to the batch or streaming
runner. PipelineRunner never used it — it calls select_execution_mode() and
dispatches through its own _run_batch/_run_streaming, which also handle
PLINK loading, incremental writing and timing. Two routing paths had to be kept
in step by hand for no benefit.

Before removing it we confirmed: no callers in src/ or scripts/, not in
jamma.__init__.__all__, absent from the README and USER_GUIDE examples, and
unreferenced by the one known downstream consumer.

select_execution_mode() and ExecutionPlan are unchanged and still public.
Use PipelineRunner, or call run_lmm_association_numpy() /
run_lmm_association_numpy_streaming() directly after picking a mode with
select_execution_mode().

Also in this release

PipelineConfig, PipelineResult and KinshipResult moved into
jamma/pipeline_config.py. They are still importable from jamma.pipeline,
which is the supported path and is not changing.

Internals: the rest of the C accelerator's arithmetic moved out of
_lmm_accel.c into three new translation units — _lmm_tests,
_lmm_kernels_general and _lmm_kernels_ncvt1. _lmm_accel.c now holds only
boundary code: entry points, workspace lifecycle and two test hooks.

A new CI job guards this by building the merge base and the PR head on one
runner and comparing bit-exact digests, since tolerance-based tests do not
catch last-bit drift. No numerical behaviour changes in this release — every
split was verified bit-identical.

Full detail in CHANGELOG.md.