XP/XPHM precession boundary qualification (2026-09-25)
2026-09-27 isolated XP version/remnant blocker control
A direct public-binary control on len used Python 3.12.3, NumPy 2.3.5,
Torch 2.14.0+cpu, JAX 0.11.2, and LALSuite 7.26.15. All waveforms used
IMRPhenomXP, convention 1, phic=0.3, phi0=0, distance 150 Mpc, an
unshifted 0.25-Hz grid, and the same physical inputs for versions 102 and
223 and remnant modes 0 and 3. The equal-mass fixture is the 25/25-Msun
two-spin case below (f_ref=20 Hz); the near-aligned fixture is the
36/22-Msun up-down case below (f_ref=40 Hz). The public LALSimulation
binary API supplied only numerical output; no LAL source, coefficient, or
calibration asset was copied. The frozen gates remain relative complex L2
1e-6 and flat mismatch 1e-8 per polarization.
| Case and band | Native 223/0 vs binary 223/0 L2, plus / cross | Binary 223/0 vs binary 102/0 L2, plus / cross | Native 102/0 vs binary 102/0 L2, plus / cross |
|---|---|---|---|
| Equal mass, 20–512 Hz | 0.029705677753180615 / 0.03589736628835022 |
0.031765223962125326 / 0.03869141740536079 |
0.0035442845453761617 / 0.004547643714867289 |
| Near aligned, 25–55 Hz | 0.023737179573462445 / 0.02373672163766733 |
0.023737302747141316 / 0.023736880404491217 |
2.965042067384981e-11 / 3.821943469355585e-11 |
| Near aligned, 25–300 Hz | 0.09654477245767022 / 0.09654736105223909 |
0.09654486477183226 / 0.09654748007284461 |
3.2265166254984385e-11 / 4.158838600878678e-11 |
Native version 223/mode 0 and version 102/mode 0 are bit-identical in each
of these three cases: the native 223 path selected NNLO angles. At the
near-aligned fixture, native 223/mode 3 is also bit-identical to native
102/mode 0. Changing the binary remnant from mode 0 to mode 3 changes the
near-aligned full-waveform L2 by at most 2.16e-10 across the larger band;
the failure is an angle-route discrepancy. The binary emits a waveform for
the equal-mass 223/mode-3 request, while both native frontends explicitly
reject its invalid nonaligned MSA averaged-remnant root. That domain-policy
gap has no numerical native residual and remains a release failure.
The version-102 equal-mass residual is not specific to exact mass
equality: changing the primary mass to 25.00001 Msun gives native/binary
102/mode-0 L2 0.0035434142280056907 / 0.004546745513710817; changing
it to 35 Msun gives 0.04924902660620749 / 0.06218936180015843.
Aligning only spin 2 at equal mass leaves 0.0036713638518117322 /
0.004648490188983955. For the near-aligned inputs, the same v102 route
passes at approximately 3–4e-11. Thus this additional residual lies in a
finite-precession NNLO full-waveform path, not the equal-mass MSA root or
remnant selection. It has not been localized to a particular published NNLO
coefficient or projection equation; no speculative correction is made.
Pratten et al., Sec. IV.1, Eqs. (17)–(22), and Sec. IV.2
distinguish the single-spin NNLO construction from two-spin MSA, identify
singular equal-mass MSA couplings, and describe the NNLO angle fallback for
unstable initialization. Chatziioannou et al., Appendix E
notes the near-aligned root/PN conditioning and proposes a dedicated
small-misalignment expansion as an improvement. The independent scalar cubic
receipt in docs/waveforms/research/xp-v223-reference-closure.md finds the
reference inverse-cosine endpoint only about 3.30e-37 from its limit for
the near-aligned 1e-10 perturbation, far below float64 resolution.
Gerosa et al., Sec. IV.2 give a
regularized variable for a different precession formulation but leave a
formal zero-amplitude resonance expansion to future work. These sources do
not specify a complete v223 float64 root, phase, remnant, and waveform-chart
continuation that would reproduce the pinned binary at these boundaries.
The output cannot justify copying a hidden binary fallback or fitting a
correction. The XP release verdict remains fail, with the frozen gates
unchanged.
The unchanged scripts/qualify_xp_xphm_boundaries.py driver was rerun on
len with PYTHONPATH=src, OPENBLAS_NUM_THREADS=1, and
OMP_NUM_THREADS=1. Its public-binary rows reproduce the equal-mass
mode-0 L2 above, pass both near-aligned v102 modes at at most 4.16e-11,
fail both near-aligned v223 modes at 0.0237 (25–55 Hz) and 0.0965
(25–300 Hz), and pass generic nonzero-phi0 at at most 1.15e-13.
The equal-mass mode-3 row records the explicit native domain rejection.
The XPHM diagnostic and holdout remain SOVEREIGN_NR_CALIBRATED rather
than qualified (0.226–0.556 per-polarization L2). The focused boundary,
scalar-reference, and source-chart test modules passed 16/16 on len.
2026-09-26 generic nonzero-phi0 full-waveform closure
Pratten et al., Appendix C Eqs. (67)--(68), (76)--(85), Appendix B Eq. (63),
Appendix E Eqs. (110)--(113), and Appendix F Table IV
define the source observer azimuth, J-frame Euler and polarization geometry,
quadrupole twist-up, and convention choices. From those published frames, we
derive the public-binary coordinate map: rotate both in-plane input spins
by Rz(-phi0), pass phiRef=phic to the binary, and multiply its completed
quadrupole polarizations by exp(-2i phi0) for conventions 0/1/6. The rotation
and completed-strain factor are our frame derivation, not equations quoted
from the paper or coefficients obtained from LAL source.
The independent mpmath Appendix-C scalar chart and Torch/JAX full waveforms
now check this covariance. On len with Python 3.12.3, NumPy 2.3.5,
Torch 2.14.0+cpu, JAX 0.11.2, and public LALSuite 7.26.15,
IMRPhenomXP, prec_version=223, convention=1, final_spin_mod=3,
(m1,m2)=(35,25) Msun, spins (0.2,0.1,0.3) and (-0.1,0.05,-0.2),
phic=0.3, phi0=0.4, and the direct unshifted 20--512 Hz grid at 0.25 Hz,
the mapped binary comparison gives:
| Convention | Plus/cross complex relative L2 | Largest flat mismatch | Verdict |
|---|---|---|---|
| 0 | 1.1410970098602045e-13 / 1.1213128890693516e-13 |
0 | pass |
| 1 | 1.1447907380982857e-13 / 1.1248152247989706e-13 |
0 | pass |
| 6 | 1.1343201250715765e-13 / 1.1143297006383575e-13 |
9.992007221626409e-16 |
pass |
All pass the unchanged 1e-6 and 1e-8 gates. These measurements qualify
this declared generic nonzero-azimuth fixture; they do not establish a wider
precession-domain guarantee. The prior NOT_EVALUABLE statements below are
historical and superseded by this derived-map check.
The overall XP/XPHM release verdict remains fail: the tested generic two-spin equal-mass mode-3 fixture has an unsupported MSA-remnant root, near-aligned v223 binary residuals remain above the frozen gate, and the XPHM full-waveform cases remain failing.
2026-09-26 independent source-frame transport gate
Pratten et al., Appendix C, Eqs. (67)--(83)
define the source observer vector, the J frame, and its Euler/polarization
angles. A new high-precision scalar reference, source_chart_transport in
src/diffgw_reference/xp_msa_generic_boundary.py, evaluates the relative
regular-chart transport at fixed intrinsic J. Equation (79) gives
delta_alpha = alpha0(phiRef)-alpha0(0) and
delta_gamma = -(phi_JL0(phiRef)-phi_JL0(0)), represented modulo 2*pi.
The destination chart supplies theta_JN and zeta. Because J is fixed when
only the observer azimuth changes, its regular-chart phi_JL0 is fixed and
delta_gamma is zero. At exactly aligned J, phi_JL0 is undefined; the
scalar reference rejects Euler transport instead of choosing a gauge.
tests/test_xp_source_chart_transport_math_reference.py compares this scalar
chart and transport with Torch and JAX v223 geometry at four nonzero observer
azimuths, including phic-phi0 = -0.1 and a phase-wrap case. The orbital-L
value is supplied by the separately identified v223 compatibility expression;
the test establishes the observer-frame transport, not independent
provenance for that compatibility coefficient. On len, the new tests plus
the existing source-frame/composition/generic-boundary reference files passed
26/26 with Torch 2.14.0+cpu, JAX 0.11.2, and pytest 9.1.1.
This result checked the internal source chart only. Its then-unresolved
public-binary mapping and production-routing statements were superseded by
the generic nonzero-phi0 closure above; frozen tolerances did not change.
2026-09-26 frozen angle-version control
Pratten et al., Appendix F, Tables III and V
distinguish NNLO angle version 102 from MSA version 223 (with NNLO fallback
when MSA initialization fails), and specify the remnant choice separately.
At integrated PR #42 source head b4c6e0d, the qualification driver now
evaluates both versions and remnant modes 0/3 at identical near-aligned
physical inputs. It retains the prior v223/mode-3 case IDs. The public
LALSimulation binary API remains a numerical oracle only;
no implementation or coefficient is copied or fitted from it.
On len, Python 3.12.3, Torch 2.14.0+cpu, JAX 0.11.2, NumPy 2.3.5,
SciPy 1.16.3, PyCBC 2.11.0, and LALSuite 7.26.15, the full complex
polarization comparison gave the following. Each L2 cell is h+ / hx;
mode-0 and mode-3 values are shown as ranges because they are nearly equal.
The unchanged strict gates are complex relative L2 1e-6 and flat mismatch
1e-8 for each polarization.
| Band (Hz) | Angle version | Modes 0/3 complex relative L2, h+ / hx |
Largest mismatch | Strict verdict |
|---|---|---|---|---|
| 25–55 | 102 | 1.87–2.97e-11 / 2.41–3.82e-11 |
2.22e-16 |
both pass |
| 25–55 | 223 | 0.02373718 / 0.02373672 |
2.82e-4 |
both fail |
| 25–300 | 102 | 1.87–3.23e-11 / 2.41–4.16e-11 |
1.11e-16 |
both pass |
| 25–300 | 223 | 0.09654477 / 0.09654736 |
4.66e-3 |
both fail |
This control shows that the public-binary disagreement is version-specific
at these fixed inputs and is not removed by changing remnant mode. It does
not establish which convention should define the physical aligned endpoint
or justify changing production waveform equations. The existing
test_xp_v223_azimuth_boundary_diagnostic.py and
test_xp_aligned_boundary_clean.py encode those distinct contracts.
These two test files passed 27/27 on len in 6.50 seconds in the isolated
PyCBC environment. The shared validation environment was restored to
NumPy 2.5.3 and SciPy 1.18.1 without PyCBC.
At this angle-version control stage, generic observer phi0 remained
not evaluable against the public binary. The frame-map derivation above
supersedes that status. Overall release qualification remains fail.
2026-09-26 explicit-remnant policy amendment
The earlier receipt below combined the paper-prescribed NNLO angle fallback
with an implicit change from final_spin_mod=3 to mode 0. That remnant
substitution is superseded. The current public XP/XPHM policy keeps these two
choices independent:
- The generic distinct-root MSA v223 angle route still falls back to the paper-sourced NNLO angles when MSA initialization is invalid.
- Explicit
final_spin_mod=3preserves the selected MSA remnant prescription. The distinct-root remnant rejects nonaligned equal-mass rows and other genuinely invalid roots rather than substituting mode 0. XP v223 conventions 0/1/6 retain their supported zero-nutation continuation when either body's in-plane spin vanishes, including at equal mass. - Explicit
final_spin_mod=0remains finite and continuous across the tested equal/near-equal boundary and retains differentiability in both frontends. Machine-level transverse-spin degeneracies continue to use the analytic aligned remnant limit.
JAX eager calls to the remnant primitive and public XP evaluation raise
ValueError. Public XP checks the selected remnant domain before entering
lax.cond, preserving the eager exception and aligned JIT parity. Invalid JIT
executions cross a compiled callback boundary and surface a
jax.errors.JaxRuntimeError containing the same diagnostic. Selected scalar
derivatives and valid batch values/JIT checks pass. Mixed JAX batches combining
generic two-spin, aligned equal-mass and equal-mass one-spin rows can still yield
NaN reverse-mode common-mass derivatives despite finite waveforms and finite
finite-difference estimates. The aligned equal-mass scalar fixture also yields
a NaN common-mass derivative. Both limitations reproduce before the
remnant-domain correction; these fixtures do not inherit the passing scalar
gradient checks.
On len, the focused policy suite
(test_xp_msa_remnant_boundary_policy.py, test_jax_public_xp_generic_v223.py,
and test_xp_msa_production_clean.py) passed 37/37 in 385.06 seconds with
Torch 2.14.0+cpu, JAX/JAXlib 0.11.2, NumPy 2.5.3, SciPy 1.18.1, and pytest
9.1.1. It includes direct and compiled invalid-root checks, mode-0 boundary
continuity, gradients, frontend parity, and valid batched JIT coverage.
This is a boundary-policy correction, not new external qualification. The strict full-complex-polarization gates are unchanged. The earlier equal-mass numerical row below was evaluated under the superseded implicit mode-0 substitution; it is historical evidence, not a current mode-3 residual. The overall release verdict remains fail.
Integrated-head rerun on len
The driver at this historical integrated head explicitly evaluated both
equal-mass remnant choices. At integrated source head 2e654a3 (the later
ccc3588 commit changed documentation only), Python 3.12.3, Torch 2.14.0+cpu,
JAX 0.11.2, NumPy 2.5.3, and the installed LALSuite 7.26.15 produced:
| XP equal-mass choice | Torch/JAX direct complex relative L2, plus / cross | Independent binary-oracle result |
|---|---|---|
Default final_spin_mod=3 |
Both reject the invalid nonaligned MSA remnant root with the same diagnostic; public JAX surfaces it through JaxRuntimeError |
Generation error; no numerical residual exists |
Explicit final_spin_mod=0 |
1.9282897530721765e-14 / 1.9297675234635243e-14; both polarizations pass parity |
Plus 0.02970567775318068 / 0.0004410058872005296; cross 0.035897366288350226 / 0.0006443233349125999 (L2 / mismatch); both fail |
The same integrated run retains the near-aligned external relative L2 values
0.023737179603638348 and 0.09654477266816827 for plus, and the XPHM
diagnostic/holdout plus values 0.22881790727328782 and
0.5041125739427325. Their strict external verdicts remain fail. Generic
nonzero observer phi0 then lacked an independently derived public-binary
parameter mapping, so its external comparison was not evaluable. The
integrated-head focused policy suite passed 37/37 in 388.54 seconds.
Scope and evidence classes
This receipt audits draft PR #42 at
4814835f7744fe00a5863ed70eb590d41a7e3ac3 and qualifies only generic
equal mass, generic nonzero observer phi0, near-aligned/instability routing,
and the XPHM precession boundary. The unchanged strict full-complex-polarization
gate is relative L2 1e-6 and flat mismatch 1e-8.
The PR's nine GitHub checks were green and its existing validation text correctly left these boundaries open. Those checks establish integration, not release qualification. The results below keep four evidence classes separate:
- Math fidelity: paper-derived equations or the paper-prescribed NNLO fallback, without LAL source or fitted oracle coefficients.
- Torch/JAX parity: direct, unshifted complex
h+andhxcomparisons. - External validation: the installed LALSimulation public binary API used only as a numerical oracle.
- Release qualification: all applicable classes must pass.
The independent run used host len, Python 3.12.3, NumPy 2.5.3, SciPy
1.18.1, Torch 2.14.0+cu130 (CPU forced), JAX/JAXlib 0.11.2 (CPU FP64),
pytest 9.1.1, and the lalsuite distribution 7.26.15. The executable receipt
is scripts/qualify_xp_xphm_boundaries.py.
The focused strict pytest run covered the public XP generic route, independent
generic-boundary math reference, promoted near-aligned fallback gates, XPHM
rotation reference, and clean-room XPHM NNLO composition: 67 passed in
496.14 seconds, with zero skips, xfails, or deselections.
Historical correction at the prior qualification head
The published generic MSA parameterization is singular at equal mass and its distinct-root solution is invalid when the initialization roots coalesce. The production adapters at that head reused the existing MSA initialization-validity result before selecting the clean distinct-root kernel. Invalid rows take the established NNLO angle fallback. Equal-mass generic rows also select the NNLO remnant because the MSA averaged-remnant expression shares the equal-mass singularity. The 2026-09-26 amendment above supersedes only that silent remnant-mode substitution. No continuation, new threshold, LAL-derived expression, or fitted coefficient is introduced.
Historical pre-amendment native residuals
Each cell is relative L2 / mismatch for (plus, cross) respectively.
| Boundary | Torch vs JAX | Boundary behavior | Verdict |
|---|---|---|---|
| Generic equal mass | (4.5485282301920294e-14 / 0, 4.542345628206036e-14 / 0) |
Torch vs forced NNLO fallback (0 / 0, 0 / 0); JAX vs fallback (3.09319461515901e-14 / 0, 3.088098683457194e-14 / 5.551115123125783e-16) |
parity/fallback pass |
Generic nonzero phi0 |
(2.1998567136506545e-14 / 0, 2.1580647978125144e-14 / 0) |
Torch vs inherited route (0 / 0, 0 / 4.440892098500626e-16); JAX vs inherited route (1.224565931624615e-14 / 0, 1.2339688469043134e-14 / 0) |
parity pass only |
| Near aligned, 25--55 Hz | (1.1928598420584253e-14 / 2.220446049250313e-16, 1.1931001987773128e-14 / 0) |
tiny vs exact aligned (3.0602795845805276e-11 / 0, 3.9445611075509205e-11 / 2.220446049250313e-16) |
parity/continuity pass |
| Near aligned, 25--300 Hz | (3.201086826590522e-14 / 0, 3.20117733545435e-14 / 0) |
tiny vs exact aligned (3.370259364455347e-11 / 0, 4.344117178177736e-11 / 0) |
parity/continuity pass |
At the audited PR head, equal-mass Torch/JAX relative L2 was
0.15536521149740812 plus and 0.15342033548414735 cross. The near-aligned
JAX output was nonfinite, while the Torch tiny-vs-aligned L2 was approximately
0.0245 before the instability and 0.13 across it. The correction removes
those frontend and boundary discontinuities by selecting the declared fallback.
Historical pre-amendment independent full-waveform residuals
| Boundary/case | Plus L2 / mismatch | Cross L2 / mismatch | External verdict |
|---|---|---|---|
| XP generic equal mass | 0.09623529299354046 / 0.004632042422924254 |
0.09462201778421948 / 0.004478172581788398 |
fail |
| XP near aligned, 25--55 Hz | 0.023737179603638348 / 0.0002817282964121537 |
0.02373672166784322 / 0.00028171783997021915 |
fail |
| XP near aligned, 25--300 Hz | 0.09654477266816827 / 0.004660451020372602 |
0.09654736126273701 / 0.004660702227981206 |
fail |
| XPHM diagnostic | 0.22881790727328782 / 0.025734053284783842 |
0.22641701045075546 / 0.025321404029660988 |
fail |
| XPHM holdout | 0.5041125739427325 / 0.11210914391477245 |
0.5560212744607049 / 0.1341335900553805 |
fail |
Generic nonzero observer phi0 is not externally evaluable: there is no
independently derived mapping from this public diffGW parameter to the public
LAL binary parameters. Native agreement therefore cannot promote it.
Historical boundary verdicts before frame-map closure
| Boundary | Math fidelity | Torch/JAX | External | Release |
|---|---|---|---|---|
| Generic equal mass | mode 0 passes as explicit NNLO fallback; explicit mode 3 is an MSA-remnant domain error; no MSA continuation claimed | same policy/diagnostic across frontends | fail | fail |
Generic nonzero phi0 |
source-frame transport remains unclosed | pass on inherited route | not evaluable | fail |
| Near aligned before instability | pass as invalid-root NNLO fallback | pass | fail | fail |
| Near aligned across instability | pass as invalid-root NNLO fallback | pass | fail | fail |
| XPHM precession layer | paper/scalar rotation gates pass | pass in focused composition tests | full waveform fails | fail |
This table records the pre-closure state of the generic phi0 row. The
current mapped-binary result above passes for its declared fixture. The
overall release gate remains fail because the XP fallback boundaries and
XPHM's XHM carrier dependency still disagree with the public binary.