Repository navigation
v7.0.0
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.