Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

/magnus/back_end/Enumerators/include/AutoEnumerator.h

Go to the documentation of this file.
00001 #include "Supervisor.h"
00002 #include "SMEnumerator.h"
00003 #include "SMList.h"
00004 #include "SMListIterator.h"
00005 #include "RandomAutoInFree.h"
00006 #include "File.h"
00007 #include "Word.h"
00008 #include "SMFPGroup.h"
00009 #include "fastProblems.h"
00010 #include "OutMessages.h"
00011 
00012 #ifndef _AutoEnumerator_H_
00013 #define _AutoEnumerator_H_
00014 
00015 
00016 
00017 
00018 // ---------------------- AutEnumeratorARCer --------------------------- //
00019 
00020 
00021 class AutEnumeratorARCer2 : public EnumeratorARCer
00022 {
00023 public:
00024 
00025   /////////////////////////////////////////////////////////////////////////
00026   //                                                                     //
00027   // Constructors:                                                       //
00028   //                                                                     //
00029   /////////////////////////////////////////////////////////////////////////
00030 
00031   AutEnumeratorARCer2( ComputationManager& boss, SMListData& d ) 
00032     : EnumeratorARCer( boss, d ), 
00033     randAuto( 0 ), 
00034     isFinite(0), 
00035     current( 0 ) { }
00036 
00037 
00038   ~AutEnumeratorARCer2( ) { delete randAuto;} 
00039 
00040 
00041   /////////////////////////////////////////////////////////////////////////
00042   //                                                                     //
00043   // Accessors:                                                          //
00044   //                                                                     //
00045   /////////////////////////////////////////////////////////////////////////
00046 
00047   void setArguments(  FreeGroup group,int avgNumbers, 
00048                      int n, 
00049                      bool isfinite);
00050 
00051   // Inherited from ARCer:
00052   // bool takeControl( );
00053 
00054   /////////////////////////////////////////////////////////////////////////
00055   //                                                                     //
00056   // IPC interaction members:                                            //
00057   //                                                                     //
00058   /////////////////////////////////////////////////////////////////////////
00059 
00060   void enumerate( );
00061  
00062   void writeResults( ostream& );
00063 
00064   void readResults( istream& );
00065 
00066 
00067 private:
00068 
00069   /////////////////////////////////////////////////////////////////////////
00070   //                                                                     //
00071   // Data Members:                                                       //
00072   //                                                                     //
00073   /////////////////////////////////////////////////////////////////////////
00074   
00075   int  current;
00076   RandomAutoInFree* randAuto;
00077   bool isFinite;
00078   int number;
00079 
00080 };
00081 
00082 
00083 class AutoEnumeratorProblem : public EnumeratorProblem< Map >
00084 {
00085 public:
00086 
00087   /////////////////////////////////////////////////////////////////////////
00088   //                                                                     //
00089   // Constructors:                                                       //
00090   //                                                                     //
00091   /////////////////////////////////////////////////////////////////////////
00092 
00093   AutoEnumeratorProblem(SMFPGroup& );
00094   
00095   /////////////////////////////////////////////////////////////////////////
00096   //                                                                     //
00097   // Front End Interfacing:                                              //
00098   //                                                                     //
00099   /////////////////////////////////////////////////////////////////////////
00100 
00101   void viewStructure(ostream& ostr) const;  // overrides SMObject
00102 
00103   /////////////////////////////////////////////////////////////////////////
00104   //                                                                     //
00105   // Control:                                                            //
00106   //                                                                     //
00107   /////////////////////////////////////////////////////////////////////////
00108 
00109   void takeControl( );         // overrides ComputationManager
00110 
00111   Chars getDataFileName() const { return theData.getDataFileName(); }
00112   
00113   /////////////////////////////////////////////////////////////////////////
00114   //                                                                     //
00115   // State Transitions:                                                  //
00116   //                                                                     //
00117   /////////////////////////////////////////////////////////////////////////
00118 
00119   void start( ) {   
00120     LogMessage msg(*this,theGroup);
00121     if (theGroup.gic.isAbelian()==yes && 
00122         theGroup.getFPGroup().getRelators().cardinality() > 0){
00123       Message msg;
00124       msg << " This group is not free abelian, can't built automorphisms.";
00125       msg.send();
00126       resultIsFast();
00127     }else
00128       if (theGroup.getFreePreimage().numberOfGenerators() < 2){
00129         LogMessage msg(*this,theGroup);
00130         if (theGroup.getFreePreimage().numberOfGenerators()==0)
00131           msg <<  Name(theGroup) << " is trivial, so it has only one automorphism: 1->1.";
00132         else
00133           {
00134             Chars nameOfGen = theGroup.getFreePreimage().nameOfGenerator(0);
00135             msg <<  Name(theGroup) << " with one generator, so it has only two automorphisms: " <<
00136               nameOfGen << "->"<<nameOfGen <<" and "<<nameOfGen<<"->"<<nameOfGen<<"^-1.";
00137         }
00138         msg.send();
00139         resultIsFast();
00140       }
00141       else{
00142         int num = getParameters().getValue("P1");
00143         int avgNumGens = getParameters().getValue("P2");
00144         arcer.setArguments(theGroup.getFreePreimage(),avgNumGens,num,false);
00145         LogMessage msg1(*this,theGroup);
00146         msg1 << Link(Chars( "Click here to see the random automorphisms  of ")+
00147                     Text( Name(theGroup) ),
00148                     "RandomAutomorphisms",
00149                     theData.getDataFileName(),true );
00150         msg1.send();        
00151       }
00152     
00153   }
00154 
00155   void terminate( ) {  }          // overrides ComputationManager
00156 
00157   void resume( ) {              // overrides ComputationManager
00158     arcer.submitSignal();
00159     
00160     int num = getParameters().getValue("P1");
00161     int avgNumGens = getParameters().getValue("P2");
00162     arcer.setArguments(theGroup.getFreePreimage(),avgNumGens,num,false);
00163   }
00164    
00165 private:
00166 
00167   /////////////////////////////////////////////////////////////////////////
00168   //                                                                     //
00169   // Data Members:                                                       //
00170   //                                                                     //
00171   /////////////////////////////////////////////////////////////////////////
00172 
00173   SMFPGroup& theGroup;
00174   AutEnumeratorARCer2 arcer;
00175 };
00176 // ---------------------  FiniteAutoEnumeratorProblem -------------------
00177 class FiniteAutoEnumeratorProblem : public EnumeratorProblem< Map >
00178 {
00179 public:
00180 
00181   /////////////////////////////////////////////////////////////////////////
00182   //                                                                     //
00183   // Constructors:                                                       //
00184   //                                                                     //
00185   /////////////////////////////////////////////////////////////////////////
00186 
00187   FiniteAutoEnumeratorProblem(SMFPGroup& );
00188   
00189   /////////////////////////////////////////////////////////////////////////
00190   //                                                                     //
00191   // Front End Interfacing:                                              //
00192   //                                                                     //
00193   /////////////////////////////////////////////////////////////////////////
00194 
00195   void viewStructure(ostream& ostr) const;  // overrides SMObject
00196 
00197   /////////////////////////////////////////////////////////////////////////
00198   //                                                                     //
00199   // Control:                                                            //
00200   //                                                                     //
00201   /////////////////////////////////////////////////////////////////////////
00202 
00203   void takeControl( );         // overrides ComputationManager
00204 
00205   
00206   Chars getDataFileName() const { return theData.getDataFileName(); }
00207   
00208   /////////////////////////////////////////////////////////////////////////
00209   //                                                                     //
00210   // State Transitions:                                                  //
00211   //                                                                     //
00212   /////////////////////////////////////////////////////////////////////////
00213 
00214   void start( ) {   
00215     LogMessage msg(*this,theGroup);
00216     if (theGroup.gic.isAbelian()==yes && 
00217         theGroup.getFPGroup().getRelators().cardinality() > 0){
00218       Message msg;
00219       msg << " This group is not free abelian, can't built automorphisms.";
00220       msg.send();
00221       resultIsFast();
00222     }else
00223       if (theGroup.getFreePreimage().numberOfGenerators() < 2){
00224         LogMessage msg(*this,theGroup);
00225         if (theGroup.getFreePreimage().numberOfGenerators()==0)
00226           msg <<  Name(theGroup) << " is trivial, so it has only one automorphism: 1->1.";
00227         else
00228           {
00229             Chars nameOfGen = theGroup.getFreePreimage().nameOfGenerator(0);
00230             msg <<  Name(theGroup) << " with one generator, so it has only two automorphisms: " <<
00231               nameOfGen << "->"<<nameOfGen <<" and "<<nameOfGen<<"->"<<nameOfGen<<"^-1.";
00232         }
00233         msg.send();
00234         resultIsFast();
00235       }
00236       else{
00237         int num = getParameters().getValue("P1");
00238         int avgNumGens = getParameters().getValue("P2");
00239         arcer.setArguments(theGroup.getFreePreimage(),avgNumGens,num,true);
00240         LogMessage msg1(*this,theGroup);
00241         msg1 << Link(Chars( "Click here to see the random automorphisms  of ")+
00242                     Text( Name(theGroup) ) + Chars(" of finite order."),
00243                     "RandomAutomorphisms",
00244                     theData.getDataFileName(),true );
00245         msg1.send();        
00246       }
00247     
00248   }
00249 
00250   void terminate( ) {  }          // overrides ComputationManager
00251 
00252   void resume( ) {              // overrides ComputationManager
00253     arcer.submitSignal();
00254     
00255     int num = getParameters().getValue("P1");
00256     int avgNumGens = getParameters().getValue("P2");
00257     arcer.setArguments(theGroup.getFreePreimage(),avgNumGens,num,true);
00258   }
00259    
00260 private:
00261 
00262   /////////////////////////////////////////////////////////////////////////
00263   //                                                                     //
00264   // Data Members:                                                       //
00265   //                                                                     //
00266   /////////////////////////////////////////////////////////////////////////
00267 
00268   SMFPGroup& theGroup;
00269   AutEnumeratorARCer2 arcer;
00270 };
00271 
00272 // ---------------------- IsMapInListARCer ------------------------ //
00273 
00274 
00275 class IsMapInListARCer : public ARCer
00276 {
00277 public:
00278 
00279   /////////////////////////////////////////////////////////////////////////
00280   //                                                                     //
00281   // Constructors:                                                       //
00282   //                                                                     //
00283   /////////////////////////////////////////////////////////////////////////
00284   
00285   IsMapInListARCer( ComputationManager& boss ) 
00286   : ARCer( boss ), result(0) { } 
00287   
00288   ~IsMapInListARCer( ) { 
00289     if (theIterator)
00290       delete theIterator;
00291   }
00292  
00293 
00294 
00295   /////////////////////////////////////////////////////////////////////////
00296   //                                                                     //
00297   // Accessors:                                                          //
00298   //                                                                     //
00299   /////////////////////////////////////////////////////////////////////////
00300 
00301   void setArguments( const SMList<Map>&, const Map&);
00302   
00303   // Inherited from ARCer:
00304   // bool takeControl( );
00305   
00306   bool isInList();
00307   
00308   
00309   /////////////////////////////////////////////////////////////////////////
00310   //                                                                     //
00311   // IPC interaction members:                                            //
00312   //                                                                     //
00313   /////////////////////////////////////////////////////////////////////////
00314 
00315   void runComputation( );
00316  
00317   void writeResults( ostream& );
00318 
00319   void readResults( istream& );
00320 
00321 
00322 private:
00323 
00324   /////////////////////////////////////////////////////////////////////////
00325   //                                                                     //
00326   // Data Members:                                                       //
00327   //                                                                     //
00328   /////////////////////////////////////////////////////////////////////////
00329 
00330   SMListIterator<Map>* theIterator;
00331   Map theMap;
00332   bool result;
00333 };
00334 
00335 
00336 
00337 // --------------------- IsMapInList  ------------------------ //
00338 
00339 
00340 class IsMapInList  : public Supervisor
00341 {
00342 public:
00343 
00344   /////////////////////////////////////////////////////////////////////////
00345   //                                                                     //
00346   // Constructors:                                                       //
00347   //                                                                     //
00348   /////////////////////////////////////////////////////////////////////////
00349 
00350  IsMapInList( SMList<Map>&, const class SMMap& );
00351 
00352 
00353   /////////////////////////////////////////////////////////////////////////
00354   //                                                                     //
00355   // Front End Interfacing:                                              //
00356   //                                                                     //
00357   /////////////////////////////////////////////////////////////////////////
00358 
00359   void viewStructure(ostream& ostr) const;  // overrides SMObject
00360 
00361 
00362   /////////////////////////////////////////////////////////////////////////
00363   //                                                                     //
00364   // Control:                                                            //
00365   //                                                                     //
00366   /////////////////////////////////////////////////////////////////////////
00367 
00368   void takeControl( );         // overrides ComputationManager
00369 
00370 
00371   /////////////////////////////////////////////////////////////////////////
00372   //                                                                     //
00373   // State Transitions:                                                  //
00374   //                                                                     //
00375   /////////////////////////////////////////////////////////////////////////
00376 
00377   void start( ) { }            // overrides ComputationManager
00378 
00379   void terminate( ) { }        // overrides ComputationManager
00380 
00381 
00382 private:
00383 
00384   /////////////////////////////////////////////////////////////////////////
00385   //                                                                     //
00386   // Data Members:                                                       //
00387   //                                                                     //
00388   /////////////////////////////////////////////////////////////////////////
00389 
00390   const class SMMap& theMap;
00391   SMList<Map>& theList;
00392 
00393   IsMapInListARCer arcer;
00394 
00395 };
00396 
00397 #endif

Generated at Tue Jun 19 09:49:34 2001 for Magnus Classes by doxygen1.2.6 written by Dimitri van Heesch, © 1997-2001