Clp trunk
|
00001 /* $Id$ */ 00002 // Copyright (C) 2002, International Business Machines 00003 // Corporation and others. All Rights Reserved. 00004 // This code is licensed under the terms of the Eclipse Public License (EPL). 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, // create (if necessary) and destroy 00142 keep = 0x01 // create (if necessary) and leave 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 // Update weight 00200 double devex_; 00202 double * weights_; 00204 CoinIndexedVector * infeasible_; 00206 CoinIndexedVector * alternateWeights_; 00208 double * savedWeights_; 00209 // Array for exact devex to say what is in reference framework 00210 unsigned int * reference_; 00216 int state_; 00229 int mode_; 00231 Persistence persistence_; 00233 int numberSwitched_; 00234 // This is pivot row (or pivot sequence round re-factorization) 00235 int pivotSequence_; 00236 // This is saved pivot sequence 00237 int savedPivotSequence_; 00238 // This is saved outgoing variable 00239 int savedSequenceOut_; 00240 // Iteration when last rectified 00241 int lastRectified_; 00242 // Size of factorization at invert (used to decide algorithm) 00243 int sizeFactorization_; 00245 }; 00246 00247 #endif