This is a real 2D causal dynamical triangulation (CDT), evolved by an actual Monte Carlo Markov chain instead of being drawn from a fixed formula. Spacetime is a stack of T discrete time-slices, each a causal circle of nt spatial vertices; consecutive slices are glued edge-to-edge by triangular simplices, and time is periodic (the last slice glues back to the first), so no edge ever skips a slice — the same causality restriction that separates CDT from ordinary (acausal) dynamical triangulation.
Two real local moves drive the evolution, exactly like a research CDT code:
- Vertex insertion / deletion: a vertex is added to one slice and removed from another (paired, so total volume is exactly conserved), splitting or merging one triangle in each of the two strips that touch that slice.
- Edge reconnection: two adjacent triangles inside one strip swap their diagonal (an elementary "up ↔ down" transposition), re-wiring the mesh without changing either slice's vertex count.
Every proposed move is accepted or rejected with a genuine Metropolis rule weighted by the discrete action's combinatorial term — the number of distinct ways to triangulate a strip between rings of size nL and nU is exactly the binomial coefficient C(nL+nU, nL):
P(accept) = min(1, exp(ΔlnW)), W(n_L,n_U) = C(n_L+n_U, n_L)
Because that count is maximized when neighbouring rings are close in size, the chain has a genuine entropic bias toward smooth volume profiles — nobody hand-codes a target shape. The "Initial roughness" slider seeds a deliberately jagged sawtooth spacetime so you can watch this happen: the live volume-vs-time profile (right-hand bars) visibly relaxes as moves accumulate. The roughness statistic is the RMS discrete second difference of nt (a numerical measure of how jagged the profile is), sampled continuously — "Roughness (start)" is frozen right after Regenerate, "Roughness (now)" updates live, so the smoothing is something you can actually measure, not just see.