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

Go to the documentation of this file.
00001 // ******************** FlopCpp **********************************************
00002 // File: MP_expression.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_expression_hpp_
00010 #define _MP_expression_hpp_
00011 
00012 #include <vector>
00013 #include <set>
00014 using std::vector;
00015 using std::set;
00016 
00017 #include "MP_domain.hpp"
00018 #include "MP_constant.hpp"
00019 #include "MP_utilities.hpp"
00020 
00021 namespace flopc {
00022 
00023   class MP_constraint;
00024   class TerminalExpression; 
00025   class MP_variable;
00026   class VariableRef;
00027 
00028   class MP {
00029     friend class MP_expression;
00030     friend class MP_constraint;
00031     friend class MP_model;
00032     friend class Messenger;
00033     friend class VerboseMessenger; 
00034     friend class CoefLess;
00035     friend class MP_expression_base;
00036     friend class VariableRef;
00037 
00038     struct Coef {
00039       Coef(int c, int r, double v, int s = 0) : 
00040         col(c), row(r), stage(s), val(v)  {}
00041       int col, row, stage;
00042       double val;
00043     };
00044     
00045     struct CoefLess {
00046       bool operator() (const MP::Coef& a, const MP::Coef& b) const;
00047     };
00048 
00049   protected:
00050     class GenerateFunctor : public Functor {
00051     public:
00052       GenerateFunctor(MP_constraint* r, vector<Coef>& cfs): R(r), Coefs(cfs) {}
00053       
00054       void setMultiplicator(vector<Constant>& mults, double m) {
00055         multiplicators = mults;
00056         M = m;
00057       }
00058       void setTerminalExpression(const TerminalExpression* c) {
00059         C = c;
00060       }
00061       
00062       void operator()() const;
00063     private:
00064       vector<Constant> multiplicators;
00065       MP_constraint* R;
00066       double M; // sign (1=lhs, -1=rhs)
00067       const TerminalExpression* C;
00068       vector<MP::Coef>& Coefs;
00069     };
00070   };
00071 
00072   
00078   class MP_expression_base {
00079     friend class MP_expression;
00080     friend class Handle<MP_expression_base*>;
00081   private:
00082     int count;
00083   public:
00084     MP_expression_base() : count(0) {}
00085 
00086     virtual double level() const = 0;
00087     virtual void generate(const MP_domain& domain,
00088                           vector<Constant> multiplicators,
00089                           MP::GenerateFunctor &f,
00090                           double m) const = 0;
00091 
00092     virtual void insertVariables(set<MP_variable*>& v) const = 0;
00093 
00094     virtual ~MP_expression_base() {}
00095   };
00096 
00097 
00110   class MP_expression : public Handle<MP_expression_base*> {
00111   public:
00112     MP_expression() : Handle<MP_expression_base*>(0) {}
00114     MP_expression(const Constant& c);
00116     MP_expression(const VariableRef& v);
00117     MP_expression(MP_expression_base* r) : Handle<MP_expression_base*>(r) {}
00118   };
00119 
00120 
00127   class TerminalExpression : public MP_expression_base {
00128   public:
00129     virtual double getValue() const = 0; 
00130     virtual int getColumn() const = 0;
00131     virtual int getStage() const = 0;
00132   };
00133 
00138   class VariableRef : public TerminalExpression {
00139     friend class MP_variable;
00140   public:
00141     int getColumn() const;
00142   private:
00143     VariableRef(MP_variable* v, 
00144                 const MP_index_exp& i1,
00145                 const MP_index_exp& i2,
00146                 const MP_index_exp& i3,
00147                 const MP_index_exp& i4,
00148                 const MP_index_exp& i5);
00149 
00150     double level() const;
00151 
00152     void insertVariables(set<MP_variable*>& v) const {
00153       v.insert(V);
00154     }
00155     double getValue() const { 
00156       return 1.0;
00157     }
00158     int getStage() const { 
00159       return 0;
00160     }
00161     void generate(const MP_domain& domain,
00162                   vector<Constant> multiplicators,
00163                   MP::GenerateFunctor& f,
00164                   double m) const;
00165     MP_variable* V;
00166     int offset;
00167     const MP_index_exp I1,I2,I3,I4,I5;
00168   };
00169 
00171   MP_expression operator+(const MP_expression& e1, const MP_expression& e2);
00173   MP_expression operator+(const MP_expression& e1, const Constant& e2);
00175   MP_expression operator+(const Constant& e1, const MP_expression& e2);
00177   MP_expression operator-(const MP_expression& e1, const MP_expression& e2);
00179   MP_expression operator-(const MP_expression& e1, const Constant& e2);
00181   MP_expression operator-(const Constant& e1, const MP_expression& e2);
00183   MP_expression operator*(const Constant& e1, const MP_expression& e2); 
00185   MP_expression operator*(const MP_expression& e1, const Constant& e2);
00187   MP_expression operator/(const MP_expression& e1, const Constant& e2);
00189   MP_expression sum(const MP_domain& d, const MP_expression& e);
00190 
00191 } // End of namespace flopc
00192 #endif

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