Skip to content

Releases: PyAutoLabs/PyAutoGalaxy

v2026.5.29.4

29 May 10:25

Choose a tag to compare

PyAutoGalaxy v2026.5.29.4

What's New

Breaking Changes

  • fix(mass): convergence_func on PowerLawBroken, PowerLawMultipole, cNFW family (#467)
    • Added convergence_func overrides on PowerLawBroken, PowerLawBrokenSph (inherited), PowerLawMultipole, and the cNFW family (cNFWSph + MCR variants inherit). PowerLawBroken._convergence is a new private radial helper. PowerLawBroken.potential_2d_from now raises NotImplementedError explicitly (it was already non-functional). No signatures of existing public methods changed. See full details below.
  • fix: soft-fail jax_zero_contour callers in lens_calc to NaN/[] (#465)
    • Behaviour change (no signature change): when jax_zero_contour is not installed, einstein_radius_jit_from now returns float('nan') (was: ModuleNotFoundError), and the public tangential_critical_curve_list_via_zero_contour_from / radial_critical_curve_list_via_zero_contour_from (via the private _critical_curve_list_via_zero_contour) now return [] (was: ModuleNotFoundError). One logger.warning per process per feature. New private helper _maybe_optional_dep_warn and module-level set _OPTIONAL_DEP_WARNED. No imports removed.
  • fix: raw-flux latent + soft-fail magzero-required µJy (#463)
  • feat: MGE/CSE fallback for zero-returning mass profile potentials (#449)
    • Added MGEDecomposer.potential_2d_via_mge_from() — new public method computing lensing potential from MGE-decomposed convergence using the E1 exponential integral. Added helper methods E1() (Abramowitz & Stegun approximation, JAX-compatible) and potential_func_gaussian(). All existing zero-returning methods now return physically meaningful values instead of zeros. See full details below.
  • refactor: port CSE module to support JAX via xp parameter (#447)
    • Added xp=np keyword argument to four MassProfileCSE methods: convergence_cse_1d_from, deflections_via_cse_from, _convergence_2d_via_cse_from, _deflections_2d_via_cse_from. Existing callers passing no xp argument are unaffected (default is np). The decomposition solver (_decompose_convergence_via_cse_from) stays NumPy-only — it runs before JIT tracing. See full details below.
  • feat: first-class latent variable API in PyAutoGalaxy (#441)
    • New public module autogalaxy.imaging.model.latent with helpers (ab_mag_via_flux_from, flux_mujy_via_ab_mag_from), the LATENT_FUNCTIONS registry, the latent_keys_enabled() reader, and one registered latent (total_galaxy_0_flux_mujy, disabled by default). AnalysisImaging gains a LATENT_KEYS @property and a compute_latent_variables(parameters, model) method — both new public surface. New config file autogalaxy/config/latent.yaml. Note: autoconf lowercases yaml keys, so the latent name uses lowercase mujy (not muJy) — this leaks through to the latent.csv column header.
  • feat: JIT-friendly Einstein radius helper + AnalysisDataset jit latent mode (#435)
    • Two additions to PyAutoGalaxy: a new public method LensCalc.einstein_radius_jit_from, and a class attribute override AnalysisDataset.LATENT_BATCH_MODE = "jit". No existing API surface is modified or removed.
  • perf(lens_calc): cache (f, ZeroSolver) for zero_contour critical curves (#434)
    • LensCalc instances now carry a private _zero_contour_cache dict. No public API surface changes — same method names, same signatures, same return values. Behavioural change: _critical_curve_list_via_zero_contour reuses its closure and ZeroSolver across repeat calls with the same parameters.

New Features

  • perf: cache expensive @Property on Fit classes (#462)
  • feat: vmapped_deflections_from for batched subhalo deflections (#455)
  • docs: LaTeX docstrings for all mass profile classes (#453)
  • feat: SimulatorInterferometer.via_galaxies_from auto-default xp from parent use_jax (#443)
  • feat: SimulatorImaging.via_galaxies_from auto-default xp from parent use_jax (#442)

Bug Fixes

  • fix(jax): defensive pytree dedup in imaging/interferometer analyses (#468)
  • fix(mass): wire convergence_func on dPIE family for MGE decomposition (#466)
  • fix: elliptical MGE potential via deflection line integral (#460)
  • fix: use xp.sqrt in NFWSph.potential_func_sph (#458)
  • fix: add xp=np to convergence_func across all mass profiles (#457)

Internal

  • perf: vectorize MGE potential over components (#461)
  • fix: cNFWSph deflection boundary bug and MCR validation (#451) (#454)
  • refactor(model_util): replace simulator_start_here_model_from with direct random_galaxy_for_simulation_from (#438)
  • refactor: archive quantity package to autolens_workspace_developer/legacy (#437)

Upstream Changes

PyAutoFit

  • 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)
  • fix(jax): keep parameterization cache off ModelInstance + auto-register pytrees (#1300)
  • Cache model.parameterization; try interactive matplotlib backends (#1299)
  • Prefer fit_quick.png in quick-update display candidates (#1298)
  • Remove use_jax_for_visualization; add visualization warmup (#1297)
  • fix: skip _compute_latent_samples in PYAUTO_TEST_MODE (#1294) (#1295)
  • Add live_visual_update flag for opt-in on-the-fly visualization (#1293)
  • fix: PYAUTO_TEST_MODE should write to a separate output dir (#1292)
  • feat(quick_update): IPython.display.update_display for live Jupyter cells (#1290)
  • feat(analysis): LATENT_BATCH_MODE attribute (vmap default, jit option) (#1288)
  • Fix Sample.kwargs mixed string/tuple key bug (#1287)
  • nss extras: strip git+https URLs to unblock PyPI uploads (#1286)

PyAutoArray

  • fix(jax): exclude cached_property descriptors from pytree flatten paths (#343)
  • fix: VectorYX2DIrregular from_dict round-trip (missing values property) (#342)
  • perf: cache expensive @Property on Fit classes (#341)
  • fix: make Array2D.native jit-traceable for JAX simulator path (#339)
  • fix: raise ValueError on xp=np + jnp-backed-grid mismatch (#337)
  • feat: SimulatorInterferometer(use_jax=True) + xp-aware preprocess Gaussian noise (#336)
  • feat: SimulatorImaging(use_jax=True) + xp-aware preprocess noise (#335)
  • TransformerNUFFT: add chunk_size knob to cap nufftax gather buffer (#330)
  • interferometer: enable sparse_operator for nufftax TransformerNUFFT (#329)

Full changelog: 2026.5.21.1...2026.5.29.4

v2026.5.21.1

21 May 09:47

Choose a tag to compare

PyAutoGalaxy v2026.5.21.1

What's New

Breaking Changes

  • fix: EllipseMultipoleScaled JAX-traceable via deferred derivation (#427)
    • EllipseMultipoleScaled.__init__ no longer pre-computes or stores self.specific_multipole_comps; the attribute is gone. super().__init__ is no longer called, so self.multipole_comps is also no longer set. get_shape_angle is now overridden (was inherited) to derive from scaled_multipole_comps. self.major_axis is now stored as an attribute (previously it was only an __init__ arg).
    • Numerical behaviour: points_perturbed_from output shifts by ~1e-8 relative to the old implementation. The old path stored specific_multipole_comps to limited float precision and then re-derived (k, phi) from it, accumulating rounding error. The new direct path is cleaner. Pinning test captures the new (more accurate) values.
  • fix: Basis.image_2d_from and dPIEPotential.convergence_2d_from return wrong wrapper types (#425)
  • config: add prior defaults for ExternalPotential (#423)
  • feat(mass): add ExternalPotential mass profile (Powell 2022 Eq 4) (#422)
    • Single additive class: ag.mp.ExternalPotential (sibling of ExternalShear in autogalaxy/profiles/mass/sheets/). Six free parameters (gamma_1/2, tau_1/2, delta_1/2) plus a free centre (unlike ExternalShear's fixed (0, 0) — the τ and δ deflections are radial so the centre matters). Plus convenience accessors gamma_magnitude/angle, tau_magnitude/angle, delta_magnitude/angle, and a from_magnitudes_and_angles classmethod for paper-style parameterisation.
    • No removals, no renames, no signature changes elsewhere. See full details below.
  • refactor(light): split multipole module + add ag.lp_linear variants (#421)
    • Two new public classes added to ag.lp_linear:
      • ag.lp_linear.SersicMultipole — linear elliptical Sersic with m=3/m=4 multipole perturbations
  • feat(light): add SersicMultipole and GaussianMultipole profiles (#420)
    • Two new public classes added to the ag.lp namespace:
      • ag.lp.SersicMultipole — Sersic with m=3 and m=4 Fourier perturbations on the eccentric radius
  • feat: AnalysisEllipse.fit_from + JAX pytree registration (keystone) (#412)
      • Added: use_jax: bool = True on AnalysisEllipse.__init__. AnalysisEllipse.fit_from(instance) -> FitEllipseSummed. FitEllipseSummed class on autogalaxy.ellipse.fit_ellipse (sums over a List[FitEllipse]). use_jax: bool = False kwarg on FitEllipse.fit_list_from so the visualizer keeps the numpy default.
      • Changed Behaviour: AnalysisEllipse.log_likelihood_function now returns figure_of_merit (per-ellipse sum of -0.5 * (chi_squared + noise_normalization)) instead of log_likelihood (per-ellipse sum of -0.5 * chi_squared). This matches AnalysisImaging.log_likelihood_function line 125 exactly. Existing callers see a different scalar value — differs by the per-fit noise_normalization sum. The workspace_test reference scripts call fit_list_from directly (not log_likelihood_function) so the prompt-2 reference numbers stay byte-stable.
  • refactor: unify FitEllipse perimeter sampling; add JAX support (#410)
    • FitEllipse.__init__ gains use_jax: bool = False. FitEllipse.points_from_major_axis_from is rewritten: the 300-iter regen-trim loop is replaced with one-shot NaN-marking. Behaviour preserved for datasets where the ellipse perimeter sits entirely inside the mask region (the common case, including prompt 2). Behaviour changes for masked-perimeter datasets:
      • chi_squared now sums over N - N_masked perimeter terms (where N is the initial sample count) instead of always exactly N. The regen-and-trim mechanism that synthesised replacement points is gone.
  • refactor: parameterise Ellipse + EllipseMultipole math on xp (#408)
    • Eight methods on Ellipse / EllipseMultipole / EllipseMultipoleScaled gain an xp=np keyword (purely additive — existing callers unaffected). One behaviour change: EllipseMultipole.get_shape_angle previously wrapped angles into the open-closed interval (-period/2, period/2] via two while loops; the xp.mod rewrite wraps into the closed-open interval [-period/2, period/2), so the single boundary value angle == period/2.0 exactly now returns -period/2.0 instead of +period/2.0. A new test pins the new convention. No removals, no other behaviour changes. See full details below.
  • feat: replace Ludlow16 colossus pure_callback with JAX-native impl (#403) (#406)
    • The colossus pure_callback chain is replaced by a JAX-native port. Production no longer imports colossus. The internal mcr_util helpers (_ludlow16_cosmology_callback, ludlow16_cosmology_jax) are removed; new public entry points live in autogalaxy/profiles/mass/dark/ludlow16.py. The xp branches in the two callers (kappa_s_and_scale_radius_for_ludlow, kappa_s_scale_radius_and_core_radius_for_ludlow) collapse to single xp-aware calls. colossus moves from required to test/dev extras. See full details below.
  • fix: register DatasetModel pytree in _register_fit_quantity_pytrees (#405)
  • feat: wire ag.VisualizerQuantity through fit_for_visualization (#404)
      • Added: ag.AnalysisQuantity.fit_from(instance) — thin alias for the existing fit_quantity_for_instance(instance). Required so the autofit base Analysis.fit_for_visualization dispatcher can find a fit_from method on this analysis class (mirrors the imaging/interferometer pattern).
    • Strictly additive — no existing call site is affected. fit_quantity_for_instance retained for backwards compatibility.
  • feat: pytree registration for FitEllipse + FitQuantity (Phase 0c) (#401)
      • ag.AnalysisEllipse.__init__ and ag.AnalysisQuantity.__init__ gain **kwargs passthrough — strictly additive. Callers can now pass use_jax_for_visualization=True (and any other autofit-base Analysis kwarg) without TypeError.
      • New _register_fit_ellipse_pytrees and _register_fit_quantity_pytrees static methods on the respective analysis classes, invoked under if use_jax:. They register Ellipse, EllipseMultipole, FitEllipse, FitQuantity, and reuse register_galaxies_pytree() for the Galaxies aggregate inside FitQuantity.light_mass_obj.
  • fix: ag.AnalysisInterferometer.init kwargs passthrough (#399)
    • ag.AnalysisInterferometer.__init__ gains a **kwargs passthrough — strictly additive. Any caller that previously worked is unaffected. New: callers can now pass use_jax_for_visualization=True (or any other kwarg accepted by the autofit base Analysis) without TypeError.
  • refactor: DatasetInterp delegates to aa.interp_2d; expose xp (#398)

New Features

  • feat(galaxy): named-galaxy CSV reader/writer for full model round-trips (#428)
  • feat(AdaptImages): rotate cached mesh grid with DatasetModel transforms (#416)
  • fix: add quick_update kwarg to VisualizerImaging.visualize_combined (#414)

Bug Fixes

  • fix: handle r=0 in NFWSph deflections (#430)
  • docs: audit-driven URL fixes across docs, READMEs, and docstrings (#413)

Internal

  • Pin jax_zero_contour >=2.0.0,<3.0.0 in [jax] extras (#432)
  • fix(lens_calc): preserve evaluation_grid extent under PYAUTO_SMALL_DATASETS=1 (#431)
  • fix(csv): preserve TuplePrior on af.Model built from tuple-param rows (#429)
  • ci: add live URL audit (weekly cron) + grandfather current broken URLs (#415)
  • docs(research): Ludlow16 JAX concentration feasibility study (#397) (#402)

Upstream Changes

PyAutoFit

  • nss extras: strip git+https URLs to unblock PyPI uploads (#1286)
  • perf: direct-ndtr fast path for TruncatedGaussianPrior.value_for (#1285)
  • fix: coerce figure_of_metric return to Python float for Drawer + JAX (#1283)
  • ci: split NSS tests into parallel job (handley-lab blackjax fork ≠ mainline) (#1281)
  • revert: default use_jax_for_visualization to False (reverts #1278) (#1280)
  • feat: default use_jax_for_visualization to follow use_jax in Analysis.init (#1278)
  • feat: autofit[nss] install extra (Phase 4 of nss_first_class_sampler) (#1277)
  • feat: af.NSS checkpoint/resume + on-the-fly visualization (Phases 2-3) (#1274)
  • feat: af.NSS NonLinearSearch wrapper for Nes...
Read more

v2026.5.14.2

14 May 15:08

Choose a tag to compare

PyAutoGalaxy v2026.5.14.2

What's New

Breaking Changes

  • feat: replace Ludlow16 colossus pure_callback with JAX-native impl (#403) (#406)
    • The colossus pure_callback chain is replaced by a JAX-native port. Production no longer imports colossus. The internal mcr_util helpers (_ludlow16_cosmology_callback, ludlow16_cosmology_jax) are removed; new public entry points live in autogalaxy/profiles/mass/dark/ludlow16.py. The xp branches in the two callers (kappa_s_and_scale_radius_for_ludlow, kappa_s_scale_radius_and_core_radius_for_ludlow) collapse to single xp-aware calls. colossus moves from required to test/dev extras. See full details below.
  • fix: register DatasetModel pytree in _register_fit_quantity_pytrees (#405)
  • feat: wire ag.VisualizerQuantity through fit_for_visualization (#404)
      • Added: ag.AnalysisQuantity.fit_from(instance) — thin alias for the existing fit_quantity_for_instance(instance). Required so the autofit base Analysis.fit_for_visualization dispatcher can find a fit_from method on this analysis class (mirrors the imaging/interferometer pattern).
    • Strictly additive — no existing call site is affected. fit_quantity_for_instance retained for backwards compatibility.
  • feat: pytree registration for FitEllipse + FitQuantity (Phase 0c) (#401)
      • ag.AnalysisEllipse.__init__ and ag.AnalysisQuantity.__init__ gain **kwargs passthrough — strictly additive. Callers can now pass use_jax_for_visualization=True (and any other autofit-base Analysis kwarg) without TypeError.
      • New _register_fit_ellipse_pytrees and _register_fit_quantity_pytrees static methods on the respective analysis classes, invoked under if use_jax:. They register Ellipse, EllipseMultipole, FitEllipse, FitQuantity, and reuse register_galaxies_pytree() for the Galaxies aggregate inside FitQuantity.light_mass_obj.
  • fix: ag.AnalysisInterferometer.init kwargs passthrough (#399)
    • ag.AnalysisInterferometer.__init__ gains a **kwargs passthrough — strictly additive. Any caller that previously worked is unaffected. New: callers can now pass use_jax_for_visualization=True (or any other kwarg accepted by the autofit base Analysis) without TypeError.
  • refactor: DatasetInterp delegates to aa.interp_2d; expose xp (#398)
  • feat: add galaxy_table CSV reader/writer for galaxy populations (#393)

New Features

  • docs: add nufftax + FINUFFT citation guidance (#396)
  • test: pin FitEllipse masked-points-loop behaviour (#395)

Internal

  • docs(research): Ludlow16 JAX concentration feasibility study (#397) (#402)
  • feat: re-export TransformerNUFFTPyNUFFT (legacy pynufft NUFFT) (#391)
  • feat: dispatch autogalaxy visualizers via fit_for_visualization (#390)

Upstream Changes

PyAutoFit

  • fix: populate NUTS samples_info keys under test-mode bypass (#1260)
  • fix: stop passing dataset=None to fit_cls when sensitivity Job is complete (#1259)

PyAutoArray

  • feat: add aa.interp_2d (NumPy + JAX bilinear interpolation) (#308)
  • perf: batched transform_mapping_matrix in TransformerNUFFT (single nufft2d2 call) (#305)
  • fix(inversion): regularization_weights_mapper_dict uses correct linear_obj_list index (#304)
  • feat: nufftax-backed TransformerNUFFT as default; rename pynufft variant to TransformerNUFFTPyNUFFT (#303)
  • Make use_mixed_precision actually emit fp32 FFT for light profiles (#302)
  • feat: honor PYAUTO_SMALL_DATASETS in Imaging.from_fits (#301)

Full changelog: 2026.5.8.2...2026.5.14.2

v2026.5.8.2

08 May 19:07

Choose a tag to compare

⚠️ v2026.5.8.2 is a no-op re-release of v2026.5.8.1 — same code, second release dispatched the same day to validate updated release-pipeline gates. The full set of changes shipped on 2026-05-08 follows.

PyAutoGalaxy v2026.5.8.2

What's New

Bug Fixes

  • fix: xp-gate jax.scipy.special.factorial in shapelets/exponential.py (#385)

Internal

  • refactor: replace os.path with pathlib (#388)
  • docs: update workspace prose refs from README.rst to README.md (#387)
  • docs: convert remaining prose .rst to MyST .md (pass 2) (#386)
  • test: remove jax from unit tests (moved to autogalaxy_workspace_test) (#384)
  • docs: convert prose .rst files to MyST .md (#383)

Upstream Changes

PyAutoFit

  • fix: populate NUTS samples_info keys under test-mode bypass (#1260)
  • fix: stop passing dataset=None to fit_cls when sensitivity Job is complete (#1259)
  • refactor: replace os.path with pathlib (#1258)
  • feat: add BlackJAXNUTS first-class non-linear search (#1256)
  • Visualizer.visualize_combined: accept quick_update kwarg (#1254)
  • Fix AnalysisFactor.visualize_combined dispatch in FactorGraph (#1253)
  • Refresh cached SearchUpdater when AbstractSearch.paths is reassigned (#1252)
  • docs: update workspace prose refs from README.rst to README.md (#1251)
  • Support fixed Array elements through the EP fitting pipeline (#1250)
  • docs: convert remaining prose .rst to MyST .md (pass 2) (#1249)
  • Add EPAnalysisFactor for cavity-message injection (#1248)
  • test: delete jax-using unit tests (moved to autofit_workspace_test) (#1247)
  • docs: convert prose .rst files to MyST .md (#1246)

PyAutoArray

  • feat: honor PYAUTO_SMALL_DATASETS in Imaging.from_fits (#301)
  • refactor: replace os.path with pathlib (#300)
  • docs: convert remaining prose .rst to MyST .md (pass 2) (#298)
  • Fix subplot_of_mapper crash on interferometer data_subtracted (#297)
  • fix OOB read in psf_precision_value_from causing NaN sparse-CPU log_evidence (#296)
  • test: remove jax-using unit tests; assertions moved to autolens_workspace_test (#295)
  • docs: convert index.rst to MyST .md (#294)

Full changelog: 2026.5.1.4...2026.5.8.2

v2026.5.8.1

08 May 18:22

Choose a tag to compare

PyAutoGalaxy v2026.5.8.1

What's New

Bug Fixes

  • fix: xp-gate jax.scipy.special.factorial in shapelets/exponential.py (#385)

Internal

  • refactor: replace os.path with pathlib (#388)
  • docs: update workspace prose refs from README.rst to README.md (#387)
  • docs: convert remaining prose .rst to MyST .md (pass 2) (#386)
  • test: remove jax from unit tests (moved to autogalaxy_workspace_test) (#384)
  • docs: convert prose .rst files to MyST .md (#383)

Upstream Changes

PyAutoFit

  • fix: populate NUTS samples_info keys under test-mode bypass (#1260)
  • fix: stop passing dataset=None to fit_cls when sensitivity Job is complete (#1259)
  • refactor: replace os.path with pathlib (#1258)
  • feat: add BlackJAXNUTS first-class non-linear search (#1256)
  • Visualizer.visualize_combined: accept quick_update kwarg (#1254)
  • Fix AnalysisFactor.visualize_combined dispatch in FactorGraph (#1253)
  • Refresh cached SearchUpdater when AbstractSearch.paths is reassigned (#1252)
  • docs: update workspace prose refs from README.rst to README.md (#1251)
  • Support fixed Array elements through the EP fitting pipeline (#1250)
  • docs: convert remaining prose .rst to MyST .md (pass 2) (#1249)
  • Add EPAnalysisFactor for cavity-message injection (#1248)
  • test: delete jax-using unit tests (moved to autofit_workspace_test) (#1247)
  • docs: convert prose .rst files to MyST .md (#1246)

PyAutoArray

  • feat: honor PYAUTO_SMALL_DATASETS in Imaging.from_fits (#301)
  • refactor: replace os.path with pathlib (#300)
  • docs: convert remaining prose .rst to MyST .md (pass 2) (#298)
  • Fix subplot_of_mapper crash on interferometer data_subtracted (#297)
  • fix OOB read in psf_precision_value_from causing NaN sparse-CPU log_evidence (#296)
  • test: remove jax-using unit tests; assertions moved to autolens_workspace_test (#295)
  • docs: convert index.rst to MyST .md (#294)

Full changelog: 2026.5.1.4...2026.5.8.1

v2026.5.1.4

01 May 11:35

Choose a tag to compare

PyAutoGalaxy v2026.5.1.4

Highlights

Python 3.9–3.13 supported, 3.12 / 3.13 recommended

This release expands supported Python versions to 3.9 through 3.13 (#382). 3.12 and 3.13 are first-class recommended; 3.9, 3.10, 3.11 are supported but emit a loud (bypassable) banner on import. Silence the banner via version.python_version_check: False in your workspace's config/general.yaml. Python 3.14 is not yet supported.

Key impacts for users:

  • requires-python = ">=3.9" in pyproject.toml (lower floor than before)
  • Classifiers now cover 3.9, 3.10, 3.11, 3.12, 3.13
  • JAX is now an optional extra: pip install autogalaxy[jax], gated on python_version >= '3.11'. Plain pip install autogalaxy no longer pulls JAX as a transitive dep.

HowToGalaxy moved to its own repo

The HowToGalaxy lecture series now lives in its own repository at PyAutoLabs/HowToGalaxy (#363). Existing URLs/prose in the library and workspace pointing at the previous location have been updated. Clone the new repo to follow the tutorial chapters.

Bug Fixes

  • Mark pytree_token as ephemeral in light/linear profiles via __getstate__ / __setstate__ (#374) — fixes pickling round-trips when JAX pytree-aware profiles are serialised
  • xp-gate jax.scipy.special.factorial in shapelets/exponential.py (#385) — exponential shapelets now use the array-namespace dispatcher instead of a hard JAX import, so the module imports cleanly when JAX is not installed

Internal / Cleanup

  • Remove unused pyprojroot import (#381)
  • Remove jax from unit tests (moved to autogalaxy_workspace_test) (#384) — keeps the library's unit suite numpy-only

Upstream Changes

PyAutoConf

  • Support Python 3.9–3.13, first-class 3.12/3.13 (PyAutoConf#102)
  • Soften Python version check with general.yaml bypass (PyAutoConf#96)

PyAutoArray

PyAutoFit


Full changelog: 2026.4.13.6...2026.5.1.4

v2026.4.13.6

13 Apr 09:46

Choose a tag to compare

PyAutoGalaxy v2026.4.13.6

What's New

Bug Fixes

  • fix: pin autofit/autoarray dependency versions and update homepage (#348)

Upstream Changes

PyAutoFit

  • fix: pin autoconf dependency version and update homepage URL (#1206)

PyAutoArray

  • fix: pin autoconf dependency version and update homepage URL (#273)

Full changelog: 2026.4.13.5...2026.4.13.6

v2026.4.13.5

13 Apr 09:31

Choose a tag to compare

PyAutoGalaxy v2026.4.13.5

What's New

Bug Fixes

  • fix: pin autofit/autoarray dependency versions and update homepage (#348)

Upstream Changes

PyAutoFit

  • fix: pin autoconf dependency version and update homepage URL (#1206)

PyAutoArray

  • fix: pin autoconf dependency version and update homepage URL (#273)

Full changelog: 2026.4.13.3...2026.4.13.5

v2026.4.13.3

13 Apr 08:35

Choose a tag to compare

PyAutoGalaxy v2026.4.13.3

What's New

Breaking Changes

  • refactor: rename env vars to PYAUTO_* prefix (#343)
    • One env var rename. Quantity visualizer now controlled by PYAUTO_SKIP_VISUALIZATION instead of PYAUTOFIT_TEST_MODE. See full details below.
  • fix: give each basis independent ell_comps in mge_model_from (#342)
      • New parameter: centre_per_basis: bool = False on mge_model_from — when True, each basis gets independent centre priors
      • Behaviour change: mge_model_from with gaussian_per_basis > 1 now produces independent ell_comps per basis (was previously tied). Calls with gaussian_per_basis=1 are unchanged.
  • refactor: merge PYAUTO_DISABLE_CRITICAL_CAUSTICS into PYAUTO_FAST_PLOTS (#340)
    • Environment variable only — no Python API changes. PYAUTO_DISABLE_CRITICAL_CAUSTICS is retired; set PYAUTO_FAST_PLOTS=1 instead to skip both tight_layout() and critical-curve/caustic overlay computation. Callers that only set PYAUTO_DISABLE_CRITICAL_CAUSTICS will no longer skip overlays — they must migrate to PYAUTO_FAST_PLOTS=1.
    • Paired PyAutoBuild PR removes the retired flag from the release workflow, default env vars, and docs. A follow-up workspace sweep will remove it from the autofit/autogalaxy/autolens workspace env_vars.yaml, run_scripts.sh, and CLAUDE.md files.
  • feat: reinstate title_prefix on all matplotlib subplot panel titles (#333)
  • refactor: remove integral-based deflection/potential methods from mass profiles (#324)
    • The following methods are removed from mass profile classes:
      • deflections_2d_via_integral_from — removed from Gaussian, Sersic, SersicGradient, NFW, gNFW, gNFWSph
      • deflection_func — removed from Gaussian, Sersic, SersicGradient, NFW, gNFW

New Features

  • docs: update Python version to 3.12-3.13 (#346)
  • perf: defer matplotlib imports and lazy-load plot submodule (#330)
  • perf: cache cosmology distances and cap MGE gaussians for smoke tests (#329)
  • feat: PYAUTO_DISABLE_CRITICAL_CAUSTICS env var to skip curve computation (#325)

Bug Fixes

  • fix: re-export subplot_interferometer_dataset from autogalaxy.plot (#337)
  • Fix cosmology distance cache breaking JAX JIT tracing (#334)
  • fix: correct stale module paths in docs API (#319)

Internal

  • build: add Python 3.13 to CI matrix (#345)
  • build: raise astropy cap, update JAX Partial imports for 0.5+ compat (#344)
  • Retire main_build: check out PyAutoFit main in CI (#338)
  • Expose dataset_util via autogalaxy.util.dataset (#336)
  • Remove Copilot dispatch workflow (#335)
  • perf: remove unused astropy.modeling import from convert.py (#331)
  • perf: skip savefig in _save_subplot when PYAUTO_FAST_PLOTS=1 (#328)
  • refactor: import is_test_mode from autoconf (#327)
  • feat: use tight_layout wrapper for PYAUTO_FAST_PLOTS support (#326)
  • perf: reduce unit test runtime from 82s to 28s (#322)
  • Use centralized is_test_mode() from PyAutoFit (#320)
  • Add ReadTheDocs config with Python 3.12 (#318)
  • Drop Python 3.9-3.11, add 3.13 (#317)

Upstream Changes

PyAutoFit

  • refactor: replace search YAML config with explicit Python defaults (#1202)
  • fix: guard interpolator and grid search against edge cases (#1201)
  • docs: update Python version to 3.12-3.13 (#1199)
  • build: add Python 3.13 support (#1198)
  • build: raise scipy cap, relax threadpoolctl and SQLAlchemy pins (#1197)
  • fix: bump scipy cap to <=1.15.2 (#1196)
  • refactor: separate PYAUTOFIT_TEST_MODE into distinct PYAUTO_* env vars (#1195)

PyAutoArray

  • fix: guard zoom_array against non-autoarray mask objects (#270)
  • build: add Python 3.13 to CI matrix (#268)
  • build: raise caps on scipy, astropy, scikit-image, scikit-learn (#267)
  • fix: bump scipy cap to <=1.15.2 (#266)
  • refactor: rename env vars to PYAUTO_* prefix (#265)
  • Guarantee GaussianKernel regularization matrix is PD (#264)
  • refactor: clamp brightest_coordinate_in_region_from to array bounds (#263)
  • fix: add _mappings_sizes_weights_split to InterpolatorRectangular (#262)
  • Add should_simulate utility for auto-simulation with small datasets (#261)
  • feat: add title_prefix support to subplot_imaging_dataset (#260)
  • perf: defer scipy imports to reduce import time (#259)
  • perf: skip radial bins computation when PYAUTO_WORKSPACE_SMALL_DATASETS=1 (#258)
  • perf: force over_sample_size=2 when PYAUTO_WORKSPACE_SMALL_DATASETS=1 (#257)
  • fix: import is_test_mode from autoconf instead of autofit (#256)
  • perf: skip savefig rendering in PYAUTO_FAST_PLOTS mode (#255)
  • feat: add tight_layout wrapper with PYAUTO_FAST_PLOTS env var (#254)
  • feat: PYAUTO_WORKSPACE_SMALL_DATASETS env var for fast smoke tests (#253)
  • perf: speed up unit tests 63% by removing JAX from triangle tests (#252)
  • Use centralized is_test_mode() from PyAutoFit (#250)
  • Drop Python 3.9-3.11, add 3.13 (#249)

Full changelog: 2026.4.5.3...2026.4.13.3

v2026.4.5.3

05 Apr 18:59

Choose a tag to compare

PyAutoGalaxy v2026.4.5.3

What's New

New Features

  • Use configurable output_format default from autoarray (#316)
  • Update docs for new flat plot function API (#315)

Bug Fixes

  • Fix JAX jit boundary in LensCalc + document decorator/JAX patterns (#291)
  • feature/ell_comps_division_0_bug_fix (#278)
  • feature/geometry_hot_fix (#274)
  • Jax hot fix (#273)

Internal

  • Drop Python 3.9-3.11, add 3.13 (#317)
  • Visualization final: fits API, plot consolidation (#314)
  • Visualization cleanup and NFW truncated enhancements (#313)
  • Add jax_zero_contour-based critical curve and caustic tracing (#312)
  • Remove sigma cb_unit from normalized residual map in subplot_fit (#311)
  • Plot improvements: rename fits functions, move fits_to_fits, add cb_unit (#310)
  • Plot improvements batch 2 (#309)
  • Overhaul plot styling and extract fits_* output functions (#308)
  • Rename PlotterInterface -> Plotter; extract subplot functions; update docs (#307)
  • PR G1-G2: replace mat_plot_2d.plot_array with _plot_array() bridge in… (#306)
  • Refactor mass profile unit tests to be more granular (#305)
  • Feature/ellipse utils (#304)
  • docs(api): update RST API reference pages for consistency (#303)
  • docs(util): add module-level docstrings to util package (#302)
  • docs(aggregator): add module-level docstrings to aggregator package (#301)
  • docs: add module docstrings to analysis package (#300)
  • docs: add module docstrings to quantity package (#299)
  • docs: add module docstrings to ellipse package (#298)
  • docs: add module docstrings to interferometer package (#297)
  • docs: add module docstrings and fill missing docstrings in imaging package (#296)
  • docs: add module docstrings and fill missing method docstrings in operate package (#295)
  • docs: add module docstring and improve class docstrings in cosmology package (#294)
  • docs: add module docstrings and improve method docstrings in galaxy package (#293)
  • docs: add module docstrings and improve method docstrings in profiles package (#292)
  • Feature/cnfw mge (#290)
  • Add luminosity_distance to LensingCosmology (#289)
  • Add hilbert_pixels_from_pixel_scale to model_util (#288)
  • Add mge_point_model_from to model_util for compact point-source model… (#287)
  • feature/jaxify_gnfw_conc (#286)
  • Feature/deflections operate jax (#285)
  • Feature/jax mge (#284)
  • Feature/remove preloads (#283)
  • Feature/psf convolution refactor (#282)
  • Feature/mesh refactor (#281)
  • Feature/cored nfw (#280)
  • Feature/jax e nfw (#279)
  • Feature/jax in image dict (#277)
  • Feature/unconvolved images (#276)
  • Feature/linalg mixed precision (#275)
  • zeta_from made jax compatible, zeta_from and wofz in higher precision… (#272)
  • Feature/fft jax imaging (#271)
  • Feature/cosmology jax (#269)
  • Feature/gaussian mass (#268)
  • feature/remove_mapper_valued (#267)

Upstream Changes

PyAutoFit

  • Drop Python 3.9-3.11, add 3.13 (#1177)
  • Make search logging JAX-aware (#1176)
  • Flatten plot API: replace Plotter classes with module-level functions (#1174)
  • Add expanded model mapping unit tests (#1172)
  • feature/jax_cpu_jit (#1170)
  • feature/jax_cpu_batch_size_1 (#1169)
  • feature/samples_summary_failsafe (#1168)

PyAutoArray

  • Drop Python 3.9-3.11, add 3.13 (#249)
  • Make output_format configurable, default to show (#248)
  • Visualization final: config origin, fits API, output mode (#247)
  • Colorbar tick fontsize reduction and scientific notation consistency (#246)
  • Plot improvements: DPI config, Delaunay aspect ratio, tick rounding, source vmax (#244)
  • Add RGB support to plot_array (#243)
  • Plot improvements: line_colors, is_subplot colorbar sizing, inversion panels (#242)
  • Plot improvements: arcsec tick labels, circular import fix, test imports (#241)
  • Plot improvements batch 2 (#240)
  • Overhaul 2D plot styling and subplot layout (#239)
  • Add subplot_imaging and subplot_imaging_dataset_list standalone plot functions (#238)
  • Claude/refactor plotting module s6 zq1 (#236)
  • Refactor dataset and operator tests for granularity and clarity (#235)
  • Refactor inversion and mapper tests for granularity and clarity (#234)
  • Refactor regularization tests for granularity and clarity (#233)
  • refactor: split mask tests into granular focused tests (#232)
  • refactor: split structures tests into granular focused tests (#231)
  • refactor: split fit tests into granular focused tests (#230)
  • improve docstrings for autoarray/inversion package and update fit log… (#229)
  • Improve docstrings for autoarray/fit package (#228)
  • docs: refactor docstrings for autoarray/structures package (#227)
  • docs: refactor docstrings for autoarray/mask package (#226)
  • docs: refactor and complete docstrings for autoarray/geometry (#225)
  • docs: refactor and complete docstrings for autoarray/dataset (#224)
  • Add CLAUDE.md documenting decorator system and JAX jit boundary (#223)
  • eature/blurring_mask_padding (#222)
  • perform fix by not linking state blurring grid to dataset grid (#221)
  • Feature/remove preloads (#220)
  • fix rectangular mesh grid plot (#219)
  • Feature/psf convolution refactor (#218)
  • Feature/mesh refactor (#217)
  • feature/psf_centering_fix (#216)
  • Feature/matern adaptive ([#214]...
Read more