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:
00023 virtual ClpMatrixBase * reverseOrderedCopy() const;
00026 virtual CoinBigIndex fillBasis(ClpSimplex * model,
00027 const int * whichColumn,
00028 int numberRowBasic,
00029 int & numberColumnBasic,
00030 int * row, int * column,
00031 double * element) ;
00034 virtual void unpack(const ClpSimplex * model,CoinIndexedVector * rowArray,
00035 int column) const ;
00040 virtual void unpackPacked(ClpSimplex * model,
00041 CoinIndexedVector * rowArray,
00042 int column) const;
00045 virtual void add(const ClpSimplex * model,CoinIndexedVector * rowArray,
00046 int column, double multiplier) const ;
00048 virtual void add(const ClpSimplex * model,double * array,
00049 int column, double multiplier) const;
00051 virtual void partialPricing(ClpSimplex * model, double start, double end,
00052 int & bestSequence, int & numberWanted);
00054 virtual int hiddenRows() const;
00056
00063 virtual void transposeTimes(const ClpSimplex * model, double scalar,
00064 const CoinIndexedVector * x,
00065 CoinIndexedVector * y,
00066 CoinIndexedVector * z) const;
00072 virtual void transposeTimesByRow(const ClpSimplex * model, double scalar,
00073 const CoinIndexedVector * x,
00074 CoinIndexedVector * y,
00075 CoinIndexedVector * z) const;
00080 virtual void subsetTransposeTimes(const ClpSimplex * model,
00081 const CoinIndexedVector * x,
00082 const CoinIndexedVector * y,
00083 CoinIndexedVector * z) const;
00090 virtual int extendUpdated(ClpSimplex * model,CoinIndexedVector * update,int mode);
00096 virtual void primalExpanded(ClpSimplex * model,int mode);
00105 virtual void dualExpanded(ClpSimplex * model,CoinIndexedVector * array,
00106 double * other,int mode);
00124 virtual int generalExpanded(ClpSimplex * model,int mode,int & number);
00128 virtual int updatePivot(ClpSimplex * model,double oldInValue, double oldOutValue);
00130 virtual void useEffectiveRhs(ClpSimplex * model,bool cheapest=true);
00134 virtual double * rhsOffset(ClpSimplex * model,bool forceRefresh=false,
00135 bool check=false);
00148 virtual int synchronize(ClpSimplex * model,int mode);
00150 virtual void correctSequence(int & sequenceIn, int & sequenceOut) const;
00152
00153
00154
00158 ClpGubMatrix();
00160 virtual ~ClpGubMatrix();
00162
00166 ClpGubMatrix(const ClpGubMatrix&);
00168 ClpGubMatrix(const CoinPackedMatrix&);
00171 ClpGubMatrix (const ClpGubMatrix & wholeModel,
00172 int numberRows, const int * whichRows,
00173 int numberColumns, const int * whichColumns);
00174 ClpGubMatrix (const CoinPackedMatrix & wholeModel,
00175 int numberRows, const int * whichRows,
00176 int numberColumns, const int * whichColumns);
00177
00179 ClpGubMatrix(CoinPackedMatrix * matrix);
00180
00183 ClpGubMatrix(ClpPackedMatrix * matrix, int numberSets,
00184 const int * start, const int * end,
00185 const double * lower, const double * upper,
00186 const unsigned char * status=NULL);
00187
00188 ClpGubMatrix& operator=(const ClpGubMatrix&);
00190 virtual ClpMatrixBase * clone() const ;
00193 virtual ClpMatrixBase * subsetClone (
00194 int numberRows, const int * whichRows,
00195 int numberColumns, const int * whichColumns) const ;
00197 void redoSet(ClpSimplex * model,int newKey, int oldKey, int iSet);
00199
00201
00202 inline ClpSimplex::Status getStatus(int sequence) const
00203 {return static_cast<ClpSimplex::Status> (status_[sequence]&7);};
00204 inline void setStatus(int sequence, ClpSimplex::Status status)
00205 {
00206 unsigned char & st_byte = status_[sequence];
00207 st_byte &= ~7;
00208 st_byte |= status;
00209 };
00211 inline void setFlagged( int sequence)
00212 {
00213 status_[sequence] |= 64;
00214 };
00215 inline void clearFlagged( int sequence)
00216 {
00217 status_[sequence] &= ~64;
00218 };
00219 inline bool flagged(int sequence) const
00220 {return ((status_[sequence]&64)!=0);};
00222 inline void setAbove( int sequence)
00223 {
00224 unsigned char iStat = status_[sequence];
00225 iStat &= ~24;
00226 status_[sequence] = iStat|16;
00227 };
00229 inline void setFeasible( int sequence)
00230 {
00231 unsigned char iStat = status_[sequence];
00232 iStat &= ~24;
00233 status_[sequence] = iStat|8;
00234 };
00236 inline void setBelow( int sequence)
00237 {
00238 unsigned char iStat = status_[sequence];
00239 iStat &= ~24;
00240 status_[sequence] = iStat;
00241 };
00242 inline double weight( int sequence) const
00243 {
00244 int iStat = status_[sequence]&31;
00245 iStat = iStat>>3;
00246 return (double) (iStat-1);
00247 };
00249 inline int * start() const
00250 { return start_;};
00252 inline int * end() const
00253 { return end_;};
00255 inline double * lower() const
00256 { return lower_;};
00258 inline double * upper() const
00259 { return upper_;};
00261 inline int * keyVariable() const
00262 { return keyVariable_;};
00264 inline int * backward() const
00265 { return backward_;};
00267 inline int numberSets() const
00268 { return numberSets_;};
00270 void ClpGubMatrix::switchOffCheck();
00272
00273
00274 protected:
00278
00279 double sumDualInfeasibilities_;
00281 double sumPrimalInfeasibilities_;
00283 double sumOfRelaxedDualInfeasibilities_;
00285 double sumOfRelaxedPrimalInfeasibilities_;
00287 double infeasibilityWeight_;
00289 int * start_;
00291 int * end_;
00293 double * lower_;
00295 double * upper_;
00297 mutable unsigned char * status_;
00299 unsigned char * saveStatus_;
00301 int * savedKeyVariable_;
00303 int * backward_;
00305 int * backToPivotRow_;
00307 double * changeCost_;
00309 mutable int * keyVariable_;
00313 mutable int * next_;
00315 int * toIndex_;
00316
00317 int * fromIndex_;
00319 ClpSimplex * model_;
00321 int numberDualInfeasibilities_;
00323 int numberPrimalInfeasibilities_;
00329 int noCheck_;
00331 int numberSets_;
00333 int saveNumber_;
00335 int possiblePivotKey_;
00337 int gubSlackIn_;
00339 int firstGub_;
00341 int lastGub_;
00344 int gubType_;
00346 };
00347
00348 #endif