Go to the documentation of this file.00001
00002
00003
00004 #ifndef ClpDynamicMatrix_H
00005 #define ClpDynamicMatrix_H
00006
00007
00008 #include "CoinPragma.hpp"
00009
00010 #include "ClpPackedMatrix.hpp"
00011 class ClpSimplex;
00018 class ClpDynamicMatrix : public ClpPackedMatrix {
00019
00020 public:
00022 enum DynamicStatus {
00023 soloKey = 0x00,
00024 inSmall = 0x01,
00025 atUpperBound = 0x02,
00026 atLowerBound = 0x03
00027 };
00030
00031 virtual void partialPricing(ClpSimplex * model, double start, double end,
00032 int & bestSequence, int & numberWanted);
00033
00037 virtual int updatePivot(ClpSimplex * model, double oldInValue, double oldOutValue);
00041 virtual double * rhsOffset(ClpSimplex * model, bool forceRefresh = false,
00042 bool check = false);
00043
00044 using ClpPackedMatrix::times ;
00048 virtual void times(double scalar,
00049 const double * x, double * y) const;
00051 void modifyOffset(int sequence, double amount);
00053 double keyValue(int iSet) const;
00062 virtual void dualExpanded(ClpSimplex * model, CoinIndexedVector * array,
00063 double * other, int mode);
00081 virtual int generalExpanded(ClpSimplex * model, int mode, int & number);
00086 virtual int refresh(ClpSimplex * model);
00090 virtual void createVariable(ClpSimplex * model, int & bestSequence);
00092 virtual double reducedCost( ClpSimplex * model, int sequence) const;
00094 void gubCrash();
00096 void initialProblem();
00098 int addColumn(int numberEntries, const int * row, const double * element,
00099 double cost, double lower, double upper, int iSet,
00100 DynamicStatus status);
00105 virtual void packDown(const int * , int ) {}
00107 inline double columnLower(int sequence) const {
00108 if (columnLower_) return columnLower_[sequence];
00109 else return 0.0;
00110 }
00112 inline double columnUpper(int sequence) const {
00113 if (columnUpper_) return columnUpper_[sequence];
00114 else return COIN_DBL_MAX;
00115 }
00116
00118
00119
00120
00124 ClpDynamicMatrix();
00131 ClpDynamicMatrix(ClpSimplex * model, int numberSets,
00132 int numberColumns, const int * starts,
00133 const double * lower, const double * upper,
00134 const int * startColumn, const int * row,
00135 const double * element, const double * cost,
00136 const double * columnLower = NULL, const double * columnUpper = NULL,
00137 const unsigned char * status = NULL,
00138 const unsigned char * dynamicStatus = NULL);
00139
00141 virtual ~ClpDynamicMatrix();
00143
00147 ClpDynamicMatrix(const ClpDynamicMatrix&);
00149 ClpDynamicMatrix(const CoinPackedMatrix&);
00150
00151 ClpDynamicMatrix& operator=(const ClpDynamicMatrix&);
00153 virtual ClpMatrixBase * clone() const ;
00155
00157
00158 inline ClpSimplex::Status getStatus(int sequence) const {
00159 return static_cast<ClpSimplex::Status> (status_[sequence] & 7);
00160 }
00161 inline void setStatus(int sequence, ClpSimplex::Status status) {
00162 unsigned char & st_byte = status_[sequence];
00163 st_byte = static_cast<unsigned char>(st_byte & ~7);
00164 st_byte = static_cast<unsigned char>(st_byte | status);
00165 }
00167 inline int numberSets() const {
00168 return numberSets_;
00169 }
00171 inline bool flagged(int i) const {
00172 return (dynamicStatus_[i] & 8) != 0;
00173 }
00174 inline void setFlagged(int i) {
00175 dynamicStatus_[i] = static_cast<unsigned char>(dynamicStatus_[i] | 8);
00176 }
00177 inline void unsetFlagged(int i) {
00178 dynamicStatus_[i] = static_cast<unsigned char>(dynamicStatus_[i] & ~8);
00179 }
00180 inline void setDynamicStatus(int sequence, DynamicStatus status) {
00181 unsigned char & st_byte = dynamicStatus_[sequence];
00182 st_byte = static_cast<unsigned char>(st_byte & ~7);
00183 st_byte = static_cast<unsigned char>(st_byte | status);
00184 }
00185 inline DynamicStatus getDynamicStatus(int sequence) const {
00186 return static_cast<DynamicStatus> (dynamicStatus_[sequence] & 7);
00187 }
00189 inline double objectiveOffset() const {
00190 return objectiveOffset_;
00191 }
00193 inline CoinBigIndex * startColumn() const {
00194 return startColumn_;
00195 }
00197 inline int * row() const {
00198 return row_;
00199 }
00201 inline double * element() const {
00202 return element_;
00203 }
00205 inline double * cost() const {
00206 return cost_;
00207 }
00209 inline int * id() const {
00210 return id_;
00211 }
00213 inline double * columnLower() const {
00214 return columnLower_;
00215 }
00217 inline double * columnUpper() const {
00218 return columnUpper_;
00219 }
00221 inline double * lowerSet() const {
00222 return lowerSet_;
00223 }
00225 inline double * upperSet() const {
00226 return upperSet_;
00227 }
00229 inline int numberGubColumns() const {
00230 return numberGubColumns_;
00231 }
00233 inline int firstAvailable() const {
00234 return firstAvailable_;
00235 }
00237 inline int firstDynamic() const {
00238 return firstDynamic_;
00239 }
00241 inline int lastDynamic() const {
00242 return lastDynamic_;
00243 }
00245 inline int numberStaticRows() const {
00246 return numberStaticRows_;
00247 }
00249 inline int numberElements() const {
00250 return numberElements_;
00251 }
00252 inline int * keyVariable() const {
00253 return keyVariable_;
00254 }
00256 void switchOffCheck();
00258 inline unsigned char * gubRowStatus() const {
00259 return status_;
00260 }
00262 inline unsigned char * dynamicStatus() const {
00263 return dynamicStatus_;
00264 }
00266 int whichSet (int sequence) const;
00268
00269
00270 protected:
00274
00275 double sumDualInfeasibilities_;
00277 double sumPrimalInfeasibilities_;
00279 double sumOfRelaxedDualInfeasibilities_;
00281 double sumOfRelaxedPrimalInfeasibilities_;
00283 double savedBestGubDual_;
00285 int savedBestSet_;
00287 int * backToPivotRow_;
00289 mutable int * keyVariable_;
00291 int * toIndex_;
00292
00293 int * fromIndex_;
00295 int numberSets_;
00297 int numberActiveSets_;
00299 double objectiveOffset_;
00301 double * lowerSet_;
00303 double * upperSet_;
00305 unsigned char * status_;
00307 ClpSimplex * model_;
00309 int firstAvailable_;
00311 int firstAvailableBefore_;
00313 int firstDynamic_;
00315 int lastDynamic_;
00317 int numberStaticRows_;
00319 int numberElements_;
00321 int numberDualInfeasibilities_;
00323 int numberPrimalInfeasibilities_;
00329 int noCheck_;
00331 double infeasibilityWeight_;
00333 int numberGubColumns_;
00335 int maximumGubColumns_;
00337 int maximumElements_;
00339 int * startSet_;
00341 int * next_;
00343 CoinBigIndex * startColumn_;
00345 int * row_;
00347 double * element_;
00349 double * cost_;
00351 int * id_;
00353 unsigned char * dynamicStatus_;
00355 double * columnLower_;
00357 double * columnUpper_;
00359 };
00360
00361 #endif