diff --git a/papers/coloring_nested_tire_graphs/experiments/cut_depth_label.py b/papers/coloring_nested_tire_graphs/experiments/cut_depth_label.py new file mode 100644 index 0000000..500036a --- /dev/null +++ b/papers/coloring_nested_tire_graphs/experiments/cut_depth_label.py @@ -0,0 +1,283 @@ +"""Cut-and-depth-label procedure on a Holton-McKay graph. + +Procedure: + 1. Take G' (we use a Holton-McKay non-Hamiltonian 38-vertex cubic + plane graph, viewed as the dual of a 21-vertex triangulation G). + 2. Find 6 cut edges of G' whose removal disconnects it into two + non-trivial cubic-minus-boundary pieces G'_0 and G'_1. + 3. In each G'_i: + a. V_i = vertices of degree 2 (the 6 endpoints in G'_i of cut + edges). + b. For each v ∈ V_i, add a new pendant edge to a new vertex. + Label these pendant edges depth 0. + c. BFS-propagate: for d = 0, 1, ..., label every edge sharing + a vertex with a depth-d edge (and not yet labelled) as + depth d + 1. + d. Stop when every edge has a depth label. + 4. Render G'_0 and G'_1 with edges coloured by depth. +""" +import os +import sys +from collections import deque, defaultdict +import math + +import matplotlib.pyplot as plt +import matplotlib.colors as mcolors +import numpy as np + +from sage.all import Graph + +HM_FILE = ('/Users/didericis/Code/math-research/papers/' + 'even_level_graph_generators/experiments/nonham38m4.pc') + + +def parse_planar_code(path): + with open(path, 'rb') as f: + data = f.read() + header = b'>>planar_code<<' + assert data.startswith(header), data[:20] + pos = len(header) + sage_graphs = [] + while pos < len(data): + n = data[pos]; pos += 1 + edges = set() + for v in range(n): + while True: + w = data[pos]; pos += 1 + if w == 0: + break + edges.add(frozenset((v, w - 1))) + G = Graph([tuple(e) for e in edges], multiedges=False, loops=False) + G.is_planar(set_embedding=True) + sage_graphs.append(G) + return sage_graphs + + +def find_six_edge_cut(G, prefer_balanced=True, prefer_matching=True): + """Find a 6-edge cut: a set of 6 edges whose removal yields two + non-trivial components. + + For a cubic graph: edges between S and complement + = 3|S| - 2 * e(S). We want this to equal 6. + + Search strategy: BFS-grow a vertex set S from each possible start, + track the boundary edge count. Collect all sizes that yield a + 6-edge cut. Return the best one according to: + prefer_matching: cut is a "matching cut" (each boundary vertex + has exactly one cut edge). + prefer_balanced: |S| closest to n/2. + """ + n = G.order() + candidates = [] + for start in G.vertices(): + S = {start} + boundary = 3 + # BFS-grow; at each step pick the frontier vertex that adds the + # most internal edges (reduces boundary). + prev_size = -1 + while True: + if boundary == 6 and 2 <= len(S) <= n - 2: + cut = [(u, v) for u in S + for v in G.neighbors(u) if v not in S] + if len(cut) == 6: + candidates.append((frozenset(S), cut)) + if len(S) == prev_size: + break + prev_size = len(S) + # frontier + frontier = [] + for w in G.vertices(): + if w in S: continue + if any(nb in S for nb in G.neighbors(w)): + edges_into_S = sum(1 for nb in G.neighbors(w) if nb in S) + frontier.append((edges_into_S, w)) + if not frontier: + break + frontier.sort(reverse=True) + _, w = frontier[0] + edges_into_S = sum(1 for nb in G.neighbors(w) if nb in S) + S.add(w) + boundary = boundary + 3 - 2 * edges_into_S + if len(S) >= n - 1: + break + if not candidates: + return None, None + # Pick best: prefer matching cuts (both sides have 6 distinct + # boundary vertices = 6 cut edges form a matching). + def score(item): + S, cut = item + endpoints_in_S = [u for (u, v) in cut if u in S] + \ + [v for (u, v) in cut if v in S] + endpoints_in_Sc = [u for (u, v) in cut if u not in S] + \ + [v for (u, v) in cut if v not in S] + is_matching = (len(set(endpoints_in_S)) == 6 and + len(set(endpoints_in_Sc)) == 6) + # Distinctness within each side + deg2_S = len(set(endpoints_in_S)) + deg2_Sc = len(set(endpoints_in_Sc)) + balance = abs(len(S) - n / 2) + # Prefer maximum total V coverage, then matching, then balanced + return (-(deg2_S + deg2_Sc), -int(is_matching), balance) + candidates.sort(key=score) + # Dedupe identical S sets + seen = set() + unique = [] + for S, cut in candidates: + if S in seen: continue + seen.add(S) + unique.append((S, cut)) + print(f' Found {len(unique)} distinct 6-edge cuts') + return unique[0] + + +def apply_procedure(G, S, cut, side_label='0'): + """Build G'_i from G[S] plus pendant edges at degree-2 vertices. + Per the user's procedure: + a. V = vertices of degree 2 in the induced subgraph (i.e., + original cubic vertices that have exactly 1 cut edge, + hence degree 3 - 1 = 2 in the induced subgraph). + b. Add 1 pendant edge per v in V. + c. Label pendants depth 0, BFS-propagate. + Returns (graph, pos, edge_depths, deg2_vertices, pendant_map, + high_deg_loss). high_deg_loss tracks vertices with >= 2 cut + edges that don't receive pendants under the strict procedure. + """ + induced_edges = [(u, v) for (u, v) in G.edges(labels=False) + if u in S and v in S] + H = Graph(induced_edges, multiedges=False, loops=False) + # Ensure all vertices of S are present (some may be isolated) + for v in S: + H.add_vertex(v) + # Compute degree of each vertex in induced subgraph + induced_deg = {v: H.degree(v) for v in S} + # V = degree-2 vertices + V_deg2 = sorted([v for v in S if induced_deg[v] == 2]) + high_loss = sorted([v for v in S if induced_deg[v] < 2]) + pendant_edges = [] + next_pendant_id = (max(G.vertices()) + 1) + pendant_to_boundary = {} + for v in V_deg2: + H.add_edge(v, next_pendant_id) + pendant_edges.append((min(v, next_pendant_id), + max(v, next_pendant_id))) + pendant_to_boundary[next_pendant_id] = v + next_pendant_id += 1 + # BFS-label edges by depth + edge_depth = {} + queue = deque() + for e in pendant_edges: + edge_depth[e] = 0 + queue.append((e, 0)) + while queue: + (u, v), d = queue.popleft() + # adjacent edges share vertex u or v + for endpoint in (u, v): + for nb in H.neighbors(endpoint): + e_nb = (min(endpoint, nb), max(endpoint, nb)) + if e_nb == (u, v): continue + if e_nb not in edge_depth: + edge_depth[e_nb] = d + 1 + queue.append((e_nb, d + 1)) + # Layout: use Sage's planar embedding + pos = H.layout(layout='planar') if H.is_planar() else H.layout() + return H, pos, edge_depth, V_deg2, pendant_to_boundary, high_loss + + +def draw_labeled_graph(ax, H, pos, edge_depth, boundary_vertices, + pendant_to_boundary, title): + max_depth = max(edge_depth.values()) if edge_depth else 0 + cmap = plt.get_cmap('viridis', max_depth + 1) + # Draw edges by depth + legend_handles = [] + for d in range(max_depth + 1): + color = cmap(d / max(max_depth, 1)) + for e, ed in edge_depth.items(): + if ed != d: continue + u, v = e + (x1, y1) = pos[u] + (x2, y2) = pos[v] + ax.plot([x1, x2], [y1, y2], color=color, + linewidth=2.0 + (1.5 if d == 0 else 0), + linestyle=('--' if d == 0 else '-'), + zorder=1) + legend_handles.append( + plt.Line2D([], [], color=color, linewidth=2.5, + linestyle='--' if d == 0 else '-', + label=f'depth {d}') + ) + # Draw vertices + for v, (x, y) in pos.items(): + if v in pendant_to_boundary: + ax.plot(x, y, 's', color='#ffaa66', markersize=8, zorder=2, + markeredgecolor='#aa5500') + elif v in boundary_vertices: + ax.plot(x, y, 'o', color='#ff5555', markersize=10, zorder=2, + markeredgecolor='#aa0000') + else: + ax.plot(x, y, 'o', color='#888', markersize=6, zorder=2) + ax.set_aspect('equal') + ax.axis('off') + ax.set_title(title, fontsize=11) + ax.legend(handles=legend_handles, loc='upper left', + bbox_to_anchor=(1.02, 1.0), fontsize=8, frameon=False) + + +def main(): + here = os.path.dirname(os.path.abspath(__file__)) + out = os.path.normpath(os.path.join(here, '..', 'notes', + 'fig_cut_depth_label.png')) + + gs = parse_planar_code(HM_FILE) + print(f'Loaded {len(gs)} Holton-McKay graphs') + + # Pick the first one + G = gs[0] + print(f'Graph 0: {G.order()} vertices, {G.size()} edges, ' + f'cubic={all(d == 3 for d in G.degree())}, planar={G.is_planar()}') + + # Find a 6-edge cut + S, cut = find_six_edge_cut(G) + if S is None: + print('No 6-edge cut found by greedy search.') + return + print(f'Found 6-edge cut: |S| = {len(S)}, |cut| = {len(cut)}') + print(f'Cut edges: {cut}') + + S0 = frozenset(S) + S1 = frozenset(G.vertices()) - S0 + + H0, pos0, ed0, bv0, pmap0, hl0 = apply_procedure(G, S0, cut, '0') + H1, pos1, ed1, bv1, pmap1, hl1 = apply_procedure(G, S1, cut, '1') + + print(f"G'_0: {H0.order()} vertices ({len(S0)} original + " + f'{len(pmap0)} pendant), {H0.size()} edges') + print(f" V (degree-2 vertices receiving pendants): {len(bv0)} vertices") + print(f" Multi-cut vertices not in V: {hl0}") + print(f' Max depth: {max(ed0.values())}') + print(f"G'_1: {H1.order()} vertices ({len(S1)} original + " + f'{len(pmap1)} pendant), {H1.size()} edges') + print(f" V (degree-2 vertices receiving pendants): {len(bv1)} vertices") + print(f" Multi-cut vertices not in V: {hl1}") + print(f' Max depth: {max(ed1.values())}') + + # Draw + fig, (ax0, ax1) = plt.subplots(1, 2, figsize=(16, 8.0)) + draw_labeled_graph(ax0, H0, pos0, ed0, bv0, pmap0, + f"$G'_0$ (|S| = {len(S0)}, |V| = {len(bv0)}, " + f"max depth = {max(ed0.values())})") + draw_labeled_graph(ax1, H1, pos1, ed1, bv1, pmap1, + f"$G'_1$ (|S| = {len(S1)}, |V| = {len(bv1)}, " + f"max depth = {max(ed1.values())})") + fig.suptitle("Cut-and-depth-label procedure on Holton-McKay graph #0 " + "(38 vertices, cubic, planar, non-Hamiltonian)\n" + "Dashed orange = pendant edges (depth 0); colored by " + "BFS depth from pendants in line-graph sense", + fontsize=11, y=1.00) + plt.tight_layout() + 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/cut_depth_label.aux b/papers/coloring_nested_tire_graphs/notes/cut_depth_label.aux new file mode 100644 index 0000000..c99ea83 --- /dev/null +++ b/papers/coloring_nested_tire_graphs/notes/cut_depth_label.aux @@ -0,0 +1,8 @@ +\relax +\@writefile{toc}{\contentsline {paragraph}{The chosen 6-edge cut.}{1}{}\protected@file@percent } +\@writefile{toc}{\contentsline {paragraph}{Resulting half-graphs.}{2}{}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Cut-and-depth-label procedure on Holton-McKay graph \#0 ($38$ vertices, $57$ edges, cubic planar non-Hamiltonian). The $6$-edge matching cut splits $G'$ into a $10$-vertex piece $G'_0$ (left) and a $28$-vertex piece $G'_1$ (right). Pendant edges (dashed, dark purple) are at depth $0$; the colour gradient encodes depth $0$ through max depth via BFS in the line-graph sense. Orange squares are the new pendant vertices; red circles are the boundary vertices in $V_i$; gray circles are interior vertices.\relax }}{2}{}\protected@file@percent } +\providecommand*\caption@xref[2]{\@setref\relax\@undefined{#1}} +\newlabel{fig:cut-depth-label}{{1}{2}} +\@writefile{toc}{\contentsline {paragraph}{Visualization.}{2}{}\protected@file@percent } +\gdef \@abspage@last{3} diff --git a/papers/coloring_nested_tire_graphs/notes/cut_depth_label.log b/papers/coloring_nested_tire_graphs/notes/cut_depth_label.log new file mode 100644 index 0000000..4f3b049 --- /dev/null +++ b/papers/coloring_nested_tire_graphs/notes/cut_depth_label.log @@ -0,0 +1,332 @@ +This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 26 MAY 2026 15:00 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**cut_depth_label.tex +(./cut_depth_label.tex +LaTeX2e <2021-11-15> patch level 1 +L3 programming layer <2022-02-24> +(/usr/local/texlive/2022/texmf-dist/tex/latex/base/article.cls +Document Class: article 2021/10/04 v1.4n Standard LaTeX document class +(/usr/local/texlive/2022/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2021/10/04 v1.4n Standard LaTeX file (size option) +) +\c@part=\count185 +\c@section=\count186 +\c@subsection=\count187 +\c@subsubsection=\count188 +\c@paragraph=\count189 +\c@subparagraph=\count190 +\c@figure=\count191 +\c@table=\count192 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2021/10/15 v2.17l AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2021/08/26 v2.01 AMS text + +(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks16 +\ex@=\dimen139 +)) +(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen140 +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2021/08/26 v2.02 operator names +) +\inf@bad=\count193 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count194 +\leftroot@=\count195 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count196 +\DOTSCASE@=\count197 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box50 +\strutbox@=\box51 +\big@size=\dimen141 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count198 +\c@MaxMatrixCols=\count199 +\dotsspace@=\muskip16 +\c@parentequation=\count266 +\dspbrk@lvl=\count267 +\tag@help=\toks17 +\row@=\count268 +\column@=\count269 +\maxfields@=\count270 +\andhelp@=\toks18 +\eqnshift@=\dimen142 +\alignsep@=\dimen143 +\tagshift@=\dimen144 +\tagwidth@=\dimen145 +\totwidth@=\dimen146 +\lineht@=\dimen147 +\@envbody=\toks19 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks20 +LaTeX Info: Redefining \[ on input line 2938. +LaTeX Info: Redefining \] on input line 2939. +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/local/texlive/2022/texmf-dist/tex/latex/amscls/amsthm.sty +Package: amsthm 2020/05/29 v2.20.6 +\thm@style=\toks21 +\thm@bodyfont=\toks22 +\thm@headfont=\toks23 +\thm@notefont=\toks24 +\thm@headpunct=\toks25 +\thm@preskip=\skip52 +\thm@postskip=\skip53 +\thm@headsep=\skip54 +\dth@everypar=\toks26 +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks27 +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2021/03/04 v1.4d Standard LaTeX Graphics (DPC,SPQR) + +(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2021/08/11 v1.11 sin cos tan (DPC) +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 107. + +(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen148 +\Gin@req@width=\dimen149 +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/local/texlive/2022/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + +(/usr/local/texlive/2022/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2022/02/03 v1.0f TeX engine tests +)) +\Gm@cnth=\count271 +\Gm@cntv=\count272 +\c@Gm@tempcnt=\count273 +\Gm@bindingoffset=\dimen150 +\Gm@wd@mp=\dimen151 +\Gm@odd@mp=\dimen152 +\Gm@even@mp=\dimen153 +\Gm@layoutwidth=\dimen154 +\Gm@layoutheight=\dimen155 +\Gm@layouthoffset=\dimen156 +\Gm@layoutvoffset=\dimen157 +\Gm@dimlist=\toks28 +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/booktabs/booktabs.sty +Package: booktabs 2020/01/12 v1.61803398 Publication quality tables +\heavyrulewidth=\dimen158 +\lightrulewidth=\dimen159 +\cmidrulewidth=\dimen160 +\belowrulesep=\dimen161 +\belowbottomsep=\dimen162 +\aboverulesep=\dimen163 +\abovetopsep=\dimen164 +\cmidrulesep=\dimen165 +\cmidrulekern=\dimen166 +\defaultaddspace=\dimen167 +\@cmidla=\count274 +\@cmidlb=\count275 +\@aboverulesep=\dimen168 +\@belowrulesep=\dimen169 +\@thisruleclass=\count276 +\@lastruleclass=\count277 +\@thisrulewidth=\dimen170 +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/caption/caption.sty +Package: caption 2022/03/01 v3.6b Customizing captions (AR) + +(/usr/local/texlive/2022/texmf-dist/tex/latex/caption/caption3.sty +Package: caption3 2022/03/17 v2.3b caption3 kernel (AR) +\caption@tempdima=\dimen171 +\captionmargin=\dimen172 +\caption@leftmargin=\dimen173 +\caption@rightmargin=\dimen174 +\caption@width=\dimen175 +\caption@indent=\dimen176 +\caption@parindent=\dimen177 +\caption@hangindent=\dimen178 +Package caption Info: Standard document class detected. +) +\c@caption@flags=\count278 +\c@continuedfloat=\count279 +) +(/usr/local/texlive/2022/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2022-02-07 L3 backend support: PDF output (pdfTeX) +\l__color_backend_stack_int=\count280 +\l__pdf_internal_box=\box52 +) +(./cut_depth_label.aux) +\openout1 = `cut_depth_label.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 17. +LaTeX Font Info: ... okay on input line 17. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 17. +LaTeX Font Info: ... okay on input line 17. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 17. +LaTeX Font Info: ... okay on input line 17. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 17. +LaTeX Font Info: ... okay on input line 17. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 17. +LaTeX Font Info: ... okay on input line 17. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 17. +LaTeX Font Info: ... okay on input line 17. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 17. +LaTeX Font Info: ... okay on input line 17. + +(/usr/local/texlive/2022/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count281 +\scratchdimen=\dimen179 +\scratchbox=\box53 +\nofMPsegments=\count282 +\nofMParguments=\count283 +\everyMPshowfont=\toks29 +\MPscratchCnt=\count284 +\MPscratchDim=\dimen180 +\MPnumerator=\count285 +\makeMPintoPDFobject=\count286 +\everyMPtoPDFconversion=\toks30 +) (/usr/local/texlive/2022/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/local/texlive/2022/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: +* layout: +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt) +* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt) +* \paperwidth=614.295pt +* \paperheight=794.96999pt +* \textwidth=469.75502pt +* \textheight=650.43001pt +* \oddsidemargin=0.0pt +* \evensidemargin=0.0pt +* \topmargin=-37.0pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=11.0pt +* \footskip=30.0pt +* \marginparwidth=59.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +Package caption Info: Begin \AtBeginDocument code. +Package caption Info: End \AtBeginDocument code. +LaTeX Font Info: Trying to load font information for U+msa on input line 18. + +(/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 18. + + +(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +Overfull \hbox (31.88051pt too wide) in paragraph at lines 65--70 +\OT1/cmr/m/n/10.95 Holton and McKay (loaded from \OT1/cmtt/m/n/10.95 papers/eve +n[]level[]graph[]generators/experiments/nonham38m4.pc\OT1/cmr/m/n/10.95 ). + [] + +[1 + +{/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] + +File: fig_cut_depth_label.png Graphic file (type png) + +Package pdftex.def Info: fig_cut_depth_label.png used on input line 108. +(pdftex.def) Requested size: 469.75502pt x 230.7281pt. + +Overfull \hbox (46.78696pt too wide) in paragraph at lines 123--130 +\OT1/cmr/m/n/10.95 The pro-ce-dure mir-rors the $4$CT cut-and-reglue scheme (\O +T1/cmtt/m/n/10.95 rainbow[]proof.tex\OT1/cmr/m/n/10.95 , \OT1/cmtt/m/n/10.95 wo +rst[]case[]proof[]sketch.tex\OT1/cmr/m/n/10.95 , + [] + +[2 <./fig_cut_depth_label.png>] [3] (./cut_depth_label.aux) ) +Here is how much of TeX's memory you used: + 4579 strings out of 478268 + 74295 string characters out of 5846347 + 370409 words of memory out of 5000000 + 22760 multiletter control sequences out of 15000+600000 + 479174 words of font info for 66 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 55i,8n,63p,656b,312s stack positions out of 10000i,1000n,20000p,200000b,200000s +{/usr/local/texliv +e/2022/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc} +Output written on cut_depth_label.pdf (3 pages, 357384 bytes). +PDF statistics: + 78 PDF objects out of 1000 (max. 8388607) + 46 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/cut_depth_label.pdf b/papers/coloring_nested_tire_graphs/notes/cut_depth_label.pdf new file mode 100644 index 0000000..fd06d14 Binary files /dev/null and b/papers/coloring_nested_tire_graphs/notes/cut_depth_label.pdf differ diff --git a/papers/coloring_nested_tire_graphs/notes/cut_depth_label.tex b/papers/coloring_nested_tire_graphs/notes/cut_depth_label.tex new file mode 100644 index 0000000..d07e1c5 --- /dev/null +++ b/papers/coloring_nested_tire_graphs/notes/cut_depth_label.tex @@ -0,0 +1,163 @@ +\documentclass[11pt]{article} +\usepackage{amsmath,amssymb,amsthm} +\usepackage{graphicx} +\usepackage{geometry} +\usepackage{booktabs} +\usepackage{caption} +\geometry{margin=1in} + +\title{Cut-and-depth-label: a procedure for labelling half-graphs of\\ + a $6$-edge cut by ``distance to the cut''} +\author{} +\date{} + +\newtheorem*{obs}{Observation} +\newtheorem*{prop}{Proposition} + +\begin{document} +\maketitle + +\section*{Procedure} + +Given a maximal planar graph $G$ and its dual $G'$: + +\begin{enumerate} + \item Find a $6$-edge cut $C \subseteq E(G')$ partitioning + $V(G')$ into $S$ and $V \setminus S$ with both sides + non-empty. + \item Remove the cut edges to obtain two graphs + $G'_0 := G'[S] \cup \emptyset_C$ and + $G'_1 := G'[V \setminus S] \cup \emptyset_C$ (each a cubic + graph minus boundary edges). + \item In each $G'_i$: + \begin{enumerate} + \item Let $V_i$ be the set of vertices of degree $2$ in + $G'_i$ (i.e.\ original cubic vertices incident to + exactly one cut edge; the cut edge accounts for the + missing edge, so the vertex sits at degree $3 - 1 = + 2$). + \item For each $v \in V_i$, attach a new pendant edge to + a fresh vertex, and \textbf{label these pendant + edges with depth $0$}. + \item For $d = 0, 1, 2, \ldots$: label every unlabelled + edge that shares a vertex with a depth-$d$ edge with + depth $d + 1$. + \item Stop when every edge has a depth label. + \end{enumerate} +\end{enumerate} + +\noindent\textbf{Interpretation.} The depth labels give a BFS +distance in the line graph of $G'_i$ starting from the pendants +added at the cut. Equivalently, the depth of an edge $e$ in $G'_i$ +is the minimum number of edges traversed (via shared-vertex +adjacency) to reach a pendant. + +\noindent\textbf{Caveat.} If the cut $C$ is not a \emph{matching} +cut (i.e., the $6$ cut edges share vertices), then some boundary +vertices have degree $< 2$ in $G'_i$ and do not receive a pendant +under the strict reading of step~3(a). When the cut is a +matching, each of the $12$ boundary vertices ($6$ per side) has +degree exactly $2$ and receives a pendant; the construction is +symmetric. + +\section*{Example: Holton-McKay graph \#0} + +We apply the procedure to the first of the six non-Hamiltonian +$38$-vertex cubic plane graphs found by Holton and McKay (loaded +from \texttt{papers/even\_level\_graph\_generators/experiments/nonham38m4.pc}). +This $G'$ is itself a cubic plane graph; its dual $G$ is a +$21$-vertex triangulation. + +\paragraph{The chosen 6-edge cut.} +Greedy search over $128$ distinct $6$-edge cuts in $G'$, preferring +\emph{matching cuts} (both sides have $6$ distinct boundary +vertices) and then balanced $|S|$, returns +\[ + |S| = 10, \qquad + C = \{(34, 29),\, (35, 30),\, (26, 22),\, (27, 23),\, + (28, 24),\, (31, 25)\}. +\] +This is a matching cut: the $6$ edges have $12$ distinct endpoints, +$6$ on each side. + +\paragraph{Resulting half-graphs.} + +\begin{center} +\begin{tabular}{lcc} +\toprule +& $G'_0$ & $G'_1$ \\ +\midrule +$|S|$ & $10$ & $28$ \\ +Original vertices in $G'_i$ & $10$ & $28$ \\ +$|V_i|$ (pendants added) & $6$ & $6$ \\ +Total vertices in $G'_i$ & $16$ & $34$ \\ +Total edges & $18$ & $45$ \\ +Max depth assigned & $2$ & $7$ \\ +\bottomrule +\end{tabular} +\end{center} + +\noindent +Multi-cut vertices (degree $< 2$ in induced subgraph): \emph{none} +on either side, since the cut is a matching. + +\paragraph{Visualization.} + +\begin{figure}[h] +\centering +\includegraphics[width=\textwidth]{fig_cut_depth_label.png} +\caption{Cut-and-depth-label procedure on Holton-McKay graph \#0 +($38$ vertices, $57$ edges, cubic planar non-Hamiltonian). The +$6$-edge matching cut splits $G'$ into a $10$-vertex piece $G'_0$ +(left) and a $28$-vertex piece $G'_1$ (right). Pendant edges +(dashed, dark purple) are at depth $0$; the colour gradient +encodes depth $0$ through max depth via BFS in the line-graph +sense. Orange squares are the new pendant vertices; red circles +are the boundary vertices in $V_i$; gray circles are interior +vertices.} +\label{fig:cut-depth-label} +\end{figure} + +\section*{Connection to chain pigeonhole / 4CT reducibility} + +The procedure mirrors the $4$CT cut-and-reglue scheme +(\texttt{rainbow\_proof.tex}, \texttt{worst\_case\_proof\_sketch.tex}, +\texttt{two\_approaches\_comparison.tex}) at the structural level. +After cutting, each $G'_i$ is a cubic-minus-boundary graph; the +pendant additions formally restore cubicity at the $6$ degree-$2$ +boundary vertices. The depth label on each edge measures its +``distance to the cut.'' + +For a minimum counterexample to the 4CT (i.e., a cubic plane $G'$ +with no proper $3$-edge-colouring), the depth labels organise each +$G'_i$ into concentric layers indexed by distance to the cut. The +$3$-edge-colourings of $G'_i$ must extend a colouring at the +depth-$0$ pendants (= a ring colouring at the cut); the BFS +ordering by depth is the natural induction order for propagating +the colouring inward. + +In the tire framework, the cut cycle $\gamma$ in the primal $G$ +(corresponding to the $6$-edge cut in $G'$ via planar duality) plays +the role of the tire's inner boundary on one side and outer boundary +on the other. The depth label on $G'_i$-edges is exactly the dual +analogue of plane depth from $\gamma$ (cf.\ the level-cycle +generalization discussion in the recent conversation). + +\section*{Limitations of this example} + +\begin{itemize} + \item Holton-McKay graphs are cyclically $5$-edge-connected (not + $6$-edge-connected), so $6$-edge cuts are not the minimum + cyclic cut. The smallest cyclic edge cuts in this graph are + size $5$. + \item The matching $6$-cut found is highly imbalanced ($|S|=10$ + vs.\ $|S^c|=28$). Searching among the $128$ distinct + $6$-edge cuts for a balanced matching cut may give better + examples. + \item Depth labels propagate via the line graph, not via vertex + BFS. An alternative procedure would label \emph{vertices} + by BFS distance from the boundary; both yield similar + layered structures but with slightly different counts. +\end{itemize} + +\end{document} diff --git a/papers/coloring_nested_tire_graphs/notes/fig_cut_depth_label.png b/papers/coloring_nested_tire_graphs/notes/fig_cut_depth_label.png new file mode 100644 index 0000000..01a3ca9 Binary files /dev/null and b/papers/coloring_nested_tire_graphs/notes/fig_cut_depth_label.png differ