CoinUtils  2.9.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CoinModel.hpp
Go to the documentation of this file.
1 /* $Id: CoinModel.hpp 1581 2013-04-06 12:48:50Z stefan $ */
2 // Copyright (C) 2005, 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 CoinModel_H
7 #define CoinModel_H
8 
9 #include "CoinModelUseful.hpp"
10 #include "CoinPackedMatrix.hpp"
11 #include "CoinFinite.hpp"
13 
14 public:
15 
16 
19  CoinBaseModel ();
21 
23  CoinBaseModel ( const CoinBaseModel &rhs);
24 
26  CoinBaseModel & operator=( const CoinBaseModel& rhs);
27 
29  virtual CoinBaseModel * clone() const=0;
30 
32  virtual ~CoinBaseModel () ;
34 
37  inline int numberRows() const
39  { return numberRows_;}
41  inline int numberColumns() const
42  { return numberColumns_;}
44  virtual CoinBigIndex numberElements() const = 0;
48  inline double objectiveOffset() const
49  { return objectiveOffset_;}
51  inline void setObjectiveOffset(double value)
52  { objectiveOffset_=value;}
54  inline double optimizationDirection() const {
56  }
58  inline void setOptimizationDirection(double value)
59  { optimizationDirection_=value;}
61  inline int logLevel() const
62  { return logLevel_;}
64  void setLogLevel(int value);
66  inline const char * getProblemName() const
67  { return problemName_.c_str();}
69  void setProblemName(const char *name) ;
71  void setProblemName(const std::string &name) ;
73  inline const std::string & getRowBlock() const
74  { return rowBlockName_;}
76  inline void setRowBlock(const std::string &name)
77  { rowBlockName_ = name;}
79  inline const std::string & getColumnBlock() const
80  { return columnBlockName_;}
82  inline void setColumnBlock(const std::string &name)
83  { columnBlockName_ = name;}
85 
86 protected:
89  int numberRows_;
98  std::string problemName_;
100  std::string rowBlockName_;
102  std::string columnBlockName_;
112 
114 };
115 
152 class CoinModel : public CoinBaseModel {
153 
154 public:
158  void addRow(int numberInRow, const int * columns,
159  const double * elements, double rowLower=-COIN_DBL_MAX,
160  double rowUpper=COIN_DBL_MAX, const char * name=NULL);
162  void addColumn(int numberInColumn, const int * rows,
163  const double * elements,
164  double columnLower=0.0,
165  double columnUpper=COIN_DBL_MAX, double objectiveValue=0.0,
166  const char * name=NULL, bool isInteger=false);
168  inline void addCol(int numberInColumn, const int * rows,
169  const double * elements,
170  double columnLower=0.0,
171  double columnUpper=COIN_DBL_MAX, double objectiveValue=0.0,
172  const char * name=NULL, bool isInteger=false)
173  { addColumn(numberInColumn, rows, elements, columnLower, columnUpper, objectiveValue,
174  name,isInteger);}
176  inline void operator() (int i,int j,double value)
177  { setElement(i,j,value);}
179  void setElement(int i,int j,double value) ;
185  int getRow(int whichRow, int * column, double * element);
191  int getColumn(int whichColumn, int * column, double * element);
193  void setQuadraticElement(int i,int j,double value) ;
195  inline void operator() (int i,int j,const char * value)
196  { setElement(i,j,value);}
198  void setElement(int i,int j,const char * value) ;
200  int associateElement(const char * stringValue, double value);
204  void setRowLower(int whichRow,double rowLower);
208  void setRowUpper(int whichRow,double rowUpper);
212  void setRowBounds(int whichRow,double rowLower,double rowUpper);
216  void setRowName(int whichRow,const char * rowName);
220  void setColumnLower(int whichColumn,double columnLower);
224  void setColumnUpper(int whichColumn,double columnUpper);
228  void setColumnBounds(int whichColumn,double columnLower,double columnUpper);
232  void setColumnObjective(int whichColumn,double columnObjective);
236  void setColumnName(int whichColumn,const char * columnName);
240  void setColumnIsInteger(int whichColumn,bool columnIsInteger);
244  inline void setObjective(int whichColumn,double columnObjective)
245  { setColumnObjective( whichColumn, columnObjective);}
249  inline void setIsInteger(int whichColumn,bool columnIsInteger)
250  { setColumnIsInteger( whichColumn, columnIsInteger);}
254  inline void setInteger(int whichColumn)
255  { setColumnIsInteger( whichColumn, true);}
259  inline void setContinuous(int whichColumn)
260  { setColumnIsInteger( whichColumn, false);}
264  inline void setColLower(int whichColumn,double columnLower)
265  { setColumnLower( whichColumn, columnLower);}
269  inline void setColUpper(int whichColumn,double columnUpper)
270  { setColumnUpper( whichColumn, columnUpper);}
274  inline void setColBounds(int whichColumn,double columnLower,double columnUpper)
275  { setColumnBounds( whichColumn, columnLower, columnUpper);}
279  inline void setColObjective(int whichColumn,double columnObjective)
280  { setColumnObjective( whichColumn, columnObjective);}
284  inline void setColName(int whichColumn,const char * columnName)
285  { setColumnName( whichColumn, columnName);}
289  inline void setColIsInteger(int whichColumn,bool columnIsInteger)
290  { setColumnIsInteger( whichColumn, columnIsInteger);}
294  void setRowLower(int whichRow,const char * rowLower);
298  void setRowUpper(int whichRow,const char * rowUpper);
302  void setColumnLower(int whichColumn,const char * columnLower);
306  void setColumnUpper(int whichColumn,const char * columnUpper);
310  void setColumnObjective(int whichColumn,const char * columnObjective);
314  void setColumnIsInteger(int whichColumn,const char * columnIsInteger);
318  inline void setObjective(int whichColumn,const char * columnObjective)
319  { setColumnObjective( whichColumn, columnObjective);}
323  inline void setIsInteger(int whichColumn,const char * columnIsInteger)
324  { setColumnIsInteger( whichColumn, columnIsInteger);}
327  void deleteRow(int whichRow);
330  void deleteColumn(int whichColumn);
333  inline void deleteCol(int whichColumn)
334  { deleteColumn(whichColumn);}
336  int deleteElement(int row, int column);
338  void deleteThisElement(int row, int column,int position);
341  int packRows();
344  int packColumns();
347  inline int packCols()
348  { return packColumns();}
353  int pack();
354 
357  void setObjective(int numberColumns,const double * objective) ;
360  void setColumnLower(int numberColumns,const double * columnLower);
363  inline void setColLower(int numberColumns,const double * columnLower)
364  { setColumnLower( numberColumns, columnLower);}
367  void setColumnUpper(int numberColumns,const double * columnUpper);
370  inline void setColUpper(int numberColumns,const double * columnUpper)
371  { setColumnUpper( numberColumns, columnUpper);}
374  void setRowLower(int numberRows,const double * rowLower);
377  void setRowUpper(int numberRows,const double * rowUpper);
378 
404  int writeMps(const char *filename, int compression = 0,
405  int formatType = 0, int numberAcross = 2, bool keepStrings=false) ;
406 
411  int differentModel(CoinModel & other, bool ignoreNames);
413 
414 
417  void passInMatrix(const CoinPackedMatrix & matrix);
421  int convertMatrix();
423  inline const CoinPackedMatrix * packedMatrix() const
424  { return packedMatrix_;}
426  inline const int * originalRows() const
427  { return rowType_;}
429  inline const int * originalColumns() const
430  { return columnType_;}
432 
433 
436  inline CoinBigIndex numberElements() const
438  { return numberElements_;}
440  inline const CoinModelTriple * elements() const
441  { return elements_;}
443  inline double operator() (int i,int j) const
444  { return getElement(i,j);}
446  double getElement(int i,int j) const;
448  inline double operator() (const char * rowName,const char * columnName) const
449  { return getElement(rowName,columnName);}
451  double getElement(const char * rowName,const char * columnName) const;
453  double getQuadraticElement(int i,int j) const;
458  const char * getElementAsString(int i,int j) const;
462  double * pointer (int i,int j) const;
466  int position (int i,int j) const;
467 
468 
472  CoinModelLink firstInRow(int whichRow) const ;
476  CoinModelLink lastInRow(int whichRow) const ;
480  CoinModelLink firstInColumn(int whichColumn) const ;
484  CoinModelLink lastInColumn(int whichColumn) const ;
489  CoinModelLink next(CoinModelLink & current) const ;
495  CoinModelLink previous(CoinModelLink & current) const ;
500  CoinModelLink firstInQuadraticColumn(int whichColumn) const ;
504  CoinModelLink lastInQuadraticColumn(int whichColumn) const ;
507  double getRowLower(int whichRow) const ;
510  double getRowUpper(int whichRow) const ;
513  const char * getRowName(int whichRow) const ;
514  inline double rowLower(int whichRow) const
515  { return getRowLower(whichRow);}
518  inline double rowUpper(int whichRow) const
519  { return getRowUpper(whichRow) ;}
522  inline const char * rowName(int whichRow) const
523  { return getRowName(whichRow);}
526  double getColumnLower(int whichColumn) const ;
529  double getColumnUpper(int whichColumn) const ;
532  double getColumnObjective(int whichColumn) const ;
535  const char * getColumnName(int whichColumn) const ;
538  bool getColumnIsInteger(int whichColumn) const ;
541  inline double columnLower(int whichColumn) const
542  { return getColumnLower(whichColumn);}
545  inline double columnUpper(int whichColumn) const
546  { return getColumnUpper(whichColumn) ;}
549  inline double columnObjective(int whichColumn) const
550  { return getColumnObjective(whichColumn);}
553  inline double objective(int whichColumn) const
554  { return getColumnObjective(whichColumn);}
557  inline const char * columnName(int whichColumn) const
558  { return getColumnName(whichColumn);}
561  inline bool columnIsInteger(int whichColumn) const
562  { return getColumnIsInteger(whichColumn);}
565  inline bool isInteger(int whichColumn) const
566  { return getColumnIsInteger(whichColumn);}
569  inline double getColLower(int whichColumn) const
570  { return getColumnLower(whichColumn);}
573  inline double getColUpper(int whichColumn) const
574  { return getColumnUpper(whichColumn) ;}
577  inline double getColObjective(int whichColumn) const
578  { return getColumnObjective(whichColumn);}
581  inline const char * getColName(int whichColumn) const
582  { return getColumnName(whichColumn);}
585  inline bool getColIsInteger(int whichColumn) const
586  { return getColumnIsInteger(whichColumn);}
589  const char * getRowLowerAsString(int whichRow) const ;
592  const char * getRowUpperAsString(int whichRow) const ;
593  inline const char * rowLowerAsString(int whichRow) const
594  { return getRowLowerAsString(whichRow);}
597  inline const char * rowUpperAsString(int whichRow) const
598  { return getRowUpperAsString(whichRow) ;}
601  const char * getColumnLowerAsString(int whichColumn) const ;
604  const char * getColumnUpperAsString(int whichColumn) const ;
607  const char * getColumnObjectiveAsString(int whichColumn) const ;
610  const char * getColumnIsIntegerAsString(int whichColumn) const ;
613  inline const char * columnLowerAsString(int whichColumn) const
614  { return getColumnLowerAsString(whichColumn);}
617  inline const char * columnUpperAsString(int whichColumn) const
618  { return getColumnUpperAsString(whichColumn) ;}
621  inline const char * columnObjectiveAsString(int whichColumn) const
622  { return getColumnObjectiveAsString(whichColumn);}
625  inline const char * objectiveAsString(int whichColumn) const
626  { return getColumnObjectiveAsString(whichColumn);}
629  inline const char * columnIsIntegerAsString(int whichColumn) const
630  { return getColumnIsIntegerAsString(whichColumn);}
633  inline const char * isIntegerAsString(int whichColumn) const
634  { return getColumnIsIntegerAsString(whichColumn);}
636  int row(const char * rowName) const;
638  int column(const char * columnName) const;
640  inline int type() const
641  { return type_;}
643  inline double unsetValue() const
644  { return -1.23456787654321e-97;}
646  int createPackedMatrix(CoinPackedMatrix & matrix,
647  const double * associated);
653  int countPlusMinusOne(CoinBigIndex * startPositive, CoinBigIndex * startNegative,
654  const double * associated);
657  void createPlusMinusOne(CoinBigIndex * startPositive, CoinBigIndex * startNegative,
658  int * indices,
659  const double * associated);
661  int createArrays(double * & rowLower, double * & rowUpper,
662  double * & columnLower, double * & columnUpper,
663  double * & objective, int * & integerType,
664  double * & associated);
666  inline bool stringsExist() const
667  { return string_.numberItems()!=0;}
669  inline const CoinModelHash * stringArray() const
670  { return &string_;}
672  inline double * associatedArray() const
673  { return associated_;}
675  inline double * rowLowerArray() const
676  { return rowLower_;}
678  inline double * rowUpperArray() const
679  { return rowUpper_;}
681  inline double * columnLowerArray() const
682  { return columnLower_;}
684  inline double * columnUpperArray() const
685  { return columnUpper_;}
687  inline double * objectiveArray() const
688  { return objective_;}
690  inline int * integerTypeArray() const
691  { return integerType_;}
693  inline const CoinModelHash * rowNames() const
694  { return &rowName_;}
696  inline const CoinModelHash * columnNames() const
697  { return &columnName_;}
699  inline void zapRowNames()
700  { rowName_=CoinModelHash();}
702  inline void zapColumnNames()
705  inline const int * cutMarker() const
706  { return cut_;}
708  inline double optimizationDirection() const {
709  return optimizationDirection_;
710  }
712  inline void setOptimizationDirection(double value)
713  { optimizationDirection_=value;}
715  inline void * moreInfo() const
716  { return moreInfo_;}
718  inline void setMoreInfo(void * info)
719  { moreInfo_ = info;}
728  int whatIsSet() const;
730 
748  void loadBlock (const CoinPackedMatrix& matrix,
749  const double* collb, const double* colub,
750  const double* obj,
751  const double* rowlb, const double* rowub) ;
768  void loadBlock (const CoinPackedMatrix& matrix,
769  const double* collb, const double* colub,
770  const double* obj,
771  const char* rowsen, const double* rowrhs,
772  const double* rowrng) ;
773 
786  void loadBlock (const int numcols, const int numrows,
787  const CoinBigIndex * start, const int* index,
788  const double* value,
789  const double* collb, const double* colub,
790  const double* obj,
791  const double* rowlb, const double* rowub) ;
792 
805  void loadBlock (const int numcols, const int numrows,
806  const CoinBigIndex * start, const int* index,
807  const double* value,
808  const double* collb, const double* colub,
809  const double* obj,
810  const char* rowsen, const double* rowrhs,
811  const double* rowrng) ;
812 
814 
818  CoinModel();
820  CoinModel(int firstRows, int firstColumns, int firstElements,bool noNames=false);
823  CoinModel(const char *fileName, int allowStrings=0);
827  CoinModel( int nonLinear, const char * fileName,const void * info);
830  const CoinPackedMatrix * matrix,
831  const double * rowLower, const double * rowUpper,
832  const double * columnLower, const double * columnUpper,
833  const double * objective);
835  virtual CoinBaseModel * clone() const;
836 
838  virtual ~CoinModel();
840 
844  CoinModel(const CoinModel&);
846  CoinModel& operator=(const CoinModel&);
848 
851  void validateLinks() const;
854 private:
856  void resize(int maximumRows, int maximumColumns, int maximumElements);
858  void fillRows(int which,bool forceCreation,bool fromAddRow=false);
860  void fillColumns(int which,bool forceCreation,bool fromAddColumn=false);
863  void fillList(int which, CoinModelLinkedList & list,int type) const ;
867  void createList(int type) const;
869  int addString(const char * string);
873  double getDoubleFromString(CoinYacc & info, const char * string);
875  void freeStringMemory(CoinYacc & info);
876 public:
878  int computeAssociated(double * associated);
884  CoinPackedMatrix * quadraticRow(int rowNumber,double * linear,
885  int & numberBad) const;
887  void replaceQuadraticRow(int rowNumber,const double * linear, const CoinPackedMatrix * quadraticPart);
892  CoinModel * reorder(const char * mark) const;
903  int expandKnapsack(int knapsackRow, int & numberOutput,double * buildObj, CoinBigIndex * buildStart,
904  int * buildRow, double * buildElement,int reConstruct=-1) const;
906  void setCutMarker(int size,const int * marker);
908  void setPriorities(int size,const int * priorities);
910  inline const int * priorities() const
911  { return priority_;}
913  void setOriginalIndices(const int * row, const int * column);
914 
915 private:
919  void gdb( int nonLinear, const char * fileName, const void * info);
921  int decodeBit(char * phrase, char * & nextPhrase, double & coefficient, bool ifFirst) const;
923  void badType() const;
926  int maximumRows_;
939  double * rowLower_;
941  double * rowUpper_;
951  int * rowType_;
953  double * objective_;
955  double * columnLower_;
957  double * columnUpper_;
973  int * columnType_;
975  int * start_;
993  double * sortElements_;
1003  double * associated_;
1007  int * startSOS_;
1009  int * memberSOS_;
1011  int * typeSOS_;
1015  double * referenceSOS_;
1017  int * priority_;
1019  int * cut_;
1021  void * moreInfo_;
1029  mutable int type_;
1031  bool noNames_;
1038  mutable int links_;
1040 };
1042 double getFunctionValueFromString(const char * string, const char * x, double xValue);
1044 double getDoubleFromString(CoinYacc & info, const char * string, const char * x, double xValue);
1045 #endif