00001 #ifndef OsiDylpWarmStartBasis_H
00002 #define OsiDylpWarmStartBasis_H
00003
00014
00015
00016
00017
00018
00019 #include "CoinWarmStartBasis.hpp"
00020
00021 #define DYLP_INTERNAL
00022 extern "C" {
00023 #include "dylp.h"
00024 }
00025
00026
00027
00039 class OsiDylpWarmStartBasis : public CoinWarmStartBasis
00040
00041 { public:
00042
00051
00054 int numberActiveConstraints() const ;
00055
00056
00059 inline Status getConStatus (int i) const
00060
00061 { const int st = (constraintStatus_[i>>2] >> ((i&3)<<1)) & 3 ;
00062 return (static_cast<CoinWarmStartBasis::Status>(st)) ; }
00063
00064
00067 inline void setConStatus (int i, Status st)
00068
00069 { char &st_byte = constraintStatus_[i>>2] ;
00070 st_byte &= ~(3 << ((i&3)<<1)) ;
00071 st_byte |= (st << ((i&3)<<1)) ; }
00072
00073
00076 inline char *getConstraintStatus () { return (constraintStatus_) ; }
00077
00084 inline const char *getConstraintStatus () const
00085
00086 { return (constraintStatus_) ; }
00087
00088
00091 inline void setPhase (dyphase_enum phase) { phase_ = phase ; }
00092
00095 inline dyphase_enum getPhase () const { return (phase_) ; }
00096
00098
00101
00104 CoinWarmStartDiff *generateDiff (const CoinWarmStart *const oldCWS) const ;
00105
00108 void applyDiff (const CoinWarmStartDiff *const cwsdDiff) ;
00109
00111
00114
00117 void setSize (int ns, int na) ;
00118
00121 void resize (int numRows, int numCols) ;
00122
00135 void compressRows (int tgtCnt, const int *tgts) ;
00136
00144 void deleteRows (int number, const int *which) ;
00145
00147
00150
00153 OsiDylpWarmStartBasis () ;
00154
00157 OsiDylpWarmStartBasis (int ns, int na, const char *sStat,
00158 const char *aStat, const char *cStat = 0) ;
00159
00162 OsiDylpWarmStartBasis (const CoinWarmStartBasis &cwsb) ;
00163
00166 OsiDylpWarmStartBasis (const OsiDylpWarmStartBasis &ws) ;
00167
00170 CoinWarmStart *clone () const ;
00171
00174 ~OsiDylpWarmStartBasis () ;
00175
00178 OsiDylpWarmStartBasis& operator= (const OsiDylpWarmStartBasis &rhs) ;
00179
00182 void assignBasisStatus
00183 (int ns, int na, char *&sStat, char *&aStat, char *&cStat) ;
00184
00187 void assignBasisStatus
00188 (int ns, int na, char *&sStat, char *&aStat) ;
00189
00190
00192
00195
00198 void print () const ;
00199
00202 void checkBasis () const ;
00203
00205
00206 private:
00207
00210
00211 dyphase_enum phase_ ;
00212
00213 char *constraintStatus_ ;
00214
00216
00217 } ;
00218
00219
00220
00244 class OsiDylpWarmStartBasisDiff : public CoinWarmStartBasisDiff
00245 { public:
00246
00248 virtual CoinWarmStartDiff *clone() const
00249 { OsiDylpWarmStartBasisDiff *odwsbd = new OsiDylpWarmStartBasisDiff(*this) ;
00250 return (dynamic_cast<CoinWarmStartDiff *>(odwsbd)) ; }
00251
00253 virtual
00254 OsiDylpWarmStartBasisDiff &operator= (const OsiDylpWarmStartBasisDiff &rhs) ;
00255
00257 virtual ~OsiDylpWarmStartBasisDiff()
00258 { delete[] condiffNdxs_ ;
00259 delete[] condiffVals_ ; }
00260
00261 private:
00262
00263 friend CoinWarmStartDiff *OsiDylpWarmStartBasis::generateDiff
00264 (const CoinWarmStart *const oldCWS) const ;
00265 friend void OsiDylpWarmStartBasis::applyDiff
00266 (const CoinWarmStartDiff *const diff) ;
00267
00269 OsiDylpWarmStartBasisDiff (int sze, const unsigned int *const diffNdxs,
00270 const unsigned int *const diffVals,
00271 const CoinWarmStartBasisDiff *const cwsbd) ;
00272
00274 OsiDylpWarmStartBasisDiff ()
00275 : CoinWarmStartBasisDiff(),
00276 consze_(0),
00277 condiffNdxs_(0),
00278 condiffVals_(0)
00279 { } ;
00280
00287 OsiDylpWarmStartBasisDiff (const OsiDylpWarmStartBasisDiff &odwsbd) ;
00288
00289
00290
00292 int consze_ ;
00293
00296 unsigned int *condiffNdxs_ ;
00297
00300 unsigned int *condiffVals_ ;
00301
00302 } ;
00303
00304
00305
00306 #endif // OsiDylpWarmStartBasis_H