coloring_nested_tire_graphs: write up closed-chain SR+PDS experiment and the outer-triangle absorption hypothesis

Note records the closed-chain experiment: forward-propagate state
through SR+PDS tire chains with degenerate-inner T_1 and outer-
triangle T_n (m_n=3). All 10 tested chains converge to the same
final state at L_n — exactly the 6 permutations of {1,2,3}.

Introduces the "outer triangle absorption" framing: distinguishes
H1 (chain-dependent: pigeonhole does real work to filter input to
T_n) vs H2 (T_n-only absorption: T_n's σ_U-projection is intrinsically
the 6 permutations regardless of input). Conjecture: H2 (testable by
single-tire computation).

If H2 holds, items 3-4 of the 4CT-via-tire-decomposition outline
become automatic from local data. If H1, the chain-pigeonhole does
structural work and the question is sharper.

Three-panel figure: (A) closed PDS chain (5,6,5,3) with concentric
levels and source apex; (B) outer-face dual constraint requiring
permutation-of-{1,2,3} on outer triangle; (C) state-size trajectory
showing absorption to 6 at the outer step.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 12:31:48 -04:00
parent c34c754c7e
commit 50183df6bc
6 changed files with 782 additions and 0 deletions
@@ -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()
Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

@@ -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}
@@ -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: <default>
* layout: <same size as paper>
* 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 ,
[]
<fig_outer_triangle_absorption.png, id=1, 1112.958pt x 388.45125pt>
File: fig_outer_triangle_absorption.png Graphic file (type png)
<use fig_outer_triangle_absorption.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}</usr/local/texlive/2022/texmf-dist/fonts/typ
e1/public/amsfonts/cm/cmbx10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type
1/public/amsfonts/cm/cmbx12.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1
/public/amsfonts/cm/cmmi10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/
public/amsfonts/cm/cmmi6.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/pu
blic/amsfonts/cm/cmmi8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/publ
ic/amsfonts/cm/cmr10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public
/amsfonts/cm/cmr17.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/a
msfonts/cm/cmr8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsf
onts/cm/cmsy10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfo
nts/cm/cmsy6.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfont
s/cm/cmsy8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/
cm/cmti10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/c
m/cmtt10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/cm-super/sf
rm1095.pfb>
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)
@@ -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}