00001
00002
00003 #ifndef ClpDynamicMatrix_H
00004 #define ClpDynamicMatrix_H
00005
00006
00007 #include "CoinPragma.hpp"
00008
00009 #include "ClpPackedMatrix.hpp"
00010 class ClpSimplex;
00017 class ClpDynamicMatrix : public ClpPackedMatrix {
00018
00019 public:
00021 enum DynamicStatus {
00022 soloKey = 0x00,
00023 inSmall = 0x01,
00024 atUpperBound = 0x02,
00025 atLowerBound = 0x03
00026 };
00029
00030 virtual void partialPricing(ClpSimplex * model, double start, double end,
00031 int & bestSequence, int & numberWanted);
00032
00036 virtual int updatePivot(ClpSimplex * model,double oldInValue, double oldOutValue);
00040 virtual double * rhsOffset(ClpSimplex * model,bool forceRefresh=false,
00041 bool check=false);
00042
00043 using ClpPackedMatrix::times ;
00047 virtual void times(double scalar,
00048 const double * x, double * y) const;
00050 void modifyOffset(int sequence, double amount);
00052 double keyValue(int iSet) const;
00061 virtual void dualExpanded(ClpSimplex * model,CoinIndexedVector * array,
00062 double * other,int mode);
00080 virtual int generalExpanded(ClpSimplex * model,int mode,int & number);
00085 virtual int refresh(ClpSimplex * model);
00089 virtual void createVariable(ClpSimplex * model, int & bestSequence);
00091 virtual double reducedCost( ClpSimplex * model,int sequence) const;
00093 void gubCrash();
00095 void initialProblem();
00097 int addColumn(int numberEntries,const int * row, const double * element,
00098 double cost, double lower, double upper, int iSet,
00099 DynamicStatus status);
00104 virtual void packDown(const int * in, int numberToPack) {}
00106 inline double columnLower(int sequence) const
00107 { if (columnLower_) return columnLower_[sequence]; else return 0.0;}
00109 inline double columnUpper(int sequence) const
00110 { if (columnUpper_) return columnUpper_[sequence]; else return COIN_DBL_MAX;}
00111
00113
00114
00115
00119 ClpDynamicMatrix();
00126 ClpDynamicMatrix(ClpSimplex * model, int numberSets,
00127 int numberColumns, const int * starts,
00128 const double * lower, const double * upper,
00129 const int * startColumn, const int * row,
00130 const double * element, const double * cost,
00131 const double * columnLower=NULL, const double * columnUpper=NULL,
00132 const unsigned char * status=NULL,
00133 const unsigned char * dynamicStatus=NULL);
00134
00136 virtual ~ClpDynamicMatrix();
00138
00142 ClpDynamicMatrix(const ClpDynamicMatrix&);
00144 ClpDynamicMatrix(const CoinPackedMatrix&);
00145
00146 ClpDynamicMatrix& operator=(const ClpDynamicMatrix&);
00148 virtual ClpMatrixBase * clone() const ;
00150
00152
00153 inline ClpSimplex::Status getStatus(int sequence) const
00154 {return static_cast<ClpSimplex::Status> (status_[sequence]&7);}
00155 inline void setStatus(int sequence, ClpSimplex::Status status)
00156 {
00157 unsigned char & st_byte = status_[sequence];
00158 st_byte &= ~7;
00159 st_byte |= status;
00160 }
00162 inline int numberSets() const
00163 { return numberSets_;}
00165 inline bool flagged(int i) const {
00166 return (dynamicStatus_[i]&8)!=0;
00167 }
00168 inline void setFlagged(int i) {
00169 dynamicStatus_[i] |= 8;
00170 }
00171 inline void unsetFlagged(int i) {
00172 dynamicStatus_[i] &= ~8;;
00173 }
00174 inline void setDynamicStatus(int sequence, DynamicStatus status)
00175 {
00176 unsigned char & st_byte = dynamicStatus_[sequence];
00177 st_byte &= ~7;
00178 st_byte |= status;
00179 }
00180 inline DynamicStatus getDynamicStatus(int sequence) const
00181 {return static_cast<DynamicStatus> (dynamicStatus_[sequence]&7);}
00183 inline double objectiveOffset() const
00184 { return objectiveOffset_;}
00186 inline CoinBigIndex * startColumn() const
00187 { return startColumn_;}
00189 inline int * row() const
00190 { return row_;}
00192 inline double * element() const
00193 { return element_;}
00195 inline double * cost() const
00196 { return cost_;}
00198 inline int * id() const
00199 { return id_;}
00201 inline double * columnLower() const
00202 { return columnLower_;}
00204 inline double * columnUpper() const
00205 { return columnUpper_;}
00207 inline double * lowerSet() const
00208 { return lowerSet_;}
00210 inline double * upperSet() const
00211 { return upperSet_;}
00213 inline int numberGubColumns() const
00214 { return numberGubColumns_;}
00216 inline int firstAvailable() const
00217 { return firstAvailable_;}
00219 inline int firstDynamic() const
00220 { return firstDynamic_;}
00222 inline int lastDynamic() const
00223 { return lastDynamic_;}
00225 inline int numberStaticRows() const
00226 { return numberStaticRows_;}
00228 inline int numberElements() const
00229 { return numberElements_;}
00230 inline int * keyVariable() const
00231 { return keyVariable_;}
00233 void switchOffCheck();
00235 inline unsigned char * gubRowStatus() const
00236 { return status_;}
00238 inline unsigned char * dynamicStatus() const
00239 { return dynamicStatus_;}
00241 int whichSet (int sequence) const;
00243
00244
00245 protected:
00249
00250 double sumDualInfeasibilities_;
00252 double sumPrimalInfeasibilities_;
00254 double sumOfRelaxedDualInfeasibilities_;
00256 double sumOfRelaxedPrimalInfeasibilities_;
00258 double savedBestGubDual_;
00260 int savedBestSet_;
00262 int * backToPivotRow_;
00264 mutable int * keyVariable_;
00266 int * toIndex_;
00267
00268 int * fromIndex_;
00270 int numberSets_;
00272 int numberActiveSets_;
00274 double objectiveOffset_;
00276 double * lowerSet_;
00278 double * upperSet_;
00280 unsigned char * status_;
00282 ClpSimplex * model_;
00284 int firstAvailable_;
00286 int firstAvailableBefore_;
00288 int firstDynamic_;
00290 int lastDynamic_;
00292 int numberStaticRows_;
00294 int numberElements_;
00296 int numberDualInfeasibilities_;
00298 int numberPrimalInfeasibilities_;
00304 int noCheck_;
00306 double infeasibilityWeight_;
00308 int numberGubColumns_;
00310 int maximumGubColumns_;
00312 int maximumElements_;
00314 int * startSet_;
00316 int * next_;
00318 CoinBigIndex * startColumn_;
00320 int * row_;
00322 double * element_;
00324 double * cost_;
00326 int * id_;
00328 unsigned char * dynamicStatus_;
00330 double * columnLower_;
00332 double * columnUpper_;
00334 };
00335
00336 #endif