coloring_nested_tire_graphs: add Latin conjecture to paper; launch counterexample search

Adds Sec. 2 "A conjectural Latin-style substructure" with two
conjectures: (1) for tires whose every O-face has exactly 3 B_in
edges, π_D contains the Latin-flavoured subset L (where each O-face
gets a permutation of {1,2,3}); (2) adjacent tires both satisfying (1)
have compatible projections.

Adds tire_fiber_counterexample_search.py: append-log counterexample
hunt across increasing k with deduplication for resumability. Logs
to counterexample_search.log. Smoke-test data at k≤5 shows
non-all-3 SP-model artifacts produce empty intersections (the
conjecture's "exactly 3 B_in edges per face" precondition fails),
but no strict-Latin counterexample yet.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 03:26:17 -04:00
parent 030ca67afb
commit 374fca98a5
6 changed files with 2976 additions and 37 deletions
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,379 @@
"""6-hour counterexample search for the Latin-substructure conjecture.
Logic: pick a chord configuration cs1 for T1 (with B_in = γ of length k)
and a chord configuration cs2 for T2 (with B_in of length k_2), with
various m_1 (T1's B_out length) and k_2. For each (m_1, k, cs1) and
(k, k_2, cs2) pair (both SP-feasible), compute π_D(T1) and π_U(T2) on
γ; check if their intersection (forward or reverse) is empty.
Append-log: each test writes a JSON-Lines record to LOG_PATH. On
restart, we read the log to skip already-tested pairs.
Run until time budget exhausted; report counterexamples loudly.
"""
from __future__ import annotations
import json
import os
import sys
import time
from itertools import product
from pathlib import Path
import numpy as np
from tire_fiber_chords import (
d_positions_for,
u_positions_for,
compute_faces_from_chords,
)
from tire_fiber_chords_fast import (
fiber_distribution_fast,
spoke_only_fiber_distribution_fast,
projection_support_fast,
proper_cycle_colorings,
)
HERE = Path(__file__).resolve().parent
LOG_PATH = HERE / "counterexample_search.log"
def log_event(event: dict) -> None:
"""Append one JSON line to the log."""
event = dict(event) # don't mutate caller
event.setdefault('wall_time', time.time())
with open(LOG_PATH, 'a') as f:
f.write(json.dumps(event, default=str) + "\n")
f.flush()
def read_existing_keys() -> set[str]:
"""Read the log and return set of pair-keys already tested."""
keys = set()
if not LOG_PATH.exists():
return keys
with open(LOG_PATH) as f:
for line in f:
try:
ev = json.loads(line)
except json.JSONDecodeError:
continue
if ev.get('type') == 'pair' and 'key' in ev:
keys.add(ev['key'])
return keys
def make_key(gamma: int, m_1: int, ch1, model1: str, k_2: int, ch2, model2: str) -> str:
ch1_str = json.dumps(sorted([sorted(c) for c in ch1])) if ch1 else "[]"
ch2_str = json.dumps(sorted([sorted(c) for c in ch2])) if ch2 else "[]"
return f"gamma={gamma}|t1=({m_1},{ch1_str},{model1})|t2=({k_2},{ch2_str},{model2})"
def is_sp_feasible(k: int, chords) -> bool:
if not chords:
return k <= 3
faces = compute_faces_from_chords(k, chords)
return max(len(f) for f in faces) <= 3
# Hand-curated chord configurations per k. Each entry should be
# SP-feasible (every face has at most 3 B_in edges).
CHORD_CONFIGS: dict[int, list] = {
3: [[]],
# k=4: only one essentially-distinct chord modulo rotation.
4: [[(0, 2)]],
# k=5: short or long chord.
5: [[(0, 2)], [(0, 3)]],
# k=6: antipodal, or 2-chord matching.
6: [
[(0, 3)],
[(0, 2), (3, 5)],
[(1, 3), (4, 0)],
],
# k=7: needs ≥ 2 chords for all-faces-≤-3.
7: [
[(0, 2), (3, 6)],
[(0, 3), (4, 6)],
[(0, 2), (3, 5)], # outer face: edges 5,6 → size 2
[(0, 3), (3, 6)], # uses vertex 3 twice
],
# k=8.
8: [
[(0, 2), (3, 5), (6, 0)], # vertex 0 used twice
[(0, 3), (4, 7)],
[(0, 3), (3, 6)],
[(0, 2), (3, 6)],
[(0, 2), (4, 6)],
],
# k=9: 2-chord tight (faces 3,3,3) and 3-chord variants.
9: [
[(0, 3), (4, 7)],
[(0, 2), (3, 5), (6, 8)],
[(0, 2), (4, 6), (3, 7)],
[(0, 3), (3, 6), (6, 0)],
],
# k=10.
10: [
[(0, 3), (4, 7), (7, 0)],
[(0, 2), (3, 5), (6, 8), (9, 1)],
[(0, 3), (4, 7), (8, 0)],
[(0, 3), (3, 6), (6, 9), (9, 0)],
],
# k=11.
11: [
[(0, 3), (3, 6), (6, 9), (9, 0)],
[(0, 2), (3, 5), (6, 8), (9, 0)],
],
# k=12.
12: [
[(0, 3), (4, 7), (8, 11)], # tight 4-faces-of-3
[(0, 3), (3, 6), (6, 9), (9, 0)], # tight ring
[(0, 3), (4, 11), (5, 7), (8, 10)], # nested
[(0, 2), (3, 5), (6, 9), (10, 0)], # mixed
],
# k=13.
13: [
[(0, 3), (3, 6), (6, 9), (9, 12), (0, 12)],
[(0, 3), (4, 7), (8, 11), (12, 1)],
],
# k=14.
14: [
[(0, 3), (3, 6), (6, 9), (9, 12), (12, 0)],
[(0, 2), (3, 5), (6, 8), (9, 11), (12, 0)],
],
# k=15: tight ring.
15: [
[(0, 3), (3, 6), (6, 9), (9, 12), (0, 12)],
[(0, 3), (4, 7), (8, 11), (12, 14), (12, 0)],
],
# k=18: tight ring.
18: [
[(0, 3), (3, 6), (6, 9), (9, 12), (12, 15), (0, 15)],
[(0, 3), (4, 7), (8, 11), (12, 15), (16, 1)],
],
# k=21.
21: [
[(0, 3), (3, 6), (6, 9), (9, 12), (12, 15), (15, 18), (0, 18)],
],
# k=24.
24: [
[(0, 3), (3, 6), (6, 9), (9, 12), (12, 15), (15, 18), (18, 21), (0, 21)],
],
}
# Filter to SP-feasible only.
for k in list(CHORD_CONFIGS):
feasible = [cs for cs in CHORD_CONFIGS[k] if is_sp_feasible(k, cs)]
if feasible:
CHORD_CONFIGS[k] = feasible
else:
CHORD_CONFIGS[k] = []
def compute_pi_D(gamma: int, m_1: int, chords_1, model: str) -> set:
if model == 'SR':
fibers = spoke_only_fiber_distribution_fast(m_1 + gamma)
else:
fibers, _, _ = fiber_distribution_fast(m_1, gamma, chords_1)
return projection_support_fast(fibers, d_positions_for(m_1, gamma))
def compute_pi_U(gamma: int, k_2: int, chords_2, model: str) -> set:
if model == 'SR':
fibers = spoke_only_fiber_distribution_fast(gamma + k_2)
else:
fibers, _, _ = fiber_distribution_fast(gamma, k_2, chords_2)
return projection_support_fast(fibers, u_positions_for(gamma, k_2))
def test_pair(gamma, m_1, ch1, model1, k_2, ch2, model2):
"""Return result dict."""
t0 = time.time()
S1 = compute_pi_D(gamma, m_1, ch1, model1)
S2 = compute_pi_U(gamma, k_2, ch2, model2)
forward = S1 & S2
S2_rev = {s[::-1] for s in S2}
reverse = S1 & S2_rev
dt = time.time() - t0
compatible = bool(forward or reverse)
return {
'type': 'pair',
'key': make_key(gamma, m_1, ch1, model1, k_2, ch2, model2),
'gamma': gamma,
't1': {'m_1': m_1, 'chords': ch1, 'model': model1},
't2': {'k_2': k_2, 'chords': ch2, 'model': model2},
's1_size': len(S1),
's2_size': len(S2),
'fwd_size': len(forward),
'rev_size': len(reverse),
'compatible': compatible,
'time_seconds': round(dt, 3),
# Tag whether this is a "strict-Latin" pair (where the paper conjecture
# applies) -- both tires must have every O-face of exactly 3 B_in edges.
't1_all_three': has_all_three_faces(gamma, ch1) if model1 == 'SP' else None,
't2_all_three': has_all_three_faces(k_2, ch2) if model2 == 'SP' else None,
}
def estimate_cost(n: int) -> float:
"""Rough estimate of seconds to compute fiber distribution at cycle length n.
Calibrated from prior benchmarks (n=18: 0.1s; n=24: 6.6s)."""
if n <= 12:
return 0.01
return 0.001 * (2 ** (n - 12))
# Cap on cycle length to avoid memory blowup.
# At n=27: 3 * 2^26 paths × 27 bytes ≈ 5 GB.
# At n=30: would be ~40 GB.
MAX_N = 27
# Time cap on a single tire computation.
MAX_TIRE_TIME_SEC = 600 # 10 minutes max per tire
def has_all_three_faces(k: int, chords) -> bool:
"""The strict precondition of the paper's Latin conjecture:
every O-face has exactly 3 B_in edges."""
if not chords:
return k == 3
faces = compute_faces_from_chords(k, chords)
return all(len(f) == 3 for f in faces)
def add_rotations(k: int, chords):
"""Generate all cyclic rotations of a chord set on C_k (yields tuples)."""
seen = set()
for shift in range(k):
rotated = tuple(sorted([tuple(sorted([(a + shift) % k, (b + shift) % k]))
for (a, b) in chords]))
if rotated not in seen:
seen.add(rotated)
yield [list(c) for c in rotated]
def main(budget_hours: float = 6.0):
deadline = time.time() + budget_hours * 3600
log_event({'type': 'session_start', 'budget_hours': budget_hours,
'pid': os.getpid()})
already_tested = read_existing_keys()
print(f"[start] already tested: {len(already_tested)} pairs")
log_event({'type': 'startup', 'already_tested_count': len(already_tested)})
# Iterate over k values in increasing order.
k_values = sorted(CHORD_CONFIGS.keys())
m_values = [3, 6, 9, 12, 15]
k2_values = [3, 6, 9, 12, 15]
n_counterexamples = 0
n_tested = 0
n_skipped = 0
for gamma in k_values:
if time.time() >= deadline:
break
cs_list = CHORD_CONFIGS[gamma]
if not cs_list:
log_event({'type': 'k_skip_no_configs', 'gamma': gamma})
continue
# Prioritize strict-Latin (all-3-faces) configs for the conjecture test.
cs_list_sorted = sorted(cs_list, key=lambda cs: not has_all_three_faces(gamma, cs))
log_event({'type': 'k_start', 'gamma': gamma,
'n_configs': len(cs_list_sorted),
'n_all3_configs': sum(1 for cs in cs_list_sorted if has_all_three_faces(gamma, cs))})
for m_1 in m_values:
if time.time() >= deadline: break
for ch1 in cs_list_sorted:
if time.time() >= deadline: break
n_1 = m_1 + gamma
if n_1 > MAX_N:
continue
if estimate_cost(n_1) > MAX_TIRE_TIME_SEC:
continue
for k_2 in k2_values:
if time.time() >= deadline: break
cs2_list = CHORD_CONFIGS.get(k_2, [])
if not cs2_list:
continue
cs2_sorted = sorted(cs2_list, key=lambda cs: not has_all_three_faces(k_2, cs))
for ch2 in cs2_sorted:
if time.time() >= deadline: break
n_2 = gamma + k_2
if n_2 > MAX_N:
continue
if estimate_cost(n_2) > MAX_TIRE_TIME_SEC:
continue
key = make_key(gamma, m_1, ch1, 'SP', k_2, ch2, 'SP')
if key in already_tested:
n_skipped += 1
continue
budget_remaining = deadline - time.time()
# Conservative: skip if estimated cost > budget remaining.
est = estimate_cost(n_1) + estimate_cost(n_2) + 0.5
if est > budget_remaining:
log_event({'type': 'cost_skip', 'key': key,
'est_seconds': est,
'budget_remaining': budget_remaining})
continue
try:
result = test_pair(gamma, m_1, ch1, 'SP', k_2, ch2, 'SP')
except MemoryError as e:
log_event({'type': 'memory_error', 'key': key,
'error': str(e)})
continue
except Exception as e:
log_event({'type': 'exception', 'key': key,
'error': type(e).__name__ + ": " + str(e)})
continue
n_tested += 1
already_tested.add(key)
log_event(result)
if not result['compatible']:
n_counterexamples += 1
log_event({'type': 'COUNTEREXAMPLE', 'pair': result})
print(f"\n*** COUNTEREXAMPLE FOUND at γ={gamma}, "
f"T1={(m_1, ch1)}, T2={(k_2, ch2)} ***\n")
# Print periodic progress
if n_tested % 25 == 0:
elapsed = time.time() - (deadline - budget_hours * 3600)
print(f"[{elapsed/60:.1f}m] tested {n_tested}, "
f"skipped {n_skipped}, "
f"counterexamples {n_counterexamples}, "
f"current γ={gamma}")
log_event({'type': 'session_end',
'n_tested': n_tested,
'n_skipped': n_skipped,
'n_counterexamples': n_counterexamples,
'elapsed_hours': (time.time() - (deadline - budget_hours * 3600)) / 3600})
print(f"\n[done] tested {n_tested}, skipped {n_skipped}, "
f"counterexamples {n_counterexamples}")
if __name__ == '__main__':
budget = float(sys.argv[1]) if len(sys.argv) > 1 else 6.0
main(budget_hours=budget)
+8 -4
View File
@@ -25,13 +25,17 @@
\newlabel{def:tire-annular-face-connector}{{1.16}{9}}
\newlabel{def:spokes}{{1.17}{9}}
\newlabel{rem:facial-dual-spoke-only}{{1.18}{9}}
\@writefile{lof}{\contentsline {figure}{\numberline {5}{\ignorespaces The bridge case: $T'_{\mathrm {ann}} = \theta (1, 3, 3)$ has three faces $A, B, C$ in its inherited embedding, with respective vertex sets $V(A) = \{v_0, \dots , v_5\}$, $V(B) = \{v_0, v_1, v_2, v_3\}$, and $V(C) = \{v_0, v_3, v_4, v_5\}$. In the surrounding maximal planar $G$, the chord endpoints $v_0, v_3$ (the two annular faces sharing the bridge edge) have all three $G'$-edges inside $T'_{\mathrm {ann}}$, while each non-chord vertex $v_i$ ($i \in \{1, 2, 4, 5\}$) contributes one $G'$-edge to an external non-annular neighbor $u_i$. Each panel highlights $T'_{f'}$ (blue) inside $G'$: dark circles are $V(f')$, gray circles are $G'$-neighbors of $V(f')$ within $T'_{\mathrm {ann}}$, and red squares are external $G'$-neighbors $u_i$. The choice of face $f'$ controls which external neighbors $u_i$ are pulled into $T'_{f'}$ (face $A$ pulls in all four; face $B$ pulls in $u_1, u_2$ and face $C$ pulls in $u_4, u_5$).}}{10}{}\protected@file@percent }
\newlabel{fig:facial-dual-choices}{{5}{10}}
\@writefile{toc}{\contentsline {section}{\tocsection {}{2}{A conjectural Latin-style substructure}}{10}{}\protected@file@percent }
\newlabel{sec:latin-conjecture}{{2}{10}}
\bibcite{bauerfeld-pds}{1}
\newlabel{tocindent-1}{0pt}
\newlabel{tocindent0}{12.7778pt}
\newlabel{tocindent1}{17.77782pt}
\newlabel{tocindent2}{0pt}
\newlabel{tocindent3}{0pt}
\@writefile{lof}{\contentsline {figure}{\numberline {5}{\ignorespaces The bridge case: $T'_{\mathrm {ann}} = \theta (1, 3, 3)$ has three faces $A, B, C$ in its inherited embedding, with respective vertex sets $V(A) = \{v_0, \dots , v_5\}$, $V(B) = \{v_0, v_1, v_2, v_3\}$, and $V(C) = \{v_0, v_3, v_4, v_5\}$. In the surrounding maximal planar $G$, the chord endpoints $v_0, v_3$ (the two annular faces sharing the bridge edge) have all three $G'$-edges inside $T'_{\mathrm {ann}}$, while each non-chord vertex $v_i$ ($i \in \{1, 2, 4, 5\}$) contributes one $G'$-edge to an external non-annular neighbor $u_i$. Each panel highlights $T'_{f'}$ (blue) inside $G'$: dark circles are $V(f')$, gray circles are $G'$-neighbors of $V(f')$ within $T'_{\mathrm {ann}}$, and red squares are external $G'$-neighbors $u_i$. The choice of face $f'$ controls which external neighbors $u_i$ are pulled into $T'_{f'}$ (face $A$ pulls in all four; face $B$ pulls in $u_1, u_2$ and face $C$ pulls in $u_4, u_5$).}}{10}{}\protected@file@percent }
\newlabel{fig:facial-dual-choices}{{5}{10}}
\@writefile{toc}{\contentsline {section}{\tocsection {}{}{References}}{10}{}\protected@file@percent }
\gdef \@abspage@last{10}
\newlabel{conj:latin}{{2.1}{11}}
\newlabel{conj:chain-latin}{{2.2}{11}}
\@writefile{toc}{\contentsline {section}{\tocsection {}{}{References}}{11}{}\protected@file@percent }
\gdef \@abspage@last{11}
+46 -33
View File
@@ -1,4 +1,4 @@
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 25 MAY 2026 23:14
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 26 MAY 2026 03:16
entering extended mode
restricted \write18 enabled.
%&-line parsing enabled.
@@ -144,26 +144,26 @@ File: l3backend-pdftex.def 2022-02-07 L3 backend support: PDF output (pdfTeX)
(./paper.aux)
\openout1 = `paper.aux'.
LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 26.
LaTeX Font Info: ... okay on input line 26.
LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 26.
LaTeX Font Info: ... okay on input line 26.
LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 26.
LaTeX Font Info: ... okay on input line 26.
LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 26.
LaTeX Font Info: ... okay on input line 26.
LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 26.
LaTeX Font Info: ... okay on input line 26.
LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 26.
LaTeX Font Info: ... okay on input line 26.
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 26.
LaTeX Font Info: ... okay on input line 26.
LaTeX Font Info: Trying to load font information for U+msa on input line 26.
LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 27.
LaTeX Font Info: ... okay on input line 27.
LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 27.
LaTeX Font Info: ... okay on input line 27.
LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 27.
LaTeX Font Info: ... okay on input line 27.
LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 27.
LaTeX Font Info: ... okay on input line 27.
LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 27.
LaTeX Font Info: ... okay on input line 27.
LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 27.
LaTeX Font Info: ... okay on input line 27.
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 27.
LaTeX Font Info: ... okay on input line 27.
LaTeX Font Info: Trying to load font information for U+msa on input line 27.
(/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 26.
LaTeX Font Info: Trying to load font information for U+msb on input line 27.
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/umsb.fd
@@ -194,7 +194,7 @@ e
<fig_dual_depth.png, id=1, 642.8015pt x 606.265pt>
File: fig_dual_depth.png Graphic file (type png)
<use fig_dual_depth.png>
Package pdftex.def Info: fig_dual_depth.png used on input line 106.
Package pdftex.def Info: fig_dual_depth.png used on input line 107.
(pdftex.def) Requested size: 251.9989pt x 237.67276pt.
@@ -205,19 +205,19 @@ LaTeX Warning: `h' float specifier changed to `ht'.
<fig_tire_example.png, id=24, 559.64081pt x 375.804pt>
File: fig_tire_example.png Graphic file (type png)
<use fig_tire_example.png>
Package pdftex.def Info: fig_tire_example.png used on input line 160.
Package pdftex.def Info: fig_tire_example.png used on input line 161.
(pdftex.def) Requested size: 280.79956pt x 188.56097pt.
[3 <./fig_tire_example.png>]
<fig_partial_tire_dual.png, id=30, 657.657pt x 546.54187pt>
File: fig_partial_tire_dual.png Graphic file (type png)
<use fig_partial_tire_dual.png>
Package pdftex.def Info: fig_partial_tire_dual.png used on input line 225.
Package pdftex.def Info: fig_partial_tire_dual.png used on input line 226.
(pdftex.def) Requested size: 280.79956pt x 233.36552pt.
<fig_partial_tire_dual_bridge.png, id=31, 780.96768pt x 522.15076pt>
File: fig_partial_tire_dual_bridge.png Graphic file (type png)
<use fig_partial_tire_dual_bridge.png>
Package pdftex.def Info: fig_partial_tire_dual_bridge.png used on input line 2
40.
41.
(pdftex.def) Requested size: 306.0022pt x 204.59406pt.
@@ -226,26 +226,38 @@ LaTeX Warning: `h' float specifier changed to `ht'.
[4 <./fig_partial_tire_dual.png>] [5 <./fig_partial_tire_dual_bridge.png>]
[6] [7] [8]
LaTeX Warning: Reference `def:dual' on page 9 undefined on input line 575.
LaTeX Warning: Reference `def:dual' on page 9 undefined on input line 576.
[9]
<notes/fig_facial_dual_choices.png, id=56, 857.75456pt x 341.92744pt>
File: notes/fig_facial_dual_choices.png Graphic file (type png)
<use notes/fig_facial_dual_choices.png>
Package pdftex.def Info: notes/fig_facial_dual_choices.png used on input line
654.
655.
(pdftex.def) Requested size: 360.0pt x 143.50418pt.
[10 <./notes/fig_facial_dual_choices.png>] (./paper.aux)
Overfull \hbox (68.454pt too wide) detected at line 706
\OMS/cmsy/m/n/10 L\OT1/cmr/m/n/10 (\OML/cmm/m/it/10 B[]; O\OT1/cmr/m/n/10 ) :=
[] \OML/cmm/m/it/10 ^^[ \OT1/cmr/m/n/10 : \OML/cmm/m/it/10 E\OT1/cmr/m/n/10 (
\OML/cmm/m/it/10 B[]\OT1/cmr/m/n/10 ) \OMS/cmsy/m/n/10 ! f\OT1/cmr/m/n/10 1\OML
/cmm/m/it/10 ; \OT1/cmr/m/n/10 2\OML/cmm/m/it/10 ; \OT1/cmr/m/n/10 3\OMS/cmsy/m
/n/10 g [] \OML/cmm/m/it/10 ^^[[][][]\OMS/cmsy/m/n/10 f\OT1/cmr/m/n/10 1\OML/cm
m/m/it/10 ; \OT1/cmr/m/n/10 2\OML/cmm/m/it/10 ; \OT1/cmr/m/n/10 3\OMS/cmsy/m/n/
10 g[]\OML/cmm/m/it/10 f \OMS/cmsy/m/n/10 2 \OML/cmm/m/it/10 F\OT1/cmr/m/n/10 (
\OML/cmm/m/it/10 O\OT1/cmr/m/n/10 ) []\OML/cmm/m/it/10 :
[]
[10 <./notes/fig_facial_dual_choices.png>] [11] (./paper.aux)
LaTeX Warning: There were undefined references.
)
Here is how much of TeX's memory you used:
3042 strings out of 478268
43069 string characters out of 5846347
344292 words of memory out of 5000000
21085 multiletter control sequences out of 15000+600000
475666 words of font info for 53 fonts, out of 8000000 for 9000
3052 strings out of 478268
43205 string characters out of 5846347
344356 words of memory out of 5000000
21094 multiletter control sequences out of 15000+600000
475834 words of font info for 54 fonts, out of 8000000 for 9000
1302 hyphenation exceptions out of 8191
69i,14n,76p,1079b,316s stack positions out of 10000i,1000n,20000p,200000b,200000s
</usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb
@@ -263,11 +275,12 @@ ve/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy5.pfb></usr/local/texlive
/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb></usr/local/texlive/2
022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb></usr/local/texlive/20
22/texmf-dist/fonts/type1/public/amsfonts/cm/cmti8.pfb></usr/local/texlive/2022
/texmf-dist/fonts/type1/public/amsfonts/symbols/msam10.pfb>
Output written on paper.pdf (10 pages, 814471 bytes).
/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt10.pfb></usr/local/texlive/2022/
texmf-dist/fonts/type1/public/amsfonts/symbols/msam10.pfb>
Output written on paper.pdf (11 pages, 837514 bytes).
PDF statistics:
128 PDF objects out of 1000 (max. 8388607)
73 compressed objects within 1 object stream
136 PDF objects out of 1000 (max. 8388607)
78 compressed objects within 1 object stream
0 named destinations out of 1000 (max. 500000)
26 words of extra memory for PDF output out of 10000 (max. 10000000)
Binary file not shown.
@@ -12,6 +12,7 @@
\newtheorem{lemma}[theorem]{Lemma}
\newtheorem{corollary}[theorem]{Corollary}
\newtheorem{proposition}[theorem]{Proposition}
\newtheorem{conjecture}[theorem]{Conjecture}
\theoremstyle{definition}
\newtheorem{definition}[theorem]{Definition}
@@ -669,6 +670,88 @@ $T'_{f'}$ (face $A$ pulls in all four; face $B$ pulls in $u_1, u_2$
and face $C$ pulls in $u_4, u_5$).}
\end{figure}
\section{A conjectural Latin-style substructure}
\label{sec:latin-conjecture}
Empirical enumeration (notes \texttt{tire\_fiber\_data.tex},
\texttt{tire\_fiber\_chords.tex}, \texttt{tire\_fiber\_step2.tex},
\texttt{tire\_fiber\_step2\_large.tex}) of edge $3$-coloring
distributions on the tire annular face connector $T'_{f'}$ across
$46$ adjacent-tire pairs at $|\gamma| \in \{3, 4, 5, 6, 9, 12\}$
suggests that the chain-pigeonhole step on a shared cycle always
succeeds. The data points to a structural mechanism: every
edge-$3$-colourable tire admits at least one ``Latin-flavoured''
boundary configuration, and adjacent tires share this same
substructure on their common cycle.
Concretely, fix a tire $T$ with inner outerplanar graph $O$ on $V(B_{\mathrm{in}})$
and let $F(O)$ be the set of $O$-faces (in the tire's plane embedding,
not counting the outer face $B_{\mathrm{in}}$). For each $O$-face
$f \in F(O)$, let $E_{\mathrm{in}}(f) \subseteq E(B_{\mathrm{in}})$
denote the set of $B_{\mathrm{in}}$ edges on $f$'s boundary. In the
Steiner-poor surrounding triangulation (where each $O$-face is a
single face of $G$ and dualises to a single $G'$-vertex of degree
$|E_{\mathrm{in}}(f)|$ in $T'_{f'}$), proper edge $3$-colouring of
$T'_{f'}$ requires every $O$-face to have $|E_{\mathrm{in}}(f)| \leq 3$.
Let $\sigma_{B_{\mathrm{in}}}$ denote the spoke colouring restricted to
the $|V(B_{\mathrm{in}})|$ inner-direction spoke positions on the dual
annular cycle (equivalently: $\sigma$ indexed by $E(B_{\mathrm{in}})$).
Define the \emph{Latin-flavoured set} on $\gamma = B_{\mathrm{in}}$ as
\[
\mathcal{L}(B_{\mathrm{in}}, O)
\;:=\; \bigl\{\,\sigma : E(B_{\mathrm{in}}) \to \{1,2,3\}
\;\big|\; \sigma\bigl|_{E_{\mathrm{in}}(f)}\text{ is a permutation
of }\{1,2,3\}\text{ for every } f \in F(O)\,\bigr\}.
\]
That is, on every $O$-face's $B_{\mathrm{in}}$-edge boundary, all three
colours appear exactly once (forcing $|E_{\mathrm{in}}(f)| = 3$ for
each face --- the maximally constrained case).
\begin{conjecture}[Latin-substructure conjecture]
\label{conj:latin}
For any Steiner-poor edge-$3$-colourable tire $T$ with inner
outerplanar graph $O$ such that every $O$-face has exactly $3$
$B_{\mathrm{in}}$-edges, the realisable inner-spoke projection
$\pi_D(\mathcal{C}(T'_{f'}))$ contains $\mathcal{L}(B_{\mathrm{in}}, O)$
as a subset. Moreover, $\mathcal{L}(B_{\mathrm{in}}, O)$ is invariant
under the $S_3$ action on colours and has size at least $3! = 6$.
\end{conjecture}
\begin{conjecture}[Chain-pigeonhole compatibility from Latin substructure]
\label{conj:chain-latin}
Adjacent tires $T_1, T_2$ sharing a cycle $\gamma$ admit a joint
edge $3$-colouring whenever their respective inner-outerplanar
structures $O^{(1)}, O^{(2)}$ both satisfy
Conjecture~\ref{conj:latin}. Equivalently:
$\pi_D^{(1)}(\mathcal{C}(T_1)) \cap \pi_U^{(2)}(\mathcal{C}(T_2))
\supseteq \mathcal{L}(\gamma, O^{(1)}) \cap \mathcal{L}(\gamma,
O^{(2)})$, and this last intersection is non-empty whenever the two
face partitions of $E(\gamma)$ induced by $O^{(1)}, O^{(2)}$ share a
common ``Latin completion.''
\end{conjecture}
The structural origin of these conjectures is the empirical
observation that the smallest tested intersections on $\gamma$ are
always exactly the $3!$ permutations of a single canonical pattern
in which each $O$-face on $\gamma$'s side receives a permutation of
$\{1,2,3\}$. For example, at $|\gamma| = 12$ with $O^{(1)}$ given by
the chord matching $\{(0,3),(4,7),(8,11)\}$ (face structure $\{0,1,2\}
\sqcup \{4,5,6\} \sqcup \{8,9,10\} \sqcup \{3,7,11\}$), the canonical
pattern $(1,2,3,2,2,1,3,3,2,3,1,1)$ assigns the permutation $(1,2,3)$
to the first face, $(2,1,3)$ to the second, $(2,3,1)$ to the third,
and $(2,3,1)$ to the fourth. Every face receives all three colours.
A proof of Conjecture~\ref{conj:latin} would convert the
chain-pigeonhole compatibility step into a structural theorem on
$T'_{f'}$: it is not the rough abundance of valid spoke configurations
that lets adjacent tires meet, but a specific Latin-square-flavoured
substructure dictated by the face partition of each tire's inner
outerplanar graph. See \texttt{notes/tire\_fiber\_step2\_large.tex}
for the data underlying this conjecture and
\texttt{experiments/tire\_fiber\_counterexample\_search.log} for the
ongoing automated search.
\begin{thebibliography}{9}
\bibitem{bauerfeld-pds}