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
00016
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
00195
00197 var& linearize(ILP_Problem& IP, bool set_c = true);
00198 };
00199
00200 };
00201 #endif