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 };
00028 virtual void partialPricing(ClpSimplex * model, double start, double end,
00029 int & bestSequence, int & numberWanted);
00030
00034 virtual int updatePivot(ClpSimplex * model,double oldInValue, double oldOutValue);
00038 virtual double * rhsOffset(ClpSimplex * model,bool forceRefresh=false,
00039 bool check=false);
00043 virtual void times(double scalar,
00044 const double * x, double * y) const;
00046 void modifyOffset(int sequence, double amount);
00048 double keyValue(int iSet) const;
00057 virtual void dualExpanded(ClpSimplex * model,CoinIndexedVector * array,
00058 double * other,int mode);
00076 virtual int generalExpanded(ClpSimplex * model,int mode,int & number);
00081 virtual int refresh(ClpSimplex * model);
00085 virtual void createVariable(ClpSimplex * model, int & bestSequence);
00087 virtual double reducedCost( ClpSimplex * model,int sequence) const;
00089 void gubCrash();
00091 void initialProblem();
00093 int addColumn(int numberEntries,const int * row, const float * element,
00094 float cost, float lower, float upper, int iSet,
00095 DynamicStatus status);
00100 virtual void packDown(const int * in, int numberToPack) {};
00102 inline double columnLower(int sequence) const
00103 { if (columnLower_) return columnLower_[sequence]; else return 0.0;};
00105 inline double columnUpper(int sequence) const
00106 { if (columnUpper_) return columnUpper_[sequence]; else return COIN_DBL_MAX;};
00107
00109
00110
00111
00115 ClpDynamicMatrix();
00122 ClpDynamicMatrix(ClpSimplex * model, int numberSets,
00123 int numberColumns, const int * starts,
00124 const double * lower, const double * upper,
00125 const int * startColumn, const int * row,
00126 const double * element, const double * cost,
00127 const double * columnLower=NULL, const double * columnUpper=NULL,
00128 const unsigned char * status=NULL,
00129 const unsigned char * dynamicStatus=NULL);
00130
00132 virtual ~ClpDynamicMatrix();
00134
00138 ClpDynamicMatrix(const ClpDynamicMatrix&);
00140 ClpDynamicMatrix(const CoinPackedMatrix&);
00141
00142 ClpDynamicMatrix& operator=(const ClpDynamicMatrix&);
00144 virtual ClpMatrixBase * clone() const ;
00146
00148
00149 inline ClpSimplex::Status getStatus(int sequence) const
00150 {return static_cast<ClpSimplex::Status> (status_[sequence]&7);};
00151 inline void setStatus(int sequence, ClpSimplex::Status status)
00152 {
00153 unsigned char & st_byte = status_[sequence];
00154 st_byte &= ~7;
00155 st_byte |= status;
00156 };
00158 inline int numberSets() const
00159 { return numberSets_;};
00161 inline bool flagged(int i) const {
00162 return (dynamicStatus_[i]&8)!=0;
00163 };
00164 inline void setFlagged(int i) {
00165 dynamicStatus_[i] |= 8;
00166 };
00167 inline void unsetFlagged(int i) {
00168 dynamicStatus_[i] &= ~8;;
00169 };
00170 inline void setDynamicStatus(int sequence, DynamicStatus status)
00171 {
00172 unsigned char & st_byte = dynamicStatus_[sequence];
00173 st_byte &= ~7;
00174 st_byte |= status;
00175 };
00176 inline DynamicStatus getDynamicStatus(int sequence) const
00177 {return static_cast<DynamicStatus> (dynamicStatus_[sequence]&7);};
00179 inline double objectiveOffset() const
00180 { return objectiveOffset_;};
00182 inline CoinBigIndex * startColumn() const
00183 { return startColumn_;};
00185 inline int * row() const
00186 { return row_;};
00188 inline float * element() const
00189 { return element_;};
00191 inline float * cost() const
00192 { return cost_;};
00194 inline int * id() const
00195 { return id_;};
00197 inline float * columnLower() const
00198 { return columnLower_;};
00200 inline float * columnUpper() const
00201 { return columnUpper_;};
00203 inline float * lowerSet() const
00204 { return lowerSet_;};
00206 inline float * upperSet() const
00207 { return upperSet_;};
00209 inline int numberGubColumns() const
00210 { return numberGubColumns_;};
00212 inline int firstAvailable() const
00213 { return firstAvailable_;};
00215 inline int firstDynamic() const
00216 { return firstDynamic_;};
00218 inline int lastDynamic() const
00219 { return lastDynamic_;};
00221 inline int numberStaticRows() const
00222 { return numberStaticRows_;};
00224 inline int numberElements() const
00225 { return numberElements_;};
00226 inline int * keyVariable() const
00227 { return keyVariable_;};
00229 void switchOffCheck();
00231 inline unsigned char * gubRowStatus() const
00232 { return status_;};
00234 inline unsigned char * dynamicStatus() const
00235 { return dynamicStatus_;};
00237 int whichSet (int sequence) const;
00239
00240
00241 protected:
00245
00246 double sumDualInfeasibilities_;
00248 double sumPrimalInfeasibilities_;
00250 double sumOfRelaxedDualInfeasibilities_;
00252 double sumOfRelaxedPrimalInfeasibilities_;
00254 double savedBestGubDual_;
00256 int savedBestSet_;
00258 int * backToPivotRow_;
00260 mutable int * keyVariable_;
00262 int * toIndex_;
00263
00264 int * fromIndex_;
00266 int numberSets_;
00268 int numberActiveSets_;
00270 double objectiveOffset_;
00272 float * lowerSet_;
00274 float * upperSet_;
00276 unsigned char * status_;
00278 ClpSimplex * model_;
00280 int firstAvailable_;
00282 int firstAvailableBefore_;
00284 int firstDynamic_;
00286 int lastDynamic_;
00288 int numberStaticRows_;
00290 int numberElements_;
00292 int numberDualInfeasibilities_;
00294 int numberPrimalInfeasibilities_;
00300 int noCheck_;
00302 double infeasibilityWeight_;
00304 int numberGubColumns_;
00306 int maximumGubColumns_;
00308 int maximumElements_;
00310 int * startSet_;
00312 int * next_;
00314 CoinBigIndex * startColumn_;
00316 int * row_;
00318 float * element_;
00320 float * cost_;
00322 int * id_;
00324 unsigned char * dynamicStatus_;
00326 float * columnLower_;
00328 float * columnUpper_;
00330 };
00331
00332 #endif