| alpar@484 |      1 | /* -*- mode: C++; indent-tabs-mode: nil; -*-
 | 
| alpar@484 |      2 |  *
 | 
| alpar@484 |      3 |  * This file is a part of LEMON, a generic C++ optimization library.
 | 
| alpar@484 |      4 |  *
 | 
| alpar@484 |      5 |  * Copyright (C) 2003-2008
 | 
| alpar@484 |      6 |  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
 | 
| alpar@484 |      7 |  * (Egervary Research Group on Combinatorial Optimization, EGRES).
 | 
| alpar@484 |      8 |  *
 | 
| alpar@484 |      9 |  * Permission to use, modify and distribute this software is granted
 | 
| alpar@484 |     10 |  * provided that this copyright notice appears in all copies. For
 | 
| alpar@484 |     11 |  * precise terms see the accompanying LICENSE file.
 | 
| alpar@484 |     12 |  *
 | 
| alpar@484 |     13 |  * This software is provided "AS IS" with no warranty of any kind,
 | 
| alpar@484 |     14 |  * express or implied, and with no claim as to its suitability for any
 | 
| alpar@484 |     15 |  * purpose.
 | 
| alpar@484 |     16 |  *
 | 
| alpar@484 |     17 |  */
 | 
| alpar@484 |     18 | 
 | 
| alpar@484 |     19 | #ifndef LEMON_CLP_H
 | 
| alpar@484 |     20 | #define LEMON_CLP_H
 | 
| alpar@484 |     21 | 
 | 
| alpar@484 |     22 | ///\file
 | 
| alpar@484 |     23 | ///\brief Header of the LEMON-CLP lp solver interface.
 | 
| alpar@484 |     24 | 
 | 
| alpar@484 |     25 | #include <vector>
 | 
| alpar@484 |     26 | #include <string>
 | 
| alpar@484 |     27 | 
 | 
| alpar@484 |     28 | #include <lemon/lp_base.h>
 | 
| alpar@484 |     29 | 
 | 
| alpar@484 |     30 | class ClpSimplex;
 | 
| alpar@484 |     31 | 
 | 
