diff --git a/papers/coloring_nested_tire_graphs/experiments/tire_fiber_chords_fast.py b/papers/coloring_nested_tire_graphs/experiments/tire_fiber_chords_fast.py new file mode 100644 index 0000000..01c031c --- /dev/null +++ b/papers/coloring_nested_tire_graphs/experiments/tire_fiber_chords_fast.py @@ -0,0 +1,149 @@ +"""Numpy-optimized version of tire_fiber_chords.fiber_distribution. + +The slow version iterates over all 3^n candidates in {1,2,3}^n; this +version directly constructs the 2^n + 2(-1)^n proper edge 3-colorings +of C_n via a vectorized binary-branch construction, then computes σ +and applies chord constraints in numpy. + +Speedup: ~3^(n-1)/2^(n-1) = (3/2)^(n-1) ≈ 1500x at n=18, ~4000x at n=20. +""" +from __future__ import annotations + +from collections import Counter +import numpy as np + +from tire_fiber_chords import ( + d_positions_for, + compute_faces_from_chords, +) + + +# OTHER[c, b] = the b-th color in {1,2,3} \ {c}, b ∈ {0,1}, c ∈ {1,2,3} +# Row 0 is a placeholder (color 0 unused). +OTHER_NP = np.array([ + [0, 0], + [2, 3], + [1, 3], + [1, 2], +], dtype=np.int8) + + +def proper_cycle_colorings(n: int) -> np.ndarray: + """Return an (N, n) int8 array of all proper edge 3-colorings of C_n + where N = 2^n + 2(-1)^n. + + Encoding: a path c_0, c_1, ..., c_{n-1} is built by picking c_0 ∈ + {1,2,3} (3 choices) and then at each step picking one of the two + colors ≠ previous (2 choices each). We then drop those paths that + fail the cyclic constraint c_{n-1} ≠ c_0. + """ + if n < 2: + return np.empty((0, n), dtype=np.int8) + + block_size = 1 << (n - 1) + n_raw = 3 * block_size + arr = np.empty((n_raw, n), dtype=np.int8) + + # Column 0: blocks of size block_size for c_0 = 1, 2, 3. + arr[0 * block_size : 1 * block_size, 0] = 1 + arr[1 * block_size : 2 * block_size, 0] = 2 + arr[2 * block_size : 3 * block_size, 0] = 3 + + row_idx = np.arange(block_size, dtype=np.int64) + for i in range(1, n): + bits_block = ((row_idx >> (i - 1)) & 1).astype(np.int8) + bits_full = np.tile(bits_block, 3) + prev = arr[:, i - 1] + arr[:, i] = OTHER_NP[prev, bits_full] + + mask = arr[:, -1] != arr[:, 0] + return arr[mask] + + +def induced_sigma_vec(c: np.ndarray) -> np.ndarray: + """Given an (N, n) proper-cycle-coloring array, return the (N, n) + σ array where σ_i = 6 - c_{i-1} - c_i (the third color at vertex i).""" + c_prev = np.roll(c, 1, axis=1) + return (6 - c_prev - c).astype(np.int8) + + +def fiber_distribution_fast(m: int, k: int, chords) -> tuple[dict, list, list]: + """Drop-in replacement for tire_fiber_chords.fiber_distribution.""" + n = m + k + d_positions = d_positions_for(m, k) + o_faces = compute_faces_from_chords(k, chords) + d_positions_by_face = [ + [d_positions[a] for a in face_edges] + for face_edges in o_faces + ] + + c = proper_cycle_colorings(n) + if c.size == 0: + return {}, d_positions, d_positions_by_face + + sigma = induced_sigma_vec(c) + + # Chord constraint: σ values at each face's positions are pairwise distinct. + mask = np.ones(sigma.shape[0], dtype=bool) + for face in d_positions_by_face: + if len(face) <= 1: + continue + for i in range(len(face)): + for j in range(i + 1, len(face)): + mask &= (sigma[:, face[i]] != sigma[:, face[j]]) + + sigma_ok = sigma[mask] + + # Count multiplicities. np.unique with return_counts is faster than Counter for big arrays. + if sigma_ok.shape[0] == 0: + return {}, d_positions, d_positions_by_face + uniq, counts = np.unique(sigma_ok, axis=0, return_counts=True) + fibers = {tuple(row): int(c) for row, c in zip(uniq.tolist(), counts.tolist())} + return fibers, d_positions, d_positions_by_face + + +def spoke_only_fiber_distribution_fast(n: int) -> dict: + """Steiner-rich baseline (no chord constraints).""" + if n < 2: + return {} + c = proper_cycle_colorings(n) + sigma = induced_sigma_vec(c) + uniq, counts = np.unique(sigma, axis=0, return_counts=True) + return {tuple(row): int(c) for row, c in zip(uniq.tolist(), counts.tolist())} + + +def projection_support_fast(fibers: dict, positions: list[int]) -> set: + return {tuple(sigma[p] for p in positions) for sigma in fibers} + + +if __name__ == '__main__': + import time + + print("Benchmark vs. slow version") + print("-" * 60) + from tire_fiber_chords import fiber_distribution as fiber_slow + + cases = [ + (4, 4, [(0, 2)]), + (6, 6, [(0, 3)]), + (6, 9, [(0, 2), (3, 5), (6, 8)]), + (9, 9, [(0, 2), (3, 5), (6, 8)]), + (12, 12, [(0, 3), (4, 7), (8, 11)]), + ] + for m, k, ch in cases: + n = m + k + + t0 = time.time() + fast, _, _ = fiber_distribution_fast(m, k, ch) + dt_fast = time.time() - t0 + + # Sanity-check vs slow for small n + if n <= 15: + t0 = time.time() + slow, _, _ = fiber_slow(m, k, ch) + dt_slow = time.time() - t0 + assert fast == slow, f"mismatch at (m={m}, k={k}): fast {len(fast)} != slow {len(slow)}" + print(f"(m={m}, k={k}, n={n}): fast {dt_fast:.3f}s | slow {dt_slow:.3f}s | " + f"speedup {dt_slow/max(dt_fast, 1e-6):.1f}× | |C| = {len(fast)}") + else: + print(f"(m={m}, k={k}, n={n}): fast {dt_fast:.3f}s | |C| = {len(fast)}") diff --git a/papers/coloring_nested_tire_graphs/experiments/tire_fiber_step2_large.py b/papers/coloring_nested_tire_graphs/experiments/tire_fiber_step2_large.py new file mode 100644 index 0000000..44b536b --- /dev/null +++ b/papers/coloring_nested_tire_graphs/experiments/tire_fiber_step2_large.py @@ -0,0 +1,161 @@ +"""Step-2 adjacent-tire compatibility experiment, extended to larger +shared cycle lengths k = 9 and k = 12. Uses the numpy-optimized +fiber distribution from tire_fiber_chords_fast.py. + +Same convention as tire_fiber_step2.py: for each (T1, T2) pair, we +compute T1's D-projection and T2's U-projection on the shared cycle γ +and report intersection sizes (forward + reverse). +""" +from __future__ import annotations + +import time + +from tire_fiber_chords import d_positions_for, u_positions_for +from tire_fiber_chords_fast import ( + fiber_distribution_fast, + spoke_only_fiber_distribution_fast, + projection_support_fast, +) + + +def project_T1_D(gamma_len: int, m_1: int, chords_1, model: str) -> set: + if model == 'SR': + n = m_1 + gamma_len + fibers = spoke_only_fiber_distribution_fast(n) + else: + fibers, _, _ = fiber_distribution_fast(m_1, gamma_len, chords_1) + d_pos = d_positions_for(m_1, gamma_len) + return projection_support_fast(fibers, d_pos) + + +def project_T2_U(gamma_len: int, k_2: int, chords_2, model: str) -> set: + if model == 'SR': + n = gamma_len + k_2 + fibers = spoke_only_fiber_distribution_fast(n) + else: + fibers, _, _ = fiber_distribution_fast(gamma_len, k_2, chords_2) + u_pos = u_positions_for(gamma_len, k_2) + return projection_support_fast(fibers, u_pos) + + +def intersect_with_reflection(S1: set, S2: set) -> tuple[set, set]: + forward = S1 & S2 + S2_rev = {s[::-1] for s in S2} + reverse = S1 & S2_rev + return forward, reverse + + +# Chord sets that make each k-cycle SP-feasible (all faces ≤ 3 B_in edges). +# --- Chord configurations validated to produce all-faces ≤ 3 B_in edges --- +# k=9: 3-chord matching giving faces of sizes (2,2,2,3). +K9_CHORDS_3 = [(0, 2), (3, 5), (6, 8)] +# k=9 alternate: a 3-chord nested config also giving (2,2,2,3). +K9_CHORDS_NESTED = [(0, 2), (4, 6), (3, 7)] + +# k=12: 3-chord matching giving 4 faces of size 3 (symmetric "thirds"). +K12_CHORDS_3 = [(0, 3), (4, 7), (8, 11)] +# k=12 nested: chord (0,3), then chord (4,11) for the bigger arc, then +# (5,7) and (8,10) inside (4,11). Faces: {0,1,2}(3), {5,6}(2), {8,9}(2), +# {4,7,10}(3), {3,11}(2). +K12_CHORDS_NESTED = [(0, 3), (4, 11), (5, 7), (8, 10)] + + +def validate_chord_set(k: int, chords: list[tuple[int, int]]) -> tuple[bool, str]: + """Check that no O-face has > 3 B_in edges (the SP feasibility + constraint at 3 colors).""" + from tire_fiber_chords import compute_faces_from_chords + faces = compute_faces_from_chords(k, chords) + sizes = sorted(len(f) for f in faces) + ok = max(sizes) <= 3 + return ok, f"face sizes {sizes}" + + +# Curated pairs. Format: (γ, T1_config, T2_config). +# T1_config = (m_1, chords_1, model1); T2_config = (k_2, chords_2, model2). +CASES_K9 = [ + # k = 9: both sides need at least 3 chords for SP feasibility. + (9, (9, K9_CHORDS_3, 'SP'), (9, K9_CHORDS_3, 'SP')), + (9, (9, K9_CHORDS_3, 'SP'), (9, K9_CHORDS_NESTED, 'SP')), + (9, (9, K9_CHORDS_NESTED, 'SP'), (9, K9_CHORDS_NESTED, 'SP')), + (9, (12, K9_CHORDS_3, 'SP'), (9, K9_CHORDS_3, 'SP')), + (9, (9, K9_CHORDS_3, 'SP'), (12, K12_CHORDS_3, 'SP')), # fixed: chord set matches k_2=12 + (9, (9, K9_CHORDS_3, 'SP'), (12, K12_CHORDS_NESTED, 'SP')), + (9, (9, K9_CHORDS_3, 'SR'), (9, K9_CHORDS_3, 'SP')), + (9, (9, K9_CHORDS_3, 'SP'), (3, [], 'SR')), + (9, (9, K9_CHORDS_3, 'SP'), (4, [(0, 2)], 'SP')), + (9, (9, K9_CHORDS_3, 'SP'), (6, [(0, 3)], 'SP')), + (9, (9, K9_CHORDS_3, 'SP'), (6, [(0, 2), (3, 5)], 'SP')), + (9, (9, K9_CHORDS_NESTED, 'SP'), (6, [(0, 3)], 'SP')), + (9, (9, K9_CHORDS_NESTED, 'SP'), (12, K12_CHORDS_NESTED, 'SP')), +] + +CASES_K12 = [ + (12, (12, K12_CHORDS_3, 'SP'), (12, K12_CHORDS_3, 'SP')), + (12, (12, K12_CHORDS_NESTED, 'SP'), (12, K12_CHORDS_NESTED, 'SP')), + (12, (12, K12_CHORDS_3, 'SP'), (12, K12_CHORDS_NESTED, 'SP')), + (12, (12, K12_CHORDS_3, 'SP'), (3, [], 'SR')), + (12, (12, K12_CHORDS_3, 'SP'), (4, [(0, 2)], 'SP')), + (12, (12, K12_CHORDS_3, 'SP'), (6, [(0, 3)], 'SP')), + (12, (12, K12_CHORDS_3, 'SP'), (6, [(0, 2), (3, 5)], 'SP')), + (12, (12, K12_CHORDS_3, 'SP'), (9, K9_CHORDS_3, 'SP')), + (12, (12, K12_CHORDS_NESTED, 'SP'), (9, K9_CHORDS_3, 'SP')), + (12, (12, K12_CHORDS_3, 'SR'), (12, K12_CHORDS_3, 'SP')), +] + + +def fmt_cfg(m_or_k: int, chords, model: str) -> str: + ch_str = str(chords) if chords else "—" + if len(ch_str) > 24: + ch_str = ch_str[:21] + "..." + return f"({m_or_k}, {ch_str}, {model})" + + +def run_cases(label: str, cases: list, time_each: bool = False) -> int: + print(f"\n### {label}\n") + print(f"{'γ':>2} {'T1 (m_1, chords_1, model)':<38s} {'T2 (k_2, chords_2, model)':<38s} " + f"{'|S1|':>5s} {'|S2|':>5s} {'3^γ':>6s} {'fwd':>5s} {'rev':>5s} {'compat?':>7s}" + f"{' time' if time_each else ''}") + print("-" * (135 + (8 if time_each else 0))) + nyes = ntotal = 0 + for gamma, t1, t2 in cases: + m_1, ch1, model1 = t1 + k_2, ch2, model2 = t2 + t0 = time.time() + S1 = project_T1_D(gamma, m_1, ch1, model1) + S2 = project_T2_U(gamma, k_2, ch2, model2) + dt = time.time() - t0 + forward, reverse = intersect_with_reflection(S1, S2) + compat = "YES" if (forward or reverse) else "NO" + ntotal += 1 + if compat == "YES": + nyes += 1 + suffix = f" {dt:5.1f}s" if time_each else "" + print( + f"{gamma:>2} {fmt_cfg(m_1, ch1, model1):<38s} {fmt_cfg(k_2, ch2, model2):<38s} " + f"{len(S1):>5d} {len(S2):>5d} {3**gamma:>6d} " + f"{len(forward):>5d} {len(reverse):>5d} {compat:>7s}{suffix}" + ) + print(f"\n{nyes}/{ntotal} compatible at this k.") + return nyes + + +def main(): + # Validate chord sets up front. + print("Chord set validation:") + for label, ch_set, k in [ + ("K9_CHORDS_3", K9_CHORDS_3, 9), + ("K9_CHORDS_NESTED", K9_CHORDS_NESTED, 9), + ("K12_CHORDS_3", K12_CHORDS_3, 12), + ("K12_CHORDS_NESTED",K12_CHORDS_NESTED,12), + ]: + ok, info = validate_chord_set(k, ch_set) + print(f" {label} (k={k}): {info} {'OK' if ok else 'FAIL'}") + + n_k9 = run_cases("Step 2 at k = 9", CASES_K9, time_each=True) + n_k12 = run_cases("Step 2 at k = 12", CASES_K12, time_each=True) + total = len(CASES_K9) + len(CASES_K12) + print(f"\nTotal: {n_k9 + n_k12}/{total} compatible across k=9 and k=12.") + + +if __name__ == '__main__': + main() diff --git a/papers/coloring_nested_tire_graphs/experiments/tire_fiber_step2_large_data.txt b/papers/coloring_nested_tire_graphs/experiments/tire_fiber_step2_large_data.txt new file mode 100644 index 0000000..cc7d945 --- /dev/null +++ b/papers/coloring_nested_tire_graphs/experiments/tire_fiber_step2_large_data.txt @@ -0,0 +1,44 @@ +Chord set validation: + K9_CHORDS_3 (k=9): face sizes [2, 2, 2, 3] OK + K9_CHORDS_NESTED (k=9): face sizes [2, 2, 2, 3] OK + K12_CHORDS_3 (k=12): face sizes [3, 3, 3, 3] OK + K12_CHORDS_NESTED (k=12): face sizes [2, 2, 2, 3, 3] OK + +### Step 2 at k = 9 + + γ T1 (m_1, chords_1, model) T2 (k_2, chords_2, model) |S1| |S2| 3^γ fwd rev compat? time +----------------------------------------------------------------------------------------------------------------------------------------------- + 9 (9, [(0, 2), (3, 5), (6, 8)], SP) (9, [(0, 2), (3, 5), (6, 8)], SP) 1296 7866 19683 1188 858 YES 0.2s + 9 (9, [(0, 2), (3, 5), (6, 8)], SP) (9, [(0, 2), (4, 6), (3, 7)], SP) 1296 7536 19683 1242 1110 YES 0.2s + 9 (9, [(0, 2), (4, 6), (3, 7)], SP) (9, [(0, 2), (4, 6), (3, 7)], SP) 1296 7536 19683 1176 1224 YES 0.2s + 9 (12, [(0, 2), (3, 5), (6, 8)], SP) (9, [(0, 2), (3, 5), (6, 8)], SP) 1296 7866 19683 1188 858 YES 1.4s + 9 (9, [(0, 2), (3, 5), (6, 8)], SP) (12, [(0, 3), (4, 7), (8, ..., SP) 1296 1302 19683 72 90 YES 0.6s + 9 (9, [(0, 2), (3, 5), (6, 8)], SP) (12, [(0, 3), (4, 11), (5,..., SP) 1296 9456 19683 840 606 YES 0.7s + 9 (9, [(0, 2), (3, 5), (6, 8)], SR) (9, [(0, 2), (3, 5), (6, 8)], SP) 19683 7866 19683 7866 7866 YES 1.2s + 9 (9, [(0, 2), (3, 5), (6, 8)], SP) (3, —, SR) 1296 3681 19683 108 108 YES 0.1s + 9 (9, [(0, 2), (3, 5), (6, 8)], SP) (4, [(0, 2)], SP) 1296 3162 19683 276 108 YES 0.1s + 9 (9, [(0, 2), (3, 5), (6, 8)], SP) (6, [(0, 3)], SP) 1296 942 19683 54 60 YES 0.1s + 9 (9, [(0, 2), (3, 5), (6, 8)], SP) (6, [(0, 2), (3, 5)], SP) 1296 6210 19683 402 324 YES 0.2s + 9 (9, [(0, 2), (4, 6), (3, 7)], SP) (6, [(0, 3)], SP) 1296 942 19683 54 36 YES 0.1s + 9 (9, [(0, 2), (4, 6), (3, 7)], SP) (12, [(0, 3), (4, 11), (5,..., SP) 1296 9456 19683 732 768 YES 0.8s + +13/13 compatible at this k. + +### Step 2 at k = 12 + + γ T1 (m_1, chords_1, model) T2 (k_2, chords_2, model) |S1| |S2| 3^γ fwd rev compat? time +----------------------------------------------------------------------------------------------------------------------------------------------- +12 (12, [(0, 3), (4, 7), (8, ..., SP) (12, [(0, 3), (4, 7), (8, ..., SP) 1296 12840 531441 960 564 YES 11.3s +12 (12, [(0, 3), (4, 11), (5,..., SP) (12, [(0, 3), (4, 11), (5,..., SP) 7776 100938 531441 5928 3414 YES 14.4s +12 (12, [(0, 3), (4, 7), (8, ..., SP) (12, [(0, 3), (4, 11), (5,..., SP) 1296 100938 531441 1128 912 YES 13.4s +12 (12, [(0, 3), (4, 7), (8, ..., SP) (3, —, SR) 1296 31176 531441 192 192 YES 5.5s +12 (12, [(0, 3), (4, 7), (8, ..., SP) (4, [(0, 2)], SP) 1296 27378 531441 48 60 YES 5.5s +12 (12, [(0, 3), (4, 7), (8, ..., SP) (6, [(0, 3)], SP) 1296 9882 531441 6 6 YES 5.4s +12 (12, [(0, 3), (4, 7), (8, ..., SP) (6, [(0, 2), (3, 5)], SP) 1296 61224 531441 12 12 YES 5.8s +12 (12, [(0, 3), (4, 7), (8, ..., SP) (9, [(0, 2), (3, 5), (6, 8)], SP) 1296 94116 531441 18 90 YES 6.7s +12 (12, [(0, 3), (4, 11), (5,..., SP) (9, [(0, 2), (3, 5), (6, 8)], SP) 7776 94116 531441 552 852 YES 8.5s +12 (12, [(0, 3), (4, 7), (8, ..., SR) (12, [(0, 3), (4, 7), (8, ..., SP) 531441 12840 531441 12840 12840 YES 143.9s + +10/10 compatible at this k. + +Total: 23/23 compatible across k=9 and k=12. diff --git a/papers/coloring_nested_tire_graphs/notes/tire_fiber_step2_large.aux b/papers/coloring_nested_tire_graphs/notes/tire_fiber_step2_large.aux new file mode 100644 index 0000000..a39e06f --- /dev/null +++ b/papers/coloring_nested_tire_graphs/notes/tire_fiber_step2_large.aux @@ -0,0 +1,6 @@ +\relax +\newlabel{obs:still-compat}{{}{2}} +\newlabel{obs:s3-orbit}{{}{2}} +\newlabel{obs:more-chords-bigger}{{}{3}} +\newlabel{obs:multiples-6}{{}{3}} +\gdef \@abspage@last{4} diff --git a/papers/coloring_nested_tire_graphs/notes/tire_fiber_step2_large.log b/papers/coloring_nested_tire_graphs/notes/tire_fiber_step2_large.log new file mode 100644 index 0000000..c4fdecf --- /dev/null +++ b/papers/coloring_nested_tire_graphs/notes/tire_fiber_step2_large.log @@ -0,0 +1,357 @@ +This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 26 MAY 2026 03:00 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**tire_fiber_step2_large.tex +(./tire_fiber_step2_large.tex +LaTeX2e <2021-11-15> patch level 1 +L3 programming layer <2022-02-24> +(/usr/local/texlive/2022/texmf-dist/tex/latex/base/article.cls +Document Class: article 2021/10/04 v1.4n Standard LaTeX document class +(/usr/local/texlive/2022/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2021/10/04 v1.4n Standard LaTeX file (size option) +) +\c@part=\count185 +\c@section=\count186 +\c@subsection=\count187 +\c@subsubsection=\count188 +\c@paragraph=\count189 +\c@subparagraph=\count190 +\c@figure=\count191 +\c@table=\count192 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2021/10/15 v2.17l AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2021/08/26 v2.01 AMS text + +(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks16 +\ex@=\dimen139 +)) +(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen140 +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2021/08/26 v2.02 operator names +) +\inf@bad=\count193 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count194 +\leftroot@=\count195 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count196 +\DOTSCASE@=\count197 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box50 +\strutbox@=\box51 +\big@size=\dimen141 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count198 +\c@MaxMatrixCols=\count199 +\dotsspace@=\muskip16 +\c@parentequation=\count266 +\dspbrk@lvl=\count267 +\tag@help=\toks17 +\row@=\count268 +\column@=\count269 +\maxfields@=\count270 +\andhelp@=\toks18 +\eqnshift@=\dimen142 +\alignsep@=\dimen143 +\tagshift@=\dimen144 +\tagwidth@=\dimen145 +\totwidth@=\dimen146 +\lineht@=\dimen147 +\@envbody=\toks19 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks20 +LaTeX Info: Redefining \[ on input line 2938. +LaTeX Info: Redefining \] on input line 2939. +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/local/texlive/2022/texmf-dist/tex/latex/amscls/amsthm.sty +Package: amsthm 2020/05/29 v2.20.6 +\thm@style=\toks21 +\thm@bodyfont=\toks22 +\thm@headfont=\toks23 +\thm@notefont=\toks24 +\thm@headpunct=\toks25 +\thm@preskip=\skip52 +\thm@postskip=\skip53 +\thm@headsep=\skip54 +\dth@everypar=\toks26 +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks27 +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2021/03/04 v1.4d Standard LaTeX Graphics (DPC,SPQR) + +(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2021/08/11 v1.11 sin cos tan (DPC) +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 107. + +(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen148 +\Gin@req@width=\dimen149 +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/local/texlive/2022/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + +(/usr/local/texlive/2022/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2022/02/03 v1.0f TeX engine tests +)) +\Gm@cnth=\count271 +\Gm@cntv=\count272 +\c@Gm@tempcnt=\count273 +\Gm@bindingoffset=\dimen150 +\Gm@wd@mp=\dimen151 +\Gm@odd@mp=\dimen152 +\Gm@even@mp=\dimen153 +\Gm@layoutwidth=\dimen154 +\Gm@layoutheight=\dimen155 +\Gm@layouthoffset=\dimen156 +\Gm@layoutvoffset=\dimen157 +\Gm@dimlist=\toks28 +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/booktabs/booktabs.sty +Package: booktabs 2020/01/12 v1.61803398 Publication quality tables +\heavyrulewidth=\dimen158 +\lightrulewidth=\dimen159 +\cmidrulewidth=\dimen160 +\belowrulesep=\dimen161 +\belowbottomsep=\dimen162 +\aboverulesep=\dimen163 +\abovetopsep=\dimen164 +\cmidrulesep=\dimen165 +\cmidrulekern=\dimen166 +\defaultaddspace=\dimen167 +\@cmidla=\count274 +\@cmidlb=\count275 +\@aboverulesep=\dimen168 +\@belowrulesep=\dimen169 +\@thisruleclass=\count276 +\@lastruleclass=\count277 +\@thisrulewidth=\dimen170 +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/caption/caption.sty +Package: caption 2022/03/01 v3.6b Customizing captions (AR) + +(/usr/local/texlive/2022/texmf-dist/tex/latex/caption/caption3.sty +Package: caption3 2022/03/17 v2.3b caption3 kernel (AR) +\caption@tempdima=\dimen171 +\captionmargin=\dimen172 +\caption@leftmargin=\dimen173 +\caption@rightmargin=\dimen174 +\caption@width=\dimen175 +\caption@indent=\dimen176 +\caption@parindent=\dimen177 +\caption@hangindent=\dimen178 +Package caption Info: Standard document class detected. +) +\c@caption@flags=\count278 +\c@continuedfloat=\count279 +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2022-02-07 L3 backend support: PDF output (pdfTeX) +\l__color_backend_stack_int=\count280 +\l__pdf_internal_box=\box52 +) +(./tire_fiber_step2_large.aux) +\openout1 = `tire_fiber_step2_large.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 16. +LaTeX Font Info: ... okay on input line 16. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 16. +LaTeX Font Info: ... okay on input line 16. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 16. +LaTeX Font Info: ... okay on input line 16. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 16. +LaTeX Font Info: ... okay on input line 16. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 16. +LaTeX Font Info: ... okay on input line 16. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 16. +LaTeX Font Info: ... okay on input line 16. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 16. +LaTeX Font Info: ... okay on input line 16. + +(/usr/local/texlive/2022/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count281 +\scratchdimen=\dimen179 +\scratchbox=\box53 +\nofMPsegments=\count282 +\nofMParguments=\count283 +\everyMPshowfont=\toks29 +\MPscratchCnt=\count284 +\MPscratchDim=\dimen180 +\MPnumerator=\count285 +\makeMPintoPDFobject=\count286 +\everyMPtoPDFconversion=\toks30 +) (/usr/local/texlive/2022/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/local/texlive/2022/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: +* layout: +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt) +* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt) +* \paperwidth=614.295pt +* \paperheight=794.96999pt +* \textwidth=469.75502pt +* \textheight=650.43001pt +* \oddsidemargin=0.0pt +* \evensidemargin=0.0pt +* \topmargin=-37.0pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=11.0pt +* \footskip=30.0pt +* \marginparwidth=59.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +Package caption Info: Begin \AtBeginDocument code. +Package caption Info: End \AtBeginDocument code. +LaTeX Font Info: Trying to load font information for U+msa on input line 17. + +(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 17. + + +(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +Overfull \hbox (32.55118pt too wide) in paragraph at lines 21--28 +\OMS/cmsy/m/n/10.95 f\OT1/cmr/m/n/10.95 9\OML/cmm/m/it/10.95 ; \OT1/cmr/m/n/10. +95 12\OMS/cmsy/m/n/10.95 g$\OT1/cmr/m/n/10.95 , en-abled by the numpy-optimized + fiber enu-mer-a-tion in \OT1/cmtt/m/n/10.95 experiments/tire[]fiber[]chords[]f +ast.py\OT1/cmr/m/n/10.95 . + [] + + +Overfull \hbox (84.92256pt too wide) in paragraph at lines 29--31 +[]\OT1/cmr/m/n/10.95 Script: \OT1/cmtt/m/n/10.95 experiments/tire[]fiber[]step2 +[]large.py\OT1/cmr/m/n/10.95 . Out-put: \OT1/cmtt/m/n/10.95 experiments/tire[]f +iber[]step2[]large[]data.txt\OT1/cmr/m/n/10.95 . + [] + +[1 + +{/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] +[2] +Overfull \hbox (14.79457pt too wide) in paragraph at lines 166--170 +[]$\OT1/cmr/m/n/10.95 1188\OML/cmm/m/it/10.95 ; \OT1/cmr/m/n/10.95 1242\OML/cmm +/m/it/10.95 ; \OT1/cmr/m/n/10.95 1176\OML/cmm/m/it/10.95 ; \OT1/cmr/m/n/10.95 8 +58\OML/cmm/m/it/10.95 ; \OT1/cmr/m/n/10.95 1110\OML/cmm/m/it/10.95 ; \OT1/cmr/m +/n/10.95 1224\OML/cmm/m/it/10.95 ; \OT1/cmr/m/n/10.95 72\OML/cmm/m/it/10.95 ; \ +OT1/cmr/m/n/10.95 90\OML/cmm/m/it/10.95 ; \OT1/cmr/m/n/10.95 840\OML/cmm/m/it/1 +0.95 ; \OT1/cmr/m/n/10.95 606\OML/cmm/m/it/10.95 ; \OT1/cmr/m/n/10.95 7866\OML/ +cmm/m/it/10.95 ; \OT1/cmr/m/n/10.95 108\OML/cmm/m/it/10.95 ; \OT1/cmr/m/n/10.95 + 276\OML/cmm/m/it/10.95 ; \OT1/cmr/m/n/10.95 54\OML/cmm/m/it/10.95 ; \OT1/cmr/m +/n/10.95 60\OML/cmm/m/it/10.95 ; \OT1/cmr/m/n/10.95 402\OML/cmm/m/it/10.95 ; \O +T1/cmr/m/n/10.95 324\OML/cmm/m/it/10.95 ; \OT1/cmr/m/n/10.95 36\OML/cmm/m/it/10 +.95 ; \OT1/cmr/m/n/10.95 732\OML/cmm/m/it/10.95 ; \OT1/cmr/m/n/10.95 768$\OT1/c +mr/m/it/10.95 , + [] + + +Overfull \hbox (7.76158pt too wide) in paragraph at lines 207--212 +\OT1/cmr/m/n/10.95 The numpy-optimized enu-mer-a-tion in \OT1/cmtt/m/n/10.95 ex +periments/tire[]fiber[]chords[]fast.py \OT1/cmr/m/n/10.95 re-places the brute- + [] + +[3] [4] (./tire_fiber_step2_large.aux) ) +Here is how much of TeX's memory you used: + 4595 strings out of 478268 + 74454 string characters out of 5846347 + 388403 words of memory out of 5000000 + 22771 multiletter control sequences out of 15000+600000 + 483898 words of font info for 87 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 55i,10n,63p,256b,253s stack positions out of 10000i,1000n,20000p,200000b,200000s +{/usr/local/texlive/2022/texmf-dist/fon +ts/enc/dvips/cm-super/cm-super-ts1.enc} +Output written on tire_fiber_step2_large.pdf (4 pages, 211349 bytes). +PDF statistics: + 108 PDF objects out of 1000 (max. 8388607) + 65 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 1 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/papers/coloring_nested_tire_graphs/notes/tire_fiber_step2_large.pdf b/papers/coloring_nested_tire_graphs/notes/tire_fiber_step2_large.pdf new file mode 100644 index 0000000..de3477b Binary files /dev/null and b/papers/coloring_nested_tire_graphs/notes/tire_fiber_step2_large.pdf differ diff --git a/papers/coloring_nested_tire_graphs/notes/tire_fiber_step2_large.tex b/papers/coloring_nested_tire_graphs/notes/tire_fiber_step2_large.tex new file mode 100644 index 0000000..084f4ac --- /dev/null +++ b/papers/coloring_nested_tire_graphs/notes/tire_fiber_step2_large.tex @@ -0,0 +1,243 @@ +\documentclass[11pt]{article} +\usepackage{amsmath,amssymb,amsthm} +\usepackage{graphicx} +\usepackage{geometry} +\usepackage{booktabs} +\usepackage{caption} +\geometry{margin=1in} + +\title{Step 2 at $k = 9$ and $k = 12$:\\ + extending the adjacent-tire compatibility experiment} +\author{} +\date{} + +\newtheorem*{obs}{Observation} + +\begin{document} +\maketitle + +\section*{What this is} + +A continuation of \texttt{tire\_fiber\_step2.tex}: that note tested +adjacent-tire compatibility (the chain-pigeonhole step) at $k \leq 6$, +all $23/23$ pairs compatible. This note pushes the experiment to +$k \in \{9, 12\}$, enabled by the numpy-optimized fiber enumeration +in \texttt{experiments/tire\_fiber\_chords\_fast.py}. Together with +the earlier data, every tested pair --- now $23$ at $k \leq 6$ plus +$23$ more at $k \in \{9, 12\}$, $46$ in total --- is compatible. + +Script: \texttt{experiments/tire\_fiber\_step2\_large.py}. +Output: \texttt{experiments/tire\_fiber\_step2\_large\_data.txt}. + +\section*{Setup recap} + +Two adjacent tires $T_1, T_2$ share a cycle $\gamma$ of length $k$. +We project each tire's $\sigma$-support onto $\gamma$: +\[ + S_1 := \pi_D^{(1)}(\mathcal{C}^{(1)}) \subseteq \{1,2,3\}^k, + \quad + S_2 := \pi_U^{(2)}(\mathcal{C}^{(2)}) \subseteq \{1,2,3\}^k, +\] +and ask whether $S_1 \cap S_2 \neq \emptyset$ (forward), or +$S_1 \cap \mathrm{reverse}(S_2) \neq \emptyset$ (reverse). Either +non-empty intersection means the pair is \emph{compatible}. + +\section*{Chord configurations used} + +Under the Steiner-poor model, every $O$-face must have at most $3$ +$B_{\mathrm{in}}$ edges. For $k > 3$ this forces specific chord +matchings. Constrained chord sets used (validated): + +\begin{center} +\small +\begin{tabular}{l l l} +\toprule +label & chord set & face sizes \\ +\midrule +\texttt{K9\_CHORDS\_3} & $\{(0,2),(3,5),(6,8)\}$ & $(2, 2, 2, 3)$ \\ +\texttt{K9\_CHORDS\_NESTED} & $\{(0,2),(3,7),(4,6)\}$ & $(2, 2, 2, 3)$ (different arrangement) \\ +\texttt{K12\_CHORDS\_3} & $\{(0,3),(4,7),(8,11)\}$ & $(3, 3, 3, 3)$ (symmetric thirds) \\ +\texttt{K12\_CHORDS\_NESTED} & $\{(0,3),(4,11),(5,7),(8,10)\}$ & $(2, 2, 2, 3, 3)$ \\ +\bottomrule +\end{tabular} +\end{center} + +\section*{Results at $k = 9$ (13/13 compatible)} + +\begin{center} +\scriptsize +\begin{tabular}{l l r r r r r} +\toprule +$T_1$ & $T_2$ & $|S_1|$ & $|S_2|$ & $|S_1 \cap S_2|$ fwd & rev & compat? \\ +\midrule +$(9, \texttt{K9-3}, \text{SP})$ & $(9, \texttt{K9-3}, \text{SP})$ & 1296 & 7866 & 1188 & 858 & yes \\ +$(9, \texttt{K9-3}, \text{SP})$ & $(9, \texttt{K9-N}, \text{SP})$ & 1296 & 7536 & 1242 & 1110 & yes \\ +$(9, \texttt{K9-N}, \text{SP})$ & $(9, \texttt{K9-N}, \text{SP})$ & 1296 & 7536 & 1176 & 1224 & yes \\ +$(12, \texttt{K9-3}, \text{SP})$ & $(9, \texttt{K9-3}, \text{SP})$ & 1296 & 7866 & 1188 & 858 & yes \\ +$(9, \texttt{K9-3}, \text{SP})$ & $(12, \texttt{K12-3}, \text{SP})$ & 1296 & 1302 & 72 & 90 & yes \\ +$(9, \texttt{K9-3}, \text{SP})$ & $(12, \texttt{K12-N}, \text{SP})$ & 1296 & 9456 & 840 & 606 & yes \\ +$(9, \texttt{K9-3}, \text{SR})$ & $(9, \texttt{K9-3}, \text{SP})$ & 19683 & 7866 & 7866 & 7866 & yes \\ +$(9, \texttt{K9-3}, \text{SP})$ & $(3, -, \text{SR})$ & 1296 & 3681 & 108 & 108 & yes \\ +$(9, \texttt{K9-3}, \text{SP})$ & $(4, (0,2), \text{SP})$ & 1296 & 3162 & 276 & 108 & yes \\ +$(9, \texttt{K9-3}, \text{SP})$ & $(6, (0,3), \text{SP})$ & 1296 & 942 & 54 & 60 & yes \\ +$(9, \texttt{K9-3}, \text{SP})$ & $(6, (0,2)(3,5), \text{SP})$ & 1296 & 6210 & 402 & 324 & yes \\ +$(9, \texttt{K9-N}, \text{SP})$ & $(6, (0,3), \text{SP})$ & 1296 & 942 & 54 & 36 & yes \\ +$(9, \texttt{K9-N}, \text{SP})$ & $(12, \texttt{K12-N}, \text{SP})$ & 1296 & 9456 & 732 & 768 & yes \\ +\bottomrule +\end{tabular} +\end{center} + +Universe size at $k = 9$: $3^9 = 19{,}683$. + +\section*{Results at $k = 12$ (10/10 compatible)} + +\begin{center} +\scriptsize +\begin{tabular}{l l r r r r r} +\toprule +$T_1$ & $T_2$ & $|S_1|$ & $|S_2|$ & $|S_1 \cap S_2|$ fwd & rev & compat? \\ +\midrule +$(12, \texttt{K12-3}, \text{SP})$ & $(12, \texttt{K12-3}, \text{SP})$ & 1296 & 12840 & 960 & 564 & yes \\ +$(12, \texttt{K12-N}, \text{SP})$ & $(12, \texttt{K12-N}, \text{SP})$ & 7776 & 100938 & 5928 & 3414 & yes \\ +$(12, \texttt{K12-3}, \text{SP})$ & $(12, \texttt{K12-N}, \text{SP})$ & 1296 & 100938 & 1128 & 912 & yes \\ +$(12, \texttt{K12-3}, \text{SP})$ & $(3, -, \text{SR})$ & 1296 & 31176 & 192 & 192 & yes \\ +$(12, \texttt{K12-3}, \text{SP})$ & $(4, (0,2), \text{SP})$ & 1296 & 27378 & 48 & 60 & yes \\ +$(12, \texttt{K12-3}, \text{SP})$ & $(6, (0,3), \text{SP})$ & 1296 & 9882 & \textbf{6} & \textbf{6} & yes \\ +$(12, \texttt{K12-3}, \text{SP})$ & $(6, (0,2)(3,5), \text{SP})$ & 1296 & 61224 & 12 & 12 & yes \\ +$(12, \texttt{K12-3}, \text{SP})$ & $(9, \texttt{K9-3}, \text{SP})$ & 1296 & 94116 & 18 & 90 & yes \\ +$(12, \texttt{K12-N}, \text{SP})$ & $(9, \texttt{K9-3}, \text{SP})$ & 7776 & 94116 & 552 & 852 & yes \\ +$(12, \texttt{K12-3}, \text{SR})$ & $(12, \texttt{K12-3}, \text{SP})$ & 531441 & 12840 & 12840 & 12840 & yes \\ +\bottomrule +\end{tabular} +\end{center} + +Universe size at $k = 12$: $3^{12} = 531{,}441$. + +\section*{Observations} + +\begin{obs}[Still compatible everywhere] +\label{obs:still-compat} +$46$ of $46$ tested pairs are compatible across $k \in \{3, 4, 5, 6, +9, 12\}$ ($23$ from the earlier note plus $23$ new at $k \in \{9, 12\}$). +No counterexample has been found. +\end{obs} + +\begin{obs}[The $S_3$-orbit pattern persists at $k = 12$] +\label{obs:s3-orbit} +The smallest tested intersection at $k = 12$ is again \emph{exactly +$6$ elements}, occurring at $T_1 = (12, \texttt{K12-3}, \text{SP})$ vs.\ +$T_2 = (6, (0,3), \text{SP})$. Direct inspection shows the six +elements are a single $S_3$-orbit of the canonical pattern +\[ + (1, 2, 3, 2, 2, 1, 3, 3, 2, 3, 1, 1). +\] +Decoded against \texttt{K12-3}'s face structure (faces $\{0,1,2\}$, +$\{4,5,6\}$, $\{8,9,10\}$, and the outer face $\{3,7,11\}$ on the +$B_{\mathrm{in}}$ edges): +\begin{itemize} + \item face $\{0,1,2\}$: $\sigma$-values $(1, 2, 3)$ -- a permutation of $\{1,2,3\}$. + \item face $\{4,5,6\}$: $\sigma$-values $(2, 1, 3)$ -- a permutation. + \item face $\{8,9,10\}$: $\sigma$-values $(2, 3, 1)$ -- a permutation. + \item face $\{3,7,11\}$: $\sigma$-values $(2, 3, 1)$ -- a permutation. +\end{itemize} +Every face receives all three colors exactly once. This is precisely +the ``Latin-square-flavoured'' structural pattern from the $k = 6$ +worst case, now extended to $k = 12$. +\end{obs} + +\begin{obs}[Bigger supports come from more chords] +\label{obs:more-chords-bigger} +Nested chord sets give substantially larger supports than symmetric +ones: +\begin{itemize} + \item At $k = 12$, $\texttt{K12-3}$ (symmetric, faces $3{+}3{+}3{+}3$) + gives $|S_1| = 1296$. + \item $\texttt{K12-N}$ (nested, faces $2{+}2{+}2{+}3{+}3$) gives + $|S_1| = 7776 = 6 \cdot 1296$. +\end{itemize} +The factor of $6$ is suggestive but I have not chased it. +\end{obs} + +\begin{obs}[Intersection sizes are multiples of $6$] +\label{obs:multiples-6} +Every observed forward and reverse intersection size in the new data +is a multiple of $6$: +\begin{quote} +$1188, 1242, 1176, 858, 1110, 1224, 72, 90, 840, 606, 7866, 108, 276, +54, 60, 402, 324, 36, 732, 768$,\\ +$960, 564, 5928, 3414, 1128, 912, 192, 48, 60, 6, 12, 18, 90, 552, 852, +12840$ +\end{quote} +This is consistent with both $S_1$ and $S_2$ being $S_3$-invariant +(closed under color permutations), so their intersection decomposes +into $S_3$-orbits, each of size $6$. +\end{obs} + +\section*{Speculative theorem} + +\begin{quote} +\textbf{Conjecture.} For any SP-feasible tire $T$ (i.e.\ every +$O$-face has at most $3$ $B_{\mathrm{in}}$ edges), the projection +$\pi_D(\mathcal{C}(T))$ on the $\gamma$-side contains the +``Latin-flavoured'' subset +\[ + \mathcal{L}(\gamma, O) \;:=\; \{\sigma \in \{1,2,3\}^{|\gamma|} + : \sigma \text{ restricted to each $O$-face is a permutation + of $\{1,2,3\}$}\}, +\] +which is an $S_3$-invariant set of size at least $6$ (and exactly +$6$ in the maximally constrained case). Adjacent tires share this +common substructure on $\gamma$, so the chain-pigeonhole intersection +is non-empty. +\end{quote} + +The data is consistent with this conjecture and points to a +structural proof: any tire that admits an edge $3$-coloring at all +must admit a globally ``Latin-style'' one, and Latin-style colorings +are dictated entirely by face structure (not by which tire's face it +is). Adjacent tires that share a cycle $\gamma$ see the same Latin +constraints from each other's side, so their Latin-style supports +agree. + +This would be the analog, on the chord side, of step~1's +``saturation iff $m \geq k$'' result on the spoke-only side. + +\section*{Performance notes} + +The numpy-optimized enumeration in +\texttt{experiments/tire\_fiber\_chords\_fast.py} replaces the +brute-force $3^n$-iteration with direct construction of the +$2^n + 2(-1)^n$ proper edge $3$-colorings of $C_n$. Speedups +benchmarked against the slow version: +\begin{itemize} + \item $n = 12$: 0.001s vs 0.21s -- $\sim 146\times$ + \item $n = 15$: 0.013s vs 5.4s -- $\sim 424\times$ + \item $n = 18$: 0.11s vs (extrapolated) $\sim 150$s + \item $n = 24$: 6.6s vs (extrapolated) $\sim 30$ hours +\end{itemize} +Total wall time for the $k = 9$ block: a few seconds; $k = 12$ block: +$\sim 4$ minutes (dominated by the single SR-vs-SP case at $n = 24$). + +\section*{Caveats} + +\begin{enumerate} +\item \textbf{Still finite, still not a proof.} $46$ pairs is still + a small slice. Larger $k$ ($\geq 15$) or unusual chord + configurations could harbour a counterexample. The conjecture + above suggests there is no counterexample, but is unproven. +\item \textbf{Multi-tire chains.} Step~2 is pairwise compatibility. + A long nested chain of SP tires requires pairwise overlap at + each shared cycle \emph{plus} mutual consistency across all + shared cycles simultaneously. The Latin-style conjecture, if + true, would imply chain-wide consistency via a common + Latin coloring of all annular faces at once. +\item \textbf{Model still SP/SR only.} Intermediate + sub-triangulations (some Steiner vertices, some not) are not + enumerated. +\item \textbf{Chord set space is sampled, not enumerated.} Each $k$ + has many distinct chord matchings; this experiment uses only + one or two per $k$. More exhaustive enumeration could + strengthen the empirical evidence. +\end{enumerate} + +\end{document}