%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %W interact.tex ACE documentation - interactive fns Joachim Neub"user %W Greg Gamble %% %Y Copyright (C) 2000 Centre for Discrete Mathematics and Computing %Y Department of Information Tech. & Electrical Eng. %Y University of Queensland, Australia. %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Chapter{Functions for Using ACE Interactively}
The user will probably benefit most from interactive use of {\ACE} by
setting the `InfoLevel' of `InfoACE' to at least 3
(see~"InfoACE"), particularly if she uses the `messages'
option with a non-zero value.
Have you read the various options warnings yet? If not, please take
the time to read Section~"General Warnings regarding the Use of
Options" which directs you to various important sections of
Chapter~"Options for ACE".
We describe in this chapter the functions that manipulate and initiate
interactive {\ACE} processes.
An interactive {\ACE} process is initiated by `ACEStart' and
terminated via `ACEQuit'; these functions are described in
Section~"Starting and Stopping Interactive ACE Processes". `ACEStart'
also has forms that manipulate an already started interactive {\ACE}
process. `ACEStart' always returns a positive integer , which
identifies the interactive {\ACE} process that was initiated or
manipulated.
Most functions (there is one `ACEStart' exception), that manipulate an
already started interactive {\ACE} process, have a form where the
first argument is the integer <i> returned by the initiating
`ACEStart' command, and a second form with one argument fewer (where
the integer <i> is discovered by a default mechanism, namely by
determining the least integer <i> for which there is a currently
active interactive {\ACE} process). We will thus commonly say that
``for the <i>th (or default) interactive {ACE} process'' a certain
function performs a given action. In each case, it is an error, if <i>
is not the index of an active interactive process, or there are no
current active interactive processes.
*Notes*:
The global method of passing options (via `PushOptions'), should not
be used with any of the interactive functions. In fact, the
`OptionsStack' should be empty at the time any of the interactive
functions is called.
On `quit'ting {\GAP}, `ACEQuitAll();' is executed, which terminates
all active interactive {\ACE} processes. If {\GAP} is killed without
`quit'ting, before all interactive {\ACE} processes are terminated,
*zombie* processes (still living *child* processes whose *parents*
have died), will result. Since zombie processes do consume resources,
in such an event, the responsible computer user should seek out and
kill the still living `ace' children (e.g.~by piping the output of a
`ps' with appropriate options, usually `aux' or `ef', to `grep ace',
to find the process ids, and then using `kill'; try `man ps' and `man
kill' if these hints are unhelpful).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Section{Starting and Stopping Interactive ACE Processes}
\>ACEStart( <fgens>, <rels>, <sgens> [:<options>] )!{details} F \>ACEStart( <i> [:<options>] ) F \>ACEStart( [:<options>] ) F \>ACEStart( <i>, <fgens>, <rels>, <sgens> [:<options>] ) F \>ACEStart( 0 [:<options>] ) F \>ACEStart( 0, <fgens>, <rels>, <sgens> [:<options>] ) F \>ACEStart( 0, <i> [:<options>] ) F \>ACEStart( 0, <i>, <fgens>, <rels>, <sgens> [:<options>] ) F
The variables are: <i>, a positive integer numbering from 1 that
represents (indexes) an already running interactive {\ACE} process;
<fgens>, a list of free generators; <rels>, a list of words in the
generators <fgens> giving relators for a finitely presented group; and
<sgens>, a list of subgroup generators, again expressed as words in
the free generators <fgens>. Each of <fgens>, <rels> and <sgens> are
given in the standard {\GAP} format for finitely presented groups (See
Chapter~"ref:Finitely Presented Groups" of the {\GAP} Reference
Manual).
All forms of `ACEStart' accept options described in Chapters~"Options
for ACE" and~"Strategy Options for ACE", and Appendix~"Other ACE
Options", which are listed behind a colon in the usual way (see "ref:Function Calls" in the {\GAP} Reference Manual). The reader is
strongly encouraged to read the introductory sections of
Chapter~"Options for ACE", with regard to options. The global
mechanism (via `PushOptions') of passing options is *not* recommended
for use with the interactive {\ACE} interface functions; please ensure
the `OptionsStack' is empty before calling an interactive {\ACE}
interface function.
The return value (for all forms of `ACEStart') is an integer
(numbering from 1) which represents the running process. It is
possible to have more than one interactive process running at once.
The integer returned may be used to index which of these processes an
interactive {\ACE} interface function should be applied to.
The first four forms of `ACEStart' insert a `start' (see~"option
start") directive after the user's options to invoke an enumeration.
The last four forms, with `0' as first argument, do not insert a
`start' directive. Moreover, the last 3 forms of `ACEStart', with `0'
as first argument only differ from the corresponding forms of
`ACEStart' without the `0' argument, in that they do not insert a
`start' directive. `ACEStart(0)', however, is special; unlike the
no-argument form of `ACEStart' it invokes a new interactive {\ACE}
process. We will now further describe each form of `ACEStart', in the
order they appear above.
The first form of `ACEStart' (on three arguments) is the usual way to
start an interactive {\ACE} process.
When `ACEStart' is called with one positive integer argument it
starts a new enumeration on the <i>th running process, i.e.~it scrubs
a previously generated table and starts from scratch with the same
parameters (i.e.~the same arguments and options); except that if new
options are included these will modify those given previously. The
only reason for doing such a thing, without new options, is to perhaps
compare timings of runs (a second run is quicker because memory has
already been allocated). If you are interested in this sort of
information, however, you may be better off dealing directly with the
standalone.
When `ACEStart' is called with no arguments it finds the least
positive integer <i> for which an interactive process is running and
applies `ACEStart(<i>)'. (Most users will only run one interactive
process at a time. Hence, `ACEStart()' will be a useful shortcut for
`ACEStart(1)'.)
The fourth form of `ACEStart' on four arguments, invokes a new
enumeration on the <i>th running process, with new generators <fgens>,
relators <rels> and subgroup generators <sgens>. This is provided so a
user can re-use an already running process, rather than start a new
process. This may be useful when pseudo-ttys are a scarce resource.
See the notes for the non-interactive `ACECosetTable'
("ACECosetTableFromGensAndRels") which demonstrates an application of
a usage of this and the following form of `ACEStart' in a loop.
The fifth form of `ACEStart' (on the one argument: `0') initiates an
interactive {\ACE} process, processes any user options, but does not
insert a `start' (see~"option start") directive. This form is mainly
for gurus who are familiar with the {\ACE} standalone and who wish, at
least initially, to communicate with {\ACE} using the primitive
read/write tools of Section~"Primitive ACE Read/Write Functions". In
this case, after the group generators, relators, and subgroup
generators have been set in the {\ACE} process, invocations of any of
`ACEGroupGenerators' (see~"ACEGroupGenerators"), `ACERelators'
(see~"ACERelators"), `ACESubgroupGenerators'
(see~"ACESubgroupGenerators"), or `ACEParameters'
(see~"ACEParameters") will establish the corresponding {\GAP} values.
Be warned, though, that unless one of the general {\ACE} modes (see
Section~"General ACE modes"): `ACEStart' (without a zero argument),
`ACERedo' (see~"ACERedo") or `ACEContinue' (see~"ACEContinue"), or one
of the mode options: `start' (see~"option start"), `redo' (see~"option
redo") or `continu' (see~"option continu"), has been invoked since the
last change of any parameter options (see~"ACEParameterOptions"), some
of the values reported by `ACEParameters' may well be *incorrect*.
The sixth form of `ACEStart' (on four arguments), is like the first
form of `ACEStart' (on three arguments), except that it does not
insert a `start' (see~"option start") directive. It initiates an
interactive {\ACE} process, with a presentation defined by its last 3
arguments.
The seventh form of `ACEStart' (on two arguments), is like the second
form of `ACEStart' (on one argument), except that it does not insert a
`start' (see~"option start") directive. It processes any new options
for the <i>th interactive {\ACE} process. `ACEStart(0, <i> [:
<options> ] )', is similar to `SetACEOptions( [: ] )'
(see~"SetACEOptions"), but unlike the latter does not invoke a general
mode (see Section~"General ACE Modes").
The last form of `ACEStart' (on five arguments), is like the fourth
form of `ACEStart' (on four arguments), except that it does not insert
a `start' (see~"option start") directive. It re-uses an existing
interactive {\ACE} process, with a new presentation. There is no form
of `ACEStart' with the same functionality as this form, where the
argument is omitted.
*Note:*
When an interactive {\ACE} process is initiated by `ACEStart' a
process number <i> is assigned to it (the integer <i> returned by the
`ACEStart' command), an {\ACE} (binary) process (in the UNIX sense) is
started up, a {\GAP} iostream is assigned to communicate with the
{\ACE} (binary) process, and the essential ``defining'' data
associated with the interactive {\ACE} process is saved in
`ACEData.io[<i>]' (see~"ACEData" for precisely what is saved).
\>ACEQuit( <i> )!{details} F \>ACEQuit() F
terminate an interactive {\ACE} process, where <i> is the integer
returned by `ACEStart' when the process was started. If the second
form is used (i.e.~without arguments) then the interactive process of
least index that is still running is terminated.
*Note:*
`ACEQuit(<i>)' terminates the {\ACE} (binary) process of interactive
{\ACE} process <i>, and closes its {\GAP} iostream, and unbinds the
record `ACEData.io[<i>]' (see~"ACEStart" note).
It can happen that the {\ACE} (binary) process, and hence the {\GAP}
iostream assigned to communicate with it, can die, e.g.~by the user
typing a `Ctrl-C' while the {\ACE} (binary) process is engaged in a
long calculation. `IsACEProcessAlive' (see~"IsACEProcessAlive") is
provided to check the status of the {\GAP} iostream (and hence the
status of the {\ACE} (binary) process it was communicating with); in
the case that it is indeed dead, `ACEResurrectProcess'
(see~"ACEResurrectProcess") may be used to start a new {\ACE} (binary)
process and assign a new {\GAP} iostream to communicate with it, by
using the ``defining'' data of the interactive {\ACE} process saved in
`ACEData.io[<i>]'.
\>ACEQuitAll() F
is provided as a convenience, to terminate all active interactive
{\ACE} processes with a single command. It is equivalent to executing
`ACEQuit(<i>)' for all active interactive {\ACE} processes
(see~"ACEQuit").
For our purposes, we define an interactive {\ACE} interface command to
be an {\ACE} mode, if it delivers an enumeration result (see
Section~"Results messages"). Thus, `ACEStart' (see~"ACEStart"), except
when called with the argument 0, and the commands `ACERedo' and
`ACEContinue' which we describe below are {\ACE} modes; we call these
*general {\ACE} modes*. Additionally, there are two other commands
which deliver enumeration results: `ACEAllEquivPresentations'
(see~"ACEAllEquivPresentations") and `ACERandomEquivPresentations'
(see~"ACERandomEquivPresentations"); we call these ``experimentation''
{\ACE} modes and describe them in Section~"Experimentation ACE Modes".
*Guru Note:*
The {\ACE} standalone uses the term `mode' in a slightly different
sense. There, the commands: `start', `redo' or `continue', put the
{\ACE} enumerator in `start mode', `redo mode' or `continue mode'. In
this manual, we have used the term to mean the command itself, and
generalised it to include any command that produces enumeration
results.
After changing any of {\ACE}'s parameters, one of three *general
modes* is possible: one may be able to ``continue'' via `ACEContinue'
(see~"ACEContinue"), or ``redo'' via `ACERedo' (see~"ACERedo"), or if
neither of these is possible one may have to re-``start'' the
enumeration via `ACEStart' (see~"ACEStart"). Generally, the
appropriate mode is invoked automatically when options are changed; so
most users should be able to ignore the following three functions.
\>ACEModes( <i> ) F \>ACEModes() F
for the <i>th (or default) interactive {\ACE} process, return a record
whose fields are the modes `ACEStart', `ACEContinue' and `ACERedo',
and whose values are `true' if the mode is possible for the process
and `false' otherwise.
\>ACEContinue( <i> [:<options>] ) F \>ACEContinue( [:<options>] ) F
for the <i>th (or default) interactive {\ACE} process, apply any
<options> and then ``continue'' the current enumeration, building upon
the existing table. If a previous run stopped without producing a
finite index you can, in principle, change any of the options and
continue on. Of course, if you make any changes which invalidate the
current table, you won't be allowed to `ACEContinue' and an error will
be raised. However, after `quit'ting the `break'-loop, the interactive
{\ACE} process should normally still be active; after doing so, run
`ACEModes' (see~"ACEModes") to see which of `ACERedo' or `ACEStart' is
possible.
\>ACERedo( <i> [:<options>] ) F \>ACERedo( [:<options>] ) F
for the <i>th (or default) interactive {\ACE} process, apply any
<options> and then ``redo'' the current enumeration from coset 1
(i.e., the subgroup), keeping any existing information in the table.
*Notes:*
The difference between `ACEContinue' and `ACERedo' is somewhat
technical, and the user should regard it as a mode that is a little
more expensive than `ACEContinue' but cheaper than `ACEStart'.
`ACERedo' is really intended for the case where additional relators
and/or subgroup generators have been introduced; the current table,
which may be incomplete or exhibit a finite index, is still ``valid''.
However, the new data may allow the enumeration to complete, or cause
a collapse to a smaller index. In some cases, `ACERedo' may not be
possible and an error will be raised; in this case, `quit' the
`break'-loop, and try `ACEStart', which will discard the current table
and re-``start'' the enumeration.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Section{Interactive ACE Process Utility Functions and Interruption of
an Interactive ACE Process}
\>ACEProcessIndex( <i> ) F \>ACEProcessIndex() F
With argument <i>, which must be a positive integer, `ACEProcessIndex'
returns <i> if it corresponds to an active interactive process, or
raises an error. With no arguments it returns the default active
interactive process or returns `fail' and emits a warning message to
`Info' at `InfoACE' or `InfoWarning' level 1.
*Note:*
Essentially, an interactive {\ACE} process <i> is ``active'' if
`ACEData.io[<i>]' is bound (i.e.~we still have some data telling us
about it). Also see~"ACEStart" note.
\>ACEProcessIndices() F
returns the list of integer indices of all active interactive {\ACE}
processes (see~"ACEProcessIndex" for the meaning of ``active'').
\>IsACEProcessAlive( <i> ) F \>IsACEProcessAlive() F
return `true' if the {\GAP} iostream of the th (or default)
interactive {\ACE} process started by `ACEStart' is alive (i.e.~can
still be written to), or `false', otherwise. (See the notes
for~"ACEStart" and~"ACEQuit".)
\atindex{interruption}{@interruption of an interactive ACE process} \atindex{break-loop}{@\noexpand`break'-loop}
If the user does not yet have a `gap>' prompt then usually {\ACE} is
still away doing something and an {\ACE} interface function is still
waiting for a reply from {\ACE}. Typing a `Ctrl-C' (i.e.~holding down
the `Ctrl' key and typing `c') will stop the waiting and send {\GAP}
into a `break'-loop, from which one has no option but to `quit;'. The
typing of `Ctrl-C', in such a circumstance, usually causes the stream
of the interactive {\ACE} process to die; to check this we provide
`IsACEProcessAlive' (see~"IsACEProcessAlive"). If the stream of an
interactive {\ACE} process, indexed by <i>, say, has died, it may
still be possible to recover enough of the state, before the death of
the stream, from the information stored in the `ACEData.io[<i>]'
record (see Section~"The ACEData Record"). For such a purpose, we have
provided `ACEResurrectProcess' (see~"ACEResurrectProcess").
The {\GAP} iostream of an interactive {\ACE} process will also die if
the {\ACE} binary has a segmentation fault. We do hope that this never
happens to you, but if it does and the failure is reproducible, then
it's a bug and we'd like to know about it. Please read the file `README.md'
that comes with the {\ACE} package to find out what to include in a
bug report and who to email it to.
\>ACEResurrectProcess( <i> [: <options>] ) F \>ACEResurrectProcess( [: <options>] ) F
re-generate the {\GAP} iostream of the <i>th (or default) interactive
{\ACE} process started by `ACEStart' (see~"ACEStart", the final note,
in particular), and try to recover as much as possible of the previous
state from saved values of the process's arguments and parameter
options. The possible <options> here are `use' and `useboth' which are
described in detail below.
The arguments of the <i>th interactive {\ACE} process are stored in
`ACEData.io[<i>].args', a record with fields `fgens', `rels' and
`sgens', which are the {\GAP} group generators, relators and subgroup
generators, respectively (see Section~"The ACEData Record"). Option
information is saved in `ACEData.io[<i>].options' when a user uses an
interactive {\ACE} interface function with options or uses
`SetACEOptions' (see~"SetACEOptions"). Parameter option information is
saved in `ACEData.io[<i>].parameters' if `ACEParameters' (see~"ACEParameters")
is used to extract from {\ACE} the current values of the {\ACE}
parameter options (this is generally less reliable unless one of the
general {\ACE} modes (see Section~"General ACE Modes"), has been run
previously).
By default, `ACEResurrectProcess' recovers parameter option
information from `ACEData.io[<i>].options' if it is bound, or from
`ACEData.io[<i>].parameters' if it is bound, otherwise. The
`ACEData.io[<i>].options' record, however, is first filtered for
parameter and strategy options (see Sections~"ACEParameterOptions"
and~"The ACEStrategyOptions list") and the `echo' option (see~"option
echo"). To alter this behaviour, the user is provided two options:
\beginitems
\quad`use := <useList>'& may contain one or both of
`"options"' and `"parameters"'. By default, `use = ["options", "parameters"]'.
\quad`useboth' & (A boolean option). By default, `useboth = false'.
\enditems
If `useboth = true', `SetACEOptions' (see~"SetACEOptions") is applied
to the <i>th interactive {\ACE} process with each
`ACEData.io[<i>].(<field>)' for each (`"options"' or
`"parameters"') that is bound and in , in the order implied
by <useList>. If `useboth = false', `SetACEOptions' is applied with
`ACEData.io[<i>].(<field>)' for only the first that is bound
in <useList>. The current value of the `echo' option is also preserved
(no matter what values the user chooses for the `use' and `useboth'
options).
*Notes:*
Do not use general {\ACE} options with `ACEResurrectProcess'; they
will only be superseded by those options recovered from
`ACEData.io[<i>].options' and/or `ACEData.io[].parameters'.
Instead, call `SetACEOptions' first (or afterwards). When called prior
to `ACEResurrectProcess', `SetACEOptions' will emit a warning that the
stream is dead; despite this, the `ACEData.io[<i>].options' *will* be
updated.
`ACEResurrectProcess' does *not* invoke an {\ACE} mode (see
Section~"General ACE Modes"). This leaves the user free to use
`SetACEOptions' (which does invoke an {\ACE} mode) to further modify
options afterwards.
\>ToACEGroupGenerators( <fgens> ) F
This function produces, from a {\GAP} list <fgens> of free group
generators, the {\ACE} directive string required by the `group'
(see~"option group") option. (The `group' option may be used to define
the equivalent of <fgens> in an {\ACE} process.)
\>ToACEWords( <fgens>, <words> ) F
This function produces, from a {\GAP} list <words> in free group
generators <fgens>, a string that represents those <words> as an
{\ACE} list of words. `ToACEWords' may be used to provide suitable
values for the options `relators' (see~"option relators"),
`generators' (see~"option generators"), `sg' (see~"option sg"), and
`rl' (see~"option rl").
Now we describe the two *experimentation modes*. The term *mode* was
defined in Section~"General ACE Modes".
\>ACEAllEquivPresentations( <i>, <val> ) F \>ACEAllEquivPresentations( <val> ) F
for the <i>th (or default) interactive {\ACE} process, generates and
tests an enumeration for combinations of relator ordering, relator
rotations, and relator inversions; <val> is in the integer range 1 to
7.
The argument <val> is considered as a binary number. Its three bits
are treated as flags, and control relator rotations (the $2^0$ bit),
relator inversions (the $2^1$ bit) and relator orderings (the $2^2$
bit), respectively; where $1$ means ``active'' and $0$ means
``inactive''. (See below for an example).
Before we describe the {\GAP} output of `ACEAllEquivPresentations' let
us spend some time considering what happens before the {\ACE} binary
output is parsed.
The `ACEAllEquivPresentations' command first performs a ``priming
run'' using the options as they stand. In particular, the `asis' and
`messages' options are honoured.
It then turns `asis' (see~"option asis") on and `messages'
(see~"option messages") off (i.e.~sets `messages' to 0), and generates
and tests the requested equivalent presentations. The maximum and
minimum values attained by `m' (the maximum number of coset numbers
defined at any stage) and `t' (the total number of coset numbers
defined) are tracked, and each time the statistics are better than
what we've already seen, the {\ACE} binary emits a summary result line
for the relators used. See Appendix~"The Meanings of ACE's output
messages" for a discussion of the statistics `m' and `t'. To observe
these messages set the `InfoLevel' of `InfoACE' to 3; and it's
*recommended* that you do this so that you get some idea of what the
{\ACE} binary is doing.
The order in which the equivalent presentations are generated and
tested has no particular significance, but note that the presentation
as given *after* the initial priming run) is the *last* presentation
to be generated and tested, so that the group's relators are left
``unchanged'' by running the `ACEAllEquivPresentations' command.
As discussed by Cannon, Dimino, Havas and Watson \cite{CDHW73} and
Havas and Ramsay \cite{HR01} such equivalent presentations can yield
large variations in the number of coset numbers required in an
enumeration. For this command, we are interested in this variation.
After the final presentation is run, some additional status
information messages are printed to the {\ACE} output:
\beginlist%unordered
\item{--} the number of runs which yielded a finite index;
\item{--} the total number of runs (excluding the priming run); and
\item{--} the range of values observed for `m' and `t'.
\endlist
As an example (drawn from the discussion in \cite{HR99ace}) consider the
enumeration of the $448$ coset numbers of the subgroup
$\langle a^2,a^{-1}b \rangle$ of the group
$$
(8,7 \mid 2,3)
= \langle a,b \mid a^8 = b^7 = (ab)^2 = (a^{-1}b)^3 = 1 \rangle.
$$
There are $4!=24$ relator orderings and $2^4=16$ combinations of
relator or inverted relator. Exponents are taken into account when
rotating relators, so the relators given give rise to 1, 1, 2 and 2
rotations respectively, for a total of $1.1.2.2=4$ combinations. So,
for <val>${} = 7$ (resp.~$3$), $24.16.4=1536$ (resp.~$16.4=64$)
equivalent presentations are tested.
Now we describe the output of `ACEAllEquivPresentations'; it is a
record with fields:
\beginitems
\quad`primingResult' & the {\ACE} enumeration result message (see
Section~"Results Messages") of the priming run;
\quad`primingStats' & the enumeration result of the priming run as a
{\GAP} record with fields `index', `cputime', `cputimeUnits',
`activecosets', `maxcosets' and `totcosets', exactly as for the record
returned by `ACEStats' (see~"ACEStats");
\quad`equivRuns' & a list of data records, one for each progressively
``best'' run, where each record has fields:
\qquad`rels'& the relators in the order used for the run,
\qquad`enumResult'& the {\ACE} enumeration result message (see
Section~"Results Messages") of the run, and
\qquad`stats'& the enumeration result as a {\GAP} record exactly like
the record returned by `ACEStats' (see~"ACEStats");
\quad`summary' & a record with fields:
\qquad`successes'& the total number of successful (i.e.~having finite
enumeration index) runs,
\qquad`runs'& the total number of equivalent presentation runs
executed,
\qquad`maxcosetsRange'& the range of values as a {\GAP} list inside
which each `equivRuns[<i>].maxcosets' lies, and
\qquad`totcosetsRange'& the range of values as a {\GAP} list inside
which each `equivRuns[<i>].totcosets' lies.
\enditems
*Notes:*
In general, the length of the `equivRuns' field list will be less than
the number of runs executed.
There is no way to stop the `ACEAllEquivPresentations' command before
it has completed, other than killing the task. So do a reality check
beforehand on the size of the search space and the time for each
enumeration. If you are interested in finding a ``good'' enumeration,
it can be very helpful, in terms of running time, to put a tight limit
on the number of coset numbers via the `max' option. You may also have
to set `compaction' = $100$ to prevent time-wasting attempts to
recover space via compaction. This maximises throughput by causing the
``bad'' enumerations, which are in the majority, to overflow quickly
and abort. If you wish to explore a very large search-space, consider
firing up many copies of {\ACE}, and starting each with a ``random''
equivalent presentation. Alternatively, you could use the
`ACERandomEquivPresentations' command.
\>ACERandomEquivPresentations( <i>, <val> ) F \>ACERandomEquivPresentations( <val> ) F \>ACERandomEquivPresentations( <i>, [<val>] ) F \>ACERandomEquivPresentations( [<val>] ) F \>ACERandomEquivPresentations( <i>, [<val>, <Npresentations>] ) F \>ACERandomEquivPresentations( [<val>, <Npresentations>] ) F
for the <i>th (or default) interactive {\ACE} process, generates and
tests up to <Npresentations> (or 8, in the first 4 forms) random
presentations; <val>, an integer in the range 1 to 7, acts as for
`ACEAllEquivPresentations' and , when given, should be
a positive integer.
The routine first turns `asis' (see~"option asis") on and `messages'
(see~"option messages") off (i.e.~sets `messages' to 0), and then
generates and tests the requested number of random equivalent
presentations. For each presentation, the relators used and the
summary result line are printed by {\ACE}. To observe these messages
set the `InfoLevel' of `InfoACE' to at least 3.
`ACERandomEquivPresentations' parses the {\ACE} messages, translating
them to {\GAP}, and thus returns a list of records (similar to the
field `equivRuns' of the returned record of
`ACEAllEquivPresentations'). Each record of the returned list is the
data derived from a presentation run and has fields:
\beginitems
\quad`rels'& the relators in the order used for the run,
\quad`enumResult'& the {\ACE} enumeration result message (see
Section~"Results Messages") of the run, and
\quad`stats'& the enumeration result as a {\GAP} record exactly like
the record returned by `ACEStats' (see~"ACEStats").
\enditems
*Notes:*
The relator inversions and rotations are ``genuinely'' random. The
relator permuting is a little bit of a kludge, with the ``quality'' of
the permutations tending to improve with successive presentations.
When the `ACERandomEquivPresentations' command completes, the
presentation active is the *last* one generated.
*Guru Notes:*
It might appear that neglecting to restore the original presentation
is an error. In fact, it is a useful feature! Suppose that the space
of equivalent presentations is too large to exhaustively test. As
noted in the entry for `ACEAllEquivPresentations', we can start up
multiple copies of `ACEAllEquivPresentations' at random points in the
search-space. Manually generating `random' equivalent presentations to
serve as starting-points is tedious and error-prone. The
`ACERandomEquivPresentations' command provides a simple solution;
simply run `ACERandomEquivPresentations(<i>, 7);' before
`ACEAllEquivPresentations(<i>, 7);'.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Section{Interactive Query Functions and an Option Setting Function}
\>ACEGroupGenerators( <i> ) F \>ACEGroupGenerators() F
return the {\GAP} group generators of the <i>th (or default)
interactive {\ACE} process. If no generators have been saved for the
interactive {\ACE} process, possibly because the process was started
via `ACEStart(0);' (see~"ACEStart"), the {\ACE} process is
interrogated, and the equivalent in {\GAP} is saved and returned.
Essentially, `ACEGroupGenerators(<i>)' interrogates {\ACE} and
establishes `ACEData.io[<i>].args.fgens', if necessary, and returns
`ACEData.io[<i>].args.fgens'. As a side-effect, if any of the
remaining fields of `ACEData.io[<i>].args' or
`ACEData.io[<i>].acegens' are unset, they are also set. Note that
{\GAP} provides `GroupWithGenerators' (see~"ref:GroupWithGenerators"
in the {\GAP} Reference Manual) to establish a free group on a given
set of already-defined generators.
\>ACERelators( <i> ) F \>ACERelators() F
return the {\GAP} relators of the <i>th (or default) interactive
{\ACE} process. If no relators have been saved for the interactive
{\ACE} process, possibly because the process was started via
`ACEStart(0);' (see~"ACEStart"), the {\ACE} process is interrogated,
the equivalent in {\GAP} is saved and returned. Essentially,
`ACERelators(<i>)' interrogates {\ACE} and establishes
`ACEData.io[<i>].args.rels', if necessary, and returns
`ACEData.io[<i>].args.rels'. As a side-effect, if any of the remaining
fields of `ACEData.io[<i>].args' or `ACEData.io[].acegens' are
unset, they are also set.
\>ACESubgroupGenerators( <i> ) F \>ACESubgroupGenerators() F
return the {\GAP} subgroup generators of the <i>th (or default)
interactive {\ACE} process. If no subgroup generators have been saved
for the interactive {\ACE} process, possibly because the process was
started via `ACEStart(0);' (see~"ACEStart"), the {\ACE} process is
interrogated, the equivalent in {\GAP} is saved and returned.
Essentially, `ACESubgroupGenerators(<i>)' interrogates {\ACE} and
establishes `ACEData.io[<i>].args.sgens', if necessary, and returns
`ACEData.io[<i>].args.sgens'. As a side-effect, if any of the
remaining fields of `ACEData.io[<i>].args' or
`ACEData.io[<i>].acegens' are unset, they are also set.
\>DisplayACEArgs( <i> ) F \>DisplayACEArgs() F
display the arguments (i.e.~<fgens>, <rels> and <sgens>) of the <i>th
(or default) process started by `ACEStart'. In fact,
`DisplayACEArgs(<i>)' is just a pretty-printer of the
`ACEData.io[<i>].args' record. Use `GetACEArgs' (see~"GetACEOptions")
in assignments. Unlike `ACEGroupGenerators'
(see~"ACEGroupGenerators"), `ACERelators' (see~"ACERelators") and
`ACESubgroupGenerators' (see~"ACESubgroupGenerators"),
`DisplayACEArgs' does not have the side-effect of setting any of the
fields of `ACEData.io[<i>].args' if they are unset.
\>GetACEArgs( <i> ) F \>GetACEArgs() F
return a record of the current arguments (i.e.~<fgens>, <rels> and
<sgens>) of the <i>th (or default) process started by `ACEStart'. In
fact, `GetACEOptions(<i>)' simply returns the `ACEData.io[].args'
record, or an empty record if that record is unbound. Unlike
`ACEGroupGenerators' (see~"ACEGroupGenerators"), `ACERelators'
(see~"ACERelators") and `ACESubgroupGenerators'
(see~"ACESubgroupGenerators"), `GetACEOptions' does not have the
side-effect of setting any of the fields of `ACEData.io[<i>].args' if
they are unset.
\>DisplayACEOptions( <i> ) F \>DisplayACEOptions() F
display the options, explicitly set by the user, of the <i>th (or default) process started by
`ACEStart'. In fact, `DisplayACEOptions()' is just a pretty-printer
of the `ACEData.io[<i>].options' record. Use `GetACEOptions'
(see~"GetACEOptions") in assignments. Please note that no-value {\ACE}
options will appear with the assigned value `true' (see
Section~"Interpretation of ACE Options" for how the {\ACE} interface
functions interpret such options).
*Notes:*
Any options set via `ACEWrite' (see~"ACEWrite") will *not* be
displayed. Also, recall that if {\ACE} is not given any options it
uses the `default' strategy (see Section~"What happens if no ACE
Strategy Option or if no ACE Option is passed"). To discover the
various settings of the {\ACE} Parameter Options
(see~"ACEParameterOptions") in vogue for the {\ACE} process, use
`ACEParameters' (see~"ACEParameters").
\>GetACEOptions( <i> ) F \>GetACEOptions() F
return a record of the current options (those that have been
explicitly set by the user) of the <i>th (or default) process started
by `ACEStart'. Please note that no-value {\ACE} options will appear
with the assigned value `true' (see Section~"Interpretation of ACE
Options" for how the {\ACE} interface functions interpret such
options). The notes applying to `DisplayACEOptions'
(see~"DisplayACEOptions") also apply here.
\>SetACEOptions( <i> [:<options>] ) F \>SetACEOptions( [:<options>] ) F
modify the current options of the <i>th (or default) process started
by `ACEStart'. Please ensure that the `OptionsStack' is empty before
calling `SetACEOptions', otherwise the options already present on the
`OptionsStack' will also be ``seen''. All interactive {\ACE} interface
functions that accept options, actually call an internal version of
`SetACEOptions'; so, it is generally important to keep the
`OptionsStack' clear while working with {\ACE} interactively.
After setting the options passed, the first mode of the following:
`ACEContinue' (see~"ACEContinue"), `ACERedo' (see~"ACERedo") or
`ACEStart' (see~"ACEStart"), that may be applied, is automatically
invoked.
Since a user will sometimes have options in the form of a record
(e.g.~via `GetACEOptions'), we provide an alternative to the
behind-the-colon syntax, in a manner .like `PushOptions', for the
passing of options via `SetACEOptions':
\>SetACEOptions( <i>, <optionsRec> )!{record version} F \>SetACEOptions( <optionsRec> )!{record version} F
In this form, the record <optionsRec> is used to update the current
options of the <i>th (or default) process started by `ACEStart'. Note
that since <optionsRec> is a record each field must have an assigned
value; in particular, no-value {\ACE} options should be assigned the
value `true' (see Section~"Interpretation of ACE Options"). Please
don't mix these two forms of `SetACEOptions' with the previous two
forms; i.e.~do *not* pass both a record argument and options, since
this will lead to options appearing in the wrong order; if you want to
do this, make two separate calls to `SetACEOptions', e.g.~let's say
you have a process like that started by:
\beginexample
gap> ACEExample("A5", ACEStart);
\endexample
then the following demonstrates both usages of `SetACEOptions':
Each of the three commands above generates output; for brevity it has
not been included.
*Notes:*
\atindex{break-loop}{@\noexpand`break'-loop}
When `ACECosetTableFromGensAndRels' enters a `break'-loop
(see~"ACECosetTable"), local versions of the second form of each of
`DisplayACEOptions' and `SetACEOptions' become available. (Even though
the names are similar and their function is analogous they are in fact
different functions.)
\>ACEParameters( <i> ) F \>ACEParameters() F
return a record of the current values of the {\ACE} Parameter Options
(see~"ACEParameterOptions") of the <i>th (or default) process started
by `ACEStart', according to {\ACE}. Please note that some options may
be reported with incorrect values if they have been changed recently
without following up with one of the modes `ACEContinue', `ACERedo' or
`ACEStart'. Together the commands `ACEGroupGenerators', `ACERelators',
`ACESubgroupGenerators' and `ACEParameters' give the equivalent {\GAP}
information that is obtained in {\ACE} with `sr := 1' (see~"option
sr"), which is the ``Run Parameters'' block obtained in the messaging
output (observable when the `InfoLevel' of `InfoACE' is set to at
least 3), when `messages' (see~"option messages") is set a non-zero
value.
*Notes:*
One use for this function might be to determine the options required
to replicate a previous run, but be sure that, if this is your
purpose, any recent change in the parameter option values has been
followed by an invocation of one of `ACEContinue' (see~"ACEContinue"),
`ACERedo' (see~"ACERedo") or `ACEStart' (see~"ACEStart").
As a side-effect, for {\ACE} process <i>, any of the fields of
`ACEData.io[<i>].args' or `ACEData.io[].acegens' that are unset,
are set.
\>IsCompleteACECosetTable( <i> ) F \>IsCompleteACECosetTable() F
return, for the <i>th (or default) process started by `ACEStart',
`true' if {\ACE}'s current coset table is complete, or `false'
otherwise.
*Note:*
The completeness of the coset table of the <i>th interactive {\ACE}
process is determined by checking whether
`ACEData.io[<i>].stats.index' is positive; a value of zero indicates
the last enumeration failed to complete. The record
`ACEData.io[<i>].stats' is what is returned by `ACEStats()'
(see~"ACEStats").
\>ACEDisplayCosetTable( <i> ) F \>ACEDisplayCosetTable() F \>ACEDisplayCosetTable( <i>, [<val>] ) F \>ACEDisplayCosetTable( [<val>] ) F \>ACEDisplayCosetTable( <i>, [<val>, <last>] ) F \>ACEDisplayCosetTable( [<val>, <last>] ) F \>ACEDisplayCosetTable( <i>, [<val>, <last>, <by>] ) F \>ACEDisplayCosetTable( [<val>, <last>, <by>] ) F
compact and display the (possibly incomplete) coset table of the <i>th
(or default) process started by `ACEStart'; must be an integer,
and <last> and <by> must be positive integers. In the first two forms
of the command, the entire coset table is displayed, without orders or
coset representatives. In the third and fourth forms, the absolute
value of <val> is taken to be the last line of the table to be
displayed (and 1 is taken to be the first); in the fifth and sixth
forms, `|<val>|' is taken to be the first line of the table to be
displayed, and <last> is taken to be the number of the last line to be
displayed. In the last two forms, the table is displayed from line
`|<val>|' to line in steps of . If is negative, then
the orders modulo the subgroup (if available) and coset
representatives are displayed also.
*Note:*
The coset table displayed will normally only be `lenlex' standardised
if the call to `ACEDisplayCosetTable' is preceded by
`ACEStandardCosetNumbering' (see~"ACEStandardCosetNumbering"). The
options `lenlex' (see~"option lenlex") and `semilenlex' (see~"option
semilenlex") are only executed by `ACECosetTable'
(see~"ACECosetTable"). The {\ACE} binary does not provide `semilenlex'
standardisation, and hence `ACEDisplayCosetTable' will never display a
`semilenlex' standard coset table.
\>ACECosetRepresentative( <i>, <n> ) F \>ACECosetRepresentative( <n> ) F
return, for the <i>th (or default) process started by `ACEStart', the
coset representative of coset <n> of the current coset table held by
{\ACE}, where <n> must be a positive integer.
\>ACECosetRepresentatives( <i> ) F \>ACECosetRepresentatives() F
return, for the <i>th (or default) process started by `ACEStart', the
list of coset representatives of the current coset table held by
{\ACE}.
\>ACETransversal( <i> ) F \>ACETransversal() F
return, for the <i>th (or default) process started by `ACEStart', the
list of coset representatives of the current coset table held by
{\ACE}, if the current table is complete, and `fail' otherwise.
Essentially, `ACETransversal(<i>) = ACECosetRepresentatives(<i>)' for
a complete table.
\>ACECycles( <i> ) F \>ACECycles() F \>ACEPermutationRepresentation( <i> ) F \>ACEPermutationRepresentation() F
return, for the <i>th (or default) process started by `ACEStart', a
list of permutations corresponding to the group generators, (i.e., the
permutation representation), if the current coset table held by {\ACE}
is complete or `fail', otherwise. In the event of failure a message is
emitted to `Info' at `InfoACE' or `InfoWarning' level 1.
\>ACETraceWord( <i>, <n>, <word> ) F \>ACETraceWord( <n>, <word> ) F
for the <i>th (or default) interactive {\ACE} process started by
`ACEStart', trace through {\ACE}'s coset table, starting at
coset <n>, and return the final coset number if the trace completes,
and `fail' otherwise. In Group Theory terms, if the cosets of a
subgroup $H$ in a group $G$ are the subject of interactive {\ACE}
process <i> and the coset identified by that process by the integer
<n> corresponds to some coset $Hx$, for some $x$ in $G$, and <word>
represents the element $g$ of $G$, then, providing the current coset
table is complete enough, `ACETraceWord( <i>, <n>, <word> )' returns
the integer identifying the coset $Hxg$.
*Notes:*
You may wish to compact {\ACE}'s coset table first, either explicitly
via `ACERecover' (see~"ACERecover"), or, implicitly, via any function
call that invokes {\ACE}'s compaction routine (see~"ACERecover" note).
If you actually wanted {\ACE}'s coset representative, then, for a
*compact* table, feed the output of `ACETraceWord' to
`ACECosetRepresentative' (see~"ACECosetRepresentative").
\>ACEOrders( <i> ) F \>ACEOrders() F \>ACEOrders( <i> : suborder := <suborder> ) F \>ACEOrders(: suborder := <suborder> ) F
for the <i>th (or default) interactive {\ACE} process started by
`ACEStart', search for all coset numbers whose representatives' orders
(modulo the subgroup) are either finite, or, if invoked with the
`suborder' option, are multiples of , where
should be a positive integer. `ACEOrders' returns a (possibly empty)
list of records, each with fields `coset', `order' and `rep', which
are respectively, the coset number, its order modulo the subgroup, and
a representative for each coset number satisfying the criteria of the
search.
*Note:*
You may wish to compact {\ACE}'s coset table first, either explicitly
via `ACERecover' (see~"ACERecover"), or, implicitly, via any function
call that invokes {\ACE}'s compaction routine (see~"ACERecover" note).
\>ACEOrder( <i>, <suborder> ) F \>ACEOrder( <suborder> ) F
for the <i>th (or default) interactive {\ACE} process started by
`ACEStart', search for coset number(s) whose coset representatives
have order modulo the subgroup a multiple of <suborder>. When
<suborder> is a positive integer, `ACEOrder' returns just one record
with fields `coset', `order' and `rep', which are respectively, the
coset number, its order modulo the subgroup, and a representative for
the first coset number satisfying the criteria of the search, or
`fail' if there is no such coset number. The value of may
also be a negative integer, in which case, `ACEOrder( <i>, <suborder>
)' is equivalent to `ACEOrders( : suborder := ||)'; or
<suborder> may be zero, in which case, `ACEOrder( <i>, 0 )' is
equivalent to `ACEOrders( <i> )'.
*Note:*
You may wish to compact {\ACE}'s coset table first, either explicitly
via `ACERecover' (see~"ACERecover"), or, implicitly, via any function
call that invokes {\ACE}'s compaction routine (see~"ACERecover" note).
\>ACECosetOrderFromRepresentative( <i>, <cosetrep> ) F \>ACECosetOrderFromRepresentative( <cosetrep> ) F
for the <i>th (or default) interactive {\ACE} process return the order
(modulo the subgroup) of the coset with representative <cosetrep>, a
word in the free group generators.
*Note:*
`ACECosetOrderFromRepresentative' calls `ACETraceWord' to determine
the coset (number) to which <cosetrep> belongs, and then scans the
output of `ACEOrders' to determine the order of the coset (number).
\>ACECosetsThatNormaliseSubgroup( <i>, <n> ) F \>ACECosetsThatNormaliseSubgroup( <n> ) F
for the <i>th (or default) interactive {\ACE} process started by
`ACEStart', determine non-trivial (i.e.~other than coset 1) coset
numbers whose representatives normalise the subgroup.
\beginlist%unordered
\item{--} If <n> $> 0$, the list of the first <n> non-trivial coset
numbers whose representatives normalise the subgroup is returned.
\item{--} If <n> $\< 0$, a list of records with fields `coset' and
`rep' which represent the coset number and a representative,
respectively, of the first <n> non-trivial coset numbers whose
representatives normalise the subgroup is returned.
\item{--} If <n> $= 0$, a list of records with fields `coset' and
`rep' which represent the coset number and a representative,
respectively, of all non-trivial coset numbers whose representatives
normalise the subgroup is returned.
\endlist
*Note:*
You may wish to compact {\ACE}'s coset table first, either explicitly
via `ACERecover' (see~"ACERecover"), or, implicitly, via any function
call that invokes {\ACE}'s compaction routine (see~"ACERecover" note).
\>ACEStyle( <i> ) F \>ACEStyle() F
returns the current enumeration style as one of the strings: `"C"',
`"Cr"', `"CR"', `"R"', `"R*"', `"Rc"', `"R/C"', or `"R/C (defaulted)"'
(see Section~"Enumeration Style").
The next two functions of this section are really intended for {\ACE}
standalone gurus. To fully understand their output you will need to
consult the standalone manual and the C source code.
\>ACEDumpVariables( <i> ) F \>ACEDumpVariables() F \>ACEDumpVariables( <i>, [<level>] ) F \>ACEDumpVariables( [<level>] ) F \>ACEDumpVariables( <i>, [<level>, <detail>] ) F \>ACEDumpVariables( [<level>, <detail>] ) F
dump the internal variables of {\ACE} of the <i>th (or default)
process started by `ACEStart'; should be one of 0, 1, or 2,
and <detail> should be 0 or 1.
The value of <level> determines which of the three levels of {\ACE} to
dump. (You will need to read the standalone manual to understand what
Levels 0, 1 and 2 are all about.) The value of <detail> determines the
amount of detail (`<detail> = 0' means less detail). The first two
forms of `ACEDumpVariables' (with no list argument) selects ` =
0, <detail> = 0'. The third and fourth forms (with a list argument
containing the integer <level>) makes `<detail> = 0'. This command is
intended for gurus; the source code should be consulted to see what
the output means.
\>ACEDumpStatistics( <i> ) F \>ACEDumpStatistics() F
dump {\ACE}'s internal statistics accumulated during the most recent
enumeration of the <i>th (or default) process started by `ACEStart',
provided the {\ACE} binary was built with the statistics package
(which it is by default). Use `ACEBinaryVersion();'
(see~"ACEBinaryVersion") to check for the inclusion of the statistics
package. See the `enum.c' source file for the meaning of the
variables.
\>ACEBinaryVersion( <i> ) F \>ACEBinaryVersion() F
for the <i>th (or default) process started by `ACEStart', print, via
`Info' (at `InfoACE' level 1), version details of the {\ACE} binary
you are currently running, including what compiler flags were set when
the executable was built, and also returns the version number of the
binary as a string. Essentially the information obtained is what is
obtained via {\ACE}'s `options' option (see~"option options"), and the
returned value is what is stored in `ACEData.version' (see~"ACEData").
A typical output, illustrating the default build, is:
\beginexample
gap> ACEBinaryVersion();
#I No interactive ACE sessions are currently active
#I ACE Binary Version: 3.001
#I ACE 3.001 Sat Feb 27 11:27:15 2016
#I =========================================
#I Host information:
#I name = banksia
#I ACE 3.001 executable built:
#I Wed Feb 24 15:25:26 AWST 2016
#I Level 0 options:
#I statistics package = on
#I coinc processing messages = on
#I dedn processing messages = on
#I Level 1 options:
#I workspace multipliers = decimal
#I Level 2 options:
#I host info = on "3.001"
\endexample
*Notes:*
The {\ACE} binary's banner may also appear in the output (if it has
not already appeared). Unlike other {\ACE} interface functions, the
information obtained via `ACEBinaryVersion();' is absolutely
independent of any enumeration. For this reason, we make it
permissible to run `ACEBinaryVersion();' when there are no currently
active interactive {\ACE} processes; and, in such a case,
`ACEBinaryVersion();' emits a warning that there are no interactive
{\ACE} sessions currently active and initiates (and closes again) its
own stream to obtain the information from the {\ACE} binary. For the
current version of the {\ACE} package (the {\GAP} code component) use
`ACEPackageVersion();' (see~"ACEPackageVersion").
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Section{Interactive Versions of Non-interactive ACE Functions}
\>ACECosetTable( <i> [:<options>] )!{interactive} F \>ACECosetTable( [:<options>] )!{interactive} F
return a coset table as a {\GAP} object, in standard form (for
{\GAP}). These functions perform the same function as
`ACECosetTableFromGensAndRels' and `ACECosetTable' on three arguments
(see~"ACECosetTable"), albeit interactively, on the <i>th (or default)
process started by `ACEStart'. If options are passed then an internal
version of `ACEModes' is run to determine which of the general {\ACE}
modes (see Section~"General ACE Modes") `ACEContinue', `ACERedo' or
`ACEStart' is possible; and (an internal version of) the first mode of
these that is allowed is executed, to ensure the resultant table is
correct for the current options.
\>ACEStats( <i> [:<options>] )!{interactive} F \>ACEStats( [:<options>] )!{interactive} F
perform the same function as `ACEStats' on three arguments
(see~"ACEStats" --- non-interactive version), albeit interactively, on
the <i>th (or default) process started by `ACEStart'. If options are
passed then an internal version of `ACEModes' is run to determine
which of the general {\ACE} modes (see Section~"General ACE Modes")
`ACEContinue', `ACERedo' or `ACEStart' is possible; and (an internal
version of) the first mode of these that is allowed is executed, to
ensure the resultant statistics are correct for the current options.
See Section~"Example of Using ACE Interactively (Using ACEStart)" for
an example demonstrating both these functions within an interactive
process.
\>IsACEGeneratorsInPreferredOrder( <i> )!{interactive} F \>IsACEGeneratorsInPreferredOrder()!{interactive} F
for the <i>th (or default) interactive {\ACE} process started by
`ACEStart', return `true' if the group generators of that process, are
in an order that will not be changed by {\ACE}, and `false' otherwise.
This function has greatest relevance to users who call `ACECosetTable'
(see~"ACECosetTable!interactive"), with the `lenlex' option
(see~"option lenlex"). For more details, see the discussion for the
non-interactive version of `IsACEGeneratorsInPreferredOrder'
("IsACEGeneratorsInPreferredOrder"), which is called with two
arguments.
\index{dead coset (number)} \>ACERecover( <i> ) F \>ACERecover() F
invoke the compaction routine on the coset table of the <i>th (or
default) interactive {\ACE} process started by `ACEStart', in order to
recover the space used by the dead coset numbers. A `CO' message line
is printed if any rows of the coset table were recovered, and a `co'
line if none were. (See Appendix~"The Meanings of ACE's output
messages" for the meanings of these messages.)
*Note:*
The compaction routine is called automatically when any of
`ACEDisplayCosetTable' (see~"ACEDisplayCosetTable"),
`ACECosetRepresentative' (see~"ACECosetRepresentative"),
`ACECosetRepresentatives' (see~"ACECosetRepresentatives"),
`ACETransversal' (see~"ACETransversal"), `ACECycles'
(see~"ACECycles"), `ACEStandardCosetNumbering'
(see~"ACEStandardCosetNumbering"), `ACECosetTable'
(see~"ACECosetTable") or `ACEConjugatesForSubgroupNormalClosure'
(see~"ACEConjugatesForSubgroupNormalClosure"), is invoked.
\atindex{lenlex standardisation scheme}%
{@\noexpand`lenlex' standardisation scheme} \>ACEStandardCosetNumbering( <i> ) F \>ACEStandardCosetNumbering() F
compact and then do a `lenlex' standardisation (see Section~"Coset
Table Standardisation Schemes") of the numbering of cosets in the
coset table of the <i>th (or default) interactive {\ACE} process
started by `ACEStart'. That is, for a given ordering of the generators
in the columns of the table, they produce a canonic table. A table
that includes a column for each generator inverse immediately
following the column for the corresponding generator, standardised
according to the `lenlex' scheme, has the property that a row-major
scan (i.e.~a scan of the successive rows of the *body* of the table
row by row, from left to right) encounters previously unseen cosets in
numeric order. This function does not display the new table; use
`ACEDisplayCosetTable' (see~"ACEDisplayCosetTable") for that.
*Notes:*
In a `lenlex' canonic table, the coset representatives are ordered
first according to length and then the lexicographic order defined by
the order the generators and their inverses head the columns. Note
that, unless special action is taken, {\ACE} avoids having an
involutory generator in the first column (by swapping the first two
generators), except when there is only one generator, or when the
second generator is also an involution; so the lexicographic order
used by {\ACE} need not necessarily correspond with the order in which
the generators were first put to {\ACE}. (We have used the term
``involution'' above; what we really mean is a generator `x' for
which there is a relator `x*x' or `x^2'. Such a generator may, of
course, turn out to actually be the identity.) The function
`IsACEGeneratorsInPreferredOrder' (see "IsACEGeneratorsInPreferredOrder") detects cases when {\ACE} would
swap the first two generators.
Standardising the coset numbering within {\ACE} does *not* affect the
{\GAP} coset table obtained via `ACECosetTable' (see~"ACECosetTable").
If `ACECosetTable' is called without the `lenlex' option {\GAP}'s
default standardisation is applied after conversion of {\ACE}'s
output, which undoes an {\ACE} standardisation. On the other hand, if
`ACECosetTable' is called with the `lenlex' option then after a check
and special action, if required, the equivalent of a call to
`ACEStandardCosetNumbering' is invoked, irrespective of whether it has
been done by the user beforehand. The check that is done is a call to
`IsACEGeneratorsInPreferredOrder' (see "IsACEGeneratorsInPreferredOrder") to ensure that {\ACE} has not
swapped the first two generators. The special action taken when the
call to `IsACEGeneratorsInPreferredOrder' returns `false', is the
setting of the `asis' option (see~"option asis") to 1 and the
resubmission of the relators to {\ACE} taking care not to submit the
relator that determines the first generator as an involution as that
generator squared (these two actions together avert {\ACE}'s swapping
of the first two generators), followed by the re-`start'ing of the
enumeration.
*Guru Notes:*
In five of the ten standard enumeration strategies of Sims \cite{Sim94} (i.e.~the five Sims strategies not provided by {\ACE}),
the table is standardised repeatedly. This is expensive
computationally, but can result in fewer cosets being necessary. The
effect of doing this can be investigated in {\ACE} by (repeatedly)
halting the enumeration (via restrictive options), standardising the
coset numbering, and continuing (see Section~"Emulating Sims" for an
example).
\>ACEAddRelators( <i>, <wordlist> ) F \>ACEAddRelators( <wordlist> ) F
add, for the <i>th (or default) interactive {\ACE} process started by
`ACEStart', the words in the list to any relators already
present, and automatically invoke `ACERedo', if it can be applied, or
otherwise `ACEStart'. Note that {\ACE} sorts the resultant relator
list, unless the `asis' option (see~"option asis") has been set to 1;
don't assume, unless `asis = 1', that the new relators have been
appended in user-provided order to the previously existing relator
list. `ACEAddRelators' also returns the new relator list. Use
`ACERelators' (see~"ACERelators") to determine the current relator
list.
\>ACEAddSubgroupGenerators( <i>, <wordlist> ) F \>ACEAddSubgroupGenerators( <wordlist> ) F
add, for the <i>th (or default) interactive {\ACE} process started by
`ACEStart', the words in the list to any subgroup
generators already present, and automatically invoke `ACERedo', if it
can be applied, or otherwise `ACEStart'. Note that {\ACE} sorts the
resultant subgroup generator list, unless the `asis' option
(see~"option asis") has been set to 1; don't assume, unless `asis =
1', that the new subgroup generators have been appended in
user-provided order to the previously existing subgroup generator
list. `ACEAddSubgroupGenerators' also returns the new subgroup
generator list. Use `ACESubgroupGenerators'
(see~"ACESubgroupGenerators") to determine the current subgroup
generator list.
\>ACEDeleteRelators( <i>, <list> ) F \>ACEDeleteRelators( <list> ) F
for the <i>th (or default) interactive {\ACE} process started by
`ACEStart', delete from the current relators, if list is a list
of words in the group generators, or those current relators indexed by
the integers in <list>, if <list> is a list of positive integers, and
automatically invoke `ACEStart'. `ACEDeleteRelators' also returns the
new relator list. Use `ACERelators' (see~"ACERelators") to determine
the current relator list.
\>ACEDeleteSubgroupGenerators( <i>, <list> ) F \>ACEDeleteSubgroupGenerators( <list> ) F
for the <i>th (or default) interactive {\ACE} process started by
`ACEStart', delete from the current subgroup generators, if
list is a list of words in the group generators, or those current
subgroup generators indexed by the integers in <list>, if <list> is a
list of positive integers, and automatically invoke `ACEStart'.
`ACEDeleteSubgroupGenerators' also returns the new subgroup generator
list. Use `ACESubgroupGenerators' (see~"ACESubgroupGenerators") to
determine the current subgroup generator list.
\>ACECosetCoincidence( <i>, <n> ) F \>ACECosetCoincidence( <n> ) F
for the <i>th (or default) interactive {\ACE} process started by
`ACEStart', return the representative of coset , where must be
a positive integer, and add it to the subgroup generators; i.e.,
equates this coset with coset 1, the subgroup. `ACERedo' is
automatically invoked.
\>ACERandomCoincidences( <i>, <subindex> ) F \>ACERandomCoincidences( <subindex> ) F \>ACERandomCoincidences( <i>, [<subindex>] ) F \>ACERandomCoincidences( [<subindex>] ) F \>ACERandomCoincidences( <i>, [<subindex>, <attempts>] ) F \>ACERandomCoincidences( [<subindex>, <attempts>] ) F
for the <i>th (or default) interactive {\ACE} process started by
`ACEStart', attempt up to (or, in the first four forms, 8)
times to find nontrivial subgroups with index a multiple of <subindex>
by repeatedly making random coset numbers coincident with coset 1 and
seeing what happens. The starting coset table must be non-empty, but
must *not* be complete (use `ACERandomlyApplyCosetCoincidence'
(see~"ACERandomlyApplyCosetCoincidence") if your table is already
complete). For each attempt, by applying {\ACE}'s `rc' option
(see~"option rc") random coset representatives are repeatedly added to
the subgroup and the enumeration `redo'ne. If the table becomes too
small, the attempt is aborted, the original subgroup generators
restored, and another attempt made. If an attempt succeeds, then the
new set of subgroup generators is retained. `ACERandomCoincidences'
returns the list of new subgroup generators added. Use
`ACESubgroupGenerators' (see~"ACESubgroupGenerators") to determine the
current subgroup generator list.
*Notes:*
`ACERandomCoincidences' may add subgroup generators even if it failed
to determine a nontrivial subgroup with index a multiple of
<subindex>; in such a case, the original status may be restored by
applying `ACEDeleteSubgroupGenerators'
(see~"ACEDeleteSubgroupGenerators") with the list returned by
`ACERandomCoincidences'.
`ACERandomCoincidences' applies the `rc' option (see~"option rc") of
{\ACE} which takes the line that if an enumeration has already
obtained a finite index then either, <subindex> is already a divisor
of that finite index, or the request is impossible. Thus an invocation
of `ACERandomCoincidences', in the case where the coset table is
already complete, is an error.
--> --------------------
--> maximum size reached
--> --------------------
¤ Dauer der Verarbeitung: 0.39 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.