lemon/lp_glpk.h
author Balazs Dezso <deba@inf.elte.hu>
Tue, 02 Dec 2008 22:48:28 +0100
changeset 482 ed54c0d13df0
parent 481 7afc121e0689
permissions -rw-r--r--
Thorough redesign of the LP/MIP interface (#44)

- Redesigned class structure
- Redesigned iterators
- Some functions in the basic interface redesigned
- More complete setting functions
- Ray retrieving functions
- Lot of improvements
- Cplex common env
- CLP macro definition to config.h.in
- Update lp.h to also use soplex and clp
- Remove default_solver_name
- New solverName() function in solvers
- Handle exceptions for MipCplex test
- Rename tolerance parameter to epsilon
- Rename MapIt to CoeffIt
- Lot of documentation improvements
- Various bugfixes
deba@481
     1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
deba@481
     2
 *
deba@481
     3
 * This file is a part of LEMON, a generic C++ optimization library.
deba@481
     4
 *
deba@481
     5
 * Copyright (C) 2003-2008
deba@481
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
deba@481
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
deba@481
     8
 *
deba@481
     9
 * Permission to use, modify and distribute this software is granted
deba@481
    10
 * provided that this copyright notice appears in all copies. For
deba@481
    11
 * precise terms see the accompanying LICENSE file.
deba@481
    12
 *
deba@481
    13
 * This software is provided "AS IS" with no warranty of any kind,
deba@481
    14
 * express or implied, and with no claim as to its suitability for any
deba@481
    15
 * purpose.
deba@481
    16
 *
deba@481
    17
 */
deba@481
    18
deba@481
    19
#ifndef LEMON_LP_GLPK_H
deba@481
    20
#define LEMON_LP_GLPK_H
deba@481
    21
deba@481
    22
///\file
deba@481
    23
///\brief Header of the LEMON-GLPK lp solver interface.
deba@481
    24
///\ingroup lp_group
deba@481
    25
deba@481
    26
#include <lemon/lp_base.h>
deba@481
    27
deba@481
    28
// forward declaration
deba@481
    29
#ifndef _GLP_PROB
deba@481
    30
#define _GLP_PROB
deba@481
    31
typedef struct { double _prob; } glp_prob;
deba@481
    32
/* LP/MIP problem object */
deba@481
    33
#endif
deba@481
    34
deba@481
    35
namespace lemon {
deba@481
    36
deba@481
    37
deba@482
    38
  /// \brief Base interface for the GLPK LP and MIP solver
deba@481
    39
  ///
deba@482
    40
  /// This class implements the common interface of the GLPK LP and MIP solver.
deba@482
    41
  /// \ingroup lp_group
deba@482
    42
  class GlpkBase : virtual public LpBase {
deba@481
    43
  protected:
deba@481
    44
deba@481
    45
    typedef glp_prob LPX;
deba@481
    46
    glp_prob* lp;
deba@481
    47
deba@482
    48
    GlpkBase();
deba@482
    49
    GlpkBase(const GlpkBase&);
deba@482
    50
    virtual ~GlpkBase();
deba@481
    51
deba@481
    52
  protected:
deba@481
    53
deba@481
    54
    virtual int _addCol();
deba@481
    55
    virtual int _addRow();
deba@482
    56
deba@481
    57
    virtual void _eraseCol(int i);
deba@481
    58
    virtual void _eraseRow(int i);
deba@482
    59
deba@482
    60
    virtual void _eraseColId(int i);
deba@482
    61
    virtual void _eraseRowId(int i);
deba@482
    62
deba@482
    63
    virtual void _getColName(int col, std::string& name) const;
deba@482
    64
    virtual void _setColName(int col, const std::string& name);
deba@481
    65
    virtual int _colByName(const std::string& name) const;
deba@482
    66
deba@482
    67
    virtual void _getRowName(int row, std::string& name) const;
deba@482
    68
    virtual void _setRowName(int row, const std::string& name);
deba@482
    69
    virtual int _rowByName(const std::string& name) const;
deba@482
    70
deba@482
    71
    virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
deba@482
    72
    virtual void _getRowCoeffs(int i, InsertIterator b) const;
deba@482
    73
deba@482
    74
    virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
deba@482
    75
    virtual void _getColCoeffs(int i, InsertIterator b) const;
deba@482
    76
deba@481
    77
    virtual void _setCoeff(int row, int col, Value value);
deba@481
    78
    virtual Value _getCoeff(int row, int col) const;
deba@481
    79
deba@481
    80
    virtual void _setColLowerBound(int i, Value value);
deba@481
    81
    virtual Value _getColLowerBound(int i) const;
deba@482
    82
deba@481
    83
    virtual void _setColUpperBound(int i, Value value);
deba@481
    84
    virtual Value _getColUpperBound(int i) const;
deba@481
    85
deba@482
    86
    virtual void _setRowLowerBound(int i, Value value);
deba@482
    87
    virtual Value _getRowLowerBound(int i) const;
deba@482
    88
deba@482
    89
    virtual void _setRowUpperBound(int i, Value value);
deba@482
    90
    virtual Value _getRowUpperBound(int i) const;
deba@482
    91
deba@482
    92
    virtual void _setObjCoeffs(ExprIterator b, ExprIterator e);
deba@482
    93
    virtual void _getObjCoeffs(InsertIterator b) const;
deba@482
    94
deba@481
    95
    virtual void _setObjCoeff(int i, Value obj_coef);
deba@481
    96
    virtual Value _getObjCoeff(int i) const;
deba@482
    97
deba@482
    98
    virtual void _setSense(Sense);
deba@482
    99
    virtual Sense _getSense() const;
deba@482
   100
deba@482
   101
    virtual void _clear();
deba@482
   102
deba@482
   103
  public:
deba@482
   104
deba@482
   105
    ///Pointer to the underlying GLPK data structure.
deba@482
   106
    LPX *lpx() {return lp;}
deba@482
   107
    ///Const pointer to the underlying GLPK data structure.
deba@482
   108
    const LPX *lpx() const {return lp;}
deba@482
   109
deba@482
   110
    ///Returns the constraint identifier understood by GLPK.
deba@482
   111
    int lpxRow(Row r) const { return rows(id(r)); }
deba@482
   112
deba@482
   113
    ///Returns the variable identifier understood by GLPK.
deba@482
   114
    int lpxCol(Col c) const { return cols(id(c)); }
deba@482
   115
deba@482
   116
  };
deba@482
   117
deba@482
   118
  /// \brief Interface for the GLPK LP solver
deba@482
   119
  ///
deba@482
   120
  /// This class implements an interface for the GLPK LP solver.
deba@482
   121
  ///\ingroup lp_group
deba@482
   122
  class LpGlpk : public GlpkBase, public LpSolver {
deba@482
   123
  public:
deba@481
   124
deba@481
   125
    ///\e
deba@482
   126
    LpGlpk();
deba@482
   127
    ///\e
deba@482
   128
    LpGlpk(const LpGlpk&);
deba@482
   129
deba@482
   130
  private:
deba@482
   131
deba@482
   132
    mutable std::vector<double> _primal_ray;
deba@482
   133
    mutable std::vector<double> _dual_ray;
deba@482
   134
deba@482
   135
    void _clear_temporals();
deba@482
   136
deba@482
   137
  protected:
deba@482
   138
deba@482
   139
    virtual LpGlpk* _cloneSolver() const;
deba@482
   140
    virtual LpGlpk* _newSolver() const;
deba@482
   141
deba@482
   142
    virtual const char* _solverName() const;
deba@482
   143
deba@482
   144
    virtual SolveExitStatus _solve();
deba@482
   145
    virtual Value _getPrimal(int i) const;
deba@482
   146
    virtual Value _getDual(int i) const;
deba@482
   147
deba@482
   148
    virtual Value _getPrimalValue() const;
deba@482
   149
deba@482
   150
    virtual VarStatus _getColStatus(int i) const;
deba@482
   151
    virtual VarStatus _getRowStatus(int i) const;
deba@482
   152
deba@482
   153
    virtual Value _getPrimalRay(int i) const;
deba@482
   154
    virtual Value _getDualRay(int i) const;
deba@481
   155
deba@481
   156
    ///\todo It should be clarified
deba@481
   157
    ///
deba@482
   158
    virtual ProblemType _getPrimalType() const;
deba@482
   159
    virtual ProblemType _getDualType() const;
deba@481
   160
deba@481
   161
  public:
deba@481
   162
deba@482
   163
    ///Solve with primal simplex
deba@482
   164
    SolveExitStatus solvePrimal();
deba@482
   165
deba@482
   166
    ///Solve with dual simplex
deba@482
   167
    SolveExitStatus solveDual();
deba@482
   168
deba@481
   169
    ///Turns on or off the presolver
deba@481
   170
deba@481
   171
    ///Turns on (\c b is \c true) or off (\c b is \c false) the presolver
deba@481
   172
    ///
deba@481
   173
    ///The presolver is off by default.
deba@481
   174
    void presolver(bool b);
deba@481
   175
deba@482
   176
    ///Enum for \c messageLevel() parameter
deba@482
   177
    enum MessageLevel {
deba@482
   178
      /// no output (default value)
deba@482
   179
      MESSAGE_NO_OUTPUT = 0,
deba@482
   180
      /// error messages only
deba@482
   181
      MESSAGE_ERROR_MESSAGE = 1,
deba@482
   182
      /// normal output
deba@482
   183
      MESSAGE_NORMAL_OUTPUT = 2,
deba@482
   184
      /// full output (includes informational messages)
deba@482
   185
      MESSAGE_FULL_OUTPUT = 3
deba@482
   186
    };
deba@481
   187
deba@482
   188
  private:
deba@481
   189
deba@482
   190
    MessageLevel _message_level;
deba@482
   191
deba@482
   192
  public:
deba@482
   193
deba@482
   194
    ///Set the verbosity of the messages
deba@482
   195
deba@482
   196
    ///Set the verbosity of the messages
deba@482
   197
    ///
deba@482
   198
    ///\param m is the level of the messages output by the solver routines.
deba@482
   199
    void messageLevel(MessageLevel m);
deba@481
   200
  };
deba@482
   201
deba@482
   202
  /// \brief Interface for the GLPK MIP solver
deba@482
   203
  ///
deba@482
   204
  /// This class implements an interface for the GLPK MIP solver.
deba@482
   205
  ///\ingroup lp_group
deba@482
   206
  class MipGlpk : public GlpkBase, public MipSolver {
deba@482
   207
  public:
deba@482
   208
deba@482
   209
    ///\e
deba@482
   210
    MipGlpk();
deba@482
   211
    ///\e
deba@482
   212
    MipGlpk(const MipGlpk&);
deba@482
   213
deba@482
   214
  protected:
deba@482
   215
deba@482
   216
    virtual MipGlpk* _cloneSolver() const;
deba@482
   217
    virtual MipGlpk* _newSolver() const;
deba@482
   218
deba@482
   219
    virtual const char* _solverName() const;
deba@482
   220
deba@482
   221
    virtual ColTypes _getColType(int col) const;
deba@482
   222
    virtual void _setColType(int col, ColTypes col_type);
deba@482
   223
deba@482
   224
    virtual SolveExitStatus _solve();
deba@482
   225
    virtual ProblemType _getType() const;
deba@482
   226
    virtual Value _getSol(int i) const;
deba@482
   227
    virtual Value _getSolValue() const;
deba@482
   228
deba@482
   229
    ///Enum for \c messageLevel() parameter
deba@482
   230
    enum MessageLevel {
deba@482
   231
      /// no output (default value)
deba@482
   232
      MESSAGE_NO_OUTPUT = 0,
deba@482
   233
      /// error messages only
deba@482
   234
      MESSAGE_ERROR_MESSAGE = 1,
deba@482
   235
      /// normal output
deba@482
   236
      MESSAGE_NORMAL_OUTPUT = 2,
deba@482
   237
      /// full output (includes informational messages)
deba@482
   238
      MESSAGE_FULL_OUTPUT = 3
deba@482
   239
    };
deba@482
   240
deba@482
   241
  private:
deba@482
   242
deba@482
   243
    MessageLevel _message_level;
deba@482
   244
deba@482
   245
  public:
deba@482
   246
deba@482
   247
    ///Set the verbosity of the messages
deba@482
   248
deba@482
   249
    ///Set the verbosity of the messages
deba@482
   250
    ///
deba@482
   251
    ///\param m is the level of the messages output by the solver routines.
deba@482
   252
    void messageLevel(MessageLevel m);
deba@482
   253
  };
deba@482
   254
deba@482
   255
deba@481
   256
} //END OF NAMESPACE LEMON
deba@481
   257
deba@481
   258
#endif //LEMON_LP_GLPK_H
deba@481
   259