CoinWarmStartBasis.hpp
Go to the documentation of this file.
1 /* $Id: CoinWarmStartBasis.hpp 1215 2009-11-05 11:03:04Z forrest $ */
12 #ifndef CoinWarmStartBasis_H
13 #define CoinWarmStartBasis_H
14 
15 #include <vector>
16 
17 #include "CoinSort.hpp"
18 #include "CoinHelperFunctions.hpp"
19 #include "CoinWarmStart.hpp"
20 
21 //#############################################################################
22 
39 class CoinWarmStartBasis : public virtual CoinWarmStart {
40 public:
41 
56  enum Status {
57  isFree = 0x00,
58  basic = 0x01,
59  atUpperBound = 0x02,
60  atLowerBound = 0x03
61  };
62 
67 
71  typedef std::vector<XferEntry> XferVec ;
72 
73 public:
74 
85 
86  inline int getNumStructural() const { return numStructural_; }
87 
89  inline int getNumArtificial() const { return numArtificial_; }
90 
95  int numberBasicStructurals() const ;
96 
98  inline Status getStructStatus(int i) const {
99  const int st = (structuralStatus_[i>>2] >> ((i&3)<<1)) & 3;
100  return static_cast<CoinWarmStartBasis::Status>(st);
101  }
102 
104  inline void setStructStatus(int i, Status st) {
105  char& st_byte = structuralStatus_[i>>2];
106  st_byte = static_cast<char>(st_byte & ~(3 << ((i&3)<<1))) ;
107  st_byte = static_cast<char>(st_byte | (st << ((i&3)<<1))) ;
108  }
109 
115  inline char * getStructuralStatus() { return structuralStatus_; }
116 
122  inline const char * getStructuralStatus() const { return structuralStatus_; }
123 
127  inline char * getArtificialStatus() { return artificialStatus_; }
128 
130  inline Status getArtifStatus(int i) const {
131  const int st = (artificialStatus_[i>>2] >> ((i&3)<<1)) & 3;
132  return static_cast<CoinWarmStartBasis::Status>(st);
133  }
134 
136  inline void setArtifStatus(int i, Status st) {
137  char& st_byte = artificialStatus_[i>>2];
138  st_byte = static_cast<char>(st_byte & ~(3 << ((i&3)<<1))) ;
139  st_byte = static_cast<char>(st_byte | (st << ((i&3)<<1))) ;
140  }
141 
147  inline const char * getArtificialStatus() const { return artificialStatus_; }
148 
150 
153 
161  virtual CoinWarmStartDiff*
162  generateDiff (const CoinWarmStart *const oldCWS) const ;
163 
170  virtual void
171  applyDiff (const CoinWarmStartDiff *const cwsdDiff) ;
172 
174 
175 
178 
184  virtual void setSize(int ns, int na) ;
185 
194  virtual void resize (int newNumberRows, int newNumberColumns);
195 
212  virtual void compressRows (int tgtCnt, const int *tgts) ;
213 
225  virtual void deleteRows(int rawTgtCnt, const int *rawTgts) ;
226 
237  virtual void deleteColumns(int number, const int * which);
238 
251  virtual void mergeBasis(const CoinWarmStartBasis *src,
252  const XferVec *xferRows,
253  const XferVec *xferCols) ;
254 
256 
260 
267 
277  CoinWarmStartBasis(int ns, int na, const char* sStat, const char* aStat) ;
278 
281 
283  virtual CoinWarmStart *clone() const
284  {
285  return new CoinWarmStartBasis(*this);
286  }
287 
289  virtual ~CoinWarmStartBasis();
290 
293  virtual CoinWarmStartBasis& operator=(const CoinWarmStartBasis& rhs) ;
294 
310  virtual void assignBasisStatus(int ns, int na, char*& sStat, char*& aStat) ;
312 
315 
317  virtual void print() const;
319  bool fullBasis() const;
321  bool fixFullBasis();
322 
324 
325 protected:
332 
337  int maxSize_;
343 };
344 
345 
350 inline CoinWarmStartBasis::Status getStatus(const char *array, int i) {
351  const int st = (array[i>>2] >> ((i&3)<<1)) & 3;
352  return static_cast<CoinWarmStartBasis::Status>(st);
353 }
354 
359 inline void setStatus(char * array, int i, CoinWarmStartBasis::Status st) {
360  char& st_byte = array[i>>2];
361  st_byte = static_cast<char>(st_byte & ~(3 << ((i&3)<<1))) ;
362  st_byte = static_cast<char>(st_byte | (st << ((i&3)<<1))) ;
363 }
364 
365 
366 
391 { public:
392 
394  virtual CoinWarmStartDiff *clone() const
395  { CoinWarmStartBasisDiff *cwsbd = new CoinWarmStartBasisDiff(*this) ;
396  return (dynamic_cast<CoinWarmStartDiff *>(cwsbd)) ; }
397 
399  virtual
401 
403  virtual ~CoinWarmStartBasisDiff();
404 
405  protected:
406 
414 
426 
428  CoinWarmStartBasisDiff (int sze, const unsigned int *const diffNdxs,
429  const unsigned int *const diffVals) ;
430 
433 
434  private:
435 
436  friend CoinWarmStartDiff*
437  CoinWarmStartBasis::generateDiff(const CoinWarmStart *const oldCWS) const ;
438  friend void
440 
442  int sze_ ;
443 
446  unsigned int *difference_ ;
447 
448 } ;
449 
450 
451 #endif