00001
00002
00003
00004
00005
00006 #ifndef CoinMpsIO_H
00007 #define CoinMpsIO_H
00008
00009 #if defined(_MSC_VER)
00010
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
00033
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
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
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
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
01042
01043
01044
01045
01046
01047
01048
01049 void
01050 CoinConvertDouble(int section, int formatType, double value, char outputValue[24]);
01051
01052 #endif