Baseline comparisons

What it measures: SOLVAX against jax.scipy.sparse.linalg, lineax, and scipy.sparse.linalg on the research problem families at identical tolerance with no preconditioning anywhere — identical knobs isolate the solver implementations (preconditioned SOLVAX numbers live in Problem-suite robustness sweeps).

Reproduce (lineax via pip install solvax[bench]; its rows skip if absent):

python -m benchmarks.benchmark_baselines --json

Record: benchmarks/results/baselines.json (rtol 1e-8, float64, CPU; SciPy runs on NumPy arrays on the same host, so iterations are the primary cross-library metric and its wall times carry that caveat).

Headline (grid-32 families, rtol 1e-8)

  • Iteration parity with the reference: SOLVAX’s PCG and FGMRES take exactly the SciPy iteration counts on every SPD and nonsymmetric point (e.g. 18/18 and 70/70 on anisotropic diffusion, 19/19 and 20/20 on Helmholtz) — same mathematics, verified head-to-head. lineax GMRES reports outer restart cycles rather than inner iterations, and its CG stops on a different criterion, so its counts are not directly comparable.

  • Time: median time-to-best ratios over all problems — jax.scipy 1.00, SOLVAX 1.19, lineax 1.96, scipy 6.49. At these small unpreconditioned sizes the minimal-machinery baseline is fastest; SOLVAX’s ~20% overhead buys iteration diagnostics, convergence flags, preconditioning hooks, recycling, and the structured/bounded adjoints no baseline offers. Honest losses included: jax.scipy wins most raw-time comparisons here.

Work-precision

The record includes achieved-residual-versus-time series across rtol {1e-4 … 1e-10} for all four solvers on three representative problems, and a SOLVAX-only solution-plus-gradient series (one fused jit through the implicit adjoint at each tolerance) — the integrated differentiable cost that baselines would hand-roll as two separate solves.