Changelog#

Version 0.2.1#

  • Shrinkage parity fix: cross-gene overdispersion_shrinkage now uses gene_means = rowMeans(Mu) from the first-pass beta with rough dispersion (R glm_gp), not the post-OD intercept. Intercept med |Δ| vs R on GSE288946 step-1 drops from ~10-4 to ~10-9 (100% within 0.01).

  • Evaluation docs: benchmark tables and Evaluation narrative updated to reflect shrinkage-aligned intercept parity.

Version 0.2.0#

  • OpenMP parallel fitting: per-gene C++ loop uses schedule(dynamic, 16); ~**7×** faster than R on GSE288946 SCT step-1 (2000×2000, 8 threads) with unchanged theta / Intercept parity.

  • Native CSR sparse path: scipy CSR matrices are fitted in place (no toarray()); implicit zero cells still contribute to the likelihood. sort_indices() is applied so gene/cell slicing preserves R parity.

  • Evaluation documentation: paper-style Evaluation page with synthetic and real-data benchmark tables (regenerate via python scripts/run_all_benchmarks.py).

  • Release automation: GitHub Actions auto-release.yml publishes to PyPI on v* tags; Read the Docs builds from .readthedocs.yaml.

  • Fix RTD build: set Sphinx version in conf.py (inventory dump).

Version 0.1.0#

  • Initial release: C++ reimplementation of sctransform::fit_glmGamPoi_offset with Cox–Reid overdispersion MLE, allow_inf_theta, cross-gene shrinkage, and trackcell-compatible fit_offset_model API.