coin-Bcp
AbcPrimalColumnSteepest.hpp
Go to the documentation of this file.
1 /* $Id: AbcPrimalColumnSteepest.hpp 2385 2019-01-06 19:43:06Z unxusr $ */
2 // Copyright (C) 2002, International Business Machines
3 // Corporation and others, Copyright (C) 2012, FasterCoin. All Rights Reserved.
4 // This code is licensed under the terms of the Eclipse Public License (EPL).
5 
6 #ifndef AbcPrimalColumnSteepest_H
7 #define AbcPrimalColumnSteepest_H
8 
10 #include <bitset>
11 
12 //#############################################################################
13 class CoinIndexedVector;
14 
22 
23 public:
25 
26 
34  virtual int pivotColumn(CoinPartitionedVector *updates,
35  CoinPartitionedVector *spareRow2,
36  CoinPartitionedVector *spareColumn1);
38  void justDjs(CoinIndexedVector *updates,
39  CoinIndexedVector *spareColumn1);
41  int partialPricing(CoinIndexedVector *updates,
42  int numberWanted,
43  int numberLook);
45  void djsAndDevex(CoinIndexedVector *updates,
46  CoinIndexedVector *spareRow2,
47  CoinIndexedVector *spareColumn1);
49  void djsAndDevex2(CoinIndexedVector *updates,
50  CoinIndexedVector *spareColumn1);
52  void justDevex(CoinIndexedVector *updates,
53  CoinIndexedVector *spareColumn1);
62  CoinPartitionedVector *spareRow2,
63  CoinPartitionedVector *spareColumn1,
64  int type);
65 
67  virtual void updateWeights(CoinIndexedVector *input);
68 
70  void checkAccuracy(int sequence, double relativeTolerance,
71  CoinIndexedVector *rowArray1);
72 
74  void initializeWeights();
75 
84  virtual void saveWeights(AbcSimplex *model, int mode);
86  virtual void unrollWeights();
88  virtual void clearArrays();
90  virtual bool looksOptimal() const;
92  virtual void maximumPivotsChanged();
94 
97  inline int mode() const
99  {
100  return mode_;
101  }
103 
106  enum Persistence {
107  normal = 0x00, // create (if necessary) and destroy
108  keep = 0x01 // create (if necessary) and leave
109  };
110 
112 
113 
121  AbcPrimalColumnSteepest(int mode = 3);
122 
125 
128 
130  virtual ~AbcPrimalColumnSteepest();
131 
133  virtual AbcPrimalColumnPivot *clone(bool copyData = true) const;
134 
136 
138 
141  inline bool reference(int i) const
142  {
143  return ((reference_[i >> 5] >> (i & 31)) & 1) != 0;
144  }
145  inline void setReference(int i, bool trueFalse)
146  {
147  unsigned int &value = reference_[i >> 5];
148  int bit = i & 31;
149  if (trueFalse)
150  value |= (1 << bit);
151  else
152  value &= ~(1 << bit);
153  }
155  inline void setPersistence(Persistence life)
156  {
157  persistence_ = life;
158  }
159  inline Persistence persistence() const
160  {
161  return persistence_;
162  }
163 
165  //---------------------------------------------------------------------------
166 
167 private:
169  // Update weight
170  double devex_;
172  double *weights_;
178  double *savedWeights_;
179  // Array for exact devex to say what is in reference framework
180  unsigned int *reference_;
186  int state_;
199  int mode_;
204  // This is pivot row (or pivot sequence round re-factorization)
206  // This is saved pivot sequence
208  // This is saved outgoing variable
210  // Iteration when last rectified
212  // Size of factorization at invert (used to decide algorithm)
215 };
216 
217 #endif
218 
219 /* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
220 */
Persistence
enums for persistence
int state_
Status 0) Normal -1) Needs initialization 1) Weights are stored by sequence number.
AbcPrimalColumnSteepest(int mode=3)
Default Constructor 0 is exact devex, 1 full steepest, 2 is partial exact devex 3 switches between 0 ...
Persistence persistence_
Life of weights.
void justDjs(CoinIndexedVector *updates, CoinIndexedVector *spareColumn1)
Just update djs.
AbcPrimalColumnSteepest & operator=(const AbcPrimalColumnSteepest &rhs)
Assignment operator.
virtual bool looksOptimal() const
Returns true if would not find any column.
virtual void unrollWeights()
Gets rid of last update.
Persistence persistence() const
reference would be faster using AbcSimplex&#39;s status_, but I prefer to keep modularity.
void initializeWeights()
Initialize weights.
int mode_
0 is exact devex, 1 full steepest, 2 is partial exact devex 3 switches between 0 and 2 depending on f...
virtual void maximumPivotsChanged()
Called when maximum pivots changes.
int partialPricing(CoinIndexedVector *updates, int numberWanted, int numberLook)
Update djs doing partial pricing (dantzig)
void setPersistence(Persistence life)
Set/ get persistence.
virtual AbcPrimalColumnPivot * clone(bool copyData=true) const
Clone.
CoinIndexedVector * infeasible_
square of infeasibility array (just for infeasible columns)
virtual void updateWeights(CoinIndexedVector *input)
Updates weights - part 1 - also checks accuracy.
virtual void saveWeights(AbcSimplex *model, int mode)
Save weights - this may initialize weights as well mode is - 1) before factorization 2) after factori...
Primal Column Pivot Abstract Base Class.
virtual void clearArrays()
Gets rid of all arrays.
AbcSimplex * model()
Returns model.
Indexed Vector.
void djsAndDevex(CoinIndexedVector *updates, CoinIndexedVector *spareRow2, CoinIndexedVector *spareColumn1)
Update djs, weights for Devex using djs.
void djsAndDevex2(CoinIndexedVector *updates, CoinIndexedVector *spareColumn1)
Update djs, weights for Devex using pivot row.
int numberSwitched_
Number of times switched from partial dantzig to 0/2.
virtual ~AbcPrimalColumnSteepest()
Destructor.
CoinIndexedVector * alternateWeights_
alternate weight array (so we can unroll)
int doSteepestWork(CoinPartitionedVector *updates, CoinPartitionedVector *spareRow2, CoinPartitionedVector *spareColumn1, int type)
Does steepest work type - 0 - just djs 1 - just steepest 2 - both using scaleFactor 3 - both using ex...
bool reference(int i) const
reference would be faster using AbcSimplex&#39;s status_, but I prefer to keep modularity.
Primal Column Pivot Steepest Edge Algorithm Class.
double * savedWeights_
save weight array (so we can use checkpoint)
void setReference(int i, bool trueFalse)
reference would be faster using AbcSimplex&#39;s status_, but I prefer to keep modularity.
void justDevex(CoinIndexedVector *updates, CoinIndexedVector *spareColumn1)
Update weights for Devex.
int type()
Returns type (above 63 is extra information)
unsigned int * reference_
weight array
void checkAccuracy(int sequence, double relativeTolerance, CoinIndexedVector *rowArray1)
Checks accuracy - just for debug.
virtual int pivotColumn(CoinPartitionedVector *updates, CoinPartitionedVector *spareRow2, CoinPartitionedVector *spareColumn1)
Returns pivot column, -1 if none.