Section 4 no longer states the floor as a proven Proposition. Now: prove
interior-free disks attain 2^(n-2) (ear-peeling) and the un-stacking
lemma, state |Phi(D)| >= 2^(n-2) as a Conjecture, and give an honest
status remark -- holds for the Apollonian class, reduces to the
irreducible case, empirically strict (5/4), but |Phi| is NOT monotone
(the earlier freedom-positive monotonicity claim was wrong) and both
natural elementary proofs provably fail. Soften the note's observation to
match.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
transversal.py: a STRONG transversal (n-2 faces whose Boolean assignment
single-valuedly and injectively determines the boundary) would give a
constructive proof. It exists in 0/2948 disks with k>=1 -- once there is
any interior vertex, fixing n-2 faces leaves boundary-visible completion
freedom, so the boundary is never single-valued in them. Works only at
k=0 (base case). Both elementary routes (reduction localization, direct
transversal) now closed.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
local_star_fan.py: the size step |Phi(D-v)| <= |Phi(D)| localizes to a
star-vs-fan contribution comparison at v. But |Star(t)| >= min_root
|Fan(t)| is FALSE (6586 violations) -- the star's extra v-constraint
(sum mu ≡ 0) can make it realize fewer boundary vectors than the fan when
the link has interior vertices. So Strategy A is globally true (100%) but
NOT via per-vertex local domination; the size inequality needs a global
union/choice-of-v argument. Useful byproduct: the Boolean-bit / mod-3
incidence reformulation of Phi.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
reduction_exists.py: every disk with k>=1 (and every irreducible disk)
has a Phi-NON-INCREASING vertex removal (|Phi(D-v)| <= |Phi(D)|), 100%
over thousands of disks -- so induction to the k=0 base case is viable.
BUT the clean set-inclusion Phi(D-v) subset Phi(D) holds for only ~8%, so
the size step cannot be proved by "re-inserting v loses no sequence"; it
needs a genuine cardinality injection between non-nested sets.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Section 4: un-stacking lemma (degree-3 removal preserves Phi, proved),
ear-peeling base case (k=0 => 2^(n-2)), reduction to the irreducible
case, and the irreducible lemma as the sole open conjecture (|Phi| >=
5/4 * 2^(n-2), tight at the degree-4/5 patch; wheel = floor(2^n/3) is not
extremal). Records the two dead ends (monotonicity false, universal
toggles insufficient) and ties each claim to its experiment.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
wheel_extremal.py: |Phi(wheel_n)| = floor(2^n/3) exactly (ratio ->4/3),
but the wheel is NOT the irreducible minimiser for n>=6. The extremal disk
is a single MINIMAL-degree interior vertex (degree 4 or 5, both tie),
giving |Phi| = (5/4)*2^(n-2) = 5*2^(n-4). The ratio rises monotonically
with center degree, 5/4 -> 4/3, so minimal degree is extremal. Sharpens
the irreducible lemma to |Phi| >= (5/4)*2^(n-2), tight at the degree-4/5
patch.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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>