00001
00002
00003
00004
00005
00006
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
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
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 }
00264 #endif