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\ :sup:`-4` to ~10\ :sup:`-9` (100% within 0.01). * **Evaluation docs:** benchmark tables and :doc:`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 :doc:`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.