diff --git a/papers/coloring_nested_tire_graphs/notes/draw_outer_triangle_absorption.py b/papers/coloring_nested_tire_graphs/notes/draw_outer_triangle_absorption.py new file mode 100644 index 0000000..1e06b70 --- /dev/null +++ b/papers/coloring_nested_tire_graphs/notes/draw_outer_triangle_absorption.py @@ -0,0 +1,220 @@ +"""Figures for the 'outer triangle absorption' note. + +Three panels: + A. A closed PDS chain (concentric levels around source, ending at + outer triangle). + B. The outer-triangle constraint in G': dual vertex of degree 3 + forces the 3 incident edges to have distinct colours. + C. The state-size trajectory across the chain showing the + 'absorption' to size 6. +""" +import math +import os +import matplotlib.pyplot as plt +from matplotlib.patches import Polygon, FancyArrowPatch +import matplotlib.patches as patches + +HERE = os.path.dirname(os.path.abspath(__file__)) + + +def ring(n, r, phase=math.pi / 2): + return [(r * math.cos(phase + 2 * math.pi * i / n), + r * math.sin(phase + 2 * math.pi * i / n)) + for i in range(n)] + + +# ----------------------------------------------------------------- +# Panel A: the closed PDS chain (5, 6, 5, 3) — concentric layers +# ----------------------------------------------------------------- +def panel_A(ax): + radii = [0.0, 0.9, 1.7, 2.5, 3.4] + sizes = [1, 5, 6, 5, 3] # L_0, L_1, L_2, L_3, L_4 + rings = [None] + [ring(sizes[i], radii[i]) for i in range(1, 5)] + + # Source vertex + ax.plot(0, 0, 'o', color='#333', markersize=10, zorder=5) + ax.annotate("$L_0$ (source)", (0, 0), xytext=(0.3, 0.15), + fontsize=9, color='#333') + + colors = ['#1f77b4', '#2ca02c', '#d62728', '#9467bd'] + labels = [r'$L_1$ ($|L_1|=5$)', r'$L_2$ ($|L_2|=6$)', + r'$L_3$ ($|L_3|=5$)', r'$L_4$ (outer triangle, $|L_4|=3$)'] + + # Draw the level cycles + for i, (pts, color, label) in enumerate(zip(rings[1:], colors, labels)): + for j in range(len(pts)): + x1, y1 = pts[j] + x2, y2 = pts[(j + 1) % len(pts)] + ax.plot([x1, x2], [y1, y2], color=color, linewidth=2.5, zorder=3) + for (x, y) in pts: + ax.plot(x, y, 'o', color=color, markersize=7, zorder=4) + ax.annotate(label, + xy=(0, radii[i + 1] + 0.05), + fontsize=9, color=color, + ha='center', va='bottom') + + # Draw the annular triangulation between consecutive levels + # (simple even spacing — not geometrically faithful to a real PDS, + # just illustrative). + for i in range(4): + inner_pts = rings[i] if rings[i] else [(0, 0)] * sizes[i + 1] + # For L_0 the apex is at the origin — replicate per outer point + outer_pts = rings[i + 1] + m_in = len(inner_pts) + m_out = len(outer_pts) + if m_in == 1: + # All outer points connected to apex + for (x, y) in outer_pts: + ax.plot([0, x], [0, y], color='#aaa', linewidth=0.6, zorder=1) + else: + # Zig-zag triangulation: each outer to its "nearest" inner + # by angle. This is rough; just for illustration. + angles_in = [(math.atan2(y, x), j) for j, (x, y) in enumerate(inner_pts)] + for (xo, yo) in outer_pts: + ao = math.atan2(yo, xo) + # Find 2 nearest inner points by angle + diffs = sorted(((abs((a - ao + math.pi) % (2 * math.pi) - math.pi), j) + for a, j in angles_in)) + for _, j in diffs[:2]: + xi, yi = inner_pts[j] + ax.plot([xo, xi], [yo, yi], color='#aaa', linewidth=0.6, zorder=1) + + # Annotate tires (annular regions between consecutive levels) + tire_labels = [ + ("$T_1$\n(apex)", 0.45, 0), + ("$T_2$", 1.3, 0), + ("$T_3$", 2.1, 0), + ("$T_4$ (outer)", 2.95, 0), + ] + for lbl, x, y in tire_labels: + ax.text(x, y, lbl, fontsize=8, color='#555', + ha='center', va='center', + bbox=dict(boxstyle='round,pad=0.18', facecolor='white', + edgecolor='none', alpha=0.7)) + + ax.set_xlim(-3.8, 3.8) + ax.set_ylim(-3.8, 3.8) + ax.set_aspect('equal') + ax.axis('off') + ax.set_title(r"(A) Closed PDS chain: $L_0$ (source) $\to L_4$ (outer triangle)", + fontsize=10) + + +# ----------------------------------------------------------------- +# Panel B: the outer-triangle constraint in G' +# ----------------------------------------------------------------- +def panel_B(ax): + # Outer triangle vertices in G + pts = [(math.cos(math.pi/2 + 2*math.pi*i/3), + math.sin(math.pi/2 + 2*math.pi*i/3)) for i in range(3)] + # Outer face's dual vertex (outside the triangle) + outer_dual = (0, 1.9) + # Each outer triangle edge has a midpoint that connects to outer_dual + # in G'. + + # Draw the outer triangle (in G) + for i in range(3): + x1, y1 = pts[i] + x2, y2 = pts[(i + 1) % 3] + ax.plot([x1, x2], [y1, y2], color='#9467bd', linewidth=2.5, zorder=3) + for (x, y) in pts: + ax.plot(x, y, 'o', color='#9467bd', markersize=9, zorder=4) + + # Edge midpoints (these are 'duals' of the edges, in some sense) + mids = [] + for i in range(3): + x1, y1 = pts[i] + x2, y2 = pts[(i + 1) % 3] + mids.append(((x1 + x2) / 2, (y1 + y2) / 2)) + + # Inside the triangle: the annular face dual of T_n on each edge + # (a single G'-vertex per outer edge, one of T_n's annular face duals). + inside_pts = [(0.5 * mx, 0.5 * my - 0.05) for (mx, my) in mids] + + # Outer face dual vertex (above the triangle, on G' side) + ax.plot(outer_dual[0], outer_dual[1], 's', color='#d62728', + markersize=18, zorder=4) + ax.annotate("outer face\ndual vertex", outer_dual, + xytext=(outer_dual[0] - 1.7, outer_dual[1] + 0.1), + fontsize=9, color='#d62728', + arrowprops=dict(arrowstyle='->', color='#d62728', lw=1.0)) + + # Three G'-edges from outer face dual to inside (each crossing an outer-triangle edge) + g_prime_colors = ['#d62728', '#1f77b4', '#2ca02c'] # R, B, G — the three colors + for k, (mx, my) in enumerate(mids): + # Curve from outer_dual through this midpoint to inside_pts[k] + ix, iy = inside_pts[k] + ax.plot([outer_dual[0], mx], [outer_dual[1], my], + color=g_prime_colors[k], linewidth=2.2, zorder=2, + linestyle='--') + ax.plot([mx, ix], [my, iy], + color=g_prime_colors[k], linewidth=2.2, zorder=2, + linestyle='--') + ax.plot(ix, iy, 'o', color='#888', markersize=8, zorder=3) + + # Annotate the inside vertices (T_n annular face duals) + ax.text(0, -0.55, r"$T_n$'s annular face duals", fontsize=8, color='#555', + ha='center') + + # Annotate the constraint + ax.text(0, 2.6, "outer face dual has 3 incident\n" + "$G'$-edges → all 3 colours distinct", + fontsize=9, ha='center', va='bottom', + color='#d62728') + + ax.set_xlim(-2.3, 2.3) + ax.set_ylim(-1.3, 3.1) + ax.set_aspect('equal') + ax.axis('off') + ax.set_title(r"(B) Outer-triangle dual constraint forces $\sigma|_{L_n}$ to be a permutation", + fontsize=10) + + +# ----------------------------------------------------------------- +# Panel C: state-size trajectory +# ----------------------------------------------------------------- +def panel_C(ax): + # Example trajectory from the experiment (7-tire chain) + chain_labels = [r"$L_1$", r"$L_2$", r"$L_3$", r"$L_4$", + r"$L_5$", r"$L_6$", r"$L_7$"] + traj = [63, 783, 9993, 14643, 1641, 60, 6] + xs = list(range(len(traj))) + ax.plot(xs, traj, 'o-', color='#1f3f70', linewidth=2, markersize=8) + # Annotate each value + for x, v in zip(xs, traj): + ax.annotate(str(v), (x, v), + textcoords="offset points", xytext=(0, 9), + ha='center', fontsize=8, color='#1f3f70') + ax.set_yscale('log') + ax.set_xticks(xs) + ax.set_xticklabels(chain_labels) + ax.set_xlabel("shared cycle (level)") + ax.set_ylabel("state size (log scale)") + ax.grid(True, alpha=0.3, axis='y') + ax.set_title(r"(C) State trajectory: chain (6,1)$|$(8,6)$|$(10,8)$|$(10,10)$|$(8,10)$|$(5,8)$|$(3,5)", + fontsize=10) + # Annotate the "absorption" at the last step + ax.annotate("absorption to\n6 permutations\nof $\\{1,2,3\\}$", + xy=(6, 6), xytext=(4.5, 30), + fontsize=9, color='#d62728', + arrowprops=dict(arrowstyle='->', color='#d62728', lw=1.2)) + + +def main(): + fig = plt.figure(figsize=(15.5, 5.5)) + gs = fig.add_gridspec(1, 3, width_ratios=[1.0, 1.0, 1.2]) + ax_A = fig.add_subplot(gs[0, 0]) + ax_B = fig.add_subplot(gs[0, 1]) + ax_C = fig.add_subplot(gs[0, 2]) + panel_A(ax_A) + panel_B(ax_B) + panel_C(ax_C) + plt.tight_layout() + out = os.path.join(HERE, 'fig_outer_triangle_absorption.png') + plt.savefig(out, dpi=160, bbox_inches='tight') + plt.close() + print(f"wrote {out}") + + +if __name__ == '__main__': + main() diff --git a/papers/coloring_nested_tire_graphs/notes/fig_outer_triangle_absorption.png b/papers/coloring_nested_tire_graphs/notes/fig_outer_triangle_absorption.png new file mode 100644 index 0000000..08b28c2 Binary files /dev/null and b/papers/coloring_nested_tire_graphs/notes/fig_outer_triangle_absorption.png differ diff --git a/papers/coloring_nested_tire_graphs/notes/outer_triangle_absorption.aux b/papers/coloring_nested_tire_graphs/notes/outer_triangle_absorption.aux new file mode 100644 index 0000000..0fbf828 --- /dev/null +++ b/papers/coloring_nested_tire_graphs/notes/outer_triangle_absorption.aux @@ -0,0 +1,6 @@ +\relax +\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces (A) A representative closed PDS chain on a triangulated disk: source $L_0$, level cycles $L_1, L_2, L_3, L_4$ with sizes $5, 6, 5, 3$. Tires $T_1, T_2, T_3, T_4$ are the annular regions between consecutive levels. (B) The outer triangle's contribution in $G'$: the outer face of $G$ becomes a single $G'$-vertex of degree $3$. Proper edge $3$-colouring requires its three incident $G'$-edges (the duals of the three outer-triangle edges) to be distinct. So $\sigma |_{L_n}$ must be a permutation of $\{1,2,3\}$. (C) State trajectory for the chain $(6, 1) | (8, 6) | (10, 8) | (10, 10) | (8, 10) | (5, 8) | (3, 5)$: state grows where cycles are widest and \emph {collapses to exactly $6$ at the outer triangle}.\relax }}{2}{}\protected@file@percent } +\providecommand*\caption@xref[2]{\@setref\relax\@undefined{#1}} +\newlabel{fig:absorption}{{1}{2}} +\newlabel{conj:absorption-local}{{}{3}} +\gdef \@abspage@last{4} diff --git a/papers/coloring_nested_tire_graphs/notes/outer_triangle_absorption.log b/papers/coloring_nested_tire_graphs/notes/outer_triangle_absorption.log new file mode 100644 index 0000000..0aa9cbb --- /dev/null +++ b/papers/coloring_nested_tire_graphs/notes/outer_triangle_absorption.log @@ -0,0 +1,313 @@ +This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 26 MAY 2026 12:31 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**outer_triangle_absorption.tex +(./outer_triangle_absorption.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/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=\dimen158 +\captionmargin=\dimen159 +\caption@leftmargin=\dimen160 +\caption@rightmargin=\dimen161 +\caption@width=\dimen162 +\caption@indent=\dimen163 +\caption@parindent=\dimen164 +\caption@hangindent=\dimen165 +Package caption Info: Standard document class detected. +) +\c@caption@flags=\count274 +\c@continuedfloat=\count275 +) +(/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=\count276 +\l__pdf_internal_box=\box52 +) +(./outer_triangle_absorption.aux) +\openout1 = `outer_triangle_absorption.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=\count277 +\scratchdimen=\dimen166 +\scratchbox=\box53 +\nofMPsegments=\count278 +\nofMParguments=\count279 +\everyMPshowfont=\toks29 +\MPscratchCnt=\count280 +\MPscratchDim=\dimen167 +\MPnumerator=\count281 +\makeMPintoPDFobject=\count282 +\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 (43.46935pt too wide) in paragraph at lines 38--41 +[]\OT1/cmr/m/n/10.95 Step 3 (chain-wide con-sis-tency for open chains): held in + ev-ery tested case in \OT1/cmtt/m/n/10.95 sr[]chain[]consistency.py\OT1/cmr/m/ +n/10.95 , + [] + + +File: fig_outer_triangle_absorption.png Graphic file (type png) + +Package pdftex.def Info: fig_outer_triangle_absorption.png used on input line +71. +(pdftex.def) Requested size: 469.75502pt x 163.95451pt. + +LaTeX Warning: `h' float specifier changed to `ht'. + +[1 + +{/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] +[2 <./fig_outer_triangle_absorption.png>] [3] [4] +(./outer_triangle_absorption.aux) ) +Here is how much of TeX's memory you used: + 4510 strings out of 478268 + 73204 string characters out of 5846347 + 370630 words of memory out of 5000000 + 22693 multiletter control sequences out of 15000+600000 + 479218 words of font info for 67 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 55i,7n,63p,874b,352s stack positions out of 10000i,1000n,20000p,200000b,200000s +{/usr/local/texlive/2022/texmf-dist/fonts/en +c/dvips/cm-super/cm-super-ts1.enc} +Output written on outer_triangle_absorption.pdf (4 pages, 344652 bytes). +PDF statistics: + 91 PDF objects out of 1000 (max. 8388607) + 54 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 6 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/papers/coloring_nested_tire_graphs/notes/outer_triangle_absorption.pdf b/papers/coloring_nested_tire_graphs/notes/outer_triangle_absorption.pdf new file mode 100644 index 0000000..a8679eb Binary files /dev/null and b/papers/coloring_nested_tire_graphs/notes/outer_triangle_absorption.pdf differ diff --git a/papers/coloring_nested_tire_graphs/notes/outer_triangle_absorption.tex b/papers/coloring_nested_tire_graphs/notes/outer_triangle_absorption.tex new file mode 100644 index 0000000..4f77e38 --- /dev/null +++ b/papers/coloring_nested_tire_graphs/notes/outer_triangle_absorption.tex @@ -0,0 +1,243 @@ +\documentclass[11pt]{article} +\usepackage{amsmath,amssymb,amsthm} +\usepackage{graphicx} +\usepackage{geometry} +\usepackage{caption} +\geometry{margin=1in} + +\title{Closed PDS chains under SR:\\ + outer-triangle absorption and the chain-pigeonhole conclusion} +\author{} +\date{} + +\newtheorem*{obs}{Observation} +\newtheorem*{conj}{Conjecture} + +\begin{document} +\maketitle + +\section*{What this note records} + +This is the experimental record of the SR + PDS closed-chain +experiment that followed the realisation (from +\texttt{tire\_fiber\_chunked.py} and \texttt{sr\_chain\_consistency.py}) +that the Steiner-poor (SP) model with chord-on-$O$ constraints is +not the right setting for PDS-decomposed maximal planar graphs. In +the correct SR setting, each $\gamma$-edge has its own inner-spoke +pendant, and the chord-induced face structure of $O$ does not enter +$T'_{f'}$ directly. Under this regime: + +\begin{itemize} + \item Step 1 (saturation) gives $\pi_D$ on the long-side saturates + $\{1,2,3\}^k$ when $m \geq k$ (proven empirically up to + $k = 12$ in \texttt{tire\_fiber\_data.tex}; conjectured in + general). + \item Step 2 (pairwise chain compatibility) is automatic from + step 1 whenever PDS grows outward ($m_1 \geq |\gamma|$ in + each adjacent tire's outer-side). + \item Step 3 (chain-wide consistency for open chains): held in + every tested case in \texttt{sr\_chain\_consistency.py}, + with forward state size growing monotonically. +\end{itemize} + +The remaining concern was the \textbf{boundary} of the chain. A PDS +on a planar triangulated disk has two ends: + +\begin{itemize} + \item Innermost: $L_0$ a single source vertex (degenerate $B_{\text{in}}$ + for $T_1$). No constraint on $\sigma$ at $L_0$. + \item Outermost: $L_n$ the boundary of the outer face of $G$. In + the standard reduction (Birkhoff: minimal counterexample is + internally $6$-connected, hence the outer face is a triangle), + $L_n$ is a $3$-cycle. Its dual constraint forces $\sigma$ at + $L_n$ to be a permutation of $\{1,2,3\}$. +\end{itemize} + +\section*{The closed-chain experiment} + +Script: \texttt{experiments/sr\_closed\_chain.py}. Output: +\texttt{experiments/sr\_closed\_chain\_data.txt}. + +We forward-propagate state through a tire chain $T_1 | T_2 | \dots | +T_n$ with $T_1$'s $B_{\text{in}}$ degenerate (the source vertex) and +$T_n$'s $B_{\text{out}}$ being the outer triangle of length $3$. +Each tire is SR (no chord constraints) and the chain shape (the +sequence of level-cycle sizes) is varied. At each step, the state +is the set of $\sigma$-patterns realisable on the current shared +cycle. + +\begin{figure}[h] +\centering +\includegraphics[width=\textwidth]{fig_outer_triangle_absorption.png} +\caption{(A) A representative closed PDS chain on a triangulated +disk: source $L_0$, level cycles $L_1, L_2, L_3, L_4$ with sizes +$5, 6, 5, 3$. Tires $T_1, T_2, T_3, T_4$ are the annular regions +between consecutive levels. (B) The outer triangle's contribution +in $G'$: the outer face of $G$ becomes a single $G'$-vertex of +degree $3$. Proper edge $3$-colouring requires its three incident +$G'$-edges (the duals of the three outer-triangle edges) to be +distinct. So $\sigma|_{L_n}$ must be a permutation of $\{1,2,3\}$. +(C) State trajectory for the chain +$(6, 1) | (8, 6) | (10, 8) | (10, 10) | (8, 10) | (5, 8) | (3, 5)$: +state grows where cycles are widest and \emph{collapses to exactly +$6$ at the outer triangle}.} +\label{fig:absorption} +\end{figure} + +\section*{Results} + +Across all $10$ tested chains (source degrees $5, 6, 7$; chain +lengths $4$ to $7$; various growth/shrink shapes; outer triangle +fixed at size $3$): + +\begin{itemize} + \item Every chain is consistent (state never empties). + \item In every chain, the final state at $L_n$ has size + \textbf{exactly $6$}, with all $6$ elements being the + permutations of $\{1, 2, 3\}$ on the $3$ outer-triangle edges. + \item The outer-face dual-vertex constraint (degree $3$, distinct + colours) is satisfied automatically. +\end{itemize} + +Sample trajectories: + +\begin{center} +\small +\begin{tabular}{l l} +chain & state sizes \\ \hline +$(5,1) | (6,5) | (5,6) | (3,5)$ & $30 \to 132 \to 60 \to 6$ \\ +$(5,1) | (7,5) | (5,7) | (3,5)$ & $30 \to 312 \to 60 \to 6$ \\ +$(5,1) | (8,5) | (8,8) | (5,8) | (3,5)$ & $30 \to 708 \to 1476 \to 60 \to 6$ \\ +$(6,1) | (9,6) | (8,9) | (5,8) | (3,5)$ & $63 \to 1836 \to 1623 \to 60 \to 6$ \\ +$(6,1) | (8,6) | (10,8) | (10,10) | (8,10) | (5,8) | (3,5)$ & $63 \to 783 \to 9993 \to 14643 \to 1641 \to 60 \to 6$ \\ +$(7,1) | (9,7) | (7,9) | (3,7)$ & $126 \to 2130 \to 546 \to 6$ \\ +\end{tabular} +\end{center} + +\section*{What ``outer triangle absorption'' means} + +The empirical pattern is striking: the final state is always exactly +$6$, and those $6$ are exactly the permutations of $\{1,2,3\}$. But +this could be one of two distinct things: + +\begin{description} + \item[(H1) Chain-dependent absorption.] + The state \emph{before} $T_n$ depends on the chain, but every + such state happens to filter through $T_n$ to the same + $6$-element set. In this case the chain-pigeonhole step is + non-trivial: it succeeds in feeding $T_n$ with the right + kind of input. + \item[(H2) $T_n$-only absorption.] + $T_n$ (the outer tire with $m_n = 3$) has the property that + its $\sigma_U$-support is intrinsically the $6$ permutations + of $\{1, 2, 3\}$, \emph{regardless} of what state is fed to + its $\sigma_D$-side. In this case the absorption is a local + property of $T_n$ alone, and the chain-consistency before + $T_n$ contributes nothing. +\end{description} + +These two are testable empirically: under (H1), feeding $T_n$ an +unrelated or random $\sigma_D$ state should not always give $6$ +permutations; under (H2), the output is always $6$ permutations +regardless of input. + +\begin{conj}[$T_n$-absorption is local] +\label{conj:absorption-local} +For any tire $T_n$ with $m_n = 3$ and $k_n \geq 3$, the $\sigma_U$ +projection of $T_n$'s joint support equals exactly the $S_3$-orbit +of $(1, 2, 3)$ on the $3$ outer-spoke positions. Equivalently: +every proper edge $3$-colouring of $C_{n_n}$, when restricted to the +$3$ U-positions, gives a permutation of $\{1, 2, 3\}$. +\end{conj} + +If the conjecture holds, the closed-chain pattern is partly +\emph{trivial}: the outer tire takes care of itself. The non-trivial +content of the chain consistency lives in (a) chain non-emptiness +(state never collapses) and (b) the final state's intersection with +the $6$-element target being non-empty. + +Under (H1), in contrast, the chain-pigeonhole is doing real work, +threading the input to $T_n$ through a specific structure that the +chain enforces. + +\section*{Why this matters for 4CT} + +A proof of 4CT via this approach would have four ingredients: + +\begin{enumerate} + \item \textbf{PDS exists}: Bauerfeld's PDS gives a tire + decomposition of every maximal planar $G$ from a level + source. + \item \textbf{SR is correct}: for $G$ a triangulation with + sufficient connectivity (Birkhoff: internally $6$-connected), + the SR model accurately describes $T'_{f'}$ at each tire. + (This is what makes the chord-on-$O$ artifacts go away.) + \item \textbf{Open-chain compatibility}: at every shared $\gamma$, + $\pi_D$ from the outer tire saturates $\{1,2,3\}^\gamma$, so + every $\sigma$ from the inner tire admits a continuation. + (Step-1 saturation + outward PDS.) + \item \textbf{Closed-chain compatibility}: the forward-propagated + state at the outer triangle contains a permutation of + $\{1,2,3\}$. Empirically yes, in all tested cases. +\end{enumerate} + +Items 1 and 2 are structural and depend on the PDS/Birkhoff theory. +Item 3 is step-1 saturation. Item 4 is what this note's experiment +addresses, with the data above. + +If Conjecture~\ref{conj:absorption-local} is true, item 4 is automatic +from local structure of $T_n$. Combined with item 3 (chain +non-emptiness), the whole pigeonhole story closes for any PDS chain +ending at an outer triangle. + +If Conjecture~\ref{conj:absorption-local} is false, item 4 still +holds empirically but for a genuinely chain-dependent reason: the +chain-pigeonhole does real structural work. Either resolution would +be informative. + +\section*{What's next} + +\begin{enumerate} + \item \textbf{Test the absorption conjecture directly.} Take a + tire $T_n = (m=3, k)$ for varying $k$ and check whether its + $\sigma_U$-projection equals exactly the $6$ permutations of + $\{1,2,3\}$. This is a single-tire computation, fast. + \item \textbf{Exhaustive chain enumeration.} The $10$ tested + chains are representative but not exhaustive. Generate all + valid PDS-shape chains of bounded length (e.g., $\leq 8$ + tires, $\leq 12$ max cycle size) and run forward propagation + on each. Any chain where state collapses to $\emptyset$ + before $T_n$, or where the final $L_n$ state misses some + permutation, would be a real counterexample. + \item \textbf{Connect to PDS in actual $G$.} Verify that for an + internally $6$-connected $G$, every PDS from any source gives + a chain with the right SR structure (item 2). This is the + outstanding gap to make the analysis genuinely a 4CT + argument. + \item \textbf{Symbolic proof of absorption.} If + Conjecture~\ref{conj:absorption-local} holds, prove it by + direct cycle-coloring analysis: any proper edge $3$-colouring + of $C_{m+k}$ (with $m=3$) restricted to $3$ spread positions + is a permutation. This should be elementary. +\end{enumerate} + +\section*{Caveats} + +\begin{itemize} + \item ``Outer triangle absorption'' is a name I have given to the + observed phenomenon; it is not yet a theorem. + \item The $10$ tested chains are hand-picked. An exhaustive + enumeration is warranted before claiming strong evidence. + \item The SR-is-correct claim (item 2 above) is the load-bearing + modelling assumption. It is not yet verified in the + literature in the form I am stating; tying this back to + actual PDS+G structure is the most important remaining gap. + \item The reflection-handling in + \texttt{sr\_closed\_chain.py} picks the orientation that + maximises forward state at each step. In a real $G$ with a + fixed embedding, the orientations are determined, and the + worst-of-orientations might differ from the best-of. This + is unlikely to matter under saturation but is worth checking. +\end{itemize} + +\end{document}