Wheels: linux x86_64 / macOS x86_64 / macOS aarch64 + sdist via maturin
trusted-publish. Triggered by the v0.1.7 tag push.
Notes:
- CenteredSparseArray (#6): in-memory implicit-centered scaled matrix
wrapper. Storage = `(X/σ : sparse, μ/σ : vector)`; per-gene access
bit-equal to dense reference at float32 ulp; matmul uses the
identity `(X-μ)/σ · W = (X/σ)·W − (μ/σ)·W` to stay sparse end-to-end.
Unblocks `ov.pp.scale(use_implicit_centering=True)` so million-cell
in-memory pipelines fit under the typical 256 GB per-process RSS cap
(TS-Immune 592k cells: dense path OOM-killed → wrapper completes in
30 min at 77 GB peak; empirically confirmed on omicverse#804).
- chunked_normalize_total + chunked_pearson HVG fusion (#7):
normalize_total now computes per-gene totals + E[count²] as a side
product of its existing per-cell-sum pass and stashes them in
`adata.uns['_pearson_precompute']`. chunked_pearson_residual_variance
+ chunked_highly_variable_genes_pearson auto-consume the dict
(default `precomputed='auto'`), skipping their own Pass-1. Numerical
equivalence pinned to atol=1e-10 vs the legacy two-pass path.
Eliminates one full chunked scan over X — on TS-1M (1M cells × 60k
genes) this removes the dominant duplicated cost inside preprocess.