Pairwise velocity moments — vel_m10 … vel_c22, vel_binned¶
Eight central moments of the radial pairwise velocity between halo mass-bin
pairs, on a radial grid — plus a derived recipe (vel_binned) that aggregates
them exactly onto whole-cell mass bins within its weight-model support.
m10 = reg.predict("vel_m10", "LCDM", 0.25, [0.31, 0.677, 0.967, 0.83]) # (1, 105, 57)
art = reg.load("vel_m10", "LCDM", 0.25)
art.pair_keys # 105 unordered mass-bin pairs
art.r # 57 radial-bin centres; edges span [0.352, 150] Mpc/h
- Keys:
vel_m10,vel_c20,vel_c02,vel_c12,vel_c30,vel_c40,vel_c04,vel_c22(trained), andvel_binned(derived). - Output:
(1, 105, 57)— 105 mass-pair × 57 radial bins (trimmed columns NaN). - Mass bins: 14 adaptive bins over log₁₀M ∈ [12.5, 15.5] — 0.1 dex over [12.5, 13.5), 0.25 dex over [13.5, 14.0), [14.0, 14.2), and one broad terminal cell [14.2, 15.5) — giving 105 unordered pairs. A separate [14.7, 15.5) cell was rejected by a direct pair-count pilot (only 3 in-range pairs in the weakest design box), so the broad cell is the highest-resolution binning supported across the full design.
- Radial grid: 57 bins — 26 native logarithmic 0.05-dex cells over [0.352, 7] Mpc/h, stitched exactly to the wider grid above 7 and ending at 150 Mpc/h. The native small-r cells resolve the exclusion region; the wide high-r cells reduce sampling noise.
Moments¶
| Moment | Meaning | Sign | Transform |
|---|---|---|---|
m10 |
mean radial infall | signed | arcsinh |
c20 |
variance ∥ | + | log |
c02 |
variance ⊥ | + | log |
c12 |
skew cross term | signed | arcsinh |
c30 |
skew ∥ | signed | arcsinh |
c40, c04, c22 |
4th-order | + | log |
Representation & accuracy¶
Each moment is a weighted-PCA GP (n_components = 16, except 24 for
f(R) c22; n_restarts = 10)
under the per-moment transform above (log for positive moments, arcsinh
for signed) — the transform is what holds the high-order moments at the noise
floor. Every emulator carries a frozen-seed ε de-bias correction calibrated
on the full 14-bin columns (vel_fine_seed_debias.py).
The honest per-emulator numbers (in-sample and interior corner-excluded LOO χ)
live in the manifest: reg.entry("vel_c20", gravity, 0.25)["accuracy"]. On
the current 14-bin grid, the end-to-end 5-box recipe validation is χ
0.71–1.18 (ΛCDM) and 1.15–2.26 (f(R), all eight moments and all
supported bin sets). The extension-specific tests are sharper: new high-mass
pairs have interior-LOO χ 1.04–1.33 / 1.14–1.61 and 5-box aggregated χ
0.82–1.19 / 0.97–1.40 (ΛCDM / f(R)). Against fresh-seed boxes, the
high-mass aggregate median over moments is χ ≈ 1.0–1.4 through
15 Mpc/h, rising to 2.33 / 2.06 over 15–150 Mpc/h where the 70-box / two
27-box means have much tighter SEMs. There is no complete terminal-cell
aggregate below 1.25 Mpc/h because halo exclusion leaves no pairs. Evidence:
registration_massext/, validation_gates.pdf, and
validation_heldout.pdf from plot_velocity_mass_extension_validation.py.
χ, not fractional error
Velocity moments cross zero, so fractional error is meaningless. Accuracy is quoted as χ = residual / SEM; χ < 1 means at or below the simulation noise floor.
vel_binned — whole-cell mass bins¶
The trained surfaces live on the 14-bin grid; vel_binned aggregates all
eight moments onto your mass bins through the exact raw-moment
pair-count algebra (weights n_a n_b (1 + ξ_hh^ab(r)) modelled from the
hmf + bias/ξ emulators; weight-model error vs measured pair counts:
median 2–6×10⁻⁴):
res = reg.predict("vel_binned", "LCDM", 0.25, th,
mass_edges=[12.5, 13.0, 13.5], # edges ON the native grid
moments=("m10", "c20"))
res["moments"]["m10"] # (Nbin, Nbin, 57); res["r"], res["validity"]
Edges must be built from whole fine-grid cells — whole-bin aggregation is what
keeps the conversion exact. The weight emulators do not reach the native
velocity endpoint: vel_binned is served through log₁₀M=14.2 for ΛCDM and
14.0 for f(R). Direct vel_<moment> surfaces still cover [12.5, 15.5];
res["validity"] reports both the aggregation and native limits.
f(R) — all 8 moments¶
The f(R) velocity moments are registered (z = 0.25) for all eight
moments, as seed-paired boosts composed onto the ΛCDM emulator: log-ratio
for the positive 4th moments (c40, c04, c22), additive-arcsinh for
c20/c02/c12/c30; m10 uses the direct 5-parameter GP. The per-box
seed-paired difference cancels most of the cosmic variance.
vel_c12/fRn1 was the late arrival (registered 2026-07-15): its first
boost — fitted on the retired 72-bin narrow grid with a noise-scaled
transform — failed the aggregation acceptance test in 2026-07 and the
moment shipped ΛCDM-only for two weeks. Re-tested on the current wide
bins with the family's plain additive-arcsinh transform it passes every
test: interior LOO χ = 1.51 (in-family), fiducial aggregation χ = 1.24
(ceiling 2.5), independent-seed 25-box aggregation χ = 1.53 with the
seed correction on (family range 1.1–2.3). Until then the recipe
returned NaN for f(R) c12; that behaviour survives only as a fallback
if no f(R) vel_c12 resolves from the registry.
f(R) is intrinsically harder (a fifth parameter over the same design
points): on the full 14-bin grid the boosts' design-interior LOO spans
χ = 1.47–3.29, while the 14 newly added high-mass pairs alone span only
1.14–1.61 (at the retired narrow binning the noisy fourth moments ran up
to χ ≈ 7) — a design-sampling limit (the direct GP is worse), not a
representation failure. The five signal-weighted supplemental pairs
(imodel 68–72) now train the c02, c20 and c12 boosts (interior LOO
2.03→1.57, 1.89→1.59, and 1.51 for the newly admitted c12); the other
four f(R) moments keep design-only training — augmenting them tests
worse (blanket augmentation would take m10 from χ 1.43 to 2.58). All
ΛCDM moments train on the augmented set. See f(R) gravity.
Rejected levers (don't re-explore)¶
Established on the campaign-era measurements (scripts now in git history):
- Standardized moments (kurtosis
c40/c20², etc.): the dimensionless ratio cancels ~4× of the across-box variance, but reconstructing the raw moment re-injects it — no deployable gain for the raw moments. - r_max trimming: trimming the large-r tail makes LOO χ worse for every moment; the full r-range carries signal and the SEM-weighted PCA already down-weights the noisy columns. (Bin-width choices, by contrast, paid off twice: the first exploration replaced the linear 2.5 Mpc/h grid, which lost 2–23× the noise floor below r = 10, with a quasi-log one; the second, 2026-07, widened the high-r backbone now used by the 57-bin small-r-stitched grid.)
Evidence scripts¶
vel_fine_lcdm_eval.py, vel_fine_frn1_eval.py, vel_fine_recon_gate.py,
vel_rbin_explore.py, vel_rwidth_explore.py,
vel_widea_vs_logb_fiducial.py, vel_frn1_indepseed_oos.py,
vel_fine_seed_debias.py,
vel_fine_register.py, velocity_mass_support_audit.py,
velocity_mass_extension_register.py,
plot_velocity_mass_extension_validation.py, plot_velocity_fine.py.
(The retired
0.5-dex-era scripts — vel_validation.py, velocity_ablation.py,
plot_velocity.py, … — live in git history.)