/home/coin/SVN-release/Cbc-1.1.1/CoinUtils/src/CoinModel.hpp

Go to the documentation of this file.
00001 // Copyright (C) 2005, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
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

Generated on Thu May 15 21:59:05 2008 by  doxygen 1.4.7