lemon/clp.h
author Peter Kovacs <kpeter@inf.elte.hu>
Tue, 15 Mar 2011 19:32:21 +0100
changeset 936 ddd3c0d3d9bf
parent 746 e4554cd6b2bf
child 1092 dceba191c00d
permissions -rw-r--r--
Implement the scaling Price Refinement heuristic in CostScaling (#417)
instead of Early Termination.

These two heuristics are similar, but the newer one is faster
and not only makes it possible to skip some epsilon phases, but
it can improve the performance of the other phases, as well.
     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-2010
     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