Repository navigation
v5.6.0
Added
jlinalg.dsyrkaccepts a caller-owned output buffer. The signature is nowdsyrk(X, *, out=None, beta=0.0), computingout = X @ X.T + beta * out. The existing one-argument call is unchanged. Batch, streaming, and LOCO kinship accumulation usedsyrk(X, out=K, beta=1.0)in place ofK += dsyrk(X), which removes then_samples x n_samplestemporary that the old pattern allocated on every batch.
Changed
- Mode 4 computes its REML and MLE coarse-grid brackets in one pass. The two likelihoods share the same three SNP-varying reductions at each grid lambda and differ only in their tail, so the one-covariate split/SoA kernel now derives one canonical Pab per grid point and selects both brackets from it. Golden-section refinement and final evaluation remain independent per likelihood. Mode-4 output is bitwise unchanged. The general-covariate kernel is not affected.
jlinalgABI version is 13. The bump is internal to the C extension; ABI mismatches trigger the existing automatic recompile.
Fixed
dsyrkno longer reads its output buffer whenbetais zero. BLAS definesbeta == 0as "C is not read", precisely so the caller may pass uninitialized memory. For a zero-widthXthe native path scaled the freshly allocated output instead of zeroing it, and becauseNaN * 0.0isNaN, a reused allocation leaked its previous contents into the result. It is zeroed again.dsyrkrejects an unalignedoutinstead of silently ignoring it. An unaligned but otherwise valid buffer was converted to an aligned copy, so the result was written to the copy and the caller's array left untouched.dsyrk(X, out=K) is Know holds by construction.
Compatibility
No public Python API breaks. dsyrk(X) still works and the new arguments are keyword-only.
Full changelog: v5.5.0...v5.6.0