COIN-OR::LEMON - Graph Library

Changeset 482:ed54c0d13df0 in lemon for lemon/lp_cplex.h


Ignore:
Timestamp:
12/02/08 22:48:28 (15 years ago)
Author:
Balazs Dezso <deba@…>
Branch:
default
Children:
483:76ec7bd57026, 547:17cabb114d52
Phase:
public
Message:

Thorough redesign of the LP/MIP interface (#44)

  • Redesigned class structure
  • Redesigned iterators
  • Some functions in the basic interface redesigned
  • More complete setting functions
  • Ray retrieving functions
  • Lot of improvements
  • Cplex common env
  • CLP macro definition to config.h.in
  • Update lp.h to also use soplex and clp
  • Remove default_solver_name
  • New solverName() function in solvers
  • Handle exceptions for MipCplex? test
  • Rename tolerance parameter to epsilon
  • Rename MapIt? to CoeffIt?
  • Lot of documentation improvements
  • Various bugfixes
File:
1 edited

Legend:

Unmodified
Added
Removed
  • lemon/lp_cplex.h

    r481 r482  
    3030namespace lemon {
    3131
    32 
    33   /// \brief Interface for the CPLEX solver
    34   ///
    35   /// This class implements an interface for the CPLEX LP solver.
    36   class LpCplex :virtual public LpSolverBase {
    37 
    38   public:
    39 
    40     typedef LpSolverBase Parent;
    41 
    42     /// \e
    43     int status;
    44     cpxenv* env;
    45     cpxlp* lp;
    46 
    47 
    48     /// \e
    49     LpCplex();
    50     /// \e
    51     LpCplex(const LpCplex&);
    52     /// \e
    53     ~LpCplex();
    54 
    55   protected:
    56     virtual LpSolverBase* _newLp();
    57     virtual LpSolverBase* _copyLp();
    58 
     32  /// \brief Reference counted wrapper around cpxenv pointer
     33  ///
     34  /// The cplex uses environment object which is responsible for
     35  /// checking the proper license usage. This class provides a simple
     36  /// interface for share the environment object between different
     37  /// problems.
     38  class CplexEnv {
     39    friend class CplexBase;
     40  private:
     41    cpxenv* _env;
     42    mutable int* _cnt;
     43
     44  public:
     45
     46    /// \brief This exception is thrown when the license check is not
     47    /// sufficient
     48    class LicenseError : public Exception {
     49      friend class CplexEnv;
     50    private:
     51
     52      LicenseError(int status);
     53      char _message[510];
     54
     55    public:
     56
     57      /// The short error message
     58      virtual const char* what() const throw() {
     59        return _message;
     60      }
     61    };
     62
     63    /// Constructor
     64    CplexEnv();
     65    /// Shallow copy constructor
     66    CplexEnv(const CplexEnv&);
     67    /// Shallow assignement
     68    CplexEnv& operator=(const CplexEnv&);
     69    /// Destructor
     70    virtual ~CplexEnv();
     71
     72  protected:
     73
     74    cpxenv* cplexEnv() { return _env; }
     75    const cpxenv* cplexEnv() const { return _env; }
     76  };
     77
     78  /// \brief Base interface for the CPLEX LP and MIP solver
     79  ///
     80  /// This class implements the common interface of the CPLEX LP and
     81  /// MIP solvers. 
     82  /// \ingroup lp_group
     83  class CplexBase : virtual public LpBase {
     84  protected:
     85
     86    CplexEnv _env;
     87    cpxlp* _prob;
     88
     89    CplexBase();
     90    CplexBase(const CplexEnv&);
     91    CplexBase(const CplexBase &);
     92    virtual ~CplexBase();
    5993
    6094    virtual int _addCol();
    6195    virtual int _addRow();
     96
    6297    virtual void _eraseCol(int i);
    6398    virtual void _eraseRow(int i);
    64     virtual void _getColName(int col, std::string & name) const;
    65     virtual void _setColName(int col, const std::string & name);
     99
     100    virtual void _eraseColId(int i);
     101    virtual void _eraseRowId(int i);
     102
     103    virtual void _getColName(int col, std::string& name) const;
     104    virtual void _setColName(int col, const std::string& name);
    66105    virtual int _colByName(const std::string& name) const;
    67     virtual void _setRowCoeffs(int i, ConstRowIterator b, ConstRowIterator e);
    68     virtual void _getRowCoeffs(int i, RowIterator b) const;
    69     virtual void _setColCoeffs(int i, ConstColIterator b, ConstColIterator e);
    70     virtual void _getColCoeffs(int i, ColIterator b) const;
     106
     107    virtual void _getRowName(int row, std::string& name) const;
     108    virtual void _setRowName(int row, const std::string& name);
     109    virtual int _rowByName(const std::string& name) const;
     110
     111    virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
     112    virtual void _getRowCoeffs(int i, InsertIterator b) const;
     113
     114    virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
     115    virtual void _getColCoeffs(int i, InsertIterator b) const;
     116
    71117    virtual void _setCoeff(int row, int col, Value value);
    72118    virtual Value _getCoeff(int row, int col) const;
     
    74120    virtual void _setColLowerBound(int i, Value value);
    75121    virtual Value _getColLowerBound(int i) const;
     122
    76123    virtual void _setColUpperBound(int i, Value value);
    77124    virtual Value _getColUpperBound(int i) const;
    78125
    79 //     virtual void _setRowLowerBound(int i, Value value);
    80 //     virtual void _setRowUpperBound(int i, Value value);
    81     virtual void _setRowBounds(int i, Value lower, Value upper);
    82     virtual void _getRowBounds(int i, Value &lb, Value &ub) const;
     126  private:
     127    void _set_row_bounds(int i, Value lb, Value ub);
     128  protected:
     129
     130    virtual void _setRowLowerBound(int i, Value value);
     131    virtual Value _getRowLowerBound(int i) const;
     132
     133    virtual void _setRowUpperBound(int i, Value value);
     134    virtual Value _getRowUpperBound(int i) const;
     135
     136    virtual void _setObjCoeffs(ExprIterator b, ExprIterator e);
     137    virtual void _getObjCoeffs(InsertIterator b) const;
     138
    83139    virtual void _setObjCoeff(int i, Value obj_coef);
    84140    virtual Value _getObjCoeff(int i) const;
    85     virtual void _clearObj();
    86 
     141
     142    virtual void _setSense(Sense sense);
     143    virtual Sense _getSense() const;
     144
     145    virtual void _clear();
     146
     147  public:
     148
     149    /// Returns the used \c CplexEnv instance
     150    const CplexEnv& env() const { return _env; }
     151    ///
     152    const cpxenv* cplexEnv() const { return _env.cplexEnv(); }
     153
     154    cpxlp* cplexLp() { return _prob; }
     155    const cpxlp* cplexLp() const { return _prob; }
     156
     157  };
     158
     159  /// \brief Interface for the CPLEX LP solver
     160  ///
     161  /// This class implements an interface for the CPLEX LP solver.
     162  ///\ingroup lp_group
     163  class LpCplex : public CplexBase, public LpSolver {
     164  public:
     165    /// \e
     166    LpCplex();
     167    /// \e
     168    LpCplex(const CplexEnv&);
     169    /// \e
     170    LpCplex(const LpCplex&);
     171    /// \e
     172    virtual ~LpCplex();
     173
     174  private:
     175
     176    // these values cannot retrieved element by element
     177    mutable std::vector<int> _col_status;
     178    mutable std::vector<int> _row_status;
     179
     180    mutable std::vector<Value> _primal_ray;
     181    mutable std::vector<Value> _dual_ray;
     182
     183    void _clear_temporals();
     184
     185    SolveExitStatus convertStatus(int status);
     186
     187  protected:
     188
     189    virtual LpCplex* _cloneSolver() const;
     190    virtual LpCplex* _newSolver() const;
     191
     192    virtual const char* _solverName() const;
    87193
    88194    virtual SolveExitStatus _solve();
     
    90196    virtual Value _getDual(int i) const;
    91197    virtual Value _getPrimalValue() const;
    92     virtual bool _isBasicCol(int i) const;
    93 
    94     virtual SolutionStatus _getPrimalStatus() const;
    95     virtual SolutionStatus _getDualStatus() const;
    96     virtual ProblemTypes _getProblemType() const;
    97 
    98 
    99     virtual void _setMax();
    100     virtual void _setMin();
    101 
    102     virtual bool _isMax() const;
    103 
    104   public:
    105 
    106     cpxenv* cplexEnv() { return env; }
    107     cpxlp* cplexLp() { return lp; }
    108 
    109   };
     198
     199    virtual VarStatus _getColStatus(int i) const;
     200    virtual VarStatus _getRowStatus(int i) const;
     201
     202    virtual Value _getPrimalRay(int i) const;
     203    virtual Value _getDualRay(int i) const;
     204
     205    virtual ProblemType _getPrimalType() const;
     206    virtual ProblemType _getDualType() const;
     207
     208  public:
     209
     210    /// Solve with primal simplex method
     211    SolveExitStatus solvePrimal();
     212
     213    /// Solve with dual simplex method
     214    SolveExitStatus solveDual();
     215
     216    /// Solve with barrier method
     217    SolveExitStatus solveBarrier();
     218
     219  };
     220
     221  /// \brief Interface for the CPLEX MIP solver
     222  ///
     223  /// This class implements an interface for the CPLEX MIP solver.
     224  ///\ingroup lp_group
     225  class MipCplex : public CplexBase, public MipSolver {
     226  public:
     227    /// \e
     228    MipCplex();
     229    /// \e
     230    MipCplex(const CplexEnv&);
     231    /// \e
     232    MipCplex(const MipCplex&);
     233    /// \e
     234    virtual ~MipCplex();
     235
     236  protected:
     237
     238    virtual MipCplex* _cloneSolver() const;
     239    virtual MipCplex* _newSolver() const;
     240
     241    virtual const char* _solverName() const;
     242
     243    virtual ColTypes _getColType(int col) const;
     244    virtual void _setColType(int col, ColTypes col_type);
     245
     246    virtual SolveExitStatus _solve();
     247    virtual ProblemType _getType() const;
     248    virtual Value _getSol(int i) const;
     249    virtual Value _getSolValue() const;
     250
     251  };
     252
    110253} //END OF NAMESPACE LEMON
    111254
Note: See TracChangeset for help on using the changeset viewer.