Lab › From Caustics to Groups › Part 2 of 4 · read the findings

The Forward Map: Caustics of the Model Groups

Before you can reverse a map you have to understand it forwards. This post meets the four model groups of the series — Heisenberg, SE(2), Engel, Cartan — computes their caustics from a single geodesic engine, and shows the obstruction in the flesh: zoomed in, their caustics are identical, but the rate at which each group's hidden dimensions fill in — its growth vector — is a fingerprint you can measure. All numbers here come from the real code in research/caustics-to-groups/.

By Igor Moiseev · 18 July 2026
From Caustics to Groups
  1. From Caustics to Groups: Identifiability and Its Limits
  2. The Forward Map: Caustics of the Model Groups ← you are here
  3. The Inverse Map: Reading the Fingerprint
  4. Synthetic SE(3): What the Abstention Test Establishes
Appendices — theory background (6)
  1. C1. The Model Groups, by Example: Real-World Sub-Riemannian Systems
  2. C2. Caustics as Lagrangian Singularities (Arnol'd's ADE List)
  3. C3. The Tangent Cone: Carnot Groups and Growth Vectors
  4. C4. The Conjugate Locus at the Pole: Astroids and Their Moduli
  5. C5. Abnormal Geodesics: The Yes/No Fingerprint
  6. C6. The Nilpotent-Deviation Statistic
Where we are
Part 1 scoped the reverse map — caustics in, group out — and named the wall in the way: local caustics are group-blind. This post builds the forward map for four concrete groups, so we have leakage-free ground truth to reverse. Everything below is computed by the code in research/caustics-to-groups/; the figure is drawn from its output, not hand-placed. Part 3 runs the inverse.

One engine, four groups. A sub-Riemannian group is a rule for moving: at each point only certain directions are allowed, and length is measured under that restriction. The allowed directions plus the group’s bracket structure1 fully determine its geodesics — the shortest paths — through one set of equations (the Lie–Poisson normal flow2). We implemented that engine once and fed it four groups:

The Heisenberg caustic, exactly

Start with the flat model, because there we can compute everything by hand and check the code against it. A Heisenberg geodesic launched from the origin projects to a circle in the plane; as it goes around, the height coordinate climbs. Two facts, both proven and both regression-locked by a golden-file test in the repo:

So the Heisenberg caustic — the set where geodesics refocus — is just the vertical axis. It is maximally degenerate: a whole circle of geodesics collapses onto one point. That degeneracy is the signature of flatness, and it is the yardstick for everything else. (The curved groups do not collapse so cleanly — their refocusing time drifts away from $2\pi/|w|$, and that drift is the subject of Part 3.)

The obstruction, in the flesh

Part 1 stated it as a theorem about generic Lagrangian maps plus a working hypothesis about these groups; here is the evidence for the four groups. Zoom far enough into a generic point of the caustic of SE(2), Engel or Cartan and you see a fold: at the first conjugate point of 24 random geodesics per group the exponential map has a fold singularity in 24 of 24 cases (experiment E10, research/caustics-to-groups/artifacts/e10_results.json). The collapsed Heisenberg axis above is the non-generic exception, and the same test rejects it in 24 of 24 cases. Where folds meet you expect the next shape on the list, the cusp3 — known for 3D contact structures, and located numerically on Engel and Cartan in experiment E11 (7 and 16 points pass every pre-registered cusp test; the same search also finds 4 and 10 tangency points that are not cusps but collapses of the Heisenberg kind; research/caustics-to-groups/artifacts/e11_results.json). Folds and cusps are the universal ADE germs. Hand someone a single cusp and ask which group it came from and they cannot answer: the four are locally identical. A detector that keys on “there is a cusp here” is reading noise. The information that separates the groups is not in any one local shape; it is in how the whole geometry is organised. The first and coarsest piece of that organisation is the growth vector.

The growth vector: how fast the hidden dimensions fill in

Here is the idea that turns the obstruction into a measurement. In all four groups you may only drive along two directions. Everything else — height in Heisenberg, the trailer angle in Engel, the deepest coordinates in Cartan — you reach indirectly, by combining allowed moves (drive a little loop and you gain height without ever “moving up”). The question that separates the groups is: how hard is each hidden dimension to reach?

Measure it by geodesic spreading. Shoot the allowed moves out to a length $r$ and watch how far each coordinate ranges. A directly-drivable coordinate spreads in proportion to $r$. A coordinate you reach through one combination of moves spreads like $r^2$ — much slower. One that needs two nested combinations spreads like $r^3$, slower still. The exponents — how many coordinates fill in at rate $r$, at $r^2$, at $r^3$ — are the growth vector4. The figure shows the real measured curves.

