lemon/glpk.h
author Balazs Dezso <deba@inf.elte.hu>
Thu, 24 Jun 2010 09:27:53 +0200
changeset 982 bb70ad62c95f
parent 623 745e182d0139
child 793 e4554cd6b2bf
child 900 5100072d83ca
permissions -rw-r--r--
Fix critical bug in preflow (#372)

The wrong transition between the bound decrease and highest active
heuristics caused the bug. The last node chosen in bound decrease mode
is used in the first iteration in highest active mode.
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_GLPK_H
alpar@484
    20
#define LEMON_GLPK_H
alpar@484
    21
alpar@484
    22
///\file
alpar@484
    23
///\brief Header of the LEMON-GLPK lp solver interface.
alpar@484
    24
///\ingroup lp_group
alpar@484
    25
alpar@484
    26
#include <lemon/lp_base.h>
alpar@484
    27
alpar@484
    28
// forward declaration
deba@697
    29
#if !defined _GLP_PROB && !defined GLP_PROB
alpar@484
    30
#define _GLP_PROB
deba@697
    31
#define GLP_PROB
deba@697
    32
typedef struct { double _opaque_prob; } glp_prob;
alpar@484
    33
/* LP/MIP problem object */
alpar@484
    34
#endif
alpar@484
    35
alpar@484
    36
namespace lemon {
alpar@484
    37
alpar@484
    38
alpar@484
    39
  /// \brief Base interface for the GLPK LP and MIP solver
alpar@484
    40
  ///
alpar@484
    41
  /// This class implements the common interface of the GLPK LP and MIP solver.
alpar@484
    42
  /// \ingroup lp_group
alpar@484
    43
  class GlpkBase : virtual public LpBase {
alpar@484
    44
  protected:
alpar@484
    45
alpar@484
    46
    typedef glp_prob LPX;
alpar@484
    47
    glp_prob* lp;
alpar@484
    48
alpar@484
    49
    GlpkBase();
alpar@484
    50
    GlpkBase(const GlpkBase&);
alpar@484
    51
    virtual ~GlpkBase();
alpar@484
    52
alpar@484
    53
  protected:
alpar@484
    54
alpar@484
    55
    virtual int _addCol();
alpar@484
    56
    virtual int _addRow();
alpar@484
    57
alpar@484
    58
    virtual void _eraseCol(int i);
alpar@484
    59
    virtual void _eraseRow(int i);
alpar@484
    60
alpar@484
    61
    virtual void _eraseColId(int i);
alpar@484
    62
    virtual void _eraseRowId(int i);
alpar@484
    63
alpar@484
    64
    virtual void _getColName(int col, std::string& name) const;
alpar@484
    65
    virtual void _setColName(int col, const std::string& name);
alpar@484
    66
    virtual int _colByName(const std::string& name) const;
alpar@484
    67
alpar@484
    68
    virtual void _getRowName(int row, std::string& name) const;
alpar@484
    69
    virtual void _setRowName(int row, const std::string& name);
alpar@484
    70
    virtual int _rowByName(const std::string& name) const;
alpar@484
    71
alpar@484
    72
    virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
alpar@484
    73
    virtual void _getRowCoeffs(int i, InsertIterator b) const;
alpar@484
    74
alpar@484
    75
    virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
alpar@484
    76
    virtual void _getColCoeffs(int i, InsertIterator b) const;
alpar@484
    77
alpar@484
    78
    virtual void _setCoeff(int row, int col, Value value);
alpar@484
    79
    virtual Value _getCoeff(int row, int col) const;
alpar@484
    80
alpar@484
    81
    virtual void _setColLowerBound(int i, Value value);
alpar@484
    82
    virtual Value _getColLowerBound(int i) const;
alpar@484
    83
alpar@484
    84
    virtual void _setColUpperBound(int i, Value value);
alpar@484
    85
    virtual Value _getColUpperBound(int i) const;
alpar@484
    86
alpar@484
    87
    virtual void _setRowLowerBound(int i, Value value);
alpar@484
    88
    virtual Value _getRowLowerBound(int i) const;
alpar@484
    89
alpar@484
    90
    virtual void _setRowUpperBound(int i, Value value);
alpar@484
    91
    virtual Value _getRowUpperBound(int i) const;
alpar@484
    92
alpar@484
    93
    virtual void _setObjCoeffs(ExprIterator b, ExprIterator e);
alpar@484
    94
    virtual void _getObjCoeffs(InsertIterator b) const;
alpar@484
    95
alpar@484
    96
    virtual void _setObjCoeff(int i, Value obj_coef);
alpar@484
    97
    virtual Value _getObjCoeff(int i) const;
alpar@484
    98
alpar@484
    99
    virtual void _setSense(Sense);
alpar@484
   100
    virtual Sense _getSense() const;
alpar@484
   101
alpar@484
   102
    virtual void _clear();
alpar@484
   103
deba@623
   104
    virtual void _messageLevel(MessageLevel level);
deba@623
   105
deba@585
   106
  private:
deba@585
   107
deba@585
   108
    static void freeEnv();
deba@585
   109
deba@585
   110
    struct FreeEnvHelper {
deba@585
   111
      ~FreeEnvHelper() {
deba@585
   112
        freeEnv();
deba@585
   113
      }
deba@585
   114
    };
deba@585
   115
    
deba@585
   116
    static FreeEnvHelper freeEnvHelper;
deba@623
   117
deba@623
   118
  protected:
deba@623
   119
    
deba@623
   120
    int _message_level;
deba@585
   121
    
alpar@484
   122
  public:
alpar@484
   123
alpar@484
   124
    ///Pointer to the underlying GLPK data structure.
alpar@484
   125
    LPX *lpx() {return lp;}
alpar@484
   126
    ///Const pointer to the underlying GLPK data structure.
alpar@484
   127
    const LPX *lpx() const {return lp;}
alpar@484
   128
alpar@484
   129
    ///Returns the constraint identifier understood by GLPK.
alpar@484
   130
    int lpxRow(Row r) const { return rows(id(r)); }
alpar@484
   131
alpar@484
   132
    ///Returns the variable identifier understood by GLPK.
alpar@484
   133
    int lpxCol(Col c) const { return cols(id(c)); }
alpar@484
   134
alpar@484
   135
  };
alpar@484
   136
alpar@484
   137
  /// \brief Interface for the GLPK LP solver
alpar@484
   138
  ///
alpar@484
   139
  /// This class implements an interface for the GLPK LP solver.
alpar@484
   140
  ///\ingroup lp_group
alpar@587
   141
  class GlpkLp : public LpSolver, public GlpkBase {
alpar@484
   142
  public:
alpar@484
   143
alpar@484
   144
    ///\e
alpar@485
   145
    GlpkLp();
alpar@484
   146
    ///\e
alpar@485
   147
    GlpkLp(const GlpkLp&);
alpar@484
   148
alpar@587
   149
    ///\e
alpar@587
   150
    virtual GlpkLp* cloneSolver() const;
alpar@587
   151
    ///\e
alpar@587
   152
    virtual GlpkLp* newSolver() const;
alpar@587
   153
alpar@484
   154
  private:
alpar@484
   155
alpar@484
   156
    mutable std::vector<double> _primal_ray;
alpar@484
   157
    mutable std::vector<double> _dual_ray;
alpar@484
   158
alpar@484
   159
    void _clear_temporals();
alpar@484
   160
alpar@484
   161
  protected:
alpar@484
   162
alpar@484
   163
    virtual const char* _solverName() const;
alpar@484
   164
alpar@484
   165
    virtual SolveExitStatus _solve();
alpar@484
   166
    virtual Value _getPrimal(int i) const;
alpar@484
   167
    virtual Value _getDual(int i) const;
alpar@484
   168
alpar@484
   169
    virtual Value _getPrimalValue() const;
alpar@484
   170
alpar@484
   171
    virtual VarStatus _getColStatus(int i) const;
alpar@484
   172
    virtual VarStatus _getRowStatus(int i) const;
alpar@484
   173
alpar@484
   174
    virtual Value _getPrimalRay(int i) const;
alpar@484
   175
    virtual Value _getDualRay(int i) const;
alpar@484
   176
alpar@484
   177
    virtual ProblemType _getPrimalType() const;
alpar@484
   178
    virtual ProblemType _getDualType() const;
alpar@484
   179
alpar@484
   180
  public:
alpar@484
   181
alpar@484
   182
    ///Solve with primal simplex
alpar@484
   183
    SolveExitStatus solvePrimal();
alpar@484
   184
alpar@484
   185
    ///Solve with dual simplex
alpar@484
   186
    SolveExitStatus solveDual();
alpar@484
   187
deba@612
   188
  private:
deba@612
   189
deba@612
   190
    bool _presolve;
deba@612
   191
deba@612
   192
  public:
deba@612
   193
alpar@484
   194
    ///Turns on or off the presolver
alpar@484
   195
alpar@484
   196
    ///Turns on (\c b is \c true) or off (\c b is \c false) the presolver
alpar@484
   197
    ///
alpar@484
   198
    ///The presolver is off by default.
deba@612
   199
    void presolver(bool presolve);
alpar@484
   200
alpar@484
   201
  };
alpar@484
   202
alpar@484
   203
  /// \brief Interface for the GLPK MIP solver
alpar@484
   204
  ///
alpar@484
   205
  /// This class implements an interface for the GLPK MIP solver.
alpar@484
   206
  ///\ingroup lp_group
alpar@587
   207
  class GlpkMip : public MipSolver, public GlpkBase {
alpar@484
   208
  public:
alpar@484
   209
alpar@484
   210
    ///\e
alpar@485
   211
    GlpkMip();
alpar@484
   212
    ///\e
alpar@485
   213
    GlpkMip(const GlpkMip&);
alpar@484
   214
alpar@587
   215
    virtual GlpkMip* cloneSolver() const;
alpar@587
   216
    virtual GlpkMip* newSolver() const;
alpar@587
   217
alpar@484
   218
  protected:
alpar@484
   219
alpar@484
   220
    virtual const char* _solverName() const;
alpar@484
   221
alpar@484
   222
    virtual ColTypes _getColType(int col) const;
alpar@484
   223
    virtual void _setColType(int col, ColTypes col_type);
alpar@484
   224
alpar@484
   225
    virtual SolveExitStatus _solve();
alpar@484
   226
    virtual ProblemType _getType() const;
alpar@484
   227
    virtual Value _getSol(int i) const;
alpar@484
   228
    virtual Value _getSolValue() const;
alpar@484
   229
alpar@484
   230
  };
alpar@484
   231
alpar@484
   232
alpar@484
   233
} //END OF NAMESPACE LEMON
alpar@484
   234
alpar@484
   235
#endif //LEMON_GLPK_H
alpar@484
   236