lemon/soplex.h
author Balazs Dezso <deba@inf.elte.hu>
Thu, 24 Jun 2010 09:27:53 +0200
changeset 894 bb70ad62c95f
parent 540 9db62975c32b
child 746 e4554cd6b2bf
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.
     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_SOPLEX_H
    20 #define LEMON_SOPLEX_H
    21 
    22 ///\file
    23 ///\brief Header of the LEMON-SOPLEX lp solver interface.
    24 
    25 #include <vector>
    26 #include <string>
    27 
    28 #include <lemon/lp_base.h>
    29 
    30 // Forward declaration
    31 namespace soplex {
    32   class SoPlex;
    33 }
    34 
    35 namespace lemon {
    36 
    37   /// \ingroup lp_group
    38   ///
    39   /// \brief Interface for the SOPLEX solver
    40   ///
    41   /// This class implements an interface for the SoPlex LP solver.
    42   /// The SoPlex library is an object oriented lp solver library
    43   /// developed at the Konrad-Zuse-Zentrum für Informationstechnik
    44   /// Berlin (ZIB). You can find detailed information about it at the
    45   /// <tt>http://soplex.zib.de</tt> address.
    46   class SoplexLp : public LpSolver {
    47   private:
    48 
    49     soplex::SoPlex* soplex;
    50 
    51     std::vector<std::string> _col_names;
    52     std::map<std::string, int> _col_names_ref;
    53 
    54     std::vector<std::string> _row_names;
    55     std::map<std::string, int> _row_names_ref;
    56 
    57   private:
    58 
    59     // these values cannot be retrieved element by element
    60     mutable std::vector<Value> _primal_values;
    61     mutable std::vector<Value> _dual_values;
    62 
    63     mutable std::vector<Value> _primal_ray;
    64     mutable std::vector<Value> _dual_ray;
    65 
    66     void _clear_temporals();
    67 
    68   public:
    69 
    70     /// \e
    71     SoplexLp();
    72     /// \e
    73     SoplexLp(const SoplexLp&);
    74     /// \e
    75     ~SoplexLp();
    76     /// \e
    77     virtual SoplexLp* newSolver() const;
    78     /// \e
    79     virtual SoplexLp* cloneSolver() const;
    80 
    81   protected:
    82 
    83     virtual const char* _solverName() const;
    84 
    85     virtual int _addCol();
    86     virtual int _addRow();
    87 
    88     virtual void _eraseCol(int i);
    89     virtual void _eraseRow(int i);
    90 
    91     virtual void _eraseColId(int i);
    92     virtual void _eraseRowId(int i);
    93 
    94     virtual void _getColName(int col, std::string& name) const;
    95     virtual void _setColName(int col, const std::string& name);
    96     virtual int _colByName(const std::string& name) const;
    97 
    98     virtual void _getRowName(int row, std::string& name) const;
    99     virtual void _setRowName(int row, const std::string& name);
   100     virtual int _rowByName(const std::string& name) const;
   101 
   102     virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
   103     virtual void _getRowCoeffs(int i, InsertIterator b) const;
   104 
   105     virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
   106     virtual void _getColCoeffs(int i, InsertIterator b) const;
   107 
   108     virtual void _setCoeff(int row, int col, Value value);
   109     virtual Value _getCoeff(int row, int col) const;
   110 
   111     virtual void _setColLowerBound(int i, Value value);
   112     virtual Value _getColLowerBound(int i) const;
   113     virtual void _setColUpperBound(int i, Value value);
   114     virtual Value _getColUpperBound(int i) const;
   115 
   116     virtual void _setRowLowerBound(int i, Value value);
   117     virtual Value _getRowLowerBound(int i) const;
   118     virtual void _setRowUpperBound(int i, Value value);
   119     virtual Value _getRowUpperBound(int i) const;
   120 
   121     virtual void _setObjCoeffs(ExprIterator b, ExprIterator e);
   122     virtual void _getObjCoeffs(InsertIterator b) const;
   123 
   124     virtual void _setObjCoeff(int i, Value obj_coef);
   125     virtual Value _getObjCoeff(int i) const;
   126 
   127     virtual void _setSense(Sense sense);
   128     virtual Sense _getSense() const;
   129 
   130     virtual SolveExitStatus _solve();
   131     virtual Value _getPrimal(int i) const;
   132     virtual Value _getDual(int i) const;
   133 
   134     virtual Value _getPrimalValue() const;
   135 
   136     virtual Value _getPrimalRay(int i) const;
   137     virtual Value _getDualRay(int i) const;
   138 
   139     virtual VarStatus _getColStatus(int i) const;
   140     virtual VarStatus _getRowStatus(int i) const;
   141 
   142     virtual ProblemType _getPrimalType() const;
   143     virtual ProblemType _getDualType() const;
   144 
   145     virtual void _clear();
   146 
   147     void _messageLevel(MessageLevel m);
   148     void _applyMessageLevel();
   149 
   150     int _message_level;
   151 
   152   };
   153 
   154 } //END OF NAMESPACE LEMON
   155 
   156 #endif //LEMON_SOPLEX_H
   157