MP_model.hpp

Go to the documentation of this file.
00001 // ******************** FlopCpp **********************************************
00002 // File: MP_model.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_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 } // End of namespace flopc
00282 #endif

Generated on Fri Aug 26 03:02:58 2011 for FLOPC++ by  doxygen 1.4.7