The growth vector, measured (experiments E0 and E2). Each line is the reach of a coordinate (98th percentile of |value| across a fan of 800 noise-free geodesics) versus geodesic length $r$, both axes logarithmic. A straight line on log–log is a power law; its slope is the exponent. Directly-drivable coordinates (slope 1) fill in fastest; coordinates reached through one bracket (slope 2) far slower; through two brackets (slope 3) slower still. Counting how many coordinates sit at each slope gives the growth vector: Heisenberg and SE(2) are $(2,3)$ — two slope-1, one slope-2, nothing steeper; Engel adds a slope-3 coordinate → $(2,3,4)$; Cartan adds two → $(2,3,5)$. The three plotted curves are the stored reach values at the six radii of experiment E0 (blue: Heisenberg $x$; orange: Heisenberg $z$; green: Engel's fourth coordinate); dashed guides are exact slopes 1, 2, 3 through each curve's last point. E0 covers Heisenberg, SE(2) and Engel; Cartan's vector is measured by the same estimator in experiment E2 (and classified in E1), and its two slope-3 curves lie almost on top of Engel's. Fitted slopes over all four groups: $0.94$–$0.99$, $1.83$–$2.00$, $2.76$–$2.82$. Data: clean.*.reach and clean.*.weights in research/caustics-to-groups/artifacts/e0_results.json; Cartan from observables.Cartan in artifacts/e2_results.json.

What the growth vector does and doesn’t settle

The measurement is clean. From sampled geodesics the exponents come back at about $0.96$, $1.8$–$2.0$, $2.8$ — round them and you read off the growth vector directly: Heisenberg $(2,3)$, SE(2) $(2,3)$, Engel $(2,3,4)$, Cartan $(2,3,5)$. That already splits the four into three classes, and it does so from data, respecting the obstruction — we never named a local cusp.

Two honest limits, both measured rather than asserted:

  1. Heisenberg and SE(2) are identical here. Both are $(2,3)$; the growth vector cannot tell them apart, because it only sees the tangent cone5 — the infinitely-zoomed-in model — and both zoom down to the same flat Heisenberg. Splitting them needs the shape of the caustic at finite scale, which is Part 3.
  2. The steeper the coordinate, the more fragile. A slope-3 coordinate reaches only $\sim r^3$ — a hair above zero at small $r$ (look how the green line hugs the floor). So it is the first thing noise erases: recovering Cartan’s $(2,3,5)$ needs more samples and tolerates less noise than recovering Heisenberg’s $(2,3)$. In the experiments, clean data gives every growth vector exactly; at position noise $\sigma = 10^{-2}$ the contact groups still come back every time (E0, 15 trials) while Engel’s success rate falls to 87% (E0) and Cartan’s to 75% (E2, 20 trials) — the price of reading a faint, high-order dimension.

That second point is not a defect to hide; it is the sample-complexity-versus-noise tradeoff the program set out to map, and it falls straight out of the geometry: higher-step structure is intrinsically harder to see.

Glossary

References

  1. A. Agrachev, D. Barilari & U. Boscain (2019). A Comprehensive Introduction to Sub-Riemannian Geometry. Cambridge University Press.
  2. É. Cartan (1910). "Les systèmes de Pfaff à cinq variables et les équations aux dérivées partielles du second ordre." Ann. Sci. ÉNS 27, 109–192.
  3. Yu. L. Sachkov (2010). "Conjugate and cut time in the sub-Riemannian problem on the group of motions of a plane." ESAIM: COCV 16, 1018–1039. arXiv:0903.0727.
  4. A. A. Ardentov & Yu. L. Sachkov (2017). "Maxwell strata and cut locus in the sub-Riemannian problem on the Engel group." Regul. Chaotic Dyn. 22, 909–936. arXiv:1710.00216.
  5. A. A. Ardentov & E. Hakavuori (2022). "Cut time in the sub-Riemannian problem on the Cartan group." ESAIM: COCV 28, 12. arXiv:2107.06730.
  1. The “bracket” of two allowed directions is the net displacement you get by moving along one, then the other, then back — a new direction reachable only in combination. It is what lets a car parallel-park into a spot it can’t slide into directly. ↩

  2. The equations of motion for the geodesics of a left-invariant structure, written in the group’s own moving frame; one compact system that specialises to each group by plugging in its bracket structure. ↩

  3. A cusp is the pointed singularity you see on the bright edge of light focused in a coffee cup — the simplest caustic singularity after the smooth fold, and one that carries no group label. ↩

  4. Written $(n_1, n_2, \dots)$: $n_1$ directions fill in at rate $r$, then $n_2$ total by rate $r^2$, and so on. Heisenberg and SE(2) are $(2,3)$; Engel is $(2,3,4)$; Cartan is $(2,3,5)$. ↩

  5. The shape a sub-Riemannian geometry approaches when you zoom infinitely far in at a point — always a “Carnot group”, the model whose growth vector we are measuring. Two different groups can share one tangent cone, which is exactly why the growth vector cannot always tell them apart. ↩