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