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 00027 typedef int COINColumnIndex; 00028 00030 typedef int COINRowIndex; 00031 00032 // We are allowing free format - but there is a limit! 00033 // User can override by using CXXFLAGS += -DCOIN_MAX_FIELD_LENGTH=nnn 00034 #ifndef COIN_MAX_FIELD_LENGTH 00035 #define COIN_MAX_FIELD_LENGTH 160 00036 #endif 00037 #define MAX_CARD_LENGTH 5*COIN_MAX_FIELD_LENGTH+80 00038 00039 enum COINSectionType { COIN_NO_SECTION, COIN_NAME_SECTION, COIN_ROW_SECTION, 00040 COIN_COLUMN_SECTION, 00041 COIN_RHS_SECTION, COIN_RANGES_SECTION, COIN_BOUNDS_SECTION, 00042 COIN_ENDATA_SECTION, COIN_EOF_SECTION, COIN_QUADRATIC_SECTION, 00043 COIN_CONIC_SECTION,COIN_QUAD_SECTION,COIN_SOS_SECTION, 00044 COIN_BASIS_SECTION,COIN_UNKNOWN_SECTION 00045 }; 00046 00047 enum COINMpsType { COIN_N_ROW, COIN_E_ROW, COIN_L_ROW, COIN_G_ROW, 00048 COIN_BLANK_COLUMN, COIN_S1_COLUMN, COIN_S2_COLUMN, COIN_S3_COLUMN, 00049 COIN_INTORG, COIN_INTEND, COIN_SOSEND, COIN_UNSET_BOUND, 00050 COIN_UP_BOUND, COIN_FX_BOUND, COIN_LO_BOUND, COIN_FR_BOUND, 00051 COIN_MI_BOUND, COIN_PL_BOUND, COIN_BV_BOUND, COIN_UI_BOUND, COIN_LI_BOUND, 00052 COIN_SC_BOUND, COIN_S1_BOUND, COIN_S2_BOUND, 00053 COIN_BS_BASIS, COIN_XL_BASIS, COIN_XU_BASIS, 00054 COIN_LL_BASIS, COIN_UL_BASIS, COIN_UNKNOWN_MPS_TYPE 00055 }; 00056 class CoinMpsIO; 00058 class CoinMpsCardReader { 00059 00060 public: 00061 00064 00065 00066 CoinMpsCardReader ( CoinFileInput *input, CoinMpsIO * reader ); 00067 00069 ~CoinMpsCardReader ( ); 00071 00072 00075 00076 COINSectionType readToNextSection ( ); 00078 COINSectionType nextField ( ); 00092 int nextGmsField ( int expectedType ); 00094 inline COINSectionType whichSection ( ) const { 00095 return section_; 00096 } 00098 inline void setWhichSection(COINSectionType section ) { 00099 section_=section; 00100 } 00102 inline bool freeFormat() const 00103 { return freeFormat_;} 00105 inline void setFreeFormat(bool yesNo) 00106 { freeFormat_=yesNo;} 00109 inline COINMpsType mpsType ( ) const { 00110 return mpsType_; 00111 } 00113 int cleanCard(); 00115 inline const char *rowName ( ) const { 00116 return rowName_; 00117 } 00119 inline const char *columnName ( ) const { 00120 return columnName_; 00121 } 00123 inline double value ( ) const { 00124 return value_; 00125 } 00127 inline const char *valueString ( ) const { 00128 return valueString_; 00129 } 00131 inline const char *card ( ) const { 00132 return card_; 00133 } 00135 inline char *mutableCard ( ) { 00136 return card_; 00137 } 00139 inline void setPosition(char * position) 00140 { position_=position;} 00142 inline char * getPosition() const 00143 { return position_;} 00145 inline CoinBigIndex cardNumber ( ) const { 00146 return cardNumber_; 00147 } 00149 inline CoinFileInput * fileInput ( ) const { 00150 return input_; 00151 } 00153 inline void setStringsAllowed() 00154 { stringsAllowed_=true;} 00156 00158 protected: 00159 00162 00163 double value_; 00165 char card_[MAX_CARD_LENGTH]; 00167 char *position_; 00169 char *eol_; 00171 COINMpsType mpsType_; 00173 char rowName_[COIN_MAX_FIELD_LENGTH]; 00175 char columnName_[COIN_MAX_FIELD_LENGTH]; 00177 CoinFileInput *input_; 00179 COINSectionType section_; 00181 CoinBigIndex cardNumber_; 00183 bool freeFormat_; 00185 int ieeeFormat_; 00187 bool eightChar_; 00189 CoinMpsIO * reader_; 00191 CoinMessageHandler * handler_; 00193 CoinMessages messages_; 00195 char valueString_[COIN_MAX_FIELD_LENGTH]; 00197 bool stringsAllowed_; 00199 public: 00202 00203 double osi_strtod(char * ptr, char ** output, int type); 00205 static void strcpyAndCompress ( char *to, const char *from ); 00207 static char * nextBlankOr ( char *image ); 00209 double osi_strtod(char * ptr, char ** output); 00211 00212 }; 00213 00214 //############################################################################# 00215 #ifdef USE_SBB 00216 class SbbObject; 00217 class SbbModel; 00218 #endif 00219 00220 class CoinSet { 00221 00222 public: 00223 00226 00227 CoinSet ( ); 00229 CoinSet ( int numberEntries, const int * which); 00230 00232 CoinSet (const CoinSet &); 00233 00235 CoinSet & operator=(const CoinSet& rhs); 00236 00238 virtual ~CoinSet ( ); 00240 00241 00244 00245 inline int numberEntries ( ) const 00246 { return numberEntries_; } 00248 inline int setType ( ) const 00249 { return setType_; } 00251 inline const int * which ( ) const 00252 { return which_; } 00254 inline const double * weights ( ) const 00255 { return weights_; } 00257 00258 #ifdef USE_SBB 00259 00261 00262 virtual SbbObject * sbbObject(SbbModel * model) const 00263 { return NULL;} 00265 #endif 00266 00268 protected: 00269 00272 00273 int numberEntries_; 00275 int setType_; 00277 int * which_; 00279 double * weights_; 00281 }; 00282 00283 //############################################################################# 00285 class CoinSosSet : public CoinSet{ 00286 00287 public: 00288 00291 00292 CoinSosSet ( int numberEntries, const int * which, const double * weights, int type); 00293 00295 virtual ~CoinSosSet ( ); 00297 00298 00299 #ifdef USE_SBB 00300 00302 00303 virtual SbbObject * sbbObject(SbbModel * model) const ; 00305 #endif 00306 00308 protected: 00309 00312 00313 }; 00314 00315 //############################################################################# 00316 00328 class CoinMpsIO { 00329 friend void CoinMpsIOUnitTest(const std::string & mpsDir); 00330 00331 public: 00332 00344 00345 int getNumCols() const; 00346 00348 int getNumRows() const; 00349 00351 int getNumElements() const; 00352 00354 const double * getColLower() const; 00355 00357 const double * getColUpper() const; 00358 00368 const char * getRowSense() const; 00369 00381 const double * getRightHandSide() const; 00382 00396 const double * getRowRange() const; 00397 00399 const double * getRowLower() const; 00400 00402 const double * getRowUpper() const; 00403 00405 const double * getObjCoefficients() const; 00406 00408 const CoinPackedMatrix * getMatrixByRow() const; 00409 00411 const CoinPackedMatrix * getMatrixByCol() const; 00412 00414 bool isContinuous(int colNumber) const; 00415 00421 bool isInteger(int columnNumber) const; 00422 00428 const char * integerColumns() const; 00429 00434 const char * rowName(int index) const; 00435 00440 const char * columnName(int index) const; 00441 00448 int rowIndex(const char * name) const; 00449 00454 int columnIndex(const char * name) const; 00455 00460 double objectiveOffset() const; 00462 inline void setObjectiveOffset(double value) 00463 { objectiveOffset_=value;} 00464 00466 const char * getProblemName() const; 00467 00469 const char * getObjectiveName() const; 00470 00472 const char * getRhsName() const; 00473 00475 const char * getRangeName() const; 00476 00478 const char * getBoundName() const; 00480 inline int numberStringElements() const 00481 { return numberStringElements_;} 00483 inline const char * stringElement(int i) const 00484 { return stringElements_[i];} 00486 00487 00493 00495 void setMpsData(const CoinPackedMatrix& m, const double infinity, 00496 const double* collb, const double* colub, 00497 const double* obj, const char* integrality, 00498 const double* rowlb, const double* rowub, 00499 char const * const * const colnames, 00500 char const * const * const rownames); 00501 void setMpsData(const CoinPackedMatrix& m, const double infinity, 00502 const double* collb, const double* colub, 00503 const double* obj, const char* integrality, 00504 const double* rowlb, const double* rowub, 00505 const std::vector<std::string> & colnames, 00506 const std::vector<std::string> & rownames); 00507 void setMpsData(const CoinPackedMatrix& m, const double infinity, 00508 const double* collb, const double* colub, 00509 const double* obj, const char* integrality, 00510 const char* rowsen, const double* rowrhs, 00511 const double* rowrng, 00512 char const * const * const colnames, 00513 char const * const * const rownames); 00514 void setMpsData(const CoinPackedMatrix& m, const double infinity, 00515 const double* collb, const double* colub, 00516 const double* obj, const char* integrality, 00517 const char* rowsen, const double* rowrhs, 00518 const double* rowrng, 00519 const std::vector<std::string> & colnames, 00520 const std::vector<std::string> & rownames); 00521 00527 void copyInIntegerInformation(const char * integerInformation); 00528 00530 void setProblemName(const char *name) ; 00531 00533 void setObjectiveName(const char *name) ; 00534 00536 00543 00544 void setInfinity(double value); 00545 00547 double getInfinity() const; 00548 00550 void setDefaultBound(int value); 00551 00553 int getDefaultBound() const; 00555 inline int allowStringElements() const 00556 { return allowStringElements_;} 00558 inline void setAllowStringElements(int yesNo) 00559 { allowStringElements_ = yesNo;} 00562 inline double getSmallElementValue() const 00563 { return smallElement_;} 00564 inline void setSmallElementValue(double value) 00565 { smallElement_=value;} 00567 00568 00587 00588 void setFileName(const char * name); 00589 00591 const char * getFileName() const; 00592 00597 int readMps(const char *filename, const char *extension = "mps"); 00598 00604 int readMps(const char *filename, const char *extension , 00605 int & numberSets, CoinSet **& sets); 00606 00617 int readMps(); 00619 int readMps(int & numberSets, CoinSet **& sets); 00629 int readBasis(const char *filename, const char *extension , 00630 double * solution, unsigned char *rowStatus, unsigned char *columnStatus, 00631 const std::vector<std::string> & colnames,int numberColumns, 00632 const std::vector<std::string> & rownames, int numberRows); 00633 00639 int readGms(const char *filename, const char *extension = "gms",bool convertObjective=false); 00640 00646 int readGms(const char *filename, const char *extension , 00647 int & numberSets, CoinSet **& sets); 00648 00655 // Not for now int readGms(); 00657 int readGms(int & numberSets, CoinSet **& sets); 00660 int readGMPL(const char *modelName, const char * dataName=NULL, bool keepNames=false); 00661 00687 int writeMps(const char *filename, int compression = 0, 00688 int formatType = 0, int numberAcross = 2, 00689 CoinPackedMatrix * quadratic = NULL, 00690 int numberSOS=0,const CoinSet * setInfo=NULL) const; 00691 00693 inline const CoinMpsCardReader * reader() const 00694 { return cardReader_;} 00695 00723 int readQuadraticMps(const char * filename, 00724 int * &columnStart, int * &column, double * &elements, 00725 int checkSymmetry); 00726 00744 int readConicMps(const char * filename, 00745 int * &columnStart, int * &column, int & numberCones); 00747 inline void setConvertObjective(bool trueFalse) 00748 { convertObjective_=trueFalse;} 00750 int copyStringElements(const CoinModel * model); 00752 00755 00756 CoinMpsIO(); 00757 00759 CoinMpsIO (const CoinMpsIO &); 00760 00762 CoinMpsIO & operator=(const CoinMpsIO& rhs); 00763 00765 ~CoinMpsIO (); 00767 00768 00776 void passInMessageHandler(CoinMessageHandler * handler); 00777 00779 void newLanguage(CoinMessages::Language language); 00780 00782 inline void setLanguage(CoinMessages::Language language) {newLanguage(language);} 00783 00785 inline CoinMessageHandler * messageHandler() const {return handler_;} 00786 00788 inline CoinMessages messages() {return messages_;} 00790 inline CoinMessages * messagesPointer() {return & messages_;} 00792 00793 00804 void releaseRedundantInformation(); 00805 00807 void releaseRowInformation(); 00808 00810 void releaseColumnInformation(); 00811 00813 void releaseIntegerInformation(); 00814 00816 void releaseRowNames(); 00817 00819 void releaseColumnNames(); 00820 00822 void releaseMatrixInformation(); 00824 00825 protected: 00826 00829 00831 void 00832 setMpsDataWithoutRowAndColNames( 00833 const CoinPackedMatrix& m, const double infinity, 00834 const double* collb, const double* colub, 00835 const double* obj, const char* integrality, 00836 const double* rowlb, const double* rowub); 00837 void 00838 setMpsDataColAndRowNames( 00839 const std::vector<std::string> & colnames, 00840 const std::vector<std::string> & rownames); 00841 void 00842 setMpsDataColAndRowNames( 00843 char const * const * const colnames, 00844 char const * const * const rownames); 00845 00846 00848 void gutsOfDestructor(); 00849 00851 void gutsOfCopy(const CoinMpsIO &); 00852 00854 void freeAll(); 00855 00856 00859 inline void 00860 convertBoundToSense(const double lower, const double upper, 00861 char& sense, double& right, double& range) const; 00864 inline void 00865 convertSenseToBound(const char sense, const double right, 00866 const double range, 00867 double& lower, double& upper) const; 00868 00881 int dealWithFileName(const char * filename, const char * extension, 00882 CoinFileInput * &input); 00887 void addString(int iRow,int iColumn, const char * value); 00889 void decodeString(int iString, int & iRow, int & iColumn, const char * & value) const; 00891 00892 00893 // for hashing 00894 typedef struct { 00895 int index, next; 00896 } CoinHashLink; 00897 00900 00901 void startHash ( char **names, const int number , int section ); 00903 void startHash ( int section ) const; 00905 void stopHash ( int section ); 00907 int findHash ( const char *name , int section ) const; 00909 00912 00913 char * problemName_; 00914 00916 char * objectiveName_; 00917 00919 char * rhsName_; 00920 00922 char * rangeName_; 00923 00925 char * boundName_; 00926 00928 int numberRows_; 00929 00931 int numberColumns_; 00932 00934 CoinBigIndex numberElements_; 00935 00937 mutable char *rowsense_; 00938 00940 mutable double *rhs_; 00941 00945 mutable double *rowrange_; 00946 00948 mutable CoinPackedMatrix *matrixByRow_; 00949 00951 CoinPackedMatrix *matrixByColumn_; 00952 00954 double * rowlower_; 00955 00957 double * rowupper_; 00958 00960 double * collower_; 00961 00963 double * colupper_; 00964 00966 double * objective_; 00967 00969 double objectiveOffset_; 00970 00971 00975 char * integerType_; 00976 00980 char **names_[2]; 00982 00985 00986 char * fileName_; 00987 00989 int numberHash_[2]; 00990 00992 mutable CoinHashLink *hash_[2]; 00994 00997 00998 int defaultBound_; 00999 01001 double infinity_; 01003 double smallElement_; 01004 01006 CoinMessageHandler * handler_; 01012 bool defaultHandler_; 01014 CoinMessages messages_; 01016 CoinMpsCardReader * cardReader_; 01018 bool convertObjective_; 01020 int allowStringElements_; 01022 int maximumStringElements_; 01024 int numberStringElements_; 01026 char ** stringElements_; 01028 01029 }; 01030 01031 //############################################################################# 01039 void 01040 CoinMpsIOUnitTest(const std::string & mpsDir); 01041 // Function to return number in most efficient way 01042 // section is 0 for columns, 1 for rhs,ranges and 2 for bounds 01043 /* formatType is 01044 0 - normal and 8 character names 01045 1 - extra accuracy 01046 2 - IEEE hex - INTEL 01047 3 - IEEE hex - not INTEL 01048 */ 01049 void 01050 CoinConvertDouble(int section, int formatType, double value, char outputValue[24]); 01051 01052 #endif