The subtree key of a node, under its path codes.
Equations
- Hex.GraphIso.Nauty.nodeKey ctx tcLevel fuel level cs st numcells = Hex.GraphIso.Nauty.prefixKey cs (Hex.GraphIso.Nauty.specNode ctx tcLevel fuel level st.lab st.ptn st.active numcells)
Instances For
The incumbent's code list, as runTraced reports it.
Equations
- Hex.GraphIso.Nauty.bestCodesOf st = List.map (fun (i : Nat) => st.canoncode[i]!) (List.range' 1 st.canonlevel)
Instances For
Outside the upward overwrite window, canoncode contains exactly the
ghost incumbent codes.
At a stable comparison state, reading the mutable incumbent agrees with the semantic ghost incumbent.
The generator processnode records maps the first-path labelling
onto the current one pointwise, given only that the first-path
labelling is injective and bounded. Nothing about codes, code
lengths, or where the first path went discrete is used.
Individualizing closes the target position, so it becomes a singleton cell one level down. This is what makes the transport below apply from the child onwards.
refine leaves a singleton cell's position exactly where it was:
it permutes cell contents, and a singleton cell has only one.
A breakout at a different cell leaves a singleton cell's position
alone. Together with refine_fixes_singleton this is the whole content
of the descent's position bookkeeping, one operation at a time.
The state the root call returns.
Equations
- Hex.GraphIso.Nauty.rootOut n g lab0 cellEnds = (Hex.GraphIso.Nauty.firstPathNode { g := g } (n + 2) 100 (n + 2) 1 cellEnds.length (Hex.GraphIso.Nauty.rootSt n lab0 cellEnds)).snd
Instances For
The traced key is the final state's incumbent, once anything has been installed.
The root's node key is the specification's canonical key.
The incumbent reading depends on canonlevel, canoncode and
canonlab, and on nothing else.
Counting a node leaves the incumbent alone.
Refining leaves the incumbent alone: it writes the labelling, the partition and the active set.
Recording this node's refinement code leaves the incumbent alone.
firstcode is the first path's ledger, not the incumbent's.
Recording this node's target cell leaves the incumbent alone.
Accumulating the target-cell total leaves the incumbent alone.
Raising the cheap-automorphism level leaves the incumbent alone.
The node's exit adjustment leaves the incumbent alone. This is the
allsamelevel decrement firstPathNode performs when its target cell
was exhausted, and it is the only write between the child loop's return
and the node's own.
The comparison bookkeeping otherNode performs before choosing its
target cell leaves the incumbent alone, except through canoncode,
which it rewrites exactly when the current node's code beats the
incumbent's at this level. Stated as the three fields so the caller can
see which one moves.
A first-path leaf installs itself: the incumbent's level is this node's.
A first-path leaf installs its own labelling.
A first-path leaf also records its labelling as the first reference leaf.
A first-path leaf at a positive level leaves something installed.