Add figures, Kempe-cycle section, and restriction experiments

Adds two TikZ figures (boundary-state worst cases and annular cycle
counterexample), a new subsection on Kempe-cycle conservation across
medial tires, and the experiment scripts/findings for the medial tire
restriction search and annular cycle condition check.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-11 01:16:05 -04:00
parent 20fe6c24ca
commit 4062e87c61
10 changed files with 1418 additions and 239 deletions
@@ -0,0 +1,358 @@
"""Check the medial annular-cycle almost-two-colour condition.
For each generated plane triangulation G and each requested level source:
1. Build the full medial graph M(G).
2. Find depth-component tire annular medial subgraphs.
3. Enumerate simple cycles in those annular subgraphs.
4. Search for a proper vertex 3-colouring of M(G) such that every
such cycle uses two colours except at at most one vertex.
Run with Sage, for example:
sage -python papers/medial_tire_decompositions_of_plane_triangulations/experiments/check_medial_annular_cycle_condition.py --n-min 4 --n-max 8
"""
from __future__ import annotations
import argparse
from collections import defaultdict, deque
from itertools import combinations
from typing import Any, Iterable, Iterator, Sequence, cast
from sage.all import Graph, graphs # type: ignore[attr-defined] # pylint: disable=no-name-in-module
from sage.graphs.graph_coloring import all_graph_colorings # type: ignore[attr-defined] # pylint: disable=no-name-in-module
Edge = tuple[Any, Any]
Coloring = dict[Edge, int]
Source = tuple[Any, ...]
def vertex_key(v: Any) -> str:
return repr(v)
def edge_key(u: Any, v: Any) -> Edge:
return (u, v) if vertex_key(u) <= vertex_key(v) else (v, u)
def is_induced_cycle(g: Graph, vertices: Sequence[Any]) -> bool:
if len(vertices) < 3:
return False
h = cast(Graph, g.subgraph(list(vertices)))
return h.is_connected() and h.num_edges() == len(vertices) and all(
h.degree(v) == 2 for v in h.vertices()
)
def induced_cycle_sources(g: Graph, max_size: int | None = None) -> Iterator[Source]:
vertices = sorted(g.vertices(), key=vertex_key)
upper = len(vertices) if max_size is None else min(max_size, len(vertices))
for k in range(3, upper + 1):
for subset in combinations(vertices, k):
if is_induced_cycle(g, subset):
yield tuple(subset)
def level_sources(g: Graph, mode: str, max_cycle_source_size: int | None) -> Iterator[Source]:
if mode in ("vertex", "all"):
for v in sorted(g.vertices(), key=vertex_key):
yield (v,)
if mode in ("cycle", "all"):
yield from induced_cycle_sources(g, max_cycle_source_size)
def distances_from_source(g: Graph, source: Source) -> dict[Any, int]:
if len(source) == 1:
return dict(g.shortest_path_lengths(source[0]))
distances = {v: 0 for v in source}
queue: deque[Any] = deque(source)
while queue:
v = queue.popleft()
for w in g.neighbor_iterator(v):
if w in distances:
continue
distances[w] = distances[v] + 1
queue.append(w)
return distances
def embedded_copy(g: Graph) -> Graph:
emb = cast(Graph, g.copy())
if not emb.is_planar(set_embedding=True):
raise ValueError("graph is not planar")
return emb
def medial_graph(g: Graph) -> Graph:
"""Build the full medial graph from the embedding rotation at vertices."""
emb = embedded_copy(g)
rotation = emb.get_embedding()
m = Graph()
medial_vertices = [edge_key(u, v) for u, v, _ in emb.edge_iterator()]
m.add_vertices(medial_vertices)
for v, neighbors in rotation.items():
if len(neighbors) < 2:
continue
n = len(neighbors)
for i in range(n):
e1 = edge_key(v, neighbors[i])
e2 = edge_key(v, neighbors[(i + 1) % n])
if e1 != e2:
m.add_edge(e1, e2)
return m
def face_vertices(face: Sequence[tuple[Any, Any]]) -> set[Any]:
out: set[Any] = set()
for u, v in face:
out.add(u)
out.add(v)
return out
def face_edges(face: Sequence[tuple[Any, Any]]) -> set[Edge]:
return {edge_key(u, v) for u, v in face}
def dual_components_by_depth(
g: Graph, source: Source
) -> list[tuple[int, list[int], set[Edge]]]:
"""Return (depth, face-indices, annular-edge-set) for each depth component."""
emb = embedded_copy(g)
distances = distances_from_source(emb, source)
faces = emb.faces()
f_vertices = [face_vertices(face) for face in faces]
f_edges = [face_edges(face) for face in faces]
depths = [min(distances[v] for v in verts) for verts in f_vertices]
edge_faces: dict[Edge, list[int]] = defaultdict(list)
for idx, edges in enumerate(f_edges):
for edge in edges:
edge_faces[edge].append(idx)
dual_adj: dict[int, set[int]] = defaultdict(set)
for incident in edge_faces.values():
for a in range(len(incident)):
for b in range(a + 1, len(incident)):
dual_adj[incident[a]].add(incident[b])
dual_adj[incident[b]].add(incident[a])
components = []
seen = [False] * len(faces)
for start in range(len(faces)):
if seen[start]:
continue
depth = depths[start]
comp = [start]
seen[start] = True
stack = [start]
while stack:
f = stack.pop()
for h in dual_adj[f]:
if not seen[h] and depths[h] == depth:
seen[h] = True
comp.append(h)
stack.append(h)
annular_edges: set[Edge] = set()
for f in comp:
for u, v in f_edges[f]:
if {distances[u], distances[v]} == {depth, depth + 1}:
annular_edges.add(edge_key(u, v))
if len(annular_edges) >= 3:
components.append((depth, comp, annular_edges))
return components
def simple_cycle_vertex_sets(g: Graph) -> set[frozenset[Any]]:
vertices = sorted(g.vertices(), key=repr)
index = {v: i for i, v in enumerate(vertices)}
cycles: set[frozenset[Any]] = set()
def dfs(start: Any, current: Any, path: list[Any], seen: set[Any]) -> None:
for nxt in g.neighbor_iterator(current):
if nxt == start:
if len(path) >= 3:
cycles.add(frozenset(path))
continue
if nxt in seen or index[nxt] <= index[start]:
continue
seen.add(nxt)
path.append(nxt)
dfs(start, nxt, path, seen)
path.pop()
seen.remove(nxt)
for start in vertices:
dfs(start, start, [start], {start})
return cycles
def annular_medial_cycles(g: Graph, source: Source) -> list[frozenset[Edge]]:
m = medial_graph(g)
cycles: list[frozenset[Edge]] = []
seen: set[frozenset[Edge]] = set()
for _depth, _faces, annular_edges in dual_components_by_depth(g, source):
sub = cast(Graph, m.subgraph(list(annular_edges)))
for cycle in simple_cycle_vertex_sets(sub):
typed = frozenset(cast(Iterable[Edge], cycle))
if typed not in seen:
seen.add(typed)
cycles.append(typed)
return cycles
def almost_two_coloured(cycle: frozenset[Edge], coloring: Coloring) -> bool:
counts = defaultdict(int)
for vertex in cycle:
counts[coloring[vertex]] += 1
return min(counts.get(c, 0) for c in range(3)) <= 1
def first_cycle_violation(
cycles: Sequence[frozenset[Edge]], coloring: Coloring
) -> frozenset[Edge] | None:
for cycle in cycles:
if not almost_two_coloured(cycle, coloring):
return cycle
return None
def color_counts(cycle: frozenset[Edge], coloring: Coloring) -> dict[int, int]:
counts = {0: 0, 1: 0, 2: 0}
for vertex in cycle:
counts[coloring[vertex]] += 1
return counts
def coloring_witness(
m: Graph,
cycles: Sequence[frozenset[Edge]],
max_colorings: int | None,
) -> tuple[Coloring | None, int, bool, frozenset[Edge] | None, Coloring | None]:
checked = 0
last_violation = None
for raw in all_graph_colorings(m, 3, vertex_color_dict=True):
coloring = cast(Coloring, raw)
checked += 1
violation = first_cycle_violation(cycles, coloring)
if violation is None:
return coloring, checked, True, None, None
last_violation = violation
if max_colorings is not None and checked >= max_colorings:
return None, checked, False, last_violation, coloring
return None, checked, True, last_violation, coloring
def source_label(source: Source) -> str:
if len(source) == 1:
return f"vertex:{source[0]}"
return "cycle:{" + ",".join(map(str, source)) + "}"
def graphs_to_check(n: int, max_graphs: int | None):
for idx, g in enumerate(graphs.triangulations(n)):
if max_graphs is not None and idx >= max_graphs:
break
yield idx, cast(Graph, g)
def run(args: argparse.Namespace) -> None:
total_cases = 0
skipped_no_cycles = 0
witnesses = 0
failures = []
inconclusive = []
for n in range(args.n_min, args.n_max + 1):
print(f"n={n}")
for graph_idx, g in graphs_to_check(n, args.max_graphs_per_n):
m = medial_graph(g)
sources = list(level_sources(g, args.sources, args.max_cycle_source_size))
if args.max_sources_per_graph is not None:
sources = sources[: args.max_sources_per_graph]
for source in sources:
cycles = annular_medial_cycles(g, source)
if not cycles:
skipped_no_cycles += 1
continue
total_cases += 1
witness, checked, exhausted, violation, last_coloring = coloring_witness(
m, cycles, args.max_colorings
)
if witness is not None:
witnesses += 1
if args.verbose:
print(
f" graph={graph_idx} source={source_label(source)} "
f"cycles={len(cycles)} witness_after={checked}"
)
continue
record = {
"n": n,
"graph_idx": graph_idx,
"graph_edges": sorted(edge_key(u, v) for u, v, _ in g.edge_iterator()),
"source": source_label(source),
"cycles": len(cycles),
"checked": checked,
"exhausted": exhausted,
"violation_size": len(violation) if violation else None,
}
if args.failure_details and violation is not None and last_coloring is not None:
record["violation_cycle"] = sorted(violation)
record["violation_counts"] = color_counts(violation, last_coloring)
record["violation_coloring"] = {
edge: last_coloring[edge] for edge in sorted(violation)
}
if exhausted:
failures.append(record)
print(" FAILURE", record)
if args.stop_on_failure:
print_summary(total_cases, skipped_no_cycles, witnesses, failures, inconclusive)
return
else:
inconclusive.append(record)
print(" INCONCLUSIVE", record)
print_summary(total_cases, skipped_no_cycles, witnesses, failures, inconclusive)
def print_summary(
total_cases: int,
skipped_no_cycles: int,
witnesses: int,
failures: Sequence[dict],
inconclusive: Sequence[dict],
) -> None:
print()
print("summary")
print(f" checked source decompositions with annular cycles: {total_cases}")
print(f" skipped source decompositions with no annular cycles: {skipped_no_cycles}")
print(f" witnesses found: {witnesses}")
print(f" failures: {len(failures)}")
print(f" inconclusive: {len(inconclusive)}")
if failures:
print(f" first failure: {failures[0]}")
if inconclusive:
print(f" first inconclusive: {inconclusive[0]}")
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--n-min", type=int, default=4)
parser.add_argument("--n-max", type=int, default=8)
parser.add_argument("--sources", choices=("vertex", "cycle", "all"), default="vertex")
parser.add_argument("--max-cycle-source-size", type=int, default=6)
parser.add_argument("--max-graphs-per-n", type=int)
parser.add_argument("--max-sources-per-graph", type=int)
parser.add_argument("--max-colorings", type=int)
parser.add_argument("--stop-on-failure", action="store_true")
parser.add_argument("--failure-details", action="store_true")
parser.add_argument("--verbose", action="store_true")
run(parser.parse_args())
if __name__ == "__main__":
main()
@@ -0,0 +1,83 @@
# Medial Annular Cycle Condition Findings
Question: for an actual plane triangulation and a tire decomposition,
does there exist a proper vertex 3-coloring of the full medial graph
such that every medial annular simple cycle uses two colors except at
at most one vertex?
The experiment is graph-level, not local-pattern-level:
1. Build the full medial graph `M(G)` from the embedding rotation.
2. Enumerate proper vertex 3-colorings of `M(G)`.
3. For each level-source tire decomposition, build the annular medial
subgraph of each depth-component tire.
4. Enumerate simple cycles in those annular medial subgraphs.
5. Search for a proper medial coloring satisfying the almost-two-color
condition on every such cycle.
## First Counterexample Found
Command:
```bash
sage -python papers/medial_tire_decompositions_of_plane_triangulations/experiments/check_medial_annular_cycle_condition.py --n-min 7 --n-max 7 --stop-on-failure --failure-details
```
Result:
```text
n=7
FAILURE {
'n': 7,
'graph_idx': 0,
'graph_edges': [
(1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7),
(2, 3), (2, 6), (2, 7), (3, 4), (3, 5), (3, 6),
(4, 5), (5, 6), (6, 7)
],
'source': 'vertex:1',
'cycles': 1,
'checked': 6,
'exhausted': True,
'violation_size': 6,
'violation_cycle': [
(1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7)
],
'violation_counts': {0: 2, 1: 2, 2: 2},
'violation_coloring': {
(1, 2): 2, (1, 3): 1, (1, 4): 0,
(1, 5): 2, (1, 6): 0, (1, 7): 1
}
}
```
Interpretation: for the vertex-source decomposition at source `1`, the
only annular medial simple cycle is the six medial vertices
corresponding to the six edges incident to `1`. Sage enumerated all six
proper vertex 3-colorings of the full medial graph. Every one violates
the almost-two-color condition on that cycle; the displayed coloring has
color counts `{0: 2, 1: 2, 2: 2}` on the annular cycle.
Thus the conjecture, in the form "for every possible tire decomposition
there exists a proper medial 3-coloring satisfying the condition on all
medial annular simple cycles", is false.
## Default Sweep
Command:
```bash
sage -python papers/medial_tire_decompositions_of_plane_triangulations/experiments/check_medial_annular_cycle_condition.py --n-min 4 --n-max 8
```
Summary:
```text
checked source decompositions with annular cycles: 168
skipped source decompositions with no annular cycles: 0
witnesses found: 111
failures: 57
inconclusive: 0
```
Failures begin at `n=7` for vertex-source decompositions.
@@ -0,0 +1,178 @@
# Medial Tire Restriction Findings
Question: among possible full medial tire graphs, which examples most
restrict the inner boundary coloring relative to the outer boundary
coloring?
## Model
The experiment uses the ambient full-medial tread model.
- Annular medial vertices form a cycle `A_0, ..., A_{n-1}`.
- Each annular face contributes one boundary-medial vertex `B_i`.
- `B_i` is adjacent to `A_i` and `A_{i+1}`.
- `B_i` is tagged `O` or `I` according to whether the corresponding
primal boundary edge lies on the outer or inner boundary.
Boundary states are quotient by color permutations only. Boundary
order is fixed: rotations and reversals are not identified.
Inner chords of the inner outerplanar graph do not affect this ambient
full medial tire graph, because they are not incident to annular tread
faces.
## Metrics
For the quotient transfer relation
```text
R_T subset outer_state_orbits x inner_state_orbits
```
the script reports:
- `min_outer_extensions`: minimum number of compatible inner state
orbits over realized outer state orbits.
- `avg_outer_extensions`: average number of compatible inner state
orbits over realized outer state orbits.
- `relation_density_all`: `|R_T|` divided by all possible outer/inner
state orbit pairs.
- `blocked_outer_orbits`: number of outer boundary state orbits that
are not compatible with any inner boundary state orbit.
- `blocked_inner_orbits`: number of inner boundary state orbits that
are not compatible with any outer boundary state orbit.
## Exhaustive Sweep Through 10 Faces
Command:
```bash
python3 papers/medial_tire_decompositions_of_plane_triangulations/experiments/medial_tire_restriction_search.py --exhaustive --min-faces 6 --max-faces 10 --limit 3
```
Result:
```text
graphs analyzed: 1974
boundary states quotient by color permutations only; no rotations or reversals
most restrictive by min_outer_extensions
types=IIIOOO
faces=6 outer=3 inner=3 outer_orbits=5 inner_orbits=5
realized_outer=4 realized_inner=4 relation=10
blocked_outer=1 (0.200) blocked_inner=1 (0.200)
min_outer_extensions=1 avg_outer_extensions=2.500
density_all=0.400000 density_realized_outer=0.500000
worst_outer_states=((0, 1, 2),)
types=IIOIOO
faces=6 outer=3 inner=3 outer_orbits=5 inner_orbits=5
realized_outer=5 realized_inner=5 relation=9
blocked_outer=0 (0.000) blocked_inner=0 (0.000)
min_outer_extensions=1 avg_outer_extensions=1.800
density_all=0.360000 density_realized_outer=0.360000
worst_outer_states=((0, 0, 1), (0, 1, 2))
types=IIOOIO
faces=6 outer=3 inner=3 outer_orbits=5 inner_orbits=5
realized_outer=5 realized_inner=5 relation=9
blocked_outer=0 (0.000) blocked_inner=0 (0.000)
min_outer_extensions=1 avg_outer_extensions=1.800
density_all=0.360000 density_realized_outer=0.360000
worst_outer_states=((0, 1, 1), (0, 1, 2))
most restrictive by avg_outer_extensions
types=IIOOOO
faces=6 outer=4 inner=2 outer_orbits=14 inner_orbits=2
realized_outer=8 realized_inner=2 relation=8
blocked_outer=6 (0.429) blocked_inner=0 (0.000)
min_outer_extensions=1 avg_outer_extensions=1.000
density_all=0.285714 density_realized_outer=0.500000
types=IOIOOO
faces=6 outer=4 inner=2 outer_orbits=14 inner_orbits=2
realized_outer=9 realized_inner=2 relation=9
blocked_outer=5 (0.357) blocked_inner=0 (0.000)
min_outer_extensions=1 avg_outer_extensions=1.000
density_all=0.321429 density_realized_outer=0.500000
types=IOOIOO
faces=6 outer=4 inner=2 outer_orbits=14 inner_orbits=2
realized_outer=9 realized_inner=2 relation=9
blocked_outer=5 (0.357) blocked_inner=0 (0.000)
min_outer_extensions=1 avg_outer_extensions=1.000
density_all=0.321429 density_realized_outer=0.500000
most restrictive by relation_density_all
types=IIIIIIIIIO
faces=10 outer=1 inner=9 outer_orbits=1 inner_orbits=3281
realized_outer=1 realized_inner=171 relation=171
blocked_outer=0 (0.000) blocked_inner=3110 (0.948)
min_outer_extensions=171 avg_outer_extensions=171.000
density_all=0.052118 density_realized_outer=0.052118
```
## Random Sweep Through 14 Faces
Command:
```bash
python3 papers/medial_tire_decompositions_of_plane_triangulations/experiments/medial_tire_restriction_search.py --samples 5000 --max-faces 14 --limit 3
```
Result:
```text
graphs analyzed: 3227
most restrictive by min_outer_extensions
types=IIIOOO
min_outer_extensions=1 avg_outer_extensions=2.500
density_all=0.400000 density_realized_outer=0.500000
types=IIOIOO
min_outer_extensions=1 avg_outer_extensions=1.800
density_all=0.360000 density_realized_outer=0.360000
types=IIOOIO
min_outer_extensions=1 avg_outer_extensions=1.800
density_all=0.360000 density_realized_outer=0.360000
most restrictive by avg_outer_extensions
types=IIOOOO
min_outer_extensions=1 avg_outer_extensions=1.000
density_all=0.285714 density_realized_outer=0.500000
types=IOIOOO
min_outer_extensions=1 avg_outer_extensions=1.000
density_all=0.321429 density_realized_outer=0.500000
types=IOOIOO
min_outer_extensions=1 avg_outer_extensions=1.000
density_all=0.321429 density_realized_outer=0.500000
most restrictive by relation_density_all
types=IIIOIIIIIIIIII
faces=14 outer=1 inner=13 relation=2731
min_outer_extensions=2731 avg_outer_extensions=2731.000
density_all=0.010278 density_realized_outer=0.010278
types=OOOOOOOIOOOOOO
faces=14 outer=13 inner=1 relation=2731
min_outer_extensions=1 avg_outer_extensions=1.000
density_all=0.010278 density_realized_outer=1.000000
types=IIIOOIIIIIIIII
faces=14 outer=2 inner=12 relation=2048
min_outer_extensions=683 avg_outer_extensions=1024.000
density_all=0.011561 density_realized_outer=0.011561
```
## Interpretation
The most restrictive small examples for extension counts appear at six
annular faces. Alternating or clustered `O/I` boundary-face patterns
with a small boundary on one side can force each realized outer state
to a single inner orbit.
The raw density metric favors highly unbalanced boundaries, such as one
outer boundary state position and many inner positions. This may be a
less useful notion of "worst case" unless boundary sizes are fixed or
the density is normalized within a fixed `(outer, inner)` size class.
The blocked-state metrics make the asymmetry explicit. For instance,
`IIIOOO` blocks one of the five possible outer state orbits, while
`IIOIOO` and `IIOOIO` block none but still contain outer states with a
unique compatible inner state orbit. Highly unbalanced cases can block
most state orbits on the larger boundary simply because the annular
cycle has far fewer colorings than the unconstrained ordered boundary.
@@ -0,0 +1,294 @@
"""Search boundary-state restrictions for possible full medial tire graphs.
Model.
A full medial tire graph has an annular medial cycle A_0,...,A_{n-1}.
Each annular face contributes one boundary-medial vertex B_i adjacent
to A_i and A_{i+1}; B_i is tagged as outer or inner. This is the
ambient tread-face model from the medial tire decomposition paper.
Boundary order is the cyclic order inherited from the annular face
sequence. Boundary states are quotient by S_3 color relabeling only:
no rotations or reversals are identified.
"""
from __future__ import annotations
import argparse
import itertools
import random
from collections import defaultdict
from dataclasses import dataclass
from functools import lru_cache
Coloring = tuple[int, ...]
def canonical_color_orbit(coloring: Coloring) -> Coloring:
"""Canonical representative modulo color renaming, preserving order."""
mapping: dict[int, int] = {}
out = []
for color in coloring:
if color not in mapping:
mapping[color] = len(mapping)
out.append(mapping[color])
return tuple(out)
@lru_cache(maxsize=None)
def all_state_orbits(length: int) -> frozenset[Coloring]:
return frozenset({
canonical_color_orbit(tuple(colors))
for colors in itertools.product(range(3), repeat=length)
})
@lru_cache(maxsize=None)
def cycle_3_colorings(n: int) -> list[Coloring]:
colors = [-1] * n
out: list[Coloring] = []
def rec(idx: int) -> None:
if idx == n:
if colors[-1] != colors[0]:
out.append(tuple(colors))
return
for color in range(3):
if idx > 0 and colors[idx - 1] == color:
continue
if idx == n - 1 and colors[0] == color:
continue
colors[idx] = color
rec(idx + 1)
colors[idx] = -1
rec(0)
return out
def boundary_coloring_from_annular(
annular_coloring: Coloring,
face_types: str,
boundary_type: str,
) -> Coloring:
values = []
n = len(face_types)
for idx, face_type in enumerate(face_types):
if face_type != boundary_type:
continue
left = annular_coloring[idx]
right = annular_coloring[(idx + 1) % n]
values.append(({0, 1, 2} - {left, right}).pop())
return tuple(values)
@dataclass(frozen=True)
class RestrictionMetrics:
face_types: str
n_faces: int
n_outer: int
n_inner: int
outer_orbits: int
inner_orbits: int
realized_outer_orbits: int
realized_inner_orbits: int
blocked_outer_orbits: int
blocked_inner_orbits: int
blocked_outer_fraction: float
blocked_inner_fraction: float
relation_size: int
min_outer_extensions: int
avg_outer_extensions: float
relation_density_all: float
relation_density_realized_outer: float
worst_outer_states: tuple[Coloring, ...]
@lru_cache(maxsize=None)
def analyze_face_types(face_types: str) -> RestrictionMetrics:
n = len(face_types)
n_outer = face_types.count("O")
n_inner = face_types.count("I")
possible_outer = all_state_orbits(n_outer)
possible_inner = all_state_orbits(n_inner)
relation: set[tuple[Coloring, Coloring]] = set()
by_outer: dict[Coloring, set[Coloring]] = defaultdict(set)
for annular in cycle_3_colorings(n):
outer = canonical_color_orbit(
boundary_coloring_from_annular(annular, face_types, "O")
)
inner = canonical_color_orbit(
boundary_coloring_from_annular(annular, face_types, "I")
)
relation.add((outer, inner))
by_outer[outer].add(inner)
realized_outer = set(by_outer)
realized_inner = {inner for _, inner in relation}
extension_counts = {outer: len(inners) for outer, inners in by_outer.items()}
min_extensions = min(extension_counts.values()) if extension_counts else 0
worst_outer = tuple(
sorted(outer for outer, count in extension_counts.items() if count == min_extensions)
)
avg_extensions = (
sum(extension_counts.values()) / len(extension_counts)
if extension_counts
else 0.0
)
all_denominator = len(possible_outer) * len(possible_inner)
realized_denominator = len(realized_outer) * len(possible_inner)
return RestrictionMetrics(
face_types=face_types,
n_faces=n,
n_outer=n_outer,
n_inner=n_inner,
outer_orbits=len(possible_outer),
inner_orbits=len(possible_inner),
realized_outer_orbits=len(realized_outer),
realized_inner_orbits=len(realized_inner),
blocked_outer_orbits=len(possible_outer) - len(realized_outer),
blocked_inner_orbits=len(possible_inner) - len(realized_inner),
blocked_outer_fraction=(
(len(possible_outer) - len(realized_outer)) / len(possible_outer)
if possible_outer
else 0.0
),
blocked_inner_fraction=(
(len(possible_inner) - len(realized_inner)) / len(possible_inner)
if possible_inner
else 0.0
),
relation_size=len(relation),
min_outer_extensions=min_extensions,
avg_outer_extensions=avg_extensions,
relation_density_all=len(relation) / all_denominator if all_denominator else 0.0,
relation_density_realized_outer=(
len(relation) / realized_denominator if realized_denominator else 0.0
),
worst_outer_states=worst_outer[:5],
)
def random_face_types(rng: random.Random, n: int, min_outer: int, min_inner: int) -> str:
if min_outer + min_inner > n:
raise ValueError("minimum outer/inner counts exceed n")
values = ["O"] * min_outer + ["I"] * min_inner
values.extend(rng.choice("OI") for _ in range(n - len(values)))
rng.shuffle(values)
return "".join(values)
def all_face_types(n: int, min_outer: int, min_inner: int):
for values in itertools.product("OI", repeat=n):
face_types = "".join(values)
if face_types.count("O") >= min_outer and face_types.count("I") >= min_inner:
yield face_types
def best_by(metrics: list[RestrictionMetrics], key_name: str, limit: int):
return sorted(metrics, key=lambda m: (getattr(m, key_name), m.n_faces, m.face_types))[
:limit
]
def print_metric(metric: RestrictionMetrics) -> None:
print(f" types={metric.face_types}")
print(
f" faces={metric.n_faces} outer={metric.n_outer} inner={metric.n_inner} "
f"outer_orbits={metric.outer_orbits} inner_orbits={metric.inner_orbits}"
)
print(
f" realized_outer={metric.realized_outer_orbits} "
f"realized_inner={metric.realized_inner_orbits} relation={metric.relation_size}"
)
print(
f" blocked_outer={metric.blocked_outer_orbits} "
f"({metric.blocked_outer_fraction:.3f}) "
f"blocked_inner={metric.blocked_inner_orbits} "
f"({metric.blocked_inner_fraction:.3f})"
)
print(
f" min_outer_extensions={metric.min_outer_extensions} "
f"avg_outer_extensions={metric.avg_outer_extensions:.3f}"
)
print(
f" density_all={metric.relation_density_all:.6f} "
f"density_realized_outer={metric.relation_density_realized_outer:.6f}"
)
print(f" worst_outer_states={metric.worst_outer_states}")
def run(args: argparse.Namespace) -> None:
rng = random.Random(args.seed)
seen: set[str] = set()
metrics: list[RestrictionMetrics] = []
if args.exhaustive:
for n in range(args.min_faces, args.max_faces + 1):
for face_types in all_face_types(n, args.min_outer, args.min_inner):
metrics.append(analyze_face_types(face_types))
else:
for _ in range(args.samples):
n = rng.randint(args.min_faces, args.max_faces)
face_types = random_face_types(rng, n, args.min_outer, args.min_inner)
if face_types in seen:
continue
seen.add(face_types)
metrics.append(analyze_face_types(face_types))
print(f"graphs analyzed: {len(metrics)}")
print(
"boundary states quotient by color permutations only; "
"no rotations or reversals"
)
print()
print("most restrictive by min_outer_extensions")
for metric in best_by(metrics, "min_outer_extensions", args.limit):
print_metric(metric)
print()
print("most restrictive by avg_outer_extensions")
for metric in best_by(metrics, "avg_outer_extensions", args.limit):
print_metric(metric)
print()
print("most restrictive by relation_density_all")
for metric in best_by(metrics, "relation_density_all", args.limit):
print_metric(metric)
print()
print("most restrictive by blocked_outer_orbits")
for metric in sorted(
metrics,
key=lambda m: (-m.blocked_outer_orbits, m.n_faces, m.face_types),
)[: args.limit]:
print_metric(metric)
print()
print("most restrictive by blocked_outer_fraction")
for metric in sorted(
metrics,
key=lambda m: (-m.blocked_outer_fraction, m.n_faces, m.face_types),
)[: args.limit]:
print_metric(metric)
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--min-faces", type=int, default=6)
parser.add_argument("--max-faces", type=int, default=10)
parser.add_argument("--samples", type=int, default=1000)
parser.add_argument("--seed", type=int, default=0)
parser.add_argument("--min-outer", type=int, default=1)
parser.add_argument("--min-inner", type=int, default=1)
parser.add_argument("--limit", type=int, default=5)
parser.add_argument("--exhaustive", action="store_true")
run(parser.parse_args())
if __name__ == "__main__":
main()
@@ -15,20 +15,25 @@
\newlabel{def:medial-restriction-relation}{{3.5}{3}}
\citation{bauerfeld-nested-tire-decompositions}
\citation{bauerfeld-nested-tire-decompositions}
\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Three six-face full medial tire graphs found by the boundary-state restriction search. Black vertices are annular medial vertices; blue vertices are outer boundary medial vertices and red vertices are inner boundary medial vertices. The word below each diagram records the outer/inner type of the six annular faces in cyclic order. Boundary states are identified only up to colour permutation, not by rotation or reflection of the boundary order.}}{4}{}\protected@file@percent }
\newlabel{fig:medial-restriction-worst-cases}{{1}{4}}
\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces A proper vertex $3$-colouring of the full medial graph of the first seven-vertex counterexample found by the experiment. The medial vertex labelled $ij$ corresponds to the edge $(i,j)$ of the triangulation. For the vertex-source decomposition at source $1$, the highlighted annular medial cycle has colour counts $(2,2,2)$, so it is not coloured with two colours except at at most one vertex.}}{4}{}\protected@file@percent }
\newlabel{fig:medial-annular-cycle-counterexample}{{2}{4}}
\@writefile{toc}{\contentsline {section}{\tocsection {}{4}{Decomposition}}{4}{}\protected@file@percent }
\newlabel{cor:medial-tire-decomposition}{{4.1}{4}}
\newlabel{def:compatible-family}{{4.2}{4}}
\newlabel{prop:gluing-criterion}{{4.3}{4}}
\@writefile{toc}{\contentsline {section}{\tocsection {}{5}{A medial pigeonhole programme}}{4}{}\protected@file@percent }
\newlabel{def:compatible-family}{{4.2}{5}}
\newlabel{prop:gluing-criterion}{{4.3}{5}}
\@writefile{toc}{\contentsline {section}{\tocsection {}{5}{A medial pigeonhole programme}}{5}{}\protected@file@percent }
\newlabel{def:medial-boundary-state}{{5.1}{5}}
\newlabel{conj:medial-chain-pigeonhole}{{5.2}{5}}
\newlabel{conj:medial-route-fct}{{5.3}{6}}
\@writefile{toc}{\contentsline {subsection}{\tocsubsection {}{5.1}{Kempe-cycle conservation across medial tires}}{6}{}\protected@file@percent }
\bibcite{bauerfeld-nested-tire-decompositions}{1}
\bibcite{tait-original}{2}
\newlabel{tocindent-1}{0pt}
\newlabel{tocindent0}{12.7778pt}
\newlabel{tocindent1}{17.77782pt}
\newlabel{tocindent2}{0pt}
\newlabel{tocindent2}{29.38873pt}
\newlabel{tocindent3}{0pt}
\newlabel{def:medial-boundary-state}{{5.1}{5}}
\newlabel{conj:medial-chain-pigeonhole}{{5.2}{5}}
\newlabel{conj:medial-route-fct}{{5.3}{5}}
\@writefile{toc}{\contentsline {section}{\tocsection {}{}{References}}{5}{}\protected@file@percent }
\gdef \@abspage@last{5}
\@writefile{toc}{\contentsline {section}{\tocsection {}{}{References}}{8}{}\protected@file@percent }
\gdef \@abspage@last{8}
@@ -1,5 +1,6 @@
# Fdb version 3
["pdflatex"] 1780947173 "paper.tex" "paper.pdf" "paper" 1780947174
["pdflatex"] 1780957013 "/Users/didericis/Code/math-research/papers/medial_tire_decompositions_of_plane_triangulations/paper.tex" "paper.pdf" "paper" 1780957014
"/Users/didericis/Code/math-research/papers/medial_tire_decompositions_of_plane_triangulations/paper.tex" 1780957012 31877 e1531fb82c355208b5b7c8e57cfb6e8a ""
"/usr/local/texlive/2022/texmf-dist/fonts/map/fontname/texfonts.map" 1577235249 3524 cb3e574dea2d1052e39280babc910dc8 ""
"/usr/local/texlive/2022/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm" 1246382020 1004 54797486969f23fa377b128694d548df ""
"/usr/local/texlive/2022/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex8.tfm" 1246382020 988 bdf658c3bfc2d96d3c8b02cfc1c94c20 ""
@@ -22,6 +23,7 @@
"/usr/local/texlive/2022/texmf-dist/fonts/tfm/public/cm/cmsy8.tfm" 1136768653 1120 8b7d695260f3cff42e636090a8002094 ""
"/usr/local/texlive/2022/texmf-dist/fonts/tfm/public/cm/cmti10.tfm" 1136768653 1480 aa8e34af0eb6a2941b776984cf1dfdc4 ""
"/usr/local/texlive/2022/texmf-dist/fonts/tfm/public/cm/cmti8.tfm" 1136768653 1504 1747189e0441d1c18f3ea56fafc1c480 ""
"/usr/local/texlive/2022/texmf-dist/fonts/tfm/public/cm/cmtt8.tfm" 1136768653 768 d7b9a2629a0c353102ad947dc9221d49 ""
"/usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb" 1248133631 34811 78b52f49e893bcba91bd7581cdc144c0 ""
"/usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx8.pfb" 1248133631 32166 b0c356b15f19587482a9217ce1d8fa67 ""
"/usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmcsc10.pfb" 1248133631 32001 6aeea3afe875097b1eb0da29acd61e28 ""
@@ -39,6 +41,7 @@
"/usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb" 1248133631 32716 08e384dc442464e7285e891af9f45947 ""
"/usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb" 1248133631 37944 359e864bd06cde3b1cf57bb20757fb06 ""
"/usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti8.pfb" 1248133631 35660 fb24af7afbadb71801619f1415838111 ""
"/usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt8.pfb" 1248133631 24287 6b803fa9eb1ddff9112e00519b09dd9e ""
"/usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/symbols/msam10.pfb" 1248133631 31764 459c573c03a4949a528c2cc7f557e217 ""
"/usr/local/texlive/2022/texmf-dist/tex/context/base/mkii/supp-pdf.mkii" 1461363279 71627 94eb9990bed73c364d7f53f960cc8c5b ""
"/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex" 1601326656 992 855ff26741653ab54814101ca36e153c ""
@@ -130,8 +133,8 @@
"/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map" 1647878959 4410336 7d30a02e9fa9a16d7d1f8d037ba69641 ""
"/usr/local/texlive/2022/texmf-var/web2c/pdftex/pdflatex.fmt" 1665017617 2826443 7e98410c533054b636c6470db83a27bc ""
"/usr/local/texlive/2022/texmf.cnf" 1647878952 577 209b46be99c9075fd74d4c0369380e8c ""
"paper.aux" 1780947174 1788 71344323fa0ab784f122b28ddb4904e9 "pdflatex"
"paper.tex" 1780947165 17102 9b6f3bfc4420a1cb800822639b666f73 ""
"paper.aux" 1780957014 3096 87a6f727fdb250a8819be3b4fc862d4e "pdflatex"
"paper.tex" 1780957012 31877 e1531fb82c355208b5b7c8e57cfb6e8a ""
(generated)
"paper.aux"
"paper.log"
@@ -2,7 +2,7 @@ PWD /Users/didericis/Code/math-research/papers/medial_tire_decompositions_of_pla
INPUT /usr/local/texlive/2022/texmf.cnf
INPUT /usr/local/texlive/2022/texmf-dist/web2c/texmf.cnf
INPUT /usr/local/texlive/2022/texmf-var/web2c/pdftex/pdflatex.fmt
INPUT paper.tex
INPUT /Users/didericis/Code/math-research/papers/medial_tire_decompositions_of_plane_triangulations/paper.tex
OUTPUT paper.log
INPUT /usr/local/texlive/2022/texmf-dist/tex/latex/amscls/amsart.cls
INPUT /usr/local/texlive/2022/texmf-dist/tex/latex/amscls/amsart.cls
@@ -452,6 +452,7 @@ INPUT /usr/local/texlive/2022/texmf-dist/fonts/tfm/public/cm/cmti10.tfm
INPUT /usr/local/texlive/2022/texmf-dist/fonts/tfm/public/cm/cmss10.tfm
INPUT /usr/local/texlive/2022/texmf-dist/fonts/tfm/public/cm/cmss8.tfm
INPUT /usr/local/texlive/2022/texmf-dist/fonts/tfm/public/cm/cmss8.tfm
INPUT /usr/local/texlive/2022/texmf-dist/fonts/tfm/public/cm/cmtt8.tfm
INPUT /usr/local/texlive/2022/texmf-dist/fonts/tfm/public/cm/cmbx8.tfm
INPUT paper.aux
INPUT /usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb
@@ -471,4 +472,5 @@ INPUT /usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy6.pf
INPUT /usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb
INPUT /usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb
INPUT /usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti8.pfb
INPUT /usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt8.pfb
INPUT /usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/symbols/msam10.pfb
@@ -1,12 +1,12 @@
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 8 JUN 2026 15:32
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 8 JUN 2026 18:16
entering extended mode
restricted \write18 enabled.
file:line:error style messages enabled.
%&-line parsing enabled.
**paper.tex
(./paper.tex
**/Users/didericis/Code/math-research/papers/medial_tire_decompositions_of_plane_triangulations/paper.tex
(/Users/didericis/Code/math-research/papers/medial_tire_decompositions_of_plane_triangulations/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
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
@@ -18,17 +18,14 @@ Package: amsmath 2021/10/15 v2.17l AMS math features
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
(/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
)) (/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
) (/usr/local/texlive/2022/texmf-dist/tex/latex/amsmath/amsopn.sty
Package: amsopn 2021/08/26 v2.02 operator names
)
\inf@bad=\count185
@@ -69,13 +66,10 @@ LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
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
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
) (/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
@@ -106,63 +100,42 @@ LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
\thm@postskip=\skip55
\thm@headsep=\skip56
\dth@everypar=\toks26
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/amssymb.sty
) (/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/graphics/graphicx.sty
) (/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
(/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
) (/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
(/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
) (/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
(/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=\dimen150
\Gin@req@width=\dimen151
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
(/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
(/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.te
x
) (/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty (/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty (/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
\pgfutil@everybye=\toks28
\pgfutil@tempdima=\dimen152
\pgfutil@tempdimb=\dimen153
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-li
sts.tex))
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex)) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
\pgfutil@abb=\box53
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/pgf.revision.tex)
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/pgf.revision.tex)
Package: pgfrcs 2021/05/15 v3.1.9a (3.1.9a)
))
Package: pgf 2021/05/15 v3.1.9a (3.1.9a)
(/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
(/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
(/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty (/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
Package: pgfsys 2021/05/15 v3.1.9a (3.1.9a)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
\pgfkeys@pathtoks=\toks29
\pgfkeys@temptoks=\toks30
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.c
ode.tex
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex
\pgfkeys@tmptoks=\toks31
))
\pgf@x=\dimen154
@@ -185,33 +158,23 @@ ode.tex
\t@pgf@tokb=\toks33
\t@pgf@tokc=\toks34
\pgf@sys@id@count=\count276
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
File: pgf.cfg 2021/05/15 v3.1.9a (3.1.9a)
)
Driver file for pgf: pgfsys-pdftex.def
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.d
ef
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
File: pgfsys-pdftex.def 2021/05/15 v3.1.9a (3.1.9a)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-p
df.def
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
File: pgfsys-common-pdf.def 2021/05/15 v3.1.9a (3.1.9a)
)))
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.
code.tex
))) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
File: pgfsyssoftpath.code.tex 2021/05/15 v3.1.9a (3.1.9a)
\pgfsyssoftpath@smallbuffer@items=\count277
\pgfsyssoftpath@bigbuffer@items=\count278
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.
code.tex
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
File: pgfsysprotocol.code.tex 2021/05/15 v3.1.9a (3.1.9a)
)) (/usr/local/texlive/2022/texmf-dist/tex/latex/xcolor/xcolor.sty
Package: xcolor 2021/10/31 v2.13 LaTeX color extensions (UK)
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics-cfg/color.cfg
(/usr/local/texlive/2022/texmf-dist/tex/latex/graphics-cfg/color.cfg
File: color.cfg 2016/01/02 v1.6 sample color configuration
)
Package xcolor Info: Driver file: pdftex.def on input line 227.
@@ -224,43 +187,18 @@ Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1372.
Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1373.
Package xcolor Info: Model `Gray' substituted by `gray' on input line 1374.
Package xcolor Info: Model `wave' substituted by `hsb' on input line 1375.
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
Package: pgfcore 2021/05/15 v3.1.9a (3.1.9a)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
\pgfmath@dimen=\dimen164
\pgfmath@count=\count279
\pgfmath@box=\box54
\pgfmath@toks=\toks35
\pgfmath@stack@operand=\toks36
\pgfmath@stack@operation=\toks37
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.
tex
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic
.code.tex)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigo
nometric.code.tex)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.rando
m.code.tex)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.compa
rison.code.tex)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.
code.tex)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round
.code.tex)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.
code.tex)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integ
erarithmetics.code.tex)))
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code.tex) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.tex) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics.code.tex))) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
\c@pgfmathroundto@lastzeros=\count280
)) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.co
de.tex
)) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex
File: pgfcorepoints.code.tex 2021/05/15 v3.1.9a (3.1.9a)
\pgf@picminx=\dimen165
\pgf@picmaxx=\dimen166
@@ -276,127 +214,76 @@ File: pgfcorepoints.code.tex 2021/05/15 v3.1.9a (3.1.9a)
\pgf@yy=\dimen176
\pgf@zx=\dimen177
\pgf@zy=\dimen178
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconst
ruct.code.tex
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex
File: pgfcorepathconstruct.code.tex 2021/05/15 v3.1.9a (3.1.9a)
\pgf@path@lastx=\dimen179
\pgf@path@lasty=\dimen180
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage
.code.tex
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex
File: pgfcorepathusage.code.tex 2021/05/15 v3.1.9a (3.1.9a)
\pgf@shorten@end@additional=\dimen181
\pgf@shorten@start@additional=\dimen182
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.co
de.tex
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex
File: pgfcorescopes.code.tex 2021/05/15 v3.1.9a (3.1.9a)
\pgfpic=\box55
\pgf@hbox=\box56
\pgf@layerbox@main=\box57
\pgf@picture@serial@count=\count281
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicst
ate.code.tex
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex
File: pgfcoregraphicstate.code.tex 2021/05/15 v3.1.9a (3.1.9a)
\pgflinewidth=\dimen183
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransform
ations.code.tex
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.tex
File: pgfcoretransformations.code.tex 2021/05/15 v3.1.9a (3.1.9a)
\pgf@pt@x=\dimen184
\pgf@pt@y=\dimen185
\pgf@pt@temp=\dimen186
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.cod
e.tex
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
File: pgfcorequick.code.tex 2021/05/15 v3.1.9a (3.1.9a)
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.c
ode.tex
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex
File: pgfcoreobjects.code.tex 2021/05/15 v3.1.9a (3.1.9a)
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathproce
ssing.code.tex
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.tex
File: pgfcorepathprocessing.code.tex 2021/05/15 v3.1.9a (3.1.9a)
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.co
de.tex
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex
File: pgfcorearrows.code.tex 2021/05/15 v3.1.9a (3.1.9a)
\pgfarrowsep=\dimen187
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.cod
e.tex
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
File: pgfcoreshade.code.tex 2021/05/15 v3.1.9a (3.1.9a)
\pgf@max=\dimen188
\pgf@sys@shading@range@num=\count282
\pgf@shadingcount=\count283
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.cod
e.tex
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
File: pgfcoreimage.code.tex 2021/05/15 v3.1.9a (3.1.9a)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.
code.tex
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex
File: pgfcoreexternal.code.tex 2021/05/15 v3.1.9a (3.1.9a)
\pgfexternal@startupbox=\box58
))
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.co
de.tex
)) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex
File: pgfcorelayers.code.tex 2021/05/15 v3.1.9a (3.1.9a)
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretranspare
ncy.code.tex
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex
File: pgfcoretransparency.code.tex 2021/05/15 v3.1.9a (3.1.9a)
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.
code.tex
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex
File: pgfcorepatterns.code.tex 2021/05/15 v3.1.9a (3.1.9a)
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.
tex
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
File: pgfcorerdf.code.tex 2021/05/15 v3.1.9a (3.1.9a)
)))
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.cod
e.tex
))) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
File: pgfmoduleshapes.code.tex 2021/05/15 v3.1.9a (3.1.9a)
\pgfnodeparttextbox=\box59
)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.
tex
) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
File: pgfmoduleplot.code.tex 2021/05/15 v3.1.9a (3.1.9a)
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version
-0-65.sty
) (/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
Package: pgfcomp-version-0-65 2021/05/15 v3.1.9a (3.1.9a)
\pgf@nodesepstart=\dimen189
\pgf@nodesepend=\dimen190
)
(/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version
-1-18.sty
) (/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
Package: pgfcomp-version-1-18 2021/05/15 v3.1.9a (3.1.9a)
))
(/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
(/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex)
) (/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/math/pgfmath.sty
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex))
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
)) (/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/utilities/pgffor.sty (/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex)) (/usr/local/texlive/2022/texmf-dist/tex/latex/pgf/math/pgfmath.sty (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
Package: pgffor 2021/05/15 v3.1.9a (3.1.9a)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)
\pgffor@iter=\dimen191
\pgffor@skip=\dimen192
\pgffor@stack=\toks38
\pgffor@toks=\toks39
))
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.cod
e.tex
)) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
Package: tikz 2021/05/15 v3.1.9a (3.1.9a)
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothan
dlers.code.tex
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers.code.tex
File: pgflibraryplothandlers.code.tex 2021/05/15 v3.1.9a (3.1.9a)
\pgf@plot@mark@count=\count284
\pgfplotmarksize=\dimen193
@@ -417,34 +304,26 @@ File: pgflibraryplothandlers.code.tex 2021/05/15 v3.1.9a (3.1.9a)
\tikznumberofchildren=\count286
\tikznumberofcurrentchild=\count287
\tikz@fig@count=\count288
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.cod
e.tex
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex
File: pgfmodulematrix.code.tex 2021/05/15 v3.1.9a (3.1.9a)
\pgfmatrixcurrentrow=\count289
\pgfmatrixcurrentcolumn=\count290
\pgf@matrix@numberofcolumns=\count291
)
\tikz@expandcount=\count292
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/frontendlayer/tikz/librarie
s/tikzlibrarytopaths.code.tex
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarytopaths.code.tex
File: tikzlibrarytopaths.code.tex 2021/05/15 v3.1.9a (3.1.9a)
)))
(/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/frontendlayer/tikz/librarie
s/tikzlibrarybackgrounds.code.tex
))) (/usr/local/texlive/2022/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarybackgrounds.code.tex
File: tikzlibrarybackgrounds.code.tex 2021/05/15 v3.1.9a (3.1.9a)
\pgf@layerbox@background=\box64
\pgf@layerboxsaved@background=\box65
)
\c@theorem=\count293
(/usr/local/texlive/2022/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
(/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=\count294
\l__pdf_internal_box=\box66
)
(./paper.aux)
) (./paper.aux)
\openout1 = `paper.aux'.
LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 29.
@@ -462,17 +341,13 @@ LaTeX Font Info: ... okay on input line 29.
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 29.
LaTeX Font Info: ... okay on input line 29.
LaTeX Font Info: Trying to load font information for U+msa on input line 29.
(/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 29.
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/umsb.fd
(/usr/local/texlive/2022/texmf-dist/tex/latex/amsfonts/umsb.fd
File: umsb.fd 2013/01/14 v3.01 AMS symbols B
)
(/usr/local/texlive/2022/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
) (/usr/local/texlive/2022/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
[Loading MPS to PDF converter (version 2006.09.02).]
\scratchcounter=\count295
\scratchdimen=\dimen259
@@ -487,46 +362,30 @@ File: umsb.fd 2013/01/14 v3.01 AMS symbols B
\everyMPtoPDFconversion=\toks41
) (/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.
Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 485.
(/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 Live
)) [1{/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] [2]
(/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
))
[1{/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
[2] [3] [4] [5] (./paper.aux) )
LaTeX Warning: `h' float specifier changed to `ht'.
LaTeX Warning: `h' float specifier changed to `ht'.
[3] [4] [5] [6] [7] [8] (./paper.aux) )
Here is how much of TeX's memory you used:
13541 strings out of 478268
270377 string characters out of 5846347
536683 words of memory out of 5000000
31371 multiletter control sequences out of 15000+600000
476880 words of font info for 57 fonts, out of 8000000 for 9000
14159 strings out of 478268
280330 string characters out of 5846347
592946 words of memory out of 5000000
31987 multiletter control sequences out of 15000+600000
477048 words of font info for 58 fonts, out of 8000000 for 9000
1302 hyphenation exceptions out of 8191
84i,8n,89p,414b,279s 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/p
ublic/amsfonts/cm/cmbx8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/pub
lic/amsfonts/cm/cmcsc10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/pub
lic/amsfonts/cm/cmmi10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/publ
ic/amsfonts/cm/cmmi5.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public
/amsfonts/cm/cmmi7.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/a
msfonts/cm/cmmi8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/ams
fonts/cm/cmr10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfo
nts/cm/cmr7.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts
/cm/cmr8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm
/cmss10.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/c
msy5.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cms
y6.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7
.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.
pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti8.pf
b></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/symbols/msam1
0.pfb>
Output written on paper.pdf (5 pages, 232700 bytes).
84i,8n,89p,676b,841s 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/cmbx8.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/cmmi10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi5.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi7.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi8.pfb></usr/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/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmr8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmss10.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/cmsy5.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy6.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmti8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt8.pfb></usr/local/texlive/2022/texmf-dist/fonts/type1/public/amsfonts/symbols/msam10.pfb>
Output written on paper.pdf (8 pages, 265030 bytes).
PDF statistics:
113 PDF objects out of 1000 (max. 8388607)
69 compressed objects within 1 object stream
129 PDF objects out of 1000 (max. 8388607)
80 compressed objects within 1 object stream
0 named destinations out of 1000 (max. 500000)
13 words of extra memory for PDF output out of 10000 (max. 10000000)
@@ -234,6 +234,188 @@ same restriction to $A(T)$ are identical, so the restriction map is
injective. The stated inequality follows.
\end{proof}
\begin{figure}[h]
\centering
\begin{tikzpicture}[scale=0.82,
ann/.style={circle, fill=black, inner sep=1.3pt},
outv/.style={circle, draw=blue!70!black, fill=blue!12, inner sep=1.7pt},
inv/.style={circle, draw=red!70!black, fill=red!12, inner sep=1.7pt},
mededge/.style={black!62, line width=0.45pt},
attach/.style={black!45, line width=0.38pt}]
\newcommand{\hexannulus}[1]{
\coordinate (#1a0) at (90:1);
\coordinate (#1a1) at (30:1);
\coordinate (#1a2) at (-30:1);
\coordinate (#1a3) at (-90:1);
\coordinate (#1a4) at (-150:1);
\coordinate (#1a5) at (150:1);
\draw[mededge] (#1a0)--(#1a1)--(#1a2)--(#1a3)--(#1a4)--(#1a5)--cycle;
\foreach \i in {0,...,5} \node[ann] at (#1a\i) {};
}
\begin{scope}[shift={(-4.8,0)}]
\hexannulus{x}
\coordinate (xb0) at (60:0.48);
\coordinate (xb1) at (0:0.48);
\coordinate (xb2) at (-60:0.48);
\coordinate (xb3) at (-120:1.46);
\coordinate (xb4) at (180:1.46);
\coordinate (xb5) at (120:1.46);
\foreach \i/\j in {0/1,1/2,2/3,3/4,4/5} {
\draw[attach] (xb\i)--(xa\i);
\draw[attach] (xb\i)--(xa\j);
}
\draw[attach] (xb5)--(xa5);
\draw[attach] (xb5)--(xa0);
\foreach \i in {0,1,2} \node[inv] at (xb\i) {\scriptsize I};
\foreach \i in {3,4,5} \node[outv] at (xb\i) {\scriptsize O};
\node at (0,-1.86) {\scriptsize \texttt{IIIOOO}};
\node at (0,-2.15) {\scriptsize $\min |R_T(\alpha)|=1$};
\end{scope}
\begin{scope}
\hexannulus{y}
\coordinate (yb0) at (60:0.48);
\coordinate (yb1) at (0:0.48);
\coordinate (yb2) at (-60:1.46);
\coordinate (yb3) at (-120:0.48);
\coordinate (yb4) at (180:1.46);
\coordinate (yb5) at (120:1.46);
\foreach \i/\j in {0/1,1/2,2/3,3/4,4/5} {
\draw[attach] (yb\i)--(ya\i);
\draw[attach] (yb\i)--(ya\j);
}
\draw[attach] (yb5)--(ya5);
\draw[attach] (yb5)--(ya0);
\foreach \i in {0,1,3} \node[inv] at (yb\i) {\scriptsize I};
\foreach \i in {2,4,5} \node[outv] at (yb\i) {\scriptsize O};
\node at (0,-1.86) {\scriptsize \texttt{IIOIOO}};
\node at (0,-2.15) {\scriptsize $\min |R_T(\alpha)|=1$};
\end{scope}
\begin{scope}[shift={(4.8,0)}]
\hexannulus{z}
\coordinate (zb0) at (60:0.48);
\coordinate (zb1) at (0:0.48);
\coordinate (zb2) at (-60:1.46);
\coordinate (zb3) at (-120:1.46);
\coordinate (zb4) at (180:0.48);
\coordinate (zb5) at (120:1.46);
\foreach \i/\j in {0/1,1/2,2/3,3/4,4/5} {
\draw[attach] (zb\i)--(za\i);
\draw[attach] (zb\i)--(za\j);
}
\draw[attach] (zb5)--(za5);
\draw[attach] (zb5)--(za0);
\foreach \i in {0,1,4} \node[inv] at (zb\i) {\scriptsize I};
\foreach \i in {2,3,5} \node[outv] at (zb\i) {\scriptsize O};
\node at (0,-1.86) {\scriptsize \texttt{IIOOIO}};
\node at (0,-2.15) {\scriptsize $\min |R_T(\alpha)|=1$};
\end{scope}
\end{tikzpicture}
\caption{Three six-face full medial tire graphs found by the boundary-state
restriction search. Black vertices are annular medial vertices; blue
vertices are outer boundary medial vertices and red vertices are inner
boundary medial vertices. The word below each diagram records the
outer/inner type of the six annular faces in cyclic order. Boundary
states are identified only up to colour permutation, not by rotation or
reflection of the boundary order.}
\label{fig:medial-restriction-worst-cases}
\end{figure}
\begin{figure}[h]
\centering
\begin{tikzpicture}[scale=0.82,
mededge/.style={black!38, line width=0.42pt},
cycleedge/.style={black, line width=1.25pt},
czero/.style={circle, draw=blue!65!black, fill=blue!18, inner sep=1.6pt},
cone/.style={circle, draw=red!65!black, fill=red!18, inner sep=1.6pt},
ctwo/.style={circle, draw=green!45!black, fill=green!20, inner sep=1.6pt}]
\coordinate (n12) at (90:1.45);
\coordinate (n13) at (30:1.45);
\coordinate (n14) at (-30:1.45);
\coordinate (n15) at (-90:1.45);
\coordinate (n16) at (-150:1.45);
\coordinate (n17) at (150:1.45);
\coordinate (n23) at (1.85,1.55);
\coordinate (n34) at (2.45,0.00);
\coordinate (n45) at (1.85,-1.55);
\coordinate (n56) at (-0.15,-2.45);
\coordinate (n67) at (-1.85,-1.55);
\coordinate (n27) at (-1.85,1.55);
\coordinate (n26) at (-0.30,2.55);
\coordinate (n36) at (0.30,0.55);
\coordinate (n35) at (0.45,-0.85);
\draw[mededge] (n12)--(n13);
\draw[mededge] (n12)--(n17);
\draw[mededge] (n12)--(n23);
\draw[mededge] (n12)--(n27);
\draw[mededge] (n13)--(n14);
\draw[mededge] (n13)--(n23);
\draw[mededge] (n13)--(n34);
\draw[mededge] (n14)--(n15);
\draw[mededge] (n14)--(n34);
\draw[mededge] (n14)--(n45);
\draw[mededge] (n15)--(n16);
\draw[mededge] (n15)--(n45);
\draw[mededge] (n15)--(n56);
\draw[mededge] (n16)--(n17);
\draw[mededge] (n16)--(n56);
\draw[mededge] (n16)--(n67);
\draw[mededge] (n17)--(n27);
\draw[mededge] (n17)--(n67);
\draw[mededge] (n23)--(n26);
\draw[mededge] (n23)--(n36);
\draw[mededge] (n26)--(n27);
\draw[mededge] (n26)--(n36);
\draw[mededge] (n26)--(n67);
\draw[mededge] (n27)--(n67);
\draw[mededge] (n34)--(n35);
\draw[mededge] (n34)--(n45);
\draw[mededge] (n35)--(n36);
\draw[mededge] (n35)--(n45);
\draw[mededge] (n35)--(n56);
\draw[mededge] (n36)--(n56);
\draw[cycleedge] (n12)--(n13)--(n14)--(n15)--(n16)--(n17)--cycle;
\node[czero] (v12) at (n12) {\scriptsize $12$};
\node[cone] (v13) at (n13) {\scriptsize $13$};
\node[ctwo] (v14) at (n14) {\scriptsize $14$};
\node[czero] (v15) at (n15) {\scriptsize $15$};
\node[ctwo] (v16) at (n16) {\scriptsize $16$};
\node[cone] (v17) at (n17) {\scriptsize $17$};
\node[ctwo] (v23) at (n23) {\scriptsize $23$};
\node[cone] (v26) at (n26) {\scriptsize $26$};
\node[ctwo] (v27) at (n27) {\scriptsize $27$};
\node[czero] (v34) at (n34) {\scriptsize $34$};
\node[ctwo] (v35) at (n35) {\scriptsize $35$};
\node[czero] (v36) at (n36) {\scriptsize $36$};
\node[cone] (v45) at (n45) {\scriptsize $45$};
\node[cone] (v56) at (n56) {\scriptsize $56$};
\node[czero] (v67) at (n67) {\scriptsize $67$};
\node[anchor=west] at (3.0,1.45) {\scriptsize colour $0$};
\node[czero] at (2.82,1.45) {};
\node[anchor=west] at (3.0,1.05) {\scriptsize colour $1$};
\node[cone] at (2.82,1.05) {};
\node[anchor=west] at (3.0,0.65) {\scriptsize colour $2$};
\node[ctwo] at (2.82,0.65) {};
\node[anchor=west, text width=2.35cm] at (2.82,-0.15)
{\scriptsize thick cycle: annular medial cycle for source $1$};
\end{tikzpicture}
\caption{A proper vertex $3$-colouring of the full medial graph of the
first seven-vertex counterexample found by the experiment. The medial
vertex labelled $ij$ corresponds to the edge $(i,j)$ of the
triangulation. For the vertex-source decomposition at source $1$, the
highlighted annular medial cycle has colour counts $(2,2,2)$, so it is
not coloured with two colours except at at most one vertex.}
\label{fig:medial-annular-cycle-counterexample}
\end{figure}
\begin{definition}[Boundary medial vertices]
\label{def:boundary-medial-vertices}
Let $T$ be a tire tread and let $\Gamma_T$ be the corresponding dual
@@ -387,6 +569,221 @@ move the obstruction into finite boundary-state restrictions carried by
annular medial tire pieces.
\end{remark}
\subsection{Kempe-cycle conservation across medial tires}
We now record an additional structure carried by proper
$3$-colourings of medial graphs. This structure will be useful for
describing how colourings glue across level cycles.
Let $G$ be a plane triangulation and let $M=M(G)$ be its medial graph.
Let
\[
\varphi:V(M)\to\{1,2,3\}
\]
be a proper $3$-colouring of $M$. For a two-element colour set
$P=\{a,b\}\subseteq\{1,2,3\}$, let $M_P$ denote the subgraph of $M$
induced by the vertices of colours $a$ and $b$.
Since $M$ is $4$-regular and $\varphi$ is proper, every vertex of
$M_P$ has degree $2$ in $M_P$. Hence every component of $M_P$ is a
cycle. We call these components the $P$-Kempe cycles of $\varphi$.
\begin{lemma}[Kempe cycles are cycles]
Let $G$ be a plane triangulation, let $M=M(G)$, and let
$\varphi$ be a proper $3$-colouring of $M$. For each
$P\in\{\{1,2\},\{2,3\},\{3,1\}\}$, every component of $M_P$ is a cycle.
\end{lemma}
\begin{proof}
Let $v\in V(M_P)$. In the medial graph $M$, the vertex $v$ has degree
$4$. Since $\varphi$ is a proper $3$-colouring, none of the neighbours
of $v$ has colour $\varphi(v)$. Thus all four neighbours of $v$ have
one of the two colours different from $\varphi(v)$.
In the medial graph of a plane triangulation, the neighbours of a
medial vertex occur in two opposite pairs corresponding to the two
faces incident with the corresponding edge of $G$. Around each such
triangular face, the three medial vertices receive all three colours.
Consequently, at $v$ there are exactly two neighbours of each colour
different from $\varphi(v)$. It follows that, in the subgraph induced
by any two colours $P$, every vertex has degree $2$. Hence each
component of $M_P$ is a cycle.
\end{proof}
Let $T$ be a medial tire region. We regard $T$ as an annular transition
region whose boundary consists of one outer level cycle and finitely
many inner level cycles:
\[
\partial T = C_0\sqcup C_1\sqcup\cdots\sqcup C_m.
\]
Here $C_0$ is the outer level cycle of $T$, and the cycles
$C_1,\ldots,C_m$ are the inner level cycles. Each inner level cycle
$C_i$ is also the outer level cycle of the corresponding child region
in the tire tree.
The following lemma is the basic conservation principle.
\begin{lemma}[Kempe-cycle conservation across level cycles]
Let $C$ be a level cycle of $M$ separating a parent side from a child
side. Let $K$ be a $P$-Kempe cycle for some
$P\in\{\{1,2\},\{2,3\},\{3,1\}\}$. Then $K$ cannot enter the child side
of $C$ without also leaving it.
Equivalently, the incidences of $K$ with $C$ are paired by the
components of $K$ lying on the child side of $C$, and also paired by the
components of $K$ lying on the parent side of $C$.
\end{lemma}
\begin{proof}
By the preceding lemma, $K$ is a cycle. The level cycle $C$ separates
the sphere into two closed regions, which we call the parent side and
the child side. Consider the intersection of $K$ with one of these
regions. Since $K$ is a cycle, no component of this intersection can
have exactly one boundary endpoint on $C$. Each component is either
closed within the region, or is a path with two boundary endpoints on
$C$. Thus every entrance through $C$ is paired with an exit through
$C$.
\end{proof}
More generally, let $T$ be a medial tire region with boundary
\[
\partial T = C_0\sqcup C_1\sqcup\cdots\sqcup C_m.
\]
For a $P$-Kempe cycle $K$, every component of $K\cap T$ is either a
cycle contained in $T$, or a path with two endpoints on
$\partial T$. Thus the $P$-Kempe arcs inside $T$ define a pairing of
the $P$-coloured boundary incidences of
\[
C_0\sqcup C_1\sqcup\cdots\sqcup C_m.
\]
This motivates the following refinement of boundary states.
\begin{definition}[Kempe-enhanced boundary state]
Let $T$ be a medial tire region with outer level cycle $C_0$ and inner
level cycles $C_1,\ldots,C_m$. Let
\[
\mathcal C(T)=C_0\sqcup C_1\sqcup\cdots\sqcup C_m.
\]
A \emph{Kempe-enhanced boundary state} on $T$ consists of the following
data:
\begin{enumerate}
\item a boundary colouring
\[
\alpha:V(\mathcal C(T))\to\{1,2,3\};
\]
\item for each colour pair
\[
P\in\{\{1,2\},\{2,3\},\{3,1\}\},
\]
a pairing $\pi_P$ of the $P$-coloured boundary incidences of
$\mathcal C(T)$ induced by the $P$-Kempe arcs lying inside $T$.
\end{enumerate}
We write such a state as
\[
\kappa=(\alpha,\pi_{12},\pi_{23},\pi_{31}).
\]
\end{definition}
Given a proper $3$-colouring $\varphi$ of the medial tire graph
$M(T)$, the restriction of $\varphi$ to the boundary level cycles gives
the boundary colouring $\alpha$, while the two-colour Kempe arcs inside
$T$ give the pairings $\pi_{12},\pi_{23},\pi_{31}$. Thus $\varphi$
determines a Kempe-enhanced boundary state, denoted
\[
\kappa_T(\varphi).
\]
\begin{definition}[Kempe-enhanced restriction relation]
The \emph{Kempe-enhanced restriction relation} of $T$ is
\[
\mathcal K_T
=
\left\{
\kappa_T(\varphi):
\varphi \text{ is a proper }3\text{-colouring of } M(T)
\right\}.
\]
This refines the ordinary boundary-colouring relation by recording not
only which boundary colourings extend across $T$, but also how the
two-colour Kempe cycles are routed through the annular tire region.
\end{definition}
The annular structure of a tire is useful in two distinct ways. First,
it gives a bounded transition region between level cycles: the colouring
of the annular medial cycle controls, and in many cases determines, the
colouring of the remaining medial tire vertices. Thus the number of
possible transition states is bounded in terms of the annular structure,
rather than the total size of the subtree below the tire. Second, it
describes how the outer level cycle and the inner level cycles are
related by Kempe arcs. The level cycles are the gluing interfaces, while
the annular tire is the transition operator between them.
\begin{definition}[Kempe-compatible gluing]
Let $T$ be a medial tire region and let $U$ be a child region glued to
$T$ along a common level cycle $C$. Thus $C$ is an inner level cycle of
$T$ and the outer level cycle of $U$.
Let
\[
\kappa_T=(\alpha_T,\pi^T_{12},\pi^T_{23},\pi^T_{31})
\in \mathcal K_T
\]
and
\[
\kappa_U=(\alpha_U,\pi^U_{12},\pi^U_{23},\pi^U_{31})
\in \mathcal K_U.
\]
We say that $\kappa_T$ and $\kappa_U$ are \emph{Kempe-compatible along
$C$} if:
\begin{enumerate}
\item the boundary colourings agree on $C$:
\[
\alpha_T|_{V(C)}=\alpha_U|_{V(C)};
\]
\item for each colour pair
\[
P\in\{\{1,2\},\{2,3\},\{3,1\}\},
\]
the pairings $\pi^T_P$ and $\pi^U_P$ compose along the
$P$-coloured incidences of $C$ without producing an unpaired endpoint.
\end{enumerate}
When these conditions hold, the composed pairings determine a
Kempe-enhanced boundary state on the exposed boundary of
$T\cup_C U$.
\end{definition}
In these terms, gluing local colourings is not merely a matter of
matching boundary colours. The colourings must also route their
two-colour Kempe arcs compatibly across every shared level cycle. The
ordinary restriction relation records whether a boundary colouring can
be extended locally; the Kempe-enhanced relation additionally records
the conservation of Kempe-cycle flow through the annular transition
region.
For a tire with one outer level cycle and several inner level cycles,
\[
\partial T=C_0\sqcup C_1\sqcup\cdots\sqcup C_m,
\]
the parent tire may correlate the boundary states on the different
inner cycles. The Kempe-enhanced relation records this correlation as
a system of pairings among the $P$-coloured incidences of all boundary
level cycles simultaneously. Thus one should view a medial tire as a
multi-output transition operator
\[
\mathcal K_T:
C_0 \leadsto (C_1,\ldots,C_m),
\]
rather than as an independent collection of binary transitions.
The guiding principle is therefore:
\begin{quote}
Level cycles are the interfaces used for gluing, while annular tire
regions are the bounded transition regions that route Kempe cycles
between those interfaces.
\end{quote}
\begin{thebibliography}{9}
\bibitem{bauerfeld-nested-tire-decompositions}