deba@458: /* -*- mode: C++; indent-tabs-mode: nil; -*- deba@458: * deba@458: * This file is a part of LEMON, a generic C++ optimization library. deba@458: * deba@458: * Copyright (C) 2003-2008 deba@458: * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport deba@458: * (Egervary Research Group on Combinatorial Optimization, EGRES). deba@458: * deba@458: * Permission to use, modify and distribute this software is granted deba@458: * provided that this copyright notice appears in all copies. For deba@458: * precise terms see the accompanying LICENSE file. deba@458: * deba@458: * This software is provided "AS IS" with no warranty of any kind, deba@458: * express or implied, and with no claim as to its suitability for any deba@458: * purpose. deba@458: * deba@458: */ deba@458: deba@458: #ifndef LEMON_LP_CPLEX_H deba@458: #define LEMON_LP_CPLEX_H deba@458: deba@458: ///\file deba@458: ///\brief Header of the LEMON-CPLEX lp solver interface. deba@458: deba@458: #include deba@458: deba@458: struct cpxenv; deba@458: struct cpxlp; deba@458: deba@458: namespace lemon { deba@458: deba@459: /// \brief Reference counted wrapper around cpxenv pointer deba@458: /// deba@459: /// The cplex uses environment object which is responsible for deba@459: /// checking the proper license usage. This class provides a simple deba@459: /// interface for share the environment object between different deba@459: /// problems. deba@459: class CplexEnv { deba@459: friend class CplexBase; deba@459: private: deba@459: cpxenv* _env; deba@459: mutable int* _cnt; deba@458: deba@458: public: deba@458: deba@459: /// \brief This exception is thrown when the license check is not deba@459: /// sufficient deba@459: class LicenseError : public Exception { deba@459: friend class CplexEnv; deba@459: private: deba@458: deba@459: LicenseError(int status); deba@459: char _message[510]; deba@458: deba@459: public: deba@458: deba@459: /// The short error message deba@459: virtual const char* what() const throw() { deba@459: return _message; deba@459: } deba@459: }; deba@459: deba@459: /// Constructor deba@459: CplexEnv(); deba@459: /// Shallow copy constructor deba@459: CplexEnv(const CplexEnv&); deba@459: /// Shallow assignement deba@459: CplexEnv& operator=(const CplexEnv&); deba@459: /// Destructor deba@459: virtual ~CplexEnv(); deba@458: deba@458: protected: deba@458: deba@459: cpxenv* cplexEnv() { return _env; } deba@459: const cpxenv* cplexEnv() const { return _env; } deba@459: }; deba@459: deba@459: /// \brief Base interface for the CPLEX LP and MIP solver deba@459: /// deba@459: /// This class implements the common interface of the CPLEX LP and deba@459: /// MIP solvers. deba@459: /// \ingroup lp_group deba@459: class CplexBase : virtual public LpBase { deba@459: protected: deba@459: deba@459: CplexEnv _env; deba@459: cpxlp* _prob; deba@459: deba@459: CplexBase(); deba@459: CplexBase(const CplexEnv&); deba@459: CplexBase(const CplexBase &); deba@459: virtual ~CplexBase(); deba@458: deba@458: virtual int _addCol(); deba@458: virtual int _addRow(); deba@459: deba@458: virtual void _eraseCol(int i); deba@458: virtual void _eraseRow(int i); deba@459: deba@459: virtual void _eraseColId(int i); deba@459: virtual void _eraseRowId(int i); deba@459: deba@459: virtual void _getColName(int col, std::string& name) const; deba@459: virtual void _setColName(int col, const std::string& name); deba@458: virtual int _colByName(const std::string& name) const; deba@459: deba@459: virtual void _getRowName(int row, std::string& name) const; deba@459: virtual void _setRowName(int row, const std::string& name); deba@459: virtual int _rowByName(const std::string& name) const; deba@459: deba@459: virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e); deba@459: virtual void _getRowCoeffs(int i, InsertIterator b) const; deba@459: deba@459: virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e); deba@459: virtual void _getColCoeffs(int i, InsertIterator b) const; deba@459: deba@458: virtual void _setCoeff(int row, int col, Value value); deba@458: virtual Value _getCoeff(int row, int col) const; deba@458: deba@458: virtual void _setColLowerBound(int i, Value value); deba@458: virtual Value _getColLowerBound(int i) const; deba@459: deba@458: virtual void _setColUpperBound(int i, Value value); deba@458: virtual Value _getColUpperBound(int i) const; deba@458: deba@459: private: deba@459: void _set_row_bounds(int i, Value lb, Value ub); deba@459: protected: deba@459: deba@459: virtual void _setRowLowerBound(int i, Value value); deba@459: virtual Value _getRowLowerBound(int i) const; deba@459: deba@459: virtual void _setRowUpperBound(int i, Value value); deba@459: virtual Value _getRowUpperBound(int i) const; deba@459: deba@459: virtual void _setObjCoeffs(ExprIterator b, ExprIterator e); deba@459: virtual void _getObjCoeffs(InsertIterator b) const; deba@459: deba@458: virtual void _setObjCoeff(int i, Value obj_coef); deba@458: virtual Value _getObjCoeff(int i) const; deba@458: deba@459: virtual void _setSense(Sense sense); deba@459: virtual Sense _getSense() const; deba@459: deba@459: virtual void _clear(); deba@459: deba@459: public: deba@459: deba@459: /// Returns the used \c CplexEnv instance deba@459: const CplexEnv& env() const { return _env; } deba@459: /// deba@459: const cpxenv* cplexEnv() const { return _env.cplexEnv(); } deba@459: deba@459: cpxlp* cplexLp() { return _prob; } deba@459: const cpxlp* cplexLp() const { return _prob; } deba@459: deba@459: }; deba@459: deba@459: /// \brief Interface for the CPLEX LP solver deba@459: /// deba@459: /// This class implements an interface for the CPLEX LP solver. deba@459: ///\ingroup lp_group deba@459: class LpCplex : public CplexBase, public LpSolver { deba@459: public: deba@459: /// \e deba@459: LpCplex(); deba@459: /// \e deba@459: LpCplex(const CplexEnv&); deba@459: /// \e deba@459: LpCplex(const LpCplex&); deba@459: /// \e deba@459: virtual ~LpCplex(); deba@459: deba@459: private: deba@459: deba@459: // these values cannot retrieved element by element deba@459: mutable std::vector _col_status; deba@459: mutable std::vector _row_status; deba@459: deba@459: mutable std::vector _primal_ray; deba@459: mutable std::vector _dual_ray; deba@459: deba@459: void _clear_temporals(); deba@459: deba@459: SolveExitStatus convertStatus(int status); deba@459: deba@459: protected: deba@459: deba@459: virtual LpCplex* _cloneSolver() const; deba@459: virtual LpCplex* _newSolver() const; deba@459: deba@459: virtual const char* _solverName() const; deba@458: deba@458: virtual SolveExitStatus _solve(); deba@458: virtual Value _getPrimal(int i) const; deba@458: virtual Value _getDual(int i) const; deba@458: virtual Value _getPrimalValue() const; deba@458: deba@459: virtual VarStatus _getColStatus(int i) const; deba@459: virtual VarStatus _getRowStatus(int i) const; deba@458: deba@459: virtual Value _getPrimalRay(int i) const; deba@459: virtual Value _getDualRay(int i) const; deba@458: deba@459: virtual ProblemType _getPrimalType() const; deba@459: virtual ProblemType _getDualType() const; deba@458: deba@458: public: deba@458: deba@459: /// Solve with primal simplex method deba@459: SolveExitStatus solvePrimal(); deba@459: deba@459: /// Solve with dual simplex method deba@459: SolveExitStatus solveDual(); deba@459: deba@459: /// Solve with barrier method deba@459: SolveExitStatus solveBarrier(); deba@458: deba@458: }; deba@459: deba@459: /// \brief Interface for the CPLEX MIP solver deba@459: /// deba@459: /// This class implements an interface for the CPLEX MIP solver. deba@459: ///\ingroup lp_group deba@459: class MipCplex : public CplexBase, public MipSolver { deba@459: public: deba@459: /// \e deba@459: MipCplex(); deba@459: /// \e deba@459: MipCplex(const CplexEnv&); deba@459: /// \e deba@459: MipCplex(const MipCplex&); deba@459: /// \e deba@459: virtual ~MipCplex(); deba@459: deba@459: protected: deba@459: deba@459: virtual MipCplex* _cloneSolver() const; deba@459: virtual MipCplex* _newSolver() const; deba@459: deba@459: virtual const char* _solverName() const; deba@459: deba@459: virtual ColTypes _getColType(int col) const; deba@459: virtual void _setColType(int col, ColTypes col_type); deba@459: deba@459: virtual SolveExitStatus _solve(); deba@459: virtual ProblemType _getType() const; deba@459: virtual Value _getSol(int i) const; deba@459: virtual Value _getSolValue() const; deba@459: deba@459: }; deba@459: deba@458: } //END OF NAMESPACE LEMON deba@458: deba@458: #endif //LEMON_LP_CPLEX_H deba@458: