00001 #ifndef SCIL_POLYNOMIAL_H 00002 #define SCIL_POLYNOMIAL_H 00003 00004 /* 00005 Thu Mar 5 16:03:20 CET 2009 00006 baumann 00007 class for polynomials 00008 */ 00009 00010 #include<scil/core/monomial.h> 00011 00012 namespace SCIL { 00013 class ILP_Problem; 00014 class polynomial; 00015 00017 std::ostream& operator<<(std::ostream& o,const polynomial& p); 00019 polynomial operator*(double d, const polynomial& p); 00020 00022 class polynomial { 00023 private: 00025 std::list<monomial> p; 00026 00027 public: 00029 polynomial() {}; 00031 polynomial(const var& v) { 00032 p.push_back(monomial(v)); 00033 } 00035 polynomial(const monomial& m) { 00036 p.push_back(m); 00037 } 00039 00041 polynomial(const row& r) { 00042 row_entry::list_constiterator it = r.begin(); 00043 for( it=r.begin(); it!=r.end(); it++ ) { 00044 if( it->Var != nil ) { 00045 p.push_back(monomial(it->coeff, it->Var)); 00046 } else { 00047 std::cerr<<"Polynomial: Warning: constant term is ignored"<<std::endl; 00048 } 00049 } 00050 } 00051 00053 inline std::list<monomial> get_p() const { 00054 return p; 00055 } 00056 00057 double value(solution& sol) { 00058 std::list<monomial>::iterator it; 00059 double val = 0.; 00060 for( it = p.begin(); it != p.end(); it++) 00061 val += (*it).value(sol); 00062 return val; 00063 } 00064 00071 void normalize(bool clean = false); 00072 00074 polynomial& operator+=(const polynomial& p); 00076 polynomial operator+(const polynomial& p); 00078 polynomial& operator+=(const monomial& m); 00080 polynomial operator+(const monomial& m); 00085 polynomial& operator+=(const row& r); 00090 polynomial operator+(const row& r); 00092 polynomial& operator+=(const var& v); 00094 polynomial operator+(const var& v); 00096 polynomial& operator-=(const polynomial& p); 00098 polynomial operator-(const polynomial& p); 00100 polynomial& operator-=(const monomial& m); 00102 polynomial operator-(const monomial& m); 00107 polynomial& operator-=(const row& r); 00112 polynomial operator-(const row& r); 00114 polynomial& operator-=(const var& v); 00116 polynomial operator-(const var& v); 00118 polynomial& operator*=(double d); 00120 polynomial operator*(double d); 00122 polynomial operator*(const monomial& m); 00124 polynomial& operator*=(const monomial& m); 00126 polynomial operator*(const polynomial& p); 00128 polynomial& operator*=(const polynomial& p); 00130 polynomial operator*(const var& v); 00132 polynomial& operator*=(const var& v); 00137 polynomial operator*(const row& r); 00142 polynomial& operator*=(const row& r); 00144 pol_constraint operator<=(double rhs); 00146 pol_constraint operator>=(double rhs); 00148 pol_constraint operator==(double rhs); 00149 }; 00150 00152 class pol_constraint { 00153 friend class ILP_Problem; 00154 private: 00155 polynomial p; 00156 cons_sense s; 00157 double rhs; 00158 00159 public: 00160 pol_constraint(polynomial _p, cons_sense _s, double _rhs) 00161 : p(_p), s(_s), rhs(_rhs) { 00162 } 00163 00164 }; 00165 00166 }; 00167 #endif