Quotient-driven layouts for symmetric graphs, using automorphism group orbits to determine vertex placement on concentric rings with rotational symmetry.
Pipeline: GAP computes Aut(Γ) and orbit quotients → Python scores quotients, minimises crossings, places vertices → TikZ renders PDF (or D3.js renders interactive HTML).
# Single graph → individual_graphs/auto-dodecahedron.pdf
python3 src/draw_graph.py dodecahedron
# Full gallery → gallery.pdf
python3 src/draw_all.py
# Orbit quotient diagrams → quotients/
python3 src/draw_quotients.py
# Visual catalogue (all individual drawings, one per page) → catalogue.pdf
python3 src/make_catalogue.pyRequires GAP with the GRAPE package, Python 3, and pdflatex.
| Directory | Contents |
|---|---|
src/ |
The pipeline: draw_graph.py (layout engine), draw_all.py (gallery), draw_quotients.py, symmetric-layout.g (GAP: Aut, orbits, quotients), enumerate-quotients.g, code-construction scripts |
src/census/ |
Standalone GAP research scripts: PSL(2,q) cubic graph censuses, M₁₁ searches, Macbeath graph, Klein quartic codes |
docs/ |
Implementation & theory, research program, algebraic background, research notes, Eades & Hong reference (thesis.pdf) |
tex/ |
Hand-written papers/diagrams: cubic-bi-circulant.tex, Fano plane figures, quotient unfoldings (compile with pdflatex from inside tex/) |
individual_graphs/ |
Generated + hand-tuned TikZ drawings of single graphs |
quotients/ |
Generated orbit-quotient diagrams (output of draw_quotients.py) |
named_graphs_tikz/ |
Curated TikZ sources for named graphs |
assets/ |
Reference images (downloaded comparisons, JPEG exports) |
bolza-surface/ |
Genus-2 Bolza surface: cohomology, Poincaré disk tilings, interactive foldings (docs, maths) |
klein-quartic/ |
Genus-3 Klein quartic: PSL(2,7) cohomology, 3D visualization (notes) |
clayworth/ |
CSS quantum codes from graph tilings, Lean 4 formalization (docs) |
clifford-torus/ |
Interactive Clifford torus homotopies (docs) |
surfaces/ |
G₂(2) triality hexagon, Clebsch surface (readme) |
hecke/ |
Clebsch surface and three Hecke algebras (notes) |
lean/ |
Lean 4 / mathlib notes and named graph images |
- GAP computes Aut(G), enumerates subgroups, finds orbit quotients with low degree
- Python selects the best quotient (by symmetry score), detects cyclic vs cylindrical layout, and places vertices on concentric rings
- Crossing minimisation: path reordering of orbits (Schlegel-like), global angular offset search with rotations and reflections
- TikZ renders the final PDF
For the full theory (Eades & Hong Theorem 3.2, layout modes, adding new graphs), see docs/SYMMETRIC_EMBEDDING.md.
All graphs are cubic (3-regular). The collection is the complete Foster census of cubic arc-transitive (symmetric) graphs up to 30 vertices — all 13 of them. Cubic graphs are the simplest non-trivial regular graphs, and their automorphism groups are large relative to their size, making them a natural testbed for symmetry-aware drawing.
The list is exhaustive for n ≤ 30: every cubic arc-transitive graph on at most 30 vertices appears (there are exactly 13). No cubic arc-transitive graph exists on 12 or 22 vertices.
Given a graph Γ, we compute G = Aut(Γ) and select a subgroup H ≤ G whose orbits give a clean quotient. The layout places each H-orbit on a concentric ring.
| Foster | Graph | n | G = Aut(Γ) | |G| | H | |H| | Orbits |
|---|---|---|---|---|---|---|---|
| F004 | K₄ | 4 | S₄ | 24 | C₂ | 2 | [2, 2] |
| F006 | K₃,₃ | 6 | (S₃ × S₃) : C₂ | 72 | C₂ | 2 | [2, 2, 2] |
| F008 | Cube = GP(4,1) | 8 | C₂ × S₄ | 48 | C₄ | 4 | [4, 4] |
| F010 | Petersen = GP(5,2) | 10 | S₅ | 120 | D₁₀ | 10 | [5, 5] |
| F014 | Heawood | 14 | PSL(3,2) : C₂ | 336 | C₂ × C₂ | 4 | [2, 2, 2, 4, 4] |
| F016 | Mobius-Kantor = GP(8,3) | 16 | GL(2,3) : C₂ | 96 | C₈ | 8 | [8, 8] |
| F018 | Pappus | 18 | ((C₃ × C₃) : C₃) : D₈ | 216 | S₃ | 6 | [6, 6, 6] |
| F020A | Dodecahedron | 20 | C₂ × A₅ | 120 | C₅ | 5 | [5, 5, 5, 5] |
| F020B | Desargues = GP(10,3) | 20 | C₂ × S₅ | 240 | C₁₀ | 10 | [10, 10] |
| F024 | Nauru = GP(12,5) | 24 | S₄ × S₃ | 144 | C₁₂ | 12 | [12, 12] |
| F026A | F26A | 26 | C₁₃ : C₆ | 78 | C₁₃ : C₃ | 39 | [13, 13] |
| F028 | Coxeter | 28 | PSL(3,2) : C₂ | 336 | D₁₄ | 14 | [7, 7, 7, 7] |
| F030 | Tutte-Coxeter | 30 | (A₆ . C₂) : C₂ | 1440 | C₁₀ | 10 | [10, 10, 10] |
All group structures computed by GAP (GRAPE package). K₄ and K₃,₃ are included in the code but omitted from the gallery as trivially small. gallery.pdf shows the 11 graphs from F008 to F030.
The next entry after F030 is at n=32.
- docs/SYMMETRIC_EMBEDDING.md — implementation: pipeline architecture, graph library, layout modes, how to add a graph
- docs/RESEARCH_PROGRAM.md — the research line: Biggs-Smith as "a picture of SU(2) over F₁₇", PSL(2,q) censuses, towers of covers, open questions
- docs/CLASSIFICATION.md — algebraic background: the GL(2,q) family, PSL(2,q) ≅ SO(3,q), split vs non-split tori
- docs/RESEARCH_NOTES.md — triangle quotient spectra, strong symmetric genus
Watch a unit square fold into a torus in two phases: rolling into a cylinder (identifying a ↔ a⁻¹), then bending into a torus (identifying b ↔ b⁻¹). Grid lines and colored loops show how the square's coordinate system wraps onto the surface. Drag the slider or hit Play.
Cohomology and Poincaré disk tiling of the Bolza surface — the most symmetric genus-2 Riemann surface, with Aut = GL(2,3) of order 48. The (2,3,8) triangle group tiles the hyperbolic plane with 48 fundamental domains per copy of the surface.
- Octagon → Torus pipeline — Full animated pipeline: hyperbolic octagon → Euclidean octagon → cut into two pentagons → deform to cut squares → roll into cylinders → bend into two wounded tori → glue. All 48 (2,3,8) triangles tracked through every transformation. Drag the slider or hit Play.
- Hyperbolic octagon explorer — Interactive viewer of the 48 fundamental domain triangles. Press 1-5 to switch between: hyperbolic octagon (geodesic arcs), Euclidean octagon, half-octagon, cut square, wounded torus.
- Wounded torus fold — Half-octagon deforms into a cut square, then folds into a wounded torus via progressive bending (no self-intersection).
bolza-surface/bolza_cohomology.py— oriented Lefschetz traces, H¹ = V₂ ⊕ V̄₂bolza-surface/bolza_3d.html— Poincaré disk tiling + 3D genus-2 surfacebolza-surface/bolza_disk.pdf— publication-quality TikZ rendering of the tiling
Cohomology of the Klein quartic via dual PSL(2,7) cell decompositions. The (2,3,7) triangle group gives the Hurwitz-maximal automorphism group of order 168.
klein-quartic/klein_quartic_cohomology.py— H¹ = V₃ ⊕ V̄₃, oriented Lefschetz tracesklein-quartic/klein_quartic_3d.html— Poincaré disk tiling + 3D genus-3 surfaceklein-quartic/verify_cohomology.g— GAP verification
