00001
00002
00003 #ifndef ClpPrimalColumnSteepest_H
00004 #define ClpPrimalColumnSteepest_H
00005
00006 #include "ClpPrimalColumnPivot.hpp"
00007 #include <bitset>
00008
00009
00010
00011
00018 class CoinIndexedVector;
00019
00020 class ClpPrimalColumnSteepest : public ClpPrimalColumnPivot {
00021
00022 public:
00023
00025
00026
00034 virtual int pivotColumn(CoinIndexedVector * updates,
00035 CoinIndexedVector * spareRow1,
00036 CoinIndexedVector * spareRow2,
00037 CoinIndexedVector * spareColumn1,
00038 CoinIndexedVector * spareColumn2);
00040 int pivotColumnOldMethod(CoinIndexedVector * updates,
00041 CoinIndexedVector * spareRow1,
00042 CoinIndexedVector * spareRow2,
00043 CoinIndexedVector * spareColumn1,
00044 CoinIndexedVector * spareColumn2);
00046 void justDjs(CoinIndexedVector * updates,
00047 CoinIndexedVector * spareRow1,
00048 CoinIndexedVector * spareRow2,
00049 CoinIndexedVector * spareColumn1,
00050 CoinIndexedVector * spareColumn2);
00052 int partialPricing(CoinIndexedVector * updates,
00053 CoinIndexedVector * spareRow2,
00054 int numberWanted,
00055 int numberLook);
00057 void djsAndDevex(CoinIndexedVector * updates,
00058 CoinIndexedVector * spareRow1,
00059 CoinIndexedVector * spareRow2,
00060 CoinIndexedVector * spareColumn1,
00061 CoinIndexedVector * spareColumn2);
00063 void djsAndSteepest(CoinIndexedVector * updates,
00064 CoinIndexedVector * spareRow1,
00065 CoinIndexedVector * spareRow2,
00066 CoinIndexedVector * spareColumn1,
00067 CoinIndexedVector * spareColumn2);
00069 void djsAndDevex2(CoinIndexedVector * updates,
00070 CoinIndexedVector * spareRow1,
00071 CoinIndexedVector * spareRow2,
00072 CoinIndexedVector * spareColumn1,
00073 CoinIndexedVector * spareColumn2);
00075 void djsAndSteepest2(CoinIndexedVector * updates,
00076 CoinIndexedVector * spareRow1,
00077 CoinIndexedVector * spareRow2,
00078 CoinIndexedVector * spareColumn1,
00079 CoinIndexedVector * spareColumn2);
00081 void justDevex(CoinIndexedVector * updates,
00082 CoinIndexedVector * spareRow1,
00083 CoinIndexedVector * spareRow2,
00084 CoinIndexedVector * spareColumn1,
00085 CoinIndexedVector * spareColumn2);
00087 void justSteepest(CoinIndexedVector * updates,
00088 CoinIndexedVector * spareRow1,
00089 CoinIndexedVector * spareRow2,
00090 CoinIndexedVector * spareColumn1,
00091 CoinIndexedVector * spareColumn2);
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
00105 virtual void saveWeights(ClpSimplex * model,int mode);
00107 virtual void unrollWeights();
00109 virtual void clearArrays();
00111 virtual bool looksOptimal() const;
00113
00116
00117 inline int mode() const
00118 { return mode_;};
00122 virtual int numberSprintColumns(int & numberIterations) const;
00124 virtual void switchOffSprint();
00125
00127
00130 enum Persistence {
00131 normal = 0x00,
00132 keep = 0x01
00133 };
00134
00136
00137
00145 ClpPrimalColumnSteepest(int mode=3);
00146
00148 ClpPrimalColumnSteepest(const ClpPrimalColumnSteepest &);
00149
00151 ClpPrimalColumnSteepest & operator=(const ClpPrimalColumnSteepest& rhs);
00152
00154 virtual ~ClpPrimalColumnSteepest ();
00155
00157 virtual ClpPrimalColumnPivot * clone(bool copyData = true) const;
00158
00160
00162
00165 inline bool reference(int i) const {
00166 return ((reference_[i>>5]>>(i&31))&1)!=0;
00167 }
00168 inline void setReference(int i,bool trueFalse) {
00169 unsigned int & value = reference_[i>>5];
00170 int bit = i&31;
00171 if (trueFalse)
00172 value |= (1<<bit);
00173 else
00174 value &= ~(1<<bit);
00175 }
00177 inline void setPersistence(Persistence life)
00178 { persistence_ = life;};
00179 inline Persistence persistence() const
00180 { return persistence_ ;};
00181
00183
00184
00185 private:
00187
00188 double devex_;
00190 double * weights_;
00192 CoinIndexedVector * infeasible_;
00194 CoinIndexedVector * alternateWeights_;
00196 double * savedWeights_;
00197
00198 unsigned int * reference_;
00204 int state_;
00217 int mode_;
00219 Persistence persistence_;
00221 int numberSwitched_;
00222
00223 int pivotSequence_;
00224
00225 int savedPivotSequence_;
00226
00227 int savedSequenceOut_;
00228
00229 int sizeFactorization_;
00231 };
00232
00233 #endif