Nodes of the search tree #
dfsNode carries three arguments that are only meaningful together: the array path of the
vertices individualised so far, the invariant path invPath, and the current partition p.
Node n f path invPath p is the ghost relation saying that these three really do come from
individualising path from the root, in order.
It packages the facts that the recursion needs about a node it is sitting at:
Node.wf— the partition is well-formed;Node.path_lt— the individualised vertices are vertices;Node.reach— a leaf below this node is a leaf of the whole tree (so a key found here is a legitimate candidate for the maximum);Node.auto_partEquiv— the partition is invariant under any automorphism fixingpathpointwise, which is exactly the hypothesisreach_child_autoneeds and exactly whatusableAutosfilters for.
Nodes of the search tree #
Node n f path invPath p says that the search reaches the node (invPath, p) by
individualising the vertices of path, in order. It is the ghost information that ties together
the three arguments path, invPath and p of dfsNode.
- root {n : ℕ} {f : ℕ → ℕ → Bool} : Node n f #[] (rootInv n f) (rootPart n f)
- step {n : ℕ} {f : ℕ → ℕ → Bool} {path : Array ℕ} {invPath : Array UInt64} {p : Part} {c v : ℕ} (h : Node n f path invPath p) (hc : p.targetCell n = some c) (hv : v < n) (hcell : p.cst[p.pos[v]!]! = c) : Node n f (path.push v) (childInv (Graph.ofOracle n f) invPath p v) (child (Graph.ofOracle n f) p v).1
Instances For
The partition at a node is invariant under any automorphism fixing its path. This is what
makes orbit pruning legitimate: usableAutos keeps exactly the automorphisms fixing path.