00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef _MP_model_hpp_
00010 #define _MP_model_hpp_
00011
00012 #include <ostream>
00013 #include <vector>
00014 #include <set>
00015 using std::vector;
00016 using std::set;
00017
00018 #include "MP_expression.hpp"
00019 #include "MP_constraint.hpp"
00020 #include <CoinPackedVector.hpp>
00021 class OsiSolverInterface;
00022
00023 namespace flopc {
00024
00025 class MP_variable;
00026 class MP_index;
00027 class MP_set;
00028
00036 class Messenger {
00037 public:
00038 virtual void logMessage(int level, const char * const msg){}
00039 friend class MP_model;
00040 private:
00041 virtual void constraintDebug(string name, const vector<Coef>& cfs) {}
00042 virtual void objectiveDebug(const vector<Coef>& cfs) {}
00043 virtual void statistics(int bm, int m, int bn, int n, int nz) {}
00044 virtual void generationTime(double t) {}
00045 protected:
00046 virtual ~Messenger() {}
00047 };
00048
00052 class NormalMessenger : public Messenger {
00053 friend class MP_model;
00054 private:
00055 virtual void statistics(int bm, int m, int bn, int n, int nz);
00056 virtual void generationTime(double t);
00057 };
00058
00062 class VerboseMessenger : public NormalMessenger {
00063 friend class MP_model;
00064 private:
00065 virtual void constraintDebug(string name, const vector<Coef>& cfs);
00066 virtual void objectiveDebug(const vector<Coef>& cfs);
00067 };
00068
00090 class MP_model {
00091 friend class MP_constraint;
00092 public:
00094 typedef enum {MINIMIZE=1, MAXIMIZE=-1} MP_direction;
00095
00098 typedef enum {
00100 OPTIMAL,
00102 PRIMAL_INFEASIBLE,
00104 DUAL_INFEASIBLE,
00107 ABANDONED,
00110 SOLVER_ONLY,
00112 ATTACHED,
00114 DETACHED
00115 } MP_status;
00116
00118 MP_model(OsiSolverInterface* s, Messenger* m = new NormalMessenger);
00119
00120 ~MP_model() {
00121 delete messenger;
00122 }
00123
00131 MP_status getStatus()const {
00132 return mSolverState;
00133 }
00135 void silent() {
00136 delete messenger;
00137 messenger = new Messenger;
00138 }
00140 void verbose() {
00141 delete messenger;
00142 messenger = new VerboseMessenger;
00143 }
00144
00146 void setSolver(OsiSolverInterface* s) {
00147 Solver = s;
00148 }
00149
00151 OsiSolverInterface* operator->() {
00152 return Solver;
00153 }
00154
00156 MP_model& add(MP_constraint& c);
00157
00161 void maximize();
00165 void maximize(const MP_expression &obj);
00169 void minimize();
00173 void minimize(const MP_expression &obj);
00174
00178 void minimize_max(MP_set& d, const MP_expression &obj);
00179
00181 void setObjective(const MP_expression& o);
00192 void attach(OsiSolverInterface *solver=NULL);
00199 void detach();
00207 MP_model::MP_status solve(const MP_model::MP_direction &dir);
00212 const double* solution;
00213 const double* reducedCost;
00214 const double* rowPrice;
00215 const double* rowActivity;
00219 double getInfinity() const;
00220
00222 void add(MP_variable* v);
00224 void addRow(const Constraint& c);
00225
00229 static MP_model &getDefaultModel();
00233 static MP_model *getCurrentModel();
00236 Messenger *getMessenger(){
00237 return messenger;
00238 }
00239 private:
00240 typedef std::set<MP_variable* >::iterator varIt;
00241 typedef std::set<MP_constraint* >::iterator conIt;
00242 static MP_model& default_model;
00243 static MP_model* current_model;
00244 MP_model(const MP_model&);
00245 MP_model& operator=(const MP_model&);
00246
00247 Messenger* messenger;
00248
00249
00250 static void assemble(vector<Coef>& v, vector<Coef>& av);
00251 void add(MP_constraint* c);
00252 MP_expression Objective;
00253 set<MP_constraint *> Constraints;
00254 set<MP_variable *> Variables;
00255 public:
00257 OsiSolverInterface* Solver;
00258 private:
00259 int m;
00260 int n;
00261 int nz;
00262 int *Cst;
00263 int *Clg;
00264 int *Rnr;
00265 double *Elm;
00266 double *bl;
00267 double *bu;
00268 double *c;
00269 double *l;
00270 double *u;
00271 MP_status mSolverState;
00272 };
00273
00275 std::ostream &operator<<(std::ostream &os,
00276 const MP_model::MP_status &condition);
00278 std::ostream &operator<<(std::ostream &os,
00279 const MP_model::MP_direction &direction);
00280
00281 }
00282 #endif