Cookie Consent by Free Privacy Policy Generator The Forward Map: Caustics of the Model Groups | Igor Moiseev
Lab › From Caustics to Groups › Part 2 of 4 · start at Part 1

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: A Research Program
  2. The Forward Map: Caustics of the Model Groups ← you are here
  3. The Inverse Map: Reading the Fingerprint
  4. In the Wild: DW-MRI, and Where the Method Stays Silent
Appendices — Theory Background
  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; here it is as a fact about these four groups. Zoom far enough into the caustic of any of them and you see the same short list of shapes — a fold, a cusp3 — 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 angles in Engel and 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.

how far each kind of coordinate ranges vs. how far you drive — log–log
The growth vector, measured (experiment E0). Each line is the reach of a coordinate (98th percentile of |value| across a fan of 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)$. Slopes recovered from data: $0.97$–$0.98$, $1.95$–$2.00$, $2.8$. Points are measured; dashed guides are exact slopes 1, 2, 3. Data: research/caustics-to-groups/artifacts/e0_results.json.

What the growth vector does and doesn’t settle

The measurement is clean. From noisy geodesic samples the exponents come back at $0.97, 1.95, 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 one-percent position noise the contact groups still come back perfectly while Cartan’s success rate falls — 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.

What’s next

We now have four groups, their caustics, and a measurable coarse fingerprint that sorts them into three classes. What remains is the hard and interesting half: telling Heisenberg from SE(2) — the two the growth vector declares identical — by how far each one’s caustic deviates from the flat model. That deviation is the nilpotent-deviation statistic, and turning it into a working classifier with an honest confusion matrix is Part 3.

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 generic caustic shape, and the same one every one of these groups shows locally. ↩

  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. ↩