PyAutoLens v2026.7.9.1
What's New
Breaking Changes
- feat: over/under-prediction policies for point-source pairing likelihoods (#586)
FitPositionsImagePairRepeatgains anunmatched_model_policyclass 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 ano_image_residualfinite floor when the solver returns no images and ann_unmatched_model_positionsdiagnostic.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.KaplinghatCoredNFWSphandal.mp.KaplinghatCoredNFWMCRLudlowSphinautolens.lens.substructure_util.galaxies_to_halo_arrays. - Unsupported profile classes now raise
ValueErrorinstead of being implicitly interpreted as truncated NFW profiles.
- Adds support for
- 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_fromgains two optional keyword arguments,quad_limit=50andquad_epsrel=1.49e-8(both scipy's ownquaddefaults), threaded into its inner and outer integrals. Existing callers are unaffected.LOSSampler.galaxies_fromnow readsautoconf.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