Skip to content

Releases: PyAutoLabs/PyAutoFit

v2026.5.29.4

29 May 10:25

Choose a tag to compare

PyAutoFit v2026.5.29.4

What's New

Breaking Changes

  • fix(nss): chunked algo.init follow-up to #1303 (#1305)
  • Remove use_jax_for_visualization; add visualization warmup (#1297)
    • Analysis.__init__ no longer accepts use_jax_for_visualization. Visualization now automatically follows use_jax — if the search uses JAX, visualization does too. The _jitted_fit_from lazy JIT cache on Analysis is removed; the warmup in Fitness.__init__ is a better approach (pre-compiles before sampling, not on first quick update). See full details below.
  • 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)
    • No public symbol additions, removals, or signature changes.
    • Behaviour change: when the PYAUTO_TEST_MODE environment variable is set (any truthy value), AutoFit search output paths get a test_mode/ segment inserted directly after conf.instance.output_path. This affects every search-output path including SQLite database files opened via open_database() with a relative filename.
  • feat(quick_update): IPython.display.update_display for live Jupyter cells (#1290)
    • One additive optional kwarg on BackgroundQuickUpdate: display_id: str = "pyauto_fit_progress". Behavioural change: when running inside a Jupyter / Colab kernel, the worker additionally pushes the freshly-written subplot_fit.png to the active cell via IPython.display.update_display. Outside a kernel — unchanged (PNG-on-disk only). No public symbol removed, renamed, or signature-broken.
  • feat(analysis): LATENT_BATCH_MODE attribute (vmap default, jit option) (#1288)
    • New public class attribute Analysis.LATENT_BATCH_MODE: str (default "vmap"). Two values supported: "vmap" and "jit". Other values raise ValueError at compute_latent_samples time with a clear message.
  • Fix Sample.kwargs mixed string/tuple key bug (#1287)
    • Internal in-memory representation of Sample.kwargs is now uniformly tuple-keyed — single-name keys become ('name',) instead of staying as raw strings. All serialized forms (CSV headers, database JSON via Sample.dict()) are unchanged because they already join tuples back to dotted strings on serialize, and Sample.__init__ re-tuples them on deserialize, so the round-trip is symmetric. The change also silently repairs Samples.values_for_path and the aggregator CSV Column.value lookup, both of which expected tuple keys but would have silently failed on dotless-name kwargs pre-fix.

Bug Fixes

  • fix(jax): structural defense against cached_property pytree/dict leaks (#1302)
  • fix(jax): keep parameterization cache off ModelInstance + auto-register pytrees (#1300)

Internal

  • chore(deps): allow anesthetic>=2.9.0 to unblock jax>=0.7 / numpy>=2 resolution (#1306)
  • feat(nss): chunk_size kwarg for inversion-heavy A100 likelihoods (#1303)
  • Cache model.parameterization; try interactive matplotlib backends (#1299)
  • Prefer fit_quick.png in quick-update display candidates (#1298)
  • fix: skip _compute_latent_samples in PYAUTO_TEST_MODE (#1294) (#1295)
  • nss extras: strip git+https URLs to unblock PyPI uploads (#1286)

Full changelog: 2026.5.21.1...2026.5.29.4

v2026.5.21.1

21 May 09:46

Choose a tag to compare

PyAutoFit v2026.5.21.1

What's New

Breaking Changes

  • 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)
    • Pure additive at the install layer (autofit[nss] extra). The af.NSS ImportError message changes to reference the new install command. No code-API changes.
  • feat: af.NSS checkpoint/resume + on-the-fly visualization (Phases 2-3) (#1274)
    • Pure additive at the kwarg level (checkpoint_interval=100); iterations_per_quick_update was already accepted in Phase 1 and is now functional. New module-level helpers _save_checkpoint / _load_checkpoint and a new _NSSInternal repackaging step. No existing API touched.
  • fix: log_prior_from_value sign convention — density form across Prior subclasses (#1269)
    • Prior.log_prior_from_value is a behaviour change, not a signature change. The kwarg surface is unchanged ((value, xp=np)). Returned values are sign-flipped on the JAX-family priors and replaced with the correct density-form expression on LogUniformPrior. The normalisation constants -log(σ · √(2π)) and -log(log(b/a)) are dropped from the returned value, matching UniformPrior.log_prior_from_value which drops -log(b-a) to return 0.0. The math of the search is invariant to these constants.
  • Disable model.graph output by default (#1264)
      • New config key output.model_graph (default false) in autofit/config/output.yaml.
      • Default behaviour change: model.graph is no longer written for any fit unless model_graph: true is set in the user's output.yaml. Graphical-model users who want the factor-graph summary file must opt in.
  • feat: JAX-native priors — xp dispatch on value_for / log_prior_from_value / vector_from_unit_vector (#1263)
    • Added an xp=np keyword to Prior.value_for, Prior.log_prior_from_value, Model.vector_from_unit_vector, NormalMessage.value_for, and TruncatedNormalMessage.value_for. Default xp=np preserves every existing NumPy caller. Each of the five concrete Prior subclasses (UniformPrior, LogUniformPrior, GaussianPrior, TruncatedGaussianPrior, LogGaussianPrior) now overrides value_for with a closed-form JAX path that runs symbolically under jax.jit. NormalMessage.value_for replaces the legacy isinstance(unit, np.ndarray) runtime sniff with explicit xp dispatch.
  • fix: exclude exclude_identifier_fields attrs from model.info (#1261)
    • __exclude_identifier_fields__ now suppresses an attribute from both the unique_id hash and AbstractPriorModel.info. Previously it only affected the hash. No public symbols added, removed, or renamed; no signatures changed. Downstream libraries that already declare __exclude_identifier_fields__ (PyAutoGalaxy LightProfileLinear) get the cleaner model.info automatically without a code change.

New Features

  • feat: af.NSS NonLinearSearch wrapper for Nested Slice Sampling (Phase 1 of nss_first_class_sampler) (#1272)
  • fix: add quick_update kwarg to VisualizerExample.visualize_combined (#1267)

Bug Fixes

  • docs: audit-driven URL fixes across docs, READMEs, and docstrings (#1265)

Internal

  • 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)
  • fix: dedupe number_of_cores in Drawer for from_dict round-trip (#1270)
  • ci: add live URL audit (weekly cron) + grandfather current broken URLs (#1268)

Full changelog: 2026.5.14.2...2026.5.21.1

v2026.5.14.2

14 May 15:10

Choose a tag to compare

PyAutoFit v2026.5.14.2

What's New

Bug Fixes

  • fix: populate NUTS samples_info keys under test-mode bypass (#1260)

Internal

  • fix: stop passing dataset=None to fit_cls when sensitivity Job is complete (#1259)

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.

PyAutoFit v2026.5.8.2

What's New

Breaking Changes

  • feat: add BlackJAXNUTS first-class non-linear search (#1256)
  • Visualizer.visualize_combined: accept quick_update kwarg (#1254)
    • Tiny additive signature change on a single method. Visualizer.visualize_combined now declares quick_update: bool = False so callers may pass it (the factor-graph dispatch always does). Default no-op behaviour is preserved; subclasses that already override the method without **kwargs get unblocked. See full details below.
  • Fix AnalysisFactor.visualize_combined dispatch in FactorGraph (#1253)
  • Support fixed Array elements through the EP fitting pipeline (#1250)
  • Add EPAnalysisFactor for cavity-message injection (#1248)
    • Added af.EPAnalysisFactor — an AnalysisFactor subclass with a set_cavity_dist(cavity_dist) hook that the EP optimiser invokes before every fit, attaching the cavity MeanField to analysis._cavity_mean_field so the user's log_likelihood_function can read per-variable cavity messages (.mean, .sigma) at evaluation time. No symbols removed, renamed, or behaviour-changed for existing factors. See full details below.

Bug Fixes

  • fix: populate NUTS samples_info keys under test-mode bypass (#1260)

Internal

  • fix: stop passing dataset=None to fit_cls when sensitivity Job is complete (#1259)
  • refactor: replace os.path with pathlib (#1258)
  • Refresh cached SearchUpdater when AbstractSearch.paths is reassigned (#1252)
  • docs: update workspace prose refs from README.rst to README.md (#1251)
  • docs: convert remaining prose .rst to MyST .md (pass 2) (#1249)
  • test: delete jax-using unit tests (moved to autofit_workspace_test) (#1247)
  • docs: convert prose .rst files to MyST .md (#1246)

Full changelog: 2026.5.1.4...2026.5.8.2

v2026.5.8.1

08 May 18:20

Choose a tag to compare

PyAutoFit v2026.5.8.1

What's New

Breaking Changes

  • feat: add BlackJAXNUTS first-class non-linear search (#1256)
  • Visualizer.visualize_combined: accept quick_update kwarg (#1254)
    • Tiny additive signature change on a single method. Visualizer.visualize_combined now declares quick_update: bool = False so callers may pass it (the factor-graph dispatch always does). Default no-op behaviour is preserved; subclasses that already override the method without **kwargs get unblocked. See full details below.
  • Fix AnalysisFactor.visualize_combined dispatch in FactorGraph (#1253)
  • Support fixed Array elements through the EP fitting pipeline (#1250)
  • Add EPAnalysisFactor for cavity-message injection (#1248)
    • Added af.EPAnalysisFactor — an AnalysisFactor subclass with a set_cavity_dist(cavity_dist) hook that the EP optimiser invokes before every fit, attaching the cavity MeanField to analysis._cavity_mean_field so the user's log_likelihood_function can read per-variable cavity messages (.mean, .sigma) at evaluation time. No symbols removed, renamed, or behaviour-changed for existing factors. See full details below.

Bug Fixes

  • fix: populate NUTS samples_info keys under test-mode bypass (#1260)

Internal

  • fix: stop passing dataset=None to fit_cls when sensitivity Job is complete (#1259)
  • refactor: replace os.path with pathlib (#1258)
  • Refresh cached SearchUpdater when AbstractSearch.paths is reassigned (#1252)
  • docs: update workspace prose refs from README.rst to README.md (#1251)
  • docs: convert remaining prose .rst to MyST .md (pass 2) (#1249)
  • test: delete jax-using unit tests (moved to autofit_workspace_test) (#1247)
  • docs: convert prose .rst files to MyST .md (#1246)

Full changelog: 2026.5.1.4...2026.5.8.1

v2026.5.1.4

01 May 11:35

Choose a tag to compare

PyAutoFit 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 (#1244). 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 (parked on a known FactorGraphModel iteration bug).

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 autofit[jax], gated on python_version >= '3.11'. Plain pip install autofit no longer pulls JAX as a transitive dep.
  • Analysis(use_jax=True) falls back to numpy with a UserWarning when JAX isn't installed, instead of failing at import time.

JAX-jitted likelihoods in Dynesty (use_jax_jit)

Dynesty searches now support JAX-jitted likelihood evaluation via the new use_jax_jit option (#1243). For likelihood-bound runs, this can deliver substantial speedups by JIT-compiling the likelihood once instead of evaluating it interpretively per sample.

Bug Fixes

  • compute_latent_samples now skips samples that raised a FitException instead of crashing the whole computation (#1233)

Internal / Cleanup

  • Remove unused pyprojroot dependency (#1242) — pip install autofit no longer pulls pyprojroot
  • Delete jax-using unit tests; cross-xp checks live in autofit_workspace_test (#1247) — 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)

Full changelog: 2026.4.13.6...2026.5.1.4

v2026.4.13.6

13 Apr 09:46

Choose a tag to compare

PyAutoFit v2026.4.13.6

What's New

Bug Fixes

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

Full changelog: 2026.4.13.5...2026.4.13.6

v2026.4.13.5

13 Apr 09:31

Choose a tag to compare

PyAutoFit v2026.4.13.5

What's New

Bug Fixes

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

Full changelog: 2026.4.13.3...2026.4.13.5

v2026.4.13.3

13 Apr 08:35

Choose a tag to compare

PyAutoFit v2026.4.13.3

What's New

Breaking Changes

  • fix: guard interpolator and grid search against edge cases (#1201)

New Features

  • docs: update Python version to 3.12-3.13 (#1199)

Bug Fixes

  • fix: bump scipy cap to <=1.15.2 (#1196)

Internal

  • refactor: replace search YAML config with explicit Python defaults (#1202)
  • build: add Python 3.13 support (#1198)
  • build: raise scipy cap, relax threadpoolctl and SQLAlchemy pins (#1197)
  • refactor: separate PYAUTOFIT_TEST_MODE into distinct PYAUTO_* env vars (#1195)

Full changelog: 2026.4.5.3...2026.4.13.3

v2026.4.5.3

05 Apr 18:59

Choose a tag to compare

PyAutoFit v2026.4.5.3

What's New

New Features

  • Flatten plot API: replace Plotter classes with module-level functions (#1174)

Bug Fixes

  • fixes to figure of merit (#1166)

Internal

  • Drop Python 3.9-3.11, add 3.13 (#1177)
  • Make search logging JAX-aware (#1176)
  • Add expanded model mapping unit tests (#1172)
  • feature/jax_cpu_jit (#1170)
  • feature/jax_cpu_batch_size_1 (#1169)
  • feature/samples_summary_failsafe (#1168)

Full changelog: 2025.5.10.1...2026.4.5.3