irreducible_floor.py: over 10k+ irreducible disks (k>=1, min interior
degree >=4), |Phi| never violates 2^(n-2) and never sits on it -- min is
5*2^(n-4) = (5/4)2^(n-2), the wheel being the minimizer. Universal toggles
are dead (99.9% have zero boundary-only faces). Since un-stacking degree-3
vertices preserves Phi and terminates at a k=0 or irreducible residue, the
whole lower bound reduces to: every irreducible disk has |Phi| >= 2^(n-2).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
monotonicity_test.py inserts interior vertices and checks |Phi|. Degree-3
stacks preserve Phi exactly (confirms un-stacking, 100%), but degree-4
insertions can SHRINK Phi (6->5, 30->28) and Phi(D') subset Phi(D) fails
~13% -- so the reduce-to-base-case proof of the 2^(n-2) floor via
monotonicity does not work. Violations stay above the floor, so the floor
is protected by something stronger; redirect to a direct n-2 toggle
construction.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Remark: a disk with k interior vertices has 2k+n-2 faces (Euler) but only
k interior constraints, so each interior vertex adds two degrees of
freedom against one constraint -- depth is freedom-positive and Phi can
only retain or enlarge below the interior-free floor 2^(n-2). Motivates
the lower bound and replaces the prior TODO sketch.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The stacked-only search missed non-stacked disks, and cocircular boundary
points gave degenerate Delaunay (invalid disks, spurious sub-floor |Phi|).
Add floor_diverse_disks.py: 1700+ validated disks per n (convex non-
cocircular boundary, face-count and boundary-edge checks) confirm min|Phi|
= 2^(n-2). Note records that interior structure tends to ENLARGE Phi
(wheel 5 vs fan 4) and that depth adds two faces per one constraint.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add section 4: define the achievable boundary set Phi(D) of a triangulated
disk and state the constraint-floor proposition |Phi(D)| >= 2^(n-2), with
the attainment direction proved (fan injectivity) and the lower bound left
as a marked gap with strategy. Remark records the zonotope structure and
the short-interface concentration of difficulty.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Experiments probing the cluster restriction set R_K / Phi: R_K is a Z/3
zonotope (not a GF(3) subspace), the "richness" invariant is an artifact
of non-shrinking annuli, the interface gluing always works on interior
cycles (forced by 4CT), and the maximal constraint achievable on an
n-cycle is a floor of 2^(n-2) -- already reached by the trivial tire.
Note boundary_restriction_structure.tex writes these up.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The bounded-face sum omits the outer face at outer-boundary vertices, so
restrict the gluing identity to interior vertices (where all cluster
interfaces live) and recover a colouring by carrying a single +/-1 label
on the unbounded face f_inf, giving Heawood's identity on the full cubic
dual for the Tait step.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add the two-sided cluster decomposition proposition: a vertex's full
Heawood face-sum splits as exactly one child-cluster contribution plus
one parent-cluster contribution (the at-most-two-clusters bound makes the
pairing binary and complete). Explain why this fails per-tire -- a vertex
on many same-depth tires has only a fragment of its face-star in any one
tire -- and recast the chain-pigeonhole and 4CT conjectures to nested
clusters with a cluster restriction relation.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Define a connected tire cluster (union of same-depth tires joined by
shared vertices, transitive closure), prove same-depth tires meet only
in vertices, and prove every vertex lies in at most two clusters (one at
each of two consecutive depths) -- the bounded coarsening of the
unbounded per-vertex tire count.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Define a +/-1 Heawood face-labelling of a tire, its induced boundary
Heawood sequences and restriction relation, and interface compatibility
(0<->0, +1<->-1 = vertex face-sum vanishes mod 3). State the Heawood
chain-pigeonhole conjecture and a tire route to the Four Colour Theorem,
parallel to the medial programme.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a new paper stub referencing the nested tire decompositions paper,
with intro, Heawood bibliography entry, and an empty restrictions section.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Store the combinatorial planar embedding in the result and lay out the
source graph with nx.planar_layout so no primal edges cross and each dual
node sits inside its own triangle, replacing the concentric layout that
produced crossings. Add a committed generate_full_walk.py that reproduces
the walk .md/.pdf/.png outputs, and regenerate the walk 1 and walk 2 dual
figures and PDFs (reports unchanged).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Label each dual face by its distance, within the source-dual cut, from
the first entry's cap down tooth. Regenerate the seed 1 and seed 2 full
walk figures and metadata with the new labelling.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Source-dual cut is a spanning tree of the dual (38 faces, 37 edges,
connected and acyclic) after 20 cut edges removed.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A tread's annular frontier can split into several disjoint cycles; each
is now recognised as a separate full medial tire graph instead of
disqualifying the whole tread.
- recognise() returns a list of (g, bij), one per annular cycle
component; add annular_cycle_components() and _recognise_one(), and
iterate components in iter_pieces().
- Key tires/results by (depth, component) throughout both experiment
drivers: _label_treads chains each tire to a parent-depth down tooth
sharing its apex; _cap_cut/_assemble_cut_graph/to_json/summary and the
dual-cut collectors/draws follow suit.
Source vertex selection for the dual-cut experiment now deep-embeds a
random face and roots at the outer-cap vertex. The source-dual figure
labels the source-graph vertices, highlights the entry medial vertex,
and uses a cap-rooted concentric layout.
For seed 7 / face (14,15,19) this recognises treads 3 and 4 as two
tires each (3.0,3.1,4.0,4.1), so every dual face is now cut.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add draw_cap_png and a --cap-png flag: render tread 0 as a wheel (source
hub, link-cycle rim, cap triangles filled, cap cut marked) from the
extract_tread roles, since tread 0 is skipped by tire recognition (a wheel
has no up teeth). Render funcD seed7's cap.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reflects cutting up-tooth apexes (except entry teeth): seed7 removes 17
source-dual edges, so its dual retains cycles (not a tree).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Duplicate the apex medial vertex of every singleton up tooth across all
recognised treads -- except each tread's entry tooth, whose apex is left
intact -- in addition to the closing annular-vertex cuts.
For seed59 (source 5) this removes 19 = n-1 source-dual edges and the
remaining dual is a tree (verified for every source/entry choice). The
tree property holds exactly when n-1 distinct edges are cut; some graphs
(e.g. seed7, cutting 17) fall short and retain cycles.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add draw_tire_cuts_png (and a --tire-png flag): one panel per recognised
tread showing the annular cycle, up/down/bite teeth, walk-depth labels, and
cut slits, ported from medial_tire_cut_labelling.to_tikz. Render the
function-D (seed 7) graph's tire cuts.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reads the chained medial tire cut off as a source-dual cut (planar dual of
G with the cut edges removed), as in seed59_min5_dual_cut_1.png, and counts
the missing dual edges around each dual face (vertex of G).
Four chained entry points, broad to narrow control:
- random_dual_cut: random min-degree-5 maximal planar graph -> ...
- dual_cut_random_source: random level source -> ...
- dual_cut_random_entry: random root entry tooth -> ...
- medial_tire_dual_cut: worker chaining the walk-depth labelling/cut.
Refactor _label_treads to accept an optional root_entry_edge (default
preserves the arbitrary-up-tooth behaviour) so the worker can pin the entry.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a --whole mode to draw_medial_tire_cut.py that renders the entire
medial graph M(G) (the assembled cut graph), on a Kamada-Kawai layout,
with the recognised tires highlighted (black annular vertices, blue/red
teeth carrying walk depths, larger red bite apex) and the rest of M(G)
in grey. Add the resulting figure (Figure 3) and a describing paragraph
to the paper for the n=20 seed-72 example, via an \input-ed .tikz file.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add experiments/draw_medial_tire_cut.py, the paper-graphics companion
that imports run_experiment and emits a TikZ panel (walk-depth labels +
cut slits) per recognised tread via to_tikz. Add the resulting figure
(Example 3.2, Figure 2): the single recognised tread T_2 of the medial
tire decomposition of a random maximal planar graph on 20 vertices
(seed 72), an 8-cycle piece with a bite, labelled and cut.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
New experiments/run_medial_tire_cut_experiment.py: generates a random
maximal planar graph (stacked seed + random diagonal flips), builds the
medial graph, takes the tire decomposition at a random vertex level
source, walk-depth labels and cuts each full medial tire graph chained
down the tire tree, and assembles one final cut graph of M(G) with a
global label map (data only; graphics go in a separate script).
Fix label_and_cut: the root face is None, which collided with the
next(..., None) sentinel, leaving teeth unlabelled when the entry up
tooth lay inside a bite gap; use a distinct sentinel so the ascent to
the root face runs.
Add a "Chaining across the tire tree" section to the paper, clarifying
that the candidate parent down teeth are the boundary (singleton) down
teeth only -- bite teeth are interior to the parent and shared with no
child, so a lower-walk bite is skipped.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
New experiments/medial_tire_cut_labelling.py: takes a full medial tire
graph and an entry up tooth and runs the walk-depth labelling-and-cut
procedure, reusing the full medial tire generator's model and emitting
TikZ. Add a generator-produced 8-tooth example to the paper (Figure 1,
Example 2.3) showing the labelling and the two cuts, plus a remark
fixing the cut's closing tooth for descended faces.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
New paper "Medial Tire Cuts" citing the medial tire decompositions
paper. States the goal of decomposing the medial graph into a tree of
3-faces, and gives the walk-depth labelling-and-cut procedure for a
single full medial tire graph: a cut duplicates the annular vertex
where a face's tooth traversal closes (planar unzip), reducing the
inner faces to teeth.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Drop the faint base-graph (G') edges and the dotted restored base edge from the
medial panels, leaving just the medial graph (medial vertices at edge midpoints,
medial edges, colours, halos, and the restored-diagonal medial square). Panels A
and B still show the triangulation.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The walkthrough previously used a concentric layout whose outer-triangle->ring
spokes can cross -- not a valid plane embedding. Rebuild draw_walkthrough.py on
networkx planar_layout with an explicit crossing check: G, G', and the medial
M(G') drawn at edge midpoints are each verified crossing-free before rendering.
G' is embedded once and reused for panels B/C/D; G reuses it when still planar.
The medial-at-midpoints drawing is planar except for the medial triangle of the
geometric outer face (its midpoint-chords would cut across the unbounded region),
so those three edges are detected via the convex hull and omitted; the remainder
is verified crossing-free. Note updated to describe the embedding.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
draw_failing_graph.py renders seed2 #26 (ring [3,6,3]+face leaf, 12 vertices),
the smallest graph the programme fails on after exhausting sites x tread-phases x
root colour-orders. Uses networkx planar_layout for a straight-line embedding and
verifies no two non-incident edges cross before drawing. Panel A: plain embedding;
panel B: BFS levels with the odd level-2 seam (the inner triangle 9-11-10) bold,
the terminal leaf face shaded -- the face-leaf/gadget spot where removal fails.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
residue_phase_sweep.py exhaustively enumerates the two colouring control knobs
-- the per-annulus tread phase {0,1}^A and the root-DFS colour order perms(0,1,2)
-- on top of every insertion-site combo, for the graphs the random-phase site
sweep still fails. canonical_coloring_explicit makes this deterministic.
Result (residue_phase_sweep_results.txt): the two hub graphs are RESCUED once
phase is enumerated rather than sampled (so the random-phase fail count overstates
difficulty); the genuine obstructions that survive sites x phases x colour-orders
are exactly the face-leaf graphs (terminal-triangle leaf gadget). Smallest is
seed2 #26 [3,6,3] face (1 combo, 24 settings, all fail at gadget-removal) -- a
minimal obstruction target. Caveat: try_establish is a bounded local Kempe search,
so STILL FAILS means unreachable by the bounded search from canonical-even over
all knob settings, not that no Kempe path exists.
Findings note updated.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Refactor canonical_coloring into coloring_skeleton (phase-independent parts) +
canonical_coloring_explicit (explicit phases + DFS colour order) + a random-phase
wrapper for back-compat. This exposes the two control knobs deterministically so
they can be enumerated rather than only sampled.
Add a fully worked example on the smallest clean graph (ring [3,5]+hub, 9
vertices, one odd seam, no gadgets): even_program_walkthrough.md traces all six
stages -- generate G with embedding, pick source + BFS levels, choose the diamond
site that evens the level-5 seam, build M(G'), the canonical colouring (seam
mono-3, hub annulus alternates, root by DFS), and a real {1,2}-Kempe switch that
makes the diamond quad reducible. dump_walkthrough.py reproduces every number;
draw_walkthrough.py renders the 4-panel figure even_program_walkthrough.png.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
run_graph no longer takes the first admissible seam edge per odd seam. It now
enumerates every valid diamond site per odd seam (_candidate_sites), sweeps the
full Cartesian product (capped by --max-combos), runs <=4 colour phases per
combination, and counts a graph ok iff SOME placement fully descends. Reports
both the old first-match tally and the swept tally, plus design-space stats and
how many graphs the sweep rescued.
Finding: most "fail:diamond-switch" cases were heuristic, not intrinsic. The
old 39/60 was the first-match heuristic (one point in the design space, and
seed-sensitive 31-39). Sweeping insertion sites rescues ~20 of ~24 first-match
failures:
seed 1: first-match 31 ok / 29 fail -> sweep 54 ok / 6 fail (rescued 23)
seed 2: first-match 36 ok / 24 fail -> sweep 57 ok / 3 fail (rescued 21)
Only ~3-6 fail:diamond-switch survive the full site sweep -- those are the real
obstruction targets for the joint {1,3}-cycle bipartiteness solver. The colour/
tread phase is still only randomized over 4 attempts, not enumerated.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Constructive route: surger G so every level cycle is even (two-vertex leaf gadget
on terminal triangles -> 4-wheel, no defect; diamond on odd internal seams), take
the canonical even colouring of M(G') (no 4CT used), Kempe-remove the planted
degree-4/3 vertices to reach a proper 3-colouring of M(G).
Pipeline runs end to end on synthetic ring triangulations: surgery, canonical
colouring, and gadget removal all work; the program lands on the CYCLE LAYER
(39/60 ok, rest fail:diamond-switch). Diagnostic: a descendable colouring always
EXISTS (M(G) is 3-colourable), so failures are Kempe-reachability from the
canonical even colouring, not non-existence -- the entire difficulty is localised
there. Greedy per-diamond switching is insufficient because diamonds share vertical
{1,3}-Kempe cycles; the principled solve is joint (bipartiteness of the diamond /
side-cycle constraint graph), which is the identified next step. Includes the leaf
gadget figure and a findings note.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add kempe_rt_composition_probe.py: Ext(T) = boundary necklaces realisable on a
subtree's outer seam by a compatible Kempe-balanced selection; monotone maps over
minimal-antichain families decide whether empty Ext is reachable. Modeling facts
established: the seam is exactly the singleton down apexes (bite apexes have parent
faces on both sides, hence parent-internal); necklace states are exact because a
child attaches with free dihedral placement (dihedral-closed sequence sets).
Result over all no-length-3-boundary tiles n<=14 (7750 tiles, 1966 distinct
relations, 149 leaf, 27 branching): empty Ext is NOT reachable — every assemblable
tree admits a compatible selection, verifying the chain-pigeonhole conjecture
exhaustively for tire trees with treads n<=14 and no separating triangles. The
fixpoint saturates in 2 rounds: restriction does not accumulate along chains.
Tightest subtree pins a size-5 seam to the single necklace 00012; every smallest
minimal Ext contains the blocky/regular state. Relations cached (~6MB) for cheap
extension to larger n. Caveat: terminal facial-triangle leaves not yet modeled.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add kempe_regular_family_test.py (fixed family, per-tile early-exit, --branch-only).
Threads 614/614 at n=12 but FAILS at n=15 on two classes of no-separating-triangle
tiles: non-branching large-even-outer + odd inner (UUUUUUDUDUDUDUD, p=10, face 5) and
branching odd-outer + two even inner faces (UDUDUDDUDUDDDDD bite=(5,12), p=5, [4,4];
11/1022 branching fail). This is the R_T coupling (not a product) biting at scale: the
uniform family sets outer/inner states independently per size. The shortcut was
stronger than the chain-pigeonhole conjecture (which allows per-interface freedom), so
its failure costs a constructive route, not the conjecture; pairwise overlap still
holds. Next line: per-interface R_T composition respecting coupling.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Full uniform-family CSP at n=14 --no-tri (4403 tiles, 193 branching) is FEASIBLE:
one family threads every tile incl. branching nodes (outer rim + both inner faces
at once). Independent candidate test threads 193/193 branching tiles. Witness is
fully regular: sigma_m = 0^m if m even (monochromatic), 0^(m-2)12 if m odd. So on
the 4CT-relevant class the chained pigeonhole is constructively resolved throughout
the tested range (n=9,12,14, incl. branching).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add kempe_branching_min_probe.py (structural: >=2 inner faces with singletons).
Unrestricted branching first appears at n=11; no-separating-triangle branching
(>=2 inner faces each >=4 singletons, p>=4) first appears at n=14 (193 tiles).
Smallest example: word=UUUUDDDDDDDDDD bite=(8,13), p=4, faces root{4,5,6,7} and
bite{9,10,11,12}. n=14 is the smallest place to test the uniform family / R_T
composition on a genuine branching no-separating-triangle tile.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add --no-tri filter (exclude tiles with a length-3 boundary = separating/non-facial
triangle in G: outer rim of 3 up teeth, or an inner face of exactly 3 singleton
downs) to the trend and uniform-family probes.
The n=12 breaker UUUDUDUDUDUD bite=(3,11) has a size-3 inner face (encloses d5,d7,d9)
and is excluded. With the restriction the size-7 universal at n=12 is restored
(|D[7]| 0->2), every |D[m]|>=1 across n=6..13, and the uniform-family CSP becomes
FEASIBLE at n=12 with the simplest family (monochromatic on even sizes, min-cut on
odd). So the only universal failure was an artifact of admitting non-4-connected
configs; on the 4CT-relevant class gluing is constructively trivial in range.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>