Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

The differentiable lowered-model family (Engine A)

San Diego State University

The idea

The classical truncated-isothermal models — Woolley (no energy truncation), King (1966) (a linear lowered Maxwellian), and Wilson (a quadratic lowered form) — are members of one family distinguished by how sharply the distribution function is truncated near the escape energy. Gieles & Zocchi (2015) made this explicit with a single continuous truncation parameter gg: their LIMEPY DF reads

f(E)    eE/σ2γ ⁣(g,  EcutEσ2),f(E) \;\propto\; e^{-E/\sigma^2}\, \gamma\!\Big(g,\; \tfrac{E_{\rm cut}-E}{\sigma^2}\Big),

↗ model card

with g=0g=0 recovering the Woolley cutoff, g=1g=1 the King model, and g=2g=2 the Wilson model, interpolating smoothly in between. The same framework extends naturally to multiple mass components (each mass group its own σj\sigma_j, sharing one potential) and to radial anisotropy (an Osipkov–Merritt / Michie term).

The coupled multi-component equilibrium

progenax generalizes the single-mass solve to nn components sharing one dimensionless potential ψ(ξ)\psi(\xi), ξ=r/rc\xi = r/r_c. The model-defining insight is that a component’s single free Engine-A scale is its velocity-scale ratio

wj  =  sjs,rescalej  =  wj2,w_j \;=\; \frac{s_j}{s}, \qquad \texttt{rescale}_j \;=\; w_j^{-2},

so component jj sees the shared potential at the rescaled depth Wj(ξ)=rescalejψ(ξ)W_j(\xi) = \texttt{rescale}_j\,\psi(\xi) and contributes a density ρ^jEγ ⁣(g+32,rescalejψ)\hat\rho_j \propto E_\gamma\!\big(g+\tfrac32,\, \texttt{rescale}_j\,\psi\big) (the “lowered exponential” of Gieles & Zocchi (2015), Appendix B), giving the coupled Poisson equation

1ξ2ddξ(ξ2dψdξ)  =  9jαjρ^j(ξ),\frac{1}{\xi^2}\frac{\mathrm{d}}{\mathrm{d}\xi} \Big(\xi^2\frac{\mathrm{d}\psi}{\mathrm{d}\xi}\Big) \;=\; -\,9\sum_j \alpha_j\,\hat\rho_j(\xi),

↗ model card

with αj\alpha_j the central density fractions (jαj=1\sum_j\alpha_j = 1). A colder component (wj<1w_j < 1) feels a deeper effective well and concentrates — as a genuine equilibrium, not a post-hoc radial reshuffling. Mass segregation is then the equipartition convenience

wj  =  μjδ,μj=mj/mˉ,mˉ=jmjαj,w_j \;=\; \mu_j^{-\delta}, \qquad \mu_j = m_j/\bar m, \quad \bar m = \sum_j m_j\,\alpha_j,

↗ model card

(Gieles & Zocchi (2015), Eqs. 24–26): δ=1/2\delta = 1/2 is the standard partial-equipartition choice, δ=0\delta = 0 collapses every component to the single-mass model exactly (the cleanest oracle). The representative stellar masses mjm_j are otherwise decoupled labels — the structure depends only on (αj,wj,ra_hatj,W0,g)(\alpha_j, w_j, \texttt{ra\_hat}_j, W_0, g), so equal-mass populations of different concentration (GC 1G/2G, halo+core, binaries-vs-singles) set wjw_j directly.

Per-component radial anisotropy enters as an Osipkov–Merritt / Michie term with its own anisotropy radius r^a,j=ra,j/rc\hat r_{a,j} = r_{a,j}/r_c (Michie (1963); Merritt (1985)); the anisotropic density is evaluated by an exact, numerically stable 1-D quadrature (the bounded T(β)T(\beta) Poisson sum) because JAX’s hyp1f1 is NaN for arguments 100\gtrsim 100.

Mass segregation as a genuine equilibrium (seed 31, 3\times10^5 stars,
m_j = 0.3/1/3\,\mathrm{M_\odot}). At \delta = 0 every component’s
density collapses onto the same profile — the single-mass oracle, visually
exact. At \delta = \frac12 the heavy component concentrates (and the
whole model restructures: note the smaller r_t) while the light component
extends: heavier components feel a DEEPER effective well W_j = \mu_j^{2\delta} W_0
— segregation is in the DF, not a positional reshuffle.
Regenerate: python -m laboratory.icviz --only engine-a-segregation.

Figure 1:Mass segregation as a genuine equilibrium (seed 31, 3×1053\times10^5 stars, mj=0.3/1/3Mm_j = 0.3/1/3\,\mathrm{M_\odot}). At δ=0\delta = 0 every component’s density collapses onto the same profile — the single-mass oracle, visually exact. At δ=12\delta = \frac12 the heavy component concentrates (and the whole model restructures: note the smaller rtr_t) while the light component extends: heavier components feel a DEEPER effective well Wj=μj2δW0W_j = \mu_j^{2\delta} W_0 — segregation is in the DF, not a positional reshuffle. Regenerate: python -m laboratory.icviz --only engine-a-segregation.

Entry points

The family is exposed through three MultiComponentCluster constructors (see Multi-component populations for the engine map and Two-component populations — worked examples for a worked example):

from progenax import MultiComponentCluster

# General: per-component velocity-scale ratios (GC 1G/2G, halo+core, ...)
model = MultiComponentCluster.from_components(
    alpha_j=[0.5, 0.5], w_j=[0.7, 1.0], m_j=[1.0, 1.0], W0=7.0, g=1.0)

# Mass segregation as equipartition: w_j = mu_j^(-delta)
model = MultiComponentCluster.from_mass_segregation(
    alpha_j=[0.6, 0.4], m_j=[0.3, 3.0], W0=7.0, g=1.0, delta=0.5)

# IMF-driven: bin the IMF, eigenvalue-solve for the alpha_j that
# reproduce the per-bin mass budget
model = MultiComponentCluster.from_imf(imf, n_comp=8, W0=7.0, g=1.0, delta=0.5)

ic = model.sample_cluster(key, n_stars=50_000)   # ICResult with component_id

sample_cluster draws every star from its component’s lowered DF at the rescaled potential Wj(r)W_j(r) and velocity scale sj=swjs_j = s\,w_jno external virial rescale anywhere: each component is individually virial (Qj=0.5Q_j = 0.5) and the sampled cluster is globally virial for any mass spectrum. The unequal-mass two-population regression measures theory Qj=0.5±2×103Q_j = 0.5 \pm 2\times 10^{-3}, sampled global QQ within ±0.04\pm 0.04 and per-component QjQ_j within ±0.07\pm 0.07 at test resolution. The single-mass corners were validated against the released models directly: g=1g=1 isotropic \equiv King, g=1g=1 anisotropic \equiv Michie, both with Q=0.5Q = 0.5 unscaled.

Check yourself

1. Why does rtr_t shrink when segregation turns on?

Compare the two panels’ radial extents in Figure 1. Turning on δ\delta makes the heavy component colder (wj<1w_j < 1), deepening the central potential it generates — at fixed W0W_0 the whole model becomes more concentrated and its dimensionless truncation moves inward.

2. Verify the δ=0\delta = 0 degeneracy numerically

Sample from_mass_segregation(..., delta=0.0) and run a two-sample KS test between the radii of any two components — it should be consistent with one distribution (the components differ only by their decoupled mass labels).

The DF-table performance layer

The anisotropic density quadrature is the 86% hotspot of the coupled solve, and per-star speed draws dominated sampling. Phase 1.5 replaced both with three differentiable table primitives in profiles/limepy_tables.py — with the exact quadrature retained everywhere as a selectable oracle (aniso_method="quadrature"), and every approximation budget asserted in tests:

DF tables — design and measured budgets (every row is a regression test against the retained quadrature oracle).

Table

Grid / scheme

Measured vs oracle

AnisoDensityTableρ^(W,p;g)\hat\rho(W, p;\, g)

(W,asinhp)(\sqrt{W},\, \mathrm{asinh}\,p) grid, tensor-product 4-point cubic Lagrange (O(h4)O(h^4)); 512×96 pointwise, 160×40 in-solve

density 6.05×1066.05\times 10^{-6} (budget 10-5); solve Δψ1.93×104|\Delta\psi| \le 1.93\times 10^{-4} over 3 configs; mass CDF 4.48×1054.48\times 10^{-5}

SpeedCDFTable — isotropic inverse speed CDF

256×256 on (W,u/2W)(\sqrt{W},\, u/\sqrt{2W}); row-relative CDF normalization; gated to g[0,3.5]g \in [0, 3.5]

speed moments 0.28%\le 0.28\% vs DF quadrature

AnisoSpeedCDFTable — anisotropic speed marginal

192×48×192 on (W,asinhp,u/2W)(\sqrt{W},\, \mathrm{asinh}\,p,\, u/\sqrt{2W}); the angular conditional (cosθu,p)(\cos\theta \mid u, p) stays exact

