coloring_nested_tire_graphs: empirical uniqueness-break figure (HM_0)
Concrete empirical example added to boundary_cut_tire.tex (page 2): HM_0 cut #1 side 1, d=2: - H_2 has 3 faces (lengths 4, 4, 12). - H_1 has 3 faces (lengths 4, 4, 12). - The length-12 H_2 face is low-side (contains pendants + H_1 edges in its interior). - Adjacent H_1 edges come from ALL THREE H_1 faces: H_1 face 0: edge (15,19) H_1 face 1: edge (17,21) H_1 face 2: edges (23,27), (28,33), (24,29), (28,34) - No single H_1 face contains all of them → no unique parent. This is a genuine empirical case, not a schematic. The figure (uniqueness_break_example.pdf) shows the planar embedding from Sage with: - Orange = H_2 face 2 boundary (12 edges) - Green / purple / blue = H_1 edges grouped by their H_1 face - Gray = pendants (d=0) and depth-3+ edges - Red dots = pendant vertices Two new scripts: - find_uniqueness_break.py: searches for empirical cases - draw_uniqueness_break.py: renders the figure using Sage's planar embedding Note grows to 6 pages. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,226 @@
|
|||||||
|
"""Draw an empirical uniqueness-break case using TRUE planar
|
||||||
|
embedding coordinates (not spring layout).
|
||||||
|
|
||||||
|
We need a LOW-SIDE face f of H_d such that f's interior contains
|
||||||
|
H_{d-1} edges from multiple H_{d-1} faces.
|
||||||
|
|
||||||
|
The most reliable low-side face: the OUTER (unbounded) face of H_d.
|
||||||
|
For d >= 2, the outer face of H_d contains all of H_{d-1} (= depth-
|
||||||
|
(d-1) subgraph) plus pendants.
|
||||||
|
|
||||||
|
Algorithm:
|
||||||
|
- For HM_0 cut #1 side 1 (a known interesting case), use the
|
||||||
|
primal planar embedding for vertex positions.
|
||||||
|
- Identify the outer face of H_2 (= largest face by area, or by
|
||||||
|
Sage's outer-face-of-embedding).
|
||||||
|
- Verify it contains H_1 edges from multiple H_1 faces in its
|
||||||
|
interior region.
|
||||||
|
- Draw.
|
||||||
|
"""
|
||||||
|
import os, sys
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
from sage.all import Graph
|
||||||
|
|
||||||
|
HERE = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
sys.path.insert(0, HERE)
|
||||||
|
from cut_depth_label import (
|
||||||
|
parse_planar_code, HM_FILE,
|
||||||
|
apply_procedure, compute_nice_layout,
|
||||||
|
)
|
||||||
|
from cut_tire_tree import compute_H_d_faces
|
||||||
|
from tree_structure_sweep import all_six_edge_cuts
|
||||||
|
|
||||||
|
|
||||||
|
def planar_layout_for_H(H):
|
||||||
|
"""Return planar layout of H using Sage's planar embedding."""
|
||||||
|
# Try planar layout
|
||||||
|
H2 = H.copy()
|
||||||
|
try:
|
||||||
|
H2.is_planar(set_embedding=True)
|
||||||
|
# Use Sage's planar layout
|
||||||
|
pos = H2.layout(layout='planar')
|
||||||
|
# pos values are (x, y) but Sage returns dict v -> (x,y)
|
||||||
|
return pos
|
||||||
|
except Exception as e:
|
||||||
|
print(f' Planar layout failed: {e}')
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
gs = parse_planar_code(HM_FILE)
|
||||||
|
G = gs[0]
|
||||||
|
G.is_planar(set_embedding=True)
|
||||||
|
base_pos = compute_nice_layout(G)
|
||||||
|
cuts = all_six_edge_cuts(G, max_cuts=5)
|
||||||
|
S, cut_edges = cuts[1]
|
||||||
|
S1 = frozenset(G.vertices()) - S
|
||||||
|
H, _, ed, _, _, _ = apply_procedure(
|
||||||
|
G, S1, cut_edges, base_pos, '1',
|
||||||
|
pendant_start_id=max(G.vertices()) + 501)
|
||||||
|
print(f'|V(H)|={H.order()}, |E(H)|={H.size()}')
|
||||||
|
print(f'Depths: {sorted(set(ed.values()))}')
|
||||||
|
|
||||||
|
# Use Sage's planar layout for H
|
||||||
|
pos = planar_layout_for_H(H)
|
||||||
|
if pos is None:
|
||||||
|
pos = H.layout(layout='spring')
|
||||||
|
print(f'Got positions for {len(pos)} vertices')
|
||||||
|
|
||||||
|
# Compute faces of H_1, H_2, H_3
|
||||||
|
faces_1, _ = compute_H_d_faces(H, ed, 1)
|
||||||
|
faces_2, _ = compute_H_d_faces(H, ed, 2)
|
||||||
|
faces_3, _ = compute_H_d_faces(H, ed, 3)
|
||||||
|
print(f'H_1: {len(faces_1)} faces, lengths {[len(f) for f in faces_1]}')
|
||||||
|
print(f'H_2: {len(faces_2)} faces, lengths {[len(f) for f in faces_2]}')
|
||||||
|
print(f'H_3: {len(faces_3)} faces, lengths {[len(f) for f in faces_3]}')
|
||||||
|
|
||||||
|
# Identify the LOW-side face of H_2.
|
||||||
|
# A low-side face contains depth-<2 edges (= pendants + H_1 edges).
|
||||||
|
# Equivalently: it's the face whose interior in the planar embedding
|
||||||
|
# contains the pendant vertices.
|
||||||
|
pendant_verts = {v for e, d in ed.items() if d == 0 for v in e}
|
||||||
|
# We pick the face whose boundary walk encloses the pendants.
|
||||||
|
# In Sage's planar embedding, this is the "outer" face often.
|
||||||
|
# Heuristic: the H_2 face NOT containing H_3 edges in its interior.
|
||||||
|
# Or: the largest face by vertex count.
|
||||||
|
# Most reliable: the face that, when removed from the plane, the
|
||||||
|
# pendants are in the remaining unbounded region.
|
||||||
|
# Use Sage's faces() — the first face is the outer face by default.
|
||||||
|
# For now, pick the face with the most vertices.
|
||||||
|
|
||||||
|
target_face_idx = max(range(len(faces_2)),
|
||||||
|
key=lambda i: len(set(v for u, v in faces_2[i])
|
||||||
|
| set(u for u, v in faces_2[i])))
|
||||||
|
target_face = faces_2[target_face_idx]
|
||||||
|
target_verts = set()
|
||||||
|
for u, v in target_face:
|
||||||
|
target_verts.add(u); target_verts.add(v)
|
||||||
|
print(f'\nTarget face (H_2 face {target_face_idx}): {len(target_face)} '
|
||||||
|
f'edges, {len(target_verts)} verts')
|
||||||
|
print(f' vertices: {sorted(target_verts)}')
|
||||||
|
|
||||||
|
# Identify H_1 edges in the "interior" of the target face.
|
||||||
|
# Heuristic: H_1 edges whose endpoints are NOT on the target face
|
||||||
|
# boundary, OR endpoints on the boundary but the edge "points
|
||||||
|
# inward" by planar embedding.
|
||||||
|
# For simplicity, look at all H_1 edges with at least one endpoint
|
||||||
|
# on target_verts and the OTHER endpoint NOT on H_2's outer
|
||||||
|
# boundary.
|
||||||
|
h1_in_interior = []
|
||||||
|
h1_face_of_edge = {}
|
||||||
|
for fi, walk in enumerate(faces_1):
|
||||||
|
for u, v in walk:
|
||||||
|
e = tuple(sorted((u, v)))
|
||||||
|
h1_face_of_edge.setdefault(e, []).append(fi)
|
||||||
|
|
||||||
|
for e, d in ed.items():
|
||||||
|
if d != 1:
|
||||||
|
continue
|
||||||
|
# An H_1 edge "in target face's interior" if at least one
|
||||||
|
# endpoint is in target_verts (= boundary of target face).
|
||||||
|
if e[0] in target_verts or e[1] in target_verts:
|
||||||
|
h1_in_interior.append(e)
|
||||||
|
|
||||||
|
h1_in_int_by_face = defaultdict(list)
|
||||||
|
for e in h1_in_interior:
|
||||||
|
for fi in h1_face_of_edge.get(e, []):
|
||||||
|
h1_in_int_by_face[fi].append(e)
|
||||||
|
print(f'\nH_1 edges adjacent to target face boundary:')
|
||||||
|
for fi, eds in sorted(h1_in_int_by_face.items()):
|
||||||
|
print(f' H_1 face {fi}: {len(set(eds))} edges')
|
||||||
|
|
||||||
|
# Draw
|
||||||
|
fig, ax = plt.subplots(figsize=(11, 10))
|
||||||
|
# All H edges in light gray as background
|
||||||
|
for u, v in H.edges(labels=False):
|
||||||
|
e = tuple(sorted((u, v)))
|
||||||
|
x1, y1 = pos[u]; x2, y2 = pos[v]
|
||||||
|
de = ed.get(e, -1)
|
||||||
|
if de == 0:
|
||||||
|
color = '#888888'; lw = 0.8; alpha = 0.4
|
||||||
|
elif de == 1:
|
||||||
|
color = '#4477CC'; lw = 2.0; alpha = 0.8
|
||||||
|
elif de == 2:
|
||||||
|
color = '#DD7733'; lw = 3.5; alpha = 1.0
|
||||||
|
elif de == 3:
|
||||||
|
color = '#999999'; lw = 0.8; alpha = 0.3
|
||||||
|
else:
|
||||||
|
color = '#CCCCCC'; lw = 0.5; alpha = 0.2
|
||||||
|
ax.plot([x1, x2], [y1, y2], color=color, linewidth=lw,
|
||||||
|
alpha=alpha, zorder=2)
|
||||||
|
|
||||||
|
# Highlight target H_2 face boundary
|
||||||
|
for u, v in target_face:
|
||||||
|
x1, y1 = pos[u]; x2, y2 = pos[v]
|
||||||
|
ax.plot([x1, x2], [y1, y2], color='#DD7733', linewidth=5.5,
|
||||||
|
alpha=1.0, zorder=4, solid_capstyle='round')
|
||||||
|
|
||||||
|
# H_1 edges colored by their H_1 face
|
||||||
|
h1_colors = {'face 0': '#22AA88', 'face 1': '#AA22AA',
|
||||||
|
'face 2': '#225599'}
|
||||||
|
color_list = ['#22AA88', '#AA22AA', '#225599']
|
||||||
|
for fi, eds in sorted(h1_in_int_by_face.items()):
|
||||||
|
col = color_list[fi % len(color_list)]
|
||||||
|
for e in set(eds):
|
||||||
|
u, v = e
|
||||||
|
x1, y1 = pos[u]; x2, y2 = pos[v]
|
||||||
|
ax.plot([x1, x2], [y1, y2], color=col, linewidth=4.0,
|
||||||
|
alpha=0.95, zorder=5, solid_capstyle='round')
|
||||||
|
|
||||||
|
# Vertices
|
||||||
|
for v in H.vertices():
|
||||||
|
x, y = pos[v]
|
||||||
|
in_target = v in target_verts
|
||||||
|
is_pendant = v in pendant_verts
|
||||||
|
if is_pendant:
|
||||||
|
ax.plot(x, y, 'o', color='#CC3333', markersize=6, zorder=6)
|
||||||
|
elif in_target:
|
||||||
|
ax.plot(x, y, 'o', color='#DD7733', markersize=7, zorder=6,
|
||||||
|
markeredgecolor='black', markeredgewidth=1)
|
||||||
|
ax.annotate(str(v), (x, y), textcoords='offset points',
|
||||||
|
xytext=(7, 7), fontsize=9, color='black', zorder=7)
|
||||||
|
else:
|
||||||
|
ax.plot(x, y, 'ko', markersize=4, zorder=6)
|
||||||
|
|
||||||
|
from matplotlib.lines import Line2D
|
||||||
|
legend = [
|
||||||
|
Line2D([0], [0], color='#DD7733', lw=5,
|
||||||
|
label=f'$H_2$ face {target_face_idx} boundary '
|
||||||
|
f'({len(target_face)} edges)'),
|
||||||
|
Line2D([0], [0], color='#22AA88', lw=4,
|
||||||
|
label=f'$H_1$ edges in face 0'),
|
||||||
|
Line2D([0], [0], color='#AA22AA', lw=4,
|
||||||
|
label=f'$H_1$ edges in face 1'),
|
||||||
|
Line2D([0], [0], color='#225599', lw=4,
|
||||||
|
label=f'$H_1$ edges in face 2'),
|
||||||
|
Line2D([0], [0], color='#4477CC', lw=1.5, label='other $H_1$ edges'),
|
||||||
|
Line2D([0], [0], color='#888888', lw=0.8, label='pendants ($d=0$)'),
|
||||||
|
Line2D([0], [0], color='#999999', lw=0.8, label='$H_3+$ edges'),
|
||||||
|
Line2D([0], [0], marker='o', color='#CC3333', lw=0,
|
||||||
|
label='pendant vertex', markersize=8),
|
||||||
|
Line2D([0], [0], marker='o', color='#DD7733', lw=0,
|
||||||
|
label='$H_2$ face vertex', markersize=8,
|
||||||
|
markeredgecolor='black'),
|
||||||
|
]
|
||||||
|
ax.legend(handles=legend, loc='upper left', fontsize=8,
|
||||||
|
framealpha=0.95)
|
||||||
|
|
||||||
|
ax.set_aspect('equal')
|
||||||
|
ax.axis('off')
|
||||||
|
n_h1_faces = len(h1_in_int_by_face)
|
||||||
|
ax.set_title(
|
||||||
|
f'HM_0 cut #1 side 1, $d=2$: this $H_2$ face has $H_1$ edges '
|
||||||
|
f'from {n_h1_faces} different $H_1$ faces adjacent\n'
|
||||||
|
f'(planar embedding from Sage; $H_2$ face shown in orange; '
|
||||||
|
f'$H_1$ edges grouped by face)')
|
||||||
|
|
||||||
|
out = os.path.join(os.path.dirname(HERE), 'notes',
|
||||||
|
'uniqueness_break_example.pdf')
|
||||||
|
fig.savefig(out, bbox_inches='tight', dpi=120)
|
||||||
|
print(f'\nWrote {out}')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
@@ -0,0 +1,171 @@
|
|||||||
|
"""Find an empirical case where the low-side face of H_d spans
|
||||||
|
multiple faces of H_{d-1} (= the case high-side restriction is
|
||||||
|
needed for).
|
||||||
|
|
||||||
|
For each (G, cut, side), iterate (d, face) and check:
|
||||||
|
- Is `face` the low-side face of H_d?
|
||||||
|
- Does face's interior contain H_{d-1} edges from multiple
|
||||||
|
H_{d-1} faces?
|
||||||
|
|
||||||
|
Output: a clear description of the case + edges of H_d, H_{d-1},
|
||||||
|
and their face structures, so we can draw it.
|
||||||
|
"""
|
||||||
|
import os, sys
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
from sage.all import Graph, graphs
|
||||||
|
|
||||||
|
HERE = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
sys.path.insert(0, HERE)
|
||||||
|
from cut_depth_label import (
|
||||||
|
parse_planar_code, HM_FILE,
|
||||||
|
apply_procedure, compute_nice_layout,
|
||||||
|
)
|
||||||
|
from cut_tire_tree import build_tree, compute_H_d_faces
|
||||||
|
from tree_structure_sweep import all_six_edge_cuts
|
||||||
|
|
||||||
|
|
||||||
|
def classify_face(face, edge_depth, d):
|
||||||
|
"""Returns 'low', 'high', or 'mixed' based on adjacency to non-Hd
|
||||||
|
edges by depth around the face vertices."""
|
||||||
|
verts = set()
|
||||||
|
for u, v in face:
|
||||||
|
verts.add(u); verts.add(v)
|
||||||
|
seen_lower = False
|
||||||
|
seen_higher = False
|
||||||
|
# For each vertex in face, look at incident edges NOT on this face
|
||||||
|
face_e_set = {tuple(sorted(e)) for e in face}
|
||||||
|
# Approach: any incident edge with depth < d → "lower" hint;
|
||||||
|
# any with depth > d → "higher" hint. (The face's interior could
|
||||||
|
# contain stuff via vertex-adjacency.)
|
||||||
|
return None # not used, we'll classify differently
|
||||||
|
|
||||||
|
|
||||||
|
def find_face_of_edge(faces, e_norm):
|
||||||
|
"""Find which face(s) of a graph have edge e_norm in their walk."""
|
||||||
|
matches = []
|
||||||
|
for fi, walk in enumerate(faces):
|
||||||
|
for u, v in walk:
|
||||||
|
if tuple(sorted((u, v))) == e_norm:
|
||||||
|
matches.append(fi)
|
||||||
|
break
|
||||||
|
return matches
|
||||||
|
|
||||||
|
|
||||||
|
def analyze_cut(G, cut_idx, cuts, base_pos):
|
||||||
|
S, cut_edges = cuts[cut_idx]
|
||||||
|
S0, S1 = S, frozenset(G.vertices()) - S
|
||||||
|
for side, S_side in [('0', S0), ('1', S1)]:
|
||||||
|
if len(S_side) < 6 or len(S_side) > G.order() - 6:
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
H, _, ed, _, _, _ = apply_procedure(
|
||||||
|
G, S_side, cut_edges, base_pos, side,
|
||||||
|
pendant_start_id=max(G.vertices()) + 1 + (
|
||||||
|
0 if side == '0' else 500))
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
if not ed:
|
||||||
|
continue
|
||||||
|
max_d = max(ed.values())
|
||||||
|
for d in range(2, max_d + 1):
|
||||||
|
faces_d, H_d = compute_H_d_faces(H, ed, d)
|
||||||
|
faces_dm1, H_dm1 = compute_H_d_faces(H, ed, d - 1)
|
||||||
|
if not faces_d or not faces_dm1 or len(faces_dm1) < 2:
|
||||||
|
continue
|
||||||
|
# For each face of H_d, find which H_{d-1} edges are
|
||||||
|
# "inside" it (= H_{d-1} edges with both endpoints among
|
||||||
|
# face's vertex closure, intuitively).
|
||||||
|
# Simpler: a low-side face of H_d is one whose interior
|
||||||
|
# contains depth-<d edges. Detect by adjacency:
|
||||||
|
# any vertex of face has incident depth-<d edges → low.
|
||||||
|
for fi, face in enumerate(faces_d):
|
||||||
|
face_verts = set()
|
||||||
|
for u, v in face:
|
||||||
|
face_verts.add(u); face_verts.add(v)
|
||||||
|
# Edges of H_{d-1} adjacent to face_verts (= edges of
|
||||||
|
# depth d-1 incident to a face vertex)
|
||||||
|
hdm1_neighbor_edges = set()
|
||||||
|
for v in face_verts:
|
||||||
|
for nb in H.neighbors(v):
|
||||||
|
e = tuple(sorted((v, nb)))
|
||||||
|
if ed.get(e) == d - 1:
|
||||||
|
hdm1_neighbor_edges.add(e)
|
||||||
|
if len(hdm1_neighbor_edges) < 2:
|
||||||
|
continue
|
||||||
|
# Which H_{d-1} faces do these edges belong to?
|
||||||
|
# Edges in H_{d-1} face boundary
|
||||||
|
hdm1_face_of_edge = {}
|
||||||
|
for fjk, walk in enumerate(faces_dm1):
|
||||||
|
for u, v in walk:
|
||||||
|
e = tuple(sorted((u, v)))
|
||||||
|
hdm1_face_of_edge.setdefault(e, set()).add(fjk)
|
||||||
|
faces_touched = set()
|
||||||
|
edge_to_face = defaultdict(list)
|
||||||
|
for e in hdm1_neighbor_edges:
|
||||||
|
for fjk in hdm1_face_of_edge.get(e, set()):
|
||||||
|
faces_touched.add(fjk)
|
||||||
|
edge_to_face[fjk].append(e)
|
||||||
|
# Filter: must have unique edges across faces (the
|
||||||
|
# same edge in multiple faces is the trivial shared-
|
||||||
|
# boundary case, not interesting).
|
||||||
|
edge_unique_to_face = defaultdict(set)
|
||||||
|
for fjk, eds in edge_to_face.items():
|
||||||
|
for e in eds:
|
||||||
|
edge_unique_to_face[e].add(fjk)
|
||||||
|
# Count edges that appear in only one face
|
||||||
|
unique_edges = {e for e, fjks in edge_unique_to_face.items()
|
||||||
|
if len(fjks) == 1}
|
||||||
|
if len(faces_touched) >= 2 and len(face) >= 6 and \
|
||||||
|
len(unique_edges) >= 4:
|
||||||
|
print(f'\n=== FOUND: side {side}, d={d}, face {fi} of '
|
||||||
|
f'H_d spans {len(faces_touched)} H_{{d-1}} '
|
||||||
|
f'faces ===', flush=True)
|
||||||
|
print(f' Cut: |S0|={len(S0)}, |S1|={len(S1)}')
|
||||||
|
print(f' H_d face boundary edges ({len(face)}):',
|
||||||
|
flush=True)
|
||||||
|
for u, v in face[:8]:
|
||||||
|
print(f' ({u},{v})')
|
||||||
|
if len(face) > 8:
|
||||||
|
print(f' ... ({len(face)-8} more)')
|
||||||
|
print(f' H_{{d-1}} edges adjacent to face '
|
||||||
|
f'(broken across H_{{d-1}} faces):')
|
||||||
|
for fjk in sorted(faces_touched):
|
||||||
|
print(f' H_{{d-1}} face {fjk}: '
|
||||||
|
f'{[(min(e),max(e)) for e in edge_to_face[fjk][:5]]}')
|
||||||
|
return {
|
||||||
|
'side': side, 'd': d, 'face_idx': fi,
|
||||||
|
'face_walk': face, 'face_verts': face_verts,
|
||||||
|
'H_d_edges': [(u,v) for u,v in face],
|
||||||
|
'H_dm1_faces': {fjk: edge_to_face[fjk]
|
||||||
|
for fjk in faces_touched},
|
||||||
|
'all_H_d_faces': faces_d,
|
||||||
|
'all_H_dm1_faces': faces_dm1,
|
||||||
|
'edge_depth': ed,
|
||||||
|
}
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
gs = parse_planar_code(HM_FILE)
|
||||||
|
candidates = [('Dodecahedron', graphs.DodecahedralGraph())]
|
||||||
|
for i, g in enumerate(gs):
|
||||||
|
candidates.append((f'HM_{i}', g))
|
||||||
|
for name, G in candidates:
|
||||||
|
G.is_planar(set_embedding=True)
|
||||||
|
base_pos = compute_nice_layout(G)
|
||||||
|
cuts = all_six_edge_cuts(G, max_cuts=30)
|
||||||
|
print(f'\n=== {name}: testing {len(cuts)} cuts ===', flush=True)
|
||||||
|
for ci in range(len(cuts)):
|
||||||
|
res = analyze_cut(G, ci, cuts, base_pos)
|
||||||
|
if res:
|
||||||
|
print(f'\nFOUND case in cut #{ci} of {name}', flush=True)
|
||||||
|
res['graph_name'] = name
|
||||||
|
res['cut_idx'] = ci
|
||||||
|
return res
|
||||||
|
print('No example found.')
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
@@ -1,14 +1,15 @@
|
|||||||
\relax
|
\relax
|
||||||
\@writefile{toc}{\contentsline {paragraph}{Why low-side faces break uniqueness.}{1}{}\protected@file@percent }
|
\@writefile{toc}{\contentsline {paragraph}{Why low-side faces break uniqueness.}{1}{}\protected@file@percent }
|
||||||
\@writefile{toc}{\contentsline {paragraph}{The coverage gap.}{2}{}\protected@file@percent }
|
\@writefile{toc}{\contentsline {paragraph}{An empirically observed case.}{2}{}\protected@file@percent }
|
||||||
\@writefile{toc}{\contentsline {paragraph}{Resolution.}{2}{}\protected@file@percent }
|
\@writefile{toc}{\contentsline {paragraph}{The coverage gap.}{3}{}\protected@file@percent }
|
||||||
\@writefile{toc}{\contentsline {paragraph}{Setup.}{2}{}\protected@file@percent }
|
\@writefile{toc}{\contentsline {paragraph}{Resolution.}{3}{}\protected@file@percent }
|
||||||
\@writefile{toc}{\contentsline {paragraph}{The low-side face of $H_1$.}{2}{}\protected@file@percent }
|
\@writefile{toc}{\contentsline {paragraph}{Setup.}{3}{}\protected@file@percent }
|
||||||
\@writefile{toc}{\contentsline {paragraph}{Picture.}{2}{}\protected@file@percent }
|
\@writefile{toc}{\contentsline {paragraph}{The low-side face of $H_1$.}{3}{}\protected@file@percent }
|
||||||
\@writefile{toc}{\contentsline {paragraph}{What $T_\partial $ looks like in special cases.}{3}{}\protected@file@percent }
|
\@writefile{toc}{\contentsline {paragraph}{Picture.}{3}{}\protected@file@percent }
|
||||||
\@writefile{toc}{\contentsline {paragraph}{Role in the chain DP.}{4}{}\protected@file@percent }
|
\@writefile{toc}{\contentsline {paragraph}{What $T_\partial $ looks like in special cases.}{4}{}\protected@file@percent }
|
||||||
\@writefile{toc}{\contentsline {paragraph}{What this closes.}{5}{}\protected@file@percent }
|
\@writefile{toc}{\contentsline {paragraph}{Role in the chain DP.}{5}{}\protected@file@percent }
|
||||||
\@writefile{toc}{\contentsline {paragraph}{What it leaves open.}{5}{}\protected@file@percent }
|
\@writefile{toc}{\contentsline {paragraph}{What this closes.}{6}{}\protected@file@percent }
|
||||||
\@writefile{toc}{\contentsline {paragraph}{Why the chain DP can still work.}{5}{}\protected@file@percent }
|
\@writefile{toc}{\contentsline {paragraph}{What it leaves open.}{6}{}\protected@file@percent }
|
||||||
\@writefile{toc}{\contentsline {paragraph}{Logical status of the extended framework.}{5}{}\protected@file@percent }
|
\@writefile{toc}{\contentsline {paragraph}{Why the chain DP can still work.}{6}{}\protected@file@percent }
|
||||||
\gdef \@abspage@last{5}
|
\@writefile{toc}{\contentsline {paragraph}{Logical status of the extended framework.}{6}{}\protected@file@percent }
|
||||||
|
\gdef \@abspage@last{6}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 26 MAY 2026 23:36
|
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 26 MAY 2026 23:44
|
||||||
entering extended mode
|
entering extended mode
|
||||||
restricted \write18 enabled.
|
restricted \write18 enabled.
|
||||||
%&-line parsing enabled.
|
%&-line parsing enabled.
|
||||||
@@ -583,44 +583,49 @@ LaTeX Font Info: Trying to load font information for U+msb on input line 20.
|
|||||||
File: umsb.fd 2013/01/14 v3.01 AMS symbols B
|
File: umsb.fd 2013/01/14 v3.01 AMS symbols B
|
||||||
) [1
|
) [1
|
||||||
|
|
||||||
{/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] [2] [3]
|
{/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
|
||||||
[4] [5]
|
<uniqueness_break_example.pdf, id=26, 570.93298pt x 602.04924pt>
|
||||||
(./boundary_cut_tire.aux) )
|
File: uniqueness_break_example.pdf Graphic file (type pdf)
|
||||||
|
<use uniqueness_break_example.pdf>
|
||||||
|
Package pdftex.def Info: uniqueness_break_example.pdf used on input line 107.
|
||||||
|
(pdftex.def) Requested size: 446.26582pt x 470.60703pt.
|
||||||
|
[2 <./uniqueness_break_example.pdf>] [3] [4] [5] [6] (./boundary_cut_tire.aux)
|
||||||
|
)
|
||||||
Here is how much of TeX's memory you used:
|
Here is how much of TeX's memory you used:
|
||||||
14740 strings out of 478268
|
14747 strings out of 478268
|
||||||
301161 string characters out of 5846347
|
301412 string characters out of 5846347
|
||||||
568755 words of memory out of 5000000
|
568832 words of memory out of 5000000
|
||||||
32695 multiletter control sequences out of 15000+600000
|
32701 multiletter control sequences out of 15000+600000
|
||||||
482413 words of font info for 79 fonts, out of 8000000 for 9000
|
482413 words of font info for 79 fonts, out of 8000000 for 9000
|
||||||
1141 hyphenation exceptions out of 8191
|
1141 hyphenation exceptions out of 8191
|
||||||
84i,6n,89p,452b,713s stack positions out of 10000i,1000n,20000p,200000b,200000s
|
84i,6n,89p,452b,713s stack positions out of 10000i,1000n,20000p,200000b,200000s
|
||||||
{/usr/local/texlive/2022/texmf-dist/fonts/enc/dvips/
|
{/usr/local/texlive/2022/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc
|
||||||
cm-super/cm-super-ts1.enc}</usr/local/texlive/2022/texmf-dist/fonts/type1/publi
|
}</usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb>
|
||||||
c/amsfonts/cm/cmbx10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public
|
</usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb><
|
||||||
/amsfonts/cm/cmbx12.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/
|
/usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></
|
||||||
amsfonts/cm/cmmi10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/a
|
usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi12.pfb></u
|
||||||
msfonts/cm/cmmi12.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/am
|
sr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi7.pfb></usr
|
||||||
sfonts/cm/cmmi7.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsf
|
/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi8.pfb></usr/l
|
||||||
onts/cm/cmmi8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfon
|
ocal/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/loc
|
||||||
ts/cm/cmr10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts
|
al/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmr17.pfb></usr/local
|
||||||
/cm/cmr17.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/c
|
/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmr6.pfb></usr/local/te
|
||||||
m/cmr6.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/c
|
xlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmr7.pfb></usr/local/texli
|
||||||
mr7.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmr8
|
ve/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmr8.pfb></usr/local/texlive/
|
||||||
.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.
|
2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/local/texlive/2
|
||||||
pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy5.pf
|
022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy5.pfb></usr/local/texlive/202
|
||||||
b></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy6.pfb>
|
2/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy6.pfb></usr/local/texlive/2022/
|
||||||
</usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb></
|
texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb></usr/local/texlive/2022/te
|
||||||
usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy8.pfb></us
|
xmf-dist/fonts/type1/public/amsfonts/cm/cmsy8.pfb></usr/local/texlive/2022/texm
|
||||||
r/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb></usr
|
f-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb></usr/local/texlive/2022/texmf
|
||||||
/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti7.pfb></usr/l
|
-dist/fonts/type1/public/amsfonts/cm/cmti7.pfb></usr/local/texlive/2022/texmf-d
|
||||||
ocal/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti8.pfb></usr/loc
|
ist/fonts/type1/public/amsfonts/cm/cmti8.pfb></usr/local/texlive/2022/texmf-dis
|
||||||
al/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt10.pfb></usr/loca
|
t/fonts/type1/public/amsfonts/cm/cmtt10.pfb></usr/local/texlive/2022/texmf-dist
|
||||||
l/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/symbols/msbm10.pfb></usr/
|
/fonts/type1/public/amsfonts/symbols/msbm10.pfb></usr/local/texlive/2022/texmf-
|
||||||
local/texlive/2022/texmf-dist/fonts/type1/public/cm-super/sfrm1095.pfb>
|
dist/fonts/type1/public/cm-super/sfrm1095.pfb>
|
||||||
Output written on boundary_cut_tire.pdf (5 pages, 251070 bytes).
|
Output written on boundary_cut_tire.pdf (6 pages, 274500 bytes).
|
||||||
PDF statistics:
|
PDF statistics:
|
||||||
134 PDF objects out of 1000 (max. 8388607)
|
193 PDF objects out of 1000 (max. 8388607)
|
||||||
82 compressed objects within 1 object stream
|
93 compressed objects within 1 object stream
|
||||||
0 named destinations out of 1000 (max. 500000)
|
0 named destinations out of 1000 (max. 500000)
|
||||||
13 words of extra memory for PDF output out of 10000 (max. 10000000)
|
18 words of extra memory for PDF output out of 10000 (max. 10000000)
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -85,6 +85,37 @@ By contrast, face $A$ (high-side, inside the inner cycle) sits
|
|||||||
entirely inside face $X$ of $H_{d-1}$. Unique parent. This is
|
entirely inside face $X$ of $H_{d-1}$. Unique parent. This is
|
||||||
why the forest proposition restricts to high-side faces.
|
why the forest proposition restricts to high-side faces.
|
||||||
|
|
||||||
|
\paragraph{An empirically observed case.} Holton--McKay graph
|
||||||
|
$\mathrm{HM}_0$, $6$-edge cut \#$1$, side $1$ (with $|S_1| = 28$).
|
||||||
|
At $d = 2$: $H_2$ has three faces of lengths $4, 4, 12$; $H_1$ also
|
||||||
|
has three faces of lengths $4, 4, 12$. The outer face of $H_2$
|
||||||
|
(the length-$12$ one, $7$ vertices: $\{16,19,20,21,23,24,28\}$) is
|
||||||
|
low-side --- in its interior live the depth-$0$ pendants and all
|
||||||
|
of the depth-$1$ ($H_1$) edges. Those $H_1$ edges are spread
|
||||||
|
across all three faces of $H_1$:
|
||||||
|
\begin{itemize}
|
||||||
|
\item $H_1$ face $0$: contributes edge $(15,19)$.
|
||||||
|
\item $H_1$ face $1$: contributes edge $(17,21)$.
|
||||||
|
\item $H_1$ face $2$: contributes edges $(23, 27), (28, 33), (24, 29),
|
||||||
|
(28, 34)$.
|
||||||
|
\end{itemize}
|
||||||
|
So this single low-side face of $H_2$ has $H_1$ edges from
|
||||||
|
\emph{three} different $H_1$ faces adjacent to its boundary --- no
|
||||||
|
single $H_1$ face contains all of them, hence no unique parent.
|
||||||
|
|
||||||
|
\begin{center}
|
||||||
|
\includegraphics[width=0.95\textwidth]{uniqueness_break_example.pdf}
|
||||||
|
\end{center}
|
||||||
|
|
||||||
|
The orange ring is the boundary of the low-side $H_2$ face. The
|
||||||
|
three coloured edges (green, purple, blue) are $H_1$ edges
|
||||||
|
adjacent to the orange ring's vertices, coloured by which $H_1$
|
||||||
|
face they belong to. The diagram is laid out using Sage's planar
|
||||||
|
embedding of $H$. If we tried to assign this $H_2$ face a single
|
||||||
|
``parent'' in $H_1$, none of the three $H_1$ faces would contain
|
||||||
|
it. $T_\partial$ exists precisely to handle this low-side
|
||||||
|
exception.
|
||||||
|
|
||||||
\paragraph{The coverage gap.} Empirically
|
\paragraph{The coverage gap.} Empirically
|
||||||
(\texttt{chain\_dp\_joint.py} on the dodecahedron, cut $\#0$, side
|
(\texttt{chain\_dp\_joint.py} on the dodecahedron, cut $\#0$, side
|
||||||
$0$): when $|S_i|$ is small, $H_1$ on side $i$ can be a
|
$0$): when $|S_i|$ is small, $H_1$ on side $i$ can be a
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user