Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

CoinMpsIO.hpp

00001 // Copyright (C) 2000, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
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 /* just to make the code much nicer (no need for so many ifdefs */
00015 typedef void* gzFile;
00016 #endif
00017 
00018 // Plus infinity
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 // We are allowing free format - but there is a limit!
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   // for hashing
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

Generated on Wed Dec 3 14:34:20 2003 for Coin by doxygen 1.3.5