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