CoinModel.hpp
Go to the documentation of this file.
1 /* $Id: CoinModel.hpp 1215 2009-11-05 11:03:04Z forrest $ */
2 // Copyright (C) 2005, International Business Machines
3 // Corporation and others. All Rights Reserved.
4 #ifndef CoinModel_H
5 #define CoinModel_H
6 
7 #include "CoinModelUseful.hpp"
8 #include "CoinPackedMatrix.hpp"
9 class CoinBaseModel {
10 
11 public:
12 
13 
16 
17  CoinBaseModel ();
18 
20  CoinBaseModel ( const CoinBaseModel &rhs);
21 
23  CoinBaseModel & operator=( const CoinBaseModel& rhs);
24 
26  virtual CoinBaseModel * clone() const=0;
27 
29  virtual ~CoinBaseModel () ;
31 
34 
35  inline int numberRows() const
36  { return numberRows_;}
38  inline int numberColumns() const
39  { return numberColumns_;}
41  virtual CoinBigIndex numberElements() const = 0;
45  inline double objectiveOffset() const
46  { return objectiveOffset_;}
48  inline void setObjectiveOffset(double value)
49  { objectiveOffset_=value;}
51  inline double optimizationDirection() const {
53  }
55  inline void setOptimizationDirection(double value)
56  { optimizationDirection_=value;}
58  inline int logLevel() const
59  { return logLevel_;}
61  void setLogLevel(int value);
63  inline const char * getProblemName() const
64  { return problemName_.c_str();}
66  void setProblemName(const char *name) ;
68  void setProblemName(const std::string &name) ;
70  inline const std::string & getRowBlock() const
71  { return rowBlockName_;}
73  inline void setRowBlock(const std::string &name)
74  { rowBlockName_ = name;}
76  inline const std::string & getColumnBlock() const
77  { return columnBlockName_;}
79  inline void setColumnBlock(const std::string &name)
80  { columnBlockName_ = name;}
82 
83 protected:
86 
95  std::string problemName_;
97  std::string rowBlockName_;
99  std::string columnBlockName_;
109 
110 
111 };
112 
149 class CoinModel : public CoinBaseModel {
150 
151 public:
155  void addRow(int numberInRow, const int * columns,
156  const double * elements, double rowLower=-COIN_DBL_MAX,
157  double rowUpper=COIN_DBL_MAX, const char * name=NULL);
159  void addColumn(int numberInColumn, const int * rows,
160  const double * elements,
161  double columnLower=0.0,
162  double columnUpper=COIN_DBL_MAX, double objectiveValue=0.0,
163  const char * name=NULL, bool isInteger=false);
165  inline void addCol(int numberInColumn, const int * rows,
166  const double * elements,
167  double columnLower=0.0,
168  double columnUpper=COIN_DBL_MAX, double objectiveValue=0.0,
169  const char * name=NULL, bool isInteger=false)
170  { addColumn(numberInColumn, rows, elements, columnLower, columnUpper, objectiveValue,
171  name,isInteger);}
173  inline void operator() (int i,int j,double value)
174  { setElement(i,j,value);}
176  void setElement(int i,int j,double value) ;
182  int getRow(int whichRow, int * column, double * element);
188  int getColumn(int whichColumn, int * column, double * element);
190  void setQuadraticElement(int i,int j,double value) ;
192  inline void operator() (int i,int j,const char * value)
193  { setElement(i,j,value);}
195  void setElement(int i,int j,const char * value) ;
197  int associateElement(const char * stringValue, double value);
201  void setRowLower(int whichRow,double rowLower);
205  void setRowUpper(int whichRow,double rowUpper);
209  void setRowBounds(int whichRow,double rowLower,double rowUpper);
213  void setRowName(int whichRow,const char * rowName);
217  void setColumnLower(int whichColumn,double columnLower);
221  void setColumnUpper(int whichColumn,double columnUpper);
225  void setColumnBounds(int whichColumn,double columnLower,double columnUpper);
229  void setColumnObjective(int whichColumn,double columnObjective);
233  void setColumnName(int whichColumn,const char * columnName);
237  void setColumnIsInteger(int whichColumn,bool columnIsInteger);
241  inline void setObjective(int whichColumn,double columnObjective)
242  { setColumnObjective( whichColumn, columnObjective);}
246  inline void setIsInteger(int whichColumn,bool columnIsInteger)
247  { setColumnIsInteger( whichColumn, columnIsInteger);}
251  inline void setInteger(int whichColumn)
252  { setColumnIsInteger( whichColumn, true);}
256  inline void setContinuous(int whichColumn)
257  { setColumnIsInteger( whichColumn, false);}
261  inline void setColLower(int whichColumn,double columnLower)
262  { setColumnLower( whichColumn, columnLower);}
266  inline void setColUpper(int whichColumn,double columnUpper)
267  { setColumnUpper( whichColumn, columnUpper);}
271  inline void setColBounds(int whichColumn,double columnLower,double columnUpper)
272  { setColumnBounds( whichColumn, columnLower, columnUpper);}
276  inline void setColObjective(int whichColumn,double columnObjective)
277  { setColumnObjective( whichColumn, columnObjective);}
281  inline void setColName(int whichColumn,const char * columnName)
282  { setColumnName( whichColumn, columnName);}
286  inline void setColIsInteger(int whichColumn,bool columnIsInteger)
287  { setColumnIsInteger( whichColumn, columnIsInteger);}
291  void setRowLower(int whichRow,const char * rowLower);
295  void setRowUpper(int whichRow,const char * rowUpper);
299  void setColumnLower(int whichColumn,const char * columnLower);
303  void setColumnUpper(int whichColumn,const char * columnUpper);
307  void setColumnObjective(int whichColumn,const char * columnObjective);
311  void setColumnIsInteger(int whichColumn,const char * columnIsInteger);
315  inline void setObjective(int whichColumn,const char * columnObjective)
316  { setColumnObjective( whichColumn, columnObjective);}
320  inline void setIsInteger(int whichColumn,const char * columnIsInteger)
321  { setColumnIsInteger( whichColumn, columnIsInteger);}
324  void deleteRow(int whichRow);
327  void deleteColumn(int whichColumn);
330  inline void deleteCol(int whichColumn)
331  { deleteColumn(whichColumn);}
333  int deleteElement(int row, int column);
335  void deleteThisElement(int row, int column,int position);
338  int packRows();
341  int packColumns();
344  inline int packCols()
345  { return packColumns();}
350  int pack();
351 
354  void setObjective(int numberColumns,const double * objective) ;
357  void setColumnLower(int numberColumns,const double * columnLower);
360  inline void setColLower(int numberColumns,const double * columnLower)
361  { setColumnLower( numberColumns, columnLower);}
364  void setColumnUpper(int numberColumns,const double * columnUpper);
367  inline void setColUpper(int numberColumns,const double * columnUpper)
368  { setColumnUpper( numberColumns, columnUpper);}
371  void setRowLower(int numberRows,const double * rowLower);
374  void setRowUpper(int numberRows,const double * rowUpper);
375 
401  int writeMps(const char *filename, int compression = 0,
402  int formatType = 0, int numberAcross = 2, bool keepStrings=false) ;
403 
408  int differentModel(CoinModel & other, bool ignoreNames);
410 
411 
414 
415  void passInMatrix(const CoinPackedMatrix & matrix);
418  int convertMatrix();
420  inline const CoinPackedMatrix * packedMatrix() const
421  { return packedMatrix_;}
423  inline const int * originalRows() const
424  { return rowType_;}
426  inline const int * originalColumns() const
427  { return columnType_;}
429 
430 
433 
435  { return numberElements_;}
437  inline const CoinModelTriple * elements() const
438  { return elements_;}
440  inline double operator() (int i,int j) const
441  { return getElement(i,j);}
443  double getElement(int i,int j) const;
445  inline double operator() (const char * rowName,const char * columnName) const
446  { return getElement(rowName,columnName);}
448  double getElement(const char * rowName,const char * columnName) const;
450  double getQuadraticElement(int i,int j) const;
455  const char * getElementAsString(int i,int j) const;
459  double * pointer (int i,int j) const;
463  int position (int i,int j) const;
464 
465 
469  CoinModelLink firstInRow(int whichRow) const ;
473  CoinModelLink lastInRow(int whichRow) const ;
477  CoinModelLink firstInColumn(int whichColumn) const ;
481  CoinModelLink lastInColumn(int whichColumn) const ;
486  CoinModelLink next(CoinModelLink & current) const ;
492  CoinModelLink previous(CoinModelLink & current) const ;
497  CoinModelLink firstInQuadraticColumn(int whichColumn) const ;
501  CoinModelLink lastInQuadraticColumn(int whichColumn) const ;
504  double getRowLower(int whichRow) const ;
507  double getRowUpper(int whichRow) const ;
510  const char * getRowName(int whichRow) const ;
511  inline double rowLower(int whichRow) const
512  { return getRowLower(whichRow);}
515  inline double rowUpper(int whichRow) const
516  { return getRowUpper(whichRow) ;}
519  inline const char * rowName(int whichRow) const
520  { return getRowName(whichRow);}
523  double getColumnLower(int whichColumn) const ;
526  double getColumnUpper(int whichColumn) const ;
529  double getColumnObjective(int whichColumn) const ;
532  const char * getColumnName(int whichColumn) const ;
535  bool getColumnIsInteger(int whichColumn) const ;
538  inline double columnLower(int whichColumn) const
539  { return getColumnLower(whichColumn);}
542  inline double columnUpper(int whichColumn) const
543  { return getColumnUpper(whichColumn) ;}
546  inline double columnObjective(int whichColumn) const
547  { return getColumnObjective(whichColumn);}
550  inline double objective(int whichColumn) const
551  { return getColumnObjective(whichColumn);}
554  inline const char * columnName(int whichColumn) const
555  { return getColumnName(whichColumn);}
558  inline bool columnIsInteger(int whichColumn) const
559  { return getColumnIsInteger(whichColumn);}
562  inline bool isInteger(int whichColumn) const
563  { return getColumnIsInteger(whichColumn);}
566  inline double getColLower(int whichColumn) const
567  { return getColumnLower(whichColumn);}
570  inline double getColUpper(int whichColumn) const
571  { return getColumnUpper(whichColumn) ;}
574  inline double getColObjective(int whichColumn) const
575  { return getColumnObjective(whichColumn);}
578  inline const char * getColName(int whichColumn) const
579  { return getColumnName(whichColumn);}
582  inline bool getColIsInteger(int whichColumn) const
583  { return getColumnIsInteger(whichColumn);}
586  const char * getRowLowerAsString(int whichRow) const ;
589  const char * getRowUpperAsString(int whichRow) const ;
590  inline const char * rowLowerAsString(int whichRow) const
591  { return getRowLowerAsString(whichRow);}
594  inline const char * rowUpperAsString(int whichRow) const
595  { return getRowUpperAsString(whichRow) ;}
598  const char * getColumnLowerAsString(int whichColumn) const ;
601  const char * getColumnUpperAsString(int whichColumn) const ;
604  const char * getColumnObjectiveAsString(int whichColumn) const ;
607  const char * getColumnIsIntegerAsString(int whichColumn) const ;
610  inline const char * columnLowerAsString(int whichColumn) const
611  { return getColumnLowerAsString(whichColumn);}
614  inline const char * columnUpperAsString(int whichColumn) const
615  { return getColumnUpperAsString(whichColumn) ;}
618  inline const char * columnObjectiveAsString(int whichColumn) const
619  { return getColumnObjectiveAsString(whichColumn);}
622  inline const char * objectiveAsString(int whichColumn) const
623  { return getColumnObjectiveAsString(whichColumn);}
626  inline const char * columnIsIntegerAsString(int whichColumn) const
627  { return getColumnIsIntegerAsString(whichColumn);}
630  inline const char * isIntegerAsString(int whichColumn) const
631  { return getColumnIsIntegerAsString(whichColumn);}
633  int row(const char * rowName) const;
635  int column(const char * columnName) const;
637  inline int type() const
638  { return type_;}
640  inline double unsetValue() const
641  { return -1.23456787654321e-97;}
643  int createPackedMatrix(CoinPackedMatrix & matrix,
644  const double * associated);
650  int countPlusMinusOne(CoinBigIndex * startPositive, CoinBigIndex * startNegative,
651  const double * associated);
654  void createPlusMinusOne(CoinBigIndex * startPositive, CoinBigIndex * startNegative,
655  int * indices,
656  const double * associated);
658  int createArrays(double * & rowLower, double * & rowUpper,
659  double * & columnLower, double * & columnUpper,
660  double * & objective, int * & integerType,
661  double * & associated);
663  inline bool stringsExist() const
664  { return string_.numberItems()!=0;}
666  inline const CoinModelHash * stringArray() const
667  { return &string_;}
669  inline double * associatedArray() const
670  { return associated_;}
672  inline double * rowLowerArray() const
673  { return rowLower_;}
675  inline double * rowUpperArray() const
676  { return rowUpper_;}
678  inline double * columnLowerArray() const
679  { return columnLower_;}
681  inline double * columnUpperArray() const
682  { return columnUpper_;}
684  inline double * objectiveArray() const
685  { return objective_;}
687  inline int * integerTypeArray() const
688  { return integerType_;}
690  inline const CoinModelHash * rowNames() const
691  { return &rowName_;}
693  inline const CoinModelHash * columnNames() const
694  { return &columnName_;}
696  inline const int * cutMarker() const
697  { return cut_;}
699  inline double optimizationDirection() const {
700  return optimizationDirection_;
701  }
703  inline void setOptimizationDirection(double value)
704  { optimizationDirection_=value;}
706  inline void * moreInfo() const
707  { return moreInfo_;}
709  inline void setMoreInfo(void * info)
710  { moreInfo_ = info;}
719  int whatIsSet() const;
721 
739  void loadBlock (const CoinPackedMatrix& matrix,
740  const double* collb, const double* colub,
741  const double* obj,
742  const double* rowlb, const double* rowub) ;
759  void loadBlock (const CoinPackedMatrix& matrix,
760  const double* collb, const double* colub,
761  const double* obj,
762  const char* rowsen, const double* rowrhs,
763  const double* rowrng) ;
764 
777  void loadBlock (const int numcols, const int numrows,
778  const CoinBigIndex * start, const int* index,
779  const double* value,
780  const double* collb, const double* colub,
781  const double* obj,
782  const double* rowlb, const double* rowub) ;
783 
796  void loadBlock (const int numcols, const int numrows,
797  const CoinBigIndex * start, const int* index,
798  const double* value,
799  const double* collb, const double* colub,
800  const double* obj,
801  const char* rowsen, const double* rowrhs,
802  const double* rowrng) ;
803 
805 
809  CoinModel();
812  CoinModel(const char *fileName, int allowStrings=0);
816  CoinModel( int nonLinear, const char * fileName,const void * info);
819  const CoinPackedMatrix * matrix,
820  const double * rowLower, const double * rowUpper,
821  const double * columnLower, const double * columnUpper,
822  const double * objective);
824  virtual CoinBaseModel * clone() const;
825 
827  virtual ~CoinModel();
829 
833  CoinModel(const CoinModel&);
835  CoinModel& operator=(const CoinModel&);
837 
840 
841  void validateLinks() const;
843 private:
845  void resize(int maximumRows, int maximumColumns, int maximumElements);
847  void fillRows(int which,bool forceCreation,bool fromAddRow=false);
849  void fillColumns(int which,bool forceCreation,bool fromAddColumn=false);
852  void fillList(int which, CoinModelLinkedList & list,int type) const ;
856  void createList(int type) const;
858  int addString(const char * string);
862  double getDoubleFromString(CoinYacc & info, const char * string);
864  void freeStringMemory(CoinYacc & info);
865 public:
867  int computeAssociated(double * associated);
873  CoinPackedMatrix * quadraticRow(int rowNumber,double * linear,
874  int & numberBad) const;
876  void replaceQuadraticRow(int rowNumber,const double * linear, const CoinPackedMatrix * quadraticPart);
881  CoinModel * reorder(const char * mark) const;
892  int expandKnapsack(int knapsackRow, int & numberOutput,double * buildObj, CoinBigIndex * buildStart,
893  int * buildRow, double * buildElement,int reConstruct=-1) const;
895  void setCutMarker(int size,const int * marker);
897  void setPriorities(int size,const int * priorities);
899  inline const int * priorities() const
900  { return priority_;}
902  void setOriginalIndices(const int * row, const int * column);
903 
904 private:
908  void gdb( int nonLinear, const char * fileName, const void * info);
910  int decodeBit(char * phrase, char * & nextPhrase, double & coefficient, bool ifFirst) const;
912  void badType() const;
915 
928  double * rowLower_;
930  double * rowUpper_;
940  int * rowType_;
942  double * objective_;
944  double * columnLower_;
946  double * columnUpper_;
962  int * columnType_;
964  int * start_;
982  double * sortElements_;
992  double * associated_;
996  int * startSOS_;
998  int * memberSOS_;
1000  int * typeSOS_;
1004  double * referenceSOS_;
1006  int * priority_;
1008  int * cut_;
1010  void * moreInfo_;
1018  mutable int type_;
1025  mutable int links_;
1027 };
1029 double getFunctionValueFromString(const char * string, const char * x, double xValue);
1031 double getDoubleFromString(CoinYacc & info, const char * string, const char * x, double xValue);
1032 #endif