Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

CoinWarmStartBasis.hpp

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 
00048   enum Status {
00049     isFree = 0x00,              
00050     basic = 0x01,               
00051     atUpperBound = 0x02,        
00052     atLowerBound = 0x03         
00053   };
00054 
00055 public:
00056 
00067 
00068   inline int getNumStructural() const { return numStructural_; }
00069 
00071   inline int getNumArtificial() const { return numArtificial_; }
00072 
00077   int numberBasicStructurals();
00078 
00080   inline Status getStructStatus(int i) const {
00081     const int st = (structuralStatus_[i>>2] >> ((i&3)<<1)) & 3;
00082     return static_cast<CoinWarmStartBasis::Status>(st);
00083   }
00084 
00086   inline void setStructStatus(int i, Status st) {
00087     char& st_byte = structuralStatus_[i>>2];
00088     st_byte &= ~(3 << ((i&3)<<1));
00089     st_byte |= (st << ((i&3)<<1));
00090   }
00091 
00097   inline char * getStructuralStatus() { return structuralStatus_; }
00098 
00104   inline const char * getStructuralStatus() const { return structuralStatus_; }
00105 
00109   inline char * getArtificialStatus() { return artificialStatus_; }
00110 
00112   inline Status getArtifStatus(int i) const {
00113     const int st = (artificialStatus_[i>>2] >> ((i&3)<<1)) & 3;
00114     return static_cast<CoinWarmStartBasis::Status>(st);
00115   }
00116 
00118   inline void setArtifStatus(int i, Status st) {
00119     char& st_byte = artificialStatus_[i>>2];
00120     st_byte &= ~(3 << ((i&3)<<1));
00121     st_byte |= (st << ((i&3)<<1));
00122   }
00123 
00129   inline const char * getArtificialStatus() const { return artificialStatus_; }
00130 
00132 
00135 
00143   virtual CoinWarmStartDiff*
00144   CoinWarmStartBasis::generateDiff (const CoinWarmStart *const oldCWS) const ;
00145 
00152   virtual void
00153   CoinWarmStartBasis::applyDiff (const CoinWarmStartDiff *const cwsdDiff) ;
00154 
00156 
00157 
00160 
00162   virtual void setSize(int ns, int na) ;
00163 
00165   virtual void resize (int newNumberRows, int newNumberColumns);
00166 
00179   virtual void deleteRows(int number, const int * which);
00180 
00191   virtual void deleteColumns(int number, const int * which);
00192 
00194 
00198 
00204   CoinWarmStartBasis();
00205 
00215   CoinWarmStartBasis(int ns, int na, const char* sStat, const char* aStat) ;
00216 
00218   CoinWarmStartBasis(const CoinWarmStartBasis& ws) ;
00219 
00221   virtual CoinWarmStart *clone() const
00222   {
00223      return new CoinWarmStartBasis(*this);
00224   }
00225 
00227   virtual ~CoinWarmStartBasis();
00228 
00231   virtual CoinWarmStartBasis& operator=(const CoinWarmStartBasis& rhs) ;
00232 
00248   virtual void assignBasisStatus(int ns, int na, char*& sStat, char*& aStat) ;
00250 
00253 
00255   virtual void print() const;
00256 
00258 
00259 private:
00266 
00267     int numStructural_;
00269     int numArtificial_;
00271     char * structuralStatus_;
00273     char * artificialStatus_;
00275 };
00276 
00277 
00282 inline CoinWarmStartBasis::Status getStatus(const char *array, int i)  {
00283   const int st = (array[i>>2] >> ((i&3)<<1)) & 3;
00284   return static_cast<CoinWarmStartBasis::Status>(st);
00285 }
00286 
00291 inline void setStatus(char * array, int i, CoinWarmStartBasis::Status st) {
00292   char& st_byte = array[i>>2];
00293   st_byte &= ~(3 << ((i&3)<<1));
00294   st_byte |= (st << ((i&3)<<1));
00295 }
00296 
00297 
00298 
00322 class CoinWarmStartBasisDiff : public CoinWarmStartDiff
00323 { public:
00324 
00326   virtual CoinWarmStartDiff *clone() const
00327   { CoinWarmStartBasisDiff *cwsbd =  new CoinWarmStartBasisDiff(*this) ;
00328     return (dynamic_cast<CoinWarmStartDiff *>(cwsbd)) ; }
00329 
00331   virtual
00332     CoinWarmStartBasisDiff &operator= (const CoinWarmStartBasisDiff &rhs) ;
00333 
00335   virtual ~CoinWarmStartBasisDiff()
00336   { delete[] diffNdxs_ ;
00337     delete[] diffVals_ ; }
00338 
00339   protected:
00340 
00347   CoinWarmStartBasisDiff () : sze_(0), diffNdxs_(0), diffVals_(0) { } ;
00348 
00359   CoinWarmStartBasisDiff (const CoinWarmStartBasisDiff &cwsbd) ;
00360 
00361   private:
00362 
00363   friend CoinWarmStartDiff*
00364     CoinWarmStartBasis::generateDiff(const CoinWarmStart *const oldCWS) const ;
00365   friend void
00366     CoinWarmStartBasis::applyDiff(const CoinWarmStartDiff *const diff) ;
00367 
00369   CoinWarmStartBasisDiff (int sze, const unsigned int *const diffNdxs,
00370                           const unsigned int *const diffVals) ;
00371   
00373   int sze_ ;
00374 
00377   unsigned int *diffNdxs_ ;
00378 
00381   unsigned int *diffVals_ ;
00382 } ;
00383 
00384 
00385 #endif

Generated on Wed Dec 3 14:34:24 2003 for Coin by doxygen 1.3.5