Documentation

LeanPool.IsoGraph.Canon.Dominate

Domination bookkeeping for the optimality proof #

Small lemmas about how far down a returning search call has guaranteed that every leaf key is dominated by the incumbent, and about moving a subtree along an automorphism.

Domination helpers #

theorem IsoGraph.Canon.Beaten.dom {st : St} {k : List (List UInt64)} (h : Beaten st k) :
Dom st k

The depth to which a returning call guarantees that everything below is dominated: the node itself if it finished, the backjump target's child if it was cut short.

Equations
Instances For
    theorem IsoGraph.Canon.leafUpdate_dom_new (G : Graph) (path : Array ) (invPath : Array UInt64) (lab : Array ) (st : St) :
    Dom (leafUpdate G path invPath lab st) (leafKey invPath (certOf G lab))

    A leaf update dominates the leaf it was given.

    theorem IsoGraph.Canon.leafUpdate_abort {G : Graph} {path : Array } {invPath : Array UInt64} {lab : Array } {st : St} {j : } (h : (leafUpdate G path invPath lab st).abortTo = some j) :
    ∃ (l : Leaf), (st.first = some l st.best = some l) lexCmpU64 (certOf G lab) l.cert = Ordering.eq j = commonPrefix path l.path

    A leaf update only ever asks to backjump to the branch point with a leaf it already holds, and only when the certificates tie.

    Moving a subtree back along an automorphism #

    theorem IsoGraph.Canon.partEquiv_inv {n : } {f : Bool} {g : Array } (hg : IsAutoArr n f g) {p : Part} (he : PartEquiv n (fun (x : ) => g[x]!) p p) :
    PartEquiv n (fun (x : ) => (invAuto n g)[x]!) p p
    theorem IsoGraph.Canon.subR_inv {n : } {f : Bool} {g : Array } (hg : IsAutoArr n f g) {p : Part} (hp : Part.WF n p) (he : PartEquiv n (fun (x : ) => g[x]!) p p) {invPath : Array UInt64} {w : } (hw : w < n) {k : List (List UInt64)} (h : SubR n f invPath p g[w]! k) :
    SubR n f invPath p w k

    Orbit pruning, the direction the search needs. If γ fixes the node, the leaves below the child γ w are exactly the leaves below the child w.