lemon/glpk.h
author Peter Kovacs <kpeter@inf.elte.hu>
Fri, 17 Apr 2009 18:04:36 +0200
changeset 609 e6927fe719e6
parent 461 08d495d48089
child 537 0fec6a017ead
child 540 9db62975c32b
permissions -rw-r--r--
Support >= and <= constraints in NetworkSimplex (#219, #234)

By default the same inequality constraints are supported as by
Circulation (the GEQ form), but the LEQ form can also be selected
using the problemType() function.

The documentation of the min. cost flow module is reworked and
extended with important notes and explanations about the different
variants of the problem and about the dual solution and optimality
conditions.
     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_GLPK_H
    20 #define LEMON_GLPK_H
    21 
    22 ///\file
    23 ///\brief Header of the LEMON-GLPK lp solver interface.
    24 ///\ingroup lp_group
    25 
    26 #include <lemon/lp_base.h>
    27 
    28 // forward declaration
    29 #ifndef _GLP_PROB
    30 #define _GLP_PROB
    31 typedef struct { double _prob; } glp_prob;
    32 /* LP/MIP problem object */
    33 #endif
    34 
    35 namespace lemon {
    36 
    37 
    38   /// \brief Base interface for the GLPK LP and MIP solver
    39   ///
    40   /// This class implements the common interface of the GLPK LP and MIP solver.
    41   /// \ingroup lp_group
    42   class GlpkBase : virtual public LpBase {
    43   protected:
    44 
    45     typedef glp_prob LPX;
    46     glp_prob* lp;
    47 
    48     GlpkBase();
    49     GlpkBase(const GlpkBase&);
    50     virtual ~GlpkBase();
    51 
    52   protected:
    53 
    54     virtual int _addCol();
    55     virtual int _addRow();
    56 
    57     virtual void _eraseCol(int i);
    58     virtual void _eraseRow(int i);
    59 
    60     virtual void _eraseColId(int i);
    61     virtual void _eraseRowId(int i);
    62 
    63     virtual void _getColName(int col, std::string& name) const;
    64     virtual void _setColName(int col, const std::string& name);
    65     virtual int _colByName(const std::string& name) const;
    66 
    67     virtual void _getRowName(int row, std::string& name) const;
    68     virtual void _setRowName(int row, const std::string& name);
    69     virtual int _rowByName(const std::string& name) const;
    70 
    71     virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
    72     virtual void _getRowCoeffs(int i, InsertIterator b) const;
    73 
    74     virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
    75     virtual void _getColCoeffs(int i, InsertIterator b) const;
    76 
    77     virtual void _setCoeff(int row, int col, Value value);
    78     virtual Value _getCoeff(int row, int col) const;
    79 
    80     virtual void _setColLowerBound(int i, Value value);
    81     virtual Value _getColLowerBound(int i) const;
    82 
    83     virtual void _setColUpperBound(int i, Value value);
    84     virtual Value _getColUpperBound(int i) const;
    85 
    86     virtual void _setRowLowerBound(int i, Value value);
    87     virtual Value _getRowLowerBound(int i) const;
    88 
    89     virtual void _setRowUpperBound(int i, Value value);
    90     virtual Value _getRowUpperBound(int i) const;
    91 
    92     virtual void _setObjCoeffs(ExprIterator b, ExprIterator e);
    93     virtual void _getObjCoeffs(InsertIterator b) const;
    94 
    95     virtual void _setObjCoeff(int i, Value obj_coef);
    96     virtual Value _getObjCoeff(int i) const;
    97 
    98     virtual void _setSense(Sense);
    99     virtual Sense _getSense() const;
   100 
   101     virtual void _clear();
   102 
   103   public:
   104 
   105     ///Pointer to the underlying GLPK data structure.
   106     LPX *lpx() {return lp;}
   107     ///Const pointer to the underlying GLPK data structure.
   108     const LPX *lpx() const {return lp;}
   109 
   110     ///Returns the constraint identifier understood by GLPK.
   111     int lpxRow(Row r) const { return rows(id(r)); }
   112 
   113     ///Returns the variable identifier understood by GLPK.
   114     int lpxCol(Col c) const { return cols(id(c)); }
   115 
   116   };
   117 
   118   /// \brief Interface for the GLPK LP solver
   119   ///
   120   /// This class implements an interface for the GLPK LP solver.
   121   ///\ingroup lp_group
   122   class GlpkLp : public GlpkBase, public LpSolver {
   123   public:
   124 
   125     ///\e
   126     GlpkLp();
   127     ///\e
   128     GlpkLp(const GlpkLp&);
   129 
   130   private:
   131 
   132     mutable std::vector<double> _primal_ray;
   133     mutable std::vector<double> _dual_ray;
   134 
   135     void _clear_temporals();
   136 
   137   protected:
   138 
   139     virtual GlpkLp* _cloneSolver() const;
   140     virtual GlpkLp* _newSolver() const;
   141 
   142     virtual const char* _solverName() const;
   143 
   144     virtual SolveExitStatus _solve();
   145     virtual Value _getPrimal(int i) const;
   146     virtual Value _getDual(int i) const;
   147 
   148     virtual Value _getPrimalValue() const;
   149 
   150     virtual VarStatus _getColStatus(int i) const;
   151     virtual VarStatus _getRowStatus(int i) const;
   152 
   153     virtual Value _getPrimalRay(int i) const;
   154     virtual Value _getDualRay(int i) const;
   155 
   156     ///\todo It should be clarified
   157     ///
   158     virtual ProblemType _getPrimalType() const;
   159     virtual ProblemType _getDualType() const;
   160 
   161   public:
   162 
   163     ///Solve with primal simplex
   164     SolveExitStatus solvePrimal();
   165 
   166     ///Solve with dual simplex
   167     SolveExitStatus solveDual();
   168 
   169     ///Turns on or off the presolver
   170 
   171     ///Turns on (\c b is \c true) or off (\c b is \c false) the presolver
   172     ///
   173     ///The presolver is off by default.
   174     void presolver(bool b);
   175 
   176     ///Enum for \c messageLevel() parameter
   177     enum MessageLevel {
   178       /// no output (default value)
   179       MESSAGE_NO_OUTPUT = 0,
   180       /// error messages only
   181       MESSAGE_ERROR_MESSAGE = 1,
   182       /// normal output
   183       MESSAGE_NORMAL_OUTPUT = 2,
   184       /// full output (includes informational messages)
   185       MESSAGE_FULL_OUTPUT = 3
   186     };
   187 
   188   private:
   189 
   190     MessageLevel _message_level;
   191 
   192   public:
   193 
   194     ///Set the verbosity of the messages
   195 
   196     ///Set the verbosity of the messages
   197     ///
   198     ///\param m is the level of the messages output by the solver routines.
   199     void messageLevel(MessageLevel m);
   200   };
   201 
   202   /// \brief Interface for the GLPK MIP solver
   203   ///
   204   /// This class implements an interface for the GLPK MIP solver.
   205   ///\ingroup lp_group
   206   class GlpkMip : public GlpkBase, public MipSolver {
   207   public:
   208 
   209     ///\e
   210     GlpkMip();
   211     ///\e
   212     GlpkMip(const GlpkMip&);
   213 
   214   protected:
   215 
   216     virtual GlpkMip* _cloneSolver() const;
   217     virtual GlpkMip* _newSolver() const;
   218 
   219     virtual const char* _solverName() const;
   220 
   221     virtual ColTypes _getColType(int col) const;
   222     virtual void _setColType(int col, ColTypes col_type);
   223 
   224     virtual SolveExitStatus _solve();
   225     virtual ProblemType _getType() const;
   226     virtual Value _getSol(int i) const;
   227     virtual Value _getSolValue() const;
   228 
   229     ///Enum for \c messageLevel() parameter
   230     enum MessageLevel {
   231       /// no output (default value)
   232       MESSAGE_NO_OUTPUT = 0,
   233       /// error messages only
   234       MESSAGE_ERROR_MESSAGE = 1,
   235       /// normal output
   236       MESSAGE_NORMAL_OUTPUT = 2,
   237       /// full output (includes informational messages)
   238       MESSAGE_FULL_OUTPUT = 3
   239     };
   240 
   241   private:
   242 
   243     MessageLevel _message_level;
   244 
   245   public:
   246 
   247     ///Set the verbosity of the messages
   248 
   249     ///Set the verbosity of the messages
   250     ///
   251     ///\param m is the level of the messages output by the solver routines.
   252     void messageLevel(MessageLevel m);
   253   };
   254 
   255 
   256 } //END OF NAMESPACE LEMON
   257 
   258 #endif //LEMON_GLPK_H
   259