00001 00046 #ifndef ABA_LPSUBH 00047 #define ABA_LPSUBH 00048 00049 #include "abacus/lp.h" 00050 00051 class ABA_INFEASCON; 00052 class ABA_SUB; 00053 class ABA_MASTER; 00054 class ABA_FSVARSTAT; 00055 class ABA_CONSTRAINT; 00056 class ABA_VARIABLE; 00057 class ABA_LPSUB : public virtual ABA_LP { 00058 friend class ABA_SUB; 00059 friend class ABA_SETBRANCHRULE; 00060 friend class ABA_BOUNDBRANCHRULE; 00061 friend class ABA_VALBRANCHRULE; 00062 friend class ABA_CONBRANCHRULE; 00063 friend class COPBRANCHRULE; 00064 public: 00065 00072 ABA_LPSUB (ABA_MASTER *master, const ABA_SUB *sub); 00073 00080 virtual ~ABA_LPSUB(); 00081 const ABA_SUB * sub() const; 00082 00087 int trueNCol() const; 00088 00092 int trueNnz() const; 00093 00102 double lBound(int i) const; 00103 00112 double uBound(int i) const; 00113 00120 virtual double value() const; 00121 00127 virtual double xVal(int i); 00128 00135 virtual double barXVal(int i); 00136 00141 virtual double reco(int i); 00142 00147 virtual ABA_LPVARSTAT::STATUS lpVarStat(int i); 00148 00149 virtual int getInfeas(int &infeasCon, int &infeasVar, double *bInvRow); 00167 00176 virtual bool infeasible() const; 00177 00180 ABA_BUFFER<ABA_INFEASCON*> *infeasCon(); 00181 00190 virtual void loadBasis(ABA_ARRAY<ABA_LPVARSTAT::STATUS> &lpVarStat, 00191 ABA_ARRAY<ABA_SLACKSTAT::STATUS> &slackStat); 00192 protected: 00193 00202 virtual void initialize(); 00203 00204 private: 00205 00222 virtual OPTSTAT optimize(METHOD method); 00223 00226 virtual void removeCons(ABA_BUFFER<int> &ind); 00227 00230 virtual void removeVars(ABA_BUFFER<int> &vars); 00231 00234 virtual void addCons(ABA_BUFFER<ABA_CONSTRAINT*> &newCons); 00235 00242 virtual void addVars(ABA_BUFFER<ABA_VARIABLE*> &vars, 00243 ABA_BUFFER<ABA_FSVARSTAT*> &fsVarStat, 00244 ABA_BUFFER<double> &lb, ABA_BUFFER<double> &ub); 00245 00251 virtual void changeLBound(int i, double newLb); 00252 00258 virtual void changeUBound(int i, double newUb); 00259 00262 virtual void varRealloc(int newSize); 00263 00266 virtual void conRealloc(int newSize); 00267 00270 void constraint2row(ABA_BUFFER<ABA_CONSTRAINT*> &newCons, 00271 ABA_BUFFER<ABA_ROW*> &newRows); 00272 00279 bool eliminable(int i) const; 00280 00289 bool eliminated(int i) const; 00290 00298 virtual double elimVal(int i) const; 00299 00306 virtual double elimVal(ABA_FSVARSTAT *stat, double lb, double ub) const; 00307 void initialize(ABA_OPTSENSE sense, int nRow, int maxRow, 00308 int nCol, int maxCol, 00309 ABA_ARRAY<double> &obj, ABA_ARRAY<double> &lBound, 00310 ABA_ARRAY<double> &uBound, ABA_ARRAY<ABA_ROW*> &rows); 00311 void initialize(ABA_OPTSENSE sense, int nRow, int maxRow, 00312 int nCol, int maxCol, 00313 ABA_ARRAY<double> &obj, ABA_ARRAY<double> &lBound, 00314 ABA_ARRAY<double> &uBound, ABA_ARRAY<ABA_ROW*> &rows, 00315 ABA_ARRAY<ABA_LPVARSTAT::STATUS> &lpVarStat, 00316 ABA_ARRAY<ABA_SLACKSTAT::STATUS> &slackStat); 00317 int nCol() const; 00318 int maxCol() const; 00319 int nnz() const; 00320 double obj(int i) const; 00321 00322 void rowRealloc(int newSize); 00323 void colRealloc(int newSize); 00324 00327 const ABA_SUB *sub_; 00328 00334 ABA_ARRAY<int> orig2lp_; 00335 00338 ABA_ARRAY<int> lp2orig_; 00339 00342 ABA_BUFFER<ABA_INFEASCON*> infeasCons_; 00343 00347 double valueAdd_; 00348 00351 int nOrigVar_; 00352 ABA_LPSUB(const ABA_LPSUB &rhs); 00353 const ABA_LPSUB &operator=(const ABA_LPSUB &rhs); 00354 }; 00355 00356 00357 inline const ABA_SUB *ABA_LPSUB::sub() const 00358 { 00359 return sub_; 00360 } 00361 00362 inline bool ABA_LPSUB::eliminated(int i) const 00363 { 00364 if (orig2lp_[i] == -1) return true; 00365 else return false; 00366 } 00367 00368 inline int ABA_LPSUB::trueNCol() const 00369 { 00370 return ABA_LP::nCol(); 00371 } 00372 00373 inline int ABA_LPSUB::trueNnz() const 00374 { 00375 return ABA_LP::nnz(); 00376 } 00377 00378 inline double ABA_LPSUB::value() const 00379 { 00380 return ABA_LP::value() + valueAdd_; 00381 } 00382 00383 inline ABA_BUFFER<ABA_INFEASCON*> *ABA_LPSUB::infeasCon() 00384 { 00385 return &infeasCons_; 00386 } 00387 00388 00389 #endif // ABA_LPSUBH 00390