- Main Page
- Modules
- Namespaces
- Classes
- Files
- Related Pages

- File List
- File Members

# /home/coin/SVN-release/Alps-1.3.0/Osi/src/OsiMsk/OsiMskSolverInterface.hpp

Go to the documentation of this file.

    00001 // Osi interface for Mosek ver. 5.0
    00002 // Lower versions are not supported
    00003 //-----------------------------------------------------------------------------
    00004 // name:     OSI Interface for MOSEK
    00005 // author:   Bo Jensen
    00006 // email:    support@MOSEK.com
    00007 //-----------------------------------------------------------------------------
    00008
    00009 // This code is licensed under the terms of the Eclipse Public License (EPL).
    00010
    00011 #ifndef OsiMskSolverInterface_H
    00012 #define OsiMskSolverInterface_H
    00013
    00014 #include "OsiSolverInterface.hpp"
    00015
    00016 typedef void* MSKtask_t;
    00017 typedef void* MSKenv_t;
    00018
    00019 /* MOSEK Solver Interface
    00020    Instantiation of OsiMskSolverInterface for MOSEK
    00021 */
    00022
    00023 class OsiMskSolverInterface :
    00024   virtual public OsiSolverInterface {
    00025   friend void OsiMskSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
    00026 public:
    00027
    00028   //---------------------------------------------------------------------------
    00031
    00032   virtual void initialSolve();
    00033
    00035   virtual void resolve();
    00036
    00038   virtual void branchAndBound();
    00040
    00041   //---------------------------------------------------------------------------
    00057     // Set an integer parameter
    00058     bool setIntParam(OsiIntParam key, int value);
    00059     // Set an double parameter
    00060     bool setDblParam(OsiDblParam key, double value);
    00061     // Set a string parameter
    00062     bool setStrParam(OsiStrParam key, const std::string & value);
    00063     // Get an integer parameter
    00064     bool getIntParam(OsiIntParam key, int& value) const;
    00065     // Get an double parameter
    00066     bool getDblParam(OsiDblParam key, double& value) const;
    00067     // Get a string parameter
    00068     bool getStrParam(OsiStrParam key, std::string& value) const;
    00070
    00071   //---------------------------------------------------------------------------
    00073
    00074
    00075     virtual bool isAbandoned() const;
    00077     virtual bool isProvenOptimal() const;
    00079     virtual bool isProvenPrimalInfeasible() const;
    00081     virtual bool isProvenDualInfeasible() const;
    00083     virtual bool isPrimalObjectiveLimitReached() const;
    00085     virtual bool isDualObjectiveLimitReached() const;
    00087     virtual bool isIterationLimitReached() const;
    00089     virtual bool isLicenseError() const;
    00091
    00092   //---------------------------------------------------------------------------
    00101   CoinWarmStart* getEmptyWarmStart () const;
    00102
    00104
    00105     virtual CoinWarmStart* getWarmStart() const;
    00108     virtual bool setWarmStart(const CoinWarmStart* warmstart);
    00110
    00111   //---------------------------------------------------------------------------
    00118
    00119     virtual void markHotStart();
    00121     virtual void solveFromHotStart();
    00123     virtual void unmarkHotStart();
    00125
    00126   //---------------------------------------------------------------------------
    00141
    00142       virtual int getNumCols() const;
    00143
    00145       virtual int getNumRows() const;
    00146
    00148       virtual int getNumElements() const;
    00149
    00151       virtual const double * getColLower() const;
    00152
    00154       virtual const double * getColUpper() const;
    00155
    00165       virtual const char * getRowSense() const;
    00166
    00175       virtual const double * getRightHandSide() const;
    00176
    00185       virtual const double * getRowRange() const;
    00186
    00188       virtual const double * getRowLower() const;
    00189
    00191       virtual const double * getRowUpper() const;
    00192
    00194       virtual const double * getObjCoefficients() const;
    00195
    00197       virtual double getObjSense() const;
    00198
    00200       virtual bool isContinuous(int colNumber) const;
    00201
    00202 #if 0
    00204       virtual bool isBinary(int columnNumber) const;
    00205
    00210       virtual bool isInteger(int columnNumber) const;
    00211
    00213       virtual bool isIntegerNonBinary(int columnNumber) const;
    00214
    00216       virtual bool isFreeBinary(int columnNumber) const;
    00217 #endif
    00218
    00220       virtual const CoinPackedMatrix * getMatrixByRow() const;
    00221
    00223       virtual const CoinPackedMatrix * getMatrixByCol() const;
    00224
    00226       virtual double getInfinity() const;
    00228
    00231
    00232       virtual const double * getColSolution() const;
    00233
    00235       virtual const double * getRowPrice() const;
    00236
    00238       virtual const double * getReducedCost() const;
    00239
    00242       virtual const double * getRowActivity() const;
    00243
    00245       virtual double getObjValue() const;
    00246
    00249       virtual int getIterationCount() const;
    00250
    00268       virtual std::vector<double*> getDualRays(int maxNumRays,
    00269                                                bool fullRay=false) const;
    00281       virtual std::vector<double*> getPrimalRays(int maxNumRays) const;
    00282
    00283 #if 0
    00284
    00286       virtual OsiVectorInt getFractionalIndices(const double etol=1.e-05)
    00287         const;
    00288 #endif
    00289
    00290
    00291
    00292   //---------------------------------------------------------------------------
    00293
    00296     //-------------------------------------------------------------------------
    00300       virtual void setObjCoeff( int elementIndex, double elementValue );
    00301
    00303       virtual void setObjCoeffSet(const int* indexFirst,
    00304                                   const int* indexLast,
    00305                                   const double* coeffList);
    00306
    00309       virtual void setColLower( int elementIndex, double elementValue );
    00310
    00313       virtual void setColUpper( int elementIndex, double elementValue );
    00314
    00318       virtual void setColBounds( int elementIndex,
    00319                                  double lower, double upper );
    00320
    00328       virtual void setColSetBounds(const int* indexFirst,
    00329                                    const int* indexLast,
    00330                                    const double* boundList);
    00331
    00334       virtual void setRowLower( int elementIndex, double elementValue );
    00335
    00338       virtual void setRowUpper( int elementIndex, double elementValue );
    00339
    00343       virtual void setRowBounds( int elementIndex,
    00344                                  double lower, double upper );
    00345
    00347       virtual void setRowType(int index, char sense, double rightHandSide,
    00348                               double range);
    00349
    00357       virtual void setRowSetBounds(const int* indexFirst,
    00358                                    const int* indexLast,
    00359                                    const double* boundList);
    00360
    00370       virtual void setRowSetTypes(const int* indexFirst,
    00371                                   const int* indexLast,
    00372                                   const char* senseList,
    00373                                   const double* rhsList,
    00374                                   const double* rangeList);
    00376
    00377     //-------------------------------------------------------------------------
    00381       virtual void setContinuous(int index);
    00383       virtual void setInteger(int index);
    00386       virtual void setContinuous(const int* indices, int len);
    00389       virtual void setInteger(const int* indices, int len);
    00391
    00392     //-------------------------------------------------------------------------
    00394     virtual void setObjSense(double s);
    00395
    00406     virtual void setColSolution(const double * colsol);
    00407
    00418     virtual void setRowPrice(const double * rowprice);
    00419
    00420     //-------------------------------------------------------------------------
    00426       virtual void addCol(const CoinPackedVectorBase& vec,
    00427                           const double collb, const double colub,
    00428                           const double obj);
    00430       virtual void addCols(const int numcols,
    00431                            const CoinPackedVectorBase * const * cols,
    00432                            const double* collb, const double* colub,
    00433                            const double* obj);
    00435       virtual void deleteCols(const int num, const int * colIndices);
    00436
    00438       virtual void addRow(const CoinPackedVectorBase& vec,
    00439                           const double rowlb, const double rowub);
    00441       virtual void addRow(const CoinPackedVectorBase& vec,
    00442                           const char rowsen, const double rowrhs,
    00443                           const double rowrng);
    00445       virtual void addRows(const int numrows,
    00446                            const CoinPackedVectorBase * const * rows,
    00447                            const double* rowlb, const double* rowub);
    00449       virtual void addRows(const int numrows,
    00450                            const CoinPackedVectorBase * const * rows,
    00451                            const char* rowsen, const double* rowrhs,
    00452                            const double* rowrng);
    00454       virtual void deleteRows(const int num, const int * rowIndices);
    00455
    00456 #if 0
    00457   // ??? implemented in OsiSolverInterface
    00458       //-----------------------------------------------------------------------
    00480       virtual ApplyCutsReturnCode applyCuts(const OsiCuts & cs,
    00481                                             double effectivenessLb = 0.0);
    00482 #endif
    00483
    00484
    00485
    00486   //---------------------------------------------------------------------------
    00487
    00501     virtual void loadProblem(const CoinPackedMatrix& matrix,
    00502                              const double* collb, const double* colub,
    00503                              const double* obj,
    00504                              const double* rowlb, const double* rowub);
    00505
    00513     virtual void assignProblem(CoinPackedMatrix*& matrix,
    00514                                double*& collb, double*& colub, double*& obj,
    00515                                double*& rowlb, double*& rowub);
    00516
    00529     virtual void loadProblem(const CoinPackedMatrix& matrix,
    00530                              const double* collb, const double* colub,
    00531                              const double* obj,
    00532                              const char* rowsen, const double* rowrhs,
    00533                              const double* rowrng);
    00534
    00542     virtual void assignProblem(CoinPackedMatrix*& matrix,
    00543                                double*& collb, double*& colub, double*& obj,
    00544                                char*& rowsen, double*& rowrhs,
    00545                                double*& rowrng);
    00546
    00549     virtual void loadProblem(const int numcols, const int numrows,
    00550                              const int* start, const int* index,
    00551                              const double* value,
    00552                              const double* collb, const double* colub,
    00553                              const double* obj,
    00554                              const double* rowlb, const double* rowub);
    00555
    00558     virtual void loadProblem(const int numcols, const int numrows,
    00559                              const int* start, const int* index,
    00560                              const double* value,
    00561                              const double* collb, const double* colub,
    00562                              const double* obj,
    00563                              const char* rowsen, const double* rowrhs,
    00564                              const double* rowrng);
    00565
    00567     virtual int readMps(const char *filename,
    00568                          const char *extension = "mps");
    00569
    00574     virtual void writeMps(const char *filename,
    00575                           const char *extension = "mps",
    00576                           double objSense=0.0) const;
    00578
    00586     void passInMessageHandler(CoinMessageHandler * handler);
    00588
    00589   //---------------------------------------------------------------------------
    00590
    00596   enum keepCachedFlag
    00597   {
    00599     KEEPCACHED_NONE    = 0,
    00601     KEEPCACHED_COLUMN  = 1,
    00603     KEEPCACHED_ROW     = 2,
    00605     KEEPCACHED_MATRIX  = 4,
    00607     KEEPCACHED_RESULTS = 8,
    00609     KEEPCACHED_PROBLEM = KEEPCACHED_COLUMN | KEEPCACHED_ROW | KEEPCACHED_MATRIX,
    00611     KEEPCACHED_ALL     = KEEPCACHED_PROBLEM | KEEPCACHED_RESULTS,
    00613     FREECACHED_COLUMN  = KEEPCACHED_PROBLEM & ~KEEPCACHED_COLUMN,
    00615     FREECACHED_ROW     = KEEPCACHED_PROBLEM & ~KEEPCACHED_ROW,
    00617     FREECACHED_MATRIX  = KEEPCACHED_PROBLEM & ~KEEPCACHED_MATRIX,
    00619     FREECACHED_RESULTS = KEEPCACHED_ALL & ~KEEPCACHED_RESULTS
    00620   };
    00621
    00622   MSKtask_t getLpPtr( int keepCached = KEEPCACHED_NONE );
    00623
    00625
    00626   MSKenv_t getEnvironmentPtr();
    00628
    00630   const char* getCtype() const;
    00631
    00641   static void incrementInstanceCounter();
    00642
    00651   static void decrementInstanceCounter();
    00652
    00654   static unsigned int getNumInstances();
    00656
    00657
    00660
    00661
    00662
    00663   OsiMskSolverInterface(MSKenv_t mskenv = NULL);
    00664
    00666   virtual OsiSolverInterface * clone(bool copyData = true) const;
    00667
    00669   OsiMskSolverInterface( const OsiMskSolverInterface& );
    00670
    00672   OsiMskSolverInterface& operator=( const OsiMskSolverInterface& rhs );
    00673
    00675   virtual ~OsiMskSolverInterface();
    00677
    00678 protected:
    00679
    00682
    00683   virtual void applyRowCut( const OsiRowCut & rc );
    00684
    00688   virtual void applyColCut( const OsiColCut & cc );
    00690
    00691 private:
    00694
    00695   void switchToLP();
    00696
    00698   void switchToMIP();
    00699
    00701   void resizeColType( int minsize );
    00702
    00704   void freeColType();
    00705
    00706   bool definedSolution(int solution) const;
    00707
    00708   int solverUsed() const;
    00709
    00711
    00714
    00715   static MSKenv_t env_ ;
    00716
    00718   //static unsigned int numInstances_;
    00720   static unsigned int numInstances_;
    00721
    00724
    00725   int Mskerr;
    00726   int MSKsolverused_;
    00727   double ObjOffset_;
    00728
    00729   int InitialSolver;
    00730
    00732   public: MSKtask_t getMutableLpPtr() const;
    00733
    00735   void gutsOfCopy( const OsiMskSolverInterface & source );
    00736
    00738   void gutsOfConstructor();
    00739
    00741   void gutsOfDestructor();
    00742
    00744   void freeCachedColRim();
    00745
    00747   void freeCachedRowRim();
    00748
    00750   void freeCachedResults();
    00751
    00753   void freeCachedMatrix();
    00754
    00756   void freeCachedData( int keepCached = KEEPCACHED_NONE );
    00757
    00759   void freeAllMemory();
    00760
    00763
    00764   mutable MSKtask_t task_;
    00765
    00767   int *hotStartCStat_;
    00768   int hotStartCStatSize_;
    00769   int *hotStartRStat_;
    00770   int hotStartRStatSize_;
    00771   int hotStartMaxIteration_;
    00772
    00775
    00776   mutable double  *obj_;
    00777
    00779   mutable double  *collower_;
    00780
    00782   mutable double  *colupper_;
    00783
    00785   mutable char    *rowsense_;
    00786
    00788   mutable double  *rhs_;
    00789
    00791   mutable double  *rowrange_;
    00792
    00794   mutable double  *rowlower_;
    00795
    00797   mutable double  *rowupper_;
    00798
    00800   mutable double  *colsol_;
    00801
    00803   mutable double  *rowsol_;
    00804
    00806   mutable double  *redcost_;
    00807
    00809   mutable double  *rowact_;
    00810
    00812   mutable CoinPackedMatrix *matrixByRow_;
    00813
    00815   mutable CoinPackedMatrix *matrixByCol_;
    00817
    00820
    00821   char            *coltype_;
    00822
    00824   int             coltypesize_;
    00825
    00827   mutable bool    probtypemip_;
    00828
    00830 };
    00831
    00832 //#############################################################################
    00834 void OsiMskSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
    00835
    00836 #endif