PyAutoGalaxy v2026.7.9.1
What's New
Breaking Changes
- feat: CSV API extensions from the stress-test (light variants, loud guards, table properties, flat cosmology) (#491)
- Added: qualified light-variant class names in
light.csv(linear.Sersic,operated.Gaussian,linear_operated.*— plain names stay standard);GalaxyTable.properties(extra catalogue columns load as float/string lists — nothing silently dropped) +galaxy_table_to_csv(properties=);dPIEMassLenstool(Sph)gainH0/Om0float args (Planck15-value defaults, so a Lenstool run's cosmology is CSV-able) with prior-config entries. Behaviour changed (loud guards): duplicate(galaxy, attr_name)rows and typo'd parameter columns in model CSVs now raiseValueError(both previously silent — a typo left the profile at its default value).dPIEMassLenstoolwrapper prior_count grows 9→11 (fix H0/Om0 for the old count).
- Added: qualified light-variant class names in
- feat: Lenstool-native dPIE parameterization (from_lenstool + dPIEMassLenstool) and analytic potential (#487)
- Added Lenstool-parameterized construction and fitting for the dPIE family:
from_lenstool(...)classmethods ondPIEMass/dPIEMassSph, and new model-fittable wrapper profilesdPIEMassLenstool/dPIEMassLenstoolSph(with prior configs).dPIEMass.potential_2d_fromvalues change (MGE approximation → exact analytic potential); dPIE deflections at |ell_comps| < 1e-5 change from NaN to the tiny-ellipticity limit. No removals or renames.
- Added Lenstool-parameterized construction and fitting for the dPIE family:
- feat: add Kaplinghat SIDM cored NFW profile (#471)
- Adds two public dark-matter mass profiles,
ag.mp.KaplinghatCoredNFWSphandag.mp.KaplinghatCoredNFWMCRLudlowSph, plus default prior configs. Existing profile APIs are unchanged. See full details below.
- Adds two public dark-matter mass profiles,
- Lensing potential for elliptical/spherical dark-matter profiles (NFW/gNFW) + NFWSph fix (#470)
- Adds a working
potential_2d_fromto the elliptical/spherical dark-matter profiles (via a single MGE-decomposition method ongNFW, inherited byNFW,gNFWSph, and all MCR/Virial variants). CorrectsNFWSph.potential_2d_from(it returned values a factor ofr_stoo small). No public signatures removed or renamed;MassProfile.potential_2d_fromnow acceptsxp/**kwargs(additive). Behaviour change:NFWSphpotential values are now correct (≈r_s× larger than before). See full details below.
- Adds a working
- fix(mass): convergence_func on PowerLawBroken, PowerLawMultipole, cNFW family (#467)
- Added
convergence_funcoverrides onPowerLawBroken,PowerLawBrokenSph(inherited),PowerLawMultipole, and thecNFWfamily (cNFWSph+ MCR variants inherit).PowerLawBroken._convergenceis a new private radial helper.PowerLawBroken.potential_2d_fromnow raisesNotImplementedErrorexplicitly (it was already non-functional). No signatures of existing public methods changed. See full details below.
- Added
New Features
- feat: oversampled PSF blurred images — operate/image consumer (phase 2c) (#481)
- docs: add signpost llms.txt + consolidate agent instructions into AGENTS.md (#474)
Bug Fixes
- docs: fix dead HowToGalaxy Colab links + purge stale allowlist entries (#493)
- fix: restore unconditional dataset.fits output for aggregator (save_attributes) (#479)
- fix(jax): defensive pytree dedup in imaging/interferometer analyses (#468)
Internal
- docs: document the functional plot API in plot.rst (#494)
- docs: prune stale API-doc references (#492)
- refactor: unify the blurred-image evaluate/pre-bin/convolve tail (#489)
- feat: k×s coupling call sites (blurred images, linear override, padded simulation) (#486)
- refactor: extract the oversampled-PSF evaluation-grid switch (#484)
- feat: oversampled PSF support in SimulatorImaging (phase: simulator) (#483)
- ci: call the reusable lib-tests workflow from PyAutoHeart (not PyAutoPulse) (#477)
- main.yml → thin caller to Pulse reusable lib-tests (Stage 4 Phase A) (#476)
- Remove url_check.yml: URL hygiene centralised in PyAutoPulse (#475)
- docs: consolidate agent instructions into canonical AGENTS.md (#473)
- refactor(latent): LatentGalaxy class + declare Analysis.Latent (Phase 2) (#472)
Upstream Changes
PyAutoFit
- refactor: dispatch visualize_combined per Visualizer type in FactorGraphModel (#1340)
- fix: LogUniform NumPy log-prior returns -inf for value<=0 (emcee NaN crash) (#1329)
- ci: pause routine scheduled (cron) workflow runs (#1325)
- ci: call the reusable lib-tests workflow from PyAutoHeart (not PyAutoPulse) (#1323)
- main.yml → thin caller to Pulse reusable lib-tests (Stage 4 Phase A) (#1322)
- Remove url_check.yml: URL hygiene centralised in PyAutoPulse (#1321)
- docs: add signpost llms.txt + consolidate agent instructions into AGENTS.md (#1320)
- docs: consolidate agent instructions into canonical AGENTS.md (#1319)
- refactor(latent): migrate af.ex.Analysis + cookbook docs to the Latent class (#1318)
- fix: skip latent computation without keys (#1317)
- refactor(latent): first-class Latent class + engine extraction (Phase 1) (#1315)
- fix: expand bypass-mode fake samples (#1314)
- test: skip NSS tests without optional dependency (#1312)
- fix(latent): degenerate latent edge cases (quantile n=1, latent exceptions, anti-correlated NaNs) (#1311)
- fix(latent): global masking in compute_latent_samples to prevent KeyError on per-batch NaN drops (#1310)
- feat: cross-Analysis shared per-evaluation state in FactorGraphModel (#1308)
- chore(deps): allow anesthetic>=2.9.0 to unblock jax>=0.7 / numpy>=2 resolution (#1306)
- fix(nss): chunked algo.init follow-up to #1303 (#1305)
- feat(nss): chunk_size kwarg for inversion-heavy A100 likelihoods (#1303)
- fix(jax): structural defense against cached_property pytree/dict leaks (#1302)
PyAutoArray
- refactor: qhull-only Delaunay callback, exact JAX visibility-walk point location (#368)
- feat: catalogue-size cap for PYAUTO_SMALL_DATASETS smoke mode (#366)
- refactor: vectorize k×s segment-id construction (#365)
- perf: memoize k×s segment-id construction (#364)
- feat: k×s evaluation/convolution coupling (#363)
- refactor: consolidate oversampled-PSF convolution helpers (#361)
- feat: via_image_from image_is_convolved + from_gaussian oversample kwarg (#359)
- fix: oversampled fine state when the blurring mask is padded (#358)
- feat: oversampled PSF inversion wiring — mapping formalism (phase 2b) (#357)
- feat: oversampled PSF convolution core API (convolve_over_sample_size) (#355)
- ci: call the reusable lib-tests workflow from PyAutoHeart (not PyAutoPulse) (#352)
- Arcsec ticks: consistent decimal for mixed integer/decimal ticks; centre rotated y-labels (#351)
- Add optional arcsecond double-prime tick labels (#350)
- main.yml → thin caller to Pulse reusable lib-tests (Stage 4 Phase A) (#349)
- Remove url_check.yml: URL hygiene centralised in PyAutoPulse (#348)
- docs: add signpost llms.txt + consolidate agent instructions into AGENTS.md (#347)
- docs: consolidate agent instructions into canonical AGENTS.md (#346)
- feat: Preloads API for reusing channel-invariant inversion quantities (#344)
- fix(jax): exclude cached_property descriptors from pytree flatten paths (#343)
Full changelog: 2026.5.29.4...2026.7.9.1