What is this?
This simulator generates random dimer coverings (perfect matchings) on the triangular lattice using Glauber dynamics (Markov Chain Monte Carlo).
The triangular lattice is non-bipartite (cannot be 2-colored), unlike the square lattice (domino tilings) or hexagonal lattice (lozenge tilings). CFTP (Coupling From The Past) is not directly applicable due to lack of monotone coupling.
How to use
Drawing tools:
- Pan: Click and drag to move the view. Scroll to zoom in/out.
- Draw: Click or drag on lattice vertices to add them to your region
- Erase: Click or drag to remove vertices from your region
- Lasso Fill/Erase: Click to place polygon vertices. Close the loop by clicking near the start, pressing Enter, or Cmd/Ctrl+click (adds final vertex then closes).
- Make Coverable: Attempts to add vertices to enable a perfect matching
Presets: Parallelogram, Triangle
View options:
- Show grid: Display the underlying triangular lattice
- Show vertices: Display lattice points in the region
- Show boundary: Highlight the boundary of the region
- Color by orientation: Color dimers by their direction (3 colors for 3 edge orientations)
- Dimer width: Adjust the thickness of dimer lines
Double dimer model
Enable Double dimer to superimpose two independent dimer configurations (blue and red). Each configuration evolves via its own independent Glauber dynamics.
The superposition of two perfect matchings decomposes into disjoint alternating cycles (loops that alternate between the two configurations). Double edges (where both configurations agree) appear as cycles of length 2.
Use Min loop to filter and display only cycles of at least the specified length, hiding double edges and short loops to reveal the large-scale loop structure.
Local moves (Kenyon-Rémila)
The simulator uses lozenge moves (3 types), triangle moves (2 types), and butterfly moves (3 types):
Lozenge moves (4-cycle): Each lozenge is a parallelogram of 4 vertices. If two opposite edges are covered by dimers, flip to cover the other two.
- Type 0 (up-right): (n,j) → (n+1,j) → (n+1,j+1) → (n,j+1)
- Type 1 (up): (n,j) → (n,j+1) → (n-1,j+2) → (n-1,j+1)
- Type 2 (up-left): (n,j) → (n-1,j+1) → (n-2,j+1) → (n-1,j)
Triangle moves (6-cycle): Each triangle has 6 boundary edges covered by 3 dimers. Rotate the 3 dimers to the other alternating pattern.
- Type 0 (up-left): (n,j) → (n+2,j) → (n,j+2)
- Type 1 (down-right): (n,j) → (n+2,j) → (n+2,j-2)
Butterfly moves (8-cycle): Each butterfly has 8 boundary edges covered by 4 dimers. Rotate the 4 dimers to the other alternating pattern.
- Type 0: (1,0)-(2,0)-(3,-1)-(3,0)-(3,1)-(2,1)-(1,2)-(1,1)
- Type 1: (0,0)-(-1,1)-(-2,2)-(-2,1)-(-3,1)-(-3,0)-(-2,0)-(-1,0)
- Type 2: (0,0)-(1,0)-(2,0)-(1,1)-(1,2)-(0,2)-(-1,2)-(0,1)
Move selection: Each step picks a random vertex, then selects one of 8 move types uniformly at random: lozenge (3/8), triangle (2/8), butterfly (3/8). The move is attempted anchored at that vertex and accepted via Metropolis-Hastings when using periodic weights.
See Kenyon & Rémila (1996) for ergodicity proofs.
Note on topological sectors: For domains with holes or periodic boundary conditions, the configuration space splits into disjoint sectors, which Glauber cannot mix between.
Acknowledgements
Thanks to Alexei Borodin for discussions.
References
- C. Kenyon, E. Rémila: Perfect matchings in the triangular lattice, Discrete Math. 152 (1996) — ergodicity via 4+6+8 cycles
- I. Hartarsky, L. Lichev, F. Toninelli: Local dimer dynamics in higher dimensions, Ann. Inst. Henri Poincaré D (2024) — 4+6 cycles suffice for parallelograms
- P. Fendley, R. Moessner, S.L. Sondhi: Classical dimers on the triangular lattice, Phys. Rev. B 66 (2002)