00001
00002
00003 #ifndef CoinModel_H
00004 #define CoinModel_H
00005
00006 #include "CoinModelUseful.hpp"
00007 #include "CoinPackedMatrix.hpp"
00008
00042 class CoinModel {
00043
00044 public:
00048 void addRow(int numberInRow, const int * columns,
00049 const double * elements, double rowLower=-COIN_DBL_MAX,
00050 double rowUpper=COIN_DBL_MAX, const char * name=NULL);
00052 void addColumn(int numberInColumn, const int * rows,
00053 const double * elements,
00054 double columnLower=0.0,
00055 double columnUpper=COIN_DBL_MAX, double objectiveValue=0.0,
00056 const char * name=NULL, bool isInteger=false);
00058 inline void addCol(int numberInColumn, const int * rows,
00059 const double * elements,
00060 double columnLower=0.0,
00061 double columnUpper=COIN_DBL_MAX, double objectiveValue=0.0,
00062 const char * name=NULL, bool isInteger=false)
00063 { addColumn(numberInColumn, rows, elements, columnLower, columnUpper, objectiveValue,
00064 name,isInteger);};
00066 inline void operator() (int i,int j,double value)
00067 { setElement(i,j,value);};
00069 void setElement(int i,int j,double value) ;
00074 int getRow(int whichRow, int * column, double * element);
00079 int getColumn(int whichColumn, int * column, double * element);
00081 void setQuadraticElement(int i,int j,double value) ;
00083 inline void operator() (int i,int j,const char * value)
00084 { setElement(i,j,value);};
00086 void setElement(int i,int j,const char * value) ;
00088 int associateElement(const char * stringValue, double value);
00092 void setRowLower(int whichRow,double rowLower);
00096 void setRowUpper(int whichRow,double rowUpper);
00100 void setRowBounds(int whichRow,double rowLower,double rowUpper);
00104 void setRowName(int whichRow,const char * rowName);
00108 void setColumnLower(int whichColumn,double columnLower);
00112 void setColumnUpper(int whichColumn,double columnUpper);
00116 void setColumnBounds(int whichColumn,double columnLower,double columnUpper);
00120 void setColumnObjective(int whichColumn,double columnObjective);
00124 void setColumnName(int whichColumn,const char * columnName);
00128 void setColumnIsInteger(int whichColumn,bool columnIsInteger);
00132 inline void setObjective(int whichColumn,double columnObjective)
00133 { setColumnObjective( whichColumn, columnObjective);};
00137 inline void setIsInteger(int whichColumn,bool columnIsInteger)
00138 { setColumnIsInteger( whichColumn, columnIsInteger);};
00142 inline void setInteger(int whichColumn)
00143 { setColumnIsInteger( whichColumn, true);};
00147 inline void setContinuous(int whichColumn)
00148 { setColumnIsInteger( whichColumn, false);};
00152 inline void setColLower(int whichColumn,double columnLower)
00153 { setColumnLower( whichColumn, columnLower);};
00157 inline void setColUpper(int whichColumn,double columnUpper)
00158 { setColumnUpper( whichColumn, columnUpper);};
00162 inline void setColBounds(int whichColumn,double columnLower,double columnUpper)
00163 { setColumnBounds( whichColumn, columnLower, columnUpper);};
00167 inline void setColObjective(int whichColumn,double columnObjective)
00168 { setColumnObjective( whichColumn, columnObjective);};
00172 inline void setColName(int whichColumn,const char * columnName)
00173 { setColumnName( whichColumn, columnName);};
00177 inline void setColIsInteger(int whichColumn,bool columnIsInteger)
00178 { setColumnIsInteger( whichColumn, columnIsInteger);};
00182 void setRowLower(int whichRow,const char * rowLower);
00186 void setRowUpper(int whichRow,const char * rowUpper);
00190 void setColumnLower(int whichColumn,const char * columnLower);
00194 void setColumnUpper(int whichColumn,const char * columnUpper);
00198 void setColumnObjective(int whichColumn,const char * columnObjective);
00202 void setColumnIsInteger(int whichColumn,const char * columnIsInteger);
00206 inline void setObjective(int whichColumn,const char * columnObjective)
00207 { setColumnObjective( whichColumn, columnObjective);};
00211 inline void setIsInteger(int whichColumn,const char * columnIsInteger)
00212 { setColumnIsInteger( whichColumn, columnIsInteger);};
00215 void deleteRow(int whichRow);
00218 void deleteColumn(int whichColumn);
00221 inline void deleteCol(int whichColumn)
00222 { deleteColumn(whichColumn);};
00224 int deleteElement(int row, int column);
00226 void deleteThisElement(int row, int column,int position);
00229 int packRows();
00232 int packColumns();
00235 inline int packCols()
00236 { return packColumns();};
00241 int pack();
00242
00268 int writeMps(const char *filename, int compression = 0,
00269 int formatType = 0, int numberAcross = 2) ;
00270
00275 int differentModel(CoinModel & other, bool ignoreNames);
00277
00278
00281
00282 inline int numberRows() const
00283 { return numberRows_;};
00285 inline int numberColumns() const
00286 { return numberColumns_;};
00288 inline CoinBigIndex numberElements() const
00289 { return numberElements_;};
00291 inline const CoinModelTriple * elements() const
00292 { return elements_;};
00294 inline double operator() (int i,int j) const
00295 { return getElement(i,j);};
00297 double getElement(int i,int j) const;
00299 inline double operator() (const char * rowName,const char * columnName) const
00300 { return getElement(rowName,columnName);};
00302 double getElement(const char * rowName,const char * columnName) const;
00304 double getQuadraticElement(int i,int j) const;
00309 const char * getElementAsString(int i,int j) const;
00313 double * pointer (int i,int j) const;
00317 int position (int i,int j) const;
00318
00319
00323 CoinModelLink firstInRow(int whichRow) const ;
00327 CoinModelLink lastInRow(int whichRow) const ;
00331 CoinModelLink firstInColumn(int whichColumn) const ;
00335 CoinModelLink lastInColumn(int whichColumn) const ;
00340 CoinModelLink next(CoinModelLink & current) const ;
00346 CoinModelLink previous(CoinModelLink & current) const ;
00351 CoinModelLink firstInQuadraticColumn(int whichColumn) const ;
00355 CoinModelLink lastInQuadraticColumn(int whichColumn) const ;
00358 double getRowLower(int whichRow) const ;
00361 double getRowUpper(int whichRow) const ;
00364 const char * getRowName(int whichRow) const ;
00365 inline double rowLower(int whichRow) const
00366 { return getRowLower(whichRow);};
00369 inline double rowUpper(int whichRow) const
00370 { return getRowUpper(whichRow) ;};
00373 inline const char * rowName(int whichRow) const
00374 { return getRowName(whichRow);};
00377 double getColumnLower(int whichColumn) const ;
00380 double getColumnUpper(int whichColumn) const ;
00383 double getColumnObjective(int whichColumn) const ;
00386 const char * getColumnName(int whichColumn) const ;
00389 bool getColumnIsInteger(int whichColumn) const ;
00392 inline double columnLower(int whichColumn) const
00393 { return getColumnLower(whichColumn);};
00396 inline double columnUpper(int whichColumn) const
00397 { return getColumnUpper(whichColumn) ;};
00400 inline double columnObjective(int whichColumn) const
00401 { return getColumnObjective(whichColumn);};
00404 inline double objective(int whichColumn) const
00405 { return getColumnObjective(whichColumn);};
00408 inline const char * columnName(int whichColumn) const
00409 { return getColumnName(whichColumn);};
00412 inline bool columnIsInteger(int whichColumn) const
00413 { return getColumnIsInteger(whichColumn);};
00416 inline bool isInteger(int whichColumn) const
00417 { return getColumnIsInteger(whichColumn);};
00420 inline double getColLower(int whichColumn) const
00421 { return getColumnLower(whichColumn);};
00424 inline double getColUpper(int whichColumn) const
00425 { return getColumnUpper(whichColumn) ;};
00428 inline double getColObjective(int whichColumn) const
00429 { return getColumnObjective(whichColumn);};
00432 inline const char * getColName(int whichColumn) const
00433 { return getColumnName(whichColumn);};
00436 inline bool getColIsInteger(int whichColumn) const
00437 { return getColumnIsInteger(whichColumn);};
00440 const char * getRowLowerAsString(int whichRow) const ;
00443 const char * getRowUpperAsString(int whichRow) const ;
00444 inline const char * rowLowerAsString(int whichRow) const
00445 { return getRowLowerAsString(whichRow);};
00448 inline const char * rowUpperAsString(int whichRow) const
00449 { return getRowUpperAsString(whichRow) ;};
00452 const char * getColumnLowerAsString(int whichColumn) const ;
00455 const char * getColumnUpperAsString(int whichColumn) const ;
00458 const char * getColumnObjectiveAsString(int whichColumn) const ;
00461 const char * getColumnIsIntegerAsString(int whichColumn) const ;
00464 inline const char * columnLowerAsString(int whichColumn) const
00465 { return getColumnLowerAsString(whichColumn);};
00468 inline const char * columnUpperAsString(int whichColumn) const
00469 { return getColumnUpperAsString(whichColumn) ;};
00472 inline const char * columnObjectiveAsString(int whichColumn) const
00473 { return getColumnObjectiveAsString(whichColumn);};
00476 inline const char * objectiveAsString(int whichColumn) const
00477 { return getColumnObjectiveAsString(whichColumn);};
00480 inline const char * columnIsIntegerAsString(int whichColumn) const
00481 { return getColumnIsIntegerAsString(whichColumn);};
00484 inline const char * isIntegerAsString(int whichColumn) const
00485 { return getColumnIsIntegerAsString(whichColumn);};
00487 int row(const char * rowName) const;
00489 int column(const char * columnName) const;
00493 inline double objectiveOffset() const
00494 { return objectiveOffset_;};
00496 inline void setObjectiveOffset(double value)
00497 { objectiveOffset_=value;};
00499 inline int logLevel() const
00500 { return logLevel_;};
00502 void setLogLevel(int value);
00504 inline const char * getProblemName() const
00505 { return problemName_;};
00507 void setProblemName(const char *name) ;
00509 inline int type() const
00510 { return type_;};
00512 inline double unsetValue() const
00513 { return -1.23456787654321e-97;};
00515 int createPackedMatrix(CoinPackedMatrix & matrix, const double * associated);
00521 int countPlusMinusOne(CoinBigIndex * startPositive, CoinBigIndex * startNegative,
00522 const double * associated);
00525 void createPlusMinusOne(CoinBigIndex * startPositive, CoinBigIndex * startNegative,
00526 int * indices,
00527 const double * associated);
00529 int createArrays(double * & rowLower, double * & rowUpper,
00530 double * & columnLower, double * & columnUpper,
00531 double * & objective, int * & integerType,
00532 double * & associated);
00534 inline bool stringsExist() const
00535 { return string_.numberItems()!=0;};
00537 inline double * associatedArray() const
00538 { return associated_;};
00540 inline double * rowLowerArray() const
00541 { return rowLower_;};
00543 inline double * rowUpperArray() const
00544 { return rowUpper_;};
00546 inline double * columnLowerArray() const
00547 { return columnLower_;};
00549 inline double * columnUpperArray() const
00550 { return columnUpper_;};
00552 inline double * objectiveArray() const
00553 { return objective_;};
00555 inline int * integerTypeArray() const
00556 { return integerType_;};
00558 inline const CoinModelHash * rowNames() const
00559 { return &rowName_;};
00561 inline const CoinModelHash * columnNames() const
00562 { return &columnName_;};
00564
00568 CoinModel();
00570 ~CoinModel();
00572
00576 CoinModel(const CoinModel&);
00578 CoinModel& operator=(const CoinModel&);
00580
00583
00584 void validateLinks() const;
00586 private:
00588 void resize(int maximumRows, int maximumColumns, int maximumElements);
00590 void fillRows(int which,bool forceCreation,bool fromAddRow=false);
00592 void fillColumns(int which,bool forceCreation,bool fromAddColumn=false);
00595 void fillList(int which, CoinModelLinkedList & list,int type) const ;
00599 void createList(int type) const;
00601 int addString(const char * string);
00605 double getDoubleFromString(CoinYacc & info, const char * string);
00607 void freeStringMemory(CoinYacc & info);
00609 int computeAssociated(double * associated);
00610
00611
00612 private:
00615
00616 int numberRows_;
00618 int maximumRows_;
00620 int numberColumns_;
00622 int maximumColumns_;
00624 int numberElements_;
00626 int maximumElements_;
00628 int numberQuadraticElements_;
00630 int maximumQuadraticElements_;
00632 double optimizationDirection_;
00634 double objectiveOffset_;
00636 char * problemName_;
00638 double * rowLower_;
00640 double * rowUpper_;
00642 CoinModelHash rowName_;
00648 int * rowType_;
00650 double * objective_;
00652 double * columnLower_;
00654 double * columnUpper_;
00656 CoinModelHash columnName_;
00658 int * integerType_;
00660 CoinModelHash string_;
00668 int * columnType_;
00670 int * start_;
00672 CoinModelTriple * elements_;
00674 mutable CoinModelHash2 hashElements_;
00676 mutable CoinModelLinkedList rowList_;
00678 mutable CoinModelLinkedList columnList_;
00680 CoinModelTriple * quadraticElements_;
00682 mutable CoinModelHash2 hashQuadraticElements_;
00684 int * sortIndices_;
00686 double * sortElements_;
00688 int sortSize_;
00690 mutable CoinModelLinkedList quadraticRowList_;
00692 mutable CoinModelLinkedList quadraticColumnList_;
00694 int sizeAssociated_;
00696 double * associated_;
00704 int logLevel_;
00711 mutable int type_;
00718 mutable int links_;
00720 };
00721 #endif