IMRPhenomXPNR published components, version 1.0.0
Scope and status
This is a research component specification, not a qualified full
IMRPhenomXPNR waveform. xpnr-published-components-sympy-1.0.0 independently
encodes the published algebra as 37 executable SymPy expressions with mpmath
evaluation. Components that require a transition spin, calibration value,
boundary track, or carrier input accept it explicitly. The current public
Torch/JAX waveform remains provisional; see the family ledger.
Inputs, conventions, and options
Frequencies f, f0, f1, and fc are dimensionless Mf; angles and spins
are dimensionless. m1 >= m2, the spin vectors chi_i = S_i/m_i², and unit
Lhat must refer to the same caller-supplied transition frame. eta, chi,
c = cos(theta_LS), q, boundary values and derivatives, and ringdown
parameters are explicit scalar inputs. f0 < f1, positive frequencies, and a
nonzero base beta at the final-rescaling join are preconditions. The zero-spin
map sets c=0 as a numerical extension because the published angle is
undefined there. Piecewise derivatives mean derivatives within a branch;
join checks use the appropriate one-sided limits.
The optional reference needs SymPy and mpmath. Native attachment kernels take
Torch/JAX tensors, support float64 CPU values and autodiff, and do not import
the reference. The tests exercise JAX JIT and vmap and Torch broadcasting.
No inherited A/B/Bf tensor is an input to the independent test expectations.
Mathematics and components
| Component ID | Pinned primary equations | Reference expressions | Native implementation | Status |
|---|---|---|---|---|
XPNR-MAP/1 |
XPNR Eqs. 3–6 | map.* |
Existing Torch/JAX precession PNR map | Conditional on transition state |
XPNR-FIT/1 |
XO4a Eq. 35; XPNR Eq. 22 | calibration_polynomial, fit.eta_frozen, fit.chi_frozen |
Existing PNR fit evaluators | Conditional on independently sourced coefficients |
XPNR-MR/1 |
XO4a Eqs. 25–34; XPNR Eqs. 15–16 | fit.a*, fit.b*, fit.beta_rd, angles.* |
Existing PNR angle kernels | Algebra executable; fit assets conditional |
XPNR-ATTACH/1 |
Final Twist Eqs. 41–45, 56–58, 62; XO4a Eq. 37 and denominator correction; XPNR Eqs. 17–21 | attach.* |
pnr_attachment.py in Torch/JAX |
Algebra executable; full boundary construction pending |
XPNR-CARRIER/1 |
XPNR Eqs. 7–8, 10–13 | carrier.* |
None for XPNR carrier modification/asymmetry | Conditional on u_k, calibrated carrier and asymmetry inputs |
XPNR-HMMAP/1 |
XO4a Eqs. 50–52 | higher_mode.frequency_map |
Existing PNR higher-mode mapping | Executable component |
XO4A-WINDOW/1 |
XO4a Eq. 38 | window.endpoint_complete |
Existing PNR window | Explicit endpoint-completing interpretation |
The bound uses Final Twist Eq. 62 with p=0.002, algebraically evaluated as
pi/2 + (beta-pi/2) [atan(t)/t]^p, where
t = ((beta-pi/2)/(pi/2)^(1-p))^(1/p) and its center limit is beta.
This even integer power form avoids a distribution term when differentiated
symbolically. Native kernels use equivalent small/large forms to stay finite
in float64. The public waveform still clips beta rather than calling this
standalone bound.
Implementation mapping
The versioned specification is
xpnr_symbolic.py. The
independently written float64 scalar forms are
xpnr_angles.py. Native
attachment forms live in the Torch
and JAX modules. The
reference accepts caller-supplied carrier deviations and asymmetry amplitudes;
neither native frontend composes the XHM-CP deviations, adjusted ringdown, or
dominant-mode asymmetry into the public route. Endpoint-completing window
behavior is an explicit interpretation of XO4a Eq. 38, not a literal copy of
its printed trigonometric argument.
Evidence and limitations
The maintained symbolic test
checks all 37 expressions against separately constructed scalar expectations,
exact rational polynomial coefficients, four join values/slopes, and high
precision derivative stability. Eleven isolated attachment kernels pass
value and gradient comparison in Torch and JAX on CPU float64; JAX JIT/vmap
and Torch batch behavior are also checked. On 2026-09-29, the focused XPNR
suite passed 164 tests on len with SymPy 1.14.0, mpmath 1.3.0, Torch
2.14.0+cu130, JAX 0.11.2, and LALSuite 7.26.15. Four default-option LAL
binary/PyCBC optimized plus-polarization comparisons passed their declared
match >= 0.99 threshold over 20–400 Hz; they are diagnostics only.
The transition sampling event and complete SpinTaylor integration, beta
input tracks and landmark/root decisions, 80-waveform fit targets and
licensed tensor release, XHM-CP u_k mapping, and dominant-mode asymmetry
remain unavailable from the examined public primary assets. The unchanged
strict inherited XHM/XPHM binary catalog and holdout gates record failures.
No DiffGW-to-NR physical comparison is claimed. Equation and native component
passes do not qualify the public waveform.
Reproduce the checks
On len, from /tmp/diffgw-xpnr-qualification-332f, run:
PYTHONPATH=src JAX_ENABLE_X64=1 JAX_PLATFORMS=cpu OMP_NUM_THREADS=1 /tmp/diffgw-xpnr-portability-0172-pypi-clean/.venv/bin/python -m pytest -q tests/test_xpnr_symbolic_reference.py tests/test_xpnr_attachment_math_reference.py tests/test_xpnr_component_evidence.py tests/test_xpnr_attachment_gate.py tests/test_xpnr_coefficient_provenance.py tests/test_imrphenom_xpnr.py
The optional binary cases skip without LALSuite/PyCBC. The published expression version must change if an equation, branch convention, or input meaning changes; recheck the independent scalar expectations and both native frontends before updating the machine-readable qualification.