/home/coin/SVN-release/CoinAll-1.1.0/FlopCpp/src/MP_constraint.hpp

Go to the documentation of this file.
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

Generated on Sun Nov 14 14:06:33 2010 for Coin-All by  doxygen 1.4.7