Halo clustering — xi_hh, xi_hh_smallr, r_ab¶
xi_hh — full-scale halo–halo correlation (derived)¶
ξ_hh(r | M₁, M₂) for differential mass-bin pairs, over the full xi_mm
support. A derived property combining xi_mm, b_cum, xi_hh_smallr, and
r_ab.
import numpy as np
res = reg.predict("xi_hh", "LCDM", 0.25, [0.31, 0.677, 0.967, 0.83])
# default (2026-08-20): the density-threshold chain in mass coordinates —
# 0.1-dex bins over [12.8, 14.2] on the native radial bin centres
res = reg.predict("xi_hh", "LCDM", 0.25, theta,
edges=np.array([13.0, 13.3, 13.6]), # your bin edges (log10M)
r=np.geomspace(3, 90, 40), # custom radii -> exact route
route="auto") # auto | nbar | exact | bbar
res["xi_hh"] # (Nbin, Nbin, Nr)
res["r"] # radii (Mpc/h)
res["bin_edges"] # the mass-bin edges used
res["b_bin"] # per-bin <b>
res["validity"] # per-gravity evidence + route_selection — READ IT
Routes¶
nbar(default viaautofor requests inside its contract) — the released fixed-number-density chain (xi_hh_nbar) relabelled into mass coordinates, with mass-bin values from the exact pair-count mixed difference in density space. Abundances are exact by construction, so there is no emulated-HMF weighting error (the structural weakness of the mass-threshold route), and every bin pair stays physical (1 + ξ ≥ 0). Contract: radii on the native 0.051-dex measurement bin centres, r ≥ 0.5 (values are measured-bin estimates on that binning);autoadmits edges inside the frozen [12.8, 14.2] window; explicitroute="nbar"reaches the full per-cosmology mass span (≈[12.0–12.8, 14.3–14.9]) — for f(R) that is above the mass-threshold trained cap.exact(the fallback for everything else) — algebraically exact count-weighted mixed-difference, validated over r ∈ [2.2, 100] Mpc/h. Trained support reaches each pair's data floor; below it a labelled exclusion model reconstructs the pair density down to ξ = −1 in the zero-pair core.validity["xi_mode"]distinguishes trained, reconstructed, and zero-pair values; the route does not return a NaN exclusion wedge.bbar— pure factorization ⟨b⟩⟨b⟩ξ_mm, only good for r ∈ [20, 70] Mpc/h.
auto resolves per request, never per cosmology: edges below 12.8 or above
14.2, interpolated radii, r_edges rebinning, sub-0.5 radii, or a
mass_extrapolation policy all fall back to exact, with the reason
recorded in validity["route_selection"].
Limits¶
- Above log₁₀M = 14, the exact route's LCDM branch uses the labelled
empirical bias/D continuation; its modified-gravity bin edges stop at the
trained cap.
route="nbar"serves modified-gravity bins up to the rare-end mass cut (≈14.3–14.9) instead. - Radii above the
xi_mmsupport (124.8 Mpc/h) raise. Small positive radii are accepted on the exact route and labelled by the exclusion/zero-pair model; the density route stops at its 0.5 Mpc/h science floor.
Accuracy (binned radial convention, 2026-07): full-scale ξ_hh design-sweep
band medians 1.1–2.1 % to 60 Mpc/h (ΛCDM) and 1.1–2.2 % (f(R)),
with median |χ| ≤ 1.0 in every band — at the five-box measurement floor;
noise-floor-limited beyond. Pass r_edges= to predict("xi_hh", ...) for
binned values comparable to pair-count measurements (point values at
arithmetic bin centres carry a coherent 1–2 % small-r offset against
binned data — a binning inconsistency, not an emulator error). The f(R)
fiducials are calibration points of this chain (χ_rms 4.3/3.8 vs their
100-box SEM, floors 1.2/2.7); see the DOCUMENTATION §8b campaign notes.
xi_hh_smallr — small-r departure emulator (trained)¶
The trained threshold-level small-scale departure surface (the "D-surface")
that xi_hh uses below the factorization window. The f(R) emulator carries a
coefficient-scale-relative GP jitter floor (jitter_floor_frac = 0.05) that
regularises under-fit high PCA modes — small-r ξ_hh reconstruction bands ≈ 6 %
better. Not usually called directly.
Target choice (tested — don't re-explore)¶
The emulated target is D = ξ_AB / [b(>M₁) b(>M₂) ξ_mm] — the departure
with the clustering amplitude divided out once. A 2026-07 target-choice
study (smallr_reduced_target_test.py, smallr_sqrtd_gate.slurm) confirmed
this is optimal:
- Dividing out more bias (
D/(b·b),(D−1)/(b·b)) is 43 %–2.3× worse — it re-injects the mass/cosmology dynamic range D was built to remove. - Compressing the surface (
log D,√D,√(ξ_hh/ξ_mm)) lowers the D-surface column error (√D by ~5 % for f(R)) but the gain washes out in the composed binned ξ_hh — the end-to-end reconstruction gate is unchanged within noise, because the departure is a subdominant term in the total error budget (ξ_mm, HMF, mixed-difference, sim noise dominate). Not adopted.
Lesson: the composed reconstruction bands decide, not the D-surface metrics.
r_ab — halo–matter cross-correlation coefficient (trained)¶
rab = reg.predict("r_ab", "LCDM", 0.25, [0.31, 0.677, 0.967, 0.83]) # (1, 30, 30)
art = reg.load("r_ab", "LCDM", 0.25)
art.thresholds # both matrix axes (log10M thresholds)
- Output:
(1, 30, 30)threshold-pair matrix on theb_cumgrid. - Used as a stochasticity / validity guard for
b_diffandxi_hh.
Redshift¶
All three registered at z = 0.25 only.