| alpar@484 |     32 | namespace lemon {
 | 
| alpar@484 |     33 | 
 | 
| alpar@484 |     34 |   /// \ingroup lp_group
 | 
| alpar@484 |     35 |   ///
 | 
| alpar@484 |     36 |   /// \brief Interface for the CLP solver
 | 
| alpar@484 |     37 |   ///
 | 
| alpar@484 |     38 |   /// This class implements an interface for the Clp LP solver.  The
 | 
| alpar@484 |     39 |   /// Clp library is an object oriented lp solver library developed at
 | 
| alpar@484 |     40 |   /// the IBM. The CLP is part of the COIN-OR package and it can be
 | 
| alpar@484 |     41 |   /// used with Common Public License.
 | 
| alpar@485 |     42 |   class ClpLp : public LpSolver {
 | 
| alpar@484 |     43 |   protected:
 | 
| alpar@484 |     44 | 
 | 
| alpar@484 |     45 |     ClpSimplex* _prob;
 | 
| alpar@484 |     46 | 
 | 
| alpar@484 |     47 |     std::map<std::string, int> _col_names_ref;
 | 
| alpar@484 |     48 |     std::map<std::string, int> _row_names_ref;
 | 
| alpar@484 |     49 | 
 | 
| alpar@484 |     50 |   public:
 | 
| alpar@484 |     51 | 
 | 
| alpar@484 |     52 |     /// \e
 | 
| alpar@485 |     53 |     ClpLp();
 | 
| alpar@484 |     54 |     /// \e
 | 
| alpar@485 |     55 |     ClpLp(const ClpLp&);
 | 
| alpar@484 |     56 |     /// \e
 | 
| alpar@485 |     57 |     ~ClpLp();
 | 
| alpar@484 |     58 | 
 | 
| alpar@484 |     59 |   protected:
 | 
| alpar@484 |     60 | 
 | 
| alpar@484 |     61 |     mutable double* _primal_ray;
 | 
| alpar@484 |     62 |     mutable double* _dual_ray;
 | 
| alpar@484 |     63 | 
 | 
| alpar@484 |     64 |     void _init_temporals();
 | 
| alpar@484 |     65 |     void _clear_temporals();
 | 
| alpar@484 |     66 | 
 | 
| alpar@484 |     67 |   protected:
 | 
| alpar@484 |     68 | 
 | 
| alpar@485 |     69 |     virtual ClpLp* _newSolver() const;
 | 
| alpar@485 |     70 |     virtual ClpLp* _cloneSolver() const;
 | 
| alpar@484 |     71 | 
 | 
| alpar@484 |     72 |     virtual const char* _solverName() const;
 | 
| alpar@484 |     73 | 
 | 
| alpar@484 |     74 |     virtual int _addCol();
 | 
| alpar@484 |     75 |     virtual int _addRow();
 | 
| alpar@484 |     76 | 
 | 
| alpar@484 |     77 |     virtual void _eraseCol(int i);
 | 
| alpar@484 |     78 |     virtual void _eraseRow(int i);
 | 
| alpar@484 |     79 | 
 | 
| alpar@484 |     80 |     virtual void _eraseColId(int i);
 | 
| alpar@484 |     81 |     virtual void _eraseRowId(int i);
 | 
| alpar@484 |     82 | 
 | 
| alpar@484 |     83 |     virtual void _getColName(int col, std::string& name) const;
 | 
| alpar@484 |     84 |     virtual void _setColName(int col, const std::string& name);
 | 
| alpar@484 |     85 |     virtual int _colByName(const std::string& name) const;
 | 
| alpar@484 |     86 | 
 | 
| alpar@484 |     87 |     virtual void _getRowName(int row, std::string& name) const;
 | 
| alpar@484 |     88 |     virtual void _setRowName(int row, const std::string& name);
 | 
| alpar@484 |     89 |     virtual int _rowByName(const std::string& name) const;
 | 
| alpar@484 |     90 | 
 | 
| alpar@484 |     91 |     virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
 | 
| alpar@484 |     92 |     virtual void _getRowCoeffs(int i, InsertIterator b) const;
 | 
| alpar@484 |     93 | 
 | 
| alpar@484 |     94 |     virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
 | 
| alpar@484 |     95 |     virtual void _getColCoeffs(int i, InsertIterator b) const;
 | 
| alpar@484 |     96 | 
 | 
| alpar@484 |     97 |     virtual void _setCoeff(int row, int col, Value value);
 | 
| alpar@484 |     98 |     virtual Value _getCoeff(int row, int col) const;
 | 
| alpar@484 |     99 | 
 | 
| alpar@484 |    100 |     virtual void _setColLowerBound(int i, Value value);
 | 
| alpar@484 |    101 |     virtual Value _getColLowerBound(int i) const;
 | 
| alpar@484 |    102 |     virtual void _setColUpperBound(int i, Value value);
 | 
| alpar@484 |    103 |     virtual Value _getColUpperBound(int i) const;
 | 
| alpar@484 |    104 | 
 | 
| alpar@484 |    105 |     virtual void _setRowLowerBound(int i, Value value);
 | 
| alpar@484 |    106 |     virtual Value _getRowLowerBound(int i) const;
 | 
| alpar@484 |    107 |     virtual void _setRowUpperBound(int i, Value value);
 | 
| alpar@484 |    108 |     virtual Value _getRowUpperBound(int i) const;
 | 
| alpar@484 |    109 | 
 | 
| alpar@484 |    110 |     virtual void _setObjCoeffs(ExprIterator, ExprIterator);
 | 
| alpar@484 |    111 |     virtual void _getObjCoeffs(InsertIterator) const;
 | 
| alpar@484 |    112 | 
 | 
| alpar@484 |    113 |     virtual void _setObjCoeff(int i, Value obj_coef);
 | 
| alpar@484 |    114 |     virtual Value _getObjCoeff(int i) const;
 | 
| alpar@484 |    115 | 
 | 
| alpar@484 |    116 |     virtual void _setSense(Sense sense);
 | 
| alpar@484 |    117 |     virtual Sense _getSense() const;
 | 
| alpar@484 |    118 | 
 | 
| alpar@484 |    119 |     virtual SolveExitStatus _solve();
 | 
| alpar@484 |    120 | 
 | 
| alpar@484 |    121 |     virtual Value _getPrimal(int i) const;
 | 
| alpar@484 |    122 |     virtual Value _getDual(int i) const;
 | 
| alpar@484 |    123 | 
 | 
| alpar@484 |    124 |     virtual Value _getPrimalValue() const;
 | 
| alpar@484 |    125 | 
 | 
| alpar@484 |    126 |     virtual Value _getPrimalRay(int i) const;
 | 
| alpar@484 |    127 |     virtual Value _getDualRay(int i) const;
 | 
| alpar@484 |    128 | 
 | 
| alpar@484 |    129 |     virtual VarStatus _getColStatus(int i) const;
 | 
| alpar@484 |    130 |     virtual VarStatus _getRowStatus(int i) const;
 | 
| alpar@484 |    131 | 
 | 
| alpar@484 |    132 |     virtual ProblemType _getPrimalType() const;
 | 
| alpar@484 |    133 |     virtual ProblemType _getDualType() const;
 | 
| alpar@484 |    134 | 
 | 
| alpar@484 |    135 |     virtual void _clear();
 | 
| alpar@484 |    136 | 
 | 
| alpar@484 |    137 |   public:
 | 
| alpar@484 |    138 | 
 | 
| alpar@484 |    139 |     ///Solves LP with primal simplex method.
 | 
| alpar@484 |    140 |     SolveExitStatus solvePrimal();
 | 
| alpar@484 |    141 | 
 | 
| alpar@484 |    142 |     ///Solves LP with dual simplex method.
 | 
| alpar@484 |    143 |     SolveExitStatus solveDual();
 | 
| alpar@484 |    144 | 
 | 
| alpar@484 |    145 |     ///Solves LP with barrier method.
 | 
| alpar@484 |    146 |     SolveExitStatus solveBarrier();
 | 
| alpar@484 |    147 | 
 | 
| alpar@484 |    148 |     ///Returns the constraint identifier understood by CLP.
 | 
| alpar@484 |    149 |     int clpRow(Row r) const { return rows(id(r)); }
 | 
| alpar@484 |    150 | 
 | 
| alpar@484 |    151 |     ///Returns the variable identifier understood by CLP.
 | 
| alpar@484 |    152 |     int clpCol(Col c) const { return cols(id(c)); }
 | 
| alpar@484 |    153 | 
 | 
| alpar@484 |    154 |     ///Enum for \c messageLevel() parameter
 | 
| alpar@484 |    155 |     enum MessageLevel {
 | 
| alpar@484 |    156 |       /// no output (default value)
 | 
| alpar@484 |    157 |       MESSAGE_NO_OUTPUT = 0,
 | 
| alpar@484 |    158 |       /// print final solution
 | 
| alpar@484 |    159 |       MESSAGE_FINAL_SOLUTION = 1,
 | 
| alpar@484 |    160 |       /// print factorization
 | 
| alpar@484 |    161 |       MESSAGE_FACTORIZATION = 2,
 | 
| alpar@484 |    162 |       /// normal output
 | 
| alpar@484 |    163 |       MESSAGE_NORMAL_OUTPUT = 3,
 | 
| alpar@484 |    164 |       /// verbose output
 | 
| alpar@484 |    165 |       MESSAGE_VERBOSE_OUTPUT = 4
 | 
| alpar@484 |    166 |     };
 | 
| alpar@484 |    167 |     ///Set the verbosity of the messages
 | 
| alpar@484 |    168 | 
 | 
| alpar@484 |    169 |     ///Set the verbosity of the messages
 | 
| alpar@484 |    170 |     ///
 | 
| alpar@484 |    171 |     ///\param m is the level of the messages output by the solver routines.
 | 
| alpar@484 |    172 |     void messageLevel(MessageLevel m);
 | 
| alpar@484 |    173 | 
 | 
| alpar@484 |    174 |   };
 | 
| alpar@484 |    175 | 
 | 
| alpar@484 |    176 | } //END OF NAMESPACE LEMON
 | 
| alpar@484 |    177 | 
 | 
| alpar@484 |    178 | #endif //LEMON_CLP_H
 | 
| alpar@484 |    179 | 
 |