00001
00002
00003
00004
00005
00006 #ifndef ClpPrimalColumnSteepest_H
00007 #define ClpPrimalColumnSteepest_H
00008
00009 #include "ClpPrimalColumnPivot.hpp"
00010 #include <bitset>
00011
00012
00013 class CoinIndexedVector;
00014
00015
00023 class ClpPrimalColumnSteepest : public ClpPrimalColumnPivot {
00024
00025 public:
00026
00028
00029
00037 virtual int pivotColumn(CoinIndexedVector * updates,
00038 CoinIndexedVector * spareRow1,
00039 CoinIndexedVector * spareRow2,
00040 CoinIndexedVector * spareColumn1,
00041 CoinIndexedVector * spareColumn2);
00043 int pivotColumnOldMethod(CoinIndexedVector * updates,
00044 CoinIndexedVector * spareRow1,
00045 CoinIndexedVector * spareRow2,
00046 CoinIndexedVector * spareColumn1,
00047 CoinIndexedVector * spareColumn2);
00049 void justDjs(CoinIndexedVector * updates,
00050 CoinIndexedVector * spareRow2,
00051 CoinIndexedVector * spareColumn1,
00052 CoinIndexedVector * spareColumn2);
00054 int partialPricing(CoinIndexedVector * updates,
00055 CoinIndexedVector * spareRow2,
00056 int numberWanted,
00057 int numberLook);
00059 void djsAndDevex(CoinIndexedVector * updates,
00060 CoinIndexedVector * spareRow2,
00061 CoinIndexedVector * spareColumn1,
00062 CoinIndexedVector * spareColumn2);
00064 void djsAndSteepest(CoinIndexedVector * updates,
00065 CoinIndexedVector * spareRow2,
00066 CoinIndexedVector * spareColumn1,
00067 CoinIndexedVector * spareColumn2);
00069 void djsAndDevex2(CoinIndexedVector * updates,
00070 CoinIndexedVector * spareRow2,
00071 CoinIndexedVector * spareColumn1,
00072 CoinIndexedVector * spareColumn2);
00074 void djsAndSteepest2(CoinIndexedVector * updates,
00075 CoinIndexedVector * spareRow2,
00076 CoinIndexedVector * spareColumn1,
00077 CoinIndexedVector * spareColumn2);
00079 void justDevex(CoinIndexedVector * updates,
00080 CoinIndexedVector * spareRow2,
00081 CoinIndexedVector * spareColumn1,
00082 CoinIndexedVector * spareColumn2);
00084 void justSteepest(CoinIndexedVector * updates,
00085 CoinIndexedVector * spareRow2,
00086 CoinIndexedVector * spareColumn1,
00087 CoinIndexedVector * spareColumn2);
00089 void transposeTimes2(const CoinIndexedVector * pi1, CoinIndexedVector * dj1,
00090 const CoinIndexedVector * pi2, CoinIndexedVector * dj2,
00091 CoinIndexedVector * spare, double scaleFactor);
00092
00094 virtual void updateWeights(CoinIndexedVector * input);
00095
00097 void checkAccuracy(int sequence, double relativeTolerance,
00098 CoinIndexedVector * rowArray1,
00099 CoinIndexedVector * rowArray2);
00100
00102 void initializeWeights();
00103
00112 virtual void saveWeights(ClpSimplex * model, int mode);
00114 virtual void unrollWeights();
00116 virtual void clearArrays();
00118 virtual bool looksOptimal() const;
00120 virtual void maximumPivotsChanged();
00122
00125
00126 inline int mode() const {
00127 return mode_;
00128 }
00132 virtual int numberSprintColumns(int & numberIterations) const;
00134 virtual void switchOffSprint();
00135
00137
00140 enum Persistence {
00141 normal = 0x00,
00142 keep = 0x01
00143 };
00144
00146
00147
00155 ClpPrimalColumnSteepest(int mode = 3);
00156
00158 ClpPrimalColumnSteepest(const ClpPrimalColumnSteepest & rhs);
00159
00161 ClpPrimalColumnSteepest & operator=(const ClpPrimalColumnSteepest& rhs);
00162
00164 virtual ~ClpPrimalColumnSteepest ();
00165
00167 virtual ClpPrimalColumnPivot * clone(bool copyData = true) const;
00168
00170
00172
00175 inline bool reference(int i) const {
00176 return ((reference_[i>>5] >> (i & 31)) & 1) != 0;
00177 }
00178 inline void setReference(int i, bool trueFalse) {
00179 unsigned int & value = reference_[i>>5];
00180 int bit = i & 31;
00181 if (trueFalse)
00182 value |= (1 << bit);
00183 else
00184 value &= ~(1 << bit);
00185 }
00187 inline void setPersistence(Persistence life) {
00188 persistence_ = life;
00189 }
00190 inline Persistence persistence() const {
00191 return persistence_ ;
00192 }
00193
00195
00196
00197 private:
00199
00200 double devex_;
00202 double * weights_;
00204 CoinIndexedVector * infeasible_;
00206 CoinIndexedVector * alternateWeights_;
00208 double * savedWeights_;
00209
00210 unsigned int * reference_;
00216 int state_;
00229 int mode_;
00231 Persistence persistence_;
00233 int numberSwitched_;
00234
00235 int pivotSequence_;
00236
00237 int savedPivotSequence_;
00238
00239 int savedSequenceOut_;
00240
00241 int lastRectified_;
00242
00243 int sizeFactorization_;
00245 };
00246
00247 #endif