1 #ifndef ENUMERATION_H_INCLUDED 2 #define ENUMERATION_H_INCLUDED 3 4 #include "polynomial.h" 5 6 class EnumerationTarget 7 { 8 public: 9 virtual void beginEnumeration(const PolynomialSet &groebnerBasis)=0; 10 virtual void endEnumeration()=0; 11 virtual bool basis(const PolynomialSet &groebnerBasis)=0; /* return false to break enumaration */ 12 }; 13 14 15 class EnumerationTargetCollector: public EnumerationTarget 16 { 17 public: 18 PolynomialSetList theList; 19 void beginEnumeration(const PolynomialSet& g); 20 void endEnumeration(); 21 bool basis(const PolynomialSet &groebnerBasis); 22 PolynomialSetList getList(); 23 }; 24 25 26 class EnumerationPrinter: public EnumerationTarget 27 { 28 }; 29 30 31 class EnumerationFilePrinter: public EnumerationPrinter 32 { 33 FILE *initialisedFile; 34 protected: 35 string filename; 36 FILE *file; 37 public: 38 EnumerationFilePrinter(); 39 ~EnumerationFilePrinter(); 40 41 void open(std::string filename); 42 void open(FILE *file); 43 void close(); 44 45 virtual void onOpened()=0; 46 virtual void onClose()=0; 47 virtual void onClosed()=0; 48 49 virtual string extension(); 50 }; 51 52 53 class EnumerationAlgorithm 54 { 55 protected: 56 EnumerationTarget *target; 57 int progressCounter; 58 virtual void printProgress(int step=1); targetBeginEnumeration(const PolynomialSet & groebnerBasis)59 void targetBeginEnumeration(const PolynomialSet &groebnerBasis){if(target)target->beginEnumeration(groebnerBasis);} targetEndEnumeration()60 void targetEndEnumeration(){if(target)target->endEnumeration();} targetBasis(const PolynomialSet & groebnerBasis)61 bool targetBasis(const PolynomialSet &groebnerBasis){bool ret=true;if(target)ret=target->basis(groebnerBasis);printProgress();return ret;} 62 public: EnumerationAlgorithm()63 EnumerationAlgorithm(){target=0;progressCounter=0;} setEnumerationTarget(EnumerationTarget * target)64 void setEnumerationTarget(EnumerationTarget *target){this->target=target;} enumerate(const PolynomialSet & groebnerBasis)65 virtual void enumerate(const PolynomialSet &groebnerBasis){} 66 }; 67 68 // The following is used to glue the old code to the new code 69 #include "symmetrictraversal.h" 70 71 class TargetGlue:public SymmetricTarget 72 { 73 EnumerationTarget ⌖ 74 public: 75 TargetGlue(EnumerationTarget &target_); 76 bool process(ConeTraverser &traverser); 77 }; 78 79 #endif 80