Recovering a cleared state is the cleared recovery.
Path facts ignore the one-shot short-prune request.
An early child return leaves the loop after cleaning the temporary fixed vertex.
A child that stays at the loop level continues with the recursive tail on the recovered, possibly filtered, state.
A loop exit depends on its receipt trail only below the loop level.
An off-path sweep result can be rebased onto any entry trail agreeing below the loop level.
What an off-path sibling sweep knows at every cursor position:
the established loop invariant, the live package, path facts, guide and
orbit facts, and the cheap-cell boundary discipline relative to the node
entry boundary e.
- inv : LoopInv G ctx tcLevel specFuel level codes bs fs numcells rsLab rsPtn tc len tcell cursor base st best trail
- live : OtherLive ctx level st trail
- path : PathOk ctx (initPtn n (n + 2) (initialPartition G).snd) (initialPartition G).fst level st
- guide : GuideRel level base st
- desc : CheapDesc ctx level st.noncheaplevel (LoopInv.frame rsLab rsPtn numcells)
- park : cheapautom rsPtn level n = false → st.noncheaplevel = level + 1
- keep : st.noncheaplevel < level → st.noncheaplevel = e
Instances For
What a finished off-path sweep preserves for its enclosing node.
- boundary : out.noncheaplevel < level → out.noncheaplevel = e
Instances For
The cheap-cell ledger is ready for the next child.
A proof of the visits made by an off-path sweep, retaining each child's packaged return and the invariant at its receiving frame. This is proof-only: it adds no trace to the executable search state.
- done {n k : Nat} {G : Colored n k} {ctx : Ctx n} {inf tcLevel specFuel runFuel level numcells tc len tv1 e : Nat} {codes fs : List Nat} {rsLab rsPtn : Array Nat} {base : SearchSt n} {loopFuel : Nat} {cursor : Option Nat} {tcell : VSet n} {st : SearchSt n} {best : Option (Key n)} {trail : FrameTrail} {bs : List Nat} (hyp : OtherLoopHyp G ctx tcLevel specFuel level codes bs fs numcells rsLab rsPtn tc len tcell cursor e base st best trail) (next : tcell.nextElem cursor = none) : OtherSweep G ctx inf tcLevel specFuel runFuel level numcells tc len tv1 e codes fs rsLab rsPtn base (loopFuel + 1) cursor tcell st best trail
- visit {n k : Nat} {G : Colored n k} {ctx : Ctx n} {inf tcLevel specFuel runFuel level numcells tc len tv1 e : Nat} {codes fs : List Nat} {rsLab rsPtn : Array Nat} {base : SearchSt n} {loopFuel : Nat} {cursor : Option Nat} {tcell : VSet n} {st : SearchSt n} {best : Option (Key n)} {trail : FrameTrail} {bs : List Nat} {tv offset : Nat} {child out : SearchSt n} {r : Int} {childBest : Option (Key n)} {eventTrail : FrameTrail} (hyp : OtherLoopHyp G ctx tcLevel specFuel level codes bs fs numcells rsLab rsPtn tc len tcell cursor e base st best trail) (next : tcell.nextElem cursor = some tv) (offsetLt : offset < len) (atOffset : rsLab[tc + offset]! = tv) (childEq : child = { lab := (breakout n st.lab st.ptn (level + 1) tc tv).fst, ptn := (breakout n st.lab st.ptn (level + 1) tc tv).snd.fst, active := (breakout n st.lab st.ptn (level + 1) tc tv).snd.snd, orbits := st.orbits, fixedpts := st.fixedpts.insert tv, autos := st.autos, wsCap := st.wsCap, firstcode := st.firstcode, canoncode := st.canoncode, firsttc := st.firsttc, firstlab := st.firstlab, canonlab := st.canonlab, canong := st.canong, samerows := st.samerows, compCanon := st.compCanon, eqlevFirst := st.eqlevFirst, eqlevCanon := st.eqlevCanon, gcaFirst := st.gcaFirst, gcaCanon := st.gcaCanon, canonlevel := st.canonlevel, noncheaplevel := st.noncheaplevel, allsamelevel := st.allsamelevel, cosetindex := st.cosetindex, stabvertex := st.stabvertex, needshortprune := st.needshortprune, numnodes := st.numnodes, tctotal := st.tctotal, canupdates := st.canupdates, numorbits := st.numorbits, numgenerators := st.numgenerators, numbadleaves := st.numbadleaves, maxlevel := st.maxlevel, genTrace := st.genTrace }) (call : otherNode ctx inf tcLevel runFuel (level + 1) (numcells + 1) child = (r, out)) (run : OtherRun G ctx tcLevel specFuel runFuel (level + 1) codes fs child out (numcells + 1) best childBest (trail.push level { frame := sweepFrame specFuel codes rsLab rsPtn tc numcells, offset := offset }) eventTrail r) (keep : OtherKeep ctx (level + 1) child out) (continuation : ¬r < Int.ofNat level → let cleaned := { lab := out.lab, ptn := out.ptn, active := out.active, orbits := out.orbits, fixedpts := out.fixedpts.erase tv, autos := out.autos, wsCap := out.wsCap, firstcode := out.firstcode, canoncode := out.canoncode, firsttc := out.firsttc, firstlab := out.firstlab, canonlab := out.canonlab, canong := out.canong, samerows := out.samerows, compCanon := out.compCanon, eqlevFirst := out.eqlevFirst, eqlevCanon := out.eqlevCanon, gcaFirst := out.gcaFirst, gcaCanon := out.gcaCanon, canonlevel := out.canonlevel, noncheaplevel := out.noncheaplevel, allsamelevel := out.allsamelevel, cosetindex := out.cosetindex, stabvertex := out.stabvertex, needshortprune := out.needshortprune, numnodes := out.numnodes, tctotal := out.tctotal, canupdates := out.canupdates, numorbits := out.numorbits, numgenerators := out.numgenerators, numbadleaves := out.numbadleaves, maxlevel := out.maxlevel, genTrace := out.genTrace }; let cleared := clearShortIf cleaned.needshortprune cleaned; let cell := if cleaned.needshortprune = true then shortprune tcell cleared else tcell; let cell' := if (tv == tv1) = true then longprune cell cleared.fixedpts cleared.autos else cell; OtherSweep G ctx inf tcLevel specFuel runFuel level numcells tc len tv1 e codes fs rsLab rsPtn base loopFuel (some tv) cell' (recover n inf level cleared) childBest eventTrail) : OtherSweep G ctx inf tcLevel specFuel runFuel level numcells tc len tv1 e codes fs rsLab rsPtn base (loopFuel + 1) cursor tcell st best trail
Instances For
Totality of an off-path sibling sweep at every cursor fuel exceeding the remaining cursor range, given totality of its children.
A comparison leaf that is not a row tie records no generator.
A comparison leaf that is not a row tie leaves the orbits alone.
A fresh short-prune request at such a leaf proves that the implicit pair was admitted below the saved boundary.
The shared prune tail returns the level just below the saved boundary whenever the comparison depth is the current level.
A comparison leaf that is not a row tie returns just below the saved cheap-cell boundary.
A first-path-agreeing leaf cannot compare above the incumbent when the first leaf is dominated by that incumbent.
A comparison leaf that neither ties the incumbent nor sits in the frozen-downward arm installs or rejects itself and returns to the saved cheap-cell boundary.
An early off-path leaf keeps the first labelling, orbit soundness, and the saved cheap-cell boundary of its node.
Every off-path leaf outside the first-path admission test is a packaged run that keeps its node's carried facts.
The admitted first-path-agreeing leaf is a packaged run that keeps its node's carried facts. Domination of the first leaf rules out a comparison above the incumbent.
Failing the admission test runs exactly the comparison arm of the twin state with agreement depth zero. Only the recorded depth differs.
The paired form of processnode_gateFail_state.
Below the root, node preparation never raises a zero agreement depth, so the twin leaf state is the leaf state with its depth overwritten.
Leaf cleanup commutes with overwriting the agreement depth.
An off-path leaf that fails admission runs as its twin with the recorded agreement depth restored.
Lowering the first-path agreement depth preserves the stable invariant.
Lowering the first-path agreement depth preserves the node invariant.
Overwriting the agreement depth does not touch an unwind payload.
Equations
- Hex.GraphIso.Nauty.Unwind.setEqlev e (Hex.GraphIso.Nauty.Unwind.first anchor carrier atFirst) = Hex.GraphIso.Nauty.Unwind.first anchor carrier atFirst
- Hex.GraphIso.Nauty.Unwind.setEqlev e (Hex.GraphIso.Nauty.Unwind.canon anchor carrier atCanon) = Hex.GraphIso.Nauty.Unwind.canon anchor carrier atCanon
- Hex.GraphIso.Nauty.Unwind.setEqlev e (Hex.GraphIso.Nauty.Unwind.orbit payload) = Hex.GraphIso.Nauty.Unwind.orbit ⋯
Instances For
Location evidence survives the transport.
A frozen comparison does not read the agreement depth.
A short-prune source does not read the agreement depth.
Semantic soundness only reads the frame of the entry state.
The exit classification transports from the twin.
The off-path result of a leaf that fails admission follows from the result of its twin. The event package is rebuilt directly from the leaf comparison, because the twin's event only records agreement depth zero.