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);
00045 virtual void times(double scalar,
00046 const double * x, double * y) const;
00048 void modifyOffset(int sequence, double amount);
00050 double keyValue(int iSet) const;
00059 virtual void dualExpanded(ClpSimplex * model,CoinIndexedVector * array,
00060 double * other,int mode);
00078 virtual int generalExpanded(ClpSimplex * model,int mode,int & number);
00083 virtual int refresh(ClpSimplex * model);
00087 virtual void createVariable(ClpSimplex * model, int & bestSequence);
00089 virtual double reducedCost( ClpSimplex * model,int sequence) const;
00091 void gubCrash();
00093 void initialProblem();
00095 int addColumn(int numberEntries,const int * row, const float * element,
00096 float cost, float lower, float upper, int iSet,
00097 DynamicStatus status);
00102 virtual void packDown(const int * in, int numberToPack) {};
00104 inline double columnLower(int sequence) const
00105 { if (columnLower_) return columnLower_[sequence]; else return 0.0;};
00107 inline double columnUpper(int sequence) const
00108 { if (columnUpper_) return columnUpper_[sequence]; else return COIN_DBL_MAX;};
00109
00111
00112
00113
00117 ClpDynamicMatrix();
00124 ClpDynamicMatrix(ClpSimplex * model, int numberSets,
00125 int numberColumns, const int * starts,
00126 const double * lower, const double * upper,
00127 const int * startColumn, const int * row,
00128 const double * element, const double * cost,
00129 const double * columnLower=NULL, const double * columnUpper=NULL,
00130 const unsigned char * status=NULL,
00131 const unsigned char * dynamicStatus=NULL);
00132
00134 virtual ~ClpDynamicMatrix();
00136
00140 ClpDynamicMatrix(const ClpDynamicMatrix&);
00142 ClpDynamicMatrix(const CoinPackedMatrix&);
00143
00144 ClpDynamicMatrix& operator=(const ClpDynamicMatrix&);
00146 virtual ClpMatrixBase * clone() const ;
00148
00150
00151 inline ClpSimplex::Status getStatus(int sequence) const
00152 {return static_cast<ClpSimplex::Status> (status_[sequence]&7);};
00153 inline void setStatus(int sequence, ClpSimplex::Status status)
00154 {
00155 unsigned char & st_byte = status_[sequence];
00156 st_byte &= ~7;
00157 st_byte |= status;
00158 };
00160 inline int numberSets() const
00161 { return numberSets_;};
00163 inline bool flagged(int i) const {
00164 return (dynamicStatus_[i]&8)!=0;
00165 };
00166 inline void setFlagged(int i) {
00167 dynamicStatus_[i] |= 8;
00168 };
00169 inline void unsetFlagged(int i) {
00170 dynamicStatus_[i] &= ~8;;
00171 };
00172 inline void setDynamicStatus(int sequence, DynamicStatus status)
00173 {
00174 unsigned char & st_byte = dynamicStatus_[sequence];
00175 st_byte &= ~7;
00176 st_byte |= status;
00177 };
00178 inline DynamicStatus getDynamicStatus(int sequence) const
00179 {return static_cast<DynamicStatus> (dynamicStatus_[sequence]&7);};
00181 inline double objectiveOffset() const
00182 { return objectiveOffset_;};
00184 inline CoinBigIndex * startColumn() const
00185 { return startColumn_;};
00187 inline int * row() const
00188 { return row_;};
00190 inline float * element() const
00191 { return element_;};
00193 inline float * cost() const
00194 { return cost_;};
00196 inline int * id() const
00197 { return id_;};
00199 inline float * columnLower() const
00200 { return columnLower_;};
00202 inline float * columnUpper() const
00203 { return columnUpper_;};
00205 inline float * lowerSet() const
00206 { return lowerSet_;};
00208 inline float * upperSet() const
00209 { return upperSet_;};
00211 inline int numberGubColumns() const
00212 { return numberGubColumns_;};
00214 inline int firstAvailable() const
00215 { return firstAvailable_;};
00217 inline int firstDynamic() const
00218 { return firstDynamic_;};
00220 inline int lastDynamic() const
00221 { return lastDynamic_;};
00223 inline int numberStaticRows() const
00224 { return numberStaticRows_;};
00226 inline int numberElements() const
00227 { return numberElements_;};
00228 inline int * keyVariable() const
00229 { return keyVariable_;};
00231 void switchOffCheck();
00233 inline unsigned char * gubRowStatus() const
00234 { return status_;};
00236 inline unsigned char * dynamicStatus() const
00237 { return dynamicStatus_;};
00239 int whichSet (int sequence) const;
00241
00242
00243 protected:
00247
00248 double sumDualInfeasibilities_;
00250 double sumPrimalInfeasibilities_;
00252 double sumOfRelaxedDualInfeasibilities_;
00254 double sumOfRelaxedPrimalInfeasibilities_;
00256 double savedBestGubDual_;
00258 int savedBestSet_;
00260 int * backToPivotRow_;
00262 mutable int * keyVariable_;
00264 int * toIndex_;
00265
00266 int * fromIndex_;
00268 int numberSets_;
00270 int numberActiveSets_;
00272 double objectiveOffset_;
00274 float * lowerSet_;
00276 float * upperSet_;
00278 unsigned char * status_;
00280 ClpSimplex * model_;
00282 int firstAvailable_;
00284 int firstAvailableBefore_;
00286 int firstDynamic_;
00288 int lastDynamic_;
00290 int numberStaticRows_;
00292 int numberElements_;
00294 int numberDualInfeasibilities_;
00296 int numberPrimalInfeasibilities_;
00302 int noCheck_;
00304 double infeasibilityWeight_;
00306 int numberGubColumns_;
00308 int maximumGubColumns_;
00310 int maximumElements_;
00312 int * startSet_;
00314 int * next_;
00316 CoinBigIndex * startColumn_;
00318 int * row_;
00320 float * element_;
00322 float * cost_;
00324 int * id_;
00326 unsigned char * dynamicStatus_;
00328 float * columnLower_;
00330 float * columnUpper_;
00332 };
00333
00334 #endif