Add Even Level Graph Generators paper + extend Level Switching reachability

- New paper papers/even_level_graph_generators/: defines Even Level
  Graph (every level cycle even), derived level graphs, intertwining
  trees, and the disjunction conjecture (every maximal planar graph is
  a derived level graph or intertwining tree). Empirically tested
  through n=11: every iso class is at least an intertwining tree, so
  the disjunction holds trivially in this range. The intertwining tree
  disjunct fails at the Tutte graph dual (n=25), so the disjunction
  becomes non-trivial past some unknown threshold.

- Level Switching paper: adds Section 4 (Reachability via edge
  switches) with the two-step argument (Sleator-Tarjan-Thurston for
  Case 1; face-merges for Case 2) and Theorem 4.1 (O(n) edge switches
  suffice to reach all-depth-0).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-21 16:44:39 -04:00
parent 082ee31966
commit c947ce75ff
29 changed files with 2180 additions and 23 deletions
@@ -0,0 +1,38 @@
"""Plot iso[49] at n=9, the counterexample to Conjecture 4.4."""
import sys
import os
sys.path.insert(0, '/Users/didericis/Code/math-research/papers/'
'level_resolutions_of_maximal_planar_graphs/experiments')
import networkx as nx
import matplotlib.pyplot as plt
from triangulation_gen import enumerate_all_triangulations
OUT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
tris = enumerate_all_triangulations(9)
G = tris[49]
print(f'iso[49] degree sequence: {sorted([G.degree(v) for v in G.nodes()], reverse=True)}')
print(f'iso[49] edges: {sorted(G.edges())}')
# Use planar layout
_, emb = nx.check_planarity(G)
pos = nx.combinatorial_embedding_to_pos(emb)
fig, ax = plt.subplots(figsize=(8, 7))
nx.draw_networkx_edges(G, pos, ax=ax, edge_color='#333', width=1.5)
# Color vertices by degree
degree_color = {4: '#3b82f6', 5: '#dc2626'}
node_colors = [degree_color[G.degree(v)] for v in G.nodes()]
nx.draw_networkx_nodes(G, pos, ax=ax, node_color=node_colors,
node_size=600, edgecolors='black', linewidths=1.2)
nx.draw_networkx_labels(G, pos, ax=ax, font_color='white',
font_size=11, font_weight='bold')
ax.set_aspect('equal'); ax.axis('off')
ax.set_title('iso[49] at $n=9$: degree sequence (5,5,5,5,5,5,4,4,4).\n'
'NOT a valid derived level graph of any Even Level Graph.\n'
'Blue = degree 4, Red = degree 5.', fontsize=11)
fig.tight_layout()
out = os.path.join(OUT_DIR, 'fig_n9_counterexample.png')
fig.savefig(out, dpi=180, bbox_inches='tight')
plt.close(fig)
print(f'wrote {out}')
@@ -0,0 +1,92 @@
"""Show a valid parity partition of iso[49] at n=9, with the induced
4-coloring."""
import sys
import os
sys.path.insert(0, '/Users/didericis/Code/math-research/papers/'
'level_resolutions_of_maximal_planar_graphs/experiments')
import networkx as nx
import matplotlib.pyplot as plt
from triangulation_gen import enumerate_all_triangulations
OUT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
tris = enumerate_all_triangulations(9)
G = tris[49]
V_E = (0, 1, 3, 6)
V_O = (2, 4, 5, 7, 8)
# 2-color each induced subgraph
def bipart_coloring(subg):
# BFS-based 2-coloring; returns dict v -> 0/1
cmap = {}
for start in subg.nodes():
if start in cmap: continue
cmap[start] = 0
frontier = [start]
while frontier:
new = []
for u in frontier:
for w in subg.neighbors(u):
if w not in cmap:
cmap[w] = 1 - cmap[u]
new.append(w)
frontier = new
return cmap
cE = bipart_coloring(G.subgraph(V_E))
cO = bipart_coloring(G.subgraph(V_O))
# 4-color: even gets red/blue, odd gets yellow/green
COLOR_RED, COLOR_BLUE = '#dc2626', '#3b82f6'
COLOR_YELLOW, COLOR_GREEN = '#eab308', '#16a34a'
four_color = {}
for v in V_E:
four_color[v] = COLOR_RED if cE[v] == 0 else COLOR_BLUE
for v in V_O:
four_color[v] = COLOR_YELLOW if cO[v] == 0 else COLOR_GREEN
# Verify proper 4-coloring
for u, v in G.edges():
assert four_color[u] != four_color[v], \
f'edge ({u},{v}) violates 4-coloring: {four_color[u]} vs {four_color[v]}'
print('4-coloring is proper.')
_, emb = nx.check_planarity(G)
pos = nx.combinatorial_embedding_to_pos(emb)
fig, ax = plt.subplots(figsize=(9, 8))
nx.draw_networkx_edges(G, pos, ax=ax, edge_color='#333', width=1.5)
node_colors = [four_color[v] for v in G.nodes()]
nx.draw_networkx_nodes(G, pos, ax=ax, node_color=node_colors,
node_size=700, edgecolors='black', linewidths=1.3)
nx.draw_networkx_labels(G, pos, ax=ax, font_color='white',
font_size=12, font_weight='bold')
ax.set_aspect('equal'); ax.axis('off')
# Legend
import matplotlib.patches as mpatches
legend_handles = [
mpatches.Patch(color=COLOR_RED, label=r'even-parity vertex, bipartition class 0'),
mpatches.Patch(color=COLOR_BLUE, label=r'even-parity vertex, bipartition class 1'),
mpatches.Patch(color=COLOR_YELLOW, label=r'odd-parity vertex, bipartition class 0'),
mpatches.Patch(color=COLOR_GREEN, label=r'odd-parity vertex, bipartition class 1'),
]
ax.legend(handles=legend_handles, loc='lower center',
bbox_to_anchor=(0.5, -0.08), ncol=2, fontsize=9, frameon=False)
ax.set_title(f'iso[49] with a valid parity partition\n'
f'$V_E = \\{{0, 1, 3, 6\\}}$, '
f'$V_O = \\{{2, 4, 5, 7, 8\\}}$\n'
f'(both induced subgraphs bipartite; 4-coloring derived)',
fontsize=11)
fig.tight_layout()
out = os.path.join(OUT_DIR, 'fig_n9_valid_partition.png')
fig.savefig(out, dpi=180, bbox_inches='tight')
plt.close(fig)
print(f'wrote {out}')
# Also report the induced subgraphs
GE = G.subgraph(V_E)
GO = G.subgraph(V_O)
print(f'G[V_E] = {sorted(GE.edges())} bipartite={nx.is_bipartite(GE)}')
print(f'G[V_O] = {sorted(GO.edges())} bipartite={nx.is_bipartite(GO)}')
@@ -0,0 +1,172 @@
"""Empirical test of the derived-level-graph conjecture for n=6..8.
For each iso class of maximal planar graphs G':
Search for an Even Level Graph G (some iso class, some level source)
such that G' is in the iso-class orbit of G under E/O-edge switches.
"""
import sys
import os
sys.path.insert(0, '/Users/didericis/Code/math-research/papers/'
'level_resolutions_of_maximal_planar_graphs/experiments')
import time
import itertools
import networkx as nx
from triangulation_gen import enumerate_all_triangulations
def canonical_sig(G):
"""Iso-class signature: WL hash via Weisfeiler-Lehman or just sorted
edge tuples up to vertex relabelling. We use nx.weisfeiler_lehman_graph_hash."""
return nx.weisfeiler_lehman_graph_hash(G)
def labelled_sig(G, labels):
"""Signature that respects both graph structure and a vertex labelling
(even/odd). Two graphs match iff there's an iso preserving labels."""
H = G.copy()
for v in H.nodes():
H.nodes[v]['label'] = labels[v]
return nx.weisfeiler_lehman_graph_hash(H, node_attr='label')
def bfs_levels(G, source_set):
"""BFS from a set of source vertices in G. Returns dict v -> level."""
levels = {v: float('inf') for v in G.nodes()}
frontier = list(source_set)
for v in frontier:
levels[v] = 0
d = 0
while frontier:
next_frontier = []
for u in frontier:
for w in G.neighbors(u):
if levels[w] > d + 1:
levels[w] = d + 1
next_frontier.append(w)
frontier = next_frontier
d += 1
return levels
def get_level_sources(G):
"""Yield each vertex as a possible level source (singleton set)."""
for v in G.nodes():
yield frozenset({v})
def is_even_level_graph(G, source):
"""Check: every level cycle of G (BFS from source) has even length."""
levels = bfs_levels(G, source)
if any(l == float('inf') for l in levels.values()):
return False, None
max_l = max(levels.values())
for k in range(max_l + 1):
L_k_nodes = [v for v in G.nodes() if levels[v] == k]
L_k = G.subgraph(L_k_nodes)
if L_k.number_of_edges() == 0:
continue
# Check bipartiteness (equivalent to no odd cycles)
if not nx.is_bipartite(L_k):
return False, None
return True, levels
def is_valid_parity_partition(G, labels):
"""Both induced subgraphs G[V_E] and G[V_O] are bipartite."""
V_E = [v for v in G.nodes() if labels[v] % 2 == 0]
V_O = [v for v in G.nodes() if labels[v] % 2 == 1]
return nx.is_bipartite(G.subgraph(V_E)) and nx.is_bipartite(G.subgraph(V_O))
def E_O_switches(G, labels):
"""Yield all triangulations reachable from G by one E/O-edge switch.
An E/O-edge has both endpoints of the same parity in `labels`."""
ip, emb = nx.check_planarity(G)
if not ip:
return
yielded = set()
for u, v in list(G.edges()):
if labels[u] % 2 != labels[v] % 2:
continue
f1 = emb.traverse_face(u, v)
f2 = emb.traverse_face(v, u)
if len(f1) != 3 or len(f2) != 3:
continue
w = next(x for x in f1 if x != u and x != v)
x = next(y for y in f2 if y != u and y != v)
if w == x or G.has_edge(w, x):
continue
Gp = G.copy()
Gp.remove_edge(u, v)
Gp.add_edge(w, x)
sig = frozenset(frozenset(e) for e in Gp.edges())
if sig in yielded:
continue
yielded.add(sig)
yield Gp
def bfs_orbit(G_start, labels, max_states=200000):
"""BFS in E/O-switch graph starting from G_start (with given labels).
Returns the set of iso classes (unlabelled) reachable."""
seen_labelled = {frozenset(frozenset(e) for e in G_start.edges())}
iso_classes_reached = {canonical_sig(G_start)}
frontier = [G_start]
rounds = 0
while frontier and len(seen_labelled) < max_states:
new = []
for G in frontier:
for Gp in E_O_switches(G, labels):
sig = frozenset(frozenset(e) for e in Gp.edges())
if sig in seen_labelled:
continue
seen_labelled.add(sig)
iso_classes_reached.add(canonical_sig(Gp))
new.append(Gp)
frontier = new
rounds += 1
return iso_classes_reached, len(seen_labelled), rounds
def test_for_n(n):
print(f'\n=== n = {n} ===')
t0 = time.time()
tris = enumerate_all_triangulations(n)
print(f' {len(tris)} iso classes of triangulations')
iso_class_sigs = {canonical_sig(T) for T in tris}
# Set of iso classes that ARE derived level graphs (of some ELG)
derived_iso_classes = set()
for i, G in enumerate(tris):
if len(derived_iso_classes) == len(iso_class_sigs):
break # early exit: everything is already covered
for source in get_level_sources(G):
is_elg, levels = is_even_level_graph(G, source)
if not is_elg:
continue
reached, n_lbld, rnds = bfs_orbit(G, levels)
new_count = len(reached - derived_iso_classes)
derived_iso_classes.update(reached)
if new_count > 0:
print(f' iso[{i}] source={sorted(source)}: ELG, '
f'orbit adds {new_count} new iso classes '
f'(orbit size {len(reached)}, '
f'{n_lbld} labelled, {rnds} rounds, '
f'total {len(derived_iso_classes)}/'
f'{len(iso_class_sigs)})')
missing = iso_class_sigs - derived_iso_classes
print(f' TOTAL: {len(derived_iso_classes)} / {len(iso_class_sigs)} '
f'iso classes are derived level graphs')
print(f' missing: {len(missing)}')
print(f' elapsed: {time.time() - t0:.1f}s')
return len(missing) == 0
if __name__ == '__main__':
import sys
ns = [int(x) for x in sys.argv[1:]] if len(sys.argv) > 1 else [6, 7, 8]
for n in ns:
ok = test_for_n(n)
print(f' conjecture holds for n={n}: {ok}')
@@ -0,0 +1,120 @@
"""Test the disjunction: every maximal planar graph is a valid derived
level graph, an intertwining tree, or both. Iterates n=6..12, stops if
a counterexample is found."""
import sys
import os
sys.path.insert(0, '/Users/didericis/Code/math-research/papers/'
'level_resolutions_of_maximal_planar_graphs/experiments')
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import time
import itertools
import networkx as nx
from triangulation_gen import enumerate_all_triangulations
from test_conjecture import (
canonical_sig, bfs_levels, get_level_sources,
is_even_level_graph, bfs_orbit
)
def is_intertwining_tree(G):
"""Search for a 2-partition (A, B) such that G[A] and G[B] are trees."""
nodes = list(G.nodes())
n = len(nodes)
# Try all 2^(n-1) partitions (fix node 0 in A by convention)
for mask in range(1, 2 ** (n - 1)):
A = [nodes[0]] + [nodes[i + 1] for i in range(n - 1) if (mask >> i) & 1]
B = [nodes[i + 1] for i in range(n - 1) if not ((mask >> i) & 1)]
if not A or not B:
continue
GA = G.subgraph(A)
GB = G.subgraph(B)
if nx.is_tree(GA) and nx.is_tree(GB):
return True, (tuple(A), tuple(B))
return False, None
def derived_level_graph_iso_classes(tris):
"""Compute the set of iso class signatures that are derived level
graphs of some Even Level Graph."""
iso_class_sigs = {canonical_sig(T) for T in tris}
derived = set()
for G in tris:
if len(derived) == len(iso_class_sigs):
break
for source in get_level_sources(G):
is_elg, levels = is_even_level_graph(G, source)
if not is_elg:
continue
reached, _, _ = bfs_orbit(G, levels)
derived.update(reached)
return derived
def test_n(n):
t0 = time.time()
tris = enumerate_all_triangulations(n)
iso_sigs = [canonical_sig(T) for T in tris]
derived = derived_level_graph_iso_classes(tris)
n_derived = sum(1 for s in iso_sigs if s in derived)
# For iso classes that are NOT derived, check intertwining tree
counterexamples = []
n_intertwining_only = 0
n_both = 0
for i, G in enumerate(tris):
is_derived = iso_sigs[i] in derived
is_inter, partition = is_intertwining_tree(G)
if is_derived and is_inter:
n_both += 1
elif is_derived:
pass # only derived
elif is_inter:
n_intertwining_only += 1
else:
counterexamples.append((i, G))
n_total = len(tris)
n_only_derived = n_derived - n_both
elapsed = time.time() - t0
return {
'n': n,
'total': n_total,
'derived': n_derived,
'intertwining_only': n_intertwining_only,
'both': n_both,
'only_derived': n_only_derived,
'counterexamples': counterexamples,
'elapsed': elapsed,
}
def main():
results = []
for n in [6, 7, 8, 9, 10, 11, 12]:
print(f'\n=== n = {n} ===')
r = test_n(n)
results.append(r)
print(f' total iso classes: {r["total"]}')
print(f' derived only: {r["only_derived"]}')
print(f' intertwining only: {r["intertwining_only"]}')
print(f' both: {r["both"]}')
print(f' counterexamples: {len(r["counterexamples"])}')
print(f' elapsed: {r["elapsed"]:.1f}s')
if r['counterexamples']:
print(f' COUNTEREXAMPLE FOUND. Stopping.')
for i, G in r['counterexamples'][:3]:
print(f' iso[{i}] degree seq = '
f'{sorted([G.degree(v) for v in G.nodes()], reverse=True)}')
break
print('\n=== Final summary ===')
print(f'{"n":>3} {"total":>6} {"deriv":>6} {"inter":>6} {"both":>6} {"missing":>8}')
for r in results:
cov = r['only_derived'] + r['intertwining_only'] + r['both']
missing = r['total'] - cov
print(f'{r["n"]:>3} {r["total"]:>6} {r["only_derived"]:>6} '
f'{r["intertwining_only"]:>6} {r["both"]:>6} {missing:>8}')
if __name__ == '__main__':
main()
@@ -0,0 +1,141 @@
"""Test whether the dual of the Tutte graph (46-vertex 3-connected planar
cubic non-Hamiltonian) admits a tree coloring.
The Lederberg-Bosak-Barnette graph (38 vertices) is the smallest known
counterexample to Tait's conjecture but isn't directly available in
networkx; the Tutte graph (1946 original counterexample) is.
"""
import sys
import os
sys.path.insert(0, '/Users/didericis/Code/math-research/papers/'
'level_resolutions_of_maximal_planar_graphs/experiments')
import networkx as nx
import time
def dual_triangulation(G):
"""Build the planar dual of a 3-connected planar cubic graph.
Each face of G becomes a vertex of the dual; each edge of G between
two faces becomes a dual edge. Cubic G ⇒ every dual face is a
triangle ⇒ dual is a triangulation."""
ok, emb = nx.check_planarity(G)
assert ok
faces = []
seen = set()
for u, v in G.edges():
for src, dst in [(u, v), (v, u)]:
face = tuple(emb.traverse_face(src, dst))
key = frozenset(face)
if key in seen:
continue
seen.add(key)
faces.append(face)
# The "outer" face is the one with the largest vertex set (heuristic);
# for connectivity of the dual, we just include all faces.
face_of_edge = {} # edge (u, v) -> set of face indices it borders
for i, face in enumerate(faces):
for j in range(len(face)):
a, b = face[j], face[(j + 1) % len(face)]
key = frozenset((a, b))
face_of_edge.setdefault(key, []).append(i)
D = nx.Graph()
D.add_nodes_from(range(len(faces)))
for key, face_ids in face_of_edge.items():
if len(face_ids) == 2:
D.add_edge(face_ids[0], face_ids[1])
# If len > 2 or 1, multi-edges or self-loops would appear; for
# 3-connected G this shouldn't happen.
return D, faces
def is_tree(subg):
return nx.is_tree(subg) if subg.number_of_nodes() > 0 else True
def has_tree_property_for_some_pairing(G, coloring):
pairings = [({0, 1}, {2, 3}), ({0, 2}, {1, 3}), ({0, 3}, {1, 2})]
for p1, p2 in pairings:
V1 = [v for v in G.nodes() if coloring[v] in p1]
V2 = [v for v in G.nodes() if coloring[v] in p2]
if is_tree(G.subgraph(V1)) and is_tree(G.subgraph(V2)):
return True, (p1, p2)
return False, None
def find_tree_coloring(G, time_limit=60.0):
"""Backtracking search for a 4-coloring with the tree property."""
nodes = list(G.nodes())
n = len(nodes)
colors = [None] * n
adj = {v: set(G.neighbors(v)) for v in nodes}
idx_of = {v: i for i, v in enumerate(nodes)}
t0 = time.time()
visited = [0]
def bt(i):
if time.time() - t0 > time_limit:
return None
visited[0] += 1
if i == n:
coloring = dict(zip(nodes, colors))
ok, pair = has_tree_property_for_some_pairing(G, coloring)
return (coloring, pair) if ok else None
v = nodes[i]
forbidden = set()
for w in adj[v]:
if idx_of[w] < i:
forbidden.add(colors[idx_of[w]])
for c in range(4):
if c in forbidden:
continue
colors[i] = c
r = bt(i + 1)
if r is not None:
return r
colors[i] = None
return None
return bt(0), visited[0]
def main():
G = nx.tutte_graph()
print(f'Tutte graph: {G.number_of_nodes()} vertices, '
f'{G.number_of_edges()} edges, planar=True, cubic, 3-connected, '
f'non-Hamiltonian (Tutte 1946).')
D, faces = dual_triangulation(G)
print(f'Dual: {D.number_of_nodes()} vertices, '
f'{D.number_of_edges()} edges')
print(f' is_triangulation (3n-6 edges): '
f'{D.number_of_edges() == 3 * D.number_of_nodes() - 6}')
print(f' degree sequence (sorted desc): '
f'{sorted([D.degree(v) for v in D.nodes()], reverse=True)}')
print('Searching for a tree coloring...')
t0 = time.time()
result, n_visited = find_tree_coloring(D, time_limit=120.0)
elapsed = time.time() - t0
if result is None:
print(f' no tree coloring found within time limit '
f'({elapsed:.1f}s, {n_visited} states visited)')
else:
coloring, pair = result
print(f' tree coloring FOUND ({elapsed:.1f}s, {n_visited} states).')
print(f' pairing: {pair}')
p1, p2 = pair
V1 = [v for v in D.nodes() if coloring[v] in p1]
V2 = [v for v in D.nodes() if coloring[v] in p2]
sub1 = D.subgraph(V1)
sub2 = D.subgraph(V2)
print(f' D[V1] (colors {p1}): {len(V1)} vertices, '
f'{sub1.number_of_edges()} edges, tree={nx.is_tree(sub1)}')
print(f' D[V2] (colors {p2}): {len(V2)} vertices, '
f'{sub2.number_of_edges()} edges, tree={nx.is_tree(sub2)}')
if __name__ == '__main__':
main()
Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

