CoinUtils  2.9.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CoinMpsIO.hpp
Go to the documentation of this file.
1 /* $Id: CoinMpsIO.hpp 1419 2011-04-29 17:39:07Z stefan $ */
2 // Copyright (C) 2000, International Business Machines
3 // Corporation and others. All Rights Reserved.
4 // This code is licensed under the terms of the Eclipse Public License (EPL).
5 
6 #ifndef CoinMpsIO_H
7 #define CoinMpsIO_H
8 
9 #if defined(_MSC_VER)
10 // Turn off compiler warning about long names
11 # pragma warning(disable:4786)
12 #endif
13 
14 #include <vector>
15 #include <string>
16 
17 #include "CoinUtilsConfig.h"
18 #include "CoinPackedMatrix.hpp"
19 #include "CoinMessageHandler.hpp"
20 #include "CoinFileIO.hpp"
21 class CoinModel;
22 
27 typedef int COINColumnIndex;
28 
30 typedef int COINRowIndex;
31 
32 // We are allowing free format - but there is a limit!
33 // User can override by using CXXFLAGS += -DCOIN_MAX_FIELD_LENGTH=nnn
34 #ifndef COIN_MAX_FIELD_LENGTH
35 #define COIN_MAX_FIELD_LENGTH 160
36 #endif
37 #define MAX_CARD_LENGTH 5*COIN_MAX_FIELD_LENGTH+80
38 
45 };
46 
55 };
56 class CoinMpsIO;
59 
60 public:
61 
64  CoinMpsCardReader ( CoinFileInput *input, CoinMpsIO * reader );
67 
71 
72 
92  int nextGmsField ( int expectedType );
94  inline COINSectionType whichSection ( ) const {
95  return section_;
96  }
98  inline void setWhichSection(COINSectionType section ) {
99  section_=section;
100  }
102  inline bool freeFormat() const
103  { return freeFormat_;}
105  inline void setFreeFormat(bool yesNo)
106  { freeFormat_=yesNo;}
109  inline COINMpsType mpsType ( ) const {
110  return mpsType_;
111  }
113  int cleanCard();
115  inline const char *rowName ( ) const {
116  return rowName_;
117  }
119  inline const char *columnName ( ) const {
120  return columnName_;
121  }
123  inline double value ( ) const {
124  return value_;
125  }
127  inline const char *valueString ( ) const {
128  return valueString_;
129  }
131  inline const char *card ( ) const {
132  return card_;
133  }
135  inline char *mutableCard ( ) {
136  return card_;
137  }
139  inline void setPosition(char * position)
140  { position_=position;}
142  inline char * getPosition() const
143  { return position_;}
145  inline CoinBigIndex cardNumber ( ) const {
146  return cardNumber_;
147  }
149  inline CoinFileInput * fileInput ( ) const {
150  return input_;
151  }
153  inline void setStringsAllowed()
154  { stringsAllowed_=true;}
156 
158 protected:
159 
162  double value_;
167  char *position_;
169  char *eol_;
199 public:
202  double osi_strtod(char * ptr, char ** output, int type);
205  static void strcpyAndCompress ( char *to, const char *from );
207  static char * nextBlankOr ( char *image );
209  double osi_strtod(char * ptr, char ** output);
211 
212 };
213 
214 //#############################################################################
215 #ifdef USE_SBB
216 class SbbObject;
217 class SbbModel;
218 #endif
219 class CoinSet {
221 
222 public:
223 
226  CoinSet ( );
229  CoinSet ( int numberEntries, const int * which);
230 
232  CoinSet (const CoinSet &);
233 
235  CoinSet & operator=(const CoinSet& rhs);
236 
238  virtual ~CoinSet ( );
240 
241 
244  inline int numberEntries ( ) const
246  { return numberEntries_; }
248  inline int setType ( ) const
249  { return setType_; }
251  inline const int * which ( ) const
252  { return which_; }
254  inline const double * weights ( ) const
255  { return weights_; }
257 
258 #ifdef USE_SBB
259 
261  virtual SbbObject * sbbObject(SbbModel * model) const
263  { return NULL;}
265 #endif
266 
268 protected:
269 
272  int numberEntries_;
275  int setType_;
277  int * which_;
279  double * weights_;
281 };
282 
283 //#############################################################################
285 class CoinSosSet : public CoinSet{
286 
287 public:
288 
291  CoinSosSet ( int numberEntries, const int * which, const double * weights, int type);
293 
295  virtual ~CoinSosSet ( );
297 
298 
299 #ifdef USE_SBB
300 
302  virtual SbbObject * sbbObject(SbbModel * model) const ;
305 #endif
306 
308 protected:
309 
312 
313 };
314 
315 //#############################################################################
316 
328 class CoinMpsIO {
329  friend void CoinMpsIOUnitTest(const std::string & mpsDir);
330 
331 public:
332 
344  int getNumCols() const;
346 
348  int getNumRows() const;
349 
351  int getNumElements() const;
352 
354  const double * getColLower() const;
355 
357  const double * getColUpper() const;
358 
368  const char * getRowSense() const;
369 
381  const double * getRightHandSide() const;
382 
396  const double * getRowRange() const;
397 
399  const double * getRowLower() const;
400 
402  const double * getRowUpper() const;
403 
405  const double * getObjCoefficients() const;
406 
408  const CoinPackedMatrix * getMatrixByRow() const;
409 
411  const CoinPackedMatrix * getMatrixByCol() const;
412 
414  bool isContinuous(int colNumber) const;
415 
421  bool isInteger(int columnNumber) const;
422 
428  const char * integerColumns() const;
429 
434  const char * rowName(int index) const;
435 
440  const char * columnName(int index) const;
441 
448  int rowIndex(const char * name) const;
449 
454  int columnIndex(const char * name) const;
455 
460  double objectiveOffset() const;
462  inline void setObjectiveOffset(double value)
463  { objectiveOffset_=value;}
464 
466  const char * getProblemName() const;
467 
469  const char * getObjectiveName() const;
470 
472  const char * getRhsName() const;
473 
475  const char * getRangeName() const;
476 
478  const char * getBoundName() const;
480  inline int numberStringElements() const
481  { return numberStringElements_;}
483  inline const char * stringElement(int i) const
484  { return stringElements_[i];}
486 
487 
493 
495  void setMpsData(const CoinPackedMatrix& m, const double infinity,
496  const double* collb, const double* colub,
497  const double* obj, const char* integrality,
498  const double* rowlb, const double* rowub,
499  char const * const * const colnames,
500  char const * const * const rownames);
501  void setMpsData(const CoinPackedMatrix& m, const double infinity,
502  const double* collb, const double* colub,
503  const double* obj, const char* integrality,
504  const double* rowlb, const double* rowub,
505  const std::vector<std::string> & colnames,
506  const std::vector<std::string> & rownames);
507  void setMpsData(const CoinPackedMatrix& m, const double infinity,
508  const double* collb, const double* colub,
509  const double* obj, const char* integrality,
510  const char* rowsen, const double* rowrhs,
511  const double* rowrng,
512  char const * const * const colnames,
513  char const * const * const rownames);
514  void setMpsData(const CoinPackedMatrix& m, const double infinity,
515  const double* collb, const double* colub,
516  const double* obj, const char* integrality,
517  const char* rowsen, const double* rowrhs,
518  const double* rowrng,
519  const std::vector<std::string> & colnames,
520  const std::vector<std::string> & rownames);
521 
527  void copyInIntegerInformation(const char * integerInformation);
528 
530  void setProblemName(const char *name) ;
531 
533  void setObjectiveName(const char *name) ;
534 
536 
543  void setInfinity(double value);
545 
547  double getInfinity() const;
548 
550  void setDefaultBound(int value);
551 
553  int getDefaultBound() const;
555  inline int allowStringElements() const
556  { return allowStringElements_;}
558  inline void setAllowStringElements(int yesNo)
559  { allowStringElements_ = yesNo;}
562  inline double getSmallElementValue() const
563  { return smallElement_;}
564  inline void setSmallElementValue(double value)
565  { smallElement_=value;}
567 
568 
587  void setFileName(const char * name);
589 
591  const char * getFileName() const;
592 
597  int readMps(const char *filename, const char *extension = "mps");
598 
604  int readMps(const char *filename, const char *extension ,
605  int & numberSets, CoinSet **& sets);
606 
617  int readMps();
619  int readMps(int & numberSets, CoinSet **& sets);
629  int readBasis(const char *filename, const char *extension ,
630  double * solution, unsigned char *rowStatus, unsigned char *columnStatus,
631  const std::vector<std::string> & colnames,int numberColumns,
632  const std::vector<std::string> & rownames, int numberRows);
633 
639  int readGms(const char *filename, const char *extension = "gms",bool convertObjective=false);
640 
646  int readGms(const char *filename, const char *extension ,
647  int & numberSets, CoinSet **& sets);
648 
655  // Not for now int readGms();
657  int readGms(int & numberSets, CoinSet **& sets);
660  int readGMPL(const char *modelName, const char * dataName=NULL, bool keepNames=false);
661 
687  int writeMps(const char *filename, int compression = 0,
688  int formatType = 0, int numberAcross = 2,
689  CoinPackedMatrix * quadratic = NULL,
690  int numberSOS=0,const CoinSet * setInfo=NULL) const;
691 
693  inline const CoinMpsCardReader * reader() const
694  { return cardReader_;}
695 
723  int readQuadraticMps(const char * filename,
724  int * &columnStart, int * &column, double * &elements,
725  int checkSymmetry);
726 
744  int readConicMps(const char * filename,
745  int * &columnStart, int * &column, int & numberCones);
747  inline void setConvertObjective(bool trueFalse)
748  { convertObjective_=trueFalse;}
750  int copyStringElements(const CoinModel * model);
752 
755  CoinMpsIO();
757 
759  CoinMpsIO (const CoinMpsIO &);
760 
762  CoinMpsIO & operator=(const CoinMpsIO& rhs);
763 
765  ~CoinMpsIO ();
767 
768 
777 
779  void newLanguage(CoinMessages::Language language);
780 
782  inline void setLanguage(CoinMessages::Language language) {newLanguage(language);}
783 
785  inline CoinMessageHandler * messageHandler() const {return handler_;}
786 
788  inline CoinMessages messages() {return messages_;}
790  inline CoinMessages * messagesPointer() {return & messages_;}
792 
793 
805 
807  void releaseRowInformation();
808 
811 
814 
816  void releaseRowNames();
817 
819  void releaseColumnNames();
820 
824 
825 protected:
826 
829 
831  void
833  const CoinPackedMatrix& m, const double infinity,
834  const double* collb, const double* colub,
835  const double* obj, const char* integrality,
836  const double* rowlb, const double* rowub);
837  void
839  const std::vector<std::string> & colnames,
840  const std::vector<std::string> & rownames);
841  void
843  char const * const * const colnames,
844  char const * const * const rownames);
845 
846 
848  void gutsOfDestructor();
849 
851  void gutsOfCopy(const CoinMpsIO &);
852 
854  void freeAll();
855 
856 
859  inline void
860  convertBoundToSense(const double lower, const double upper,
861  char& sense, double& right, double& range) const;
864  inline void
865  convertSenseToBound(const char sense, const double right,
866  const double range,
867  double& lower, double& upper) const;
868 
881  int dealWithFileName(const char * filename, const char * extension,
882  CoinFileInput * &input);
887  void addString(int iRow,int iColumn, const char * value);
889  void decodeString(int iString, int & iRow, int & iColumn, const char * & value) const;
891 
892 
893  // for hashing
894  typedef struct {
895  int index, next;
896  } CoinHashLink;
897 
900  void startHash ( char **names, const int number , int section );
903  void startHash ( int section ) const;
905  void stopHash ( int section );
907  int findHash ( const char *name , int section ) const;
909 
912  char * problemName_;
914 
917 
919  char * rhsName_;
920 
922  char * rangeName_;
923 
925  char * boundName_;
926 
929 
932 
935 
937  mutable char *rowsense_;
938 
940  mutable double *rhs_;
941 
945  mutable double *rowrange_;
946 
949 
952 
954  double * rowlower_;
955 
957  double * rowupper_;
958 
960  double * collower_;
961 
963  double * colupper_;
964 
966  double * objective_;
967 
970 
971 
975  char * integerType_;
976 
980  char **names_[2];
982 
985  char * fileName_;
987 
989  int numberHash_[2];
990 
992  mutable CoinHashLink *hash_[2];
994 
997  int defaultBound_;
999 
1001  double infinity_;
1004 
1028 
1029 };
1030 
1031 //#############################################################################
1039 void
1040 CoinMpsIOUnitTest(const std::string & mpsDir);
1041 // Function to return number in most efficient way
1042 // section is 0 for columns, 1 for rhs,ranges and 2 for bounds
1043 /* formatType is
1044  0 - normal and 8 character names
1045  1 - extra accuracy
1046  2 - IEEE hex - INTEL
1047  3 - IEEE hex - not INTEL
1048 */
1049 void
1050 CoinConvertDouble(int section, int formatType, double value, char outputValue[24]);
1051 
1052 #endif