lp.h

Go to the documentation of this file.
00001 
00056 #ifndef ABA_LP_H
00057 #define ABA_LP_H
00058 
00059 #include "abacus/array.h"
00060 #include "abacus/optsense.h"
00061 #include "abacus/lpvarstat.h"
00062 #include "abacus/slackstat.h"
00063 #include "abacus/cputimer.h"
00064 
00065 class ABA_MASTER;
00066 class ABA_SPARVEC;
00067 class ABA_ROW;
00068 class ABA_COLUMN;
00069 
00070   class  ABA_LP :  public ABA_ABACUSROOT  {
00071     public:
00072 
00087       enum OPTSTAT{Optimal, Unoptimized, Error,
00088                    Feasible, Infeasible, Unbounded};
00089 
00096       enum SOLSTAT{Available, Missing};
00097 
00107       enum METHOD {Primal, Dual, BarrierAndCrossover, BarrierNoCrossover, Approximate};
00108 
00114       ABA_LP (ABA_MASTER *master);
00115 
00117       virtual ~ABA_LP ();
00118 
00135       friend ostream &operator<<(ostream& out, const ABA_LP& rhs);
00136 
00160       void initialize(ABA_OPTSENSE sense, int nRow, int maxRow,
00161                       int nCol, int maxCol,
00162                       ABA_ARRAY<double> &obj, ABA_ARRAY<double> &lBound,
00163                       ABA_ARRAY<double> &uBound, ABA_ARRAY<ABA_ROW*> &rows);
00164 
00172       void initialize(ABA_OPTSENSE sense, int nRow, int maxRow,
00173                       int nCol, int maxCol,
00174                       ABA_ARRAY<double> &obj, ABA_ARRAY<double> &lBound,
00175                       ABA_ARRAY<double> &uBound, ABA_ARRAY<ABA_ROW*> &rows,
00176                       ABA_ARRAY<ABA_LPVARSTAT::STATUS> &lpVarStat,
00177                       ABA_ARRAY<ABA_SLACKSTAT::STATUS> &slackStat);
00178 
00184       virtual void loadBasis(ABA_ARRAY<ABA_LPVARSTAT::STATUS> &lpVarStat,
00185                              ABA_ARRAY<ABA_SLACKSTAT::STATUS> &slackStat);
00186       ABA_OPTSENSE sense() const;
00187       void sense(const ABA_OPTSENSE &newSense);
00188       int nRow() const;
00189       int maxRow() const;
00190       int nCol() const;
00191       int maxCol() const;
00192       int nnz() const;
00193       double obj(int i) const;
00194       double lBound(int i) const;
00195       double uBound(int i) const;
00196       void row(int i, ABA_ROW &r) const;
00197       double rhs(int i) const;
00198       virtual double value() const;
00199       virtual double xVal(int i);
00200       virtual double barXVal(int i);
00201       virtual double reco(int i);
00202       virtual double yVal(int c);
00203       virtual double slack(int c);
00204       SOLSTAT xValStatus() const;
00205       SOLSTAT barXValStatus() const;
00206       SOLSTAT yValStatus() const;
00207       SOLSTAT recoStatus() const;
00208       SOLSTAT slackStatus() const;
00209       SOLSTAT basisStatus() const;
00210       int nOpt() const;
00211       virtual bool infeasible() const;
00212 
00238       virtual int getInfeas(int &infeasRow, int &infeasCol, double *bInvRow);
00239       virtual ABA_LPVARSTAT::STATUS lpVarStat(int i);
00240       virtual ABA_SLACKSTAT::STATUS slackStat(int i);
00241 
00248       virtual OPTSTAT optimize(METHOD method);
00249 
00254       void remRows(ABA_BUFFER<int> &ind);
00255 
00263       void addRows(ABA_BUFFER<ABA_ROW*> &newRows);
00264 
00269       void remCols(ABA_BUFFER<int> &cols);
00270 
00278       void addCols(ABA_BUFFER<ABA_COLUMN*> &newCols);
00279 
00284       void changeRhs(ABA_ARRAY<double> &newRhs);
00285 
00291       virtual void changeLBound(int i, double newLb);
00292 
00298       virtual void changeUBound(int i, double newUb);
00299 
00308       virtual int pivotSlackVariableIn(ABA_BUFFER<int> &rows);
00309 
00314       void rowRealloc(int newSize);
00315 
00320       void colRealloc(int newSize);
00321 
00330       int writeBasisMatrix(const char *fileName);
00331 
00339       int setSimplexIterationLimit(int limit);
00340 
00346       int getSimplexIterationLimit(int &limit);
00347       ABA_CPUTIMER* lpSolverTime() { return &lpSolverTime_; }
00348 
00349     protected:
00350 
00359       void colsNnz(int nRow, ABA_ARRAY<ABA_ROW*> &rows, ABA_ARRAY<int> &nnz);
00360 
00375       void rows2cols(int nRow, ABA_ARRAY<ABA_ROW*> &rows, 
00376                      ABA_ARRAY<ABA_SPARVEC*> &cols);
00377 
00382       void rowRangeCheck(int r) const;
00383 
00388       void colRangeCheck(int i) const;
00389 
00393       virtual ABA_OPTSENSE _sense() const = 0;
00394       virtual void _sense(const ABA_OPTSENSE &newSense) = 0;
00395 
00399       virtual int      _nRow()  const = 0;
00400 
00404       virtual int      _maxRow() const = 0;
00405 
00409       virtual int      _nCol() const = 0;
00410 
00414       virtual int      _maxCol() const = 0;
00415 
00421       virtual int      _nnz() const = 0;
00422 
00427       virtual double   _obj(int i) const = 0;
00428 
00432       virtual double   _lBound(int i) const = 0;
00433 
00437       virtual double   _uBound(int i) const = 0;
00438 
00442       virtual double   _rhs(int i) const = 0;
00443 
00447       virtual void     _row(int i, ABA_ROW &r) const = 0;
00448 
00462       virtual void    _initialize(ABA_OPTSENSE sense, int nRow, int maxRow,
00463                                   int nCol, int maxCol,
00464                                   ABA_ARRAY<double> &obj, ABA_ARRAY<double> &lBound,
00465                                   ABA_ARRAY<double> &uBound, ABA_ARRAY<ABA_ROW*> &rows) = 0;
00466 
00472       virtual void _loadBasis(ABA_ARRAY<ABA_LPVARSTAT::STATUS> &lpVarStat,
00473                               ABA_ARRAY<ABA_SLACKSTAT::STATUS> &slackStat) = 0;
00474 
00479       virtual OPTSTAT _primalSimplex()                   = 0;
00480 
00485       virtual OPTSTAT _dualSimplex()                     = 0;
00486 
00491       virtual OPTSTAT _barrier(bool doCrossover)         = 0;
00492 
00497       virtual OPTSTAT _approx()                          = 0;
00498 
00503       virtual double _value() const = 0;
00504 
00509       virtual double _xVal(int i)  = 0;
00510       virtual double _barXVal(int i)  = 0;
00511 
00515       virtual double _reco(int i)  = 0;
00516 
00520       virtual double _slack(int i) = 0;
00521 
00526       virtual double _yVal(int i)  = 0;
00527 
00532       virtual ABA_LPVARSTAT::STATUS _lpVarStat(int i) = 0;
00533 
00538       virtual ABA_SLACKSTAT::STATUS _slackStat(int i) = 0;
00539 
00552       virtual int _getInfeas(int &infeasRow, int &infeasCol,
00553                                             double *bInvRow) = 0;
00554 
00559       virtual void    _remRows(ABA_BUFFER<int> &ind)         = 0;
00560 
00565       virtual void    _addRows(ABA_BUFFER<ABA_ROW*> &newRows)    = 0;
00566 
00571       virtual void    _remCols(ABA_BUFFER<int> &vars)        = 0;
00572 
00577       virtual void    _addCols(ABA_BUFFER<ABA_COLUMN*> &newCols) = 0;
00578 
00583       virtual void    _changeRhs(ABA_ARRAY<double> &newRhs)  = 0;
00584 
00589       virtual void    _changeLBound(int i, double newLb) = 0;
00590 
00595       virtual void    _changeUBound(int i, double newUb) = 0;
00596 
00606       virtual int     _pivotSlackVariableIn(ABA_BUFFER<int> &rows) = 0;
00607 
00613       virtual void    _rowRealloc(int newSize)          = 0;
00614 
00619       virtual void    _colRealloc(int newSize)          = 0;
00620 
00629       virtual int _setSimplexIterationLimit(int limit) = 0;
00630 
00640       virtual int _getSimplexIterationLimit(int &limit) = 0;
00641 
00644       ABA_MASTER *master_;
00645 
00648       OPTSTAT optStat_;
00649 
00654       SOLSTAT xValStatus_;
00655       SOLSTAT barXValStatus_;
00656 
00662       SOLSTAT yValStatus_;
00663 
00668       SOLSTAT recoStatus_;
00669 
00675       SOLSTAT slackStatus_;
00676 
00683       SOLSTAT basisStatus_;
00684 
00687       int nOpt_;
00688       ABA_CPUTIMER lpSolverTime_;
00689 
00690     private:
00691 
00699       void initPostOpt();
00700       ABA_LP(const ABA_LP &rhs);
00701       const ABA_LP &operator=(const ABA_LP &rhs);
00702   };
00703 
00704 
00705 inline ABA_OPTSENSE ABA_LP::sense() const
00706   {
00707     return _sense();
00708   }
00709 
00710 inline void ABA_LP::sense(const ABA_OPTSENSE &newSense)
00711   {
00712     _sense(newSense);
00713   }
00714 
00715 inline int ABA_LP::nRow() const
00716   {
00717     return _nRow();
00718   }
00719 
00720 inline int ABA_LP::maxRow() const
00721   {
00722     return _maxRow();
00723   }
00724 
00725 inline int ABA_LP::nCol() const
00726   {
00727     return _nCol();
00728   }
00729 
00730 inline int ABA_LP::maxCol() const
00731   {
00732     return _maxCol();
00733   }
00734 
00735 inline int ABA_LP::nnz() const
00736   {
00737     return _nnz();
00738   }
00739 
00740 inline double ABA_LP::obj(int i) const
00741   {
00742 #ifdef ABACUSSAFE
00743       colRangeCheck(i);
00744 #endif
00745     return _obj(i);
00746   }
00747 
00748 inline double ABA_LP::lBound(int i) const
00749   {
00750 #ifdef ABACUSSAFE
00751       colRangeCheck(i);
00752 #endif
00753     return _lBound(i);
00754   }
00755 
00756 inline double ABA_LP::uBound(int i) const
00757   {
00758 #ifdef ABACUSSAFE
00759       colRangeCheck(i);
00760 #endif
00761     return _uBound(i);
00762   }
00763 
00764 inline void ABA_LP::row(int i, ABA_ROW &r) const
00765   {
00766 #ifdef ABACUSSAFE
00767       rowRangeCheck(i);
00768 #endif
00769     _row(i, r);
00770   }
00771 
00772 inline double ABA_LP::rhs(int i) const
00773   {
00774 #ifdef ABACUSSAFE
00775       rowRangeCheck(i);
00776 #endif
00777     return _rhs(i);
00778   }
00779 
00780 inline double ABA_LP::value() const
00781   {
00782     return _value();
00783   }
00784 
00785 inline double ABA_LP::xVal(int i)
00786   {
00787 #ifdef ABACUSSAFE
00788     colRangeCheck(i);
00789 #endif
00790     return _xVal(i);
00791   }
00792 
00793 inline double ABA_LP::barXVal(int i)
00794   {
00795 #ifdef ABACUSSAFE
00796     colRangeCheck(i);
00797 #endif
00798     return _barXVal(i);
00799   }
00800 
00801 inline double ABA_LP::reco(int i)
00802   {
00803 #ifdef ABACUSSAFE
00804     colRangeCheck(i);
00805 #endif
00806     return _reco(i);
00807   }
00808 
00809 inline double ABA_LP::yVal(int c)
00810   {
00811 #ifdef ABACUSSAFE
00812     rowRangeCheck(c);
00813 #endif
00814     return _yVal(c);
00815   }
00816 
00817 inline double ABA_LP::slack(int c)
00818   {
00819 #ifdef ABACUSSAFE
00820     rowRangeCheck(c);
00821 #endif
00822     return _slack(c);
00823   }
00824 
00825 inline ABA_LP::SOLSTAT ABA_LP::xValStatus() const
00826   {
00827     return xValStatus_;
00828   }
00829 
00830 inline ABA_LP::SOLSTAT ABA_LP::barXValStatus() const
00831   {
00832     return barXValStatus_;
00833   }
00834 
00835 inline ABA_LP::SOLSTAT ABA_LP::recoStatus() const
00836   {
00837     return recoStatus_;
00838   }
00839 
00840 inline ABA_LP::SOLSTAT ABA_LP::yValStatus() const
00841   {
00842     return yValStatus_;
00843   }
00844 
00845 inline ABA_LP::SOLSTAT ABA_LP::slackStatus() const
00846   {
00847     return slackStatus_;
00848   }
00849 
00850 inline ABA_LP::SOLSTAT ABA_LP::basisStatus() const
00851   {
00852     return basisStatus_;
00853   }
00854 
00855 inline int ABA_LP::nOpt() const
00856   {
00857     return nOpt_;
00858   }
00859 
00860 inline bool ABA_LP::infeasible() const
00861   {
00862     if (optStat_ == Infeasible) return true;
00863     else                        return false;
00864   }
00865 
00866 inline ABA_LPVARSTAT::STATUS ABA_LP::lpVarStat(int i)
00867   {
00868 #ifdef ABACUSSAFE
00869     colRangeCheck(i);
00870 #endif
00871     return _lpVarStat(i);
00872   }
00873 
00874 inline ABA_SLACKSTAT::STATUS ABA_LP::slackStat(int i)
00875   {  
00876 #ifdef ABACUSSAFE
00877     rowRangeCheck(i);
00878 #endif
00879     return _slackStat(i);
00880   }
00881 
00882 
00883 #endif  // ABA_LP_H
00884 

Generated on Tue Aug 14 18:09:53 2007 for ABACUS by  doxygen 1.5.1