FLOPC++
|
00001 // ******************** FlopCpp ********************************************** 00002 // File: MP_constraint.hpp 00003 // $Id$ 00004 // Author: Tim Helge Hultberg (thh@mat.ua.pt) 00005 // Copyright (C) 2003 Tim Helge Hultberg 00006 // All Rights Reserved. 00007 // **************************************************************************** 00008 00009 #ifndef _MP_constraint_hpp_ 00010 #define _MP_constraint_hpp_ 00011 00012 #include <set> 00013 using std::set; 00014 00015 #include <map> 00016 using std::map; 00017 00018 #include "MP_set.hpp" 00019 #include "MP_domain.hpp" 00020 #include "MP_utilities.hpp" 00021 #include "MP_expression.hpp" 00022 #include "MP_boolean.hpp" 00023 #include "MP_data.hpp" 00024 00025 namespace flopc { 00026 00027 class MP_constraint; 00028 class Constant; 00029 class MP_model; 00030 class MP_variable; 00031 00035 enum Sense_enum {LE,GE,EQ}; 00036 00042 class Constraint_base { 00043 public: 00044 Constraint_base(const MP_expression& l, const MP_expression& r, Sense_enum s) : 00045 left(l), right(r), sense(s), count(0) {} 00046 00047 MP_expression left,right; 00048 Sense_enum sense; 00049 // protected: 00050 int count; 00051 }; 00052 00053 class Constraint : public Handle<Constraint_base*> { 00054 friend class MP_constraint; 00055 friend class MP_model; 00056 friend class Constraint_base; 00057 friend Constraint operator<=(const MP_expression& l, const MP_expression& r); 00058 friend Constraint operator<=(const Constant& l, const MP_expression& r); 00059 friend Constraint operator<=(const MP_expression& l, const Constant& r); 00060 friend Constraint operator<=(const VariableRef& l, const VariableRef& r); 00061 00062 friend Constraint operator>=(const MP_expression& l, const MP_expression& r); 00063 friend Constraint operator>=(const Constant& l, const MP_expression& r); 00064 friend Constraint operator>=(const MP_expression& l, const Constant& r); 00065 friend Constraint operator>=(const VariableRef& l, const VariableRef& r); 00066 00067 friend Constraint operator==(const MP_expression& l, const MP_expression& r); 00068 friend Constraint operator==(const Constant& l, const MP_expression& r); 00069 friend Constraint operator==(const MP_expression& l, const Constant& r); 00070 friend Constraint operator==(const VariableRef& l, const VariableRef& r); 00071 public: 00072 Constraint() : Handle<Constraint_base*>(0) {} 00073 Constraint(Constraint_base* r) : Handle<Constraint_base*>(r) {} 00074 // MP_expression getLeft() {return root->left;} 00075 }; 00076 00082 inline Constraint operator<=(const MP_expression& l, const MP_expression& r) { 00083 return new Constraint_base(l, r, LE); 00084 } 00090 inline Constraint operator<=(const Constant& l, const MP_expression& r) { 00091 return operator<=(MP_expression(l), r); 00092 } 00098 inline Constraint operator<=(const MP_expression& l, const Constant& r){ 00099 return operator<=(l, MP_expression(r)); 00100 } 00106 inline Constraint operator<=(const VariableRef& l, const VariableRef& r) { 00107 return new Constraint_base(l, r, LE); 00108 } 00109 00115 inline Constraint operator>=(const MP_expression& l, const MP_expression& r) { 00116 return new Constraint_base(l, r, GE); 00117 } 00123 inline Constraint operator>=(const Constant& l, const MP_expression& r){ 00124 return operator>=(MP_expression(l), r); 00125 } 00131 inline Constraint operator>=(const MP_expression& l, const Constant& r){ 00132 return operator>=(l, MP_expression(r)); 00133 } 00139 inline Constraint operator>=(const VariableRef& l, const VariableRef& r) { 00140 return new Constraint_base(l, r, GE); 00141 } 00142 00148 inline Constraint operator==(const MP_expression& l, const MP_expression& r) { 00149 return new Constraint_base(l, r, EQ); 00150 } 00156 inline Constraint operator==(const Constant& l, const MP_expression& r){ 00157 return operator==(MP_expression(l), r); 00158 } 00164 inline Constraint operator==(const MP_expression& l, const Constant& r) { 00165 return operator==(l, MP_expression(r)); 00166 } 00172 inline Constraint operator==(const VariableRef& l, const VariableRef& r) { 00173 return new Constraint_base(l, r, EQ); 00174 } 00175 00176 00177 class GenerateFunctor; 00178 00207 class MP_constraint : public RowMajor, public Named { 00208 public: 00210 MP_constraint( 00211 const MP_set_base &s1 = MP_set::getEmpty(), 00212 const MP_set_base &s2 = MP_set::getEmpty(), 00213 const MP_set_base &s3 = MP_set::getEmpty(), 00214 const MP_set_base &s4 = MP_set::getEmpty(), 00215 const MP_set_base &s5 = MP_set::getEmpty() 00216 ); 00217 00218 MP_constraint& operator()( 00219 const MP_index_exp& i1 = MP_index_exp::getEmpty(), 00220 const MP_index_exp& i2 = MP_index_exp::getEmpty(), 00221 const MP_index_exp& i3 = MP_index_exp::getEmpty(), 00222 const MP_index_exp& i4 = MP_index_exp::getEmpty(), 00223 const MP_index_exp& i5 = MP_index_exp::getEmpty() 00224 ) { 00225 I1 = i1; I2 = i2; I3 = i3; I4 = i4; I5 = i5; 00226 return *this; 00227 } 00228 00229 operator int() { 00230 return offset + f(I1->evaluate(),I2->evaluate(),I3->evaluate(), 00231 I4->evaluate(),I5->evaluate()); 00232 } 00233 00234 virtual ~MP_constraint() {} 00235 00236 double price(int i1=0, int i2=0, int i3=0, int i4=0, int i5=0) const; 00237 00238 void coefficients(vector<MP::Coef>& cfs); 00239 00240 int row_number() const; 00241 00242 MP_constraint& such_that(const MP_boolean& b) { 00243 B = b; 00244 return *this; 00245 } 00246 00247 void insertVariables(set<MP_variable*>& v); 00248 00249 void operator=(const Constraint& v); 00250 00251 void display(string s="") const; 00252 00253 MP_model* M; 00254 int offset; 00255 MP_expression left,right; 00256 Sense_enum sense; 00257 private: 00258 MP_boolean B; 00259 const MP_set_base &S1, &S2, &S3, &S4, &S5; 00260 MP_index_exp I1, I2, I3, I4, I5; 00261 }; 00262 00263 } // End of namespace flopc 00264 #endif