Merged Pull Requests
Numba CPU s_W helpers for PERMANOVA
The May in-review PR merged after the test-against-a-trusted-reference and partial-sum revisions.
Parallelize the PERMANOVA engine across the permutation axis
Flipped the parallel axis from matrix rows to permutation blocks, so each thread handles whole permutations — a better fit for the Monte-Carlo permutation workload.
Measure Numba code coverage by disabling the JIT
Running under NUMBA_DISABLE_JIT lets coverage tooling see inside the compiled functions, so the Numba paths are properly reported.
Single-pass row-tile PERMANOVA kernel
The performance breakthrough: a cache-tiled kernel that reads the distance matrix once across all permutations instead of once per permutation. Roughly 8× over the original Cython single-permutation path, and within a small factor of the hand-optimized C++ reference at large scale.
Optional Numba support merged to main
The Numba engine line landed in the main branch. Numba is opt-in (falling back to Cython when it is not installed), and the function suffix was aligned to the existing _cy convention. This closed out the CPU phase.
The performance arc
The kernel evolved from a direct Cython port, to a parallel-over-permutations version, to a single-pass row-tiled kernel that amortises the matrix read across the whole permutation batch. Benchmarks were run at up to 25,000×25,000 distance matrices with 9,999 permutations, against an OpenMP-enabled baseline, with numerical agreement asserted below 1e-15 between paths.
By the end of June the Numba CPU engine matched or beat the existing paths and was merged into main — clearing the way for the GPU phase covered in the next milestone.