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