diff --git a/papers/medial_tire_decompositions_of_plane_triangulations/experiments/check_medial_annular_cycle_condition.py b/papers/medial_tire_decompositions_of_plane_triangulations/experiments/check_medial_annular_cycle_condition.py new file mode 100644 index 0000000..8c6bbd5 --- /dev/null +++ b/papers/medial_tire_decompositions_of_plane_triangulations/experiments/check_medial_annular_cycle_condition.py @@ -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() diff --git a/papers/medial_tire_decompositions_of_plane_triangulations/experiments/medial_annular_cycle_condition_findings.md b/papers/medial_tire_decompositions_of_plane_triangulations/experiments/medial_annular_cycle_condition_findings.md new file mode 100644 index 0000000..2136fdc --- /dev/null +++ b/papers/medial_tire_decompositions_of_plane_triangulations/experiments/medial_annular_cycle_condition_findings.md @@ -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. diff --git a/papers/medial_tire_decompositions_of_plane_triangulations/experiments/medial_tire_restriction_findings.md b/papers/medial_tire_decompositions_of_plane_triangulations/experiments/medial_tire_restriction_findings.md new file mode 100644 index 0000000..f1668d8 --- /dev/null +++ b/papers/medial_tire_decompositions_of_plane_triangulations/experiments/medial_tire_restriction_findings.md @@ -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. diff --git a/papers/medial_tire_decompositions_of_plane_triangulations/experiments/medial_tire_restriction_search.py b/papers/medial_tire_decompositions_of_plane_triangulations/experiments/medial_tire_restriction_search.py new file mode 100644 index 0000000..c339b51 --- /dev/null +++ b/papers/medial_tire_decompositions_of_plane_triangulations/experiments/medial_tire_restriction_search.py @@ -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() diff --git a/papers/medial_tire_decompositions_of_plane_triangulations/paper.aux b/papers/medial_tire_decompositions_of_plane_triangulations/paper.aux index 3dc986c..511ea74 100644 --- a/papers/medial_tire_decompositions_of_plane_triangulations/paper.aux +++ b/papers/medial_tire_decompositions_of_plane_triangulations/paper.aux @@ -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} diff --git a/papers/medial_tire_decompositions_of_plane_triangulations/paper.fdb_latexmk b/papers/medial_tire_decompositions_of_plane_triangulations/paper.fdb_latexmk index c9286f3..4751c0b 100644 --- a/papers/medial_tire_decompositions_of_plane_triangulations/paper.fdb_latexmk +++ b/papers/medial_tire_decompositions_of_plane_triangulations/paper.fdb_latexmk @@ -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" diff --git a/papers/medial_tire_decompositions_of_plane_triangulations/paper.fls b/papers/medial_tire_decompositions_of_plane_triangulations/paper.fls index 4d2e763..8fff45e 100644 --- a/papers/medial_tire_decompositions_of_plane_triangulations/paper.fls +++ b/papers/medial_tire_decompositions_of_plane_triangulations/paper.fls @@ -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 diff --git a/papers/medial_tire_decompositions_of_plane_triangulations/paper.log b/papers/medial_tire_decompositions_of_plane_triangulations/paper.log index f7e8069..3439d11 100644 --- a/papers/medial_tire_decompositions_of_plane_triangulations/paper.log +++ b/papers/medial_tire_decompositions_of_plane_triangulations/paper.log @@ -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 - -Output written on paper.pdf (5 pages, 232700 bytes). + 84i,8n,89p,676b,841s stack positions out of 10000i,1000n,20000p,200000b,200000s + +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) diff --git a/papers/medial_tire_decompositions_of_plane_triangulations/paper.pdf b/papers/medial_tire_decompositions_of_plane_triangulations/paper.pdf index 88f68f0..7528a59 100644 Binary files a/papers/medial_tire_decompositions_of_plane_triangulations/paper.pdf and b/papers/medial_tire_decompositions_of_plane_triangulations/paper.pdf differ diff --git a/papers/medial_tire_decompositions_of_plane_triangulations/paper.tex b/papers/medial_tire_decompositions_of_plane_triangulations/paper.tex index a89b557..2aff88d 100644 --- a/papers/medial_tire_decompositions_of_plane_triangulations/paper.tex +++ b/papers/medial_tire_decompositions_of_plane_triangulations/paper.tex @@ -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}