CoinUtils trunk
CoinMpsIO.hpp
Go to the documentation of this file.
00001 /* $Id$ */
00002 // Copyright (C) 2000, International Business Machines
00003 // Corporation and others.  All Rights Reserved.
00004 // This code is licensed under the terms of the Eclipse Public License (EPL).
00005 
00006 #ifndef CoinMpsIO_H
00007 #define CoinMpsIO_H
00008 
00009 #if defined(_MSC_VER)
00010 // Turn off compiler warning about long names
00011 #  pragma warning(disable:4786)
00012 #endif
00013 
00014 #include <vector>
00015 #include <string>
00016 
00017 #include "CoinUtilsConfig.h"
00018 #include "CoinPackedMatrix.hpp"
00019 #include "CoinMessageHandler.hpp"
00020 #include "CoinFileIO.hpp"
00021 class CoinModel;
00022 // Plus infinity
00023 #ifndef COIN_DBL_MAX
00024 #define COIN_DBL_MAX DBL_MAX
00025 #endif
00026 
00031 typedef int COINColumnIndex;
00032 
00034 typedef int COINRowIndex;
00035 
00036 // We are allowing free format - but there is a limit!
00037 // User can override by using CXXFLAGS += -DCOIN_MAX_FIELD_LENGTH=nnn
00038 #ifndef COIN_MAX_FIELD_LENGTH
00039 #define COIN_MAX_FIELD_LENGTH 160
00040 #endif
00041 #define MAX_CARD_LENGTH 5*COIN_MAX_FIELD_LENGTH+80
00042 
00043 enum COINSectionType { COIN_NO_SECTION, COIN_NAME_SECTION, COIN_ROW_SECTION,
00044                        COIN_COLUMN_SECTION,
00045                        COIN_RHS_SECTION, COIN_RANGES_SECTION, COIN_BOUNDS_SECTION,
00046                        COIN_ENDATA_SECTION, COIN_EOF_SECTION, COIN_QUADRATIC_SECTION, 
00047                        COIN_CONIC_SECTION,COIN_QUAD_SECTION,COIN_SOS_SECTION, 
00048                        COIN_BASIS_SECTION,COIN_UNKNOWN_SECTION
00049 };
00050 
00051 enum COINMpsType { COIN_N_ROW, COIN_E_ROW, COIN_L_ROW, COIN_G_ROW,
00052   COIN_BLANK_COLUMN, COIN_S1_COLUMN, COIN_S2_COLUMN, COIN_S3_COLUMN,
00053   COIN_INTORG, COIN_INTEND, COIN_SOSEND, COIN_UNSET_BOUND,
00054   COIN_UP_BOUND, COIN_FX_BOUND, COIN_LO_BOUND, COIN_FR_BOUND,
00055                    COIN_MI_BOUND, COIN_PL_BOUND, COIN_BV_BOUND, COIN_UI_BOUND, COIN_LI_BOUND,
00056                    COIN_SC_BOUND, COIN_S1_BOUND, COIN_S2_BOUND,
00057                    COIN_BS_BASIS, COIN_XL_BASIS, COIN_XU_BASIS,
00058                    COIN_LL_BASIS, COIN_UL_BASIS, COIN_UNKNOWN_MPS_TYPE
00059 };
00060 class CoinMpsIO;
00062 class CoinMpsCardReader {
00063 
00064 public:
00065 
00068 
00069 
00070   CoinMpsCardReader ( CoinFileInput *input, CoinMpsIO * reader );
00071 
00073   ~CoinMpsCardReader (  );
00075 
00076 
00079 
00080   COINSectionType readToNextSection (  );
00082   COINSectionType nextField (  );
00096   int nextGmsField ( int expectedType );
00098   inline COINSectionType whichSection (  ) const {
00099     return section_;
00100   }
00102   inline void setWhichSection(COINSectionType section  ) {
00103     section_=section;
00104   }
00106   inline bool freeFormat() const
00107   { return freeFormat_;}
00109   inline void setFreeFormat(bool yesNo) 
00110   { freeFormat_=yesNo;}
00113   inline COINMpsType mpsType (  ) const {
00114     return mpsType_;
00115   }
00117   int cleanCard();
00119   inline const char *rowName (  ) const {
00120     return rowName_;
00121   }
00123   inline const char *columnName (  ) const {
00124     return columnName_;
00125   }
00127   inline double value (  ) const {
00128     return value_;
00129   }
00131   inline const char *valueString (  ) const {
00132     return valueString_;
00133   }
00135   inline const char *card (  ) const {
00136     return card_;
00137   }
00139   inline char *mutableCard (  ) {
00140     return card_;
00141   }
00143   inline void setPosition(char * position)
00144   { position_=position;}
00146   inline char * getPosition() const
00147   { return position_;}
00149   inline CoinBigIndex cardNumber (  ) const {
00150     return cardNumber_;
00151   }
00153   inline CoinFileInput * fileInput (  ) const {
00154     return input_;
00155   }
00157   inline void setStringsAllowed()
00158   { stringsAllowed_=true;}
00160 
00162 protected:
00163 
00166 
00167   double value_;
00169   char card_[MAX_CARD_LENGTH];
00171   char *position_;
00173   char *eol_;
00175   COINMpsType mpsType_;
00177   char rowName_[COIN_MAX_FIELD_LENGTH];
00179   char columnName_[COIN_MAX_FIELD_LENGTH];
00181   CoinFileInput *input_;
00183   COINSectionType section_;
00185   CoinBigIndex cardNumber_;
00187   bool freeFormat_;
00189   int ieeeFormat_;
00191   bool eightChar_;
00193   CoinMpsIO * reader_;
00195   CoinMessageHandler * handler_;
00197   CoinMessages messages_;
00199   char valueString_[COIN_MAX_FIELD_LENGTH];
00201   bool stringsAllowed_;
00203 public:
00206 
00207   double osi_strtod(char * ptr, char ** output, int type);
00209   static void strcpyAndCompress ( char *to, const char *from );
00211   static char * nextBlankOr ( char *image );
00213   double osi_strtod(char * ptr, char ** output);
00215 
00216 };
00217 
00218 //#############################################################################
00219 #ifdef USE_SBB
00220 class SbbObject;
00221 class SbbModel;
00222 #endif
00223 
00224 class CoinSet {
00225 
00226 public:
00227 
00230 
00231   CoinSet ( );
00233   CoinSet ( int numberEntries, const int * which);
00234 
00236   CoinSet (const CoinSet &);
00237   
00239   CoinSet & operator=(const CoinSet& rhs);  
00240   
00242   virtual ~CoinSet (  );
00244 
00245 
00248 
00249   inline int numberEntries (  ) const 
00250   { return numberEntries_;  }
00252   inline int setType (  ) const 
00253   { return setType_;  }
00255   inline const int * which (  ) const 
00256   { return which_;  }
00258   inline const double * weights (  ) const 
00259   { return weights_;  }
00261 
00262 #ifdef USE_SBB
00263 
00265 
00266   virtual SbbObject * sbbObject(SbbModel * model) const 
00267   { return NULL;}
00269 #endif
00270 
00272 protected:
00273 
00276 
00277   int numberEntries_;
00279   int setType_;
00281   int * which_;
00283   double * weights_;
00285 };
00286 
00287 //#############################################################################
00289 class CoinSosSet : public CoinSet{
00290 
00291 public:
00292 
00295 
00296   CoinSosSet ( int numberEntries, const int * which, const double * weights, int type);
00297 
00299   virtual ~CoinSosSet (  );
00301 
00302 
00303 #ifdef USE_SBB
00304 
00306 
00307   virtual SbbObject * sbbObject(SbbModel * model) const ;
00309 #endif
00310 
00312 protected:
00313 
00316 
00317 };
00318 
00319 //#############################################################################
00320 
00332 class CoinMpsIO {
00333    friend void CoinMpsIOUnitTest(const std::string & mpsDir);
00334 
00335 public:
00336 
00348 
00349     int getNumCols() const;
00350 
00352     int getNumRows() const;
00353 
00355     int getNumElements() const;
00356 
00358     const double * getColLower() const;
00359 
00361     const double * getColUpper() const;
00362 
00372     const char * getRowSense() const;
00373 
00385     const double * getRightHandSide() const;
00386 
00400     const double * getRowRange() const;
00401 
00403     const double * getRowLower() const;
00404 
00406     const double * getRowUpper() const;
00407 
00409     const double * getObjCoefficients() const;
00410 
00412     const CoinPackedMatrix * getMatrixByRow() const;
00413 
00415     const CoinPackedMatrix * getMatrixByCol() const;
00416 
00418     bool isContinuous(int colNumber) const;
00419 
00425     bool isInteger(int columnNumber) const;
00426   
00432     const char * integerColumns() const;
00433 
00438     const char * rowName(int index) const;
00439 
00444     const char * columnName(int index) const;
00445 
00452     int rowIndex(const char * name) const;
00453 
00458     int columnIndex(const char * name) const;
00459 
00464     double objectiveOffset() const;
00466     inline void setObjectiveOffset(double value)
00467     { objectiveOffset_=value;}
00468 
00470     const char * getProblemName() const;
00471 
00473     const char * getObjectiveName() const;
00474 
00476     const char * getRhsName() const;
00477 
00479     const char * getRangeName() const;
00480 
00482     const char * getBoundName() const;
00484     inline int numberStringElements() const
00485     { return numberStringElements_;}
00487     inline const char * stringElement(int i) const
00488     { return stringElements_[i];}
00490 
00491 
00497   
00499     void setMpsData(const CoinPackedMatrix& m, const double infinity,
00500                      const double* collb, const double* colub,
00501                      const double* obj, const char* integrality,
00502                      const double* rowlb, const double* rowub,
00503                      char const * const * const colnames,
00504                      char const * const * const rownames);
00505     void setMpsData(const CoinPackedMatrix& m, const double infinity,
00506                      const double* collb, const double* colub,
00507                      const double* obj, const char* integrality,
00508                      const double* rowlb, const double* rowub,
00509                      const std::vector<std::string> & colnames,
00510                      const std::vector<std::string> & rownames);
00511     void setMpsData(const CoinPackedMatrix& m, const double infinity,
00512                      const double* collb, const double* colub,
00513                      const double* obj, const char* integrality,
00514                      const char* rowsen, const double* rowrhs,
00515                      const double* rowrng,
00516                      char const * const * const colnames,
00517                      char const * const * const rownames);
00518     void setMpsData(const CoinPackedMatrix& m, const double infinity,
00519                      const double* collb, const double* colub,
00520                      const double* obj, const char* integrality,
00521                      const char* rowsen, const double* rowrhs,
00522                      const double* rowrng,
00523                      const std::vector<std::string> & colnames,
00524                      const std::vector<std::string> & rownames);
00525 
00531     void copyInIntegerInformation(const char * integerInformation);
00532 
00534     void setProblemName(const char *name) ;
00535 
00537     void setObjectiveName(const char *name) ;
00538 
00540 
00547 
00548     void setInfinity(double value);
00549 
00551     double getInfinity() const;
00552 
00554     void setDefaultBound(int value);
00555 
00557     int getDefaultBound() const;
00559     inline int allowStringElements() const
00560     { return allowStringElements_;}
00562     inline void setAllowStringElements(int yesNo)
00563     { allowStringElements_ = yesNo;}
00566     inline double getSmallElementValue() const
00567     { return smallElement_;}
00568     inline void setSmallElementValue(double value)
00569     { smallElement_=value;} 
00571 
00572 
00591 
00592     void setFileName(const char * name);
00593 
00595     const char * getFileName() const;
00596 
00601     int readMps(const char *filename, const char *extension = "mps");
00602 
00608      int readMps(const char *filename, const char *extension ,
00609         int & numberSets, CoinSet **& sets);
00610 
00621     int readMps();
00623     int readMps(int & numberSets, CoinSet **& sets);
00633     int readBasis(const char *filename, const char *extension ,
00634                   double * solution, unsigned char *rowStatus, unsigned char *columnStatus,
00635                   const std::vector<std::string> & colnames,int numberColumns,
00636                   const std::vector<std::string> & rownames, int numberRows);
00637 
00643     int readGms(const char *filename, const char *extension = "gms",bool convertObjective=false);
00644 
00650      int readGms(const char *filename, const char *extension ,
00651         int & numberSets, CoinSet **& sets);
00652 
00659     // Not for now int readGms();
00661     int readGms(int & numberSets, CoinSet **& sets);
00664     int readGMPL(const char *modelName, const char * dataName=NULL, bool keepNames=false);
00665 
00691     int writeMps(const char *filename, int compression = 0,
00692                  int formatType = 0, int numberAcross = 2,
00693                  CoinPackedMatrix * quadratic = NULL,
00694                  int numberSOS=0,const CoinSet * setInfo=NULL) const;
00695 
00697     inline const CoinMpsCardReader * reader() const
00698     { return cardReader_;}
00699   
00727     int readQuadraticMps(const char * filename,
00728                          int * &columnStart, int * &column, double * &elements,
00729                          int checkSymmetry);
00730 
00748     int readConicMps(const char * filename,
00749                      int * &columnStart, int * &column, int & numberCones);
00751     inline void setConvertObjective(bool trueFalse)
00752     { convertObjective_=trueFalse;}
00754   int copyStringElements(const CoinModel * model);
00756 
00759 
00760     CoinMpsIO(); 
00761       
00763     CoinMpsIO (const CoinMpsIO &);
00764   
00766     CoinMpsIO & operator=(const CoinMpsIO& rhs);
00767   
00769     ~CoinMpsIO ();
00771 
00772 
00780   void passInMessageHandler(CoinMessageHandler * handler);
00781 
00783   void newLanguage(CoinMessages::Language language);
00784 
00786   inline void setLanguage(CoinMessages::Language language) {newLanguage(language);}
00787 
00789   inline CoinMessageHandler * messageHandler() const {return handler_;}
00790 
00792   inline CoinMessages messages() {return messages_;}
00794   inline CoinMessages * messagesPointer() {return & messages_;}
00796 
00797 
00808     void releaseRedundantInformation();
00809 
00811     void releaseRowInformation();
00812 
00814     void releaseColumnInformation();
00815 
00817     void releaseIntegerInformation();
00818 
00820     void releaseRowNames();
00821 
00823     void releaseColumnNames();
00824 
00826     void releaseMatrixInformation();
00828 
00829 protected:
00830   
00833 
00835     void
00836     setMpsDataWithoutRowAndColNames(
00837                       const CoinPackedMatrix& m, const double infinity,
00838                       const double* collb, const double* colub,
00839                       const double* obj, const char* integrality,
00840                       const double* rowlb, const double* rowub);
00841     void
00842     setMpsDataColAndRowNames(
00843                       const std::vector<std::string> & colnames,
00844                       const std::vector<std::string> & rownames);
00845     void
00846     setMpsDataColAndRowNames(
00847                       char const * const * const colnames,
00848                       char const * const * const rownames);
00849 
00850   
00852     void gutsOfDestructor();
00853 
00855     void gutsOfCopy(const CoinMpsIO &);
00856   
00858     void freeAll();
00859 
00860 
00863     inline void
00864     convertBoundToSense(const double lower, const double upper,
00865                         char& sense, double& right, double& range) const;
00868     inline void
00869     convertSenseToBound(const char sense, const double right,
00870                         const double range,
00871                         double& lower, double& upper) const;
00872 
00885   int dealWithFileName(const char * filename,  const char * extension,
00886                        CoinFileInput * &input); 
00891   void addString(int iRow,int iColumn, const char * value);
00893   void decodeString(int iString, int & iRow, int & iColumn, const char * & value) const;
00895 
00896   
00897   // for hashing
00898   typedef struct {
00899     int index, next;
00900   } CoinHashLink;
00901 
00904 
00905   void startHash ( char **names, const int number , int section );
00907   void startHash ( int section ) const;
00909   void stopHash ( int section );
00911   int findHash ( const char *name , int section ) const;
00913 
00916 
00917       char * problemName_;
00918 
00920       char * objectiveName_;
00921 
00923       char * rhsName_;
00924 
00926       char * rangeName_;
00927 
00929       char * boundName_;
00930 
00932       int numberRows_;
00933 
00935       int numberColumns_;
00936 
00938       CoinBigIndex numberElements_;
00939 
00941       mutable char    *rowsense_;
00942   
00944       mutable double  *rhs_;
00945   
00949       mutable double  *rowrange_;
00950    
00952       mutable CoinPackedMatrix *matrixByRow_;  
00953 
00955       CoinPackedMatrix *matrixByColumn_;  
00956 
00958       double * rowlower_;
00959 
00961       double * rowupper_;
00962 
00964       double * collower_;
00965 
00967       double * colupper_;
00968 
00970       double * objective_;
00971 
00973       double objectiveOffset_;
00974 
00975 
00979       char * integerType_;
00980 
00984       char **names_[2];
00986 
00989 
00990       char * fileName_;
00991 
00993       int numberHash_[2];
00994 
00996       mutable CoinHashLink *hash_[2];
00998 
01001 
01002       int defaultBound_; 
01003 
01005       double infinity_;
01007       double smallElement_;
01008 
01010       CoinMessageHandler * handler_;
01016       bool defaultHandler_;
01018       CoinMessages messages_;
01020       CoinMpsCardReader * cardReader_;
01022       bool convertObjective_;
01024       int allowStringElements_;
01026       int maximumStringElements_;
01028       int numberStringElements_;
01030       char ** stringElements_;
01032 
01033 };
01034 
01035 //#############################################################################
01043 void
01044 CoinMpsIOUnitTest(const std::string & mpsDir);
01045 // Function to return number in most efficient way
01046 // section is 0 for columns, 1 for rhs,ranges and 2 for bounds
01047 /* formatType is
01048    0 - normal and 8 character names
01049    1 - extra accuracy
01050    2 - IEEE hex - INTEL
01051    3 - IEEE hex - not INTEL
01052 */
01053 void
01054 CoinConvertDouble(int section, int formatType, double value, char outputValue[24]);
01055 
01056 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines