From 7e62fa4da6c597033a9881e7a524d173113ec3fe Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Wed, 30 Sep 2026 15:47:25 +0100 Subject: [PATCH 1/3] test: red amplitude regression for the raw-forward PDIP forward value (#594) Fixture mge_solver_reference_systems.npz: the 8 #571 SLaM systems and the euclid vis_lp system with fnnls x_ref, copied from the autolens_profiling solver corpus at 3ad68af. The new test gates inactive-column, total and source-column flux at 1e-3, jit == eager, primal == differentiated forward, and finite non-zero gradients. Red on bd03e09e (12/107): euclid inactive + total flux, source flux on k1, k2, k3, k5, on both the library entry and the dispatch path. Co-Authored-By: Claude Fable 5.1 --- .../inversion/inversion/files/README.md | 10 + .../files/mge_solver_reference_systems.npz | Bin 0 -> 181720 bytes .../test_nnls_raw_forward_amplitude.py | 296 ++++++++++++++++++ 3 files changed, 306 insertions(+) create mode 100644 test_autoarray/inversion/inversion/files/mge_solver_reference_systems.npz create mode 100644 test_autoarray/inversion/inversion/test_nnls_raw_forward_amplitude.py diff --git a/test_autoarray/inversion/inversion/files/README.md b/test_autoarray/inversion/inversion/files/README.md index 77a5bbc0f..dbf386900 100644 --- a/test_autoarray/inversion/inversion/files/README.md +++ b/test_autoarray/inversion/inversion/files/README.md @@ -15,3 +15,13 @@ Captured 2026-09-25 on CPU fp64 via a `jax.debug.callback` on `reconstruction_positive_only_from`, with autolens_workspace_test 5ec64413d2, PyAutoArray 3de624b5b9, PyAutoGalaxy 70a61e26cd, PyAutoLens 86054bbc19, PyAutoFit dd9fbe0aab, jax 0.10.2, numpy 2.5.3. +- `mge_solver_reference_systems.npz` — 9 positive-only MGE systems (60x60 fp64) with their fnnls reference + solutions, for the raw-forward PDIP amplitude regression (PyAutoArray#594): keys `Q_` / `q_` / + `x_ref_` for names `k0`..`k7` (the 8 #571 SLaM `source_lp[1]` systems, identical to + `mge_slam_nnls_systems.npz`) and `euclid_vis_lp` (the euclid pipeline vis_lp system behind + `test_latent_euclid_variables_traces_under_jax_jit`, captured with PyAutoArray d4298445). `meta` is a JSON + string with per-system `group`, `source_column_index_list`, `max_abs_q`, `cond_Q`, `category` and reference + active-column counts, plus provenance. Copied verbatim (no recomputation) from the autolens_profiling solver + corpus `results/lens/solver/corpus/{slam_fixture_571,euclid_vis_lp}.npz` + `manifest.json` at + autolens_profiling 3ad68af (phase-1 record `complete/2026/09/linear-solver-accuracy-study.md`) by a one-off + script outside the repo that checks symmetry of `Q`, `x_ref >= 0` and `max|q|` against the manifest. diff --git a/test_autoarray/inversion/inversion/files/mge_solver_reference_systems.npz b/test_autoarray/inversion/inversion/files/mge_solver_reference_systems.npz new file mode 100644 index 0000000000000000000000000000000000000000..0bda729803c45f24ee86966cc7219eaf5e1e6aee GIT binary patch literal 181720 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%0Dj0gSkiVxa(yH8i(6?ykR-GEby(2@i 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�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 T_t3t}O?`_|KSftlt#|wz!i_6U literal 0 HcmV?d00001 diff --git a/test_autoarray/inversion/inversion/test_nnls_raw_forward_amplitude.py b/test_autoarray/inversion/inversion/test_nnls_raw_forward_amplitude.py new file mode 100644 index 000000000..3b23f1175 --- /dev/null +++ b/test_autoarray/inversion/inversion/test_nnls_raw_forward_amplitude.py @@ -0,0 +1,296 @@ +""" +Amplitude regression for the forward value of the ``"raw"`` positive-only PDIP mode (PyAutoArray#594). + +The mapper-less JAX positive-only solve (``preconditioning="raw"``, PyAutoArray#571/#572) stops on an absolute +infinity-norm KKT residual with the data-scaled tolerance ``1e-2 * n * EPSILON * max(1, max|q|)``. The +complementarity ``s * z`` is judged against that same threshold, so a column fnnls holds at zero can keep +``x ~ tol / z`` while the solve reports "converged": the objective, the log likelihood and the KKT residual are +all blind to it, but the amplitudes (and latent fluxes derived from them) are not. The phase-1 accuracy study +(autolens_profiling #355, record ``complete/2026/09/linear-solver-accuracy-study.md``) measured it on the euclid +vis_lp system as 11.5 % of the reference flux left on reference-inactive columns (``total_source_flux`` ++5.76 %, the red euclid-pipeline latent jit-vs-eager test), and >1e-3 source-flux errors on 4/8 #571 systems. + +The fixture ``files/mge_solver_reference_systems.npz`` holds the 8 #571 SLaM systems (``k0``..``k7``) and the +euclid vis_lp system with their fnnls reference solutions ``x_ref`` (see ``files/README.md``). Each system is +solved through the library entry point :func:`autoarray.util.jax_nnls.solve_nnls_primal_raw_forward` (built as +``inversion_util.reconstruction_positive_only_from`` builds it) and through +``reconstruction_positive_only_from(..., preconditioning="raw")`` itself, and must satisfy: + +- ``converged == 1``, ``iterations < 50``, finite; +- ``flux_inactive_rel = sum(x[x_ref <= 1e-6 max x_ref]) / sum(x_ref) <= 1e-3``; +- ``|flux_rel_all| = |sum x - sum x_ref| / |sum x_ref| <= 1e-3``; +- ``|flux_rel_source|`` (the same over ``source_column_index_list``) ``<= 1e-3`` on ``k0``..``k7`` only. The + euclid system is excluded from this one metric: its source columns carry only ~0.4 % of the reference flux + (a single active column), so the relative source flux is noise-dominated (+5e-2 even for the polished + solve); its end-to-end latent is covered by the euclid-pipeline test (polished: +7.5e-5); +- ``jax.jit`` of the reconstruction equals the eager value exactly, the custom_vjp primal equals its + differentiated forward value exactly (eager and jitted), and ``jax.grad`` of ``sum(y)`` with + respect to ``q`` is finite and non-zero (a mis-wired custom_vjp returns zeros silently). + +Thresholds were fixed from the phase-1 rows before this test was written. Raw forward (unpolished): euclid +inactive 0.115, all 0.115 (others inactive <= 5.4e-5); source k1 1.64e-3, k2 1.22e-3, k3 4.04e-3, k5 6.44e-3 +(k0 5.2e-4, k4 6.7e-4, k6 9.2e-4, k7 9.5e-4). Polished forward: inactive <= 3.3e-4 (euclid), source <= 5e-5 +on k0..k7, all <= 3.3e-4. The amplitude-max criterion of the task prompt is dropped: its worst value (0.219) +is shared by every accurate candidate, i.e. it measures fnnls noise on near-flat directions. + +Red on the unfixed base (PyAutoArray bd03e09e, whose solver equals d4298445): euclid ``inactive`` and ``all``, +and ``source`` on k1, k2, k3, k5 -- on both paths. The jit == eager, primal == forward and gradient cases are green there too (the base +returns the unpolished ``y`` from both the primal and the fwd rule). +""" + +import importlib.util +import json +from pathlib import Path + +import numpy as np +import pytest + +import autoarray as aa +from autoarray.inversion.inversion import inversion_util + + +requires_jax = pytest.mark.skipif( + importlib.util.find_spec("jax") is None, + reason="requires jax (installed via the [optional] extras; absent on the NumPy-only matrix env)", +) + +FIXTURE = Path(__file__).parent / "files" / "mge_solver_reference_systems.npz" +PRODUCTION_MAX_ITER = 50 +TARGET_KAPPA = ( + 1.0e-11 # autoarray general.yaml ``nnls_target_kappa``, as the dispatch reads it +) +INACTIVE_REL = 1.0e-6 +FLUX_TOL = 1.0e-3 + + +def _load_systems(): + with np.load(FIXTURE) as data: + meta = json.loads(str(data["meta"])) + systems = { + s["name"]: tuple( + np.asarray(data[f"{p}_{s['name']}"]) for p in ("Q", "q", "x_ref") + ) + for s in meta["systems"] + } + return meta, systems + + +META, SYSTEMS = _load_systems() +SYSTEM_META = {s["name"]: s for s in META["systems"]} +NAMES = list(SYSTEM_META) +SLAM_NAMES = [n for n in NAMES if SYSTEM_META[n]["group"] == "slam_fixture_571"] +PATHS = ["library_entry", "reconstruction_positive_only_from"] + + +@pytest.fixture(scope="module") +def jnp(): + import jax + + jax.config.update("jax_enable_x64", True) + + import jax.numpy as jnp + from jaxnnls.pdip import EPSILON + + # jaxnnls fixes its tolerance scale at import time from the default dtype; a float32-era import would + # loosen every tolerance and hide the bias. + assert EPSILON < 1.0e-10, EPSILON + + return jnp + + +def _entry(jnp, Q, q): + """`solve_nnls_primal_raw_forward`, built exactly as the raw branch of `reconstruction_positive_only_from`.""" + from autoarray.util.jax_nnls import solve_nnls_primal_raw_forward + + d = jnp.sqrt(jnp.diag(Q)) + D = 1.0 / d + Q_pc = (Q * D[:, None]) * D[None, :] + q_pc = q * D + y, converged, iterations = solve_nnls_primal_raw_forward( + Q_pc, + q_pc, + Q, + q, + D, + target_kappa=TARGET_KAPPA, + solver_tol=None, + max_iter=PRODUCTION_MAX_ITER, + ) + return y, D, converged, iterations + + +def _entry_solver(jnp, Q, q): + """The ``y`` output of `solve_nnls_primal_raw_forward` as a function of its five inputs, and those inputs.""" + from autoarray.util.jax_nnls import solve_nnls_primal_raw_forward + + D = 1.0 / jnp.sqrt(jnp.diag(Q)) + args = ((Q * D[:, None]) * D[None, :], q * D, Q, q, D) + + def solve(*a): + return solve_nnls_primal_raw_forward( + *a, target_kappa=TARGET_KAPPA, solver_tol=None, max_iter=PRODUCTION_MAX_ITER + )[0] + + return solve, args + + +def _dispatch(jnp, Q, q, stats=None): + return inversion_util.reconstruction_positive_only_from( + data_vector=q, + curvature_reg_matrix=Q, + settings=aa.Settings(), + xp=jnp, + stats=stats, + preconditioning="raw", + solver="pdip", + ) + + +_SOLVED = {} + + +def _solve(jnp, path, name): + """(x, converged, iterations) for one system through one path, cached per module.""" + if (path, name) not in _SOLVED: + Q, q, _ = SYSTEMS[name] + Qj, qj = jnp.asarray(Q), jnp.asarray(q) + if path == "library_entry": + y, D, converged, iterations = _entry(jnp, Qj, qj) + x = y * D + else: + stats = {} + x = _dispatch(jnp, Qj, qj, stats=stats) + assert stats["solver"] == "pdip" and stats["preconditioning"] == "raw" + converged, iterations = stats["converged"], stats["iterations"] + _SOLVED[(path, name)] = (np.asarray(x), int(converged), int(iterations)) + return _SOLVED[(path, name)] + + +def _flux_inactive_rel(x, x_ref): + inactive = x_ref <= INACTIVE_REL * x_ref.max() + return float(np.sum(x[inactive]) / np.sum(x_ref)) + + +def _flux_rel(x, x_ref, index=slice(None)): + return float((np.sum(x[index]) - np.sum(x_ref[index])) / abs(np.sum(x_ref[index]))) + + +def test__fixture_is_the_reference_system_set(): + assert FIXTURE.stat().st_size < 400_000 + assert NAMES == [f"k{k}" for k in range(8)] + ["euclid_vis_lp"] + assert META["provenance"]["corpus_commit"] == "3ad68af" + for name, (Q, q, x_ref) in SYSTEMS.items(): + assert Q.shape == (60, 60) and q.shape == (60,) and x_ref.shape == (60,) + np.testing.assert_allclose(Q, Q.T, rtol=0, atol=1e-8 * np.abs(Q).max()) + assert np.all(x_ref >= 0.0) + assert np.isclose(np.abs(q).max(), SYSTEM_META[name]["max_abs_q"], rtol=1e-12) + + +@requires_jax +@pytest.mark.parametrize("name", NAMES) +@pytest.mark.parametrize("path", PATHS) +def test__raw_forward_converges(jnp, path, name): + x, converged, iterations = _solve(jnp, path, name) + + assert converged == 1, f"not converged ({iterations} iterations)" + assert iterations < PRODUCTION_MAX_ITER + assert np.all(np.isfinite(x)) + + +@requires_jax +@pytest.mark.parametrize("name", NAMES) +@pytest.mark.parametrize("path", PATHS) +def test__raw_forward_inactive_column_flux(jnp, path, name): + x, _, _ = _solve(jnp, path, name) + value = _flux_inactive_rel(x, SYSTEMS[name][2]) + + assert value <= FLUX_TOL, f"flux_inactive_rel = {value:.3e}" + + +@requires_jax +@pytest.mark.parametrize("name", NAMES) +@pytest.mark.parametrize("path", PATHS) +def test__raw_forward_total_flux(jnp, path, name): + x, _, _ = _solve(jnp, path, name) + value = _flux_rel(x, SYSTEMS[name][2]) + + assert abs(value) <= FLUX_TOL, f"flux_rel_all = {value:.3e}" + + +@requires_jax +@pytest.mark.parametrize("name", SLAM_NAMES) +@pytest.mark.parametrize("path", PATHS) +def test__raw_forward_source_flux(jnp, path, name): + """k0..k7 only: see the module docstring for why the euclid system is excluded from this metric.""" + x, _, _ = _solve(jnp, path, name) + value = _flux_rel( + x, SYSTEMS[name][2], index=SYSTEM_META[name]["source_column_index_list"] + ) + + assert abs(value) <= FLUX_TOL, f"flux_rel_source = {value:.3e}" + + +@requires_jax +@pytest.mark.parametrize("name", NAMES) +def test__raw_forward_jit_matches_eager(jnp, name): + """``jax.jit`` of the reconstruction returns the eager value exactly, end-to-end and for the solver alone.""" + import jax + + Q, q, _ = SYSTEMS[name] + Qj, qj = jnp.asarray(Q), jnp.asarray(q) + + def f(Q_, q_): + return _dispatch(jnp, Q_, q_) + + np.testing.assert_array_equal(np.asarray(jax.jit(f)(Qj, qj)), np.asarray(f(Qj, qj))) + + # The solver alone, on inputs built outside the traced function: tracing the Jacobi scaling together with + # the final ``x / D`` lets XLA reassociate them and moves ``y`` by 1 ULP (seen on the unfixed base too), + # which is not what this test is about. + solve, args = _entry_solver(jnp, Qj, qj) + np.testing.assert_array_equal( + np.asarray(jax.jit(solve)(*args)), np.asarray(solve(*args)) + ) + + +@requires_jax +@pytest.mark.parametrize("jit", [False, True], ids=["eager", "jit"]) +@pytest.mark.parametrize("name", NAMES) +def test__raw_forward_primal_matches_differentiated_forward(jnp, name, jit): + """The custom_vjp primal (plain calls) and its fwd rule (any differentiated call) return the same ``y`` + bit-for-bit, so a value does not change when a gradient is taken through it.""" + import jax + + Q, q, _ = SYSTEMS[name] + solve, args = _entry_solver(jnp, jnp.asarray(Q), jnp.asarray(q)) + + def primal_out(*a): + return solve(*a) + + def fwd_out(*a): + return jax.vjp(solve, *a)[0] + + if jit: + primal_out, fwd_out = jax.jit(primal_out), jax.jit(fwd_out) + + np.testing.assert_array_equal( + np.asarray(fwd_out(*args)), np.asarray(primal_out(*args)) + ) + + +@requires_jax +@pytest.mark.parametrize("name", NAMES) +def test__raw_forward_gradient_is_finite_and_non_zero(jnp, name): + import jax + + Q, q, _ = SYSTEMS[name] + Qj = jnp.asarray(Q) + + def f(q_): + y, _, _, _ = _entry(jnp, Qj, q_) + return jnp.sum(y) + + for grad in (jax.grad(f), jax.jit(jax.grad(f))): + gq = np.asarray(grad(jnp.asarray(q))) + assert np.all(np.isfinite(gq)) + assert np.any(gq != 0.0) From 31b1c2d7d206886bfd25320c3eb78adeb4066b61 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Wed, 30 Sep 2026 15:55:20 +0100 Subject: [PATCH 2/3] fix: return the polished raw-forward PDIP iterate as the forward value (#594) The raw mode's data-scaled KKT stop also judges complementarity, so a column fnnls holds at zero kept x ~ tol / z: 11.5 % of the fnnls flux on inactive columns of the euclid vis_lp system. The #573 polish (<= 10 tight warm-started PDIP iterations on the Jacobi system) now feeds the forward value as well as the backward pass, through one _raw_forward_polished helper shared by the custom_vjp primal and fwd rule, so plain, jitted and differentiated calls agree bit-for-bit. converged / iterations remain the raw forward solve's; RAW_POLISH_MAX_ITER added, RAW_BACKWARD_POLISH_MAX_ITER kept as an alias. Co-Authored-By: Claude Fable 5.1 --- autoarray/config/general.yaml | 2 +- .../inversion/inversion/inversion_util.py | 4 +- autoarray/settings.py | 6 +- autoarray/util/jax_nnls.py | 125 ++++++++++++------ 4 files changed, 92 insertions(+), 45 deletions(-) diff --git a/autoarray/config/general.yaml b/autoarray/config/general.yaml index 5df05d173..916e85045 100644 --- a/autoarray/config/general.yaml +++ b/autoarray/config/general.yaml @@ -8,7 +8,7 @@ inversion: use_border_relocator: false # If True, by default a pixelization's border is used to relocate all pixels outside its border to the border. nnls_jacobi_preconditioning: true # If True (default), the curvature matrix passed to jaxnnls.solve_nnls_primal is Jacobi-preconditioned (D Q D y = D q, x = D y). Fixes NaN backward-pass gradients on ill-conditioned Q and roughly halves forward solve time. Set False to restore the raw unpreconditioned solve. nnls_target_kappa: 1.0e-11 # Central-path relaxation parameter passed to jaxnnls.solve_nnls_primal. Larger values smooth the relaxed-KKT backward pass and prevent NaN gradients on ill-conditioned Q; smaller values tighten the primal solve. Verified finite gradients across all MGE/rectangular/delaunay pipelines (imaging + interferometer) with scale invariance over 5 orders of magnitude in noise. jaxnnls's own default (1e-3) is too aggressive for the backward pass. The relaxed solve must start from an iterate whose complementarity s*z is not far above this value; the "raw" no-mapper mode polishes its forward iterate to ensure that (PyAutoArray#573). - nnls_preconditioning_no_mapper: raw # How the JAX positive-only PDIP solve scales inversions with NO mapper (linear light profiles / MGE only). "raw" (default) runs the forward solve on the un-preconditioned system with a data-scaled KKT tolerance (1e-2 * n * eps * max(1, max|data_vector|)) and keeps the Jacobi-space relaxed-KKT gradient, whose relaxed solve starts from the forward iterate polished by <= 10 tight warm-started PDIP iterations on the Jacobi system (without the polish the loose forward tolerance leaves s*z far above nnls_target_kappa and the relaxed solve diverged to NaN gradients on 4/16 jax_grad/mge.py points, PyAutoArray#573); "jacobi" uses the Jacobi-preconditioned solve. Jacobi scaling of signal-free MGE columns (diagonal = the no-regularization floor) made the PDIP dual diverge on 14/48 SLaM source_lp[1] points (PyAutoArray#571). Inversions with a mapper always use jacobi; the NumPy path is unaffected. + nnls_preconditioning_no_mapper: raw # How the JAX positive-only PDIP solve scales inversions with NO mapper (linear light profiles / MGE only). "raw" (default) runs the forward solve on the un-preconditioned system with a data-scaled KKT tolerance (1e-2 * n * eps * max(1, max|data_vector|)), polishes that iterate with <= 10 tight warm-started PDIP iterations on the Jacobi system and returns the polished iterate (the loose tolerance also judges complementarity, so unpolished it left 11.5 % of the fnnls flux on inactive columns of the euclid vis_lp system; polished <= 3.3e-4 over 81 corpus systems, ~5 extra iterations, PyAutoArray#594), and keeps the Jacobi-space relaxed-KKT gradient started from the same polished point (without the polish the relaxed solve diverged to NaN gradients on 4/16 jax_grad/mge.py points, PyAutoArray#573); "jacobi" uses the Jacobi-preconditioned solve. Jacobi scaling of signal-free MGE columns (diagonal = the no-regularization floor) made the PDIP dual diverge on 14/48 SLaM source_lp[1] points (PyAutoArray#571). Inversions with a mapper always use jacobi; the NumPy path is unaffected. nnls_warm_start_memo: true # If True (default), the NumPy/numba positive-only (fnnls) solve warm-starts its active set from the previous likelihood evaluation's passive set, cutting active-set iterations on successive sampler evaluations. The NNLS optimum is unique so the reconstruction is unchanged. On by default as of PyAutoArray#498, measured on the euclid+hst Delaunay-1250 fiducial (9.9x / 4.0x fewer active-set iterations on successive evaluations, reconstruction unchanged). Set false, or AUTOARRAY_NNLS_WARM_START=0, to disable. JAX path unaffected. nnls_warm_start_error_tolerance: 1.5 # Relative quality guard on a warm-start memo seed. Each memo entry remembers the error fraction of the most recent dense-sign-started solve for that key; a seeded solve whose own error fraction exceeds this multiple of that reference is dropped, so the next solve restarts from the dense-sign start and refreshes the reference. Default 1.5 sits above the worst seed/dense error-fraction ratio seen in the PyAutoArray#498 32-cell robustness matrix (1.42), so it is protective against unmeasured regimes rather than flapping. Any non-finite or non-positive value (e.g. .inf) disables the guard. NumPy/numba fnnls path only. positive_only_solver: pdip # Which solver the JAX (xp=jnp) positive-only reconstruction uses. "pdip" (default) is the jaxnnls interior-point solve; "certified" is the certified active-set solve (budgeted masked-Cholesky passes that stop once the KKT conditions certify, exact implicit gradient, PDIP fallback), measured 1.2-2.6x faster on source-only inversions (PyAutoArray#566). Applied only to mapper-only JAX inversions (MGE / linear light profiles keep PDIP); the NumPy path always uses fnnls. Opt-in until the batched (vmap) policy is measured. diff --git a/autoarray/inversion/inversion/inversion_util.py b/autoarray/inversion/inversion/inversion_util.py index d94668707..76454a552 100644 --- a/autoarray/inversion/inversion/inversion_util.py +++ b/autoarray/inversion/inversion/inversion_util.py @@ -368,7 +368,9 @@ def reconstruction_positive_only_from( byte-identical to before this option existed): the Jacobi-preconditioned solve ``(D Q D) y = D q`` governed by the ``nnls_jacobi_preconditioning`` config key. ``"raw"``: the forward PDIP solve runs on the un-preconditioned ``(Q, q)`` with the data-scaled tolerance - :func:`autoarray.util.jax_nnls.data_scaled_solver_tol` (or ``settings.nnls_solver_tol`` if set), and the + :func:`autoarray.util.jax_nnls.data_scaled_solver_tol` (or ``settings.nnls_solver_tol`` if set), its iterate + is polished by a few tight PDIP iterations on the Jacobi-scaled system and the polished iterate is returned + (PyAutoArray#594; ``stats["converged"]`` / ``stats["iterations"]`` describe the raw forward solve), and the gradient is the Jacobi-space relaxed-KKT pass as in ``"jacobi"`` -- see :func:`autoarray.util.jax_nnls.solve_nnls_primal_raw_forward`. Jacobi scaling makes the signal-free columns of linear-object-only (MGE) inversions, whose diagonal is only the diff --git a/autoarray/settings.py b/autoarray/settings.py index ef18c180c..54bf6360d 100644 --- a/autoarray/settings.py +++ b/autoarray/settings.py @@ -230,7 +230,11 @@ def __init__( - ``"raw"`` (default) -- the forward PDIP solve runs on the un-preconditioned system with a data-scaled KKT tolerance (``1e-2 * n * eps_pdip * max(1, max|data_vector|)``, or - `nnls_solver_tol` if set); the gradient is the same Jacobi-space relaxed-KKT pass as ``"jacobi"``. + `nnls_solver_tol` if set), polished by at most 10 tight warm-started PDIP iterations on the + Jacobi-scaled system; the polished iterate is the returned reconstruction (unpolished, the loose + tolerance left 11.5 % of the fnnls flux on inactive columns of the euclid vis_lp system, + PyAutoArray#594) and the start of the gradient, the same Jacobi-space relaxed-KKT pass as + ``"jacobi"``. On the SLaM `source_lp[1]` MGE model (2 x 20 lens + 20 source Gaussians) Jacobi scaling made 14/48 near-truth points hit the 50-iteration cap with wrong log-likelihoods (signal-free Gaussian columns, whose diagonal is only `no_regularization_add_to_curvature_diag_value`, become degenerate diff --git a/autoarray/util/jax_nnls.py b/autoarray/util/jax_nnls.py index df21160a0..3d374434d 100644 --- a/autoarray/util/jax_nnls.py +++ b/autoarray/util/jax_nnls.py @@ -27,11 +27,18 @@ solve on the un-preconditioned system with a data-scaled tolerance (:func:`data_scaled_solver_tol`) and keeps the Jacobi-space backward pass. It exists because Jacobi scaling of signal-free MGE columns (diagonal = the -no-regularization floor) makes the PDIP dual diverge. Its backward pass polishes -the mapped forward iterate with a few tight, warm-started PDIP iterations on the -Jacobi system before the relaxed-KKT solve, which otherwise diverges to NaN from -the loose forward tolerance (PyAutoArray#573); :func:`raw_forward_backward_status` -reports that pass's convergence. +no-regularization floor) makes the PDIP dual diverge. The raw iterate is then +*polished* with a few tight, warm-started PDIP iterations on the Jacobi system, and +the polished iterate is both the forward value and the start of the backward +pass's relaxed-KKT solve. The data-scaled stop judges complementarity ``s * z`` +against the same loose threshold, so a column fnnls holds at zero can keep +``x ~ tol / z`` while "converged": on the euclid vis_lp system the unpolished +iterate left 11.5 % of the fnnls flux on reference-inactive columns (a +5.8 % +latent source flux), invisible to the objective and the log likelihood; polished, +that is <= 3.3e-4 across 81 corpus systems for ~5 extra iterations +(PyAutoArray#594). The polish first went into the backward pass only, where the +relaxed-KKT solve otherwise diverges to NaN from the loose forward tolerance +(PyAutoArray#573); :func:`raw_forward_backward_status` reports its convergence. JAX is imported inside functions, never at module level (see ``docs/agents/jax_and_decorators.md``); this module must only be imported @@ -187,51 +194,75 @@ def solve_nnls_primal(Q, q, target_kappa=1e-3, solver_tol=None, max_iter=50): )[0] -# The backward pass of the ``"raw"`` mode first polishes the mapped raw-forward iterate with at most this many -# PDIP iterations on the Jacobi-scaled system at jaxnnls's own tight tolerance (PyAutoArray#573). Measured on the -# SLaM MGE fixture, the 48 SLaM ``source_lp[1]`` systems and the jax_grad/mge.py points: 4-6 iterations. -RAW_BACKWARD_POLISH_MAX_ITER = 10 +# The ``"raw"`` mode polishes the mapped raw-forward iterate with at most this many PDIP iterations on the +# Jacobi-scaled system at jaxnnls's own tight tolerance; the polished iterate is the forward value (PyAutoArray#594) +# and the backward pass's starting point (PyAutoArray#573). Measured on the SLaM MGE fixture, the 48 SLaM +# ``source_lp[1]`` systems and the jax_grad/mge.py points: 4-6 iterations. +RAW_POLISH_MAX_ITER = 10 +# The name under which the polish cap was introduced (#573, backward pass only); kept for external importers. +RAW_BACKWARD_POLISH_MAX_ITER = RAW_POLISH_MAX_ITER -def _raw_forward_backward_point( - Q_pc, q_pc, Q, q, D, target_kappa, solver_tol, max_iter -): +def _raw_forward_polished(Q_pc, q_pc, Q, q, D, solver_tol, max_iter): """ - The forward solve and the relaxed-KKT point of the ``"raw"`` mode (shared by - the custom-vjp forward pass and :func:`raw_forward_backward_status`). - - Returns ``(y, converged, pdip_iter)`` of the raw forward solve (mapped to the - Jacobi coordinates), the relaxed point ``(yr, sr, zr)`` the backward pass - differentiates at, and the status ``(relaxed_converged, relaxed_iter, - polish_converged, polish_iter)``. + The forward value of the ``"raw"`` mode: the raw PDIP solve, mapped to the + Jacobi coordinates and polished there (shared by the custom-vjp primal and + forward passes, so every call path returns the same ``y`` bit-for-bit). + + Returns ``(y_out, converged, pdip_iter, (yp, sp, zp), ok, polish_iter)``: + ``y_out`` the forward value (the polished iterate if ``ok``, else the mapped + raw iterate), ``converged`` / ``pdip_iter`` the raw forward solve's flag and + iteration count, ``(yp, sp, zp)`` the point the backward pass starts from + (selected by the same ``ok``), ``ok`` whether the polish was accepted and + ``polish_iter`` its iteration count. """ import jax.numpy as jnp - from jaxnnls.pdip_relaxed import solve_relaxed_nnls tol = data_scaled_solver_tol(q) if solver_tol is None else solver_tol x, s, z, converged, pdip_iter = solve_nnls(Q, q, solver_tol=tol, max_iter=max_iter) y, sy, zy = x / D, s / D, z * D - # Polish (PyAutoArray#573): the data-scaled tolerance leaves s * z ~ 1e-10 .. 1e-9, far above - # ``target_kappa``, so the relaxed solve below would have to push toward the boundary from z / s ~ 1e13 - # and its fixed 50-iteration while_loop overshoots to NaN. A few tight PDIP iterations on the scaled - # system, warm-started from the mapped iterate, bring s * z down to the jaxnnls tolerance first. If the - # polish does not converge (the scaled dual is what diverges on #571's systems from a cold start), the - # mapped iterate is kept, i.e. the pre-polish behaviour. + # Polish (PyAutoArray#573, #594): the data-scaled tolerance also judges complementarity, so it leaves + # s * z ~ 1e-10 .. 1e-9 -- a column fnnls holds at zero can keep x ~ tol / z (11.5 % of the reference flux on + # inactive columns of the euclid vis_lp system), and the relaxed solve of the backward pass would have to push + # toward the boundary from z / s ~ 1e13, where its fixed 50-iteration while_loop overshoots to NaN. A few + # tight PDIP iterations on the scaled system, warm-started from the mapped iterate, bring s * z down to the + # jaxnnls tolerance. If the polish does not converge (the scaled dual is what diverges on #571's systems from + # a cold start), the mapped iterate is kept, i.e. the pre-polish behaviour. yp, sp, zp, polish_converged, polish_iter = solve_nnls( - Q_pc, q_pc, max_iter=RAW_BACKWARD_POLISH_MAX_ITER, init=(y, sy, zy) + Q_pc, q_pc, max_iter=RAW_POLISH_MAX_ITER, init=(y, sy, zy) ) ok = jnp.logical_and( polish_converged == 1, jnp.all(jnp.isfinite(yp)) & jnp.all(sp > 0) & jnp.all(zp > 0), ) yp, sp, zp = (jnp.where(ok, a, b) for a, b in ((yp, y), (sp, sy), (zp, zy))) + return yp, converged, pdip_iter, (yp, sp, zp), ok, polish_iter + + +def _raw_forward_backward_point( + Q_pc, q_pc, Q, q, D, target_kappa, solver_tol, max_iter +): + """ + The forward value and the relaxed-KKT point of the ``"raw"`` mode (shared by + the custom-vjp forward pass and :func:`raw_forward_backward_status`). + Returns ``(y, converged, pdip_iter)`` with ``y`` the polished forward value + (:func:`_raw_forward_polished`) and ``converged`` / ``pdip_iter`` those of the + raw forward solve, the relaxed point ``(yr, sr, zr)`` the backward pass + differentiates at, and the status ``(relaxed_converged, relaxed_iter, + polish_converged, polish_iter)``. + """ + from jaxnnls.pdip_relaxed import solve_relaxed_nnls + + y_out, converged, pdip_iter, (yp, sp, zp), ok, polish_iter = _raw_forward_polished( + Q_pc, q_pc, Q, q, D, solver_tol, max_iter + ) yr, sr, zr, relaxed_converged, relaxed_iter = solve_relaxed_nnls( Q_pc, q_pc, yp, sp, zp, target_kappa=target_kappa ) status = (relaxed_converged, relaxed_iter, ok.astype(int), polish_iter) - return (y, converged, pdip_iter), (yr, sr, zr), status + return (y_out, converged, pdip_iter), (yr, sr, zr), status @lru_cache(maxsize=None) @@ -251,16 +282,25 @@ def _solve_nnls_raw_forward_with(target_kappa, solver_tol, max_iter): linear-object-only (MGE) systems, Jacobi scaling turns signal-free columns whose diagonal is only the no-regularization floor into degenerate coordinates that make the PDIP dual diverge; the raw solve does not. + The mapped iterate is then *polished*: at most + :data:`RAW_POLISH_MAX_ITER` PDIP iterations on ``(Q_pc, q_pc)`` at + jaxnnls's tight tolerance, warm-started from it (kept only if the polish + converges with a finite, strictly interior point). The polished iterate is + the returned ``y`` (PyAutoArray#594): the data-scaled stop judges + complementarity ``s * z`` against the loose tolerance, so an unpolished + column fnnls holds at zero can keep ``x ~ tol / z`` -- 11.5 % of the fnnls + flux on inactive columns of the euclid vis_lp system, invisible to the + objective and log likelihood; polished, <= 3.3e-4 over 81 corpus systems + for ~5 extra iterations. The custom-vjp primal and forward rule compute it + through the same :func:`_raw_forward_polished`, so plain, jitted and + differentiated calls return the same value. ``converged`` and + ``pdip_iter`` are those of the raw forward solve. - **Backward:** the relaxed-KKT implicit derivative on ``Q_pc`` (as the - Jacobi mode), started from the mapped iterate after a *polish*: at most - :data:`RAW_BACKWARD_POLISH_MAX_ITER` PDIP iterations on ``(Q_pc, q_pc)`` - at jaxnnls's tight tolerance, warm-started from the mapped iterate - (kept only if it converges). Without it the loose forward tolerance - leaves complementarity ``s * z`` orders of magnitude above + Jacobi mode), started from the polished point. Without the polish the + loose forward tolerance leaves ``s * z`` orders of magnitude above ``target_kappa`` and the relaxed solve diverges to NaN on a fraction of points (PyAutoArray#573); with it the relaxed solve converges in about - one iteration. The primal ``y`` is the unpolished forward solution, so - the forward value is unchanged. The relaxed-KKT pass on the raw, + one iteration. The relaxed-KKT pass on the raw, ill-conditioned ``Q`` produces NaN gradients, which is why Jacobi scaling was introduced. ``(Q, q, D)`` get zero cotangents: ``y`` depends only on ``(Q_pc, q_pc)``, and the caller's autodiff carries the dependence of @@ -274,11 +314,10 @@ def _solve_nnls_raw_forward_with(target_kappa, solver_tol, max_iter): from jaxnnls.diff_qp import diff_nnls def primal(Q_pc, q_pc, Q, q, D): - tol = data_scaled_solver_tol(q) if solver_tol is None else solver_tol - x, _, _, converged, pdip_iter = solve_nnls( - Q, q, solver_tol=tol, max_iter=max_iter + y_out, converged, pdip_iter, _, _, _ = _raw_forward_polished( + Q_pc, q_pc, Q, q, D, solver_tol, max_iter ) - return x / D, converged, pdip_iter + return y_out, converged, pdip_iter def forward(Q_pc, q_pc, Q, q, D): out, (yr, sr, zr), status = _raw_forward_backward_point( @@ -305,8 +344,9 @@ def raw_forward_backward_status( ``(relaxed_converged, relaxed_iter, polish_converged, polish_iter)``. ``relaxed_*`` describe the relaxed-KKT solve whose point the gradient is - taken at; ``polish_*`` the tight warm-started PDIP polish before it - (``polish_converged == 0`` means the mapped iterate was used unpolished). + taken at; ``polish_*`` the tight warm-started PDIP polish before it, + whose iterate is also the forward value (``polish_converged == 0`` means the + mapped raw iterate was used unpolished, for both). Arguments are those of :func:`solve_nnls_primal_raw_forward`. """ return _raw_forward_backward_point( @@ -319,7 +359,8 @@ def solve_nnls_primal_raw_forward( ): """ The ``"raw"`` positive-only mode: forward PDIP on the raw system with a - data-scaled tolerance, backward pass on the Jacobi-scaled system. Returns + data-scaled tolerance, polished on the Jacobi-scaled system, backward pass + on the Jacobi-scaled system. Returns ``(y, converged, pdip_iter)`` with ``x = D * y``; see :func:`_solve_nnls_raw_forward_with`. """ From 42c52358786cc5bb5c857e3620866c7d4b204031 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Wed, 30 Sep 2026 17:36:45 +0100 Subject: [PATCH 3/3] test: end-to-end jit-vs-eager check tolerates runner-dependent XLA reassociation (#594) The Python 3.12 Actions leg reproduced eager to 5.4e-11 relative on every fixture system while 3.13 and local runs were bit-exact (PR #595). The end-to-end check is now a tight allclose (rtol 1e-9, atol 1e-12 * max|x|); the solver-alone and primal-vs-vjp checks stay bit-exact. Co-Authored-By: Claude Fable 5.1 --- .../test_nnls_raw_forward_amplitude.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/test_autoarray/inversion/inversion/test_nnls_raw_forward_amplitude.py b/test_autoarray/inversion/inversion/test_nnls_raw_forward_amplitude.py index 3b23f1175..bcfb0fcae 100644 --- a/test_autoarray/inversion/inversion/test_nnls_raw_forward_amplitude.py +++ b/test_autoarray/inversion/inversion/test_nnls_raw_forward_amplitude.py @@ -233,7 +233,15 @@ def test__raw_forward_source_flux(jnp, path, name): @requires_jax @pytest.mark.parametrize("name", NAMES) def test__raw_forward_jit_matches_eager(jnp, name): - """``jax.jit`` of the reconstruction returns the eager value exactly, end-to-end and for the solver alone.""" + """``jax.jit`` of the reconstruction returns the eager value: end-to-end to a few ULP, and exactly for + the solver alone. + + End-to-end, XLA's CPU code generation may reassociate the Jacobi scaling and the final ``x / D`` around + the solver, which moves entries by a few ULP and differs between runners: the GitHub Actions Python 3.12 + leg (jax 0.11.2, same as the green 3.13 leg) reproduced eager to 5.4e-11 relative / 9e-12 absolute on + every fixture system (PyAutoArray#595), so the end-to-end check is a tight ``allclose`` rather than + bit-exact. The solver-alone check below stays bit-exact. + """ import jax Q, q, _ = SYSTEMS[name] @@ -242,7 +250,13 @@ def test__raw_forward_jit_matches_eager(jnp, name): def f(Q_, q_): return _dispatch(jnp, Q_, q_) - np.testing.assert_array_equal(np.asarray(jax.jit(f)(Qj, qj)), np.asarray(f(Qj, qj))) + eager = np.asarray(f(Qj, qj)) + np.testing.assert_allclose( + np.asarray(jax.jit(f)(Qj, qj)), + eager, + rtol=1e-9, + atol=1e-12 * np.abs(eager).max(), + ) # The solver alone, on inputs built outside the traced function: tracing the Jacobi scaling together with # the final ``x / D`` lets XLA reassociate them and moves ``y`` by 1 ULP (seen on the unfixed base too),