speed moments 1.5%\le 1.5\%; sampled β(r)\beta(r) \equiv the DF’s own quadrature β\beta within 0.06 (unchanged)

Measured speedups (warm, two-component, W0=7W_0 = 7): anisotropic construction 5.6× faster (957 → 170 ms); sampling at N=105N = 10^5: isotropic 67× (0.48 µs/star), anisotropic 21.7× (2.9 µs/star). The anisotropic table build dominates at small NN — break-even is ~3k stars. Crucially, the equilibrium oracle component_virial_ratios is deliberately quadrature-only (it must not share the approximation it checks): a table-built model proves Qj=0.5001±1.5×104Q_j = 0.5001 \pm 1.5\times 10^{-4} against it.

Why progenax reimplemented it (rather than depend on LIMEPY)

Gieles & Zocchi (2015) is the reference formalism, and the published limepy code is the standard numpy/scipy implementation. progenax does not wrap or depend on it, for one decisive reason: limepy is not differentiable. The entire progenax thesis is JAX-native, end-to-end-differentiable initial conditions, so that structural parameters can be inferred from data by gradient descent or HMC (see Differentiability rules).

The implemented family delivers exactly this: a single continuous parameter vector — (W0,g,{wj},δ,ra)(W_0, g, \{w_j\}, \delta, r_a) — can be fit jointly to an observed cluster, with gg itself a fitted quantity that selects the truncation sharpness the data prefer (King-vs-Wilson as a posterior, not a modelling choice). (model)/g\partial(\text{model})/\partial g flows through the coupled Poisson solve and through the DF tables: AD agrees with finite differences to 2.15×1042.15\times 10^{-4}, and the table-backed gradient agrees with the quadrature-backed gradient to 2.1×1042.1\times 10^{-4}. The anisotropic and mass-segregation parameters (ra,η,δ)(r_a, \eta, \delta) are likewise differentiable through construction and sampling.

Delivered scope

Capability

Status

Measured

King (g=1g=1), single mass

✅ released (King)

c(W0)c(W_0) vs King (1966) Table II, Δ0.02\Delta \le 0.02

Continuous gg (Woolley \to King \to Wilson)

✅ delivered (solve_multicomponent_limepy, differentiable in gg)

g=1g=1 corner \equiv King (iso) / Michie (aniso), Q=0.5Q = 0.5 unscaled

Multi-mass / multi-component equilibrium (per-component sj=swjs_j = s\,w_j)

✅ delivered (from_components / from_mass_segregation / from_imf)

theory Qj=0.5±2×103Q_j = 0.5 \pm 2\times 10^{-3}; sampled global ±0.04\pm 0.04, per-component ±0.07\pm 0.07

Radial anisotropy per component (r^a,j\hat r_{a,j}, Osipkov–Merritt / Michie)

✅ delivered

sampled βj(r)\beta_j(r) \equiv DF quadrature β\beta within 0.06

DF-table acceleration (oracle-backed)

✅ delivered (Phase 1.5)

5.6× construction; 67× (iso) / 21.7× (aniso) sampling at N=105N = 10^5

Differentiable structural inference (W0,g,wj,δ,ra)(W_0, g, w_j, \delta, r_a)

✅ delivered

AD-vs-FD 2.15×1042.15\times 10^{-4}; table-AD \equiv quadrature-AD 2.1×1042.1\times 10^{-4}

Relationship to the other roadmap item

This is independent of, but complementary to, the now-resolved differentiable tidal radius rt/W0\partial r_t/\partial W_0 (Differentiable King tidal radius (rt/W0\partial r_t/\partial W_0)): the scalar rtr_t already carries a finite, exact gradient through the unclamped ψ=0\psi=0 crossing. In the unified family rtr_t is a function of (g,W0)(g, W_0); the same implicit-function-theorem treatment of the ψ=0\psi=0 crossing carries over to the gg generalization unchanged.

Implementation, validation & references

References
  1. King, I. R. (1966). The structure of star clusters. III. Some simple dynamical models. The Astronomical Journal, 71, 64–75. 10.1086/109857
  2. Gieles, M., & Zocchi, A. (2015). A family of lowered isothermal models. Monthly Notices of the Royal Astronomical Society, 454, 576–592. 10.1093/mnras/stv1848
  3. Michie, R. W. (1963). On the distribution of high energy stars in spherical stellar systems. Monthly Notices of the Royal Astronomical Society, 125, 127–139. 10.1093/mnras/125.2.127
  4. Merritt, D. (1985). Spherical stellar systems with spheroidal velocity distributions. The Astronomical Journal, 90, 1027–1037. 10.1086/113810