lemon/glpk.h
author Balazs Dezso <deba@inf.elte.hu>
Thu, 24 Jun 2010 09:27:53 +0200
changeset 894 bb70ad62c95f
parent 576 745e182d0139
child 746 e4554cd6b2bf
child 832 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@461
     1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
alpar@461
     2
 *
alpar@461
     3
 * This file is a part of LEMON, a generic C++ optimization library.
alpar@461
     4
 *
alpar@461
     5
 * Copyright (C) 2003-2008
alpar@461
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
alpar@461
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
alpar@461
     8
 *
alpar@461
     9
 * Permission to use, modify and distribute this software is granted
alpar@461
    10
 * provided that this copyright notice appears in all copies. For
alpar@461
    11
 * precise terms see the accompanying LICENSE file.
alpar@461
    12
 *
alpar@461
    13
 * This software is provided "AS IS" with no warranty of any kind,
alpar@461
    14
 * express or implied, and with no claim as to its suitability for any
alpar@461
    15
 * purpose.
alpar@461
    16
 *
alpar@461
    17
 */
alpar@461
    18
alpar@461
    19
#ifndef LEMON_GLPK_H
alpar@461
    20
#define LEMON_GLPK_H
alpar@461
    21
alpar@461
    22
///\file
alpar@461
    23
///\brief Header of the LEMON-GLPK lp solver interface.
alpar@461
    24
///\ingroup lp_group
alpar@461
    25
alpar@461
    26
#include <lemon/lp_base.h>
alpar@461
    27
alpar@461
    28
// forward declaration
deba@650
    29
#if !defined _GLP_PROB && !defined GLP_PROB
alpar@461
    30
#define _GLP_PROB
deba@650
    31
#define GLP_PROB
deba@650
    32
typedef struct { double _opaque_prob; } glp_prob;
alpar@461
    33
/* LP/MIP problem object */
alpar@461
    34
#endif
alpar@461
    35
alpar@461
    36
