Skip to content

Releases: PyAutoLabs/PyAutoGalaxy

v2026.6.26.642

26 Jun 06:11

Choose a tag to compare

PyAutoGalaxy v2026.6.26.642

No direct changes in this release.

Upstream Changes

PyAutoArray

  • Add optional arcsecond double-prime tick labels (#350)

Full changelog: 2026.6.25.641...2026.6.26.642

v2026.6.25.641

25 Jun 06:07

Choose a tag to compare

PyAutoGalaxy v2026.6.25.641

What's New

Breaking Changes

  • Lensing potential for elliptical/spherical dark-matter profiles (NFW/gNFW) + NFWSph fix (#470)
    • Adds a working potential_2d_from to the elliptical/spherical dark-matter profiles (via a single MGE-decomposition method on gNFW, inherited by NFW, gNFWSph, and all MCR/Virial variants). Corrects NFWSph.potential_2d_from (it returned values a factor of r_s too small). No public signatures removed or renamed; MassProfile.potential_2d_from now accepts xp/**kwargs (additive). Behaviour change: NFWSph potential values are now correct (≈ r_s× larger than before). See full details below.
  • 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.

New Features

  • docs: add signpost llms.txt + consolidate agent instructions into AGENTS.md (#474)

Bug Fixes

  • fix(jax): defensive pytree dedup in imaging/interferometer analyses (#468)

Internal

  • 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

  • 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

  • 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.6.25.641

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