lemon/clp.h
author Peter Kovacs <kpeter@inf.elte.hu>
Thu, 12 Nov 2009 23:26:13 +0100
changeset 806 fa6f37d7a25b
parent 576 745e182d0139
child 877 141f9c0db4a3
permissions -rw-r--r--
Entirely rework CapacityScaling (#180)

- Use the new interface similarly to NetworkSimplex.
- Rework the implementation using an efficient internal structure
for handling the residual network. This improvement made the
code much faster (up to 2-5 times faster on large graphs).
- Handle GEQ supply type (LEQ is not supported).
- Handle negative costs for arcs of finite capacity.
(Note that this algorithm cannot handle arcs of negative cost
and infinite upper bound, thus it returns UNBOUNDED if such
an arc exists.)
- Extend the documentation.
     1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library.
     4  *
     5  * Copyright (C) 2003-2008
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 #ifndef LEMON_CLP_H
    20 #define LEMON_CLP_H
    21 
    22 ///\file
    23 ///\brief Header of the LEMON-CLP lp solver interface.
    24 
    25 #include <vector>
    26 #include <string>
    27 
    28 #include <lemon/lp_base.h>
    29 
    30 class ClpSimplex;
    31 
    32 namespace lemon {
    33 
    34   /// \ingroup lp_group
    35   ///
    36   /// \brief Interface for the CLP solver
    37   ///
    38   /// This class implements an interface for the Clp LP solver.  The
    39   /// Clp library is an object oriented lp solver library developed at
    40   /// the IBM. The CLP is part of the COIN-OR package and it can be
    41   /// used with Common Public License.
    42   class ClpLp : public LpSolver {
    43   protected:
    44 
    45     ClpSimplex* _prob;
    46 
    47     std::map<std::string, int> _col_names_ref;
    48     std::map<std::string, int> _row_names_ref;
    49 
    50   public:
    51 
    52     /// \e
    53     ClpLp();
    54     /// \e
    55     ClpLp(const ClpLp&);
    56     /// \e
    57     ~ClpLp();
    58 
    59     /// \e
    60     virtual ClpLp* newSolver() const;
    61     /// \e
    62     virtual ClpLp* cloneSolver() const;
    63 
    64   protected:
    65 
    66     mutable double* _primal_ray;
    67     mutable double* _dual_ray;
    68 
    69     void _init_temporals();
    70     void _clear_temporals();
    71 
    72   protected:
    73 
    74     virtual const char* _solverName() const;
    75 
    76     virtual int _addCol();
    77     virtual int _addRow();
    78     virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
    79 
    80     virtual void _eraseCol(int i);
    81     virtual void _eraseRow(int i);
    82 
    83     virtual void _eraseColId(int i);
    84     virtual void _eraseRowId(int i);
    85 
    86     virtual void _getColName(int col, std::string& name) const;
    87     virtual void _setColName(int col, const std::string& name);
    88     virtual int _colByName(const std::string& name) const;
    89 
    90     virtual void _getRowName(int row, std::string& name) const;
    91     virtual void _setRowName(int row, const std::string& name);
    92     virtual int _rowByName(const std::string& name) const;
    93 
    94     virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
    95     virtual void _getRowCoeffs(int i, InsertIterator b) const;
    96 
    97     virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
    98     virtual void _getColCoeffs(int i, InsertIterator b) const;
    99 
   100     virtual void _setCoeff(int row, int col, Value value);
   101     virtual Value _getCoeff(int row, int col) const;
   102 
   103     virtual void _setColLowerBound(int i, Value value);
   104     virtual Value _getColLowerBound(int i) const;
   105     virtual void _setColUpperBound(int i, Value value);
   106     virtual Value _getColUpperBound(int i) const;
   107 
   108     virtual void _setRowLowerBound(int i, Value value);
   109     virtual Value _getRowLowerBound(int i) const;
   110     virtual void _setRowUpperBound(int i, Value value);
   111     virtual Value _getRowUpperBound(int i) const;
   112 
   113     virtual void _setObjCoeffs(ExprIterator, ExprIterator);
   114     virtual void _getObjCoeffs(InsertIterator) const;
   115 
   116     virtual void _setObjCoeff(int i, Value obj_coef);
   117     virtual Value _getObjCoeff(int i) const;
   118 
   119     virtual void _setSense(Sense sense);
   120     virtual Sense _getSense() const;
   121 
   122     virtual SolveExitStatus _solve();
   123 
   124     virtual Value _getPrimal(int i) const;
   125     virtual Value _getDual(int i) const;
   126 
   127     virtual Value _getPrimalValue() const;
   128 
   129     virtual Value _getPrimalRay(int i) const;
   130     virtual Value _getDualRay(int i) const;
   131 
   132     virtual VarStatus _getColStatus(int i) const;
   133     virtual VarStatus _getRowStatus(int i) const;
   134 
   135     virtual ProblemType _getPrimalType() const;
   136     virtual ProblemType _getDualType() const;
   137 
   138     virtual void _clear();
   139 
   140     virtual void _messageLevel(MessageLevel);
   141     
   142   public:
   143 
   144     ///Solves LP with primal simplex method.
   145     SolveExitStatus solvePrimal();
   146 
   147     ///Solves LP with dual simplex method.
   148     SolveExitStatus solveDual();
   149 
   150     ///Solves LP with barrier method.
   151     SolveExitStatus solveBarrier();
   152 
   153     ///Returns the constraint identifier understood by CLP.
   154     int clpRow(Row r) const { return rows(id(r)); }
   155 
   156     ///Returns the variable identifier understood by CLP.
   157     int clpCol(Col c) const { return cols(id(c)); }
   158 
   159   };
   160 
   161 } //END OF NAMESPACE LEMON
   162 
   163 #endif //LEMON_CLP_H
   164