Dear GAP Forum:
Regarding my problem with a graphic lattice for conjugacy classes
of subgroups, I see now much clearer. I still don't know why XGAP
stalls on my example, but I realize now that GraphicLatticeRecord
is invoked, and for GraphicLatticeRecord no mouse button menus
are installed, and nor is the relabel entry in the CleanUp menu.
So without additional programming GraphicLatticeRecord won't do
the job. Meanwhile, I found a different solution, however.
I have modified my copy of XGAP library file glatgrp.g.
Routine GroupOps.GraphicLattice now checks for the presence of an
optional argument "conjugacy classes". If present, it sets the
operations record of the sheet it returns to ConjugacyClassLatticeOps,
instead of GraphicLatticeOps. ConjugacyClassLatticeOps basically is
a copy of GraphicLatticeOps, except for three routines which I have
1) In ConjugacyClassLatticeOps.MakeLattice, I set all class lengths to 1:
sheet.init.classLengths := List( sheet.classes, x -> 1 );
2) In ConjugacyClassLatticeOps.MakeMenus, the subgroups menu is NOT
installed, as its use is potentially dangerous. It could be added
again after the routines it calls have been adapted to the new
situation (e.g., when asking for the normalizer of a conjugacy
class of subgroups, return the conjugacy class of the normalizer
of any representative).
3) The routine ConjugacyClassLatticeOps.MakeMaximalSubgroups has been
rewritten. It returns the initial setup for the ConjugacyClassLattice:
ConjugacyClassLatticeOps.MakeMaximalSubgroups := function ( sheet ) local maxs, # maximals (result) lat, # lattice rel, # maximal subgroup relation (for reps) rep, # representative of a class reps, # representatives of classes i; # loop variable
# get the maximals relation
lat := sheet.lattice;
rel := lat.operations.MaximalSubgroups( lat );
# now construct the maximals relation for conjugacy classes
# class 1 (trivial subgroup) has no maximals
for i in [2..Length(lat.classes)] do
rel[i] := Set( List( rel[i], pair -> pair ) );
od;# construct the initial setup maxs := ; for i in [ 1 .. Length(lat.classes) ] do rep := lat.classes[i].representative; maxs[i] := [ i, Size( rep ), rel[i], i, 1]; od; reps := [1..Length(lat.classes)];
# assign the result sheet.init.vertices := maxs; sheet.init.reps := reps; end;
This solution works quite nicely. If there is interest, I'd be happy
to make the details of my modifications available. Perhaps the
developers wish to include the new option in the official version -
provided my modifications do not cause any unwanted side effects,
which I might have overlooked.