@@ -0,0 +1,46 @@
\relax
\providecommand\hyper@newdestlabel[2]{}
\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
\global\let\oldcontentsline\contentsline
\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
\global\let\oldnewlabel\newlabel
\gdef\newlabel#1#2{\newlabelxx{#1}#2}
\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
\AtEndDocument{\ifx\hyper@anchor\@undefined
\let\contentsline\oldcontentsline
\let\newlabel\oldnewlabel
\fi}
\fi}
\global\let\hyper@last\relax
\gdef\HyperFirstAtBeginDocument#1{#1}
\providecommand\HyField@AuxAddToFields[1]{}
\providecommand\HyField@AuxAddToCoFields[2]{}
\@writefile{toc}{\contentsline {section}{\tocsection {}{1}{Introduction}}{1}{section.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\tocsection {}{2}{Definitions}}{1}{section.2}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces BFS levels from the degree-$3$ vertex source $S = \{4\}$. The source is level $0$, its three neighbours are level $1$, and the remaining vertices are level $2$. Colour encodes the level.}}{1}{figure.1}\protected@file@percent }
\newlabel{fig:levels}{{1}{1}{BFS levels from the degree-$3$ vertex source $S = \{4\}$. The source is level $0$, its three neighbours are level $1$, and the remaining vertices are level $2$. Colour encodes the level}{figure.1}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces A level cycle in the triangulation of Figure\nonbreakingspace \ref {fig:levels}. The triangle $1\!-\!2\!-\!3$ is a simple cycle whose three vertices all lie at level $1$, so it is a level cycle at level $1$.}}{2}{figure.2}\protected@file@percent }
\newlabel{fig:level-cycle}{{2}{2}{A level cycle in the triangulation of Figure~\ref {fig:levels}. The triangle $1\!-\!2\!-\!3$ is a simple cycle whose three vertices all lie at level $1$, so it is a level cycle at level $1$}{figure.2}{}}
\newlabel{def:edge-switch}{{2.4}{2}{Edge switch}{theorem.2.4}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces An edge switch on the level cycle of Figure\nonbreakingspace \ref {fig:level-cycle}. The chosen cycle edge $1\!-\!2$ is shared by the triangular faces $(0,1,2)$ and $(1,2,4)$; the switch deletes $1\!-\!2$ (red, left) and inserts $0\!-\!4$ (green, right). Vertex colours indicate the original levels in $G$.}}{2}{figure.3}\protected@file@percent }
\newlabel{fig:edge-switch}{{3}{2}{An edge switch on the level cycle of Figure~\ref {fig:level-cycle}. The chosen cycle edge $1\!-\!2$ is shared by the triangular faces $(0,1,2)$ and $(1,2,4)$; the switch deletes $1\!-\!2$ (red, left) and inserts $0\!-\!4$ (green, right). Vertex colours indicate the original levels in $G$}{figure.3}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {4}{\ignorespaces Parity subgraphs of $G' = T$ with respect to the level structure of Figure\nonbreakingspace \ref {fig:levels} (here we take $G = G' = T$). Left: $T$ with vertices coloured by $\ell _G \nonscript \mskip -\medmuskip \mkern 5mu\mathbin {\mathgroup \symoperators mod}\penalty 900 \mkern 5mu\nonscript \mskip -\medmuskip 2$ (blue $=$ even, orange $=$ odd). Middle: the even parity subgraph $E_{G,S}(G')$, induced on $\{0, 4, 5, 6\}$; only edges with both endpoints even appear. Right: the odd parity subgraph $O_{G,S}(G')$, induced on $\{1, 2, 3\}$; the highlighted triangle shows that $O_{G,S}(G')$ is not bipartite for this choice of $G'$.}}{3}{figure.4}\protected@file@percent }
\newlabel{fig:parity-subgraph}{{4}{3}{Parity subgraphs of $G' = T$ with respect to the level structure of Figure~\ref {fig:levels} (here we take $G = G' = T$). Left: $T$ with vertices coloured by $\ell _G \bmod 2$ (blue $=$ even, orange $=$ odd). Middle: the even parity subgraph $E_{G,S}(G')$, induced on $\{0, 4, 5, 6\}$; only edges with both endpoints even appear. Right: the odd parity subgraph $O_{G,S}(G')$, induced on $\{1, 2, 3\}$; the highlighted triangle shows that $O_{G,S}(G')$ is not bipartite for this choice of $G'$}{figure.4}{}}
\@writefile{toc}{\contentsline {section}{\tocsection {}{3}{Outerplanarity of level components}}{3}{section.3}\protected@file@percent }
\newlabel{sec:outerplanar-components}{{3}{3}{Outerplanarity of level components}{section.3}{}}
\newlabel{thm:outerplanar-component}{{3.1}{3}{}{theorem.3.1}{}}
\@writefile{toc}{\contentsline {section}{\tocsection {}{4}{Even Level Graphs}}{3}{section.4}\protected@file@percent }
\newlabel{sec:even-level-graphs}{{4}{3}{Even Level Graphs}{section.4}{}}
\newlabel{def:even-level-graph}{{4.1}{3}{Even Level Graph}{theorem.4.1}{}}
\newlabel{thm:even-level-4colorable}{{4.2}{3}{}{theorem.4.2}{}}
\newlabel{tocindent-1}{0pt}
\newlabel{tocindent0}{14.69437pt}
\newlabel{tocindent1}{17.77782pt}
\newlabel{tocindent2}{0pt}
\newlabel{tocindent3}{0pt}
\newlabel{def:derived-level-graph}{{4.3}{4}{Derived level graph}{theorem.4.3}{}}
\newlabel{def:intertwining-tree}{{4.4}{4}{Intertwining tree}{theorem.4.4}{}}
\newlabel{conj:every-triangulation-derived}{{4.5}{4}{}{theorem.4.5}{}}
\@writefile{toc}{\contentsline {subsection}{\tocsubsection {}{}{Empirical status}}{4}{section*.1}\protected@file@percent }
\gdef \@abspage@last{4}
@@ -0,0 +1,418 @@
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 21 MAY 2026 16:14
entering extended mode
restricted \write18 enabled.
%&-line parsing enabled.
**paper.tex
(./paper.tex
LaTeX2e <2021-11-15> patch level 1
L3 programming layer <2022-02-24>
(/usr/local/texlive/2022/texmf-dist/tex/latex/amscls/amsart.cls
Document Class: amsart 2020/05/29 v2.20.6
\linespacing=\dimen138
\normalparindent=\dimen139
\normaltopskip=\skip47
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsmath.sty
Package: amsmath 2021/10/15 v2.17l AMS math features
\@mathmargin=\skip48
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@=\dimen140
))
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsbsy.sty
Package: amsbsy 1999/11/29 v1.2d Bold Symbols
\pmbraise@=\dimen141
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsopn.sty
Package: amsopn 2021/08/26 v2.02 operator names
)
\inf@bad=\count185
LaTeX Info: Redefining \frac on input line 234.
\uproot@=\count186
\leftroot@=\count187
LaTeX Info: Redefining \overline on input line 399.
\classnum@=\count188
\DOTSCASE@=\count189
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=\dimen142
LaTeX Font Info: Redeclaring font encoding OML on input line 743.
LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
\macc@depth=\count190
\c@MaxMatrixCols=\count191
\dotsspace@=\muskip16
\c@parentequation=\count192
\dspbrk@lvl=\count193
\tag@help=\toks17
\row@=\count194
\column@=\count195
\maxfields@=\count196
\andhelp@=\toks18
\eqnshift@=\dimen143
\alignsep@=\dimen144
\tagshift@=\dimen145
\tagwidth@=\dimen146
\totwidth@=\dimen147
\lineht@=\dimen148
\@envbody=\toks19
\multlinegap=\skip49
\multlinetaggap=\skip50
\mathdisplay@stack=\toks20
LaTeX Info: Redefining \[ on input line 2938.
LaTeX Info: Redefining \] on input line 2939.
)
LaTeX Font Info: Trying to load font information for U+msa on input line 397
.
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/umsa.fd
File: umsa.fd 2013/01/14 v3.01 AMS symbols A
)
(/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.
)
\copyins=\insert199
\abstractbox=\box52
\listisep=\skip51
\c@part=\count197
\c@section=\count198
\c@subsection=\count266
\c@subsubsection=\count267
\c@paragraph=\count268
\c@subparagraph=\count269
\c@figure=\count270
\c@table=\count271
\abovecaptionskip=\skip52
\belowcaptionskip=\skip53
\captionindent=\dimen149
\thm@style=\toks21
\thm@bodyfont=\toks22
\thm@headfont=\toks23
\thm@notefont=\toks24
\thm@headpunct=\toks25
\thm@preskip=\skip54
\thm@postskip=\skip55
\thm@headsep=\skip56
\dth@everypar=\toks26
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/hyperref/hyperref.sty
Package: hyperref 2022-02-21 v7.00n Hypertext links for LaTeX
(/usr/local/texlive/2022/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO)
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/iftex/iftex.sty
Package: iftex 2022/02/03 v1.0f TeX engine tests
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/infwarerr/infwarerr.sty
Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO)
)
Package pdftexcmds Info: \pdf@primitive is available.
Package pdftexcmds Info: \pdf@ifprimitive is available.
Package pdftexcmds Info: \pdfdraftmode found.
)
(/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/generic/kvsetkeys/kvsetkeys.sty
Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO)
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO)
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pdfescape/pdfescape.sty
Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO)
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/hycolor/hycolor.sty
Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO)
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO)
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/auxhook/auxhook.sty
Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO)
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/kvoptions/kvoptions.sty
Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO)
)
\@linkdim=\dimen150
\Hy@linkcounter=\count272
\Hy@pagecounter=\count273
(/usr/local/texlive/2022/texmf-dist/tex/latex/hyperref/pd1enc.def
File: pd1enc.def 2022-02-21 v7.00n Hyperref: PDFDocEncoding definition (HO)
Now handling font encoding PD1 ...
... no UTF-8 mapping file for font encoding PD1
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/intcalc/intcalc.sty
Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO)
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/etexcmds/etexcmds.sty
Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO)
)
\Hy@SavedSpaceFactor=\count274
(/usr/local/texlive/2022/texmf-dist/tex/latex/hyperref/puenc.def
File: puenc.def 2022-02-21 v7.00n Hyperref: PDF Unicode definition (HO)
Now handling font encoding PU ...
... no UTF-8 mapping file for font encoding PU
)
Package hyperref Info: Hyper figures OFF on input line 4137.
Package hyperref Info: Link nesting OFF on input line 4142.
Package hyperref Info: Hyper index ON on input line 4145.
Package hyperref Info: Plain pages OFF on input line 4152.
Package hyperref Info: Backreferencing OFF on input line 4157.
Package hyperref Info: Implicit mode ON; LaTeX internals redefined.
Package hyperref Info: Bookmarks ON on input line 4390.
\c@Hy@tempcnt=\count275
(/usr/local/texlive/2022/texmf-dist/tex/latex/url/url.sty
\Urlmuskip=\muskip17
Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
)
LaTeX Info: Redefining \url on input line 4749.
\XeTeXLinkMargin=\dimen151
(/usr/local/texlive/2022/texmf-dist/tex/generic/bitset/bitset.sty
Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO)
(/usr/local/texlive/2022/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO
)
))
\Fld@menulength=\count276
\Field@Width=\dimen152
\Fld@charsize=\dimen153
Package hyperref Info: Hyper figures OFF on input line 6027.
Package hyperref Info: Link nesting OFF on input line 6032.
Package hyperref Info: Hyper index ON on input line 6035.
Package hyperref Info: backreferencing OFF on input line 6042.
Package hyperref Info: Link coloring OFF on input line 6047.
Package hyperref Info: Link coloring with OCG OFF on input line 6052.
Package hyperref Info: PDF/A mode OFF on input line 6057.
LaTeX Info: Redefining \ref on input line 6097.
LaTeX Info: Redefining \pageref on input line 6101.
(/usr/local/texlive/2022/texmf-dist/tex/latex/base/atbegshi-ltx.sty
Package: atbegshi-ltx 2021/01/10 v1.0c Emulation of the original atbegshi
package with kernel methods
)
\Hy@abspage=\count277
\c@Item=\count278
\c@Hfootnote=\count279
)
Package hyperref Info: Driver (autodetected): hpdftex.
(/usr/local/texlive/2022/texmf-dist/tex/latex/hyperref/hpdftex.def
File: hpdftex.def 2022-02-21 v7.00n Hyperref driver for pdfTeX
(/usr/local/texlive/2022/texmf-dist/tex/latex/base/atveryend-ltx.sty
Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atveryend pac
kage
with kernel methods
)
\Fld@listcount=\count280
\c@bookmark@seq@number=\count281
(/usr/local/texlive/2022/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO)
(/usr/local/texlive/2022/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO)
)
Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
86.
)
\Hy@SectionHShift=\skip57
) (/usr/local/texlive/2022/texmf-dist/tex/latex/enumitem/enumitem.sty
Package: enumitem 2019/06/20 v3.9 Customized lists
\labelindent=\skip58
\enit@outerparindent=\dimen154
\enit@toks=\toks28
\enit@inbox=\box53
\enit@count@id=\count282
\enitdp@description=\count283
)
(/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/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=\dimen155
\Gin@req@width=\dimen156
)
\c@theorem=\count284
(/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=\count285
\l__pdf_internal_box=\box54
)
(./paper.aux)
\openout1 = `paper.aux'.
LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 60.
LaTeX Font Info: ... okay on input line 60.
LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 60.
LaTeX Font Info: ... okay on input line 60.
LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 60.
LaTeX Font Info: ... okay on input line 60.
LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 60.
LaTeX Font Info: ... okay on input line 60.
LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 60.
LaTeX Font Info: ... okay on input line 60.
LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 60.
LaTeX Font Info: ... okay on input line 60.
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 60.
LaTeX Font Info: ... okay on input line 60.
LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 60.
LaTeX Font Info: ... okay on input line 60.
LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 60.
LaTeX Font Info: ... okay on input line 60.
LaTeX Font Info: Trying to load font information for U+msa on input line 60.
(/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 60.
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/umsb.fd
File: umsb.fd 2013/01/14 v3.01 AMS symbols B
)
Package hyperref Info: Link coloring OFF on input line 60.
(/usr/local/texlive/2022/texmf-dist/tex/latex/hyperref/nameref.sty
Package: nameref 2021-04-02 v2.47 Cross-referencing by name of section
(/usr/local/texlive/2022/texmf-dist/tex/latex/refcount/refcount.sty
Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO)
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/gettitlestring/gettitlestring.s
ty
Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
)
\c@section@level=\count286
)
LaTeX Info: Redefining \ref on input line 60.
LaTeX Info: Redefining \pageref on input line 60.
LaTeX Info: Redefining \nameref on input line 60.
(./paper.out) (./paper.out)
\@outlinefile=\write3
\openout3 = `paper.out'.
(/usr/local/texlive/2022/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
[Loading MPS to PDF converter (version 2006.09.02).]
\scratchcounter=\count287
\scratchdimen=\dimen157
\scratchbox=\box55
\nofMPsegments=\count288
\nofMParguments=\count289
\everyMPshowfont=\toks29
\MPscratchCnt=\count290
\MPscratchDim=\dimen158
\MPnumerator=\count291
\makeMPintoPDFobject=\count292
\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
))
<fig_levels.png, id=24, 454.21695pt x 391.34206pt>
File: fig_levels.png Graphic file (type png)
<use fig_levels.png>
Package pdftex.def Info: fig_levels.png used on input line 108.
(pdftex.def) Requested size: 198.0011pt x 170.59666pt.
<fig_level_cycle.png, id=26, 452.04884pt x 391.34206pt>
File: fig_level_cycle.png Graphic file (type png)
<use fig_level_cycle.png>
Package pdftex.def Info: fig_level_cycle.png used on input line 122.
(pdftex.def) Requested size: 198.0011pt x 171.40878pt.
LaTeX Warning: `h' float specifier changed to `ht'.
[1{/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map} <./fig
_levels.png>]
<fig_edge_switch.png, id=48, 859.65166pt x 378.33345pt>
File: fig_edge_switch.png Graphic file (type png)
<use fig_edge_switch.png>
Package pdftex.def Info: fig_edge_switch.png used on input line 141.
(pdftex.def) Requested size: 341.9989pt x 150.51671pt.
<fig_parity_subgraph.png, id=50, 1076.46165pt x 319.79475pt>
File: fig_parity_subgraph.png Graphic file (type png)
<use fig_parity_subgraph.png>
Package pdftex.def Info: fig_parity_subgraph.png used on input line 159.
(pdftex.def) Requested size: 360.0pt x 106.9477pt.
LaTeX Warning: `h' float specifier changed to `ht'.
[2 <./fig_level_cycle.png> <./fig_edge_switch.png>] [3 <./fig_parity_subgraph.p
ng>] [4] (./paper.aux)
Package rerunfilecheck Info: File `paper.out' has not changed.
(rerunfilecheck) Checksum: DC9FD452C972FF1938BE7060890FAD7C;765.
)
Here is how much of TeX's memory you used:
9727 strings out of 478268
150592 string characters out of 5846347
450778 words of memory out of 5000000
27640 multiletter control sequences out of 15000+600000
475666 words of font info for 53 fonts, out of 8000000 for 9000
1302 hyphenation exceptions out of 8191
69i,8n,76p,781b,427s stack positions out of 10000i,1000n,20000p,200000b,200000s
</usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb
></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmcsc10.pfb
></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.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/cmmi7.pfb></u
sr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr
/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmr7.pfb></usr/lo
cal/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmr8.pfb></usr/local
/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/local/
texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb></usr/local/te
xlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb></usr/local/tex
live/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti8.pfb></usr/local/texli
ve/2022/texmf-dist/fonts/type1/public/amsfonts/symbols/msam10.pfb>
Output written on paper.pdf (4 pages, 530157 bytes).
PDF statistics:
145 PDF objects out of 1000 (max. 8388607)
103 compressed objects within 2 object streams
25 named destinations out of 1000 (max. 500000)
61 words of extra memory for PDF output out of 10000 (max. 10000000)
@@ -0,0 +1,5 @@
\BOOKMARK [1][-]{section.1}{\376\377\0001\000.\000\040\000I\000n\000t\000r\000o\000d\000u\000c\000t\000i\000o\000n}{}% 1
\BOOKMARK [1][-]{section.2}{\376\377\0002\000.\000\040\000D\000e\000f\000i\000n\000i\000t\000i\000o\000n\000s}{}% 2
\BOOKMARK [1][-]{section.3}{\376\377\0003\000.\000\040\000O\000u\000t\000e\000r\000p\000l\000a\000n\000a\000r\000i\000t\000y\000\040\000o\000f\000\040\000l\000e\000v\000e\000l\000\040\000c\000o\000m\000p\000o\000n\000e\000n\000t\000s}{}% 3
\BOOKMARK [1][-]{section.4}{\376\377\0004\000.\000\040\000E\000v\000e\000n\000\040\000L\000e\000v\000e\000l\000\040\000G\000r\000a\000p\000h\000s}{}% 4
\BOOKMARK [2][-]{section*.1}{\376\377\000E\000m\000p\000i\000r\000i\000c\000a\000l\000\040\000s\000t\000a\000t\000u\000s}{section.4}% 5
Binary file not shown.
@@ -0,0 +1,286 @@
%% filename: amsart-template.tex
%% version: 1.1
%% date: 2014/07/24
%%
%% American Mathematical Society
%% Technical Support
%% Publications Technical Group
%% 201 Charles Street
%% Providence, RI 02904
%% USA
%% tel: (401) 455-4080
%% (800) 321-4267 (USA and Canada only)
%% fax: (401) 331-3842
%% email: tech-support@ams.org
%%
%% Copyright 2008-2010, 2014 American Mathematical Society.
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% http://www.latex-project.org/lppl.txt
%% and version 1.3c or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.
%%
%% This work has the LPPL maintenance status `maintained'.
%%
%% The Current Maintainer of this work is the American Mathematical
%% Society.
%%
%% ====================================================================
% AMS-LaTeX v.2 template for use with amsart
%
% Remove any commented or uncommented macros you do not use.
\documentclass{amsart}
\usepackage{hyperref}
\usepackage{enumitem}
\usepackage{graphicx}
\newtheorem{theorem}{Theorem}[section]
\newtheorem{lemma}[theorem]{Lemma}
\newtheorem{proposition}[theorem]{Proposition}
\theoremstyle{definition}
\newtheorem{definition}[theorem]{Definition}
\newtheorem{example}[theorem]{Example}
\newtheorem{xca}[theorem]{Exercise}
\newtheorem{conjecture}[theorem]{Conjecture}
\newtheorem{question}[theorem]{Question}
\newtheorem{observation}[theorem]{Observation}
\theoremstyle{remark}
\newtheorem{remark}[theorem]{Remark}
\numberwithin{equation}{section}
\begin{document}
\title{Even Level Graph Generators}
% Remove any unused author tags.
% author one information
\author{Eric Bauerfeld}
\address{}
\curraddr{}
\email{}
\thanks{}
\subjclass[2010]{Primary }
\keywords{}
\date{}
\dedicatory{}
\begin{abstract}
\end{abstract}
\maketitle
\section{Introduction}
\section{Definitions}
Throughout, $G = (V, E)$ is a plane maximal planar graph (a triangulation)
with a fixed planar embedding $\Pi_G$. We write $|V| = n$, so $|E| = 3n - 6$
and $G$ has $2n - 4$ triangular faces.
\begin{definition}[Level source]
A \emph{level source} of $G$ is any vertex $v \in V$; we write
$S = \{v\}$ for the level-0 source.
\end{definition}
\begin{definition}[Levels]
Given a level source $S \subseteq V$, the \emph{level} of $v \in V$ is
$\ell_G(v) = \mathrm{dist}_G(v, S)$, the graph distance from $v$ to the nearest
source vertex.
\end{definition}
\begin{figure}[h]
\centering
\includegraphics[width=0.55\textwidth]{fig_levels.png}
\caption{BFS levels from the degree-$3$ vertex source $S = \{4\}$.
The source is level $0$, its three neighbours are level $1$, and the
remaining vertices are level $2$. Colour encodes the level.}
\label{fig:levels}
\end{figure}
\begin{definition}[Level cycle]
A \emph{level cycle} of $G$ (with respect to a level source $S$) is a
simple cycle in $G$ all of whose vertices have the same level.
\end{definition}
\begin{figure}[h]
\centering
\includegraphics[width=0.55\textwidth]{fig_level_cycle.png}
\caption{A level cycle in the triangulation of Figure~\ref{fig:levels}.
The triangle $1\!-\!2\!-\!3$ is a simple cycle whose three vertices all
lie at level $1$, so it is a level cycle at level $1$.}
\label{fig:level-cycle}
\end{figure}
\begin{definition}[Edge switch]
\label{def:edge-switch}
Let $G$ be a triangulation with level source $S$, and let $e = uv$ be an
edge of a level cycle of $G$. The \emph{edge switch} at $e$ is the edge
flip on $e$: writing $uvw$ and $uvx$ for the two triangular faces of $G$
containing $e$, the edge $uv$ is removed and the edge $wx$ is added. As
with any edge flip, the result is a triangulation on the same vertex set
provided $w$ and $x$ are non-adjacent in $G$.
\end{definition}
\begin{figure}[h]
\centering
\includegraphics[width=0.95\textwidth]{fig_edge_switch.png}
\caption{An edge switch on the level cycle of
Figure~\ref{fig:level-cycle}. The chosen cycle edge $1\!-\!2$ is shared
by the triangular faces $(0,1,2)$ and $(1,2,4)$; the switch deletes
$1\!-\!2$ (red, left) and inserts $0\!-\!4$ (green, right). Vertex
colours indicate the original levels in $G$.}
\label{fig:edge-switch}
\end{figure}
\begin{definition}[Parity subgraph]
Let $G$ be a triangulation with level source $S$, and let $G'$ be a triangulation
on the same vertex set as $G$. The \emph{even parity subgraph} $E_{G,S}(G')$ is
the subgraph of $G'$ induced by $\{v \in V : \ell_G(v) \equiv 0 \pmod 2\}$. The
\emph{odd parity subgraph} is defined analogously for odd $\ell_G$.
\end{definition}
\begin{figure}[h]
\centering
\includegraphics[width=\textwidth]{fig_parity_subgraph.png}
\caption{Parity subgraphs of $G' = T$ with respect to the level structure of
Figure~\ref{fig:levels} (here we take $G = G' = T$). Left: $T$ with vertices
coloured by $\ell_G \bmod 2$ (blue $=$ even, orange $=$ odd). Middle: the
even parity subgraph $E_{G,S}(G')$, induced on $\{0, 4, 5, 6\}$; only
edges with both endpoints even appear. Right: the odd parity subgraph
$O_{G,S}(G')$, induced on $\{1, 2, 3\}$; the highlighted triangle shows
that $O_{G,S}(G')$ is not bipartite for this choice of $G'$.}
\label{fig:parity-subgraph}
\end{figure}
\section{Outerplanarity of level components}
\label{sec:outerplanar-components}
For each integer $k \geq 0$ and each $(G, S)$, write $L_k$ for the
subgraph of $G$ induced by the level-$k$ vertices. A \emph{level
component} of $G$ (with respect to $S$) is a connected component of
some $L_k$.
\begin{theorem}
\label{thm:outerplanar-component}
For every plane triangulation $G$ and every level source $S$ of $G$,
every level component of $G$ is outerplanar.
\end{theorem}
\begin{proof}
Since every subgraph of an outerplanar graph is outerplanar, it suffices
to show that each level subgraph $L_k$ is outerplanar. For $k = 0$,
$L_0 = S$ is a single vertex and is trivially outerplanar.
Fix $k \geq 1$ and let $D_k$ be the drawing of $L_k$ inherited from
$\Pi_G$. Let $F^\ast$ be the face of $D_k$ containing the source.
Suppose for contradiction that some $u \in L_k$ does not lie on
$\partial F^\ast$, so $u$ lies on the boundary of some other face of
$D_k$. Take any path $P$ in $G$ from $v_0 \in S$ to $u$. As a curve in
$\Pi_G$, $P$ starts in $F^\ast$ and ends at a point off $\partial
F^\ast$, so it must transition from $F^\ast$ to a different face of
$D_k$; in a planar embedding this can happen only at a vertex of
$D_k$, that is, at a level-$k$ vertex $w$ on $P$. Either $w \neq u$
(so $P$ has length $\geq \mathrm{dist}_G(S, w) + 1 \geq k + 1$), or
$w = u$ (contradicting $u \notin \partial F^\ast$). Since every
$S$-to-$u$ path has length $\geq k + 1$, $\mathrm{dist}_G(S, u) \geq
k + 1$, contradicting $u \in L_k$.
\end{proof}
\section{Even Level Graphs}
\label{sec:even-level-graphs}
\begin{definition}[Even Level Graph]
\label{def:even-level-graph}
A plane triangulation $G$ with level source $S$ is an \emph{Even Level
Graph} if every level cycle of $G$ has even length.
\end{definition}
\begin{theorem}
\label{thm:even-level-4colorable}
Every Even Level Graph is $4$-colorable.
\end{theorem}
\begin{proof}
Since adjacent vertices in $G$ have levels differing by at most $1$,
any edge between two same-parity endpoints in fact connects two
vertices at the same level. Hence
\[
E_{G,S}(G) \;=\; \bigsqcup_{i \geq 0} L_{2i},
\qquad
O_{G,S}(G) \;=\; \bigsqcup_{i \geq 0} L_{2i+1},
\]
and each $L_k$ is bipartite because its cycles are level cycles of
$G$, which have even length by hypothesis. Choose a $2$-coloring of
$E_{G,S}(G)$ in $\{\text{red}, \text{blue}\}$ and a $2$-coloring of
$O_{G,S}(G)$ in $\{\text{yellow}, \text{green}\}$. Same-parity edges
of $G$ are properly colored by the respective bipartition;
opposite-parity edges connect $\{\text{red}, \text{blue}\}$ to
$\{\text{yellow}, \text{green}\}$. The combined assignment is a
proper $4$-coloring of $G$.
\end{proof}
\begin{definition}[Derived level graph]
\label{def:derived-level-graph}
Let $G$ be an Even Level Graph with level source $S$, and let $E$ and
$O$ denote the edge sets of the even and odd parity subgraphs
$E_{G,S}(G)$ and $O_{G,S}(G)$. A \emph{derived level graph} of $G$ is
a triangulation $G'$ on the same vertex set as $G$ obtained by a
sequence of edge switches (Definition~\ref{def:edge-switch}), each
acting on an edge of $E$ or of $O$. We do not update $E$ or $O$ to
reflect the level structure of intermediate triangulations: throughout
the sequence, an edge is classified as belonging to $E$ (resp.\ $O$) if
and only if both of its endpoints have even (resp.\ odd) level in $G$.
A derived level graph $G'$ is \emph{valid} if both $E_{G,S}(G')$ and
$O_{G,S}(G')$ contain only even cycles.
\end{definition}
\begin{definition}[Intertwining tree]
\label{def:intertwining-tree}
A maximal planar graph $G$ is an \emph{intertwining tree} if its
vertex set can be partitioned into two sets $A$ and $B$ such that
both induced subgraphs $G[A]$ and $G[B]$ are trees.
\end{definition}
\begin{conjecture}
\label{conj:every-triangulation-derived}
Every maximal planar graph is a valid derived level graph of some Even
Level Graph, an intertwining tree, or both.
\end{conjecture}
\subsection*{Empirical status}
For each isomorphism class of maximal planar graphs on $n$ vertices,
we ask whether (i) some isomorphic representative is reachable from
some Even Level Graph via $E/O$-edge switches (``derived''), and/or
(ii) it is an intertwining tree. The conjecture holds for the class
iff at least one of (i), (ii) holds.
\begin{center}
\begin{tabular}{rcccccc}
$n$ & \# iso & derived only & inter.\ only & both & missing & status \\\hline
$6$ & $2$ & $0$ & $0$ & $2$ & $0$ & holds \\
$7$ & $5$ & $0$ & $0$ & $5$ & $0$ & holds \\
$8$ & $14$ & $0$ & $0$ & $14$ & $0$ & holds \\
$9$ & $50$ & $0$ & $1$ & $49$ & $0$ & holds \\
$10$ & $233$ & $0$ & $0$ & $233$ & $0$ & holds \\
$11$ & $1249$ & $0$ & $0$ & $1249$ & $0$ & holds \\
\end{tabular}
\end{center}
\end{document}