00001
00002
00003 #ifndef CoinModel_H
00004 #define CoinModel_H
00005
00006 #include "CoinModelUseful.hpp"
00007 #include "CoinPackedMatrix.hpp"
00008
00045 class CoinModel {
00046
00047 public:
00051 void addRow(int numberInRow, const int * columns,
00052 const double * elements, double rowLower=-COIN_DBL_MAX,
00053 double rowUpper=COIN_DBL_MAX, const char * name=NULL);
00055 void addColumn(int numberInColumn, const int * rows,
00056 const double * elements,
00057 double columnLower=0.0,
00058 double columnUpper=COIN_DBL_MAX, double objectiveValue=0.0,
00059 const char * name=NULL, bool isInteger=false);
00061 inline void addCol(int numberInColumn, const int * rows,
00062 const double * elements,
00063 double columnLower=0.0,
00064 double columnUpper=COIN_DBL_MAX, double objectiveValue=0.0,
00065 const char * name=NULL, bool isInteger=false)
00066 { addColumn(numberInColumn, rows, elements, columnLower, columnUpper, objectiveValue,
00067 name,isInteger);}
00069 inline void operator() (int i,int j,double value)
00070 { setElement(i,j,value);}
00072 void setElement(int i,int j,double value) ;
00078 int getRow(int whichRow, int * column, double * element);
00084 int getColumn(int whichColumn, int * column, double * element);
00086 void setQuadraticElement(int i,int j,double value) ;
00088 inline void operator() (int i,int j,const char * value)
00089 { setElement(i,j,value);}
00091 void setElement(int i,int j,const char * value) ;
00093 int associateElement(const char * stringValue, double value);
00097 void setRowLower(int whichRow,double rowLower);
00101 void setRowUpper(int whichRow,double rowUpper);
00105 void setRowBounds(int whichRow,double rowLower,double rowUpper);
00109 void setRowName(int whichRow,const char * rowName);
00113 void setColumnLower(int whichColumn,double columnLower);
00117 void setColumnUpper(int whichColumn,double columnUpper);
00121 void setColumnBounds(int whichColumn,double columnLower,double columnUpper);
00125 void setColumnObjective(int whichColumn,double columnObjective);
00129 void setColumnName(int whichColumn,const char * columnName);
00133 void setColumnIsInteger(int whichColumn,bool columnIsInteger);
00137 inline void setObjective(int whichColumn,double columnObjective)
00138 { setColumnObjective( whichColumn, columnObjective);}
00142 inline void setIsInteger(int whichColumn,bool columnIsInteger)
00143 { setColumnIsInteger( whichColumn, columnIsInteger);}
00147 inline void setInteger(int whichColumn)
00148 { setColumnIsInteger( whichColumn, true);}
00152 inline void setContinuous(int whichColumn)
00153 { setColumnIsInteger( whichColumn, false);}
00157 inline void setColLower(int whichColumn,double columnLower)
00158 { setColumnLower( whichColumn, columnLower);}
00162 inline void setColUpper(int whichColumn,double columnUpper)
00163 { setColumnUpper( whichColumn, columnUpper);}
00167 inline void setColBounds(int whichColumn,double columnLower,double columnUpper)
00168 { setColumnBounds( whichColumn, columnLower, columnUpper);}
00172 inline void setColObjective(int whichColumn,double columnObjective)
00173 { setColumnObjective( whichColumn, columnObjective);}
00177 inline void setColName(int whichColumn,const char * columnName)
00178 { setColumnName( whichColumn, columnName);}
00182 inline void setColIsInteger(int whichColumn,bool columnIsInteger)
00183 { setColumnIsInteger( whichColumn, columnIsInteger);}
00187 void setRowLower(int whichRow,const char * rowLower);
00191 void setRowUpper(int whichRow,const char * rowUpper);
00195 void setColumnLower(int whichColumn,const char * columnLower);
00199 void setColumnUpper(int whichColumn,const char * columnUpper);
00203 void setColumnObjective(int whichColumn,const char * columnObjective);
00207 void setColumnIsInteger(int whichColumn,const char * columnIsInteger);
00211 inline void setObjective(int whichColumn,const char * columnObjective)
00212 { setColumnObjective( whichColumn, columnObjective);}
00216 inline void setIsInteger(int whichColumn,const char * columnIsInteger)
00217 { setColumnIsInteger( whichColumn, columnIsInteger);}
00220 void deleteRow(int whichRow);
00223 void deleteColumn(int whichColumn);
00226 inline void deleteCol(int whichColumn)
00227 { deleteColumn(whichColumn);}
00229 int deleteElement(int row, int column);
00231 void deleteThisElement(int row, int column,int position);
00234 int packRows();
00237 int packColumns();
00240 inline int packCols()
00241 { return packColumns();}
00246 int pack();
00247
00273 int writeMps(const char *filename, int compression = 0,
00274 int formatType = 0, int numberAcross = 2, bool keepStrings=false) ;
00275
00280 int differentModel(CoinModel & other, bool ignoreNames);
00282
00283
00286
00287 inline int numberRows() const
00288 { return numberRows_;}
00290 inline int numberColumns() const
00291 { return numberColumns_;}
00293 inline CoinBigIndex numberElements() const
00294 { return numberElements_;}
00296 inline const CoinModelTriple * elements() const
00297 { return elements_;}
00299 inline double operator() (int i,int j) const
00300 { return getElement(i,j);}
00302 double getElement(int i,int j) const;
00304 inline double operator() (const char * rowName,const char * columnName) const
00305 { return getElement(rowName,columnName);}
00307 double getElement(const char * rowName,const char * columnName) const;
00309 double getQuadraticElement(int i,int j) const;
00314 const char * getElementAsString(int i,int j) const;
00318 double * pointer (int i,int j) const;
00322 int position (int i,int j) const;
00323
00324
00328 CoinModelLink firstInRow(int whichRow) const ;
00332 CoinModelLink lastInRow(int whichRow) const ;
00336 CoinModelLink firstInColumn(int whichColumn) const ;
00340 CoinModelLink lastInColumn(int whichColumn) const ;
00345 CoinModelLink next(CoinModelLink & current) const ;
00351 CoinModelLink previous(CoinModelLink & current) const ;
00356 CoinModelLink firstInQuadraticColumn(int whichColumn) const ;
00360 CoinModelLink lastInQuadraticColumn(int whichColumn) const ;
00363 double getRowLower(int whichRow) const ;
00366 double getRowUpper(int whichRow) const ;
00369 const char * getRowName(int whichRow) const ;
00370 inline double rowLower(int whichRow) const
00371 { return getRowLower(whichRow);}
00374 inline double rowUpper(int whichRow) const
00375 { return getRowUpper(whichRow) ;}
00378 inline const char * rowName(int whichRow) const
00379 { return getRowName(whichRow);}
00382 double getColumnLower(int whichColumn) const ;
00385 double getColumnUpper(int whichColumn) const ;
00388 double getColumnObjective(int whichColumn) const ;
00391 const char * getColumnName(int whichColumn) const ;
00394 bool getColumnIsInteger(int whichColumn) const ;
00397 inline double columnLower(int whichColumn) const
00398 { return getColumnLower(whichColumn);}
00401 inline double columnUpper(int whichColumn) const
00402 { return getColumnUpper(whichColumn) ;}
00405 inline double columnObjective(int whichColumn) const
00406 { return getColumnObjective(whichColumn);}
00409 inline double objective(int whichColumn) const
00410 { return getColumnObjective(whichColumn);}
00413 inline const char * columnName(int whichColumn) const
00414 { return getColumnName(whichColumn);}
00417 inline bool columnIsInteger(int whichColumn) const
00418 { return getColumnIsInteger(whichColumn);}
00421 inline bool isInteger(int whichColumn) const
00422 { return getColumnIsInteger(whichColumn);}
00425 inline double getColLower(int whichColumn) const
00426 { return getColumnLower(whichColumn);}
00429 inline double getColUpper(int whichColumn) const
00430 { return getColumnUpper(whichColumn) ;}
00433 inline double getColObjective(int whichColumn) const
00434 { return getColumnObjective(whichColumn);}
00437 inline const char * getColName(int whichColumn) const
00438 { return getColumnName(whichColumn);}
00441 inline bool getColIsInteger(int whichColumn) const
00442 { return getColumnIsInteger(whichColumn);}
00445 const char * getRowLowerAsString(int whichRow) const ;
00448 const char * getRowUpperAsString(int whichRow) const ;
00449 inline const char * rowLowerAsString(int whichRow) const
00450 { return getRowLowerAsString(whichRow);}
00453 inline const char * rowUpperAsString(int whichRow) const
00454 { return getRowUpperAsString(whichRow) ;}
00457 const char * getColumnLowerAsString(int whichColumn) const ;
00460 const char * getColumnUpperAsString(int whichColumn) const ;
00463 const char * getColumnObjectiveAsString(int whichColumn) const ;
00466 const char * getColumnIsIntegerAsString(int whichColumn) const ;
00469 inline const char * columnLowerAsString(int whichColumn) const
00470 { return getColumnLowerAsString(whichColumn);}
00473 inline const char * columnUpperAsString(int whichColumn) const
00474 { return getColumnUpperAsString(whichColumn) ;}
00477 inline const char * columnObjectiveAsString(int whichColumn) const
00478 { return getColumnObjectiveAsString(whichColumn);}
00481 inline const char * objectiveAsString(int whichColumn) const
00482 { return getColumnObjectiveAsString(whichColumn);}
00485 inline const char * columnIsIntegerAsString(int whichColumn) const
00486 { return getColumnIsIntegerAsString(whichColumn);}
00489 inline const char * isIntegerAsString(int whichColumn) const
00490 { return getColumnIsIntegerAsString(whichColumn);}
00492 int row(const char * rowName) const;
00494 int column(const char * columnName) const;
00498 inline double objectiveOffset() const
00499 { return objectiveOffset_;}
00501 inline void setObjectiveOffset(double value)
00502 { objectiveOffset_=value;}
00504 inline int logLevel() const
00505 { return logLevel_;}
00507 void setLogLevel(int value);
00509 inline const char * getProblemName() const
00510 { return problemName_;}
00512 void setProblemName(const char *name) ;
00514 inline int type() const
00515 { return type_;}
00517 inline double unsetValue() const
00518 { return -1.23456787654321e-97;}
00520 int createPackedMatrix(CoinPackedMatrix & matrix, const double * associated);
00526 int countPlusMinusOne(CoinBigIndex * startPositive, CoinBigIndex * startNegative,
00527 const double * associated);
00530 void createPlusMinusOne(CoinBigIndex * startPositive, CoinBigIndex * startNegative,
00531 int * indices,
00532 const double * associated);
00534 int createArrays(double * & rowLower, double * & rowUpper,
00535 double * & columnLower, double * & columnUpper,
00536 double * & objective, int * & integerType,
00537 double * & associated);
00539 inline bool stringsExist() const
00540 { return string_.numberItems()!=0;}
00542 inline const CoinModelHash * stringArray() const
00543 { return &string_;}
00545 inline double * associatedArray() const
00546 { return associated_;}
00548 inline double * rowLowerArray() const
00549 { return rowLower_;}
00551 inline double * rowUpperArray() const
00552 { return rowUpper_;}
00554 inline double * columnLowerArray() const
00555 { return columnLower_;}
00557 inline double * columnUpperArray() const
00558 { return columnUpper_;}
00560 inline double * objectiveArray() const
00561 { return objective_;}
00563 inline int * integerTypeArray() const
00564 { return integerType_;}
00566 inline const CoinModelHash * rowNames() const
00567 { return &rowName_;}
00569 inline const CoinModelHash * columnNames() const
00570 { return &columnName_;}
00572 inline const int * cutMarker() const
00573 { return cut_;}
00575 inline double optimizationDirection() const {
00576 return optimizationDirection_;
00577 }
00579 inline void setOptimizationDirection(double value)
00580 { optimizationDirection_=value;}
00582 inline void * moreInfo() const
00583 { return moreInfo_;}
00585 inline void setMoreInfo(void * info)
00586 { moreInfo_ = info;}
00588
00592 CoinModel();
00595 CoinModel(const char *fileName, int allowStrings=0);
00599 CoinModel( int nonLinear, const char * fileName,const void * info);
00601 ~CoinModel();
00603
00607 CoinModel(const CoinModel&);
00609 CoinModel& operator=(const CoinModel&);
00611
00614
00615 void validateLinks() const;
00617 private:
00619 void resize(int maximumRows, int maximumColumns, int maximumElements);
00621 void fillRows(int which,bool forceCreation,bool fromAddRow=false);
00623 void fillColumns(int which,bool forceCreation,bool fromAddColumn=false);
00626 void fillList(int which, CoinModelLinkedList & list,int type) const ;
00630 void createList(int type) const;
00632 int addString(const char * string);
00636 double getDoubleFromString(CoinYacc & info, const char * string);
00638 void freeStringMemory(CoinYacc & info);
00639 public:
00641 int computeAssociated(double * associated);
00647 CoinPackedMatrix * quadraticRow(int rowNumber,double * linear,
00648 int & numberBad) const;
00650 void replaceQuadraticRow(int rowNumber,const double * linear, const CoinPackedMatrix * quadraticPart);
00655 CoinModel * reorder(const char * mark) const;
00666 int expandKnapsack(int knapsackRow, int & numberOutput,double * buildObj, CoinBigIndex * buildStart,
00667 int * buildRow, double * buildElement,int reConstruct=-1) const;
00669 void setCutMarker(int size,const int * marker);
00671 void setPriorities(int size,const int * priorities);
00673 inline const int * priorities() const
00674 { return priority_;}
00675
00676 private:
00680 void gdb( int nonLinear, const char * fileName, const void * info);
00682 int decodeBit(char * phrase, char * & nextPhrase, double & coefficient, bool ifFirst) const;
00685
00686 int numberRows_;
00688 int maximumRows_;
00690 int numberColumns_;
00692 int maximumColumns_;
00694 int numberElements_;
00696 int maximumElements_;
00698 int numberQuadraticElements_;
00700 int maximumQuadraticElements_;
00702 double optimizationDirection_;
00704 double objectiveOffset_;
00706 char * problemName_;
00708 double * rowLower_;
00710 double * rowUpper_;
00712 CoinModelHash rowName_;
00718 int * rowType_;
00720 double * objective_;
00722 double * columnLower_;
00724 double * columnUpper_;
00726 CoinModelHash columnName_;
00728 int * integerType_;
00730 CoinModelHash string_;
00738 int * columnType_;
00740 int * start_;
00742 CoinModelTriple * elements_;
00744 mutable CoinModelHash2 hashElements_;
00746 mutable CoinModelLinkedList rowList_;
00748 mutable CoinModelLinkedList columnList_;
00750 CoinModelTriple * quadraticElements_;
00752 mutable CoinModelHash2 hashQuadraticElements_;
00754 int * sortIndices_;
00756 double * sortElements_;
00758 int sortSize_;
00760 mutable CoinModelLinkedList quadraticRowList_;
00762 mutable CoinModelLinkedList quadraticColumnList_;
00764 int sizeAssociated_;
00766 double * associated_;
00768 int numberSOS_;
00770 int * startSOS_;
00772 int * memberSOS_;
00774 int * typeSOS_;
00776 int * prioritySOS_;
00778 double * referenceSOS_;
00780 int * priority_;
00782 int * cut_;
00784 void * moreInfo_;
00792 int logLevel_;
00799 mutable int type_;
00806 mutable int links_;
00808 };
00810 double getFunctionValueFromString(const char * string, const char * x, double xValue);
00812 double getDoubleFromString(CoinYacc & info, const char * string, const char * x, double xValue);
00813 #endif