Skip to content

Commit 5fc5a84

Browse files
override: document the DoNormalizerPermGroup hook accurately
The old comment claimed the hook "does not interfere with" the Normalizer(Sym(n), U) path. That is wrong: that path reduces via NormalizerParentSA and then runs its residual backtrack through DoNormalizerPermGroup (resolved by name), so the hook does fire there, on the reduced problem. It correctly does not fire only when GAP settles the normaliser with no backtrack at all (e.g. a full imprimitive wreath) -- which is the intent: the hook compares backtrack against backtrack and leaves GAP's non-backtrack reductions in place. Also reword the CHANGES entry, which oversold the hook as a transparent replacement for Normalizer; it is a benchmarking hook. To run Vole end to end, call Vole.Normalizer directly.
1 parent c547d8c commit 5fc5a84

2 files changed

Lines changed: 19 additions & 10 deletions

File tree

CHANGES.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@ substantial performance work on that machinery.
2424
section for the safety boundary).
2525
- `Vole.DDPD`: disjoint direct-product decomposition of a permutation group
2626
(Chang–Jefferson), used to factor highly-intransitive normaliser problems.
27-
- An optional hook to install Vole's normaliser in place of ⪆'s
28-
`DoNormalizerPermGroup`, so existing code calling `Normalizer` can use Vole
29-
transparently.
27+
- An optional benchmarking hook that routes ⪆'s `DoNormalizerPermGroup`
28+
— the backtrack core that `Normalizer` falls into — to Vole, for
29+
backtrack-vs-backtrack comparison. ⪆'s efficient non-backtrack
30+
reductions are deliberately left in place; to run Vole end to end, call
31+
`Vole.Normalizer` directly.
3032
- A settable branching-cell selector strategy, via the `selector` option or
3133
the `VOLE_SELECTOR` environment variable.
3234
- A new manual section, *Normalisers and canonical images of groups*,

gap/override.gi

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,20 @@ end;
6464
# backtrack vs GAP's backtrack" rather than "Vole's whole pipeline
6565
# vs GAP's whole pipeline".
6666
#
67-
# Caveat: a separate dispatcher `DoNormalizerSA` (gpprmsya.gi:1400)
68-
# intercepts `Normalizer(Sym(n), U)` and reduces to
69-
# `Normalizer(NormalizerParentSA(G,U), U)` before
70-
# `NormalizerPermGroup` is reached — this hook does not interfere
71-
# with that path. For large primitive / affine inputs GAP's
72-
# pre-backtrack maths is what wins, not its backtrack itself; see
73-
# the loss-hunt analysis.
67+
# `Normalizer(Sym(n), U)` takes a different route in: it dispatches
68+
# to `DoNormalizerSA` (gpprmsya.gi:1400), which first reduces via
69+
# `NormalizerParentSA` and then runs the backtrack on the reduced
70+
# parent P -- either through the recursive `Normalizer(P, U)` or, if
71+
# there is no reduction, via TryNextMethod to the generic method.
72+
# Either way that residual backtrack still bottoms out in
73+
# `DoNormalizerPermGroup` (resolved by name), so the hook DOES fire
74+
# here, on the reduced problem. When `NormalizerParentSA` settles
75+
# the normaliser purely from symmetric-group structure (e.g. a full
76+
# imprimitive wreath), there is no backtrack at all and the hook
77+
# correctly does not fire. That asymmetry is the whole point: the
78+
# hook pits backtrack against backtrack and leaves GAP's efficient
79+
# non-backtrack reductions in place. To run Vole end to end instead,
80+
# call Vole.Normalizer directly.
7481
#
7582
# Contract: `DoNormalizerPermGroup(G, E, L, Omega)` returns the
7683
# normaliser N_G(E) acting on Omega. Vole.Normalizer(G, E) already

0 commit comments

Comments
 (0)