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