00001
00002
00003 #ifndef ClpGubMatrix_H
00004 #define ClpGubMatrix_H
00005
00006
00007 #include "CoinPragma.hpp"
00008
00009 #include "ClpPackedMatrix.hpp"
00010 class ClpSimplex;
00019 class ClpGubMatrix : public ClpPackedMatrix {
00020
00021 public:
00025 virtual ClpMatrixBase * reverseOrderedCopy() const;
00027 virtual CoinBigIndex countBasis(ClpSimplex * model,
00028 const int * whichColumn,
00029 int numberRowBasic,
00030 int & numberColumnBasic);
00032 virtual void fillBasis(ClpSimplex * model,
00033 const int * whichColumn,
00034 int & numberColumnBasic,
00035 int * row, int * start,
00036 int * rowCount, int * columnCount,
00037 double * element);
00040 virtual void unpack(const ClpSimplex * model,CoinIndexedVector * rowArray,
00041 int column) const ;
00046 virtual void unpackPacked(ClpSimplex * model,
00047 CoinIndexedVector * rowArray,
00048 int column) const;
00051 virtual void add(const ClpSimplex * model,CoinIndexedVector * rowArray,
00052 int column, double multiplier) const ;
00054 virtual void add(const ClpSimplex * model,double * array,
00055 int column, double multiplier) const;
00057 virtual void partialPricing(ClpSimplex * model, double start, double end,
00058 int & bestSequence, int & numberWanted);
00060 virtual int hiddenRows() const;
00062
00069 virtual void transposeTimes(const ClpSimplex * model, double scalar,
00070 const CoinIndexedVector * x,
00071 CoinIndexedVector * y,
00072 CoinIndexedVector * z) const;
00078 virtual void transposeTimesByRow(const ClpSimplex * model, double scalar,
00079 const CoinIndexedVector * x,
00080 CoinIndexedVector * y,
00081 CoinIndexedVector * z) const;
00085 virtual void subsetTransposeTimes(const ClpSimplex * model,
00086 const CoinIndexedVector * x,
00087 const CoinIndexedVector * y,
00088 CoinIndexedVector * z) const;
00095 virtual int extendUpdated(ClpSimplex * model,CoinIndexedVector * update,int mode);
00101 virtual void primalExpanded(ClpSimplex * model,int mode);
00110 virtual void dualExpanded(ClpSimplex * model,CoinIndexedVector * array,
00111 double * other,int mode);
00129 virtual int generalExpanded(ClpSimplex * model,int mode,int & number);
00133 virtual int updatePivot(ClpSimplex * model,double oldInValue, double oldOutValue);
00135 virtual void useEffectiveRhs(ClpSimplex * model,bool cheapest=true);
00139 virtual double * rhsOffset(ClpSimplex * model,bool forceRefresh=false,
00140 bool check=false);
00153 virtual int synchronize(ClpSimplex * model,int mode);
00155 virtual void correctSequence(int & sequenceIn, int & sequenceOut) const;
00157
00158
00159
00163 ClpGubMatrix();
00165 virtual ~ClpGubMatrix();
00167
00171 ClpGubMatrix(const ClpGubMatrix&);
00173 ClpGubMatrix(const CoinPackedMatrix&);
00176 ClpGubMatrix (const ClpGubMatrix & wholeModel,
00177 int numberRows, const int * whichRows,
00178 int numberColumns, const int * whichColumns);
00179 ClpGubMatrix (const CoinPackedMatrix & wholeModel,
00180 int numberRows, const int * whichRows,
00181 int numberColumns, const int * whichColumns);
00182
00184 ClpGubMatrix(CoinPackedMatrix * matrix);
00185
00188 ClpGubMatrix(ClpPackedMatrix * matrix, int numberSets,
00189 const int * start, const int * end,
00190 const double * lower, const double * upper,
00191 const unsigned char * status=NULL);
00192
00193 ClpGubMatrix& operator=(const ClpGubMatrix&);
00195 virtual ClpMatrixBase * clone() const ;
00198 virtual ClpMatrixBase * subsetClone (
00199 int numberRows, const int * whichRows,
00200 int numberColumns, const int * whichColumns) const ;
00202 void redoSet(ClpSimplex * model,int newKey, int oldKey, int iSet);
00204
00206
00207 inline ClpSimplex::Status getStatus(int sequence) const
00208 {return static_cast<ClpSimplex::Status> (status_[sequence]&7);};
00209 inline void setStatus(int sequence, ClpSimplex::Status status)
00210 {
00211 unsigned char & st_byte = status_[sequence];
00212 st_byte &= ~7;
00213 st_byte |= status;
00214 };
00216 inline void setFlagged( int sequence)
00217 {
00218 status_[sequence] |= 64;
00219 };
00220 inline void clearFlagged( int sequence)
00221 {
00222 status_[sequence] &= ~64;
00223 };
00224 inline bool flagged(int sequence) const
00225 {return ((status_[sequence]&64)!=0);};
00227 inline void setAbove( int sequence)
00228 {
00229 unsigned char iStat = status_[sequence];
00230 iStat &= ~24;
00231 status_[sequence] = iStat|16;
00232 };
00234 inline void setFeasible( int sequence)
00235 {
00236 unsigned char iStat = status_[sequence];
00237 iStat &= ~24;
00238 status_[sequence] = iStat|8;
00239 };
00241 inline void setBelow( int sequence)
00242 {
00243 unsigned char iStat = status_[sequence];
00244 iStat &= ~24;
00245 status_[sequence] = iStat;
00246 };
00247 inline double weight( int sequence) const
00248 {
00249 int iStat = status_[sequence]&31;
00250 iStat = iStat>>3;
00251 return (double) (iStat-1);
00252 };
00254 inline int * start() const
00255 { return start_;};
00257 inline int * end() const
00258 { return end_;};
00260 inline double * lower() const
00261 { return lower_;};
00263 inline double * upper() const
00264 { return upper_;};
00266 inline int * keyVariable() const
00267 { return keyVariable_;};
00269 inline int * backward() const
00270 { return backward_;};
00272 inline int numberSets() const
00273 { return numberSets_;};
00275 void switchOffCheck();
00277
00278
00279 protected:
00283
00284 double sumDualInfeasibilities_;
00286 double sumPrimalInfeasibilities_;
00288 double sumOfRelaxedDualInfeasibilities_;
00290 double sumOfRelaxedPrimalInfeasibilities_;
00292 double infeasibilityWeight_;
00294 int * start_;
00296 int * end_;
00298 double * lower_;
00300 double * upper_;
00302 mutable unsigned char * status_;
00304 unsigned char * saveStatus_;
00306 int * savedKeyVariable_;
00308 int * backward_;
00310 int * backToPivotRow_;
00312 double * changeCost_;
00314 mutable int * keyVariable_;
00318 mutable int * next_;
00320 int * toIndex_;
00321
00322 int * fromIndex_;
00324 ClpSimplex * model_;
00326 int numberDualInfeasibilities_;
00328 int numberPrimalInfeasibilities_;
00334 int noCheck_;
00336 int numberSets_;
00338 int saveNumber_;
00340 int possiblePivotKey_;
00342 int gubSlackIn_;
00344 int firstGub_;
00346 int lastGub_;
00349 int gubType_;
00351 };
00352
00353 #endif