Purpose¶
This report separates numerical correctness from performance. Every library is judged against declared mathematical truth before any timing ratio is interpreted.
Comparison label definitions¶
| Label | Meaning | Records |
|---|---|---|
exact | Same embedded rule family and order. | 11 |
strong_match | Closely matched global refinement capacity. | 6 |
node_matched | Same local node count with different estimators. | 10 |
family_matched | Same broad method family; algorithms differ. | 26 |
capability | Related capability only; no algorithmic equivalence claim. | 9 |
best_method | Predeclared practical choice using the frozen library-specific adapter settings. | 16 |
Cases and truth¶
The catalog includes smooth, vector-valued, localized, nonsmooth, endpoint-singular, improper, oscillatory, expensive, narrow-feature, and nonfinite cases. Truth comes from analytic derivations or an independent NumPy Gauss-Legendre convergence ladder.
Accuracy and calibration¶
49 of 78 records warrant primal timing interpretation. 30 warrant JVP timing, and 18 warrant a direct two-library reverse-mode comparison.
There are 15 records with available derivative truth that fail at least one JVP gate. Records without declared derivative truth are explicitly ineligible for AD comparisons. Reported-error ratios are calibration diagnostics, not automatic bound claims.
Work¶
Reported and normalized evaluations are retained separately. In particular, Quadax Clenshaw-Curtis interval work is converted to actual node evaluations before comparable-work analysis.
Compile, warm, VMAP, and AD timing¶
Lowering, compilation, warm scalar execution, VMAP batches of 16 and 128, JVP, and supported reverse mode are measured separately with synchronized outputs and interleaved library order. Every method-case record is measured in a fresh Python process so internal compilation caches cannot leak between records.
Using a descriptive stability threshold of , 616 of 752 supported timed library-mode measurements are stable. Automatic regression decisions use the stricter predeclared ratio, minimum-case, and two-MAD separation rules.
Failure semantics¶
Jaxstro fails closed on nonfinite integrand samples. Quadax 0.2.13 masks nonfinite samples to zero, so that case is recorded as a semantic difference and excluded from performance claims.
Primary matched timing ratios¶
Each timing ratio is ; each work ratio is . Values above one therefore favor Quadax for that metric. The parenthetical timing label states whether the Jaxstro slowdown exceeds twice the larger MAD; it is not a winner declaration.
| Case | Family | Compile | Warm | VMAP 128 | JVP | Work |
|---|---|---|---|---|---|---|
smooth_exponential | gauss_kronrod | not warranted | not warranted | not warranted | not warranted | not warranted |
smooth_exponential | clenshaw_curtis | 0.93 | 0.74 (not separated) | 0.01 (not separated) | 0.81 (not separated) | 1.00 |
smooth_exponential | romberg | 1.76 | 0.56 (not separated) | 1.01 (not separated) | 1.73 (separated) | 1.00 |
localized_gaussian | gauss_kronrod | not warranted | not warranted | not warranted | not warranted | not warranted |
localized_gaussian | clenshaw_curtis | 1.20 | 0.85 (not separated) | 0.22 (not separated) | not warranted | 1.22 |
breakpoint_kink | gauss_kronrod | not warranted | not warranted | not warranted | not warranted | not warranted |
breakpoint_kink | clenshaw_curtis | 1.28 | 0.79 (not separated) | 0.02 (not separated) | not warranted | 1.00 |
oscillatory_cosine | gauss_kronrod | not warranted | not warranted | not warranted | not warranted | not warranted |
oscillatory_cosine | clenshaw_curtis | 1.10 | 1.23 (separated) | 0.60 (not separated) | 1.20 (separated) | 1.85 |
oscillatory_cosine | romberg | 1.73 | 0.91 (not separated) | 0.65 (not separated) | 1.74 (separated) | 1.00 |
expensive_identity | gauss_kronrod | not warranted | not warranted | not warranted | not warranted | not warranted |
expensive_identity | clenshaw_curtis | 1.09 | 0.76 (not separated) | 0.01 (not separated) | 0.75 (not separated) | 1.00 |
expensive_identity | romberg | 1.52 | 1.25 (separated) | 0.55 (not separated) | 1.71 (separated) | 1.00 |
Environment¶
Source revision: 35736fcc0fdaa7932b3bc67780567e24cf94638a
backend:cpucpu_model:Apple M2 Max / Mac14,5device:cpu:0device_kind:cpujax_version:0.10.1jaxlib_version:0.10.1machine:arm64numpy_version:2.4.6operating_system:macOS-26.1-arm64-arm-64bit-Mach-Oprocessor:armpython_version:3.13.7quadax_version:0.2.13
Optimization decision¶
Status: optimized_accepted_two_suite.
Two fresh isolated suites improve all three Romberg VMAP-128 targets without a reproducible scalar or JVP regression.
Reviewed baseline authorization: vmap_128.
The VMAP batch-128 trigger reproduced across smooth, oscillatory, and expensive-integrand Romberg cases in both clean baseline suites.
Post-optimization residual triggers: ad_jvp. These are observations from the accepted optimized suite, not additional authorization for the implemented change.
Two-suite optimization acceptance¶
The reviewed baseline is preserved unchanged. The two optimized suites have distinct generated run identifiers and distinct source revisions, with the exact same unique record set, unchanged runtime and measurement owners, matching controls and hardware, and per-record process isolation.
| Romberg case | Suite 1 VMAP-128 speedup | Suite 2 VMAP-128 speedup |
|---|---|---|
smooth_exponential | 2.85 | 2.76 |
oscillatory_cosine | 2.53 | 2.48 |
expensive_identity | 12.45 | 12.37 |
Warranted limitations¶
CPU wall time is hardware- and load-dependent and is not a CI gate.
Family-matched labels do not imply identical algorithms or failure semantics.
Jaxstro replay derivatives and Quadax adaptive-loop derivatives have different policies.
No backend-portable peak device-memory metric is claimed.
The nonfinite case intentionally exposes Quadax zero-substitution behavior.