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
00065
00066 using ClpPackedMatrix::transposeTimes ;
00071 virtual void transposeTimes(const ClpSimplex * model, double scalar,
00072 const CoinIndexedVector * x,
00073 CoinIndexedVector * y,
00074 CoinIndexedVector * z) const;
00080 virtual void transposeTimesByRow(const ClpSimplex * model, double scalar,
00081 const CoinIndexedVector * x,
00082 CoinIndexedVector * y,
00083 CoinIndexedVector * z) const;
00087 virtual void subsetTransposeTimes(const ClpSimplex * model,
00088 const CoinIndexedVector * x,
00089 const CoinIndexedVector * y,
00090 CoinIndexedVector * z) const;
00097 virtual int extendUpdated(ClpSimplex * model,CoinIndexedVector * update,int mode);
00103 virtual void primalExpanded(ClpSimplex * model,int mode);
00112 virtual void dualExpanded(ClpSimplex * model,CoinIndexedVector * array,
00113 double * other,int mode);
00131 virtual int generalExpanded(ClpSimplex * model,int mode,int & number);
00135 virtual int updatePivot(ClpSimplex * model,double oldInValue, double oldOutValue);
00137 virtual void useEffectiveRhs(ClpSimplex * model,bool cheapest=true);
00141 virtual double * rhsOffset(ClpSimplex * model,bool forceRefresh=false,
00142 bool check=false);
00155 virtual int synchronize(ClpSimplex * model,int mode);
00157 virtual void correctSequence(const ClpSimplex * model,int & sequenceIn, int & sequenceOut) ;
00159
00160
00161
00165 ClpGubMatrix();
00167 virtual ~ClpGubMatrix();
00169
00173 ClpGubMatrix(const ClpGubMatrix&);
00175 ClpGubMatrix(const CoinPackedMatrix&);
00178 ClpGubMatrix (const ClpGubMatrix & wholeModel,
00179 int numberRows, const int * whichRows,
00180 int numberColumns, const int * whichColumns);
00181 ClpGubMatrix (const CoinPackedMatrix & wholeModel,
00182 int numberRows, const int * whichRows,
00183 int numberColumns, const int * whichColumns);
00184
00186 ClpGubMatrix(CoinPackedMatrix * matrix);
00187
00190 ClpGubMatrix(ClpPackedMatrix * matrix, int numberSets,
00191 const int * start, const int * end,
00192 const double * lower, const double * upper,
00193 const unsigned char * status=NULL);
00194
00195 ClpGubMatrix& operator=(const ClpGubMatrix&);
00197 virtual ClpMatrixBase * clone() const ;
00200 virtual ClpMatrixBase * subsetClone (
00201 int numberRows, const int * whichRows,
00202 int numberColumns, const int * whichColumns) const ;
00204 void redoSet(ClpSimplex * model,int newKey, int oldKey, int iSet);
00206
00208
00209 inline ClpSimplex::Status getStatus(int sequence) const
00210 {return static_cast<ClpSimplex::Status> (status_[sequence]&7);}
00211 inline void setStatus(int sequence, ClpSimplex::Status status)
00212 {
00213 unsigned char & st_byte = status_[sequence];
00214 st_byte &= ~7;
00215 st_byte |= status;
00216 }
00218 inline void setFlagged( int sequence)
00219 {
00220 status_[sequence] |= 64;
00221 }
00222 inline void clearFlagged( int sequence)
00223 {
00224 status_[sequence] &= ~64;
00225 }
00226 inline bool flagged(int sequence) const
00227 {return ((status_[sequence]&64)!=0);}
00229 inline void setAbove( int sequence)
00230 {
00231 unsigned char iStat = status_[sequence];
00232 iStat &= ~24;
00233 status_[sequence] = iStat|16;
00234 }
00236 inline void setFeasible( int sequence)
00237 {
00238 unsigned char iStat = status_[sequence];
00239 iStat &= ~24;
00240 status_[sequence] = iStat|8;
00241 }
00243 inline void setBelow( int sequence)
00244 {
00245 unsigned char iStat = status_[sequence];
00246 iStat &= ~24;
00247 status_[sequence] = iStat;
00248 }
00249 inline double weight( int sequence) const
00250 {
00251 int iStat = status_[sequence]&31;
00252 iStat = iStat>>3;
00253 return (double) (iStat-1);
00254 }
00256 inline int * start() const
00257 { return start_;}
00259 inline int * end() const
00260 { return end_;}
00262 inline double * lower() const
00263 { return lower_;}
00265 inline double * upper() const
00266 { return upper_;}
00268 inline int * keyVariable() const
00269 { return keyVariable_;}
00271 inline int * backward() const
00272 { return backward_;}
00274 inline int numberSets() const
00275 { return numberSets_;}
00277 void switchOffCheck();
00279
00280
00281 protected:
00285
00286 double sumDualInfeasibilities_;
00288 double sumPrimalInfeasibilities_;
00290 double sumOfRelaxedDualInfeasibilities_;
00292 double sumOfRelaxedPrimalInfeasibilities_;
00294 double infeasibilityWeight_;
00296 int * start_;
00298 int * end_;
00300 double * lower_;
00302 double * upper_;
00304 mutable unsigned char * status_;
00306 unsigned char * saveStatus_;
00308 int * savedKeyVariable_;
00310 int * backward_;
00312 int * backToPivotRow_;
00314 double * changeCost_;
00316 mutable int * keyVariable_;
00320 mutable int * next_;
00322 int * toIndex_;
00323
00324 int * fromIndex_;
00326 ClpSimplex * model_;
00328 int numberDualInfeasibilities_;
00330 int numberPrimalInfeasibilities_;
00336 int noCheck_;
00338 int numberSets_;
00340 int saveNumber_;
00342 int possiblePivotKey_;
00344 int gubSlackIn_;
00346 int firstGub_;
00348 int lastGub_;
00351 int gubType_;
00353 };
00354
00355 #endif