namespace lemon {
alpar@461
    37
alpar@461
    38
alpar@461
    39
  /// \brief Base interface for the GLPK LP and MIP solver
alpar@461
    40
  ///
alpar@461
    41
  /// This class implements the common interface of the GLPK LP and MIP solver.
alpar@461
    42
  /// \ingroup lp_group
alpar@461
    43
  class GlpkBase : virtual public LpBase {
alpar@461
    44
  protected:
alpar@461
    45
alpar@461
    46
    typedef glp_prob LPX;
alpar@461
    47
    glp_prob* lp;
alpar@461
    48
alpar@461
    49
    GlpkBase();
alpar@461
    50
    GlpkBase(const GlpkBase&);
alpar@461
    51
    virtual ~GlpkBase();
alpar@461
    52
alpar@461
    53
  protected:
alpar@461
    54
alpar@461
    55
    virtual int _addCol();
alpar@461
    56
    virtual int _addRow();
alpar@461
    57
alpar@461
    58
    virtual void _eraseCol(int i);
alpar@461
    59
    virtual void _eraseRow(int i);
alpar@461
    60
alpar@461
    61
    virtual void _eraseColId(int i);
alpar@461
    62
    virtual void _eraseRowId(int i);
alpar@461
    63
alpar@461
    64
    virtual void _getColName(int col, std::string& name) const;
alpar@461
    65
    virtual void _setColName(int col, const std::string& name);
alpar@461
    66
    virtual int _colByName(const std::string& name) const;
alpar@461
    67
alpar@461
    68
    virtual void _getRowName(int row, std::string& name) const;
alpar@461
    69
    virtual void _setRowName(int row, const std::string& name);
alpar@461
    70
    virtual int _rowByName(const std::string& name) const;
alpar@461
    71
alpar@461
    72
    virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
alpar@461
    73
    virtual void _getRowCoeffs(int i, InsertIterator b) const;
alpar@461
    74
alpar@461
    75
    virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
alpar@461
    76
    virtual void _getColCoeffs(int i, InsertIterator b) const;
alpar@461
    77
alpar@461
    78
    virtual void _setCoeff(int row, int col, Value value);
alpar@461
    79
    virtual Value _getCoeff(int row, int col) const;
alpar@461
    80
alpar@461
    81
    virtual void _setColLowerBound(int i, Value value);
alpar@461
    82
    virtual Value _getColLowerBound(int i) const;
alpar@461
    83
alpar@461
    84
    virtual void _setColUpperBound(int i, Value value);
alpar@461
    85
    virtual Value _getColUpperBound(int i) const;
alpar@461
    86
alpar@461
    87
    virtual void _setRowLowerBound(int i, Value value);
alpar@461
    88
    virtual Value _getRowLowerBound(int i) const;
alpar@461
    89
alpar@461
    90
    virtual void _setRowUpperBound(int i, Value value);
alpar@461
    91
    virtual Value _getRowUpperBound(int i) const;
alpar@461
    92
alpar@461
    93
    virtual void _setObjCoeffs(ExprIterator b, ExprIterator e);
alpar@461
    94
    virtual void _getObjCoeffs(InsertIterator b) const;
alpar@461
    95
alpar@461
    96
    virtual void _setObjCoeff(int i, Value obj_coef);
alpar@461
    97
    virtual Value _getObjCoeff(int i) const;
alpar@461
    98
alpar@461
    99
    virtual void _setSense(Sense);
alpar@461
   100
    virtual Sense _getSense() const;
alpar@461
   101
alpar@461
   102
    virtual void _clear();
alpar@461
   103
deba@576
   104
    virtual void _messageLevel(MessageLevel level);
deba@576
   105
deba@538
   106
  private:
deba@538
   107
deba@538
   108
    static void freeEnv();
deba@538
   109
deba@538
   110
    struct FreeEnvHelper {
deba@538
   111
      ~FreeEnvHelper() {
deba@538
   112
        freeEnv();
deba@538
   113
      }
deba@538
   114
    };
deba@538
   115
    
deba@538
   116
    static FreeEnvHelper freeEnvHelper;
deba@576
   117
deba@576
   118
  protected:
deba@576
   119
    
deba@576
   120
    int _message_level;
deba@538
   121
    
alpar@461
   122
  public:
alpar@461
   123
alpar@461
   124
    ///Pointer to the underlying GLPK data structure.
alpar@461
   125
    LPX *lpx() {return lp;}
alpar@461
   126
    ///Const pointer to the underlying GLPK data structure.
alpar@461
   127
    const LPX *lpx() const {return lp;}
alpar@461
   128
alpar@461
   129
    ///Returns the constraint identifier understood by GLPK.
alpar@461
   130
    int lpxRow(Row r) const { return rows(id(r)); }
alpar@461
   131
alpar@461
   132
    ///Returns the variable identifier understood by GLPK.
alpar@461
   133
    int lpxCol(Col c) const { return cols(id(c)); }
alpar@461
   134
alpar@461
   135
  };
alpar@461
   136
alpar@461
   137
  /// \brief Interface for the GLPK LP solver
alpar@461
   138
  ///
alpar@461
   139
  /// This class implements an interface for the GLPK LP solver.
alpar@461
   140
  ///\ingroup lp_group
alpar@540
   141
  class GlpkLp : public LpSolver, public GlpkBase {
alpar@461
   142
  public:
alpar@461
   143
alpar@461
   144
    ///\e
alpar@462
   145
    GlpkLp();
alpar@461
   146
    ///\e
alpar@462
   147
    GlpkLp(const GlpkLp&);
alpar@461
   148
alpar@540
   149
    ///\e
alpar@540
   150
    virtual GlpkLp* cloneSolver() const;
alpar@540
   151
    ///\e
alpar@540
   152
    virtual GlpkLp* newSolver() const;
alpar@540
   153
alpar@461
   154
  private:
alpar@461
   155
alpar@461
   156
    mutable std::vector<double> _primal_ray;
alpar@461
   157
    mutable std::vector<double> _dual_ray;
alpar@461
   158
alpar@461
   159
    void _clear_temporals();
alpar@461
   160
alpar@461
   161
  protected:
alpar@461
   162
alpar@461
   163
    virtual const char* _solverName() const;
alpar@461
   164
alpar@461
   165
    virtual SolveExitStatus _solve();
alpar@461
   166
    virtual Value _getPrimal(int i) const;
alpar@461
   167
    virtual Value _getDual(int i) const;
alpar@461
   168
alpar@461
   169
    virtual Value _getPrimalValue() const;
alpar@461
   170
alpar@461
   171
    virtual VarStatus _getColStatus(int i) const;
alpar@461
   172
    virtual VarStatus _getRowStatus(int i) const;
alpar@461
   173
alpar@461
   174
    virtual Value _getPrimalRay(int i) const;
alpar@461
   175
    virtual Value _getDualRay(int i) const;
alpar@461
   176
alpar@461
   177
    virtual ProblemType _getPrimalType() const;
alpar@461
   178
    virtual ProblemType _getDualType() const;
alpar@461
   179
alpar@461
   180
  public:
alpar@461
   181
alpar@461
   182
    ///Solve with primal simplex
alpar@461
   183
    SolveExitStatus solvePrimal();
alpar@461
   184
alpar@461
   185
    ///Solve with dual simplex
alpar@461
   186
    SolveExitStatus solveDual();
alpar@461
   187
deba@565
   188
  private:
deba@565
   189
deba@565
   190
    bool _presolve;
deba@565
   191
deba@565
   192
  public:
deba@565
   193
alpar@461
   194
    ///Turns on or off the presolver
alpar@461
   195
alpar@461
   196
    ///Turns on (\c b is \c true) or off (\c b is \c false) the presolver
alpar@461
   197
    ///
alpar@461
   198
    ///The presolver is off by default.
deba@565
   199
    void presolver(bool presolve);
alpar@461
   200
alpar@461
   201
  };
alpar@461
   202
alpar@461
   203
  /// \brief Interface for the GLPK MIP solver
alpar@461
   204
  ///
alpar@461
   205
  /// This class implements an interface for the GLPK MIP solver.
alpar@461
   206
  ///\ingroup lp_group
alpar@540
   207
  class GlpkMip : public MipSolver, public GlpkBase {
alpar@461
   208
  public:
alpar@461
   209
alpar@461
   210
    ///\e
alpar@462
   211
    GlpkMip();
alpar@461
   212
    ///\e
alpar@462
   213
    GlpkMip(const GlpkMip&);
alpar@461
   214
alpar@540
   215
    virtual GlpkMip* cloneSolver() const;
alpar@540
   216
    virtual GlpkMip* newSolver() const;
alpar@540
   217
alpar@461
   218
  protected:
alpar@461
   219
alpar@461
   220
    virtual const char* _solverName() const;
alpar@461
   221
alpar@461
   222
    virtual ColTypes _getColType(int col) const;
alpar@461
   223
    virtual void _setColType(int col, ColTypes col_type);
alpar@461
   224
alpar@461
   225
    virtual SolveExitStatus _solve();
alpar@461
   226
    virtual ProblemType _getType() const;
alpar@461
   227
    virtual Value _getSol(int i) const;
alpar@461
   228
    virtual Value _getSolValue() const;
alpar@461
   229
alpar@461
   230
  };
alpar@461
   231
alpar@461
   232
alpar@461
   233
} //END OF NAMESPACE LEMON
alpar@461
   234
alpar@461
   235
#endif //LEMON_GLPK_H
alpar@461
   236