/home/coin/SVN-release/Cbc-1.1.1/CoinUtils/src/CoinWarmStartBasis.hpp

Go to the documentation of this file.
00001 
00011 #ifndef CoinWarmStartBasis_H
00012 #define CoinWarmStartBasis_H
00013 
00014 #include "CoinHelperFunctions.hpp"
00015 #include "CoinWarmStart.hpp"
00016 
00017 //#############################################################################
00018 
00035 class CoinWarmStartBasis : public CoinWarmStart {
00036 public:
00037 
00052   enum Status {
00053     isFree = 0x00,              
00054     basic = 0x01,               
00055     atUpperBound = 0x02,        
00056     atLowerBound = 0x03         
00057   };
00058 
00059 public:
00060 
00071 
00072   inline int getNumStructural() const { return numStructural_; }
00073 
00075   inline int getNumArtificial() const { return numArtificial_; }
00076 
00081   int numberBasicStructurals() const ;
00082 
00084   inline Status getStructStatus(int i) const {
00085     const int st = (structuralStatus_[i>>2] >> ((i&3)<<1)) & 3;
00086     return static_cast<CoinWarmStartBasis::Status>(st);
00087   }
00088 
00090   inline void setStructStatus(int i, Status st) {
00091     char& st_byte = structuralStatus_[i>>2];
00092     st_byte &= ~(3 << ((i&3)<<1));
00093     st_byte |= (st << ((i&3)<<1));
00094   }
00095 
00101   inline char * getStructuralStatus() { return structuralStatus_; }
00102 
00108   inline const char * getStructuralStatus() const { return structuralStatus_; }
00109 
00113   inline char * getArtificialStatus() { return artificialStatus_; }
00114 
00116   inline Status getArtifStatus(int i) const {
00117     const int st = (artificialStatus_[i>>2] >> ((i&3)<<1)) & 3;
00118     return static_cast<CoinWarmStartBasis::Status>(st);
00119   }
00120 
00122   inline void setArtifStatus(int i, Status st) {
00123     char& st_byte = artificialStatus_[i>>2];
00124     st_byte &= ~(3 << ((i&3)<<1));
00125     st_byte |= (st << ((i&3)<<1));
00126   }
00127 
00133   inline const char * getArtificialStatus() const { return artificialStatus_; }
00134 
00136 
00139 
00147   virtual CoinWarmStartDiff*
00148   generateDiff (const CoinWarmStart *const oldCWS) const ;
00149 
00156   virtual void
00157   applyDiff (const CoinWarmStartDiff *const cwsdDiff) ;
00158 
00160 
00161 
00164 
00170   virtual void setSize(int ns, int na) ;
00171 
00180   virtual void resize (int newNumberRows, int newNumberColumns);
00181 
00198   virtual void compressRows (int tgtCnt, const int *tgts) ;
00199 
00211   virtual void deleteRows(int rawTgtCnt, const int *rawTgts) ;
00212 
00223   virtual void deleteColumns(int number, const int * which);
00224 
00226 
00230 
00236   CoinWarmStartBasis();
00237 
00247   CoinWarmStartBasis(int ns, int na, const char* sStat, const char* aStat) ;
00248 
00250   CoinWarmStartBasis(const CoinWarmStartBasis& ws) ;
00251 
00253   virtual CoinWarmStart *clone() const
00254   {
00255      return new CoinWarmStartBasis(*this);
00256   }
00257 
00259   virtual ~CoinWarmStartBasis();
00260 
00263   virtual CoinWarmStartBasis& operator=(const CoinWarmStartBasis& rhs) ;
00264 
00280   virtual void assignBasisStatus(int ns, int na, char*& sStat, char*& aStat) ;
00282 
00285 
00287   virtual void print() const;
00288 
00290 
00291 protected:
00298 
00299     int numStructural_;
00301     int numArtificial_;
00303     char * structuralStatus_;
00305     char * artificialStatus_;
00307 };
00308 
00309 
00314 inline CoinWarmStartBasis::Status getStatus(const char *array, int i)  {
00315   const int st = (array[i>>2] >> ((i&3)<<1)) & 3;
00316   return static_cast<CoinWarmStartBasis::Status>(st);
00317 }
00318 
00323 inline void setStatus(char * array, int i, CoinWarmStartBasis::Status st) {
00324   char& st_byte = array[i>>2];
00325   st_byte &= ~(3 << ((i&3)<<1));
00326   st_byte |= (st << ((i&3)<<1));
00327 }
00328 
00329 
00330 
00354 class CoinWarmStartBasisDiff : public CoinWarmStartDiff
00355 { public:
00356 
00358   virtual CoinWarmStartDiff *clone() const
00359   { CoinWarmStartBasisDiff *cwsbd =  new CoinWarmStartBasisDiff(*this) ;
00360     return (dynamic_cast<CoinWarmStartDiff *>(cwsbd)) ; }
00361 
00363   virtual
00364     CoinWarmStartBasisDiff &operator= (const CoinWarmStartBasisDiff &rhs) ;
00365 
00367   virtual ~CoinWarmStartBasisDiff()
00368   { delete[] diffNdxs_ ;
00369     delete[] diffVals_ ; }
00370 
00371   protected:
00372 
00379   CoinWarmStartBasisDiff () : sze_(0), diffNdxs_(0), diffVals_(0) { } ;
00380 
00391   CoinWarmStartBasisDiff (const CoinWarmStartBasisDiff &cwsbd) ;
00392 
00394   CoinWarmStartBasisDiff (int sze, const unsigned int *const diffNdxs,
00395                           const unsigned int *const diffVals) ;
00396   
00397   private:
00398 
00399   friend CoinWarmStartDiff*
00400     CoinWarmStartBasis::generateDiff(const CoinWarmStart *const oldCWS) const ;
00401   friend void
00402     CoinWarmStartBasis::applyDiff(const CoinWarmStartDiff *const diff) ;
00403 
00405   int sze_ ;
00406 
00409   unsigned int *diffNdxs_ ;
00410 
00413   unsigned int *diffVals_ ;
00414 } ;
00415 
00416 
00417 #endif

Generated on Thu May 15 21:59:05 2008 by  doxygen 1.4.7