CoinUtils trunk
|
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