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:
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)
|
||||||
@@ -25,13 +25,17 @@
|
|||||||
\newlabel{def:tire-annular-face-connector}{{1.16}{9}}
|
\newlabel{def:tire-annular-face-connector}{{1.16}{9}}
|
||||||
\newlabel{def:spokes}{{1.17}{9}}
|
\newlabel{def:spokes}{{1.17}{9}}
|
||||||
\newlabel{rem:facial-dual-spoke-only}{{1.18}{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}
|
\bibcite{bauerfeld-pds}{1}
|
||||||
\newlabel{tocindent-1}{0pt}
|
\newlabel{tocindent-1}{0pt}
|
||||||
\newlabel{tocindent0}{12.7778pt}
|
\newlabel{tocindent0}{12.7778pt}
|
||||||
\newlabel{tocindent1}{17.77782pt}
|
\newlabel{tocindent1}{17.77782pt}
|
||||||
\newlabel{tocindent2}{0pt}
|
\newlabel{tocindent2}{0pt}
|
||||||
\newlabel{tocindent3}{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{conj:latin}{{2.1}{11}}
|
||||||
\newlabel{fig:facial-dual-choices}{{5}{10}}
|
\newlabel{conj:chain-latin}{{2.2}{11}}
|
||||||
\@writefile{toc}{\contentsline {section}{\tocsection {}{}{References}}{10}{}\protected@file@percent }
|
\@writefile{toc}{\contentsline {section}{\tocsection {}{}{References}}{11}{}\protected@file@percent }
|
||||||
\gdef \@abspage@last{10}
|
\gdef \@abspage@last{11}
|
||||||
|
|||||||
@@ -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
|
entering extended mode
|
||||||
restricted \write18 enabled.
|
restricted \write18 enabled.
|
||||||
%&-line parsing enabled.
|
%&-line parsing enabled.
|
||||||
@@ -144,26 +144,26 @@ File: l3backend-pdftex.def 2022-02-07 L3 backend support: PDF output (pdfTeX)
|
|||||||
(./paper.aux)
|
(./paper.aux)
|
||||||
\openout1 = `paper.aux'.
|
\openout1 = `paper.aux'.
|
||||||
|
|
||||||
LaTeX Font Info: Checking defaults for OML/cmm/m/it 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 26.
|
LaTeX Font Info: ... okay on input line 27.
|
||||||
LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 26.
|
LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 27.
|
||||||
LaTeX Font Info: ... okay on input line 26.
|
LaTeX Font Info: ... okay on input line 27.
|
||||||
LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 26.
|
LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 27.
|
||||||
LaTeX Font Info: ... okay on input line 26.
|
LaTeX Font Info: ... okay on input line 27.
|
||||||
LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 26.
|
LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 27.
|
||||||
LaTeX Font Info: ... okay on input line 26.
|
LaTeX Font Info: ... okay on input line 27.
|
||||||
LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 26.
|
LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 27.
|
||||||
LaTeX Font Info: ... okay on input line 26.
|
LaTeX Font Info: ... okay on input line 27.
|
||||||
LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 26.
|
LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 27.
|
||||||
LaTeX Font Info: ... okay on input line 26.
|
LaTeX Font Info: ... okay on input line 27.
|
||||||
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 26.
|
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 27.
|
||||||
LaTeX Font Info: ... okay on input line 26.
|
LaTeX Font Info: ... okay on input line 27.
|
||||||
LaTeX Font Info: Trying to load font information for U+msa on input line 26.
|
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
|
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/umsa.fd
|
||||||
File: umsa.fd 2013/01/14 v3.01 AMS symbols A
|
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
|
(/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>
|
<fig_dual_depth.png, id=1, 642.8015pt x 606.265pt>
|
||||||
File: fig_dual_depth.png Graphic file (type png)
|
File: fig_dual_depth.png Graphic file (type png)
|
||||||
<use fig_dual_depth.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.
|
(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>
|
<fig_tire_example.png, id=24, 559.64081pt x 375.804pt>
|
||||||
File: fig_tire_example.png Graphic file (type png)
|
File: fig_tire_example.png Graphic file (type png)
|
||||||
<use fig_tire_example.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.
|
(pdftex.def) Requested size: 280.79956pt x 188.56097pt.
|
||||||
[3 <./fig_tire_example.png>]
|
[3 <./fig_tire_example.png>]
|
||||||
<fig_partial_tire_dual.png, id=30, 657.657pt x 546.54187pt>
|
<fig_partial_tire_dual.png, id=30, 657.657pt x 546.54187pt>
|
||||||
File: fig_partial_tire_dual.png Graphic file (type png)
|
File: fig_partial_tire_dual.png Graphic file (type png)
|
||||||
<use fig_partial_tire_dual.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.
|
(pdftex.def) Requested size: 280.79956pt x 233.36552pt.
|
||||||
<fig_partial_tire_dual_bridge.png, id=31, 780.96768pt x 522.15076pt>
|
<fig_partial_tire_dual_bridge.png, id=31, 780.96768pt x 522.15076pt>
|
||||||
File: fig_partial_tire_dual_bridge.png Graphic file (type png)
|
File: fig_partial_tire_dual_bridge.png Graphic file (type png)
|
||||||
<use fig_partial_tire_dual_bridge.png>
|
<use fig_partial_tire_dual_bridge.png>
|
||||||
Package pdftex.def Info: fig_partial_tire_dual_bridge.png used on input line 2
|
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.
|
(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>]
|
[4 <./fig_partial_tire_dual.png>] [5 <./fig_partial_tire_dual_bridge.png>]
|
||||||
[6] [7] [8]
|
[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]
|
[9]
|
||||||
<notes/fig_facial_dual_choices.png, id=56, 857.75456pt x 341.92744pt>
|
<notes/fig_facial_dual_choices.png, id=56, 857.75456pt x 341.92744pt>
|
||||||
File: notes/fig_facial_dual_choices.png Graphic file (type png)
|
File: notes/fig_facial_dual_choices.png Graphic file (type png)
|
||||||
<use notes/fig_facial_dual_choices.png>
|
<use notes/fig_facial_dual_choices.png>
|
||||||
Package pdftex.def Info: notes/fig_facial_dual_choices.png used on input line
|
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.
|
(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.
|
LaTeX Warning: There were undefined references.
|
||||||
|
|
||||||
)
|
)
|
||||||
Here is how much of TeX's memory you used:
|
Here is how much of TeX's memory you used:
|
||||||
3042 strings out of 478268
|
3052 strings out of 478268
|
||||||
43069 string characters out of 5846347
|
43205 string characters out of 5846347
|
||||||
344292 words of memory out of 5000000
|
344356 words of memory out of 5000000
|
||||||
21085 multiletter control sequences out of 15000+600000
|
21094 multiletter control sequences out of 15000+600000
|
||||||
475666 words of font info for 53 fonts, out of 8000000 for 9000
|
475834 words of font info for 54 fonts, out of 8000000 for 9000
|
||||||
1302 hyphenation exceptions out of 8191
|
1302 hyphenation exceptions out of 8191
|
||||||
69i,14n,76p,1079b,316s stack positions out of 10000i,1000n,20000p,200000b,200000s
|
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
|
</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
|
/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
|
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
|
22/texmf-dist/fonts/type1/public/amsfonts/cm/cmti8.pfb></usr/local/texlive/2022
|
||||||
/texmf-dist/fonts/type1/public/amsfonts/symbols/msam10.pfb>
|
/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt10.pfb></usr/local/texlive/2022/
|
||||||
Output written on paper.pdf (10 pages, 814471 bytes).
|
texmf-dist/fonts/type1/public/amsfonts/symbols/msam10.pfb>
|
||||||
|
Output written on paper.pdf (11 pages, 837514 bytes).
|
||||||
PDF statistics:
|
PDF statistics:
|
||||||
128 PDF objects out of 1000 (max. 8388607)
|
136 PDF objects out of 1000 (max. 8388607)
|
||||||
73 compressed objects within 1 object stream
|
78 compressed objects within 1 object stream
|
||||||
0 named destinations out of 1000 (max. 500000)
|
0 named destinations out of 1000 (max. 500000)
|
||||||
26 words of extra memory for PDF output out of 10000 (max. 10000000)
|
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{lemma}[theorem]{Lemma}
|
||||||
\newtheorem{corollary}[theorem]{Corollary}
|
\newtheorem{corollary}[theorem]{Corollary}
|
||||||
\newtheorem{proposition}[theorem]{Proposition}
|
\newtheorem{proposition}[theorem]{Proposition}
|
||||||
|
\newtheorem{conjecture}[theorem]{Conjecture}
|
||||||
|
|
||||||
\theoremstyle{definition}
|
\theoremstyle{definition}
|
||||||
\newtheorem{definition}[theorem]{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$).}
|
and face $C$ pulls in $u_4, u_5$).}
|
||||||
\end{figure}
|
\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}
|
\begin{thebibliography}{9}
|
||||||
|
|
||||||
\bibitem{bauerfeld-pds}
|
\bibitem{bauerfeld-pds}
|
||||||
|
|||||||
Reference in New Issue
Block a user