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 numberToDo);
00056 void djsAndDevex(CoinIndexedVector * updates,
00057 CoinIndexedVector * spareRow1,
00058 CoinIndexedVector * spareRow2,
00059 CoinIndexedVector * spareColumn1,
00060 CoinIndexedVector * spareColumn2);
00062 void djsAndSteepest(CoinIndexedVector * updates,
00063 CoinIndexedVector * spareRow1,
00064 CoinIndexedVector * spareRow2,
00065 CoinIndexedVector * spareColumn1,
00066 CoinIndexedVector * spareColumn2);
00068 void djsAndDevex2(CoinIndexedVector * updates,
00069 CoinIndexedVector * spareRow1,
00070 CoinIndexedVector * spareRow2,
00071 CoinIndexedVector * spareColumn1,
00072 CoinIndexedVector * spareColumn2);
00074 void djsAndSteepest2(CoinIndexedVector * updates,
00075 CoinIndexedVector * spareRow1,
00076 CoinIndexedVector * spareRow2,
00077 CoinIndexedVector * spareColumn1,
00078 CoinIndexedVector * spareColumn2);
00080 void justDevex(CoinIndexedVector * updates,
00081 CoinIndexedVector * spareRow1,
00082 CoinIndexedVector * spareRow2,
00083 CoinIndexedVector * spareColumn1,
00084 CoinIndexedVector * spareColumn2);
00086 void justSteepest(CoinIndexedVector * updates,
00087 CoinIndexedVector * spareRow1,
00088 CoinIndexedVector * spareRow2,
00089 CoinIndexedVector * spareColumn1,
00090 CoinIndexedVector * spareColumn2);
00091
00093 virtual void updateWeights(CoinIndexedVector * input);
00094
00096 void checkAccuracy(int sequence,double relativeTolerance,
00097 CoinIndexedVector * rowArray1,
00098 CoinIndexedVector * rowArray2);
00099
00101 void initializeWeights();
00102
00104 virtual void saveWeights(ClpSimplex * model,int mode);
00106 virtual void unrollWeights();
00108 virtual void clearArrays();
00110 virtual bool looksOptimal() const;
00112
00115
00116 inline int mode() const
00117 { return mode_;};
00121 virtual int numberSprintColumns(int & numberIterations) const;
00123 virtual void switchOffSprint();
00124
00126
00127
00129
00130
00138 ClpPrimalColumnSteepest(int mode=3);
00139
00141 ClpPrimalColumnSteepest(const ClpPrimalColumnSteepest &);
00142
00144 ClpPrimalColumnSteepest & operator=(const ClpPrimalColumnSteepest& rhs);
00145
00147 virtual ~ClpPrimalColumnSteepest ();
00148
00150 virtual ClpPrimalColumnPivot * clone(bool copyData = true) const;
00151
00153
00155
00158 inline bool reference(int i) const {
00159 return ((reference_[i>>5]>>(i&31))&1)!=0;
00160 }
00161 inline void setReference(int i,bool trueFalse) {
00162 unsigned int & value = reference_[i>>5];
00163 int bit = i&31;
00164 if (trueFalse)
00165 value |= (1<<bit);
00166 else
00167 value &= ~(1<<bit);
00168 }
00170
00171
00172 private:
00174
00175 double devex_;
00177 double * weights_;
00179 CoinIndexedVector * infeasible_;
00181 CoinIndexedVector * alternateWeights_;
00183 double * savedWeights_;
00184
00185 unsigned int * reference_;
00191 int state_;
00202 int mode_;
00204 int numberSwitched_;
00205
00206 int pivotSequence_;
00207
00208 int savedPivotSequence_;
00209
00210 int savedSequenceOut_;
00211
00212 int sizeFactorization_;
00214 };
00215
00216 #endif