CoinMpsIO.hpp
Go to the documentation of this file.
1 /* $Id: CoinMpsIO.hpp 1215 2009-11-05 11:03:04Z forrest $ */
2 // Copyright (C) 2000, International Business Machines
3 // Corporation and others. All Rights Reserved.
4 #ifndef CoinMpsIO_H
5 #define CoinMpsIO_H
6 
7 #if defined(_MSC_VER)
8 // Turn off compiler warning about long names
9 # pragma warning(disable:4786)
10 #endif
11 
12 #include <vector>
13 #include <string>
14 
15 #include "CoinUtilsConfig.h"
16 #include "CoinPackedMatrix.hpp"
17 #include "CoinMessageHandler.hpp"
18 #include "CoinFileIO.hpp"
19 class CoinModel;
20 // Plus infinity
21 #ifndef COIN_DBL_MAX
22 #define COIN_DBL_MAX DBL_MAX
23 #endif
24 
29 typedef int COINColumnIndex;
30 
32 typedef int COINRowIndex;
33 
34 // We are allowing free format - but there is a limit!
35 // User can override by using CXXFLAGS += -DCOIN_MAX_FIELD_LENGTH=nnn
36 #ifndef COIN_MAX_FIELD_LENGTH
37 #define COIN_MAX_FIELD_LENGTH 160
38 #endif
39 #define MAX_CARD_LENGTH 5*COIN_MAX_FIELD_LENGTH+80
40 
47 };
48 
57 };
58 class CoinMpsIO;
61 
62 public:
63 
66 
67 
68  CoinMpsCardReader ( CoinFileInput *input, CoinMpsIO * reader );
69 
73 
74 
77 
94  int nextGmsField ( int expectedType );
96  inline COINSectionType whichSection ( ) const {
97  return section_;
98  }
100  inline void setWhichSection(COINSectionType section ) {
101  section_=section;
102  }
104  inline bool freeFormat() const
105  { return freeFormat_;}
107  inline void setFreeFormat(bool yesNo)
108  { freeFormat_=yesNo;}
111  inline COINMpsType mpsType ( ) const {
112  return mpsType_;
113  }
115  int cleanCard();
117  inline const char *rowName ( ) const {
118  return rowName_;
119  }
121  inline const char *columnName ( ) const {
122  return columnName_;
123  }
125  inline double value ( ) const {
126  return value_;
127  }
129  inline const char *valueString ( ) const {
130  return valueString_;
131  }
133  inline const char *card ( ) const {
134  return card_;
135  }
137  inline char *mutableCard ( ) {
138  return card_;
139  }
141  inline void setPosition(char * position)
142  { position_=position;}
144  inline char * getPosition() const
145  { return position_;}
147  inline CoinBigIndex cardNumber ( ) const {
148  return cardNumber_;
149  }
151  inline CoinFileInput * fileInput ( ) const {
152  return input_;
153  }
155  inline void setStringsAllowed()
156  { stringsAllowed_=true;}
158 
160 protected:
161 
164 
165  double value_;
169  char *position_;
171  char *eol_;
201 public:
204 
205  double osi_strtod(char * ptr, char ** output, int type);
207  static void strcpyAndCompress ( char *to, const char *from );
209  static char * nextBlankOr ( char *image );
211  double osi_strtod(char * ptr, char ** output);
213 
214 };
215 
216 //#############################################################################
217 #ifdef USE_SBB
218 class SbbObject;
219 class SbbModel;
220 #endif
221 
222 class CoinSet {
223 
224 public:
225 
228 
229  CoinSet ( );
231  CoinSet ( int numberEntries, const int * which);
232 
234  CoinSet (const CoinSet &);
235 
237  CoinSet & operator=(const CoinSet& rhs);
238 
240  virtual ~CoinSet ( );
242 
243 
246 
247  inline int numberEntries ( ) const
248  { return numberEntries_; }
250  inline int setType ( ) const
251  { return setType_; }
253  inline const int * which ( ) const
254  { return which_; }
256  inline const double * weights ( ) const
257  { return weights_; }
259 
260 #ifdef USE_SBB
261 
263 
264  virtual SbbObject * sbbObject(SbbModel * model) const
265  { return NULL;}
267 #endif
268 
270 protected:
271 
274 
277  int setType_;
279  int * which_;
281  double * weights_;
283 };
284 
285 //#############################################################################
287 class CoinSosSet : public CoinSet{
288 
289 public:
290 
293 
294  CoinSosSet ( int numberEntries, const int * which, const double * weights, int type);
295 
297  virtual ~CoinSosSet ( );
299 
300 
301 #ifdef USE_SBB
302 
304 
305  virtual SbbObject * sbbObject(SbbModel * model) const ;
307 #endif
308 
310 protected:
311 
314 
315 };
316 
317 //#############################################################################
318 
330 class CoinMpsIO {
331  friend void CoinMpsIOUnitTest(const std::string & mpsDir);
332 
333 public:
334 
346 
347  int getNumCols() const;
348 
350  int getNumRows() const;
351 
353  int getNumElements() const;
354 
356  const double * getColLower() const;
357 
359  const double * getColUpper() const;
360 
370  const char * getRowSense() const;
371 
383  const double * getRightHandSide() const;
384 
398  const double * getRowRange() const;
399 
401  const double * getRowLower() const;
402 
404  const double * getRowUpper() const;
405 
407  const double * getObjCoefficients() const;
408 
410  const CoinPackedMatrix * getMatrixByRow() const;
411 
413  const CoinPackedMatrix * getMatrixByCol() const;
414 
416  bool isContinuous(int colNumber) const;
417 
423  bool isInteger(int columnNumber) const;
424 
430  const char * integerColumns() const;
431 
436  const char * rowName(int index) const;
437 
442  const char * columnName(int index) const;
443 
450  int rowIndex(const char * name) const;
451 
456  int columnIndex(const char * name) const;
457 
462  double objectiveOffset() const;
464  inline void setObjectiveOffset(double value)
465  { objectiveOffset_=value;}
466 
468  const char * getProblemName() const;
469 
471  const char * getObjectiveName() const;
472 
474  const char * getRhsName() const;
475 
477  const char * getRangeName() const;
478 
480  const char * getBoundName() const;
482  inline int numberStringElements() const
483  { return numberStringElements_;}
485  inline const char * stringElement(int i) const
486  { return stringElements_[i];}
488 
489 
495 
497  void setMpsData(const CoinPackedMatrix& m, const double infinity,
498  const double* collb, const double* colub,
499  const double* obj, const char* integrality,
500  const double* rowlb, const double* rowub,
501  char const * const * const colnames,
502  char const * const * const rownames);
503  void setMpsData(const CoinPackedMatrix& m, const double infinity,
504  const double* collb, const double* colub,
505  const double* obj, const char* integrality,
506  const double* rowlb, const double* rowub,
507  const std::vector<std::string> & colnames,
508  const std::vector<std::string> & rownames);
509  void setMpsData(const CoinPackedMatrix& m, const double infinity,
510  const double* collb, const double* colub,
511  const double* obj, const char* integrality,
512  const char* rowsen, const double* rowrhs,
513  const double* rowrng,
514  char const * const * const colnames,
515  char const * const * const rownames);
516  void setMpsData(const CoinPackedMatrix& m, const double infinity,
517  const double* collb, const double* colub,
518  const double* obj, const char* integrality,
519  const char* rowsen, const double* rowrhs,
520  const double* rowrng,
521  const std::vector<std::string> & colnames,
522  const std::vector<std::string> & rownames);
523 
529  void copyInIntegerInformation(const char * integerInformation);
530 
532  void setProblemName(const char *name) ;
533 
535  void setObjectiveName(const char *name) ;
536 
538 
545 
546  void setInfinity(double value);
547 
549  double getInfinity() const;
550 
552  void setDefaultBound(int value);
553 
555  int getDefaultBound() const;
557  inline int allowStringElements() const
558  { return allowStringElements_;}
560  inline void setAllowStringElements(int yesNo)
561  { allowStringElements_ = yesNo;}
564  inline double getSmallElementValue() const
565  { return smallElement_;}
566  inline void setSmallElementValue(double value)
567  { smallElement_=value;}
569 
570 
589 
590  void setFileName(const char * name);
591 
593  const char * getFileName() const;
594 
599  int readMps(const char *filename, const char *extension = "mps");
600 
606  int readMps(const char *filename, const char *extension ,
607  int & numberSets, CoinSet **& sets);
608 
619  int readMps();
621  int readMps(int & numberSets, CoinSet **& sets);
631  int readBasis(const char *filename, const char *extension ,
632  double * solution, unsigned char *rowStatus, unsigned char *columnStatus,
633  const std::vector<std::string> & colnames,int numberColumns,
634  const std::vector<std::string> & rownames, int numberRows);
635 
641  int readGms(const char *filename, const char *extension = "gms",bool convertObjective=false);
642 
648  int readGms(const char *filename, const char *extension ,
649  int & numberSets, CoinSet **& sets);
650 
657  // Not for now int readGms();
659  int readGms(int & numberSets, CoinSet **& sets);
662  int readGMPL(const char *modelName, const char * dataName=NULL, bool keepNames=false);
663 
689  int writeMps(const char *filename, int compression = 0,
690  int formatType = 0, int numberAcross = 2,
691  CoinPackedMatrix * quadratic = NULL,
692  int numberSOS=0,const CoinSet * setInfo=NULL) const;
693 
695  inline const CoinMpsCardReader * reader() const
696  { return cardReader_;}
697 
725  int readQuadraticMps(const char * filename,
726  int * &columnStart, int * &column, double * &elements,
727  int checkSymmetry);
728 
746  int readConicMps(const char * filename,
747  int * &columnStart, int * &column, int & numberCones);
749  inline void setConvertObjective(bool trueFalse)
750  { convertObjective_=trueFalse;}
752  int copyStringElements(const CoinModel * model);
754 
757 
758  CoinMpsIO();
759 
761  CoinMpsIO (const CoinMpsIO &);
762 
764  CoinMpsIO & operator=(const CoinMpsIO& rhs);
765 
767  ~CoinMpsIO ();
769 
770 
779 
781  void newLanguage(CoinMessages::Language language);
782 
784  void setLanguage(CoinMessages::Language language) {newLanguage(language);}
785 
788 
794 
795 
807 
809  void releaseRowInformation();
810 
813 
816 
818  void releaseRowNames();
819 
821  void releaseColumnNames();
822 
826 
827 protected:
828 
831 
833  void
835  const CoinPackedMatrix& m, const double infinity,
836  const double* collb, const double* colub,
837  const double* obj, const char* integrality,
838  const double* rowlb, const double* rowub);
839  void
841  const std::vector<std::string> & colnames,
842  const std::vector<std::string> & rownames);
843  void
845  char const * const * const colnames,
846  char const * const * const rownames);
847 
848 
850  void gutsOfDestructor();
851 
853  void gutsOfCopy(const CoinMpsIO &);
854 
856  void freeAll();
857 
858 
861  inline void
862  convertBoundToSense(const double lower, const double upper,
863  char& sense, double& right, double& range) const;
866  inline void
867  convertSenseToBound(const char sense, const double right,
868  const double range,
869  double& lower, double& upper) const;
870 
883  int dealWithFileName(const char * filename, const char * extension,
884  CoinFileInput * &input);
889  void addString(int iRow,int iColumn, const char * value);
891  void decodeString(int iString, int & iRow, int & iColumn, const char * & value) const;
893 
894 
895  // for hashing
896  typedef struct {
897  int index, next;
898  } CoinHashLink;
899 
902 
903  void startHash ( char **names, const int number , int section );
905  void startHash ( int section ) const;
907  void stopHash ( int section );
909  int findHash ( const char *name , int section ) const;
911 
914 
915  char * problemName_;
916 
919 
921  char * rhsName_;
922 
924  char * rangeName_;
925 
927  char * boundName_;
928 
931 
934 
937 
939  mutable char *rowsense_;
940 
942  mutable double *rhs_;
943 
947  mutable double *rowrange_;
948 
951 
954 
956  double * rowlower_;
957 
959  double * rowupper_;
960 
962  double * collower_;
963 
965  double * colupper_;
966 
968  double * objective_;
969 
972 
973 
977  char * integerType_;
978 
982  char **names_[2];
984 
987 
988  char * fileName_;
989 
991  int numberHash_[2];
992 
994  mutable CoinHashLink *hash_[2];
996 
999 
1001 
1003  double infinity_;
1006 
1030 
1031 };
1032 
1033 //#############################################################################
1041 void
1042 CoinMpsIOUnitTest(const std::string & mpsDir);
1043 // Function to return number in most efficient way
1044 // section is 0 for columns, 1 for rhs,ranges and 2 for bounds
1045 /* formatType is
1046  0 - normal and 8 character names
1047  1 - extra accuracy
1048  2 - IEEE hex - INTEL
1049  3 - IEEE hex - not INTEL
1050 */
1051 void
1052 CoinConvertDouble(int section, int formatType, double value, char outputValue[24]);
1053 
1054 #endif