Releases: PyAutoLabs/PyAutoFit
v2026.5.29.4
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 acceptsuse_jax_for_visualization. Visualization now automatically followsuse_jax— if the search uses JAX, visualization does too. The_jitted_fit_fromlazy JIT cache on Analysis is removed; the warmup inFitness.__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_MODEenvironment variable is set (any truthy value), AutoFit search output paths get atest_mode/segment inserted directly afterconf.instance.output_path. This affects every search-output path including SQLite database files opened viaopen_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-writtensubplot_fit.pngto the active cell viaIPython.display.update_display. Outside a kernel — unchanged (PNG-on-disk only). No public symbol removed, renamed, or signature-broken.
- One additive optional kwarg on
- 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 raiseValueErroratcompute_latent_samplestime with a clear message.
- New public class attribute
- Fix Sample.kwargs mixed string/tuple key bug (#1287)
- Internal in-memory representation of
Sample.kwargsis now uniformly tuple-keyed — single-name keys become('name',)instead of staying as raw strings. All serialized forms (CSV headers, database JSON viaSample.dict()) are unchanged because they already join tuples back to dotted strings on serialize, andSample.__init__re-tuples them on deserialize, so the round-trip is symmetric. The change also silently repairsSamples.values_for_pathand the aggregator CSVColumn.valuelookup, both of which expected tuple keys but would have silently failed on dotless-name kwargs pre-fix.
- Internal in-memory representation of
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
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.NSSImportErrormessage changes to reference the new install command. No code-API changes.
- Pure additive at the install layer (
- 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_updatewas already accepted in Phase 1 and is now functional. New module-level helpers_save_checkpoint/_load_checkpointand a new_NSSInternalrepackaging step. No existing API touched.
- Pure additive at the kwarg level (
- fix: log_prior_from_value sign convention — density form across Prior subclasses (#1269)
Prior.log_prior_from_valueis 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 onLogUniformPrior. The normalisation constants-log(σ · √(2π))and-log(log(b/a))are dropped from the returned value, matchingUniformPrior.log_prior_from_valuewhich drops-log(b-a)to return0.0. The math of the search is invariant to these constants.
- Disable model.graph output by default (#1264)
-
- New config key
output.model_graph(defaultfalse) inautofit/config/output.yaml.
- New config key
-
- Default behaviour change:
model.graphis no longer written for any fit unlessmodel_graph: trueis set in the user'soutput.yaml. Graphical-model users who want the factor-graph summary file must opt in.
- Default behaviour change:
-
- feat: JAX-native priors — xp dispatch on value_for / log_prior_from_value / vector_from_unit_vector (#1263)
- Added an
xp=npkeyword toPrior.value_for,Prior.log_prior_from_value,Model.vector_from_unit_vector,NormalMessage.value_for, andTruncatedNormalMessage.value_for. Defaultxp=nppreserves every existing NumPy caller. Each of the five concretePriorsubclasses (UniformPrior,LogUniformPrior,GaussianPrior,TruncatedGaussianPrior,LogGaussianPrior) now overridesvalue_forwith a closed-form JAX path that runs symbolically underjax.jit.NormalMessage.value_forreplaces the legacyisinstance(unit, np.ndarray)runtime sniff with explicitxpdispatch.
- Added an
- fix: exclude exclude_identifier_fields attrs from model.info (#1261)
__exclude_identifier_fields__now suppresses an attribute from both the unique_id hash andAbstractPriorModel.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__(PyAutoGalaxyLightProfileLinear) get the cleanermodel.infoautomatically 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
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
⚠️ 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_combinednow declaresquick_update: bool = Falseso callers may pass it (the factor-graph dispatch always does). Default no-op behaviour is preserved; subclasses that already override the method without**kwargsget unblocked. See full details below.
- Tiny additive signature change on a single method.
- 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— anAnalysisFactorsubclass with aset_cavity_dist(cavity_dist)hook that the EP optimiser invokes before every fit, attaching the cavityMeanFieldtoanalysis._cavity_mean_fieldso the user'slog_likelihood_functioncan read per-variable cavity messages (.mean,.sigma) at evaluation time. No symbols removed, renamed, or behaviour-changed for existing factors. See full details below.
- Added
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
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_combinednow declaresquick_update: bool = Falseso callers may pass it (the factor-graph dispatch always does). Default no-op behaviour is preserved; subclasses that already override the method without**kwargsget unblocked. See full details below.
- Tiny additive signature change on a single method.
- 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— anAnalysisFactorsubclass with aset_cavity_dist(cavity_dist)hook that the EP optimiser invokes before every fit, attaching the cavityMeanFieldtoanalysis._cavity_mean_fieldso the user'slog_likelihood_functioncan read per-variable cavity messages (.mean,.sigma) at evaluation time. No symbols removed, renamed, or behaviour-changed for existing factors. See full details below.
- Added
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
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"inpyproject.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 onpython_version >= '3.11'. Plainpip install autofitno longer pulls JAX as a transitive dep. Analysis(use_jax=True)falls back to numpy with aUserWarningwhen 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_samplesnow skips samples that raised aFitExceptioninstead of crashing the whole computation (#1233)
Internal / Cleanup
- Remove unused
pyprojrootdependency (#1242) —pip install autofitno 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.yamlbypass (PyAutoConf#96)
Full changelog: 2026.4.13.6...2026.5.1.4
v2026.4.13.6
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
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
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
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