Main Page   Class Hierarchy   Compound List   File List   Contact   Download   Symbolic Constraints   Examples  

monomial.h

00001 #ifndef SCIL_MONOMIAL_H
00002 #define SCIL_MONOMIAL_H
00003 #include<fstream>
00004 #include<scil/global.h>
00005 #include<scil/variable.h>
00006 #include<scil/ilp_problem.h>
00007 #include<scil/subproblem.h>
00008 #include<scil/var_obj.h>
00009 #include<list>
00010 #include<vector>
00011 #include<algorithm>
00012 
00013 #define LEPS 1e-4
00014 
00015 //FIXME
00016 //#define ADDTRIV
00017 
00018 
00019 namespace SCIL {
00020    class polynomial;
00021    class monomial;
00022 }
00023 
00024 namespace SCIL {
00026    SCIL::monomial operator*(double d, const SCIL::monomial& m);
00028    std::ostream& operator<<(std::ostream& o,const monomial& m);
00029 
00030    bool operator<(const monomial& p, const monomial& q);
00031    bool operator==(const monomial& p, const monomial& q);
00032 
00034 class monomial {
00035 
00036    friend class polynomial;
00037    friend class monomial_inst;
00038    template <typename Graph> friend class qmonomial;
00039    friend class ILP_Problem;
00040 
00041    private:
00043       std::vector<var> A;
00045       var L;
00047       double c;
00048       bool maximal;
00049 
00051       inline void set_L(var& lin) {
00052          L=lin;
00053       }
00055       inline var& get_L() {
00056          return L;
00057       }
00058    public:
00060       typedef std::list<monomial>::iterator list_iterator;
00061 
00063       typedef std::list<monomial>::const_iterator list_constiterator;
00065       monomial() { }
00067       monomial(var a)
00068       : maximal(true) {
00069          A.push_back(a);
00070          c = 1.;
00071          L= NULL;
00072       }
00074       monomial(double co, var a)
00075          : c(co), maximal(true) {
00076             A.push_back(a);
00077             L= NULL;
00078          }
00080       monomial(double co, std::vector<var> a)
00081       : A(a), c(co), maximal(true) {
00082          std::sort( A.begin(), A.end() );
00083 
00084          std::vector<var>::const_iterator end;
00085          end = std::unique( A.begin(), A.end() );
00086 
00087          A.resize( end - A.begin() );
00088          L = NULL;
00089       }
00090 
00091       monomial(double co, var a, var b)
00092       : c(co), maximal(true) {
00093          A.push_back(a);
00094          A.push_back(b);
00095 
00096          std::sort( A.begin(), A.end() );
00097 
00098          std::vector<var>::const_iterator end;
00099          end = std::unique( A.begin(), A.end() );
00100 
00101          A.resize( end - A.begin() );
00102          L = NULL;
00103          maximal=true;
00104       }
00105 
00106       double value(solution& sol) {
00107          std::vector<var>::iterator it;
00108          double val = 1.;
00109          for( it = A.begin(); it != A.end(); it++ )
00110             val *= sol.value((*it));
00111          val *= c;
00112          return val;
00113       }
00114 
00115 
00117       monomial& operator*=(const monomial& m);
00119       monomial operator*(const monomial& m);
00121       monomial operator*=(const var& a);
00123       monomial operator*(const var& a);
00125       polynomial operator+(const var& a);
00127       polynomial operator-(const var& a);
00129       polynomial operator+(const monomial& m);
00131       polynomial operator-(const monomial& m);
00136       polynomial operator+(const row& r);
00141       polynomial operator-(const row& r);
00143       monomial& operator*=(double d);
00145       monomial operator*(double d);
00147       polynomial operator*(const polynomial& p);
00149       polynomial operator+(const polynomial& p);
00151       polynomial operator-(const polynomial& p);
00153       pol_constraint operator<=(double rhs);
00155       pol_constraint operator>=(double rhs);
00157       pol_constraint operator==(double rhs);
00158 
00160       inline std::vector<var> get_A() const {
00161          return A;
00162       }
00163 
00165       inline double get_coeff() const {
00166          return c;
00167       }
00168 
00170       inline int size() const {
00171          return A.size();
00172       }
00173 
00175       inline void set_coeff(double d) {
00176          c = d;
00177       }
00178 
00180       inline bool is_maximal() const {
00181          return maximal;
00182       }
00183 
00185       inline void set_not_maximal() {
00186          maximal = false;
00187       }
00188 
00189       monomial unite(monomial& q) const;
00190 
00191       monomial unite2(monomial& q) const;
00192 
00194       //bool operator==(monomial q) const;
00195 
00197       var& linearize(ILP_Problem& IP, bool set_c = true);
00198 };
00199 
00200 };
00201 #endif
Generated on Mon Mar 28 22:03:49 2011 for SCIL by  doxygen 1.6.3