00001
00002
00003 #ifndef CoinMpsIO_H
00004 #define CoinMpsIO_H
00005
00006 #include <vector>
00007 #include <string>
00008
00009 #include "CoinPackedMatrix.hpp"
00010 #include "CoinMessageHandler.hpp"
00011 #ifdef COIN_USE_ZLIB
00012 #include "zlib.h"
00013 #else
00014
00015 typedef void* gzFile;
00016 #endif
00017
00018
00019 #ifndef COIN_DBL_MAX
00020 #define COIN_DBL_MAX DBL_MAX
00021 #endif
00022
00027 typedef int COINColumnIndex;
00028
00030 typedef int COINRowIndex;
00031
00032
00033 #define MAX_FIELD_LENGTH 100
00034 #define MAX_CARD_LENGTH 5*MAX_FIELD_LENGTH+80
00035
00036 enum COINSectionType { COIN_NO_SECTION, COIN_NAME_SECTION, COIN_ROW_SECTION,
00037 COIN_COLUMN_SECTION,
00038 COIN_RHS_SECTION, COIN_RANGES_SECTION, COIN_BOUNDS_SECTION,
00039 COIN_ENDATA_SECTION, COIN_EOF_SECTION, COIN_QUADRATIC_SECTION,
00040 COIN_CONIC_SECTION,COIN_UNKNOWN_SECTION
00041 };
00042
00043 enum COINMpsType { COIN_N_ROW, COIN_E_ROW, COIN_L_ROW, COIN_G_ROW,
00044 COIN_BLANK_COLUMN, COIN_S1_COLUMN, COIN_S2_COLUMN, COIN_S3_COLUMN,
00045 COIN_INTORG, COIN_INTEND, COIN_SOSEND, COIN_UNSET_BOUND,
00046 COIN_UP_BOUND, COIN_FX_BOUND, COIN_LO_BOUND, COIN_FR_BOUND,
00047 COIN_MI_BOUND, COIN_PL_BOUND, COIN_BV_BOUND, COIN_UI_BOUND,
00048 COIN_SC_BOUND, COIN_UNKNOWN_MPS_TYPE
00049 };
00050 class CoinMpsIO;
00052 class CoinMpsCardReader {
00053
00054 public:
00055
00058
00059
00060 CoinMpsCardReader ( FILE * fp, gzFile gzfp, CoinMpsIO * reader );
00061
00063 ~CoinMpsCardReader ( );
00065
00066
00069
00070 COINSectionType readToNextSection ( );
00072 COINSectionType nextField ( );
00074 inline COINSectionType whichSection ( ) const {
00075 return section_;
00076 };
00079 inline COINMpsType mpsType ( ) const {
00080 return mpsType_;
00081 };
00083 int cleanCard();
00085 inline const char *rowName ( ) const {
00086 return rowName_;
00087 };
00089 inline const char *columnName ( ) const {
00090 return columnName_;
00091 };
00093 inline double value ( ) const {
00094 return value_;
00095 };
00097 inline const char *card ( ) const {
00098 return card_;
00099 };
00101 inline CoinBigIndex cardNumber ( ) const {
00102 return cardNumber_;
00103 };
00105 inline FILE * filePointer ( ) const {
00106 return fp_;
00107 };
00109
00111 protected:
00112
00115
00116 double value_;
00118 char card_[MAX_CARD_LENGTH];
00120 char *position_;
00122 char *eol_;
00124 COINMpsType mpsType_;
00126 char rowName_[MAX_FIELD_LENGTH];
00128 char columnName_[MAX_FIELD_LENGTH];
00130 FILE *fp_;
00132 gzFile gzfp_;
00134 COINSectionType section_;
00136 CoinBigIndex cardNumber_;
00138 bool freeFormat_;
00140 bool eightChar_;
00142 CoinMpsIO * reader_;
00144 CoinMessageHandler * handler_;
00146 CoinMessages messages_;
00148 };
00149
00150
00151
00163 class CoinMpsIO {
00164 friend void CoinMpsIOUnitTest(const std::string & mpsDir);
00165
00166 public:
00167
00179
00180 int getNumCols() const;
00181
00183 int getNumRows() const;
00184
00186 int getNumElements() const;
00187
00189 const double * getColLower() const;
00190
00192 const double * getColUpper() const;
00193
00203 const char * getRowSense() const;
00204
00216 const double * getRightHandSide() const;
00217
00231 const double * getRowRange() const;
00232
00234 const double * getRowLower() const;
00235
00237 const double * getRowUpper() const;
00238
00240 const double * getObjCoefficients() const;
00241
00243 const CoinPackedMatrix * getMatrixByRow() const;
00244
00246 const CoinPackedMatrix * getMatrixByCol() const;
00247
00249 bool isContinuous(int colNumber) const;
00250
00256 bool isInteger(int columnNumber) const;
00257
00263 const char * integerColumns() const;
00264
00269 const char * rowName(int index) const;
00270
00275 const char * columnName(int index) const;
00276
00283 int rowIndex(const char * name) const;
00284
00289 int columnIndex(const char * name) const;
00290
00295 double objectiveOffset() const;
00296
00298 const char * getProblemName() const;
00299
00301 const char * getObjectiveName() const;
00302
00304 const char * getRhsName() const;
00305
00307 const char * getRangeName() const;
00308
00310 const char * getBoundName() const;
00312
00313
00319
00321 void setMpsData(const CoinPackedMatrix& m, const double infinity,
00322 const double* collb, const double* colub,
00323 const double* obj, const char* integrality,
00324 const double* rowlb, const double* rowub,
00325 char const * const * const colnames,
00326 char const * const * const rownames);
00327 void setMpsData(const CoinPackedMatrix& m, const double infinity,
00328 const double* collb, const double* colub,
00329 const double* obj, const char* integrality,
00330 const double* rowlb, const double* rowub,
00331 const std::vector<std::string> & colnames,
00332 const std::vector<std::string> & rownames);
00333 void setMpsData(const CoinPackedMatrix& m, const double infinity,
00334 const double* collb, const double* colub,
00335 const double* obj, const char* integrality,
00336 const char* rowsen, const double* rowrhs,
00337 const double* rowrng,
00338 char const * const * const colnames,
00339 char const * const * const rownames);
00340 void setMpsData(const CoinPackedMatrix& m, const double infinity,
00341 const double* collb, const double* colub,
00342 const double* obj, const char* integrality,
00343 const char* rowsen, const double* rowrhs,
00344 const double* rowrng,
00345 const std::vector<std::string> & colnames,
00346 const std::vector<std::string> & rownames);
00347
00353 void copyInIntegerInformation(const char * integerInformation);
00355
00362
00363 void setInfinity(double value);
00364
00366 double getInfinity() const;
00367
00369 void setDefaultBound(int value);
00370
00372 int getDefaultBound() const;
00374
00375
00394
00395 void setFileName(const char * name);
00396
00398 const char * getFileName() const;
00399
00401 const bool fileReadable() const;
00402
00407 int readMps(const char *filename, const char *extension = "mps");
00408
00419 int readMps();
00420
00444 int writeMps(const char *filename, int compression = 0,
00445 int formatType = 0, int numberAcross = 2) const;
00446
00474 int readQuadraticMps(const char * filename,
00475 int * &columnStart, int * &column, double * &elements,
00476 int checkSymmetry);
00477
00495 int readConicMps(const char * filename,
00496 int * &columnStart, int * &column, int & numberCones);
00498
00501
00502 CoinMpsIO();
00503
00505 CoinMpsIO (const CoinMpsIO &);
00506
00508 CoinMpsIO & operator=(const CoinMpsIO& rhs);
00509
00511 ~CoinMpsIO ();
00513
00514
00522 void passInMessageHandler(CoinMessageHandler * handler);
00523
00525 void newLanguage(CoinMessages::Language language);
00526
00528 void setLanguage(CoinMessages::Language language) {newLanguage(language);};
00529
00531 CoinMessageHandler * messageHandler() const {return handler_;};
00532
00534 CoinMessages messages() {return messages_;};
00536
00537
00548 void releaseRedundantInformation();
00549
00551 void releaseRowInformation();
00552
00554 void releaseColumnInformation();
00555
00557 void releaseIntegerInformation();
00558
00560 void releaseRowNames();
00561
00563 void releaseColumnNames();
00564
00566 void releaseMatrixInformation();
00568
00569 protected:
00570
00573
00575 void
00576 setMpsDataWithoutRowAndColNames(
00577 const CoinPackedMatrix& m, const double infinity,
00578 const double* collb, const double* colub,
00579 const double* obj, const char* integrality,
00580 const double* rowlb, const double* rowub);
00581 void
00582 setMpsDataColAndRowNames(
00583 const std::vector<std::string> & colnames,
00584 const std::vector<std::string> & rownames);
00585 void
00586 setMpsDataColAndRowNames(
00587 char const * const * const colnames,
00588 char const * const * const rownames);
00589
00590
00592 void gutsOfDestructor();
00593
00595 void gutsOfCopy(const CoinMpsIO &);
00596
00598 void freeAll();
00599
00602 inline void
00603 convertBoundToSense(const double lower, const double upper,
00604 char& sense, double& right, double& range) const;
00607 inline void
00608 convertSenseToBound(const char sense, const double right,
00609 const double range,
00610 double& lower, double& upper) const;
00611
00624 int dealWithFileName(const char * filename, const char * extension,
00625 FILE * & fp, gzFile & gzfp);
00627
00628
00629
00630 typedef struct {
00631 int index, next;
00632 } CoinHashLink;
00633
00636
00637 void startHash ( char **names, const int number , int section );
00639 void startHash ( int section ) const;
00641 void stopHash ( int section );
00643 int findHash ( const char *name , int section ) const;
00645
00648
00649 char * problemName_;
00650
00652 char * objectiveName_;
00653
00655 char * rhsName_;
00656
00658 char * rangeName_;
00659
00661 char * boundName_;
00662
00664 int numberRows_;
00665
00667 int numberColumns_;
00668
00670 CoinBigIndex numberElements_;
00671
00673 mutable char *rowsense_;
00674
00676 mutable double *rhs_;
00677
00681 mutable double *rowrange_;
00682
00684 mutable CoinPackedMatrix *matrixByRow_;
00685
00687 CoinPackedMatrix *matrixByColumn_;
00688
00690 double * rowlower_;
00691
00693 double * rowupper_;
00694
00696 double * collower_;
00697
00699 double * colupper_;
00700
00702 double * objective_;
00703
00705 double objectiveOffset_;
00706
00707
00711 char * integerType_;
00712
00716 char **names_[2];
00718
00721
00722 char * fileName_;
00723
00725 int numberHash_[2];
00726
00728 mutable CoinHashLink *hash_[2];
00730
00733
00734 int defaultBound_;
00735
00737 double infinity_;
00738
00740 CoinMessageHandler * handler_;
00746 bool defaultHandler_;
00748 CoinMessages messages_;
00750 CoinMpsCardReader * cardReader_;
00752
00753 };
00754
00755
00763 void
00764 CoinMpsIOUnitTest(const std::string & mpsDir);
00765
00766 #endif