A major refactor centred on a JAX-backed model, a new class hierarchy, and an opt-in gradient-based MCMC sampler. All user-facing call signatures from 2.x are preserved.
Highlights
- JAX backend for the rotation map model and likelihood: JIT-compiled, autodifferentiable, and GPU-aware.
- numpyro NUTS sampler as an opt-in MCMC backend via
mcmc='numpyro'infit_map()andAnnulus3D.get_vlos_GP(). emcee remains the default. Legacynwalkers/nburnin/nstepskwargs map onto numpyro'snum_chains/num_warmup/num_samplesinternally. - Class hierarchy split:
datacube→imagecube(shared FITS I/O) +momentmap(2D) +linecube(3D);Annulus→Annulus2D/Annulus3D. Legacy import aliases retained. imagecube.to_fits()andlinecube.to_momentmap()(via bettermoments).- GP backend swapped from celerite to
tinygp.quasisep.Matern32for JAX compatibility. - Performance: ~16× cumulative speedup in warm
fit_mapcalls via JIT-closure +vmap'd batch log-probability. - Test suite (
tests/) and GitHub Actions CI (pytest matrix on Python 3.11 + 3.13, ruff lint gate). - Tutorial 6 demonstrates the numpyro path end-to-end.
Breaking changes
- Minimum Python is now 3.10 (was 3.8).
celeriteis no longer a dependency (replaced bytinygp). Drop it from pinned environments.- A few previously-hidden
DeprecationWarnings may surface (notably from emcee 3.xsampler.chain).
See the full CHANGELOG entry for the complete list of added, changed, removed, and fixed items, plus migration notes.