Backjumping is sound #
When the search finds a leaf whose certificate ties the incumbent's, it harvests the automorphism
autoOf relating the two labellings and then backjumps: it abandons every branch between the
current leaf and the deepest node the two leaves share. This file justifies that.
commonPrefix*— the elementary facts aboutCanon.commonPrefix, which measures how much of two leaves' paths coincide.auto_path— the harvested automorphism follows the paths. If two nodes agree on their firstjindividualised vertices thenautoOfsends thej-th choice of one to thej-th choice of the other. This is wherePinnedpays off:Node.pinparks both choices at the same position in the labelling, soautoOf_getreads off the correspondence.Node.ancestor— every prefix of a node's path is itself a node.jump_sound— the payoff. Letqbe the shared depth-jnode. ThenautoOffixesqpointwise and mapsq's child alongpath1toq's child alongpath2, so the two subtrees have exactly the same set of leaf keys. Everything still to be found under the first is therefore already recorded under the second — the branch depth-first search has finished.
The longest common prefix #
The paths of two leaves agree strictly before their longest common prefix.
The automorphism relating two leaves maps one branch onto the other #
The harvested automorphism follows the paths. If two nodes agree on their first j
individualised vertices, the permutation autoOf builds from their labellings sends the j-th
choice of one to the j-th choice of the other — because Node.pin parks both at the same
position.
Ancestors #
Backjumping is sound #
The key lemma behind the backjump. Two leaves with equal certificates differ by an
automorphism γ. If j is the length of their common path prefix and q the depth-j node they
share, then γ fixes q and sends q's child path1[j] to q's child path2[j]. So every leaf
key still to be found below the first branch already occurs below the second — which is the branch
depth-first search has already finished.