Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  main.gi   Sprache: unbekannt

 
# This module is part of a GAP package MAPCLASS.
# It contains the main function computing all
# mapping class orbits of a given type. 
#
# A. James, K. Magaard, S. Shpectorov 2011


#
# MCGOrbitsCore
# This is the main function of the packages. It computes the Mapping class group
# orbit for a given tuple and conjugacy class size. The parameters are as
# follows:
#
#  group       = the finite group in question
#  genus       = genus of base surface
#  tuple       = the principle tuple
#  partition   = partition of the branch points (if this is known)
#  structconst = structure constant determining how many tuple need checking

# The function also takes the following options which are placed in the options
# stack.
#
# * BumpUp
# * CutOffValue
# * HashLength
# * InitialNumberOfRandomTuples
# * InitialSizeCutoff
# * InitialWeight
# * IsGenerating
# * KnockDown
# * MaximumWeight
# * MinimumWeight
#
InstallGlobalFunction(MappingClassOrbits,function(group, genus, tuple, partition,
  structureconst )

  local i,t,g,c,r,  NumberOfOrbits, GeneratingOrbits, SmallSubgroups, Orb,
  SubgroupRecord, defaults, name, CutOffValue, NumberOfRandomTuples,
  RandomTuples, SuggestedTuples, record, HashLength, OurN, OurAlpha, OurBeta,
  MinimumSet, OurGamma, OurR, OurAction, OurFreeGroup , AbsGens,
  NumberOfGenerators, MinimizationTree, IsGenerating, orbits, SaveOrbit,
  SaveOrbitString, firstrun, IsSilent, output, ccdata, mindata, QuickMinimize,
  QuickMinimizeData, FixElem, x0, rep, FingerPrinting ;
  
# Setup defaults parameters
  Orb:=rec();
  SubgroupRecord:=rec();
  defaults:=rec(InitialSizeCutOff:=128, MaximumWeight:=40, MinimumWeight:=20,
             InitialWeight:=20, BumpUp:=7, KnockDown:=7);

# Copy the optional parameters and for those unassigned assign defualt values
  for name in RecNames(defaults) do
    if ValueOption(name) = fail then
      SubgroupRecord.(name):= defaults.(name);
    else
      SubgroupRecord.(name) := ValueOption(name);
    fi;
  od;

# Those optional parameters not in SubgroupRecord
  if not ValueOption("InitialNumberOfRandomTuples") = fail then
    NumberOfRandomTuples:=ValueOption("InitialNumberOfRandomTuples");
  else
    NumberOfRandomTuples:=20;
  fi;

  if not ValueOption("InitialCutOffValue") = fail then
    CutOffValue:=ValueOption("InitialCutOffValue");
  else
    CutOffValue:=0;
  fi;
  if not ValueOption("HashLength") = fail then
    HashLength:=ValueOption("HashLength");
  else
    HashLength:=5000;
  fi;
  if not ValueOption("IsGenerating") = fail then
    IsGenerating:=ValueOption("IsGenerating");
  else
    IsGenerating:=fail;
  fi;
  if not ValueOption("SaveOrbit") = fail then
    SaveOrbitString:=ValueOption("SaveOrbit");
    SaveOrbit:=true;
  else
    SaveOrbit:=fail;
  fi;

# Verbosity model:
# We have three modes of output - silent, single-line, full
  output := ValueOption("Output");
  if not output in ["silent", "single-line", "full"] then
    output := "full";
  fi;

  if not ValueOption("FixElem") = fail then 
    FixElem:=true;
    x0:=ValueOption("FixElem");
  else
    FixElem:=false;
  fi;

  ## Method Selection
  if not ValueOption("FingerPrinting") = fail then 
    FingerPrinting:=true;
  else
    FingerPrinting:=false;
  fi;

  
#
# Initialize 
#


# group...
  OurN:=NrMovedPoints(group);
  OurR:=Length(tuple);


# abstract generators...
  NumberOfGenerators:=2*genus + Length(tuple);
  OurFreeGroup:=FreeGroup(NumberOfGenerators);
  AbsGens:=GeneratorsOfGroup(OurFreeGroup);
  OurAlpha:=AbsGens{[1..genus]};
  OurBeta:=AbsGens{[genus+1..2*genus]};
  OurGamma:=AbsGens{[2*genus+1..2*genus+OurR]};

# mapping class group generators...
  if FixElem = true then
    OurAction:= MappingClassGroupGeneratorsL(genus, OurR,
       AbsGens, OurAlpha, OurBeta, OurGamma,
       partition );
  else
    OurAction:= MappingClassGroupGenerators(genus, OurR,
       AbsGens, OurAlpha, OurBeta, OurGamma,
       partition );
  fi;

# number of orbits...
  NumberOfOrbits:=0;
  GeneratingOrbits:=[];
 
# initialize SmallSubgroups, TotalWeight and SizeCutoff...
  SubgroupRecord.SmallSubgroups:=[];
  record:=rec(subgroup:=group,
              classes:= List(tuple{[1..OurR]},x->[x]),
              weight:= SubgroupRecord.InitialWeight);
  Append(SubgroupRecord.SmallSubgroups,[record]);
  SubgroupRecord.TotalWeight:=SubgroupRecord.InitialWeight;
  SubgroupRecord.SizeCutoff:=Size(group)-1;
 
# list of random tuples...
  RandomTuples:=[];
  SuggestedTuples:=[];

# number of tuples remaining...
  t:=structureconst;


# initialize minimization tree
  if FingerPrinting = true then
    # Don't bother with preparing a minimization tree.
    MinimizationTree:=[];
    MinimumSet:=[];
  else
    record:= PrepareMinTree(tuple, group,
        OurR, genus);
    MinimizationTree:=record.MinimizationTree;
    MinimumSet:=record.MinimumSet;
  fi;

# Prepare quick minimization if applicable
  if not ValueOption("QuickMinimize") = fail then
    QuickMinimize:=true;
  else
    QuickMinimize:= false;
    QuickMinimizeData:= false;
  fi;
  if QuickMinimize then
    Print("Preparing Minimization...\n");
    ccdata:=rec();
    ccdata.base:= BaseOfGroup(group);
    ccdata.cc:=PrepareConjugacyClasses(tuple, group);
    ccdata.RR:=PrepareIds(ccdata.cc, ccdata.base);
    mindata:=GenerateMinData2(ccdata, MinimizationTree, MinimumSet,
              group );
    QuickMinimizeData:=rec();
    QuickMinimizeData.ccdata:=ccdata;
    QuickMinimizeData.mindata:=mindata;
  fi;

# number of orbits before last collection
  r:=0;
  firstrun:=true; # Keeps track of whether or not we are on first orbit

#
# main loop
#
  orbits:=[];
  while t>CutOffValue do
#   Fill up RandomTuples
    if Length(RandomTuples)=0 then
      if Length(SuggestedTuples)=0 then
        if NumberOfOrbits=r and r<>0 then
          NumberOfRandomTuples:=NumberOfRandomTuples*2;
        fi;
        r:=NumberOfOrbits;

#       Collect Random Tuples
#       Use different routines based on whether looking for generating tuples,
#       this is controlled by the value of IsGenerating
        if IsGenerating = true then
          RandomTuples:=CollectRandomGeneratingTuples(NumberOfRandomTuples,
                         genus, OurR, SubgroupRecord, group, tuple);
        else
          RandomTuples:=CollectRandomTuples( NumberOfRandomTuples, genus,
          OurR, SubgroupRecord);
        fi;

      else
        RandomTuples:=ShallowCopy(SuggestedTuples);
      fi;
      RandomTuples:=CleanAll(RandomTuples, orbits, SubgroupRecord);
    else
      if FixElem = true then
        rep:=RepresentativeAction(group, RandomTuples[1].tuple[1], x0);
        RandomTuples[1].tuple := List(RandomTuples[1].tuple, z ->z^rep);
      fi;

      MaybePrint([], [], ["\n\nOrbit", NumberOfOrbits+1, ":\n"]);
#      if not IsSilent then
#        Print("\n\nOrbit ",NumberOfOrbits+1,":\n");
#      fi;

#     Compute the maping class orbit and save to Orb
      Orb:=MappingClassOrbitCore(RandomTuples[1].tuple, group,
              genus, tuple, AbsGens, OurN, OurFreeGroup, OurAction, OurAlpha,
              OurBeta, OurGamma, HashLength, MinimizationTree ,MinimumSet:
              CurrentTotal:=(structureconst - t), 
              ExTotal:=structureconst,
              NOrbits:=NumberOfOrbits,
              QuickMinimizeData:=QuickMinimizeData  );

      MaybePrint([], [], ["Length=",Length(Orb.TupleTable),"\n"]);


#     Adjust the subgroup weighting
      g:=RandomTuples[1].subgroupNumber;
      AdjustSubgroupWeighting(g, SubgroupRecord);

#     Calculate the generated subgroup
      g:=Subgroup(group,RandomTuples[1].tuple);
      MaybePrint([], [], ["Generating Tuple  =", RandomTuples[1].tuple, "\n"]);
      
#     Check if the tuple is generating
      if Size(g)=Size(group) then
        Append(GeneratingOrbits,[[NumberOfOrbits, Length(Orb.TupleTable)]]);
      fi;

#     Identify the subgroup and save some information about them
      IdentifySubgroup(g, SubgroupRecord, group, tuple, OurR);
      c:=Centralizer(group,g);
      Orb.Centralizer:=c;
      Orb.CentralizerSize:=Size(c);
      Add(orbits, Orb);
      
#     Save the orbit if needs be
      if SaveOrbit = true then
        if firstrun then
          Exec(Concatenation("rm -rf _",SaveOrbitString));
          Exec(Concatenation("mkdir _",SaveOrbitString));
          firstrun:=false;
        fi;
        MaybePrint([], [] , ["Saving orbit to file _", SaveOrbitString, "/",
        NumberOfOrbits, "\n" ]);
        SaveOrbitToFile(Orb, NumberOfOrbits, SaveOrbitString);
      fi;

      MaybePrint([], [] , ["Centralizer size=",Size(c),"\n"]);
      NumberOfOrbits:=NumberOfOrbits+1;
      t:=t-Length(Orb.TupleTable)*Index(Orb.PrincipalFiniteGroup,c);
      MaybePrint([], [] , [t," tuples remaining\n"]);
      MaybePrint([], ["\c\rCurrent orbit: ", t , "tuples remaining \c\r"], 
      [ "Cleaning current orbit...\c"]);
      RandomTuples:=CleanCurrent(RandomTuples, Orb, SubgroupRecord);
      MaybePrint([], [], ["Cleaning done; ",Length(RandomTuples)," random",  
      " tuples remaining\n"]);
      
    fi;
  od;

  MaybePrint([], 
    ["\c Computation complete : ", NumberOfOrbits, " orbits found.\n"],
    ["Computation complete : ", NumberOfOrbits, " orbits found.\n"]);
  
  if not ValueOption("OutputStyle") in ["silent", "single-line"]  then
    Exec("date");
  fi;
  return orbits;;
end);
# End

[ Dauer der Verarbeitung: 0.39 Sekunden  (vorverarbeitet)  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge