00001 #ifndef MONOMIAL_INST_H 00002 #define MONOMIAL_INST_H 00003 00004 #include<scil/core/monomial.h> 00005 #include<scil/core/nonlinear_inst.h> 00006 #include<scil/core/qmonomial.h> 00007 00008 00009 namespace SCIL{ 00010 class mon_split_strategy { 00011 protected: 00012 std::list<monomial*> toDelete; 00013 public: 00014 mon_split_strategy(){} 00015 mon_split_strategy(std::list<monomial>& mons){} 00016 virtual ~mon_split_strategy() { 00017 for(std::list<monomial*>::iterator it=toDelete.begin(); it != toDelete.end(); it++) 00018 delete *it; 00019 } 00020 virtual bool split(monomial& mToSplit, monomial*& m1, monomial*& m2){} 00021 }; 00022 00023 00024 class mon_simple_split : public mon_split_strategy { 00025 public: 00026 mon_simple_split() {} 00027 bool split(monomial& mToSplit, monomial*& m1, monomial*& m2); 00028 }; 00029 00030 class mon_score_split : public mon_split_strategy { 00031 private: 00032 std::map<var,int> varIndex; 00033 std::vector<std::vector<int> > scoreMatrix; 00034 00035 00036 public: 00037 mon_score_split(std::list<monomial>& mons); 00038 bool split(monomial& mToSplit, monomial*& m1, monomial*& m2); 00039 }; 00040 00041 00042 00043 class monomial_inst : public nonlinear_inst { 00044 private: 00045 mon_split_strategy* splitStrategy; 00046 void decompose(std::list<monomial>& mons, ILP_Problem& IP); 00047 public: 00048 monomial_inst(std::list<monomial>& m, ILP_Problem& IP, mon_split_strategy* spst); 00049 ~monomial_inst(); 00050 virtual status feasible(solution& S); 00051 00052 00053 00054 }; 00055 } 00056 #endif