  
  [1X2 [33X[0;0YMinimal and Canonical Images[133X[101X
  
  [33X[0;0YGiven  a  group  [22XG[122X  and  action  [22XA[122X,  the minimal image of an object [22XO[122X is the
  smallest image of [22XO[122X under any element of [22XG[122X, under the action [22XA[122X.[133X
  
  [33X[0;0YAs  a  more  concrete  example, let us consider the minimal image of the set
  [10X[2,3,5,7][110X under a group [22XG[122X.[133X
  
  [33X[0;0YWe can calculate all the images of our set under [22XG[122X, then choose the smallest
  one.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XG := Group((1,2,3)(4,5,6)(7,8,9),(1,4,7)(2,5,8)(3,6,9));;[127X[104X
    [4X[25Xgap>[125X [27XList(G, g -> OnSets([2,3,5,7], g) );[127X[104X
    [4X[28X[ [ 2, 3, 5, 7 ], [ 1, 2, 4, 9 ], [ 1, 3, 6, 8 ], [ 2, 4, 8, 9 ], [128X[104X
    [4X[28X  [ 1, 6, 7, 8 ], [ 3, 5, 7, 9 ], [ 1, 5, 6, 8 ], [ 3, 4, 5, 7 ], [128X[104X
    [4X[28X  [ 2, 4, 6, 9 ] ][128X[104X
    [4X[25Xgap>[125X [27XMinimum(List(G, g -> OnSets([2,3,5,7], g) ) );[127X[104X
    [4X[28X[ 1, 2, 4, 9 ][128X[104X
  [4X[32X[104X
  
  [33X[0;0YThis  is  very inefficient, as it requires enumerating all members of [22XG[122X. The
  images package produces a function [2XMinimalImage[102X ([14X2.2-1[114X), which performs this
  same operation more efficiently.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XLoadPackage("images", false);[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27XMinimalImage(G, [2,3,5,7], OnSets);[127X[104X
    [4X[28X[ 1, 2, 4, 9 ][128X[104X
  [4X[32X[104X
  
  [33X[0;0YThe   most  common  use  of  [10XMinimalImage[110X  is  to  categorise  objects  into
  equivalence  classes. This next example shows [10X[2,3,5,7][110X and [10X[1,6,7,8][110X are in
  the same orbit, while [10X[3,5,7,8][110X is in a different orbit.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XMinimalImage(G, [2,3,5,7], OnSets);[127X[104X
    [4X[28X[ 1, 2, 4, 9 ][128X[104X
    [4X[25Xgap>[125X [27XMinimalImage(G, [1,6,7,8], OnSets);[127X[104X
    [4X[28X[ 1, 2, 4, 9 ][128X[104X
    [4X[25Xgap>[125X [27XMinimalImage(G, [3,5,7,8], OnSets);[127X[104X
    [4X[28X[ 1, 2, 6, 8 ][128X[104X
  [4X[32X[104X
  
  [33X[0;0YThe  [10Xresult[110X  configuration option changes what is returned: the image itself
  ([10XGetImage[110X,  the default), a permutation performing the mapping ([10XGetPerm[110X), or
  just  whether  the  object already is its own image ([10XGetBool[110X, which is often
  much faster to compute).[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xp := MinimalImage(G, [2,3,5,7], OnSets, rec(result := GetPerm));[127X[104X
    [4X[28X(1,3,2)(4,6,5)(7,9,8)[128X[104X
    [4X[25Xgap>[125X [27XOnSets([2,3,5,7], p);[127X[104X
    [4X[28X[ 1, 2, 4, 9 ][128X[104X
    [4X[25Xgap>[125X [27XMinimalImage(G, [2,3,5,7], OnSets, rec(result := GetBool));[127X[104X
    [4X[28Xfalse[128X[104X
  [4X[32X[104X
  
  [33X[0;0YIn this situation, we do not really need the minimal image, just a method of
  telling if two sets are in the same equivalence class.[133X
  
  [33X[0;0YMotivated   by   this,   this   package   provides  [2XCanonicalImage[102X  ([14X2.2-5[114X).
  [10XCanonicalImage(G,O,A)[110X  returns  some image of [22XO[122X by an element of [22XG[122X under the
  action  [22XA[122X,  guaranteeing that if two objects O1 and O2 are in the same orbit
  of  [22XG[122X  then  [10XCanonicalImage(G,O1,A)  =  CanonicalImage(G,O2,A)[110X. However, the
  canonical  image is not "minimal" under any sensible ordering. The advantage
  of  [10XCanonicalImage[110X  is  that  it  is much faster than [10XMinimalImage[110X, often by
  orders of magnitude.[133X
  
  [33X[0;0Y[12XWARNING:[112X The value of [10XMinimalImage[110X will remain identical between versions of
  [5XGAP[105X and the [5XImages[105X package, unless bugs are discovered. This is [13Xnot[113X true for
  [10XCanonicalImage[110X.[133X
  
  
  [1X2.1 [33X[0;0YSupported objects and actions[133X[101X
  
  [33X[0;0Y[2XMinimalImage[102X  ([14X2.2-1[114X),  [2XCanonicalImage[102X ([14X2.2-5[114X) and their variants accept the
  following combinations of object and action. The action argument defaults to
  [10XOnPoints[110X  in  every  case, which for lists is not a supported action, so for
  lists the action should always be given.[133X
  
  [30X    [33X[0;6Ya set of positive integers, with [10XOnSets[110X;[133X
  
  [30X    [33X[0;6Ya list of positive integers, with [10XOnTuples[110X;[133X
  
  [30X    [33X[0;6Ya set of sets of positive integers, with [10XOnSetsSets[110X;[133X
  
  [30X    [33X[0;6Ya list of sets of positive integers, with [10XOnTuplesSets[110X;[133X
  
  [30X    [33X[0;6Ya positive integer, with [10XOnPoints[110X;[133X
  
  [30X    [33X[0;6Ya  permutation,  transformation  or partial permutation, with [10XOnPoints[110X
        (that is, up to conjugacy);[133X
  
  [30X    [33X[0;6Ya digraph (from the [5XDigraphs[105X package), with [10XOnDigraphs[110X (the group must
        move   only  vertices  of  the  digraph,  and  multidigraphs  are  not
        supported);[133X
  
  [30X    [33X[0;6Ya multiplication (Cayley) table, with [2XOnMultiplicationTables[102X ([14X2.2-2[114X);[133X
  
  [30X    [33X[0;6Ya fundamental structure (see Chapter [14X3[114X), with [10XOnFundamental[110X.[133X
  
  [33X[0;0YFor  digraphs  the  order  minimised  is  the  sorted list of arcs, compared
  lexicographically,  so  the  minimal image is the relabelling whose arc list
  [10XSet(DigraphEdges(D))[110X  is  smallest.  This  is  neither  the ordering of [10X<[110X on
  digraph  objects  nor the lexicographic order on adjacency matrices read row
  by  row  as  0/1  strings. An undirected graph is represented by a symmetric
  digraph and needs no separate treatment.[133X
  
  [33X[0;0YNot  every configuration option applies to every combination: the [10Xstabilizer[110X
  and [10XgetStab[110X options only affect sets, transformations, permutations, partial
  permutations,  digraphs  and  multiplication tables, and the [10Xorder[110X option is
  ignored for [10XOnSetsSets[110X. See [2XImagesAdvancedConfig[102X ([14X2.2-6[114X) for the details.[133X
  
  
  [1X2.2 [33X[0;0YFunction documentation[133X[101X
  
  [1X2.2-1 MinimalImage[101X
  
  [33X[1;0Y[29X[2XMinimalImage[102X( [3XG[103X, [3Xpnt[103X[, [3Xact[103X][, [3XConfig[103X] ) [32X function[133X
  [33X[1;0Y[29X[2XIsMinimalImage[102X( [3XG[103X, [3Xpnt[103X[, [3Xact[103X][, [3XConfig[103X] ) [32X function[133X
  [33X[1;0Y[29X[2XMinimalImagePerm[102X( [3XG[103X, [3Xpnt[103X[, [3Xact[103X][, [3XConfig[103X] ) [32X function[133X
  
  [33X[0;0Y[2XMinimalImage[102X   returns   the  minimal  image  of  [3Xpnt[103X  under  the  group  [3XG[103X.
  [2XIsMinimalImage[102X  returns a boolean which is [9Xtrue[109X if [2XMinimalImage[102X would return
  [3Xpnt[103X (so the value is its own minimal image).[133X
  
  [33X[0;0Y[2XMinimalImagePerm[102X  returns  a  permutation in [3XG[103X which maps [3Xpnt[103X to its minimal
  image.[133X
  
  [33X[0;0YThe  supported  combinations  of  [3Xpnt[103X and [3Xact[103X are listed in Section [14X2.1[114X. The
  option  [3XConfig[103X defines a number of advanced configuration options, which are
  described in [2XImagesAdvancedConfig[102X ([14X2.2-6[114X). Note that passing an [10Xorder[110X option
  changes  which  image  these  functions  compute:  with any order other than
  [10XCanonicalConfig_Minimum[110X  they  behave  like  [2XCanonicalImage[102X  ([14X2.2-5[114X) and the
  result need not be minimal.[133X
  
  [1X2.2-2 OnMultiplicationTables[101X
  
  [33X[1;0Y[29X[2XOnMultiplicationTables[102X( [3Xtable[103X, [3Xg[103X ) [32X function[133X
  
  [33X[0;0YThe  action of a permutation [3Xg[103X on a multiplication (Cayley) table: the table
  of    the    isomorphic   structure   on   the   relabelled   elements,   so
  [10XOnMultiplicationTables(T,  g)[i^g][j^g]  = T[i][j]^g[110X. A table is a list of [22Xn[122X
  rows of length [22Xn[122X with entries in [10X[1..n][110X, as produced by [10XMultiplicationTable[110X;
  two  magmas are isomorphic precisely when their tables lie in the same orbit
  under [10XSymmetricGroup(n)[110X.[133X
  
  [33X[0;0Y[2XMinimalImage[102X  ([14X2.2-1[114X)  with  this action returns the lexicographically least
  table  in the orbit (comparing tables row by row, which is [5XGAP[105X's ordering of
  the  tables  as  lists),  so  it  is  a  distinguished representative of the
  isomorphism class of the magma.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XT := MultiplicationTable(CyclicGroup(4));;[127X[104X
    [4X[25Xgap>[125X [27XMinimalImage(SymmetricGroup(4), T, OnMultiplicationTables);[127X[104X
    [4X[28X[ [ 1, 2, 3, 4 ], [ 2, 1, 4, 3 ], [ 3, 4, 2, 1 ], [ 4, 3, 1, 2 ] ][128X[104X
  [4X[32X[104X
  
  [1X2.2-3 IsMinimalImageLessThan[101X
  
  [33X[1;0Y[29X[2XIsMinimalImageLessThan[102X( [3XG[103X, [3XA[103X, [3XB[103X, [3Xact[103X ) [32X function[133X
  
  [33X[0;0Y[2XIsMinimalImageLessThan[102X checks if the minimal image of [3XA[103X under the group [3XG[103X is
  smaller than [3XB[103X.[133X
  
  [33X[0;0YIt  returns  [10XMinImage.Smaller[110X,  [10XMinImage.Equal[110X  or  [10XMinImage.Larger[110X,  if the
  minimal image of [3XA[103X is smaller, equal or larger than [3XB[103X.[133X
  
  [33X[0;0Y[3XA[103X  and  [3XB[103X  must  be  sets of the same size, and [3Xact[103X must be [10XOnSets[110X; no other
  actions  are currently supported, and this function accepts no configuration
  record.[133X
  
  [1X2.2-4 MinimalImageOrderedPair[101X
  
  [33X[1;0Y[29X[2XMinimalImageOrderedPair[102X( [3XG[103X, [3Xpair[103X[, [3Xact[103X] ) [32X operation[133X
  [33X[1;0Y[29X[2XMinimalImageUnorderedPair[102X( [3XG[103X, [3Xpair[103X[, [3Xact[103X] ) [32X operation[133X
  
  [33X[0;0Y[2XMinimalImageOrderedPair[102X  returns  the  lexicographically smallest pair [10X[A,B][110X
  such  that  some single [10Xg[110X in [3XG[103X maps [10X[3Xpair[103X[10X[1][110X to [10XA[110X and [10X[3Xpair[103X[10X[2][110X to [10XB[110X under [3Xact[103X.
  [2XMinimalImageUnorderedPair[102X instead minimises over both orderings of the pair,
  so  exchanging  the  two  entries  of  [3Xpair[103X  does not change the result. The
  default action is [10XOnPoints[110X.[133X
  
  [1X2.2-5 CanonicalImage[101X
  
  [33X[1;0Y[29X[2XCanonicalImage[102X( [3XG[103X, [3Xpnt[103X[, [3Xact[103X][, [3XConfig[103X] ) [32X function[133X
  [33X[1;0Y[29X[2XIsCanonicalImage[102X( [3XG[103X, [3Xpnt[103X[, [3Xact[103X][, [3XConfig[103X] ) [32X function[133X
  [33X[1;0Y[29X[2XCanonicalImagePerm[102X( [3XG[103X, [3Xpnt[103X[, [3Xact[103X][, [3XConfig[103X] ) [32X function[133X
  
  [33X[0;0Y[2XCanonicalImage[102X  returns  a  canonical  image  of  [3Xpnt[103X  under  the  group  [3XG[103X.
  [2XIsCanonicalImage[102X  returns  a  boolean  which is [9Xtrue[109X if [2XCanonicalImage[102X would
  return [3Xpnt[103X (so the value is its own canonical image).[133X
  
  [33X[0;0Y[2XCanonicalImagePerm[102X  returns  a  permutation  in  [3XG[103X  which  maps  [3Xpnt[103X  to its
  canonical image.[133X
  
  [33X[0;0YBy  default,  these  functions  use  [10XCanonicalConfig_Fast[110X,  an alias for the
  fastest known ordering (currently [10XCanonicalConfig_RareRatioOrbitFixPlusMin[110X),
  which  may change in new versions of the package. The supported combinations
  of [3Xpnt[103X and [3Xact[103X are listed in Section [14X2.1[114X. The option [3XConfig[103X defines a number
  of    advanced    configuration    options,    which    are   described   in
  [2XImagesAdvancedConfig[102X  ([14X2.2-6[114X).  These  include  the  ability  to  choose the
  canonicalising algorithm used.[133X
  
  [1X2.2-6 ImagesAdvancedConfig[101X
  
  [33X[1;0Y[29X[2XImagesAdvancedConfig[102X [32X global variable[133X
  
  [33X[0;0YThis   section   describes  the  advanced  configuration  options  for  both
  [2XMinimalImage[102X  ([14X2.2-1[114X)  and  [2XCanonicalImage[102X  ([14X2.2-5[114X).  Assume  we have called
  [2XMinimalImage[102X ([14X2.2-1[114X) or [2XCanonicalImage[102X ([14X2.2-5[114X) with arguments [10X([3XG[103X[10X,[3XO[103X[10X,[3XA[103X[10X)[110X.[133X
  
  [8X[10Xorder[110X[8X[108X
        [33X[0;6YThe  search  ordering  used  while building the image. The most useful
        values are:[133X
  
        [8X[10XCanonicalConfig_Minimum[110X[8X[108X
              [33X[0;12YLexicographically smallest image -- same as using MinimalImage.[133X
  
        [8X[10XCanonicalConfig_FixedMinOrbit[110X[8X[108X
              [33X[0;12YLexicographically   smallest  set  under  the  ordering  of  the
              integers  given by the MinOrbitPerm function. This ordering (and
              [10XCanonicalConfig_FixedMaxOrbit[110X)    is    not    supported    when
              canonicalising    transformations,   permutations   or   partial
              permutations, and will raise an error there.[133X
  
        [8X[10XCanonicalConfig_Fast[110X[8X[108X
              [33X[0;12YThe  current  best algorithm, and the default for [2XCanonicalImage[102X
              ([14X2.2-5[114X).      It      is     an     alias,     currently     for
              [10XCanonicalConfig_RareRatioOrbitFixPlusMin[110X, and may change between
              versions of the package.[133X
  
        [33X[0;6YThe  full list of orderings, whose behaviour is described in the paper
        [JJPW19],   is:   [10XCanonicalConfig_Minimum[110X,   [10XCanonicalConfig_MinOrbit[110X,
        [10XCanonicalConfig_MaxOrbit[110X,              [10XCanonicalConfig_SingleMaxOrbit[110X,
        [10XCanonicalConfig_RareOrbit[110X,                [10XCanonicalConfig_CommonOrbit[110X,
        [10XCanonicalConfig_RareRatioOrbit[110X,      [10XCanonicalConfig_CommonRatioOrbit[110X,
        [10XCanonicalConfig_RareRatioOrbitFix[110X,
        [10XCanonicalConfig_CommonRatioOrbitFix[110X,
        [10XCanonicalConfig_RareRatioOrbitFixPlusMin[110X,
        [10XCanonicalConfig_RareRatioOrbitFixPlusRare[110X,
        [10XCanonicalConfig_RareRatioOrbitFixPlusCommon[110X,
        [10XCanonicalConfig_RareOrbitPlusMin[110X,   [10XCanonicalConfig_RareOrbitPlusRare[110X,
        [10XCanonicalConfig_RareOrbitPlusCommon[110X,    [10XCanonicalConfig_FixedMinOrbit[110X,
        [10XCanonicalConfig_FixedMaxOrbit[110X and [10XCanonicalConfig_Fast[110X.[133X
  
        [33X[0;6YNote  that  these  values  are the value of the [10Xorder[110X component of the
        configuration  record,  as  in  [10Xrec(order  := CanonicalConfig_Fast)[110X --
        passing  one  directly  as the whole configuration record is an error.
        For  the  action [10XOnSetsSets[110X the ordering is currently ignored, and the
        minimal image is computed whatever [10Xorder[110X is given.[133X
  
  [8X[10Xresult[110X[8X[108X
        [33X[0;6YWhat  to  return:  [10XGetImage[110X  (the  image,  the  default),  [10XGetPerm[110X  (a
        permutation  in  [3XG[103X mapping [3XO[103X to its image, as [2XMinimalImagePerm[102X ([14X2.2-1[114X)
        returns),  or  [10XGetBool[110X  ([9Xtrue[109X if [3XO[103X is its own image, as [2XIsMinimalImage[102X
        ([14X2.2-1[114X) returns, which is often much faster than computing the image).[133X
  
  [8X[10Xstabilizer[110X[8X[108X
        [33X[0;6YThe  group  [10XStabilizer([3XG[103X[10X,[3XO[103X[10X,[3XA[103X[10X)[110X,  or  a  subgroup  of  this  group;  see
        [2XStabilizer[102X ([14XReference: Stabilizer[114X). If this group is large, it is more
        efficient  to  pre-calculate it. Default behaviour is to calculate the
        group, pass [10XGroup(())[110X to disable this behaviour. The generators of the
        given  group  are  checked to stabilize [3XO[103X (which characterises being a
        subgroup of the stabilizer), and a group failing the check is rejected
        with  an  error,  so  accidentally reusing a stabilizer computed for a
        different  object  cannot  silently  produce wrong answers. The [10X"vole"[110X
        engine computes its own stabilizer and ignores this option.[133X
  
        [33X[0;6YWhen    canonicalising    transformations,    permutations,    partial
        permutations  or digraphs, the default stabilizer is computed with the
        [5Xferret[105X  package  when it is loaded, which is much faster for groups of
        large   degree;   without  [5Xferret[105X  a  slower  fallback  is  used.  For
        permutations  the  default  is the centralizer, and for digraphs under
        the  full  symmetric  group  on  their vertices it is the automorphism
        group  of  the  digraph. For the minimum orderings (which [2XMinimalImage[102X
        ([14X2.2-1[114X)  and its variants use), an object whose orbit under [3XG[103X is small
        is  answered by enumerating the orbit directly, and then no stabilizer
        is needed at all.[133X
  
        [33X[0;6YThis  option  is  honoured  for  sets,  transformations, permutations,
        partial   permutations  and  digraphs.  It  is  silently  ignored  for
        [10XOnTuples[110X,  [10XOnTuplesSets[110X,  points  and  fundamental structures, and for
        [10XOnSetsSets[110X only the trivial group is accepted.[133X
  
        [33X[0;6YBeware of passing [10XGroup(())[110X together with one of the dynamic orderings
        when  the  true  stabilizer  of  [3XO[103X  is  very  large:  the  search then
        rediscovers  the  stabilizer  piecemeal,  and can take many seconds on
        instances  the  default  settings solve instantly. The same applies to
        [10XdisableStabilizerCheck[110X.[133X
  
        [33X[0;6YPassing   a   stabilizer   can  also  change  [13Xwhich[113X  representative  a
        non-minimum  ordering  selects.  [2XMinimalImage[102X ([14X2.2-1[114X) and its variants
        are unaffected -- the minimum of an orbit is the minimum of that orbit
        whatever  the  search  was told -- but the dynamic orderings prune and
        rank  using  the  stabilizer,  so  [2XCanonicalImage[102X ([14X2.2-5[114X) may return a
        different (equally valid) representative when a stabilizer is supplied
        than  when  it is computed. The same holds for the other options which
        change    how   the   stabilizer   is   obtained   or   used,   namely
        [10XdisableStabilizerCheck[110X  and [10XbruteForce[110X. ([10XgetStab[110X is not among them: it
        only  reports  the  stabilizer  the computation arrived at anyway, and
        never  changes  the  computation.) Each fixed choice of settings still
        gives  a  canonical  form -- the answer is constant on the orbit -- so
        what  matters  is to use one setting throughout a computation, and not
        to  compare canonical images produced under different ones. No attempt
        is  made  here  to say which orderings are sensitive to this and which
        are not.[133X
  
  [8X[10XdisableStabilizerCheck[110X[8X (default [9Xfalse[109X)[108X
        [33X[0;6YBy default, during search we perform cheap checks to try to find extra
        elements of the stabilizer. Pass true to disable this check, this will
        make  the  algorithm  MUCH  slower  if  the  stabilizer  argument is a
        subgroup.[133X
  
  [8X[10XgetStab[110X[8X (default [9Xfalse[109X)[108X
        [33X[0;6YStore  the  stabilizer  calculated  during  the  search  in  the  [10Xstab[110X
        component  of  the  configuration  record that was passed in. With the
        [10X"vole"[110X  engine this is [10XStabilizer([3XG[103X[10X,[3XO[103X[10X,[3XA[103X[10X)[110X; with the native engine it is
        a  subgroup  stabilizing  the  returned  image,  and  may  be a proper
        subgroup. It is honoured on the same paths as [10Xstabilizer[110X.[133X
  
        [33X[0;6YThis  reports a stabilizer only when a search was run to obtain one. A
        transformation,  permutation,  partial  permutation  or  digraph whose
        orbit is short is answered by the enumeration pre-pass described under
        [10XbruteForce[110X  below, which walks the orbit and computes no stabilizer at
        all;  such  a  call  deposits  [9Xfail[109X  in [10Xstab[110X. Pass [10XbruteForce := false[110X
        alongside  [10XgetStab[110X to insist on the search, and so on a stabilizer, at
        the price of the search's cost on an object the enumeration answers in
        microseconds. Test the component rather than assuming a group.[133X
  
  [8X[10XbruteForce[110X[8X (default [10X"auto"[110X[8X)[108X
        [33X[0;6YWhether   to   try  the  orbit-enumeration  pre-pass  described  under
        [10Xstabilizer[110X above, which answers an object whose orbit under [3XG[103X is small
        without   any  stabilizer  chain  at  all.  The  pre-pass  applies  to
        transformations,  permutations,  partial permutations and digraphs; on
        every other path this option has no effect.[133X
  
        [33X[0;6YUnder  the  default [10X"auto"[110X the pre-pass enumerates up to a work budget
        balancing  the  measured cost of enumeration against the measured cost
        of  the search, computed from the degree, the number of generators and
        the  size of the encoded object, and gives up and runs the search when
        the  orbit  does  not close within it. The budget consults nothing but
        those   constants,  so  it  does  not  depend  on  session  state  (in
        particular, whether a stabilizer chain for [3XG[103X has already been computed
        changes  nothing).  Passing [9Xfalse[109X always runs the search. Passing [9Xtrue[109X
        removes the budget: the orbit is enumerated however large it turns out
        to be, so pass it only when you know the orbit is small. The budget is
        a  heuristic  and is sometimes wrong in both directions, which is what
        these two overrides are for.[133X
  
        [33X[0;6YFor  the minimum orderings all three settings compute the same answer,
        because the pre-pass minimises exactly the order the search minimises;
        they  differ  only  in  how  long  they take. Note that [2XIsMinimalImage[102X
        ([14X2.2-1[114X) stops the enumeration at the first image smaller than [3XO[103X, so it
        can answer [9Xfalse[109X even for orbits which would run past the budget.[133X
  
        [33X[0;6YUnder  a  non-minimum ordering the pre-pass returns the minimum of the
        orbit,  which is constant on the orbit and so is a canonical form, but
        is  not  the  representative  the search would have selected. Both are
        valid;  they  are  different.  This  is  the  same settings-dependence
        described  under  [10Xstabilizer[110X above, and the same rule applies: use one
        setting  throughout.  Whether the pre-pass runs at all is decided from
        the orbit alone, so it cannot split a single orbit between the two.[133X
  
  [8X[10Xsearch[110X[8X (default [10X"bfs"[110X[8X)[108X
        [33X[0;6YWhich search strategy the native engine uses. The default [10X"bfs"[110X is the
        frontier  search:  it stores every partial image achieving the minimal
        prefix,  which can exhaust memory on highly symmetric inputs (a cyclic
        group's  multiplication  table  of  order  12  exceeds  8GB).  Passing
        [10X"iterative"[110X  stores  none  of them, re-enumerating the realisations of
        the  fixed  prefix  at  every  level:  bounded memory, at the price of
        re-enumeration  time.  Passing [10X"hybrid"[110X runs the frontier search while
        each  stored  level  fits  under  [10XfrontierLimit[110X nodes, and switches to
        re-enumeration  from  the last stored frontier only when a level would
        exceed  the  cap, so it matches the default search's speed when memory
        suffices and degrades gracefully instead of running out of memory. All
        three produce identical results.[133X
  
        [33X[0;6Y[10X"iterative"[110X  and  [10X"hybrid"[110X  are  experimental.  They  support only the
        minimum  ordering  on unblocked domains (which excludes sets of sets);
        any other ordering is rejected with an error.[133X
  
  [8X[10XfrontierLimit[110X[8X (default chosen from the input)[108X
        [33X[0;6YThe cap on the nodes stored per level by [10Xsearch := "hybrid"[110X; the other
        searches  ignore  it.  When  it is not given, the cap is [10XMaximum(1000,
        QuoInt(50000000,  m))[110X  nodes  for an object encoded on [10Xm[110X points, which
        roughly  bounds  the  stored  list entries rather than the node count.
        After  a  hybrid  run the global [10X_IMAGES_HYBRID_STATS[110X holds the widest
        frontier actually stored and the level at which the search switched to
        re-enumeration ([9Xfail[109X if it never did), which is the information needed
        to tune the cap.[133X
  
  [8X[10Xengine[110X[8X (default [10X"native"[110X[8X)[108X
        [33X[0;6YWhich  algorithm  to  use  to compute the canonical image. The default
        [10X"native"[110X  uses  this  package's  own algorithm. Passing [10X"vole"[110X instead
        computes   the   canonical   image   using   the   [5Xvole[105X  package  (via
        [10XVoleFind.Canonical[110X),  which  supports  the  same  actions  except  for
        fundamental  structures  (Chapter  [14X3[114X). [5Xvole[105X must already be loaded; an
        error  is  raised if it is requested but not available. Note that [5Xvole[105X
        produces  a different (but equally valid) canonical representative, so
        the  two engines must not be mixed for a given computation. The [10X"vole"[110X
        engine  only  applies  to  [2XCanonicalImage[102X  ([14X2.2-5[114X);  it cannot compute
        minimal images and will raise an error if requested to.[133X
  
