00001
00002
00003
00004
00005
00006 #ifndef CoinModel_H
00007 #define CoinModel_H
00008
00009 #include "CoinModelUseful.hpp"
00010 #include "CoinMessageHandler.hpp"
00011 #include "CoinPackedMatrix.hpp"
00012 #include "CoinFinite.hpp"
00013 class CoinBaseModel {
00014
00015 public:
00016
00017
00020
00021 CoinBaseModel ();
00022
00024 CoinBaseModel ( const CoinBaseModel &rhs);
00025
00027 CoinBaseModel & operator=( const CoinBaseModel& rhs);
00028
00030 virtual CoinBaseModel * clone() const=0;
00031
00033 virtual ~CoinBaseModel () ;
00035
00038
00039 inline int numberRows() const
00040 { return numberRows_;}
00042 inline int numberColumns() const
00043 { return numberColumns_;}
00045 virtual CoinBigIndex numberElements() const = 0;
00049 inline double objectiveOffset() const
00050 { return objectiveOffset_;}
00052 inline void setObjectiveOffset(double value)
00053 { objectiveOffset_=value;}
00055 inline double optimizationDirection() const {
00056 return optimizationDirection_;
00057 }
00059 inline void setOptimizationDirection(double value)
00060 { optimizationDirection_=value;}
00062 inline int logLevel() const
00063 { return logLevel_;}
00065 void setLogLevel(int value);
00067 inline const char * getProblemName() const
00068 { return problemName_.c_str();}
00070 void setProblemName(const char *name) ;
00072 void setProblemName(const std::string &name) ;
00074 inline const std::string & getRowBlock() const
00075 { return rowBlockName_;}
00077 inline void setRowBlock(const std::string &name)
00078 { rowBlockName_ = name;}
00080 inline const std::string & getColumnBlock() const
00081 { return columnBlockName_;}
00083 inline void setColumnBlock(const std::string &name)
00084 { columnBlockName_ = name;}
00086 void setMessageHandler(CoinMessageHandler * handler);
00088
00089 protected:
00092
00093 int numberRows_;
00095 int numberColumns_;
00097 double optimizationDirection_;
00099 double objectiveOffset_;
00101 std::string problemName_;
00103 std::string rowBlockName_;
00105 std::string columnBlockName_;
00107 CoinMessageHandler * handler_;
00109 CoinMessages messages_;
00110
00119 int logLevel_;
00121
00122
00123 };
00124
00161 class CoinModel : public CoinBaseModel {
00162
00163 public:
00167 void addRow(int numberInRow, const int * columns,
00168 const double * elements, double rowLower=-COIN_DBL_MAX,
00169 double rowUpper=COIN_DBL_MAX, const char * name=NULL);
00171 void addColumn(int numberInColumn, const int * rows,
00172 const double * elements,
00173 double columnLower=0.0,
00174 double columnUpper=COIN_DBL_MAX, double objectiveValue=0.0,
00175 const char * name=NULL, bool isInteger=false);
00177 inline void addCol(int numberInColumn, const int * rows,
00178 const double * elements,
00179 double columnLower=0.0,
00180 double columnUpper=COIN_DBL_MAX, double objectiveValue=0.0,
00181 const char * name=NULL, bool isInteger=false)
00182 { addColumn(numberInColumn, rows, elements, columnLower, columnUpper, objectiveValue,
00183 name,isInteger);}
00185 inline void operator() (int i,int j,double value)
00186 { setElement(i,j,value);}
00188 void setElement(int i,int j,double value) ;
00194 int getRow(int whichRow, int * column, double * element);
00200 int getColumn(int whichColumn, int * column, double * element);
00202 void setQuadraticElement(int i,int j,double value) ;
00204 inline void operator() (int i,int j,const char * value)
00205 { setElement(i,j,value);}
00207 void setElement(int i,int j,const char * value) ;
00209 int associateElement(const char * stringValue, double value);
00213 void setRowLower(int whichRow,double rowLower);
00217 void setRowUpper(int whichRow,double rowUpper);
00221 void setRowBounds(int whichRow,double rowLower,double rowUpper);
00225 void setRowName(int whichRow,const char * rowName);
00229 void setColumnLower(int whichColumn,double columnLower);
00233 void setColumnUpper(int whichColumn,double columnUpper);
00237 void setColumnBounds(int whichColumn,double columnLower,double columnUpper);
00241 void setColumnObjective(int whichColumn,double columnObjective);
00245 void setColumnName(int whichColumn,const char * columnName);
00249 void setColumnIsInteger(int whichColumn,bool columnIsInteger);
00253 inline void setObjective(int whichColumn,double columnObjective)
00254 { setColumnObjective( whichColumn, columnObjective);}
00258 inline void setIsInteger(int whichColumn,bool columnIsInteger)
00259 { setColumnIsInteger( whichColumn, columnIsInteger);}
00263 inline void setInteger(int whichColumn)
00264 { setColumnIsInteger( whichColumn, true);}
00268 inline void setContinuous(int whichColumn)
00269 { setColumnIsInteger( whichColumn, false);}
00273 inline void setColLower(int whichColumn,double columnLower)
00274 { setColumnLower( whichColumn, columnLower);}
00278 inline void setColUpper(int whichColumn,double columnUpper)
00279 { setColumnUpper( whichColumn, columnUpper);}
00283 inline void setColBounds(int whichColumn,double columnLower,double columnUpper)
00284 { setColumnBounds( whichColumn, columnLower, columnUpper);}
00288 inline void setColObjective(int whichColumn,double columnObjective)
00289 { setColumnObjective( whichColumn, columnObjective);}
00293 inline void setColName(int whichColumn,const char * columnName)
00294 { setColumnName( whichColumn, columnName);}
00298 inline void setColIsInteger(int whichColumn,bool columnIsInteger)
00299 { setColumnIsInteger( whichColumn, columnIsInteger);}
00303 void setRowLower(int whichRow,const char * rowLower);
00307 void setRowUpper(int whichRow,const char * rowUpper);
00311 void setColumnLower(int whichColumn,const char * columnLower);
00315 void setColumnUpper(int whichColumn,const char * columnUpper);
00319 void setColumnObjective(int whichColumn,const char * columnObjective);
00323 void setColumnIsInteger(int whichColumn,const char * columnIsInteger);
00327 inline void setObjective(int whichColumn,const char * columnObjective)
00328 { setColumnObjective( whichColumn, columnObjective);}
00332 inline void setIsInteger(int whichColumn,const char * columnIsInteger)
00333 { setColumnIsInteger( whichColumn, columnIsInteger);}
00336 void deleteRow(int whichRow);
00339 void deleteColumn(int whichColumn);
00342 inline void deleteCol(int whichColumn)
00343 { deleteColumn(whichColumn);}
00345 int deleteElement(int row, int column);
00347 void deleteThisElement(int row, int column,int position);
00350 int packRows();
00353 int packColumns();
00356 inline int packCols()
00357 { return packColumns();}
00362 int pack();
00363
00366 void setObjective(int numberColumns,const double * objective) ;
00369 void setColumnLower(int numberColumns,const double * columnLower);
00372 inline void setColLower(int numberColumns,const double * columnLower)
00373 { setColumnLower( numberColumns, columnLower);}
00376 void setColumnUpper(int numberColumns,const double * columnUpper);
00379 inline void setColUpper(int numberColumns,const double * columnUpper)
00380 { setColumnUpper( numberColumns, columnUpper);}
00383 void setRowLower(int numberRows,const double * rowLower);
00386 void setRowUpper(int numberRows,const double * rowUpper);
00387
00413 int writeMps(const char *filename, int compression = 0,
00414 int formatType = 0, int numberAcross = 2, bool keepStrings=false) ;
00415
00420 int differentModel(CoinModel & other, bool ignoreNames);
00422
00423
00426
00427 void passInMatrix(const CoinPackedMatrix & matrix);
00430 int convertMatrix();
00432 inline const CoinPackedMatrix * packedMatrix() const
00433 { return packedMatrix_;}
00435 inline const int * originalRows() const
00436 { return rowType_;}
00438 inline const int * originalColumns() const
00439 { return columnType_;}
00441
00442
00445
00446 inline CoinBigIndex numberElements() const
00447 { return numberElements_;}
00449 inline const CoinModelTriple * elements() const
00450 { return elements_;}
00452 inline double operator() (int i,int j) const
00453 { return getElement(i,j);}
00455 double getElement(int i,int j) const;
00457 inline double operator() (const char * rowName,const char * columnName) const
00458 { return getElement(rowName,columnName);}
00460 double getElement(const char * rowName,const char * columnName) const;
00462 double getQuadraticElement(int i,int j) const;
00467 const char * getElementAsString(int i,int j) const;
00471 double * pointer (int i,int j) const;
00475 int position (int i,int j) const;
00476
00477
00481 CoinModelLink firstInRow(int whichRow) const ;
00485 CoinModelLink lastInRow(int whichRow) const ;
00489 CoinModelLink firstInColumn(int whichColumn) const ;
00493 CoinModelLink lastInColumn(int whichColumn) const ;
00498 CoinModelLink next(CoinModelLink & current) const ;
00504 CoinModelLink previous(CoinModelLink & current) const ;
00509 CoinModelLink firstInQuadraticColumn(int whichColumn) const ;
00513 CoinModelLink lastInQuadraticColumn(int whichColumn) const ;
00516 double getRowLower(int whichRow) const ;
00519 double getRowUpper(int whichRow) const ;
00522 const char * getRowName(int whichRow) const ;
00523 inline double rowLower(int whichRow) const
00524 { return getRowLower(whichRow);}
00527 inline double rowUpper(int whichRow) const
00528 { return getRowUpper(whichRow) ;}
00531 inline const char * rowName(int whichRow) const
00532 { return getRowName(whichRow);}
00535 double getColumnLower(int whichColumn) const ;
00538 double getColumnUpper(int whichColumn) const ;
00541 double getColumnObjective(int whichColumn) const ;
00544 const char * getColumnName(int whichColumn) const ;
00547 bool getColumnIsInteger(int whichColumn) const ;
00550 inline double columnLower(int whichColumn) const
00551 { return getColumnLower(whichColumn);}
00554 inline double columnUpper(int whichColumn) const
00555 { return getColumnUpper(whichColumn) ;}
00558 inline double columnObjective(int whichColumn) const
00559 { return getColumnObjective(whichColumn);}
00562 inline double objective(int whichColumn) const
00563 { return getColumnObjective(whichColumn);}
00566 inline const char * columnName(int whichColumn) const
00567 { return getColumnName(whichColumn);}
00570 inline bool columnIsInteger(int whichColumn) const
00571 { return getColumnIsInteger(whichColumn);}
00574 inline bool isInteger(int whichColumn) const
00575 { return getColumnIsInteger(whichColumn);}
00578 inline double getColLower(int whichColumn) const
00579 { return getColumnLower(whichColumn);}
00582 inline double getColUpper(int whichColumn) const
00583 { return getColumnUpper(whichColumn) ;}
00586 inline double getColObjective(int whichColumn) const
00587 { return getColumnObjective(whichColumn);}
00590 inline const char * getColName(int whichColumn) const
00591 { return getColumnName(whichColumn);}
00594 inline bool getColIsInteger(int whichColumn) const
00595 { return getColumnIsInteger(whichColumn);}
00598 const char * getRowLowerAsString(int whichRow) const ;
00601 const char * getRowUpperAsString(int whichRow) const ;
00602 inline const char * rowLowerAsString(int whichRow) const
00603 { return getRowLowerAsString(whichRow);}
00606 inline const char * rowUpperAsString(int whichRow) const
00607 { return getRowUpperAsString(whichRow) ;}
00610 const char * getColumnLowerAsString(int whichColumn) const ;
00613 const char * getColumnUpperAsString(int whichColumn) const ;
00616 const char * getColumnObjectiveAsString(int whichColumn) const ;
00619 const char * getColumnIsIntegerAsString(int whichColumn) const ;
00622 inline const char * columnLowerAsString(int whichColumn) const
00623 { return getColumnLowerAsString(whichColumn);}
00626 inline const char * columnUpperAsString(int whichColumn) const
00627 { return getColumnUpperAsString(whichColumn) ;}
00630 inline const char * columnObjectiveAsString(int whichColumn) const
00631 { return getColumnObjectiveAsString(whichColumn);}
00634 inline const char * objectiveAsString(int whichColumn) const
00635 { return getColumnObjectiveAsString(whichColumn);}
00638 inline const char * columnIsIntegerAsString(int whichColumn) const
00639 { return getColumnIsIntegerAsString(whichColumn);}
00642 inline const char * isIntegerAsString(int whichColumn) const
00643 { return getColumnIsIntegerAsString(whichColumn);}
00645 int row(const char * rowName) const;
00647 int column(const char * columnName) const;
00649 inline int type() const
00650 { return type_;}
00652 inline double unsetValue() const
00653 { return -1.23456787654321e-97;}
00655 int createPackedMatrix(CoinPackedMatrix & matrix,
00656 const double * associated);
00662 int countPlusMinusOne(CoinBigIndex * startPositive, CoinBigIndex * startNegative,
00663 const double * associated);
00666 void createPlusMinusOne(CoinBigIndex * startPositive, CoinBigIndex * startNegative,
00667 int * indices,
00668 const double * associated);
00670 int createArrays(double * & rowLower, double * & rowUpper,
00671 double * & columnLower, double * & columnUpper,
00672 double * & objective, int * & integerType,
00673 double * & associated);
00675 inline bool stringsExist() const
00676 { return string_.numberItems()!=0;}
00678 inline const CoinModelHash * stringArray() const
00679 { return &string_;}
00681 inline double * associatedArray() const
00682 { return associated_;}
00684 inline double * rowLowerArray() const
00685 { return rowLower_;}
00687 inline double * rowUpperArray() const
00688 { return rowUpper_;}
00690 inline double * columnLowerArray() const
00691 { return columnLower_;}
00693 inline double * columnUpperArray() const
00694 { return columnUpper_;}
00696 inline double * objectiveArray() const
00697 { return objective_;}
00699 inline int * integerTypeArray() const
00700 { return integerType_;}
00702 inline const CoinModelHash * rowNames() const
00703 { return &rowName_;}
00705 inline const CoinModelHash * columnNames() const
00706 { return &columnName_;}
00708 inline void zapRowNames()
00709 { rowName_=CoinModelHash();}
00711 inline void zapColumnNames()
00712 { columnName_=CoinModelHash();}
00714 inline const int * cutMarker() const
00715 { return cut_;}
00717 inline double optimizationDirection() const {
00718 return optimizationDirection_;
00719 }
00721 inline void setOptimizationDirection(double value)
00722 { optimizationDirection_=value;}
00724 inline void * moreInfo() const
00725 { return moreInfo_;}
00727 inline void setMoreInfo(void * info)
00728 { moreInfo_ = info;}
00737 int whatIsSet() const;
00739
00757 void loadBlock (const CoinPackedMatrix& matrix,
00758 const double* collb, const double* colub,
00759 const double* obj,
00760 const double* rowlb, const double* rowub) ;
00777 void loadBlock (const CoinPackedMatrix& matrix,
00778 const double* collb, const double* colub,
00779 const double* obj,
00780 const char* rowsen, const double* rowrhs,
00781 const double* rowrng) ;
00782
00795 void loadBlock (const int numcols, const int numrows,
00796 const CoinBigIndex * start, const int* index,
00797 const double* value,
00798 const double* collb, const double* colub,
00799 const double* obj,
00800 const double* rowlb, const double* rowub) ;
00801
00814 void loadBlock (const int numcols, const int numrows,
00815 const CoinBigIndex * start, const int* index,
00816 const double* value,
00817 const double* collb, const double* colub,
00818 const double* obj,
00819 const char* rowsen, const double* rowrhs,
00820 const double* rowrng) ;
00821
00823
00827 CoinModel();
00829 CoinModel(int firstRows, int firstColumns, int firstElements,bool noNames=false);
00832 CoinModel(const char *fileName, int allowStrings=0);
00836 CoinModel( int nonLinear, const char * fileName,const void * info);
00838 CoinModel(int numberRows, int numberColumns,
00839 const CoinPackedMatrix * matrix,
00840 const double * rowLower, const double * rowUpper,
00841 const double * columnLower, const double * columnUpper,
00842 const double * objective);
00844 virtual CoinBaseModel * clone() const;
00845
00847 virtual ~CoinModel();
00849
00853 CoinModel(const CoinModel&);
00855 CoinModel& operator=(const CoinModel&);
00857
00860
00861 void validateLinks() const;
00863 private:
00865 void resize(int maximumRows, int maximumColumns, int maximumElements);
00867 void fillRows(int which,bool forceCreation,bool fromAddRow=false);
00869 void fillColumns(int which,bool forceCreation,bool fromAddColumn=false);
00872 void fillList(int which, CoinModelLinkedList & list,int type) const ;
00876 void createList(int type) const;
00878 int addString(const char * string);
00882 double getDoubleFromString(CoinYacc & info, const char * string);
00884 void freeStringMemory(CoinYacc & info);
00885 public:
00887 int computeAssociated(double * associated);
00893 CoinPackedMatrix * quadraticRow(int rowNumber,double * linear,
00894 int & numberBad) const;
00896 void replaceQuadraticRow(int rowNumber,const double * linear, const CoinPackedMatrix * quadraticPart);
00901 CoinModel * reorder(const char * mark) const;
00912 int expandKnapsack(int knapsackRow, int & numberOutput,double * buildObj, CoinBigIndex * buildStart,
00913 int * buildRow, double * buildElement,int reConstruct=-1) const;
00915 void setCutMarker(int size,const int * marker);
00917 void setPriorities(int size,const int * priorities);
00919 inline const int * priorities() const
00920 { return priority_;}
00922 void setOriginalIndices(const int * row, const int * column);
00923
00924 private:
00928 void gdb( int nonLinear, const char * fileName, const void * info);
00930 int decodeBit(char * phrase, char * & nextPhrase, double & coefficient, bool ifFirst) const;
00932 void badType() const;
00935
00936 int maximumRows_;
00938 int maximumColumns_;
00940 int numberElements_;
00942 int maximumElements_;
00944 int numberQuadraticElements_;
00946 int maximumQuadraticElements_;
00948 double * rowLower_;
00950 double * rowUpper_;
00952 CoinModelHash rowName_;
00960 int * rowType_;
00962 double * objective_;
00964 double * columnLower_;
00966 double * columnUpper_;
00968 CoinModelHash columnName_;
00970 int * integerType_;
00972 CoinModelHash string_;
00982 int * columnType_;
00984 int * start_;
00986 CoinModelTriple * elements_;
00988 CoinPackedMatrix * packedMatrix_;
00990 mutable CoinModelHash2 hashElements_;
00992 mutable CoinModelLinkedList rowList_;
00994 mutable CoinModelLinkedList columnList_;
00996 CoinModelTriple * quadraticElements_;
00998 mutable CoinModelHash2 hashQuadraticElements_;
01000 int * sortIndices_;
01002 double * sortElements_;
01004 int sortSize_;
01006 mutable CoinModelLinkedList quadraticRowList_;
01008 mutable CoinModelLinkedList quadraticColumnList_;
01010 int sizeAssociated_;
01012 double * associated_;
01014 int numberSOS_;
01016 int * startSOS_;
01018 int * memberSOS_;
01020 int * typeSOS_;
01022 int * prioritySOS_;
01024 double * referenceSOS_;
01026 int * priority_;
01028 int * cut_;
01030 void * moreInfo_;
01038 mutable int type_;
01040 bool noNames_;
01047 mutable int links_;
01049 };
01051 double getFunctionValueFromString(const char * string, const char * x, double xValue);
01053 double getDoubleFromString(CoinYacc & info, const char * string, const char * x, double xValue);
01054 #endif