From a417cb28de517ae26483fa968f4d6ad6cd237d59 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Thu, 24 Sep 2026 17:01:28 +0200 Subject: [PATCH 1/2] test: red regression fixture for JAX PDIP non-convergence on SLaM MGE systems (#571) Adds 8 real (curvature_reg_matrix, data_vector) systems captured from the SLaM source_lp[1] MGE model (autolens_profiling scripts/imaging/hazards/mge_nnls_capture.py, 158 KB .npz) and test_nnls_mge_convergence.py: the Jacobi-preconditioned PDIP solve must converge inside the 50-iteration cap and reach the fnnls objective, single, end-to-end through reconstruction_positive_only_from, and under vmap. Red on main by design: 15 failed / 6 passed (7 cap-hit systems x 2 parametrized tests + the vmap test). A control on 3 seeded well-conditioned systems pins today's PDIP answer bit-identically and passes. Co-Authored-By: Claude Fable 5.1 --- .../inversion/inversion/files/README.md | 9 + .../inversion/files/mge_slam_nnls_systems.npz | Bin 0 -> 158279 bytes .../inversion/test_nnls_mge_convergence.py | 235 ++++++++++++++++++ 3 files changed, 244 insertions(+) create mode 100644 test_autoarray/inversion/inversion/files/README.md create mode 100644 test_autoarray/inversion/inversion/files/mge_slam_nnls_systems.npz create mode 100644 test_autoarray/inversion/inversion/test_nnls_mge_convergence.py diff --git a/test_autoarray/inversion/inversion/files/README.md b/test_autoarray/inversion/inversion/files/README.md new file mode 100644 index 000000000..887f535f8 --- /dev/null +++ b/test_autoarray/inversion/inversion/files/README.md @@ -0,0 +1,9 @@ +# Inversion test fixtures + +- `mge_slam_nnls_systems.npz` — 8 positive-only systems `Q_` (curvature_reg_matrix, 60x60) / `q_` + (data_vector) captured from the SLaM `source_lp[1]` MGE model on the autolens_profiling HST dataset + (PyAutoArray#571): keys 0-4 never converge under JAX PDIP in 200 iterations, 5-6 hit the 50-iteration cap + but converge by 200, 7 is healthy (19 iterations); `meta` holds the per-system JSON. Generator: + `autolens_profiling/scripts/imaging/hazards/mge_nnls_capture.py` (autolens_profiling d6926af), run + 2026-09-24 on CPU fp64 with PyAutoArray 7fa8d2714f, PyAutoGalaxy 70a61e26cd, PyAutoLens 86054bbc19, + PyAutoFit a736840127, jax 0.10.2. diff --git a/test_autoarray/inversion/inversion/files/mge_slam_nnls_systems.npz b/test_autoarray/inversion/inversion/files/mge_slam_nnls_systems.npz new file mode 100644 index 0000000000000000000000000000000000000000..a977682902841b541794fcfdda655ab768ca8385 GIT binary patch literal 158279 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 literal 0 HcmV?d00001 diff --git a/test_autoarray/inversion/inversion/test_nnls_mge_convergence.py b/test_autoarray/inversion/inversion/test_nnls_mge_convergence.py new file mode 100644 index 000000000..e4018a829 --- /dev/null +++ b/test_autoarray/inversion/inversion/test_nnls_mge_convergence.py @@ -0,0 +1,235 @@ +""" +Regression tests for the JAX positive-only (PDIP NNLS) solve on real SLaM MGE systems (PyAutoArray#571). + +The fixture `files/mge_slam_nnls_systems.npz` holds 8 `(curvature_reg_matrix, data_vector)` systems captured +from the SLaM `source_lp[1]` MGE model (2 x 20 lens Gaussians with `sigma_min = pixel_scale / 10` plus 20 +source Gaussians, 60 linear columns) exactly as the JAX likelihood hands them to +`reconstruction_positive_only_from` (see `files/README.md` for the generator and versions): + +- keys 0-4: the Jacobi-preconditioned PDIP solve never converges, even with a 200-iteration cap; +- keys 5-6: it hits the production 50-iteration cap but converges by 200; +- key 7: a healthy system (19 iterations). + +Every fixture system must converge within the production cap and reach the NumPy `fnnls_cholesky` objective +`0.5 x^T Q x - q^T x`, single and under `vmap`. The control test pins today's PDIP answer on well-conditioned +random systems so a fix cannot move converging solves. + +Tolerances were declared before the first run: objective within `1e-8 * |obj_fnnls| + 1e-8` (the objectives +are negative, ~ -9.7e5, so the bound is additive rather than the multiplicative `obj * (1 + 1e-8)` of the +issue plan, which would demand PDIP beat fnnls); control solution vs SciPy `nnls` within `1e-8 * max|x|`. +""" + +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 +from autoarray.util.fnnls import fnnls_cholesky + + +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_slam_nnls_systems.npz" +PRODUCTION_MAX_ITER = 50 +OBJECTIVE_RTOL = 1.0e-8 +OBJECTIVE_ATOL = 1.0e-8 + + +def _load_systems(): + with np.load(FIXTURE) as data: + meta = json.loads(str(data["meta"])) + systems = [ + (np.asarray(data[f"Q_{s['key']}"]), np.asarray(data[f"q_{s['key']}"])) + for s in meta["systems"] + ] + return meta, systems + + +META, SYSTEMS = _load_systems() +KEYS = [s["key"] for s in META["systems"]] +IDS = [f"{s['key']}-{s['category']}" for s in META["systems"]] + + +def _objective(Q, q, x): + return float(0.5 * x @ Q @ x - q @ x) + + +def _fnnls(Q, q): + """The NumPy oracle, started exactly as `reconstruction_positive_only_from` starts it.""" + return np.asarray( + fnnls_cholesky(Q, q, P_initial=np.linalg.solve(Q, q) > 0), dtype=float + ) + + +def _jacobi(Q, q): + """The Jacobi scaling `reconstruction_positive_only_from` applies on the JAX path.""" + D = 1.0 / np.sqrt(np.diag(Q)) + return Q * D[:, None] * D[None, :], q * D, D + + +def _assert_objective_reaches_fnnls(Q, q, x): + obj_fnnls = _objective(Q, q, _fnnls(Q, q)) + assert np.all(np.isfinite(x)), "PDIP returned a non-finite solution" + obj = _objective(Q, q, x) + assert obj <= obj_fnnls + OBJECTIVE_RTOL * abs(obj_fnnls) + OBJECTIVE_ATOL, ( + obj, + obj_fnnls, + ) + + +@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 + # make every fixture "converge" at a 6e-4 KKT tolerance and hide the bug. + assert EPSILON < 1.0e-10, EPSILON + + return jnp + + +def test__fixture_is_the_captured_slam_mge_set(): + assert FIXTURE.stat().st_size < 1_000_000 + assert [s["category"] for s in META["systems"]] == 5 * [ + "never_converges_cap200" + ] + 2 * ["cap50_hit_converges_by_200"] + ["healthy"] + for Q, q in SYSTEMS: + assert Q.shape == (60, 60) and q.shape == (60,) + np.testing.assert_allclose(Q, Q.T, rtol=0, atol=1e-8 * np.abs(Q).max()) + + +@requires_jax +@pytest.mark.parametrize("key", KEYS, ids=IDS) +def test__pdip_jacobi_converges_within_production_cap(jnp, key): + from autoarray.util.jax_nnls import solve_nnls + + Q, q = SYSTEMS[key] + Q_pc, q_pc, D = _jacobi(Q, q) + + x, _, _, converged, pdip_iter = solve_nnls( + jnp.asarray(Q_pc), jnp.asarray(q_pc), max_iter=PRODUCTION_MAX_ITER + ) + + assert int(converged) == 1, f"PDIP did not converge ({int(pdip_iter)} iterations)" + assert int(pdip_iter) < PRODUCTION_MAX_ITER + _assert_objective_reaches_fnnls(Q, q, np.asarray(x) * D) + + +@requires_jax +@pytest.mark.parametrize("key", KEYS, ids=IDS) +def test__reconstruction_positive_only_from__jax_matches_numpy_objective(jnp, key): + Q, q = SYSTEMS[key] + settings = aa.Settings() + stats = {} + + x_jax = inversion_util.reconstruction_positive_only_from( + data_vector=jnp.asarray(q), + curvature_reg_matrix=jnp.asarray(Q), + settings=settings, + xp=jnp, + stats=stats, + ) + x_np = inversion_util.reconstruction_positive_only_from( + data_vector=q, curvature_reg_matrix=Q, settings=settings, xp=np + ) + + x_jax = np.asarray(x_jax) + assert np.all(np.isfinite(x_jax)), "JAX reconstruction is non-finite" + obj_jax = _objective(Q, q, x_jax) + obj_np = _objective(Q, q, np.asarray(x_np)) + assert abs(obj_jax - obj_np) <= OBJECTIVE_RTOL * abs(obj_np), (obj_jax, obj_np) + + assert stats["solver"] == "pdip" + # Once the fix surfaces the PDIP convergence flag (PyAutoArray#571 step 4), also assert: + # assert bool(stats["converged"]) + + +@requires_jax +def test__pdip_jacobi_converges_under_vmap(jnp): + import jax + + from autoarray.util.jax_nnls import solve_nnls + + scaled = [_jacobi(Q, q) for Q, q in SYSTEMS] + Q_pc = jnp.asarray(np.stack([s[0] for s in scaled])) + q_pc = jnp.asarray(np.stack([s[1] for s in scaled])) + + x, _, _, converged, pdip_iter = jax.vmap( + lambda Q, q: solve_nnls(Q, q, max_iter=PRODUCTION_MAX_ITER) + )(Q_pc, q_pc) + + converged = np.asarray(converged) + pdip_iter = np.asarray(pdip_iter) + failed = [ + k for k in KEYS if converged[k] != 1 or pdip_iter[k] >= PRODUCTION_MAX_ITER + ] + assert not failed, ( + f"failed lanes {failed}; converged {converged.tolist()}; " + f"pdip_iter {pdip_iter.tolist()}" + ) + for k, (Q, q) in enumerate(SYSTEMS): + _assert_objective_reaches_fnnls(Q, q, np.asarray(x[k]) * scaled[k][2]) + + +def _random_system(n, seed): + """A seeded, well-conditioned NNLS problem (as `test_jax_active_set._qp`): roughly half the unconstrained + solution is negative, so positivity binds.""" + rng = np.random.default_rng(seed) + A = rng.normal(size=(3 * n, n)) + b = rng.normal(size=3 * n) + return A, b, A.T @ A, A.T @ b + + +@requires_jax +@pytest.mark.parametrize("n, seed", [(12, 0), (30, 1), (60, 2)]) +def test__control__well_conditioned_pdip_unchanged(jnp, n, seed): + """ + Must pass before and after any fix, bit-identically: the library JAX path is compared against the + upstream jaxnnls solve of the same Jacobi-scaled system, recomputed in-test (today's answer). + """ + import jaxnnls + from jaxnnls.pdip import solve_nnls as upstream_solve_nnls + from scipy.optimize import nnls + + A, b, Q, q = _random_system(n, seed) + Q_pc, q_pc, D = _jacobi(Q, q) + + _, _, _, converged, pdip_iter = upstream_solve_nnls( + jnp.asarray(Q_pc), jnp.asarray(q_pc) + ) + assert int(converged) == 1 and int(pdip_iter) < PRODUCTION_MAX_ITER + + expected = ( + np.asarray( + jaxnnls.solve_nnls_primal( + jnp.asarray(Q_pc), jnp.asarray(q_pc), target_kappa=1.0e-11 + ) + ) + * D + ) + + x = np.asarray( + inversion_util.reconstruction_positive_only_from( + data_vector=jnp.asarray(q), + curvature_reg_matrix=jnp.asarray(Q), + settings=aa.Settings(), + xp=jnp, + ) + ) + + np.testing.assert_array_equal(x, expected) + + x_scipy, _ = nnls(A, b) + np.testing.assert_allclose(x, x_scipy, rtol=0, atol=1e-8 * np.abs(x_scipy).max()) From 07145ea9da710b8e598f7553d3bc75898f86d1a6 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Thu, 24 Sep 2026 19:12:21 +0200 Subject: [PATCH 2/2] fix: raw-forward PDIP for mapper-less positive-only JAX solves, surface convergence (#571) On linear-object-only (MGE) inversions, Jacobi scaling turns signal-free Gaussian columns (whose diagonal is only the no-regularization floor) into degenerate coordinates on which the PDIP dual diverges: 14/48 near-truth SLaM source_lp[1] points hit the 50-iteration cap and returned wrong log-likelihoods, and 5 never converged. - reconstruction_positive_only_from gains preconditioning="jacobi"|"raw" (default "jacobi", byte-identical: x, jitted x and gradients checked on 11 systems). "raw" runs the forward PDIP on the un-preconditioned system with a data-scaled tolerance (1e-2 * n * EPSILON * max(1, max|q|)). It keeps today's Jacobi-space relaxed-KKT backward pass, because a raw-Q backward pass gives NaN gradients on 3 of the 8 fixture systems. - AbstractInversion.positive_only_preconditioning_used: mapper inversions keep "jacobi"; mapper-less ones use Settings.nnls_preconditioning_no_mapper (config key nnls_preconditioning_no_mapper, default "raw"). - F1: solve_nnls_primal_with_status returns (x, converged, pdip_iter), with no cotangents for the integer flags. solve_nnls_primal keeps its drop-in signature for downstream scripts. The PDIP paths record stats["converged"] and stats["iterations"] as traced scalars (the same channel as the certified path's certified/passes). - The red regression tests are now green: all 8 fixture systems converge in 16-19 iterations, single, end-to-end and under vmap, with the fnnls objective reached to <=1e-12 relative and finite, non-zero gradients. The Jacobi mode now reports converged=0 on the witness systems. Dispatch tests added. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01WAqZd1NiPsVYPSAP8tX4YL --- autoarray/config/general.yaml | 1 + autoarray/inversion/inversion/abstract.py | 27 +++ .../inversion/inversion/inversion_util.py | 93 ++++++++--- autoarray/settings.py | 41 +++++ autoarray/util/jax_nnls.py | 154 ++++++++++++++++-- .../inversion/test_nnls_mge_convergence.py | 150 +++++++++++++---- .../inversion/test_positive_only_dispatch.py | 105 ++++++++++++ 7 files changed, 508 insertions(+), 63 deletions(-) diff --git a/autoarray/config/general.yaml b/autoarray/config/general.yaml index 85671dde2..e6ba12033 100644 --- a/autoarray/config/general.yaml +++ b/autoarray/config/general.yaml @@ -8,6 +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. + 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; "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/abstract.py b/autoarray/inversion/inversion/abstract.py index 11084c599..79c27677e 100644 --- a/autoarray/inversion/inversion/abstract.py +++ b/autoarray/inversion/inversion/abstract.py @@ -600,6 +600,31 @@ def positive_only_solver_used(self) -> str: return "certified" + @property + def positive_only_preconditioning_used(self) -> str: + """ + How `reconstruction` asks `reconstruction_positive_only_from` to scale the JAX PDIP solve: + ``"jacobi"`` or ``"raw"`` (PyAutoArray#571). + + - Inversions containing a `Mapper` always use ``"jacobi"`` (today's Jacobi-preconditioned solve). + - Inversions with **no** `Mapper` (linear light profiles / MGE only) use + `Settings.nnls_preconditioning_no_mapper` (packaged default ``"raw"``): Jacobi scaling turns their + signal-free Gaussian columns, whose diagonal is only the no-regularization floor, into degenerate + coordinates on which the PDIP dual diverges (14/48 near-truth SLaM `source_lp[1]` points hit the + iteration cap with wrong log-likelihoods), while the raw solve converges on all of them. + - Whenever the certified solver is used the answer is ``"jacobi"`` (it only runs on mapper-only + inversions anyway). + + The NumPy path runs fnnls and ignores the value. + """ + if self.has(cls=Mapper): + return "jacobi" + + if self.positive_only_solver_used != "pdip": + return "jacobi" + + return self.settings.nnls_preconditioning_no_mapper + def _nnls_warm_start_fingerprint(self, ids_to_keep=None) -> Optional[str]: """ Identify the index space this inversion's positive-only solve works in, so the @@ -688,6 +713,7 @@ def reconstruction(self) -> np.ndarray: ), factor=factor, solver=solver, + preconditioning=self.positive_only_preconditioning_used, ) ) @@ -717,6 +743,7 @@ def reconstruction(self) -> np.ndarray: fingerprint=self._nnls_warm_start_fingerprint(), factor=factor, solver=solver, + preconditioning=self.positive_only_preconditioning_used, ) self._nnls_factor = factor diff --git a/autoarray/inversion/inversion/inversion_util.py b/autoarray/inversion/inversion/inversion_util.py index 43bfb5e8d..d94668707 100644 --- a/autoarray/inversion/inversion/inversion_util.py +++ b/autoarray/inversion/inversion/inversion_util.py @@ -297,6 +297,7 @@ def reconstruction_positive_only_from( factor: Optional[dict] = None, solver: str = "pdip", stats: Optional[dict] = None, + preconditioning: str = "jacobi", ): """ Solve the linear system Eq.(2) (in terms of minimizing the quadratic value) of @@ -358,7 +359,22 @@ def reconstruction_positive_only_from( ``certified`` (whether the active-set search certified within budget; ``False`` means the fallback or an uncertified iterate was returned) and ``passes`` (restricted passes run) as *traced* JAX scalars, so it is safe under ``jax.jit`` / ``vmap`` -- read them as outputs of the traced function or through - ``jax.debug.callback``. Every call also records ``solver``. It never changes the returned reconstruction. + ``jax.debug.callback``. With ``solver="pdip"`` it receives ``converged`` (``1`` if the PDIP KKT residual + met its tolerance within the iteration cap, ``0`` if the cap was hit and the returned reconstruction is + the unconverged iterate) and ``iterations`` (PDIP iterations run), also as traced JAX scalars, plus + ``preconditioning``. Every call also records ``solver``. It never changes the returned reconstruction. + preconditioning + How the JAX PDIP solve (``solver="pdip"``) scales the system (PyAutoArray#571). ``"jacobi"`` (default, + 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 + 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 + ``no_regularization_add_to_curvature_diag_value`` floor, degenerate coordinates on which the PDIP dual + diverges; the caller (`AbstractInversion.reconstruction`) therefore passes ``"raw"`` for inversions with + no `Mapper` -- see `AbstractInversion.positive_only_preconditioning_used`. Ignored on the NumPy path. Notes ----- @@ -386,11 +402,25 @@ def reconstruction_positive_only_from( f"solver={solver!r} is not a valid positive-only solver; expected 'pdip' or 'certified'." ) + if preconditioning not in ("jacobi", "raw"): + raise ValueError( + f"preconditioning={preconditioning!r} is invalid; expected 'jacobi' or 'raw'." + ) + + if preconditioning == "raw" and solver != "pdip": + raise ValueError( + "preconditioning='raw' applies only to solver='pdip'; the certified solver always runs on the " + "Jacobi-scaled system." + ) + if xp.__name__.startswith("jax"): from autonerves import conf - from autoarray.util.jax_nnls import solve_nnls_primal + from autoarray.util.jax_nnls import ( + solve_nnls_primal_raw_forward, + solve_nnls_primal_with_status, + ) try: use_jacobi = conf.instance["general"]["inversion"][ @@ -403,9 +433,7 @@ def reconstruction_positive_only_from( use_jacobi = True try: - target_kappa = conf.instance["general"]["inversion"][ - "nnls_target_kappa" - ] + target_kappa = conf.instance["general"]["inversion"]["nnls_target_kappa"] except KeyError: # Workspaces ship their own general.yaml that shadows autoarray's; # fall back to the same value autoarray's general.yaml declares. @@ -424,6 +452,34 @@ def reconstruction_positive_only_from( if max_iter is None: max_iter = 50 + def _record_pdip(converged, iterations): + if stats is not None: + stats["solver"] = "pdip" + stats["preconditioning"] = preconditioning + stats["converged"] = converged + stats["iterations"] = iterations + + if preconditioning == "raw": + # Same Jacobi quantities as below: the backward pass runs on the scaled system, the forward + # solve on the raw one (see `solve_nnls_primal_raw_forward`). + d = xp.sqrt(xp.diag(curvature_reg_matrix)) + D = 1.0 / d + Q_pc = (curvature_reg_matrix * D[:, None]) * D[None, :] + q_pc = data_vector * D + + y, converged, iterations = solve_nnls_primal_raw_forward( + Q_pc, + q_pc, + curvature_reg_matrix, + data_vector, + D, + target_kappa=target_kappa, + solver_tol=solver_tol, + max_iter=max_iter, + ) + _record_pdip(converged, iterations) + return y * D + if use_jacobi: # Ill-conditioned Q makes jaxnnls's relaxed-KKT backward pass # produce NaN gradients. Rescale Q so its diagonal is unit: @@ -449,19 +505,15 @@ def reconstruction_positive_only_from( * D ) - if stats is not None: - stats["solver"] = "pdip" - - return ( - solve_nnls_primal( - Q_pc, - q_pc, - target_kappa=target_kappa, - solver_tol=solver_tol, - max_iter=max_iter, - ) - * D + x, converged, iterations = solve_nnls_primal_with_status( + Q_pc, + q_pc, + target_kappa=target_kappa, + solver_tol=solver_tol, + max_iter=max_iter, ) + _record_pdip(converged, iterations) + return x * D if solver == "certified": return _certified_positive_only_from( @@ -474,16 +526,15 @@ def reconstruction_positive_only_from( stats=stats, ) - if stats is not None: - stats["solver"] = "pdip" - - return solve_nnls_primal( + x, converged, iterations = solve_nnls_primal_with_status( curvature_reg_matrix, data_vector, target_kappa=target_kappa, solver_tol=solver_tol, max_iter=max_iter, ) + _record_pdip(converged, iterations) + return x # `solver` is deliberately ignored on the NumPy path: a NumPy port of the certified active-set scheme # measured 3-7 % slower than fnnls and lost to its warm-start memo (PyAutoArray#566), so fnnls stays. diff --git a/autoarray/settings.py b/autoarray/settings.py index 19fabe8fa..ef18c180c 100644 --- a/autoarray/settings.py +++ b/autoarray/settings.py @@ -26,6 +26,7 @@ def __init__( certified_pass_budget: Optional[int] = None, certified_fallback: Optional[str] = None, certified_tau_rel: Optional[float] = None, + nnls_preconditioning_no_mapper: Optional[str] = None, ): """ The settings of an Inversion, customizing how a linear set of equations are solved for. @@ -223,6 +224,23 @@ def __init__( Relative KKT tolerance of the ``"certified"`` solver's certificate: primal violations are ``x < -tau_rel * max|x|``, dual violations ``g < -tau_rel * max|q|``. `None` (default) reads the packaged value (`1.0e-9`). + nnls_preconditioning_no_mapper + How the JAX positive-only PDIP solve scales an inversion **with no `Mapper`** (linear light profiles / + MGE only). `None` (default) reads the packaged value ``"raw"``. + + - ``"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"``. + 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 + coordinates on which the PDIP dual diverges); the raw solve converges on all of them in 16-19 + iterations (PyAutoArray#571). + - ``"jacobi"`` -- the Jacobi-preconditioned solve, as for mapper inversions. + + Inversions containing a `Mapper` always use ``"jacobi"`` + (`AbstractInversion.positive_only_preconditioning_used` records the decision). The NumPy path always + runs fnnls and ignores this. """ self.use_mixed_precision = use_mixed_precision self.nnls_solver_tol = nnls_solver_tol @@ -244,12 +262,15 @@ def __init__( self._certified_pass_budget = certified_pass_budget self._certified_fallback = certified_fallback self._certified_tau_rel = certified_tau_rel + self._nnls_preconditioning_no_mapper = nnls_preconditioning_no_mapper # Validate explicit values eagerly, so a typo fails at construction rather than deep inside a fit. if positive_only_solver is not None: self.positive_only_solver if certified_fallback is not None: self.certified_fallback + if nnls_preconditioning_no_mapper is not None: + self.nnls_preconditioning_no_mapper @property def use_positive_only_solver(self): @@ -449,3 +470,23 @@ def certified_tau_rel(self) -> float: return self._inversion_config_value("certified_tau_rel", 1.0e-9) return self._certified_tau_rel + + @property + def nnls_preconditioning_no_mapper(self) -> str: + """ + How the JAX PDIP solve scales an inversion with no `Mapper`: ``"raw"`` or ``"jacobi"``. + + See the constructor docstring; inversions with a `Mapper` always use ``"jacobi"``. + """ + value = self._nnls_preconditioning_no_mapper + if value is None: + value = self._inversion_config_value( + "nnls_preconditioning_no_mapper", "raw" + ) + + if value not in ("raw", "jacobi"): + raise ValueError( + f"nnls_preconditioning_no_mapper={value!r} is invalid; expected 'raw' or 'jacobi'." + ) + + return value diff --git a/autoarray/util/jax_nnls.py b/autoarray/util/jax_nnls.py index e7abd179f..3748f1bce 100644 --- a/autoarray/util/jax_nnls.py +++ b/autoarray/util/jax_nnls.py @@ -20,6 +20,15 @@ runs until the slowest lane converges, so ``max_iter`` also caps the worst-case batched cost. +Convergence is observable (PyAutoArray#571): :func:`solve_nnls_primal_with_status` +returns the PDIP ``converged`` flag and iteration count next to ``x`` (the +plain :func:`solve_nnls_primal` keeps its drop-in signature). The ``"raw"`` +positive-only mode (:func:`solve_nnls_primal_raw_forward`) runs the forward +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. + JAX is imported inside functions, never at module level (see ``docs/agents/jax_and_decorators.md``); this module must only be imported on the ``xp=jnp`` path. The solver knobs are static closure parameters — @@ -76,38 +85,85 @@ def converged_check(inputs): return x, s, z, converged, pdip_iter +# The data-scaled tolerance of the "raw" (un-preconditioned) mode is this fraction of jaxnnls's +# own ``n * EPSILON`` rule, multiplied by ``max(1, max|q|)``. Measured on the SLaM MGE fixture +# (PyAutoArray#571): factor 1 stops ~1e-11 (relative objective) short of fnnls, 1e-2 reaches +# <= 4e-13 for 1-2 extra iterations (16-19 in total), 1e-3 / 1e-4 buy one more digit per iteration. +DATA_SCALED_TOL_FACTOR = 1.0e-2 + + +def data_scaled_solver_tol(q): + """ + The convergence tolerance of the ``"raw"`` positive-only mode: + ``DATA_SCALED_TOL_FACTOR * n * EPSILON * max(1, max|q|)``. + + jaxnnls's own rule ``n * EPSILON`` is absolute, so on an unscaled system + (curvature entries ~1e7) it is unreachable in floating point; scaling it by + the data vector makes it a relative KKT tolerance. ``q`` may be traced. + """ + import jax.numpy as jnp + from jaxnnls.pdip import EPSILON + + return ( + DATA_SCALED_TOL_FACTOR + * q.shape[0] + * EPSILON + * jnp.maximum(1.0, jnp.max(jnp.abs(q))) + ) + + @lru_cache(maxsize=None) def _solve_nnls_primal_with(target_kappa, solver_tol, max_iter): """ Build (and cache) the differentiable primal solver for one static - setting of the knobs. The returned function takes only (Q, q), so the - custom-vjp backward pass returns exactly (dQ, dq). + setting of the knobs. The returned function takes only (Q, q) and returns + ``(x, converged, pdip_iter)``; the custom-vjp backward pass returns + exactly (dQ, dq) from the cotangent of ``x`` (the integer status outputs + carry no cotangent). """ import jax from jaxnnls.diff_qp import diff_nnls from jaxnnls.pdip_relaxed import solve_relaxed_nnls def primal(Q, q): - return solve_nnls(Q, q, solver_tol=solver_tol, max_iter=max_iter)[0] + x, _, _, converged, pdip_iter = solve_nnls( + Q, q, solver_tol=solver_tol, max_iter=max_iter + ) + return x, converged, pdip_iter def forward(Q, q): - x, s, z, _, _ = solve_nnls(Q, q, solver_tol=solver_tol, max_iter=max_iter) + x, s, z, converged, pdip_iter = solve_nnls( + Q, q, solver_tol=solver_tol, max_iter=max_iter + ) # Relax the solution with vanilla Newton steps on the relaxed KKT # conditions; only the backward pass consumes the relaxed variables. - xr, sr, zr, _, _ = solve_relaxed_nnls( - Q, q, x, s, z, target_kappa=target_kappa - ) - return x, (Q, xr, sr, zr) + xr, sr, zr, _, _ = solve_relaxed_nnls(Q, q, x, s, z, target_kappa=target_kappa) + return (x, converged, pdip_iter), (Q, xr, sr, zr) - def backward(res, input_grad): + def backward(res, output_grad): Q, xr, sr, zr = res - return diff_nnls(Q, xr, sr, zr, input_grad) + return diff_nnls(Q, xr, sr, zr, output_grad[0]) primal = jax.custom_vjp(primal) primal.defvjp(forward, backward) return primal +def solve_nnls_primal_with_status( + Q, q, target_kappa=1e-3, solver_tol=None, max_iter=50 +): + """ + As :func:`solve_nnls_primal`, but also returns the PDIP convergence flag + and iteration count: ``(x, converged, pdip_iter)``. + + ``x`` (value and gradient) is identical to :func:`solve_nnls_primal`; + ``converged`` (``1`` if the KKT residual met the tolerance within + ``max_iter``) and ``pdip_iter`` are non-differentiable integer outputs, so + they are safe to return from ``jax.jit`` / ``vmap``-ed code. + """ + return _solve_nnls_primal_with(target_kappa, solver_tol, max_iter)(Q, q) + + def solve_nnls_primal(Q, q, target_kappa=1e-3, solver_tol=None, max_iter=50): """ Solve the non-negative least squares problem, differentiable via the @@ -115,6 +171,80 @@ def solve_nnls_primal(Q, q, target_kappa=1e-3, solver_tol=None, max_iter=50): Drop-in replacement for ``jaxnnls.solve_nnls_primal`` with two extra knobs; at their defaults (``solver_tol=None``, ``max_iter=50``) the - forward solve and gradients are identical to upstream. + forward solve and gradients are identical to upstream. Use + :func:`solve_nnls_primal_with_status` to also get the convergence flag. """ - return _solve_nnls_primal_with(target_kappa, solver_tol, max_iter)(Q, q) + return solve_nnls_primal_with_status( + Q, q, target_kappa=target_kappa, solver_tol=solver_tol, max_iter=max_iter + )[0] + + +@lru_cache(maxsize=None) +def _solve_nnls_raw_forward_with(target_kappa, solver_tol, max_iter): + """ + Build (and cache) the ``"raw"``-mode solver (PyAutoArray#571). + + The returned function takes the Jacobi-scaled system ``(Q_pc, q_pc)`` + (``Q_pc = D Q D``, ``q_pc = D q``) together with the raw system ``(Q, q)`` + and ``D``, and returns ``(y, converged, pdip_iter)`` with ``y`` the solution + of the scaled system, so ``x = D * y``. + + - **Forward:** the PDIP solve runs on the *raw* ``(Q, q)`` with a + data-scaled tolerance (:func:`data_scaled_solver_tol`, unless + ``solver_tol`` is given), and its iterate is mapped to the scaled + coordinates (``y = x / D``, slack ``s / D``, dual ``z * D``). On + 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. + - **Backward:** exactly today's Jacobi-mode pass, i.e. the relaxed-KKT implicit + derivative on ``Q_pc``, started from the mapped iterate. 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 those, and of ``D``, on the raw inputs. + """ + import jax + import jax.numpy as jnp + from jaxnnls.diff_qp import diff_nnls + from jaxnnls.pdip_relaxed import solve_relaxed_nnls + + def raw_solve(Q, q, D): + 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 + ) + return x / D, s / D, z * D, converged, pdip_iter + + def primal(Q_pc, q_pc, Q, q, D): + y, _, _, converged, pdip_iter = raw_solve(Q, q, D) + return y, converged, pdip_iter + + def forward(Q_pc, q_pc, Q, q, D): + y, sy, zy, converged, pdip_iter = raw_solve(Q, q, D) + yr, sr, zr, _, _ = solve_relaxed_nnls( + Q_pc, q_pc, y, sy, zy, target_kappa=target_kappa + ) + return (y, converged, pdip_iter), (Q_pc, yr, sr, zr, Q, q, D) + + def backward(res, output_grad): + Q_pc, yr, sr, zr, Q, q, D = res + dQ_pc, dq_pc = diff_nnls(Q_pc, yr, sr, zr, output_grad[0]) + return dQ_pc, dq_pc, jnp.zeros_like(Q), jnp.zeros_like(q), jnp.zeros_like(D) + + primal = jax.custom_vjp(primal) + primal.defvjp(forward, backward) + return primal + + +def solve_nnls_primal_raw_forward( + Q_pc, q_pc, Q, q, D, target_kappa=1e-3, solver_tol=None, max_iter=50 +): + """ + The ``"raw"`` positive-only mode: forward PDIP on the raw system with a + data-scaled tolerance, backward pass on the Jacobi-scaled system. Returns + ``(y, converged, pdip_iter)`` with ``x = D * y``; see + :func:`_solve_nnls_raw_forward_with`. + """ + return _solve_nnls_raw_forward_with(target_kappa, solver_tol, max_iter)( + Q_pc, q_pc, Q, q, D + ) diff --git a/test_autoarray/inversion/inversion/test_nnls_mge_convergence.py b/test_autoarray/inversion/inversion/test_nnls_mge_convergence.py index e4018a829..0d34d2632 100644 --- a/test_autoarray/inversion/inversion/test_nnls_mge_convergence.py +++ b/test_autoarray/inversion/inversion/test_nnls_mge_convergence.py @@ -10,9 +10,14 @@ - keys 5-6: it hits the production 50-iteration cap but converges by 200; - key 7: a healthy system (19 iterations). -Every fixture system must converge within the production cap and reach the NumPy `fnnls_cholesky` objective -`0.5 x^T Q x - q^T x`, single and under `vmap`. The control test pins today's PDIP answer on well-conditioned -random systems so a fix cannot move converging solves. +Mechanism (issue comment "Step 3 diagnosis"): Jacobi scaling turns the signal-free source-Gaussian columns, +whose diagonal is only the no-regularization floor, into degenerate coordinates on which the PDIP dual +diverges. The fix is the ``preconditioning="raw"`` mode, which the inversion dispatches for mapper-less +inversions: the forward solve runs on the raw system with a data-scaled tolerance. With it, every fixture +system must converge within the production cap and reach the NumPy `fnnls_cholesky` objective +`0.5 x^T Q x - q^T x`, single, end-to-end and under `vmap`, with finite gradients. The Jacobi mode must now +*report* its non-convergence (`stats["converged"] == 0`), and the control test pins today's Jacobi answer +bit-identically on well-conditioned random systems. Tolerances were declared before the first run: objective within `1e-8 * |obj_fnnls| + 1e-8` (the objectives are negative, ~ -9.7e5, so the bound is additive rather than the multiplicative `obj * (1 + 1e-8)` of the @@ -110,21 +115,37 @@ def test__fixture_is_the_captured_slam_mge_set(): np.testing.assert_allclose(Q, Q.T, rtol=0, atol=1e-8 * np.abs(Q).max()) +def _raw(jnp, Q, q, stats=None, settings=None): + return inversion_util.reconstruction_positive_only_from( + data_vector=jnp.asarray(q), + curvature_reg_matrix=jnp.asarray(Q), + settings=settings or aa.Settings(), + xp=jnp, + stats=stats, + preconditioning="raw", + ) + + @requires_jax @pytest.mark.parametrize("key", KEYS, ids=IDS) -def test__pdip_jacobi_converges_within_production_cap(jnp, key): - from autoarray.util.jax_nnls import solve_nnls +def test__raw_pdip_converges_within_production_cap(jnp, key): + """The "raw" solve (un-preconditioned, data-scaled tolerance) converges on every fixture system and reaches + the fnnls objective to 1e-12 relative (measured <= 4e-13).""" + from autoarray.util.jax_nnls import data_scaled_solver_tol, solve_nnls Q, q = SYSTEMS[key] - Q_pc, q_pc, D = _jacobi(Q, q) + Qj, qj = jnp.asarray(Q), jnp.asarray(q) x, _, _, converged, pdip_iter = solve_nnls( - jnp.asarray(Q_pc), jnp.asarray(q_pc), max_iter=PRODUCTION_MAX_ITER + Qj, qj, solver_tol=data_scaled_solver_tol(qj), max_iter=PRODUCTION_MAX_ITER ) assert int(converged) == 1, f"PDIP did not converge ({int(pdip_iter)} iterations)" assert int(pdip_iter) < PRODUCTION_MAX_ITER - _assert_objective_reaches_fnnls(Q, q, np.asarray(x) * D) + x = np.asarray(x) + assert np.all(np.isfinite(x)) + obj_fnnls = _objective(Q, q, _fnnls(Q, q)) + assert abs(_objective(Q, q, x) - obj_fnnls) <= 1.0e-12 * abs(obj_fnnls) @requires_jax @@ -134,53 +155,115 @@ def test__reconstruction_positive_only_from__jax_matches_numpy_objective(jnp, ke settings = aa.Settings() stats = {} - x_jax = inversion_util.reconstruction_positive_only_from( - data_vector=jnp.asarray(q), - curvature_reg_matrix=jnp.asarray(Q), - settings=settings, - xp=jnp, - stats=stats, - ) + x_jax = np.asarray(_raw(jnp, Q, q, stats=stats, settings=settings)) x_np = inversion_util.reconstruction_positive_only_from( data_vector=q, curvature_reg_matrix=Q, settings=settings, xp=np ) - x_jax = np.asarray(x_jax) assert np.all(np.isfinite(x_jax)), "JAX reconstruction is non-finite" obj_jax = _objective(Q, q, x_jax) obj_np = _objective(Q, q, np.asarray(x_np)) assert abs(obj_jax - obj_np) <= OBJECTIVE_RTOL * abs(obj_np), (obj_jax, obj_np) assert stats["solver"] == "pdip" - # Once the fix surfaces the PDIP convergence flag (PyAutoArray#571 step 4), also assert: - # assert bool(stats["converged"]) + assert stats["preconditioning"] == "raw" + assert int(stats["converged"]) == 1 + assert int(stats["iterations"]) < PRODUCTION_MAX_ITER @requires_jax -def test__pdip_jacobi_converges_under_vmap(jnp): +def test__jacobi_mode_reports_non_convergence_on_the_witness_systems(jnp): + """F1: the Jacobi mode still fails on fixture keys 0-6 (the mechanism is unchanged), but the failure is no + longer silent -- `stats["converged"]` is 0 and the iteration count is the cap. Key 7 converges. + """ + for key, (Q, q) in enumerate(SYSTEMS): + stats = {} + inversion_util.reconstruction_positive_only_from( + data_vector=jnp.asarray(q), + curvature_reg_matrix=jnp.asarray(Q), + settings=aa.Settings(), + xp=jnp, + stats=stats, + ) + assert stats["preconditioning"] == "jacobi" + expected = 1 if META["systems"][key]["category"] == "healthy" else 0 + assert int(stats["converged"]) == expected, key + if expected == 0: + assert int(stats["iterations"]) == PRODUCTION_MAX_ITER + + +@requires_jax +def test__raw_pdip_converges_under_vmap(jnp): import jax - from autoarray.util.jax_nnls import solve_nnls + def solve(Q, q): + stats = {} + x = inversion_util.reconstruction_positive_only_from( + data_vector=q, + curvature_reg_matrix=Q, + settings=aa.Settings(), + xp=jnp, + stats=stats, + preconditioning="raw", + ) + return x, stats["converged"], stats["iterations"] - scaled = [_jacobi(Q, q) for Q, q in SYSTEMS] - Q_pc = jnp.asarray(np.stack([s[0] for s in scaled])) - q_pc = jnp.asarray(np.stack([s[1] for s in scaled])) + Qs = jnp.asarray(np.stack([Q for Q, _ in SYSTEMS])) + qs = jnp.asarray(np.stack([q for _, q in SYSTEMS])) - x, _, _, converged, pdip_iter = jax.vmap( - lambda Q, q: solve_nnls(Q, q, max_iter=PRODUCTION_MAX_ITER) - )(Q_pc, q_pc) + x, converged, iterations = jax.jit(jax.vmap(solve))(Qs, qs) converged = np.asarray(converged) - pdip_iter = np.asarray(pdip_iter) + iterations = np.asarray(iterations) failed = [ - k for k in KEYS if converged[k] != 1 or pdip_iter[k] >= PRODUCTION_MAX_ITER + k for k in KEYS if converged[k] != 1 or iterations[k] >= PRODUCTION_MAX_ITER ] assert not failed, ( f"failed lanes {failed}; converged {converged.tolist()}; " - f"pdip_iter {pdip_iter.tolist()}" + f"iterations {iterations.tolist()}" ) for k, (Q, q) in enumerate(SYSTEMS): - _assert_objective_reaches_fnnls(Q, q, np.asarray(x[k]) * scaled[k][2]) + _assert_objective_reaches_fnnls(Q, q, np.asarray(x[k])) + + +@requires_jax +@pytest.mark.parametrize("key", KEYS, ids=IDS) +def test__raw_mode_gradient_is_finite_and_non_zero(jnp, key): + """The raw mode keeps the Jacobi-space relaxed-KKT backward pass: a relaxed-KKT pass on the raw Q gives NaN + gradients on keys 2-4, and the Jacobi-mode gradient itself is NaN on key 1 (its forward solve diverged). + """ + import jax + + Q, q = SYSTEMS[key] + w = jnp.linspace(0.5, 1.5, q.shape[0]) + + gQ, gq = jax.grad(lambda Q_, q_: w @ _raw(jnp, Q_, q_), argnums=(0, 1))( + jnp.asarray(Q), jnp.asarray(q) + ) + + assert np.all(np.isfinite(np.asarray(gQ))) and np.all(np.isfinite(np.asarray(gq))) + assert np.any(np.asarray(gq) != 0.0) + + +@requires_jax +def test__raw_mode_gradient_matches_jacobi_mode_on_the_healthy_system(jnp): + """Where the Jacobi forward solve converges (key 7) the two modes differentiate the same relaxed system from + nearly the same iterate: measured max relative difference 2.8e-3.""" + import jax + + key = [s["key"] for s in META["systems"] if s["category"] == "healthy"][0] + Q, q = SYSTEMS[key] + w = jnp.linspace(0.5, 1.5, q.shape[0]) + + def jacobi(Q_, q_): + return w @ inversion_util.reconstruction_positive_only_from( + data_vector=q_, curvature_reg_matrix=Q_, settings=aa.Settings(), xp=jnp + ) + + g_raw = np.asarray(jax.grad(lambda q_: w @ _raw(jnp, Q, q_))(jnp.asarray(q))) + g_jac = np.asarray(jax.grad(lambda q_: jacobi(jnp.asarray(Q), q_))(jnp.asarray(q))) + + assert np.abs(g_raw - g_jac).max() <= 1.0e-2 * np.abs(g_jac).max() def _random_system(n, seed): @@ -233,3 +316,10 @@ def test__control__well_conditioned_pdip_unchanged(jnp, n, seed): x_scipy, _ = nnls(A, b) np.testing.assert_allclose(x, x_scipy, rtol=0, atol=1e-8 * np.abs(x_scipy).max()) + + stats = {} + x_raw = np.asarray(_raw(jnp, Q, q, stats=stats)) + assert int(stats["converged"]) == 1 + np.testing.assert_allclose( + x_raw, x_scipy, rtol=0, atol=1e-8 * np.abs(x_scipy).max() + ) diff --git a/test_autoarray/inversion/inversion/test_positive_only_dispatch.py b/test_autoarray/inversion/inversion/test_positive_only_dispatch.py index 52198f966..810083e27 100644 --- a/test_autoarray/inversion/inversion/test_positive_only_dispatch.py +++ b/test_autoarray/inversion/inversion/test_positive_only_dispatch.py @@ -48,6 +48,7 @@ def _inversion( use_jax, positive_only_solver="certified", use_edge_zeroed_pixels=False, + nnls_preconditioning_no_mapper=None, ): if use_jax: import jax @@ -66,6 +67,7 @@ def _inversion( use_positive_only_solver=True, use_edge_zeroed_pixels=use_edge_zeroed_pixels, positive_only_solver=positive_only_solver, + nnls_preconditioning_no_mapper=nnls_preconditioning_no_mapper, # Off so two NumPy solves of the same system are bit-comparable: with the memo on, the second # solve starts from the first's passive set and can differ in the last ulp. nnls_warm_start_memo=False, @@ -209,3 +211,106 @@ def test__positive_only_solver_used__edge_zeroed_subset_is_preserved(): assert x_certified == pytest.approx( x_pdip, rel=1.0e-8, abs=1.0e-8 * np.max(np.abs(x_certified)) ) + + +def test__positive_only_preconditioning_used__mapper_inversions_keep_jacobi(): + data_vector, curvature_reg_matrix = _system(17) + func_list = aa.m.MockLinearObjFuncList(parameters=1) + + for linear_obj_list in ([_mapper()], [func_list, _mapper()]): + for solver in ("pdip", "certified"): + inversion = _inversion( + linear_obj_list, + data_vector[: 16 + len(linear_obj_list) - 1], + curvature_reg_matrix[ + : 16 + len(linear_obj_list) - 1, : 16 + len(linear_obj_list) - 1 + ], + use_jax=False, + positive_only_solver=solver, + ) + assert inversion.positive_only_preconditioning_used == "jacobi" + + +def test__positive_only_preconditioning_used__no_mapper_uses_settings_default_raw(): + data_vector, curvature_reg_matrix = _system(4) + + default = _inversion( + [aa.m.MockLinearObjFuncList(parameters=4)], + data_vector, + curvature_reg_matrix, + use_jax=False, + positive_only_solver="pdip", + ) + forced = _inversion( + [aa.m.MockLinearObjFuncList(parameters=4)], + data_vector, + curvature_reg_matrix, + use_jax=False, + positive_only_solver="pdip", + nnls_preconditioning_no_mapper="jacobi", + ) + + assert default.settings.nnls_preconditioning_no_mapper == "raw" + assert default.positive_only_preconditioning_used == "raw" + assert forced.positive_only_preconditioning_used == "jacobi" + + +def test__settings__nnls_preconditioning_no_mapper_rejects_unknown_value(): + with pytest.raises(ValueError): + aa.Settings(nnls_preconditioning_no_mapper="diag") + + +@requires_jax +def test__positive_only_preconditioning_used__no_mapper_jax_reconstruction_is_the_raw_solve(): + import jax.numpy as jnp + + from autoarray.inversion.inversion import inversion_util + + data_vector, curvature_reg_matrix = _system(4) + + inversion = _inversion( + [aa.m.MockLinearObjFuncList(parameters=4)], + data_vector, + curvature_reg_matrix, + use_jax=True, + positive_only_solver="pdip", + ) + + expected = inversion_util.reconstruction_positive_only_from( + data_vector=jnp.asarray(data_vector), + curvature_reg_matrix=jnp.asarray(curvature_reg_matrix), + settings=inversion.settings, + xp=jnp, + preconditioning="raw", + ) + + assert np.array_equal(np.asarray(inversion.reconstruction), np.asarray(expected)) + assert np.asarray(expected) == pytest.approx( + np.asarray( + inversion_util.reconstruction_positive_only_from( + data_vector=data_vector, + curvature_reg_matrix=curvature_reg_matrix, + settings=inversion.settings, + xp=np, + ) + ), + abs=1.0e-8, + ) + + +@requires_jax +def test__reconstruction_positive_only_from__raw_rejects_certified(): + import jax.numpy as jnp + + from autoarray.inversion.inversion import inversion_util + + data_vector, curvature_reg_matrix = _system(4) + + with pytest.raises(ValueError): + inversion_util.reconstruction_positive_only_from( + data_vector=jnp.asarray(data_vector), + curvature_reg_matrix=jnp.asarray(curvature_reg_matrix), + xp=jnp, + solver="certified", + preconditioning="raw", + )