Clp trunk
|
00001 /* $Id$ */ 00002 // Copyright (C) 2004, International Business Machines 00003 // Corporation and others. All Rights Reserved. 00004 // This code is licensed under the terms of the Eclipse Public License (EPL). 00005 00006 #ifndef ClpDynamicMatrix_H 00007 #define ClpDynamicMatrix_H 00008 00009 00010 #include "CoinPragma.hpp" 00011 00012 #include "ClpPackedMatrix.hpp" 00013 class ClpSimplex; 00020 class ClpDynamicMatrix : public ClpPackedMatrix { 00021 00022 public: 00024 enum DynamicStatus { 00025 soloKey = 0x00, 00026 inSmall = 0x01, 00027 atUpperBound = 0x02, 00028 atLowerBound = 0x03 00029 }; 00032 00033 virtual void partialPricing(ClpSimplex * model, double start, double end, 00034 int & bestSequence, int & numberWanted); 00035 00039 virtual int updatePivot(ClpSimplex * model, double oldInValue, double oldOutValue); 00043 virtual double * rhsOffset(ClpSimplex * model, bool forceRefresh = false, 00044 bool check = false); 00045 00046 using ClpPackedMatrix::times ; 00050 virtual void times(double scalar, 00051 const double * x, double * y) const; 00053 void modifyOffset(int sequence, double amount); 00055 double keyValue(int iSet) const; 00064 virtual void dualExpanded(ClpSimplex * model, CoinIndexedVector * array, 00065 double * other, int mode); 00083 virtual int generalExpanded(ClpSimplex * model, int mode, int & number); 00088 virtual int refresh(ClpSimplex * model); 00092 virtual void createVariable(ClpSimplex * model, int & bestSequence); 00094 virtual double reducedCost( ClpSimplex * model, int sequence) const; 00096 void gubCrash(); 00098 void writeMps(const char * name); 00100 void initialProblem(); 00102 int addColumn(int numberEntries, const int * row, const double * element, 00103 double cost, double lower, double upper, int iSet, 00104 DynamicStatus status); 00109 virtual void packDown(const int * , int ) {} 00111 inline double columnLower(int sequence) const { 00112 if (columnLower_) return columnLower_[sequence]; 00113 else return 0.0; 00114 } 00116 inline double columnUpper(int sequence) const { 00117 if (columnUpper_) return columnUpper_[sequence]; 00118 else return COIN_DBL_MAX; 00119 } 00120 00122 00123 00124 00128 ClpDynamicMatrix(); 00135 ClpDynamicMatrix(ClpSimplex * model, int numberSets, 00136 int numberColumns, const int * starts, 00137 const double * lower, const double * upper, 00138 const int * startColumn, const int * row, 00139 const double * element, const double * cost, 00140 const double * columnLower = NULL, const double * columnUpper = NULL, 00141 const unsigned char * status = NULL, 00142 const unsigned char * dynamicStatus = NULL); 00143 00145 virtual ~ClpDynamicMatrix(); 00147 00151 ClpDynamicMatrix(const ClpDynamicMatrix&); 00153 ClpDynamicMatrix(const CoinPackedMatrix&); 00154 00155 ClpDynamicMatrix& operator=(const ClpDynamicMatrix&); 00157 virtual ClpMatrixBase * clone() const ; 00159 00161 00162 inline ClpSimplex::Status getStatus(int sequence) const { 00163 return static_cast<ClpSimplex::Status> (status_[sequence] & 7); 00164 } 00165 inline void setStatus(int sequence, ClpSimplex::Status status) { 00166 unsigned char & st_byte = status_[sequence]; 00167 st_byte = static_cast<unsigned char>(st_byte & ~7); 00168 st_byte = static_cast<unsigned char>(st_byte | status); 00169 } 00171 inline bool flaggedSlack(int i) const { 00172 return (status_[i] & 8) != 0; 00173 } 00174 inline void setFlaggedSlack(int i) { 00175 status_[i] = static_cast<unsigned char>(status_[i] | 8); 00176 } 00177 inline void unsetFlaggedSlack(int i) { 00178 status_[i] = static_cast<unsigned char>(status_[i] & ~8); 00179 } 00181 inline int numberSets() const { 00182 return numberSets_; 00183 } 00185 inline int numberGubEntries() const 00186 { return startSet_[numberSets_];} 00188 inline int * startSets() const 00189 { return startSet_;} 00191 inline bool flagged(int i) const { 00192 return (dynamicStatus_[i] & 8) != 0; 00193 } 00194 inline void setFlagged(int i) { 00195 dynamicStatus_[i] = static_cast<unsigned char>(dynamicStatus_[i] | 8); 00196 } 00197 inline void unsetFlagged(int i) { 00198 dynamicStatus_[i] = static_cast<unsigned char>(dynamicStatus_[i] & ~8); 00199 } 00200 inline void setDynamicStatus(int sequence, DynamicStatus status) { 00201 unsigned char & st_byte = dynamicStatus_[sequence]; 00202 st_byte = static_cast<unsigned char>(st_byte & ~7); 00203 st_byte = static_cast<unsigned char>(st_byte | status); 00204 } 00205 inline DynamicStatus getDynamicStatus(int sequence) const { 00206 return static_cast<DynamicStatus> (dynamicStatus_[sequence] & 7); 00207 } 00209 inline double objectiveOffset() const { 00210 return objectiveOffset_; 00211 } 00213 inline CoinBigIndex * startColumn() const { 00214 return startColumn_; 00215 } 00217 inline int * row() const { 00218 return row_; 00219 } 00221 inline double * element() const { 00222 return element_; 00223 } 00225 inline double * cost() const { 00226 return cost_; 00227 } 00229 inline int * id() const { 00230 return id_; 00231 } 00233 inline double * columnLower() const { 00234 return columnLower_; 00235 } 00237 inline double * columnUpper() const { 00238 return columnUpper_; 00239 } 00241 inline double * lowerSet() const { 00242 return lowerSet_; 00243 } 00245 inline double * upperSet() const { 00246 return upperSet_; 00247 } 00249 inline int numberGubColumns() const { 00250 return numberGubColumns_; 00251 } 00253 inline int firstAvailable() const { 00254 return firstAvailable_; 00255 } 00257 inline int firstDynamic() const { 00258 return firstDynamic_; 00259 } 00261 inline int lastDynamic() const { 00262 return lastDynamic_; 00263 } 00265 inline int numberStaticRows() const { 00266 return numberStaticRows_; 00267 } 00269 inline int numberElements() const { 00270 return numberElements_; 00271 } 00272 inline int * keyVariable() const { 00273 return keyVariable_; 00274 } 00276 void switchOffCheck(); 00278 inline unsigned char * gubRowStatus() const { 00279 return status_; 00280 } 00282 inline unsigned char * dynamicStatus() const { 00283 return dynamicStatus_; 00284 } 00286 int whichSet (int sequence) const; 00288 00289 00290 protected: 00294 00295 double sumDualInfeasibilities_; 00297 double sumPrimalInfeasibilities_; 00299 double sumOfRelaxedDualInfeasibilities_; 00301 double sumOfRelaxedPrimalInfeasibilities_; 00303 double savedBestGubDual_; 00305 int savedBestSet_; 00307 int * backToPivotRow_; 00309 mutable int * keyVariable_; 00311 int * toIndex_; 00312 // Reverse pointer from index to set 00313 int * fromIndex_; 00315 int numberSets_; 00317 int numberActiveSets_; 00319 double objectiveOffset_; 00321 double * lowerSet_; 00323 double * upperSet_; 00325 unsigned char * status_; 00327 ClpSimplex * model_; 00329 int firstAvailable_; 00331 int firstAvailableBefore_; 00333 int firstDynamic_; 00335 int lastDynamic_; 00337 int numberStaticRows_; 00339 int numberElements_; 00341 int numberDualInfeasibilities_; 00343 int numberPrimalInfeasibilities_; 00349 int noCheck_; 00351 double infeasibilityWeight_; 00353 int numberGubColumns_; 00355 int maximumGubColumns_; 00357 int maximumElements_; 00359 int * startSet_; 00361 int * next_; 00363 CoinBigIndex * startColumn_; 00365 int * row_; 00367 double * element_; 00369 double * cost_; 00371 int * id_; 00373 unsigned char * dynamicStatus_; 00375 double * columnLower_; 00377 double * columnUpper_; 00379 }; 00380 00381 #endif