Skip to content

v2026.7.9.1 β€” πŸ“£ Major Milestones Announcement

Latest

Choose a tag to compare

@Jammy2211 Jammy2211 released this 09 Jul 18:47
01727a3

πŸ“£ PyAutoLens 2026.7.9.1 β€” Three Major Milestones

πŸ’¬ Discuss this release: Announcements #603

I'm happy to announce that with the release of PyAutoLens 2026.7.9.1 we have achieved three major milestones for the software:

πŸ€– AI Assistant

PyAutoLens now supports two complementary AI workflows:

  • Conversational AI (e.g. ChatGPT and Claude) to help you learn the API, understand concepts, debug errors, and answer lens modelling questions.
  • Agentic AI (e.g. Claude Code and Codex) to inspect your data, write and execute scripts, and carry out end-to-end lens modelling workflows directly on your machine.

See the autolens_assistant for setup instructions and examples.

⚑ JAX GPU Support

Full GPU-accelerated JAX support is now available for galaxy-, group-, and cluster-scale strong lens modelling across imaging, interferometer, point-source, and datacube datasets, as well as weak gravitational lensing.

πŸ› οΈ Agentic AI Development

PyAutoLens is now developed using an agentic AI ecosystem for human-led, natural-language software development, called PyAutoScientist. If you're interested in how this works, visit https://github.com/PyAutoLabs. Documentation is still a work in progress, but we're actively expanding it.

πŸ’¬ Feedback

These are significant changes to how PyAutoLens is developed and used, and we'd love your feedback. In particular, the AI tooling is evolving rapidly, so if you try the AI assistant or agentic workflows, please let us know what works well, what doesn't, and where the documentation can be improved. Your feedback will directly shape future development.

A huge thank you to everyone who has contributed to PyAutoLens over the years. We're excited to see what these new capabilities enable for the community!


PyAutoLens v2026.7.9.1

What's New

Breaking Changes

  • feat: over/under-prediction policies for point-source pairing likelihoods (#586)
    • FitPositionsImagePairRepeat gains an unmatched_model_policy class attribute β€” "magnification_filter" (new default: extra model images with |ΞΌ| < magnification_threshold=0.1 are exempt per the demagnified-central observational convention, brighter extras add distance-to-nearest-observed penalty residuals), "penalize", "ignore" (the historical behaviour, now explicit) β€” plus a no_image_residual finite floor when the solver returns no images and an n_unmatched_model_positions diagnostic. FitPositionsImagePair (Hungarian) now penalizes unmatched observed positions instead of dropping them. Behaviour change: fits where the max-likelihood model over-predicts bright images or under-predicts will report (correctly) worse likelihoods than before; equal-count well-matched fits are numerically unchanged (regression-tested).
  • feat: support Kaplinghat halos in substructure arrays (#567)
    • Adds support for al.mp.KaplinghatCoredNFWSph and al.mp.KaplinghatCoredNFWMCRLudlowSph in autolens.lens.substructure_util.galaxies_to_halo_arrays.
    • Unsupported profile classes now raise ValueError instead of being implicitly interpreted as truncated NFW profiles.
  • feat: datacube shared-state for AnalysisInterferometer via curvature preloads (#566)
  • Honour PYAUTO_TEST_MODE in LOSSampler to fix los_halos simulator timeouts (#559)
    • autolens.lens.los.negative_kappa_from gains two optional keyword arguments, quad_limit=50 and quad_epsrel=1.49e-8 (both scipy's own quad defaults), threaded into its inner and outer integrals. Existing callers are unaffected. LOSSampler.galaxies_from now reads autoconf.test_mode.is_test_mode() internally; its signature is unchanged. No removals or renames. See full details below.

New Features

  • feat: FitWeak per-galaxy sigma_crit scaling + JAX support (weak series step 10) (#591)
  • feat: WeakDataset catalog IO + reduced shear (weak series step 7a) (#589)
  • feat: tangential/cross shear profiles + Kaiser-Squires map (weak series step 6) (#582)
  • feat: AnalysisWeak β€” weak lensing modeling (weak series step 4) (#580)
  • feat: cluster-scale visualization β€” per-plane critical curves/caustics aplt helpers (#578)
  • docs: add signpost llms.txt + consolidate agent instructions into AGENTS.md (#570)
  • test: regression guard for HowToLens tutorial_3 NaN axis-limits crash (#560)

Bug Fixes

  • docs: fix dead HowToLens Colab links + purge stale allowlist entries (#594)
  • fix: write dataset.fits in save_attributes for aggregator (#574)
  • fix(jax): defensive pytree dedup in imaging/interferometer analyses (#561)

Internal

  • docs: document the functional plot API in plot.rst (#596)
  • docs: three-ways-to-learn guide + prune stale API-doc references (#593)
  • fix: mixed-dataset factor graphs crash combined visualization (#587)
  • feat: cap SimulatorShearYX catalogue size under PYAUTO_SMALL_DATASETS (weak series step 9) (#584)
  • docs: add dPIEMassLenstool / dPIEMassLenstoolSph to mass API autosummary (#576)
  • feat: oversampled PSF support in SimulatorImaging.via_tracer_from (#575)
  • ci: call the reusable lib-tests workflow from PyAutoHeart (not PyAutoPulse) (#573)
  • main.yml β†’ thin caller to Pulse reusable lib-tests (Stage 4 Phase A) (#572)
  • Remove url_check.yml: URL hygiene centralised in PyAutoPulse (#571)
  • docs: consolidate agent instructions into canonical AGENTS.md (#569)
  • refactor(latent): LatentLens class + declare Analysis.Latent (Phase 2) (#568)

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)

PyAutoGalaxy

  • docs: document the functional plot API in plot.rst (#494)
  • docs: fix dead HowToGalaxy Colab links + purge stale allowlist entries (#493)
  • docs: prune stale API-doc references (#492)
  • feat: CSV API extensions from the stress-test (light variants, loud guards, table properties, flat cosmology) (#491)
  • refactor: unify the blurred-image evaluate/pre-bin/convolve tail (#489)
  • feat: Lenstool-native dPIE parameterization (from_lenstool + dPIEMassLenstool) and analytic potential (#487)
  • 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)
  • feat: oversampled PSF blurred images β€” operate/image consumer (phase 2c) (#481)
  • fix: restore unconditional dataset.fits output for aggregator (save_attributes) (#479)
  • 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: add signpost llms.txt + consolidate agent instructions into AGENTS.md (#474)
  • docs: consolidate agent instructions into canonical AGENTS.md (#473)
  • refactor(latent): LatentGalaxy class + declare Analysis.Latent (Phase 2) (#472)
  • feat: add Kaplinghat SIDM cored NFW profile (#471)
  • Lensing potential for elliptical/spherical dark-matter profiles (NFW/gNFW) + NFWSph fix (#470)
  • fix(jax): defensive pytree dedup in imaging/interferometer analyses (#468)
  • fix(mass): convergence_func on PowerLawBroken, PowerLawMultipole, cNFW family (#467)

Full changelog: 2026.5.29.4...2026.7.9.1