* redo stuff in /etc; need a new script for making release tarballs
* Add GPL header to all files
* Update the versions and release dates in PackageInfo.g *AND* CHANGES
* Write a checklist (or maybe a script) for everything that needs to be
done during a release. E.g. setting version & release date (and where:
PackageInfo.g, docu, configure, website, ...)
* Document changes made to AbelianPcpGroup in 2.2->2.6 (it now accepts
more parameter formats)
* fix things from my bug list
* add some of my new internal code
* add unit tests
* MappedVector is used by lots of code, and also by 3rd party
packages -> make it official & document it.
Then again, the GAP core also contains a similar function with equal name. Oops
* add support for cohomology over arbitrary finite modules
* Should we use InstallSubsetMaintenance etc.?
* the methods for IsomorphismPcpGroup could be improved, e.g. the
one starting with a permutation group, or with a pc group
* Maybe add IsFreeAbelian, IsTorsionFree, property to GAP, and just install
methods for pcp groups in polycyclic. But beware of issues where users
upgrade to a newer GAP but retain an old Polycyclic version, and vice versa.
* The third parameter "snf" in Pcp( U, "snf" )
is really an "option", and should be replaced by use of ValueOption()
Similar for "all" in PrintPcpPresentation()
* Looking at the code in SchurExtension (and elsewhere), perhaps we should
add a CollectorForPcp operation?
* Add code for computing conjugacy classes of elements
* Implement ConjugacySubgroupsBySeries
* implement missing Sylow subgroup code (borrow from the corresponding
* The documentation in methods.xml, last section, mentions
"two libraries of Schur tower p-groups", but then fails to list
methods for these, nor do I see such libraries in polycyclic. Huh?
* Rename various operations/attributes/properties to better fit into the GAP
naming conventions; also, in some cases, polycyclic adds new operations
for things that already have different names in GAP; that should be changed
SchurExtensionEpimorphism => EpimorphismSchurExtension
SchurCovering => SchurCover (already exists in GAP)
NonAbelianExteriorSquareEpimorphism => EpimorphismNonabelianExteriorSquare
NonAbelianExteriorSquare => NonabelianExteriorSquare
* Turn D!.crossedPairing (set by NonAbelianExteriorSquareEpimorphism)
into an attribute or so?
* There is lots of dead/unused/undocumented code in polycyclic, e.g.
-> there is actually a *ton* of code related to that, dealing with "smats"
"super" and other undocumented CR record entries.
Decide what to keep of that and what to remove
More unused code:
- everything in gap/matrep/affine.gi
* in gap/matrix/latbases.gi, there is a function "LatticeBasis"
perhaps BaseIntMat could / should be used instead?
similary, study the possibility of replacing
PcpNullspaceIntMat -> NullspaceIntMat,
LatticeIntersection -> BaseIntersectionIntMats
* Document (in the manual) the return values of ComplementClasses, ComplementClassesEfaPcps
and so on. They seem to be some kind of list of records
* Robert Morse suggests the following:
"NonAbelianTensorPlus and NonAbelianExteriorPlus are group products. It
would be very nice to have the embeddings similar to direct product,
semidirect products, and free products.
For instance just like the other products:
nu := NonAbelianTensorPlus(g);
returns a monomorphism from g into nu (first copy)
returns a monomorphism from g int nu (second copy)
* Another suggestion by Robert Morse is to install methods that apply the
fast methods for NonAbelianTensorSquare, SchurCover(ing) etc. in polycyclic
to arbitrary polycyclic groups (or at least to pc groups), by temporarily
converting these groups to pcp groups, performing the computation, then
* add a method for ConjugacyClasses
* several collector properties should perhaps be plain filters instead:
IsWeightedCollector, IsPolynomialCollector, UseLibraryCollector
* Move !.collector from pcp group elements to the *family object* of these elements?
Since the collector is shared by all elements in the same family, this
seems like the sensible thing to do
* change NameTag resp. !.name -> only store !.name if it differs from "g".
Which right now it *never* does...
Indeed, might just as well get rid of NameTag in its current form.
It is weird that this is an operation on the group elements anyway;
it would make slightly more sense if it was an operation of the collector.
* set IsWholeFamily to true/false for pcp groups, esp. in PcpGroupByCollectorNC
also add a method for it (this should be quite cheap)
* figure out why EfaSeriesParent is not directly installed as method for EfaSeries...
* consider removing "documentation" for built-in GAP operations like
ClosureGroup, \in etc. and just document for which operations we provide
special methods (if at all)
* Why does SubgroupByIgs use
U := SubgroupNC( Parent(arg), pcs );
this contradicts what the documentation of SubgroupByIgs says... but we
can't just simply change this, as some code might rely on the old "bad"
* Right now one can do horribly evil things like modifying a collector
that is already "in use" by some groups:
Pcp-group with orders [ 0, 0, 0, 0, 0, 0, 0 ]
<<from the left collector with 7 generators>>
gap> GetConjugate(coll, 2, 1);
[ 2, 1 ]
gap> SetConjugate(coll, 2, 1, );
Error, Collector is out of date called from
CollectWordOrFail( clt, e, f ) called from
<function "unknown">( <arguments> )
called from read-eval loop at line 44 of *stdin*
you can 'quit;' to quit to outer loop, or
you can 'return;' to continue
One could argue that as soon as a collector is "in use" by a group, it
should be sealed / finalized / made read-only.
As a bonus, this would allow us to store the PcpGroupByCollectorNC(coll) of the collector
* replace PrintObj / ViewObj methods by PrintString / ViewString methods