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