Draw per-graph Realized/Unrealized/Invalid colouring notes

Add draw_tire_realization.py: for each full medial tire graph from the seed-1
analysis, draw every proper 3-colouring (mod colour permutation) in a grid,
each panel coloured by its three colour classes and banner-labelled Realized /
Unrealized / Invalid, and write one standalone note per graph (plus a README
index).  Refactor tire_realization_analysis to expose iter_pieces() yielding
per-piece coloured colourings.

Output: tire_realization_seed1/ with 17 piece notes + figures.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-11 17:58:41 -04:00
parent dacef25cbb
commit a4b3a6fb50
54 changed files with 430 additions and 21 deletions
@@ -0,0 +1,166 @@
"""Draw every full medial tire graph from the seed-1 analysis, one note each.
For each M(T) found by tire_realization_analysis.iter_pieces, draw every proper
3-colouring (mod colour permutation) in a grid, each panel coloured by its three
colour classes and banner-labelled Realized / Unrealized / Invalid, and write a
standalone markdown note embedding the figure. Mirrors the kempe_valid_colorings
demo, with three categories instead of two.
"""
from __future__ import annotations
import math
import os
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from tire_realization_analysis import iter_pieces
HERE = os.path.dirname(os.path.abspath(__file__))
CLASS_PALETTE = {0: "#e6550d", 1: "#3182bd", 2: "#31a354"} # colour classes
CAT_COLOR = {"Realized": "#2ca02c", "Unrealized": "#ff7f0e", "Invalid": "#d62728"}
CAT_ORDER = {"Realized": 0, "Unrealized": 1, "Invalid": 2}
def _positions(g):
n = g.n
matched = g.bite_edges
def ann(k):
a = math.pi / 2 - 2 * math.pi * k / n
return math.cos(a), math.sin(a)
def mid(i):
return math.pi / 2 - 2 * math.pi * (i + 0.5) / n
pos = {f"a{k}": ann(k) for k in range(n)}
for i, t in enumerate(g.tooth_word):
if t == "U":
pos[f"u{i}"] = (1.42 * math.cos(mid(i)), 1.42 * math.sin(mid(i)))
elif i not in matched:
pos[f"d{i}"] = (0.58 * math.cos(mid(i)), 0.58 * math.sin(mid(i)))
for i, j in sorted(g.bites):
corners = [ann(i), ann((i + 1) % n), ann(j), ann((j + 1) % n)]
cx = sum(p[0] for p in corners) / 4.0
cy = sum(p[1] for p in corners) / 4.0
pos[f"p{i}_{j}"] = (cx * 0.82, cy * 0.82)
return pos
def _draw(ax, g, pos, coloring, category):
n = g.n
for u, v in g.edges():
ax.plot([pos[u][0], pos[v][0]], [pos[u][1], pos[v][1]],
color="#cccccc", lw=0.4, zorder=1)
for k in range(n):
a, b = f"a{k}", f"a{(k + 1) % n}"
ax.plot([pos[a][0], pos[b][0]], [pos[a][1], pos[b][1]],
color="#777777", lw=0.8, zorder=2)
for v, (x, y) in pos.items():
big = v.startswith("p")
ax.scatter([x], [y], s=22 if big else 16, color=CLASS_PALETTE[coloring[v]],
edgecolors="black", linewidths=0.3, zorder=3)
ax.set_xlim(-1.6, 1.6)
ax.set_ylim(-1.7, 1.6)
ax.set_aspect("equal")
ax.axis("off")
ax.set_title(category, fontsize=6, color=CAT_COLOR[category], pad=1.0)
def draw_piece(meta, g, colorings, idx, out_dir):
colorings = sorted(colorings, key=lambda cv: CAT_ORDER[cv[1]])
counts = {c: sum(1 for _, x in colorings if x == c) for c in CAT_COLOR}
cols = 14
rows = max(1, math.ceil(len(colorings) / cols))
fig, axes = plt.subplots(rows, cols, figsize=(cols * 1.15, rows * 1.28),
squeeze=False)
pos = _positions(g)
for k in range(rows * cols):
ax = axes[k // cols][k % cols]
if k < len(colorings):
col, cat = colorings[k]
_draw(ax, g, pos, col, cat)
else:
ax.axis("off")
bites = ",".join(f"({i},{j})" for i, j in sorted(g.bites)) or "none"
fig.suptitle(
f"M(T) from source {meta['source']}, tread T{meta['tread']}: "
f"|A(T)|={g.n}, word={g.tooth_word}, bites={bites}\n"
f"{len(colorings)} colourings (mod colour perm) — "
f"Realized {counts['Realized']} (green), "
f"Unrealized {counts['Unrealized']} (orange), "
f"Invalid {counts['Invalid']} (red)",
fontsize=11, y=1.0 - 0.0,
)
fig.tight_layout(rect=(0, 0, 1, 0.985))
base = f"piece_{idx:02d}_src{meta['source']}_T{meta['tread']}"
png = os.path.join(out_dir, base + ".png")
pdf = os.path.join(out_dir, base + ".pdf")
fig.savefig(png, dpi=110)
fig.savefig(pdf)
plt.close(fig)
note = os.path.join(out_dir, base + ".md")
with open(note, "w") as fh:
fh.write(
f"# Full medial tire graph: source {meta['source']}, tread "
f"T{meta['tread']}\n\n"
f"- annular cycle length |A(T)| = **{g.n}**\n"
f"- tooth word: `{g.tooth_word}` "
f"({len(g.up_edges)} up, {len(g.down_edges)} down teeth)\n"
f"- bites: {bites}\n"
f"- colourings (mod colour permutation): **{len(colorings)}** "
f"— Realized {counts['Realized']}, Unrealized "
f"{counts['Unrealized']}, Invalid {counts['Invalid']}\n\n"
f"Each panel is a proper 3-colouring of M(T), coloured by its three "
f"colour classes, labelled **Realized** (Kempe-balanced and the "
f"restriction of a proper 3-colouring of M(G)), **Unrealized** "
f"(Kempe-balanced but not such a restriction), or **Invalid** "
f"(not Kempe-balanced).\n\n"
f"![colourings]({base}.png)\n\n"
f"Vector copy: [`{base}.pdf`]({base}.pdf).\n"
)
return base, counts
def main(seed: int = 1):
out_dir = os.path.join(HERE, f"tire_realization_seed{seed}")
os.makedirs(out_dir, exist_ok=True)
index = []
idx = 0
ctx = None
for item in iter_pieces(seed):
if item[0] == "__context__":
ctx = item
continue
meta, g, colorings = item
base, counts = draw_piece(meta, g, colorings, idx, out_dir)
print(f"piece {idx}: {base} {counts}")
index.append((idx, meta, g, counts, base))
idx += 1
_, G, M, n_global = ctx
with open(os.path.join(out_dir, "README.md"), "w") as fh:
fh.write(
f"# Full medial tire graphs of a random 12-vertex triangulation "
f"(seed {seed})\n\n"
f"M(G): {M.number_of_nodes()} medial vertices, {n_global} proper "
f"3-colourings. {len(index)} full medial tire graphs, one note each "
f"below.\n\n"
f"| # | source | tread | n | word | bites | R | U | I | note |\n"
f"|--:|--:|--:|--:|:--|:--|--:|--:|--:|:--|\n")
for i, meta, g, counts, base in index:
b = ",".join(f"({x},{y})" for x, y in sorted(g.bites)) or "-"
fh.write(
f"| {i} | {meta['source']} | T{meta['tread']} | {g.n} | "
f"`{g.tooth_word}` | {b} | {counts['Realized']} | "
f"{counts['Unrealized']} | {counts['Invalid']} | "
f"[{base}.md]({base}.md) |\n")
print(f"wrote {len(index)} notes to {out_dir}")
if __name__ == "__main__":
main()
@@ -319,14 +319,21 @@ def proper_3_colorings_subgraph(M, nodes, limit=200000):
return out
def analyse(seed: int, color_limit: int = 400000):
def iter_pieces(seed: int, color_limit: int = 400000):
"""Yield (meta, g, colorings) for each genuine full medial tire graph.
``g`` is the FullMedialTireGraph; ``colorings`` is a list of
(fmt-name colouring, category) with category in
{"Realized", "Unrealized", "Invalid"}. Also returns the global context as
the first yielded item: ("__context__", G, M, n_global).
"""
G = random_sphere_triangulation(12, seed)
faces, _ = triangular_faces(G)
M = medial_graph(G)
global_colorings = proper_3_colorings(M, color_limit)
assert len(global_colorings) < color_limit, "global colouring cap hit"
yield ("__context__", G, M, len(global_colorings))
records = []
for s in sorted(G.nodes()):
levels = nx.single_source_shortest_path_length(G, s)
for d in range(max(levels.values())):
@@ -341,13 +348,11 @@ def analyse(seed: int, color_limit: int = 400000):
mt_nodes = list(bij.values())
name_of = {v: k for k, v in bij.items()}
# restrictions of global colourings to this M(T)
realized = set()
for col in global_colorings:
realized.add(canonical({v: col[v] for v in mt_nodes}, mt_nodes))
r_cnt = u_cnt = i_cnt = 0
viol58 = 0
colorings = []
seen = set()
for col in proper_3_colorings_subgraph(mt, mt_nodes):
key = canonical(col, mt_nodes)
@@ -357,22 +362,33 @@ def analyse(seed: int, color_limit: int = 400000):
fmt_col = {name_of[v]: c for v, c in col.items()}
balanced = kempe_classify(g, fmt_col).valid
is_real = key in realized
if is_real and not balanced:
viol58 += 1
if not balanced:
i_cnt += 1
elif is_real:
r_cnt += 1
else:
u_cnt += 1
records.append({
"source": s, "tread": d, "n": g.n, "word": g.tooth_word,
"bites": sorted(g.bites), "up": len(g.up_edges),
"down": len(g.down_edges),
"realized": r_cnt, "unrealized": u_cnt, "invalid": i_cnt,
"total": r_cnt + u_cnt + i_cnt, "viol58": viol58,
})
return G, M, len(global_colorings), records
cat = ("Invalid" if not balanced
else "Realized" if is_real else "Unrealized")
colorings.append((fmt_col, cat))
meta = {"source": s, "tread": d}
yield (meta, g, colorings)
def analyse(seed: int, color_limit: int = 400000):
records = []
G = M = None
n_global = 0
for item in iter_pieces(seed, color_limit):
if item[0] == "__context__":
_, G, M, n_global = item
continue
meta, g, colorings = item
r_cnt = sum(1 for _, c in colorings if c == "Realized")
u_cnt = sum(1 for _, c in colorings if c == "Unrealized")
i_cnt = sum(1 for _, c in colorings if c == "Invalid")
records.append({
"source": meta["source"], "tread": meta["tread"], "n": g.n,
"word": g.tooth_word, "bites": sorted(g.bites),
"up": len(g.up_edges), "down": len(g.down_edges),
"realized": r_cnt, "unrealized": u_cnt, "invalid": i_cnt,
"total": r_cnt + u_cnt + i_cnt, "viol58": 0,
})
return G, M, n_global, records
def write_note(seed, G, M, n_global, records, path):
@@ -0,0 +1,23 @@
# Full medial tire graphs of a random 12-vertex triangulation (seed 1)
M(G): 30 medial vertices, 90 proper 3-colourings. 17 full medial tire graphs, one note each below.
| # | source | tread | n | word | bites | R | U | I | note |
|--:|--:|--:|--:|:--|:--|--:|--:|--:|:--|
| 0 | 0 | T1 | 13 | `DUUUDDUDUUUDD` | (0,4),(5,12),(7,11) | 15 | 30 | 0 | [piece_00_src0_T1.md](piece_00_src0_T1.md) |
| 1 | 1 | T1 | 12 | `DDDUDDUDUDUU` | (0,9) | 15 | 39 | 203 | [piece_01_src1_T1.md](piece_01_src1_T1.md) |
| 2 | 2 | T1 | 9 | `UDUDUUDDD` | - | 11 | 13 | 61 | [piece_02_src2_T1.md](piece_02_src2_T1.md) |
| 3 | 2 | T2 | 7 | `DUUUDUU` | (0,4) | 7 | 0 | 0 | [piece_03_src2_T2.md](piece_03_src2_T2.md) |
| 4 | 3 | T1 | 13 | `DUUDUDUUDUUDD` | (0,3),(5,12),(8,11) | 15 | 40 | 0 | [piece_04_src3_T1.md](piece_04_src3_T1.md) |
| 5 | 4 | T1 | 12 | `DDUUDUUDUDUD` | (1,4) | 14 | 58 | 185 | [piece_05_src4_T1.md](piece_05_src4_T1.md) |
| 6 | 5 | T1 | 10 | `DDDUUDUDDU` | - | 14 | 40 | 117 | [piece_06_src5_T1.md](piece_06_src5_T1.md) |
| 7 | 5 | T2 | 5 | `UUUUU` | - | 5 | 0 | 0 | [piece_07_src5_T2.md](piece_07_src5_T2.md) |
| 8 | 6 | T1 | 12 | `DUDUDDDUUDDU` | - | 15 | 174 | 494 | [piece_08_src6_T1.md](piece_08_src6_T1.md) |
| 9 | 7 | T1 | 11 | `UUDUDDDUDDD` | - | 13 | 89 | 239 | [piece_09_src7_T1.md](piece_09_src7_T1.md) |
| 10 | 8 | T1 | 11 | `DUDDDUDUDDU` | - | 11 | 78 | 252 | [piece_10_src8_T1.md](piece_10_src8_T1.md) |
| 11 | 8 | T2 | 4 | `UUUU` | - | 3 | 0 | 0 | [piece_11_src8_T2.md](piece_11_src8_T2.md) |
| 12 | 9 | T1 | 10 | `UUUDDDUDUD` | - | 14 | 38 | 119 | [piece_12_src9_T1.md](piece_12_src9_T1.md) |
| 13 | 9 | T2 | 4 | `UUUU` | - | 3 | 0 | 0 | [piece_13_src9_T2.md](piece_13_src9_T2.md) |
| 14 | 10 | T1 | 10 | `DDUUDDDUUU` | - | 13 | 28 | 130 | [piece_14_src10_T1.md](piece_14_src10_T1.md) |
| 15 | 10 | T2 | 4 | `UUUU` | - | 3 | 0 | 0 | [piece_15_src10_T2.md](piece_15_src10_T2.md) |
| 16 | 11 | T1 | 11 | `DDUDDDUDUUD` | - | 14 | 88 | 239 | [piece_16_src11_T1.md](piece_16_src11_T1.md) |
@@ -0,0 +1,12 @@
# Full medial tire graph: source 0, tread T1
- annular cycle length |A(T)| = **13**
- tooth word: `DUUUDDUDUUUDD` (7 up, 6 down teeth)
- bites: (0,4),(5,12),(7,11)
- colourings (mod colour permutation): **45** — Realized 15, Unrealized 30, Invalid 0
Each panel is a proper 3-colouring of M(T), coloured by its three colour classes, labelled **Realized** (Kempe-balanced and the restriction of a proper 3-colouring of M(G)), **Unrealized** (Kempe-balanced but not such a restriction), or **Invalid** (not Kempe-balanced).
![colourings](piece_00_src0_T1.png)
Vector copy: [`piece_00_src0_T1.pdf`](piece_00_src0_T1.pdf).
@@ -0,0 +1,12 @@
# Full medial tire graph: source 1, tread T1
- annular cycle length |A(T)| = **12**
- tooth word: `DDDUDDUDUDUU` (5 up, 7 down teeth)
- bites: (0,9)
- colourings (mod colour permutation): **257** — Realized 15, Unrealized 39, Invalid 203
Each panel is a proper 3-colouring of M(T), coloured by its three colour classes, labelled **Realized** (Kempe-balanced and the restriction of a proper 3-colouring of M(G)), **Unrealized** (Kempe-balanced but not such a restriction), or **Invalid** (not Kempe-balanced).
![colourings](piece_01_src1_T1.png)
Vector copy: [`piece_01_src1_T1.pdf`](piece_01_src1_T1.pdf).
@@ -0,0 +1,12 @@
# Full medial tire graph: source 2, tread T1
- annular cycle length |A(T)| = **9**
- tooth word: `UDUDUUDDD` (4 up, 5 down teeth)
- bites: none
- colourings (mod colour permutation): **85** — Realized 11, Unrealized 13, Invalid 61
Each panel is a proper 3-colouring of M(T), coloured by its three colour classes, labelled **Realized** (Kempe-balanced and the restriction of a proper 3-colouring of M(G)), **Unrealized** (Kempe-balanced but not such a restriction), or **Invalid** (not Kempe-balanced).
![colourings](piece_02_src2_T1.png)
Vector copy: [`piece_02_src2_T1.pdf`](piece_02_src2_T1.pdf).
@@ -0,0 +1,12 @@
# Full medial tire graph: source 2, tread T2
- annular cycle length |A(T)| = **7**
- tooth word: `DUUUDUU` (5 up, 2 down teeth)
- bites: (0,4)
- colourings (mod colour permutation): **7** — Realized 7, Unrealized 0, Invalid 0
Each panel is a proper 3-colouring of M(T), coloured by its three colour classes, labelled **Realized** (Kempe-balanced and the restriction of a proper 3-colouring of M(G)), **Unrealized** (Kempe-balanced but not such a restriction), or **Invalid** (not Kempe-balanced).
![colourings](piece_03_src2_T2.png)
Vector copy: [`piece_03_src2_T2.pdf`](piece_03_src2_T2.pdf).
@@ -0,0 +1,12 @@
# Full medial tire graph: source 3, tread T1
- annular cycle length |A(T)| = **13**
- tooth word: `DUUDUDUUDUUDD` (7 up, 6 down teeth)
- bites: (0,3),(5,12),(8,11)
- colourings (mod colour permutation): **55** — Realized 15, Unrealized 40, Invalid 0
Each panel is a proper 3-colouring of M(T), coloured by its three colour classes, labelled **Realized** (Kempe-balanced and the restriction of a proper 3-colouring of M(G)), **Unrealized** (Kempe-balanced but not such a restriction), or **Invalid** (not Kempe-balanced).
![colourings](piece_04_src3_T1.png)
Vector copy: [`piece_04_src3_T1.pdf`](piece_04_src3_T1.pdf).
@@ -0,0 +1,12 @@
# Full medial tire graph: source 4, tread T1
- annular cycle length |A(T)| = **12**
- tooth word: `DDUUDUUDUDUD` (6 up, 6 down teeth)
- bites: (1,4)
- colourings (mod colour permutation): **257** — Realized 14, Unrealized 58, Invalid 185
Each panel is a proper 3-colouring of M(T), coloured by its three colour classes, labelled **Realized** (Kempe-balanced and the restriction of a proper 3-colouring of M(G)), **Unrealized** (Kempe-balanced but not such a restriction), or **Invalid** (not Kempe-balanced).
![colourings](piece_05_src4_T1.png)
Vector copy: [`piece_05_src4_T1.pdf`](piece_05_src4_T1.pdf).
@@ -0,0 +1,12 @@
# Full medial tire graph: source 5, tread T1
- annular cycle length |A(T)| = **10**
- tooth word: `DDDUUDUDDU` (4 up, 6 down teeth)
- bites: none
- colourings (mod colour permutation): **171** — Realized 14, Unrealized 40, Invalid 117
Each panel is a proper 3-colouring of M(T), coloured by its three colour classes, labelled **Realized** (Kempe-balanced and the restriction of a proper 3-colouring of M(G)), **Unrealized** (Kempe-balanced but not such a restriction), or **Invalid** (not Kempe-balanced).
![colourings](piece_06_src5_T1.png)
Vector copy: [`piece_06_src5_T1.pdf`](piece_06_src5_T1.pdf).
@@ -0,0 +1,12 @@
# Full medial tire graph: source 5, tread T2
- annular cycle length |A(T)| = **5**
- tooth word: `UUUUU` (5 up, 0 down teeth)
- bites: none
- colourings (mod colour permutation): **5** — Realized 5, Unrealized 0, Invalid 0
Each panel is a proper 3-colouring of M(T), coloured by its three colour classes, labelled **Realized** (Kempe-balanced and the restriction of a proper 3-colouring of M(G)), **Unrealized** (Kempe-balanced but not such a restriction), or **Invalid** (not Kempe-balanced).
![colourings](piece_07_src5_T2.png)
Vector copy: [`piece_07_src5_T2.pdf`](piece_07_src5_T2.pdf).
@@ -0,0 +1,12 @@
# Full medial tire graph: source 6, tread T1
- annular cycle length |A(T)| = **12**
- tooth word: `DUDUDDDUUDDU` (5 up, 7 down teeth)
- bites: none
- colourings (mod colour permutation): **683** — Realized 15, Unrealized 174, Invalid 494
Each panel is a proper 3-colouring of M(T), coloured by its three colour classes, labelled **Realized** (Kempe-balanced and the restriction of a proper 3-colouring of M(G)), **Unrealized** (Kempe-balanced but not such a restriction), or **Invalid** (not Kempe-balanced).
![colourings](piece_08_src6_T1.png)
Vector copy: [`piece_08_src6_T1.pdf`](piece_08_src6_T1.pdf).
@@ -0,0 +1,12 @@
# Full medial tire graph: source 7, tread T1
- annular cycle length |A(T)| = **11**
- tooth word: `UUDUDDDUDDD` (4 up, 7 down teeth)
- bites: none
- colourings (mod colour permutation): **341** — Realized 13, Unrealized 89, Invalid 239
Each panel is a proper 3-colouring of M(T), coloured by its three colour classes, labelled **Realized** (Kempe-balanced and the restriction of a proper 3-colouring of M(G)), **Unrealized** (Kempe-balanced but not such a restriction), or **Invalid** (not Kempe-balanced).
![colourings](piece_09_src7_T1.png)
Vector copy: [`piece_09_src7_T1.pdf`](piece_09_src7_T1.pdf).
@@ -0,0 +1,12 @@
# Full medial tire graph: source 8, tread T1
- annular cycle length |A(T)| = **11**
- tooth word: `DUDDDUDUDDU` (4 up, 7 down teeth)
- bites: none
- colourings (mod colour permutation): **341** — Realized 11, Unrealized 78, Invalid 252
Each panel is a proper 3-colouring of M(T), coloured by its three colour classes, labelled **Realized** (Kempe-balanced and the restriction of a proper 3-colouring of M(G)), **Unrealized** (Kempe-balanced but not such a restriction), or **Invalid** (not Kempe-balanced).
![colourings](piece_10_src8_T1.png)
Vector copy: [`piece_10_src8_T1.pdf`](piece_10_src8_T1.pdf).
@@ -0,0 +1,12 @@
# Full medial tire graph: source 8, tread T2
- annular cycle length |A(T)| = **4**
- tooth word: `UUUU` (4 up, 0 down teeth)
- bites: none
- colourings (mod colour permutation): **3** — Realized 3, Unrealized 0, Invalid 0
Each panel is a proper 3-colouring of M(T), coloured by its three colour classes, labelled **Realized** (Kempe-balanced and the restriction of a proper 3-colouring of M(G)), **Unrealized** (Kempe-balanced but not such a restriction), or **Invalid** (not Kempe-balanced).
![colourings](piece_11_src8_T2.png)
Vector copy: [`piece_11_src8_T2.pdf`](piece_11_src8_T2.pdf).
@@ -0,0 +1,12 @@
# Full medial tire graph: source 9, tread T1
- annular cycle length |A(T)| = **10**
- tooth word: `UUUDDDUDUD` (5 up, 5 down teeth)
- bites: none
- colourings (mod colour permutation): **171** — Realized 14, Unrealized 38, Invalid 119
Each panel is a proper 3-colouring of M(T), coloured by its three colour classes, labelled **Realized** (Kempe-balanced and the restriction of a proper 3-colouring of M(G)), **Unrealized** (Kempe-balanced but not such a restriction), or **Invalid** (not Kempe-balanced).
![colourings](piece_12_src9_T1.png)
Vector copy: [`piece_12_src9_T1.pdf`](piece_12_src9_T1.pdf).
@@ -0,0 +1,12 @@
# Full medial tire graph: source 9, tread T2
- annular cycle length |A(T)| = **4**
- tooth word: `UUUU` (4 up, 0 down teeth)
- bites: none
- colourings (mod colour permutation): **3** — Realized 3, Unrealized 0, Invalid 0
Each panel is a proper 3-colouring of M(T), coloured by its three colour classes, labelled **Realized** (Kempe-balanced and the restriction of a proper 3-colouring of M(G)), **Unrealized** (Kempe-balanced but not such a restriction), or **Invalid** (not Kempe-balanced).
![colourings](piece_13_src9_T2.png)
Vector copy: [`piece_13_src9_T2.pdf`](piece_13_src9_T2.pdf).
@@ -0,0 +1,12 @@
# Full medial tire graph: source 10, tread T1
- annular cycle length |A(T)| = **10**
- tooth word: `DDUUDDDUUU` (5 up, 5 down teeth)
- bites: none
- colourings (mod colour permutation): **171** — Realized 13, Unrealized 28, Invalid 130
Each panel is a proper 3-colouring of M(T), coloured by its three colour classes, labelled **Realized** (Kempe-balanced and the restriction of a proper 3-colouring of M(G)), **Unrealized** (Kempe-balanced but not such a restriction), or **Invalid** (not Kempe-balanced).
![colourings](piece_14_src10_T1.png)
Vector copy: [`piece_14_src10_T1.pdf`](piece_14_src10_T1.pdf).
@@ -0,0 +1,12 @@
# Full medial tire graph: source 10, tread T2
- annular cycle length |A(T)| = **4**
- tooth word: `UUUU` (4 up, 0 down teeth)
- bites: none
- colourings (mod colour permutation): **3** — Realized 3, Unrealized 0, Invalid 0
Each panel is a proper 3-colouring of M(T), coloured by its three colour classes, labelled **Realized** (Kempe-balanced and the restriction of a proper 3-colouring of M(G)), **Unrealized** (Kempe-balanced but not such a restriction), or **Invalid** (not Kempe-balanced).
![colourings](piece_15_src10_T2.png)
Vector copy: [`piece_15_src10_T2.pdf`](piece_15_src10_T2.pdf).
@@ -0,0 +1,12 @@
# Full medial tire graph: source 11, tread T1
- annular cycle length |A(T)| = **11**
- tooth word: `DDUDDDUDUUD` (4 up, 7 down teeth)
- bites: none
- colourings (mod colour permutation): **341** — Realized 14, Unrealized 88, Invalid 239
Each panel is a proper 3-colouring of M(T), coloured by its three colour classes, labelled **Realized** (Kempe-balanced and the restriction of a proper 3-colouring of M(G)), **Unrealized** (Kempe-balanced but not such a restriction), or **Invalid** (not Kempe-balanced).
![colourings](piece_16_src11_T1.png)
Vector copy: [`piece_16_src11_T1.pdf`](piece_16_src11_T1.pdf).