lemon/lp_base.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 1081 f1398882a928
child 1092 2eebc8f7dca5
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.
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_BASE_H
deba@481
    20
#define LEMON_LP_BASE_H
deba@481
    21
deba@481
    22
#include<iostream>
deba@481
    23
#include<vector>
deba@481
    24
#include<map>
deba@481
    25
#include<limits>
deba@481
    26
#include<lemon/math.h>
deba@481
    27
deba@482
    28
#include<lemon/error.h>
deba@482
    29
#include<lemon/assert.h>
deba@482
    30
deba@481
    31
#include<lemon/core.h>
deba@482
    32
#include<lemon/bits/solver_bits.h>
deba@481
    33
deba@481
    34
///\file
deba@481
    35
///\brief The interface of the LP solver interface.
deba@481
    36
///\ingroup lp_group
deba@481
    37
namespace lemon {
deba@481
    38
deba@482
    39
  ///Common base class for LP and MIP solvers
deba@481
    40
deba@482
    41
  ///Usually this class is not used directly, please use one of the concrete
deba@482
    42
  ///implementations of the solver interface.
deba@481
    43
  ///\ingroup lp_group
deba@482
    44
  class LpBase {
deba@481
    45
deba@481
    46
  protected:
deba@481
    47
deba@482
    48
    _solver_bits::VarIndex rows;
deba@482
    49
    _solver_bits::VarIndex cols;
deba@481
    50
deba@481
    51
  public:
deba@481
    52
deba@481
    53
    ///Possible outcomes of an LP solving procedure
deba@481
    54
    enum SolveExitStatus {
kpeter@631
    55
      /// = 0. It means that the problem has been successfully solved: either
deba@481
    56
      ///an optimal solution has been found or infeasibility/unboundedness
deba@481
    57
      ///has been proved.
deba@481
    58
      SOLVED = 0,
kpeter@631
    59
      /// = 1. Any other case (including the case when some user specified
kpeter@631
    60
      ///limit has been exceeded).
deba@481
    61
      UNSOLVED = 1
deba@481
    62
    };
deba@481
    63
deba@482
    64
    ///Direction of the optimization
deba@482
    65
    enum Sense {
deba@482
    66
      /// Minimization
deba@482
    67
      MIN,
deba@482
    68
      /// Maximization
deba@482
    69
      MAX
deba@481
    70
    };
deba@481
    71
deba@623
    72
    ///Enum for \c messageLevel() parameter
deba@623
    73
    enum MessageLevel {
kpeter@631
    74
      /// No output (default value).
deba@623
    75
      MESSAGE_NOTHING,
kpeter@631
    76
      /// Error messages only.
deba@623
    77
      MESSAGE_ERROR,
kpeter@631
    78
      /// Warnings.
deba@623
    79
      MESSAGE_WARNING,
kpeter@631
    80
      /// Normal output.
deba@623
    81
      MESSAGE_NORMAL,
kpeter@631
    82
      /// Verbose output.
deba@623
    83
      MESSAGE_VERBOSE
deba@623
    84
    };
deba@623
    85
    
deba@623
    86
deba@481
    87
    ///The floating point type used by the solver
deba@481
    88
    typedef double Value;
deba@481
    89
    ///The infinity constant
deba@481
    90
    static const Value INF;
deba@481
    91
    ///The not a number constant
deba@481
    92
    static const Value NaN;
deba@481
    93
deba@481
    94
    friend class Col;
deba@481
    95
    friend class ColIt;
deba@481
    96
    friend class Row;
deba@482
    97
    friend class RowIt;
deba@481
    98
deba@481
    99
    ///Refer to a column of the LP.
deba@481
   100
deba@481
   101
    ///This type is used to refer to a column of the LP.
deba@481
   102
    ///
deba@481
   103
    ///Its value remains valid and correct even after the addition or erase of
deba@481
   104
    ///other columns.
deba@481
   105
    ///
deba@482
   106
    ///\note This class is similar to other Item types in LEMON, like
deba@482
   107
    ///Node and Arc types in digraph.
deba@481
   108
    class Col {
deba@482
   109
      friend class LpBase;
deba@481
   110
    protected:
deba@482
   111
      int _id;
deba@482
   112
      explicit Col(int id) : _id(id) {}
deba@481
   113
    public:
deba@481
   114
      typedef Value ExprValue;
deba@482
   115
      typedef True LpCol;
deba@482
   116
      /// Default constructor
deba@482
   117
      
deba@482
   118
      /// \warning The default constructor sets the Col to an
deba@482
   119
      /// undefined value.
deba@481
   120
      Col() {}
deba@482
   121
      /// Invalid constructor \& conversion.
deba@482
   122
      
deba@482
   123
      /// This constructor initializes the Col to be invalid.
deba@482
   124
      /// \sa Invalid for more details.      
deba@482
   125
      Col(const Invalid&) : _id(-1) {}
deba@482
   126
      /// Equality operator
deba@482
   127
deba@482
   128
      /// Two \ref Col "Col"s are equal if and only if they point to
deba@482
   129
      /// the same LP column or both are invalid.
deba@482
   130
      bool operator==(Col c) const  {return _id == c._id;}
deba@482
   131
      /// Inequality operator
deba@482
   132
deba@482
   133
      /// \sa operator==(Col c)
deba@482
   134
      ///
deba@482
   135
      bool operator!=(Col c) const  {return _id != c._id;}
deba@482
   136
      /// Artificial ordering operator.
deba@482
   137
deba@482
   138
      /// To allow the use of this object in std::map or similar
deba@482
   139
      /// associative container we require this.
deba@482
   140
      ///
deba@482
   141
      /// \note This operator only have to define some strict ordering of
deba@482
   142
      /// the items; this order has nothing to do with the iteration
deba@482
   143
      /// ordering of the items.
deba@482
   144
      bool operator<(Col c) const  {return _id < c._id;}
deba@481
   145
    };
deba@481
   146
deba@482
   147
    ///Iterator for iterate over the columns of an LP problem
deba@482
   148
deba@482
   149
    /// Its usage is quite simple, for example you can count the number
deba@482
   150
    /// of columns in an LP \c lp:
deba@482
   151
    ///\code
deba@482
   152
    /// int count=0;
deba@482
   153
    /// for (LpBase::ColIt c(lp); c!=INVALID; ++c) ++count;
deba@482
   154
    ///\endcode
deba@481
   155
    class ColIt : public Col {
deba@482
   156
      const LpBase *_solver;
deba@481
   157
    public:
deba@482
   158
      /// Default constructor
deba@482
   159
      
deba@482
   160
      /// \warning The default constructor sets the iterator
deba@482
   161
      /// to an undefined value.
deba@481
   162
      ColIt() {}
deba@482
   163
      /// Sets the iterator to the first Col
deba@482
   164
      
deba@482
   165
      /// Sets the iterator to the first Col.
deba@482
   166
      ///
deba@482
   167
      ColIt(const LpBase &solver) : _solver(&solver)
deba@481
   168
      {
deba@482
   169
        _solver->cols.firstItem(_id);
deba@481
   170
      }
deba@482
   171
      /// Invalid constructor \& conversion
deba@482
   172
      
deba@482
   173
      /// Initialize the iterator to be invalid.
deba@482
   174
      /// \sa Invalid for more details.
deba@481
   175
      ColIt(const Invalid&) : Col(INVALID) {}
deba@482
   176
      /// Next column
deba@482
   177
      
deba@482
   178
      /// Assign the iterator to the next column.
deba@482
   179
      ///
deba@481
   180
      ColIt &operator++()
deba@481
   181
      {
deba@482
   182
        _solver->cols.nextItem(_id);
deba@481
   183
        return *this;
deba@481
   184
      }
deba@481
   185
    };
deba@481
   186
deba@482
   187
    /// \brief Returns the ID of the column.
deba@482
   188
    static int id(const Col& col) { return col._id; }
deba@482
   189
    /// \brief Returns the column with the given ID.
deba@482
   190
    ///
deba@482
   191
    /// \pre The argument should be a valid column ID in the LP problem.
deba@482
   192
    static Col colFromId(int id) { return Col(id); }
deba@481
   193
deba@481
   194
    ///Refer to a row of the LP.
deba@481
   195
deba@481
   196
    ///This type is used to refer to a row of the LP.
deba@481
   197
    ///
deba@481
   198
    ///Its value remains valid and correct even after the addition or erase of
deba@481
   199
    ///other rows.
deba@481
   200
    ///
deba@482
   201
    ///\note This class is similar to other Item types in LEMON, like
deba@482
   202
    ///Node and Arc types in digraph.
deba@481
   203
    class Row {
deba@482
   204
      friend class LpBase;
deba@481
   205
    protected:
deba@482
   206
      int _id;
deba@482
   207
      explicit Row(int id) : _id(id) {}
deba@481
   208
    public:
deba@481
   209
      typedef Value ExprValue;
deba@482
   210
      typedef True LpRow;
deba@482
   211
      /// Default constructor
deba@482
   212
      
deba@482
   213
      /// \warning The default constructor sets the Row to an
deba@482
   214
      /// undefined value.
deba@481
   215
      Row() {}
deba@482
   216
      /// Invalid constructor \& conversion.
deba@482
   217
      
deba@482
   218
      /// This constructor initializes the Row to be invalid.
deba@482
   219
      /// \sa Invalid for more details.      
deba@482
   220
      Row(const Invalid&) : _id(-1) {}
deba@482
   221
      /// Equality operator
deba@481
   222
deba@482
   223
      /// Two \ref Row "Row"s are equal if and only if they point to
deba@482
   224
      /// the same LP row or both are invalid.
deba@482
   225
      bool operator==(Row r) const  {return _id == r._id;}
deba@482
   226
      /// Inequality operator
deba@482
   227
      
deba@482
   228
      /// \sa operator==(Row r)
deba@482
   229
      ///
deba@482
   230
      bool operator!=(Row r) const  {return _id != r._id;}
deba@482
   231
      /// Artificial ordering operator.
deba@482
   232
deba@482
   233
      /// To allow the use of this object in std::map or similar
deba@482
   234
      /// associative container we require this.
deba@482
   235
      ///
deba@482
   236
      /// \note This operator only have to define some strict ordering of
deba@482
   237
      /// the items; this order has nothing to do with the iteration
deba@482
   238
      /// ordering of the items.
deba@482
   239
      bool operator<(Row r) const  {return _id < r._id;}
deba@481
   240
    };
deba@481
   241
deba@482
   242
    ///Iterator for iterate over the rows of an LP problem
deba@482
   243
deba@482
   244
    /// Its usage is quite simple, for example you can count the number
deba@482
   245
    /// of rows in an LP \c lp:
deba@482
   246
    ///\code
deba@482
   247
    /// int count=0;
deba@482
   248
    /// for (LpBase::RowIt c(lp); c!=INVALID; ++c) ++count;
deba@482
   249
    ///\endcode
deba@481
   250
    class RowIt : public Row {
deba@482
   251
      const LpBase *_solver;
deba@481
   252
    public:
deba@482
   253
      /// Default constructor
deba@482
   254
      
deba@482
   255
      /// \warning The default constructor sets the iterator
deba@482
   256
      /// to an undefined value.
deba@481
   257
      RowIt() {}
deba@482
   258
      /// Sets the iterator to the first Row
deba@482
   259
      
deba@482
   260
      /// Sets the iterator to the first Row.
deba@482
   261
      ///
deba@482
   262
      RowIt(const LpBase &solver) : _solver(&solver)
deba@481
   263
      {
deba@482
   264
        _solver->rows.firstItem(_id);
deba@481
   265
      }
deba@482
   266
      /// Invalid constructor \& conversion
deba@482
   267
      
deba@482
   268
      /// Initialize the iterator to be invalid.
deba@482
   269
      /// \sa Invalid for more details.
deba@481
   270
      RowIt(const Invalid&) : Row(INVALID) {}
deba@482
   271
      /// Next row
deba@482
   272
      
deba@482
   273
      /// Assign the iterator to the next row.
deba@482
   274
      ///
deba@481
   275
      RowIt &operator++()
deba@481
   276
      {
deba@482
   277
        _solver->rows.nextItem(_id);
deba@481
   278
        return *this;
deba@481
   279
      }
deba@481
   280
    };
deba@481
   281
deba@482
   282
    /// \brief Returns the ID of the row.
deba@482
   283
    static int id(const Row& row) { return row._id; }
deba@482
   284
    /// \brief Returns the row with the given ID.
deba@482
   285
    ///
deba@482
   286
    /// \pre The argument should be a valid row ID in the LP problem.
deba@482
   287
    static Row rowFromId(int id) { return Row(id); }
deba@481
   288
deba@481
   289
  public:
deba@481
   290
deba@481
   291
    ///Linear expression of variables and a constant component
deba@481
   292
deba@481
   293
    ///This data structure stores a linear expression of the variables
deba@481
   294
    ///(\ref Col "Col"s) and also has a constant component.
deba@481
   295
    ///
deba@481
   296
    ///There are several ways to access and modify the contents of this
deba@481
   297
    ///container.
deba@481
   298
    ///\code
deba@481
   299
    ///e[v]=5;
deba@481
   300
    ///e[v]+=12;
deba@481
   301
    ///e.erase(v);
deba@481
   302
    ///\endcode
deba@481
   303
    ///or you can also iterate through its elements.
deba@481
   304
    ///\code
deba@481
   305
    ///double s=0;
deba@482
   306
    ///for(LpBase::Expr::ConstCoeffIt i(e);i!=INVALID;++i)
deba@482
   307
    ///  s+=*i * primal(i);
deba@481
   308
    ///\endcode
deba@482
   309
    ///(This code computes the primal value of the expression).
deba@481
   310
    ///- Numbers (<tt>double</tt>'s)
deba@481
   311
    ///and variables (\ref Col "Col"s) directly convert to an
deba@481
   312
    ///\ref Expr and the usual linear operations are defined, so
deba@481
   313
    ///\code
deba@481
   314
    ///v+w
deba@481
   315
    ///2*v-3.12*(v-w/2)+2
deba@481
   316
    ///v*2.1+(3*v+(v*12+w+6)*3)/2
deba@481
   317
    ///\endcode
deba@482
   318
    ///are valid expressions.
deba@481
   319
    ///The usual assignment operations are also defined.
deba@481
   320
    ///\code
deba@481
   321
    ///e=v+w;
deba@481
   322
    ///e+=2*v-3.12*(v-w/2)+2;
deba@481
   323
    ///e*=3.4;
deba@481
   324
    ///e/=5;
deba@481
   325
    ///\endcode
deba@482
   326
    ///- The constant member can be set and read by dereference
deba@482
   327
    ///  operator (unary *)
deba@482
   328
    ///
deba@481
   329
    ///\code
deba@482
   330
    ///*e=12;
deba@482
   331
    ///double c=*e;
deba@481
   332
    ///\endcode
deba@481
   333
    ///
deba@481
   334
    ///\sa Constr
deba@482
   335
    class Expr {
deba@482
   336
      friend class LpBase;
deba@481
   337
    public:
deba@482
   338
      /// The key type of the expression
deba@482
   339
      typedef LpBase::Col Key;
deba@482
   340
      /// The value type of the expression
deba@482
   341
      typedef LpBase::Value Value;
deba@481
   342
deba@481
   343
    protected:
deba@482
   344
      Value const_comp;
deba@482
   345
      std::map<int, Value> comps;
deba@481
   346
deba@481
   347
    public:
deba@482
   348
      typedef True SolverExpr;
deba@482
   349
      /// Default constructor
deba@482
   350
      
deba@482
   351
      /// Construct an empty expression, the coefficients and
deba@482
   352
      /// the constant component are initialized to zero.
deba@482
   353
      Expr() : const_comp(0) {}
deba@482
   354
      /// Construct an expression from a column
deba@482
   355
deba@482
   356
      /// Construct an expression, which has a term with \c c variable
deba@482
   357
      /// and 1.0 coefficient.
deba@482
   358
      Expr(const Col &c) : const_comp(0) {
deba@482
   359
        typedef std::map<int, Value>::value_type pair_type;
deba@482
   360
        comps.insert(pair_type(id(c), 1));
deba@481
   361
      }
deba@482
   362
      /// Construct an expression from a constant
deba@482
   363
deba@482
   364
      /// Construct an expression, which's constant component is \c v.
deba@482
   365
      ///
deba@481
   366
      Expr(const Value &v) : const_comp(v) {}
deba@482
   367
      /// Returns the coefficient of the column
deba@482
   368
      Value operator[](const Col& c) const {
deba@482
   369
        std::map<int, Value>::const_iterator it=comps.find(id(c));
deba@482
   370
        if (it != comps.end()) {
deba@482
   371
          return it->second;
deba@482
   372
        } else {
deba@482
   373
          return 0;
deba@481
   374
        }
deba@481
   375
      }
deba@482
   376
      /// Returns the coefficient of the column
deba@482
   377
      Value& operator[](const Col& c) {
deba@482
   378
        return comps[id(c)];
deba@482
   379
      }
deba@482
   380
      /// Sets the coefficient of the column
deba@482
   381
      void set(const Col &c, const Value &v) {
deba@482
   382
        if (v != 0.0) {
deba@482
   383
          typedef std::map<int, Value>::value_type pair_type;
deba@482
   384
          comps.insert(pair_type(id(c), v));
deba@482
   385
        } else {
deba@482
   386
          comps.erase(id(c));
deba@482
   387
        }
deba@482
   388
      }
deba@482
   389
      /// Returns the constant component of the expression
deba@482
   390
      Value& operator*() { return const_comp; }
deba@482
   391
      /// Returns the constant component of the expression
deba@482
   392
      const Value& operator*() const { return const_comp; }
deba@482
   393
      /// \brief Removes the coefficients which's absolute value does
deba@482
   394
      /// not exceed \c epsilon. It also sets to zero the constant
deba@482
   395
      /// component, if it does not exceed epsilon in absolute value.
deba@482
   396
      void simplify(Value epsilon = 0.0) {
deba@482
   397
        std::map<int, Value>::iterator it=comps.begin();
deba@482
   398
        while (it != comps.end()) {
deba@482
   399
          std::map<int, Value>::iterator jt=it;
deba@482
   400
          ++jt;
deba@482
   401
          if (std::fabs((*it).second) <= epsilon) comps.erase(it);
deba@482
   402
          it=jt;
deba@482
   403
        }
deba@482
   404
        if (std::fabs(const_comp) <= epsilon) const_comp = 0;
deba@481
   405
      }
deba@481
   406
deba@482
   407
      void simplify(Value epsilon = 0.0) const {
deba@482
   408
        const_cast<Expr*>(this)->simplify(epsilon);
deba@481
   409
      }
deba@481
   410
deba@481
   411
      ///Sets all coefficients and the constant component to 0.
deba@481
   412
      void clear() {
deba@482
   413
        comps.clear();
deba@481
   414
        const_comp=0;
deba@481
   415
      }
deba@481
   416
deba@482
   417
      ///Compound assignment
deba@481
   418
      Expr &operator+=(const Expr &e) {
deba@482
   419
        for (std::map<int, Value>::const_iterator it=e.comps.begin();
deba@482
   420
             it!=e.comps.end(); ++it)
deba@482
   421
          comps[it->first]+=it->second;
deba@481
   422
        const_comp+=e.const_comp;
deba@481
   423
        return *this;
deba@481
   424
      }
deba@482
   425
      ///Compound assignment
deba@481
   426
      Expr &operator-=(const Expr &e) {
deba@482
   427
        for (std::map<int, Value>::const_iterator it=e.comps.begin();
deba@482
   428
             it!=e.comps.end(); ++it)
deba@482
   429
          comps[it->first]-=it->second;
deba@481
   430
        const_comp-=e.const_comp;
deba@481
   431
        return *this;
deba@481
   432
      }
deba@482
   433
      ///Multiply with a constant
deba@482
   434
      Expr &operator*=(const Value &v) {
deba@482
   435
        for (std::map<int, Value>::iterator it=comps.begin();
deba@482
   436
             it!=comps.end(); ++it)
deba@482
   437
          it->second*=v;
deba@482
   438
        const_comp*=v;
deba@481
   439
        return *this;
deba@481
   440
      }
deba@482
   441
      ///Division with a constant
deba@481
   442
      Expr &operator/=(const Value &c) {
deba@482
   443
        for (std::map<int, Value>::iterator it=comps.begin();
deba@482
   444
             it!=comps.end(); ++it)
deba@482
   445
          it->second/=c;
deba@481
   446
        const_comp/=c;
deba@481
   447
        return *this;
deba@481
   448
      }
deba@481
   449
deba@482
   450
      ///Iterator over the expression
deba@482
   451
      
deba@482
   452
      ///The iterator iterates over the terms of the expression. 
deba@482
   453
      /// 
deba@482
   454
      ///\code
deba@482
   455
      ///double s=0;
deba@482
   456
      ///for(LpBase::Expr::CoeffIt i(e);i!=INVALID;++i)
deba@482
   457
      ///  s+= *i * primal(i);
deba@482
   458
      ///\endcode
deba@482
   459
      class CoeffIt {
deba@482
   460
      private:
deba@482
   461
deba@482
   462
        std::map<int, Value>::iterator _it, _end;
deba@482
   463
deba@482
   464
      public:
deba@482
   465
deba@482
   466
        /// Sets the iterator to the first term
deba@482
   467
        
deba@482
   468
        /// Sets the iterator to the first term of the expression.
deba@482
   469
        ///
deba@482
   470
        CoeffIt(Expr& e)
deba@482
   471
          : _it(e.comps.begin()), _end(e.comps.end()){}
deba@482
   472
deba@482
   473
        /// Convert the iterator to the column of the term
deba@482
   474
        operator Col() const {
deba@482
   475
          return colFromId(_it->first);
deba@482
   476
        }
deba@482
   477
deba@482
   478
        /// Returns the coefficient of the term
deba@482
   479
        Value& operator*() { return _it->second; }
deba@482
   480
deba@482
   481
        /// Returns the coefficient of the term
deba@482
   482
        const Value& operator*() const { return _it->second; }
deba@482
   483
        /// Next term
deba@482
   484
        
deba@482
   485
        /// Assign the iterator to the next term.
deba@482
   486
        ///
deba@482
   487
        CoeffIt& operator++() { ++_it; return *this; }
deba@482
   488
deba@482
   489
        /// Equality operator
deba@482
   490
        bool operator==(Invalid) const { return _it == _end; }
deba@482
   491
        /// Inequality operator
deba@482
   492
        bool operator!=(Invalid) const { return _it != _end; }
deba@482
   493
      };
deba@482
   494
deba@482
   495
      /// Const iterator over the expression
deba@482
   496
      
deba@482
   497
      ///The iterator iterates over the terms of the expression. 
deba@482
   498
      /// 
deba@482
   499
      ///\code
deba@482
   500
      ///double s=0;
deba@482
   501
      ///for(LpBase::Expr::ConstCoeffIt i(e);i!=INVALID;++i)
deba@482
   502
      ///  s+=*i * primal(i);
deba@482
   503
      ///\endcode
deba@482
   504
      class ConstCoeffIt {
deba@482
   505
      private:
deba@482
   506
deba@482
   507
        std::map<int, Value>::const_iterator _it, _end;
deba@482
   508
deba@482
   509
      public:
deba@482
   510
deba@482
   511
        /// Sets the iterator to the first term
deba@482
   512
        
deba@482
   513
        /// Sets the iterator to the first term of the expression.
deba@482
   514
        ///
deba@482
   515
        ConstCoeffIt(const Expr& e)
deba@482
   516
          : _it(e.comps.begin()), _end(e.comps.end()){}
deba@482
   517
deba@482
   518
        /// Convert the iterator to the column of the term
deba@482
   519
        operator Col() const {
deba@482
   520
          return colFromId(_it->first);
deba@482
   521
        }
deba@482
   522
deba@482
   523
        /// Returns the coefficient of the term
deba@482
   524
        const Value& operator*() const { return _it->second; }
deba@482
   525
deba@482
   526
        /// Next term
deba@482
   527
        
deba@482
   528
        /// Assign the iterator to the next term.
deba@482
   529
        ///
deba@482
   530
        ConstCoeffIt& operator++() { ++_it; return *this; }
deba@482
   531
deba@482
   532
        /// Equality operator
deba@482
   533
        bool operator==(Invalid) const { return _it == _end; }
deba@482
   534
        /// Inequality operator
deba@482
   535
        bool operator!=(Invalid) const { return _it != _end; }
deba@482
   536
      };
deba@482
   537
deba@481
   538
    };
deba@481
   539
deba@481
   540
    ///Linear constraint
deba@481
   541
deba@481
   542
    ///This data stucture represents a linear constraint in the LP.
deba@481
   543
    ///Basically it is a linear expression with a lower or an upper bound
deba@481
   544
    ///(or both). These parts of the constraint can be obtained by the member
deba@481
   545
    ///functions \ref expr(), \ref lowerBound() and \ref upperBound(),
deba@481
   546
    ///respectively.
deba@481
   547
    ///There are two ways to construct a constraint.
deba@481
   548
    ///- You can set the linear expression and the bounds directly
deba@481
   549
    ///  by the functions above.
deba@481
   550
    ///- The operators <tt>\<=</tt>, <tt>==</tt> and  <tt>\>=</tt>
deba@481
   551
    ///  are defined between expressions, or even between constraints whenever
deba@481
   552
    ///  it makes sense. Therefore if \c e and \c f are linear expressions and
deba@481
   553
    ///  \c s and \c t are numbers, then the followings are valid expressions
deba@481
   554
    ///  and thus they can be used directly e.g. in \ref addRow() whenever
deba@481
   555
    ///  it makes sense.
deba@481
   556
    ///\code
deba@481
   557
    ///  e<=s
deba@481
   558
    ///  e<=f
deba@481
   559
    ///  e==f
deba@481
   560
    ///  s<=e<=t
deba@481
   561
    ///  e>=t
deba@481
   562
    ///\endcode
deba@482
   563
    ///\warning The validity of a constraint is checked only at run
deba@482
   564
    ///time, so e.g. \ref addRow(<tt>x[1]\<=x[2]<=5</tt>) will
deba@482
   565
    ///compile, but will fail an assertion.
deba@481
   566
    class Constr
deba@481
   567
    {
deba@481
   568
    public:
deba@482
   569
      typedef LpBase::Expr Expr;
deba@481
   570
      typedef Expr::Key Key;
deba@481
   571
      typedef Expr::Value Value;
deba@481
   572
deba@481
   573
    protected:
deba@481
   574
      Expr _expr;
deba@481
   575
      Value _lb,_ub;
deba@481
   576
    public:
deba@481
   577
      ///\e
deba@481
   578
      Constr() : _expr(), _lb(NaN), _ub(NaN) {}
deba@481
   579
      ///\e
deba@482
   580
      Constr(Value lb, const Expr &e, Value ub) :
deba@481
   581
        _expr(e), _lb(lb), _ub(ub) {}
deba@481
   582
      Constr(const Expr &e) :
deba@481
   583
        _expr(e), _lb(NaN), _ub(NaN) {}
deba@481
   584
      ///\e
deba@481
   585
      void clear()
deba@481
   586
      {
deba@481
   587
        _expr.clear();
deba@481
   588
        _lb=_ub=NaN;
deba@481
   589
      }
deba@481
   590
deba@481
   591
      ///Reference to the linear expression
deba@481
   592
      Expr &expr() { return _expr; }
deba@481
   593
      ///Cont reference to the linear expression
deba@481
   594
      const Expr &expr() const { return _expr; }
deba@481
   595
      ///Reference to the lower bound.
deba@481
   596
deba@481
   597
      ///\return
deba@481
   598
      ///- \ref INF "INF": the constraint is lower unbounded.
deba@481
   599
      ///- \ref NaN "NaN": lower bound has not been set.
deba@481
   600
      ///- finite number: the lower bound
deba@481
   601
      Value &lowerBound() { return _lb; }
deba@481
   602
      ///The const version of \ref lowerBound()
deba@481
   603
      const Value &lowerBound() const { return _lb; }
deba@481
   604
      ///Reference to the upper bound.
deba@481
   605
deba@481
   606
      ///\return
deba@481
   607
      ///- \ref INF "INF": the constraint is upper unbounded.
deba@481
   608
      ///- \ref NaN "NaN": upper bound has not been set.
deba@481
   609
      ///- finite number: the upper bound
deba@481
   610
      Value &upperBound() { return _ub; }
deba@481
   611
      ///The const version of \ref upperBound()
deba@481
   612
      const Value &upperBound() const { return _ub; }
deba@481
   613
      ///Is the constraint lower bounded?
deba@481
   614
      bool lowerBounded() const {
alpar@558
   615
        return _lb != -INF && !isNaN(_lb);
deba@481
   616
      }
deba@481
   617
      ///Is the constraint upper bounded?
deba@481
   618
      bool upperBounded() const {
alpar@558
   619
        return _ub != INF && !isNaN(_ub);
deba@481
   620
      }
deba@481
   621
deba@481
   622
    };
deba@481
   623
deba@481
   624
    ///Linear expression of rows
deba@481
   625
deba@481
   626
    ///This data structure represents a column of the matrix,
deba@481
   627
    ///thas is it strores a linear expression of the dual variables
deba@481
   628
    ///(\ref Row "Row"s).
deba@481
   629
    ///
deba@481
   630
    ///There are several ways to access and modify the contents of this
deba@481
   631
    ///container.
deba@481
   632
    ///\code
deba@481
   633
    ///e[v]=5;
deba@481
   634
    ///e[v]+=12;
deba@481
   635
    ///e.erase(v);
deba@481
   636
    ///\endcode
deba@481
   637
    ///or you can also iterate through its elements.
deba@481
   638
    ///\code
deba@481
   639
    ///double s=0;
deba@482
   640
    ///for(LpBase::DualExpr::ConstCoeffIt i(e);i!=INVALID;++i)
deba@482
   641
    ///  s+=*i;
deba@481
   642
    ///\endcode
deba@481
   643
    ///(This code computes the sum of all coefficients).
deba@481
   644
    ///- Numbers (<tt>double</tt>'s)
deba@481
   645
    ///and variables (\ref Row "Row"s) directly convert to an
deba@481
   646
    ///\ref DualExpr and the usual linear operations are defined, so
deba@481
   647
    ///\code
deba@481
   648
    ///v+w
deba@481
   649
    ///2*v-3.12*(v-w/2)
deba@481
   650
    ///v*2.1+(3*v+(v*12+w)*3)/2
deba@481
   651
    ///\endcode
deba@482
   652
    ///are valid \ref DualExpr dual expressions.
deba@481
   653
    ///The usual assignment operations are also defined.
deba@481
   654
    ///\code
deba@481
   655
    ///e=v+w;
deba@481
   656
    ///e+=2*v-3.12*(v-w/2);
deba@481
   657
    ///e*=3.4;
deba@481
   658
    ///e/=5;
deba@481
   659
    ///\endcode
deba@481
   660
    ///
deba@481
   661
    ///\sa Expr
deba@482
   662
    class DualExpr {
deba@482
   663
      friend class LpBase;
deba@481
   664
    public:
deba@482
   665
      /// The key type of the expression
deba@482
   666
      typedef LpBase::Row Key;
deba@482
   667
      /// The value type of the expression
deba@482
   668
      typedef LpBase::Value Value;
deba@481
   669
deba@481
   670
    protected:
deba@482
   671
      std::map<int, Value> comps;
deba@481
   672
deba@481
   673
    public:
deba@482
   674
      typedef True SolverExpr;
deba@482
   675
      /// Default constructor
deba@482
   676
      
deba@482
   677
      /// Construct an empty expression, the coefficients are
deba@482
   678
      /// initialized to zero.
deba@482
   679
      DualExpr() {}
deba@482
   680
      /// Construct an expression from a row
deba@482
   681
deba@482
   682
      /// Construct an expression, which has a term with \c r dual
deba@482
   683
      /// variable and 1.0 coefficient.
deba@482
   684
      DualExpr(const Row &r) {
deba@482
   685
        typedef std::map<int, Value>::value_type pair_type;
deba@482
   686
        comps.insert(pair_type(id(r), 1));
deba@481
   687
      }
deba@482
   688
      /// Returns the coefficient of the row
deba@482
   689
      Value operator[](const Row& r) const {
deba@482
   690
        std::map<int, Value>::const_iterator it = comps.find(id(r));
deba@482
   691
        if (it != comps.end()) {
deba@482
   692
          return it->second;
deba@482
   693
        } else {
deba@482
   694
          return 0;
deba@482
   695
        }
deba@481
   696
      }
deba@482
   697
      /// Returns the coefficient of the row
deba@482
   698
      Value& operator[](const Row& r) {
deba@482
   699
        return comps[id(r)];
deba@482
   700
      }
deba@482
   701
      /// Sets the coefficient of the row
deba@482
   702
      void set(const Row &r, const Value &v) {
deba@482
   703
        if (v != 0.0) {
deba@482
   704
          typedef std::map<int, Value>::value_type pair_type;
deba@482
   705
          comps.insert(pair_type(id(r), v));
deba@482
   706
        } else {
deba@482
   707
          comps.erase(id(r));
deba@482
   708
        }
deba@482
   709
      }
deba@482
   710
      /// \brief Removes the coefficients which's absolute value does
deba@482
   711
      /// not exceed \c epsilon. 
deba@482
   712
      void simplify(Value epsilon = 0.0) {
deba@482
   713
        std::map<int, Value>::iterator it=comps.begin();
deba@482
   714
        while (it != comps.end()) {
deba@482
   715
          std::map<int, Value>::iterator jt=it;
deba@482
   716
          ++jt;
deba@482
   717
          if (std::fabs((*it).second) <= epsilon) comps.erase(it);
deba@482
   718
          it=jt;
deba@481
   719
        }
deba@481
   720
      }
deba@481
   721
deba@482
   722
      void simplify(Value epsilon = 0.0) const {
deba@482
   723
        const_cast<DualExpr*>(this)->simplify(epsilon);
deba@481
   724
      }
deba@481
   725
deba@481
   726
      ///Sets all coefficients to 0.
deba@481
   727
      void clear() {
deba@482
   728
        comps.clear();
deba@482
   729
      }
deba@482
   730
      ///Compound assignment
deba@482
   731
      DualExpr &operator+=(const DualExpr &e) {
deba@482
   732
        for (std::map<int, Value>::const_iterator it=e.comps.begin();
deba@482
   733
             it!=e.comps.end(); ++it)
deba@482
   734
          comps[it->first]+=it->second;
deba@482
   735
        return *this;
deba@482
   736
      }
deba@482
   737
      ///Compound assignment
deba@482
   738
      DualExpr &operator-=(const DualExpr &e) {
deba@482
   739
        for (std::map<int, Value>::const_iterator it=e.comps.begin();
deba@482
   740
             it!=e.comps.end(); ++it)
deba@482
   741
          comps[it->first]-=it->second;
deba@482
   742
        return *this;
deba@482
   743
      }
deba@482
   744
      ///Multiply with a constant
deba@482
   745
      DualExpr &operator*=(const Value &v) {
deba@482
   746
        for (std::map<int, Value>::iterator it=comps.begin();
deba@482
   747
             it!=comps.end(); ++it)
deba@482
   748
          it->second*=v;
deba@482
   749
        return *this;
deba@482
   750
      }
deba@482
   751
      ///Division with a constant
deba@482
   752
      DualExpr &operator/=(const Value &v) {
deba@482
   753
        for (std::map<int, Value>::iterator it=comps.begin();
deba@482
   754
             it!=comps.end(); ++it)
deba@482
   755
          it->second/=v;
deba@482
   756
        return *this;
deba@481
   757
      }
deba@481
   758
deba@482
   759
      ///Iterator over the expression
deba@482
   760
      
deba@482
   761
      ///The iterator iterates over the terms of the expression. 
deba@482
   762
      /// 
deba@482
   763
      ///\code
deba@482
   764
      ///double s=0;
deba@482
   765
      ///for(LpBase::DualExpr::CoeffIt i(e);i!=INVALID;++i)
deba@482
   766
      ///  s+= *i * dual(i);
deba@482
   767
      ///\endcode
deba@482
   768
      class CoeffIt {
deba@482
   769
      private:
deba@482
   770
deba@482
   771
        std::map<int, Value>::iterator _it, _end;
deba@482
   772
deba@482
   773
      public:
deba@482
   774
deba@482
   775
        /// Sets the iterator to the first term
deba@482
   776
        
deba@482
   777
        /// Sets the iterator to the first term of the expression.
deba@482
   778
        ///
deba@482
   779
        CoeffIt(DualExpr& e)
deba@482
   780
          : _it(e.comps.begin()), _end(e.comps.end()){}
deba@482
   781
deba@482
   782
        /// Convert the iterator to the row of the term
deba@482
   783
        operator Row() const {
deba@482
   784
          return rowFromId(_it->first);
deba@482
   785
        }
deba@482
   786
deba@482
   787
        /// Returns the coefficient of the term
deba@482
   788
        Value& operator*() { return _it->second; }
deba@482
   789
deba@482
   790
        /// Returns the coefficient of the term
deba@482
   791
        const Value& operator*() const { return _it->second; }
deba@482
   792
deba@482
   793
        /// Next term
deba@482
   794
        
deba@482
   795
        /// Assign the iterator to the next term.
deba@482
   796
        ///
deba@482
   797
        CoeffIt& operator++() { ++_it; return *this; }
deba@482
   798
deba@482
   799
        /// Equality operator
deba@482
   800
        bool operator==(Invalid) const { return _it == _end; }
deba@482
   801
        /// Inequality operator
deba@482
   802
        bool operator!=(Invalid) const { return _it != _end; }
deba@482
   803
      };
deba@482
   804
deba@482
   805
      ///Iterator over the expression
deba@482
   806
      
deba@482
   807
      ///The iterator iterates over the terms of the expression. 
deba@482
   808
      /// 
deba@482
   809
      ///\code
deba@482
   810
      ///double s=0;
deba@482
   811
      ///for(LpBase::DualExpr::ConstCoeffIt i(e);i!=INVALID;++i)
deba@482
   812
      ///  s+= *i * dual(i);
deba@482
   813
      ///\endcode
deba@482
   814
      class ConstCoeffIt {
deba@482
   815
      private:
deba@482
   816
deba@482
   817
        std::map<int, Value>::const_iterator _it, _end;
deba@482
   818
deba@482
   819
      public:
deba@482
   820
deba@482
   821
        /// Sets the iterator to the first term
deba@482
   822
        
deba@482
   823
        /// Sets the iterator to the first term of the expression.
deba@482
   824
        ///
deba@482
   825
        ConstCoeffIt(const DualExpr& e)
deba@482
   826
          : _it(e.comps.begin()), _end(e.comps.end()){}
deba@482
   827
deba@482
   828
        /// Convert the iterator to the row of the term
deba@482
   829
        operator Row() const {
deba@482
   830
          return rowFromId(_it->first);
deba@482
   831
        }
deba@482
   832
deba@482
   833
        /// Returns the coefficient of the term
deba@482
   834
        const Value& operator*() const { return _it->second; }
deba@482
   835
deba@482
   836
        /// Next term
deba@482
   837
        
deba@482
   838
        /// Assign the iterator to the next term.
deba@482
   839
        ///
deba@482
   840
        ConstCoeffIt& operator++() { ++_it; return *this; }
deba@482
   841
deba@482
   842
        /// Equality operator
deba@482
   843
        bool operator==(Invalid) const { return _it == _end; }
deba@482
   844
        /// Inequality operator
deba@482
   845
        bool operator!=(Invalid) const { return _it != _end; }
deba@482
   846
      };
deba@481
   847
    };
deba@481
   848
deba@481
   849
deba@482
   850
  protected:
deba@481
   851
deba@482
   852
    class InsertIterator {
deba@482
   853
    private:
deba@482
   854
deba@482
   855
      std::map<int, Value>& _host;
deba@482
   856
      const _solver_bits::VarIndex& _index;
deba@482
   857
deba@481
   858
    public:
deba@481
   859
deba@481
   860
      typedef std::output_iterator_tag iterator_category;
deba@481
   861
      typedef void difference_type;
deba@481
   862
      typedef void value_type;
deba@481
   863
      typedef void reference;
deba@481
   864
      typedef void pointer;
deba@481
   865
deba@482
   866
      InsertIterator(std::map<int, Value>& host,
deba@482
   867
                   const _solver_bits::VarIndex& index)
deba@482
   868
        : _host(host), _index(index) {}
deba@481
   869
deba@482
   870
      InsertIterator& operator=(const std::pair<int, Value>& value) {
deba@482
   871
        typedef std::map<int, Value>::value_type pair_type;
deba@482
   872
        _host.insert(pair_type(_index[value.first], value.second));
deba@481
   873
        return *this;
deba@481
   874
      }
deba@481
   875
deba@482
   876
      InsertIterator& operator*() { return *this; }
deba@482
   877
      InsertIterator& operator++() { return *this; }
deba@482
   878
      InsertIterator operator++(int) { return *this; }
deba@481
   879
deba@481
   880
    };
deba@481
   881
deba@482
   882
    class ExprIterator {
deba@482
   883
    private:
deba@482
   884
      std::map<int, Value>::const_iterator _host_it;
deba@482
   885
      const _solver_bits::VarIndex& _index;
deba@481
   886
    public:
deba@481
   887
deba@482
   888
      typedef std::bidirectional_iterator_tag iterator_category;
deba@482
   889
      typedef std::ptrdiff_t difference_type;
deba@481
   890
      typedef const std::pair<int, Value> value_type;
deba@481
   891
      typedef value_type reference;
deba@482
   892
deba@481
   893
      class pointer {
deba@481
   894
      public:
deba@481
   895
        pointer(value_type& _value) : value(_value) {}
deba@481
   896
        value_type* operator->() { return &value; }
deba@481
   897
      private:
deba@481
   898
        value_type value;
deba@481
   899
      };
deba@481
   900
deba@482
   901
      ExprIterator(const std::map<int, Value>::const_iterator& host_it,
deba@482
   902
                   const _solver_bits::VarIndex& index)
deba@482
   903
        : _host_it(host_it), _index(index) {}
deba@481
   904
deba@481
   905
      reference operator*() {
deba@482
   906
        return std::make_pair(_index(_host_it->first), _host_it->second);
deba@481
   907
      }
deba@481
   908
deba@481
   909
      pointer operator->() {
deba@481
   910
        return pointer(operator*());
deba@481
   911
      }
deba@481
   912
deba@482
   913
      ExprIterator& operator++() { ++_host_it; return *this; }
deba@482
   914
      ExprIterator operator++(int) {
deba@482
   915
        ExprIterator tmp(*this); ++_host_it; return tmp;
deba@481
   916
      }
deba@481
   917
deba@482
   918
      ExprIterator& operator--() { --_host_it; return *this; }
deba@482
   919
      ExprIterator operator--(int) {
deba@482
   920
        ExprIterator tmp(*this); --_host_it; return tmp;
deba@481
   921
      }
deba@481
   922
deba@482
   923
      bool operator==(const ExprIterator& it) const {
deba@482
   924
        return _host_it == it._host_it;
deba@481
   925
      }
deba@481
   926
deba@482
   927
      bool operator!=(const ExprIterator& it) const {
deba@482
   928
        return _host_it != it._host_it;
deba@481
   929
      }
deba@481
   930
deba@481
   931
    };
deba@481
   932
deba@481
   933
  protected:
deba@481
   934
deba@482
   935
    //Abstract virtual functions
deba@481
   936
deba@482
   937
    virtual int _addColId(int col) { return cols.addIndex(col); }
deba@482
   938
    virtual int _addRowId(int row) { return rows.addIndex(row); }
deba@481
   939
deba@482
   940
    virtual void _eraseColId(int col) { cols.eraseIndex(col); }
deba@482
   941
    virtual void _eraseRowId(int row) { rows.eraseIndex(row); }
deba@481
   942
deba@481
   943
    virtual int _addCol() = 0;
deba@481
   944
    virtual int _addRow() = 0;
deba@481
   945
deba@481
   946
    virtual void _eraseCol(int col) = 0;
deba@481
   947
    virtual void _eraseRow(int row) = 0;
deba@481
   948
deba@482
   949
    virtual void _getColName(int col, std::string& name) const = 0;
deba@482
   950
    virtual void _setColName(int col, const std::string& name) = 0;
deba@481
   951
    virtual int _colByName(const std::string& name) const = 0;
deba@481
   952
deba@482
   953
    virtual void _getRowName(int row, std::string& name) const = 0;
deba@482
   954
    virtual void _setRowName(int row, const std::string& name) = 0;
deba@482
   955
    virtual int _rowByName(const std::string& name) const = 0;
deba@482
   956
deba@482
   957
    virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e) = 0;
deba@482
   958
    virtual void _getRowCoeffs(int i, InsertIterator b) const = 0;
deba@482
   959
deba@482
   960
    virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e) = 0;
deba@482
   961
    virtual void _getColCoeffs(int i, InsertIterator b) const = 0;
deba@482
   962
deba@481
   963
    virtual void _setCoeff(int row, int col, Value value) = 0;
deba@481
   964
    virtual Value _getCoeff(int row, int col) const = 0;
deba@482
   965
deba@481
   966
    virtual void _setColLowerBound(int i, Value value) = 0;
deba@481
   967
    virtual Value _getColLowerBound(int i) const = 0;
deba@482
   968
deba@481
   969
    virtual void _setColUpperBound(int i, Value value) = 0;
deba@481
   970
    virtual Value _getColUpperBound(int i) const = 0;
deba@482
   971
deba@482
   972
    virtual void _setRowLowerBound(int i, Value value) = 0;
deba@482
   973
    virtual Value _getRowLowerBound(int i) const = 0;
deba@482
   974
deba@482
   975
    virtual void _setRowUpperBound(int i, Value value) = 0;
deba@482
   976
    virtual Value _getRowUpperBound(int i) const = 0;
deba@482
   977
deba@482
   978
    virtual void _setObjCoeffs(ExprIterator b, ExprIterator e) = 0;
deba@482
   979
    virtual void _getObjCoeffs(InsertIterator b) const = 0;
deba@481
   980
deba@481
   981
    virtual void _setObjCoeff(int i, Value obj_coef) = 0;
deba@481
   982
    virtual Value _getObjCoeff(int i) const = 0;
deba@481
   983
deba@482
   984
    virtual void _setSense(Sense) = 0;
deba@482
   985
    virtual Sense _getSense() const = 0;
deba@481
   986
deba@482
   987
    virtual void _clear() = 0;
deba@481
   988
deba@482
   989
    virtual const char* _solverName() const = 0;
deba@481
   990
deba@623
   991
    virtual void _messageLevel(MessageLevel level) = 0;
deba@623
   992
deba@481
   993
    //Own protected stuff
deba@481
   994
deba@481
   995
    //Constant component of the objective function
deba@481
   996
    Value obj_const_comp;
deba@481
   997
deba@482
   998
    LpBase() : rows(), cols(), obj_const_comp(0) {}
deba@482
   999
deba@481
  1000
  public:
deba@481
  1001
deba@482
  1002
    /// Virtual destructor
deba@482
  1003
    virtual ~LpBase() {}
deba@481
  1004
deba@482
  1005
    ///Gives back the name of the solver.
deba@482
  1006
    const char* solverName() const {return _solverName();}
deba@481
  1007
kpeter@631
  1008
    ///\name Build Up and Modify the LP
deba@481
  1009
deba@481
  1010
    ///@{
deba@481
  1011
deba@481
  1012
    ///Add a new empty column (i.e a new variable) to the LP
deba@482
  1013
    Col addCol() { Col c; c._id = _addColId(_addCol()); return c;}
deba@481
  1014
deba@482
  1015
    ///\brief Adds several new columns (i.e variables) at once
deba@481
  1016
    ///
deba@482
  1017
    ///This magic function takes a container as its argument and fills
deba@482
  1018
    ///its elements with new columns (i.e. variables)
deba@481
  1019
    ///\param t can be
deba@481
  1020
    ///- a standard STL compatible iterable container with
deba@482
  1021
    ///\ref Col as its \c values_type like
deba@481
  1022
    ///\code
deba@482
  1023
    ///std::vector<LpBase::Col>
deba@482
  1024
    ///std::list<LpBase::Col>
deba@481
  1025
    ///\endcode
deba@481
  1026
    ///- a standard STL compatible iterable container with
deba@482
  1027
    ///\ref Col as its \c mapped_type like
deba@481
  1028
    ///\code
deba@482
  1029
    ///std::map<AnyType,LpBase::Col>
deba@481
  1030
    ///\endcode
deba@481
  1031
    ///- an iterable lemon \ref concepts::WriteMap "write map" like
deba@481
  1032
    ///\code
deba@482
  1033
    ///ListGraph::NodeMap<LpBase::Col>
deba@482
  1034
    ///ListGraph::ArcMap<LpBase::Col>
deba@481
  1035
    ///\endcode
deba@481
  1036
    ///\return The number of the created column.
deba@481
  1037
#ifdef DOXYGEN
deba@481
  1038
    template<class T>
deba@481
  1039
    int addColSet(T &t) { return 0;}
deba@481
  1040
#else
deba@481
  1041
    template<class T>
deba@482
  1042
    typename enable_if<typename T::value_type::LpCol,int>::type
deba@481
  1043
    addColSet(T &t,dummy<0> = 0) {
deba@481
  1044
      int s=0;
deba@481
  1045
      for(typename T::iterator i=t.begin();i!=t.end();++i) {*i=addCol();s++;}
deba@481
  1046
      return s;
deba@481
  1047
    }
deba@481
  1048
    template<class T>
deba@482
  1049
    typename enable_if<typename T::value_type::second_type::LpCol,
deba@481
  1050
                       int>::type
deba@481
  1051
    addColSet(T &t,dummy<1> = 1) {
deba@481
  1052
      int s=0;
deba@481
  1053
      for(typename T::iterator i=t.begin();i!=t.end();++i) {
deba@481
  1054
        i->second=addCol();
deba@481
  1055
        s++;
deba@481
  1056
      }
deba@481
  1057
      return s;
deba@481
  1058
    }
deba@481
  1059
    template<class T>
deba@482
  1060
    typename enable_if<typename T::MapIt::Value::LpCol,
deba@481
  1061
                       int>::type
deba@481
  1062
    addColSet(T &t,dummy<2> = 2) {
deba@481
  1063
      int s=0;
deba@481
  1064
      for(typename T::MapIt i(t); i!=INVALID; ++i)
deba@481
  1065
        {
deba@481
  1066
          i.set(addCol());
deba@481
  1067
          s++;
deba@481
  1068
        }
deba@481
  1069
      return s;
deba@481
  1070
    }
deba@481
  1071
#endif
deba@481
  1072
deba@481
  1073
    ///Set a column (i.e a dual constraint) of the LP
deba@481
  1074
deba@481
  1075
    ///\param c is the column to be modified
deba@481
  1076
    ///\param e is a dual linear expression (see \ref DualExpr)
deba@481
  1077
    ///a better one.
deba@482
  1078
    void col(Col c, const DualExpr &e) {
deba@481
  1079
      e.simplify();
deba@494
  1080
      _setColCoeffs(cols(id(c)), ExprIterator(e.comps.begin(), rows),
deba@494
  1081
                    ExprIterator(e.comps.end(), rows));
deba@481
  1082
    }
deba@481
  1083
deba@481
  1084
    ///Get a column (i.e a dual constraint) of the LP
deba@481
  1085
deba@482
  1086
    ///\param c is the column to get
deba@481
  1087
    ///\return the dual expression associated to the column
deba@481
  1088
    DualExpr col(Col c) const {
deba@481
  1089
      DualExpr e;
deba@482
  1090
      _getColCoeffs(cols(id(c)), InsertIterator(e.comps, rows));
deba@481
  1091
      return e;
deba@481
  1092
    }
deba@481
  1093
deba@481
  1094
    ///Add a new column to the LP
deba@481
  1095
deba@481
  1096
    ///\param e is a dual linear expression (see \ref DualExpr)
deba@482
  1097
    ///\param o is the corresponding component of the objective
deba@481
  1098
    ///function. It is 0 by default.
deba@481
  1099
    ///\return The created column.
deba@481
  1100
    Col addCol(const DualExpr &e, Value o = 0) {
deba@481
  1101
      Col c=addCol();
deba@481
  1102
      col(c,e);
deba@481
  1103
      objCoeff(c,o);
deba@481
  1104
      return c;
deba@481
  1105
    }
deba@481
  1106
deba@481
  1107
    ///Add a new empty row (i.e a new constraint) to the LP
deba@481
  1108
deba@481
  1109
    ///This function adds a new empty row (i.e a new constraint) to the LP.
deba@481
  1110
    ///\return The created row
deba@482
  1111
    Row addRow() { Row r; r._id = _addRowId(_addRow()); return r;}
deba@481
  1112
deba@482
  1113
    ///\brief Add several new rows (i.e constraints) at once
deba@481
  1114
    ///
deba@482
  1115
    ///This magic function takes a container as its argument and fills
deba@482
  1116
    ///its elements with new row (i.e. variables)
deba@481
  1117
    ///\param t can be
deba@481
  1118
    ///- a standard STL compatible iterable container with
deba@482
  1119
    ///\ref Row as its \c values_type like
deba@481
  1120
    ///\code
deba@482
  1121
    ///std::vector<LpBase::Row>
deba@482
  1122
    ///std::list<LpBase::Row>
deba@481
  1123
    ///\endcode
deba@481
  1124
    ///- a standard STL compatible iterable container with
deba@482
  1125
    ///\ref Row as its \c mapped_type like
deba@481
  1126
    ///\code
deba@482
  1127
    ///std::map<AnyType,LpBase::Row>
deba@481
  1128
    ///\endcode
deba@481
  1129
    ///- an iterable lemon \ref concepts::WriteMap "write map" like
deba@481
  1130
    ///\code
deba@482
  1131
    ///ListGraph::NodeMap<LpBase::Row>
deba@482
  1132
    ///ListGraph::ArcMap<LpBase::Row>
deba@481
  1133
    ///\endcode
deba@481
  1134
    ///\return The number of rows created.
deba@481
  1135
#ifdef DOXYGEN
deba@481
  1136
    template<class T>
deba@481
  1137
    int addRowSet(T &t) { return 0;}
deba@481
  1138
#else
deba@481
  1139
    template<class T>
deba@482
  1140
    typename enable_if<typename T::value_type::LpRow,int>::type
deba@482
  1141
    addRowSet(T &t, dummy<0> = 0) {
deba@481
  1142
      int s=0;
deba@481
  1143
      for(typename T::iterator i=t.begin();i!=t.end();++i) {*i=addRow();s++;}
deba@481
  1144
      return s;
deba@481
  1145
    }
deba@481
  1146
    template<class T>
deba@482
  1147
    typename enable_if<typename T::value_type::second_type::LpRow, int>::type
deba@482
  1148
    addRowSet(T &t, dummy<1> = 1) {
deba@481
  1149
      int s=0;
deba@481
  1150
      for(typename T::iterator i=t.begin();i!=t.end();++i) {
deba@481
  1151
        i->second=addRow();
deba@481
  1152
        s++;
deba@481
  1153
      }
deba@481
  1154
      return s;
deba@481
  1155
    }
deba@481
  1156
    template<class T>
deba@482
  1157
    typename enable_if<typename T::MapIt::Value::LpRow, int>::type
deba@482
  1158
    addRowSet(T &t, dummy<2> = 2) {
deba@481
  1159
      int s=0;
deba@481
  1160
      for(typename T::MapIt i(t); i!=INVALID; ++i)
deba@481
  1161
        {
deba@481
  1162
          i.set(addRow());
deba@481
  1163
          s++;
deba@481
  1164
        }
deba@481
  1165
      return s;
deba@481
  1166
    }
deba@481
  1167
#endif
deba@481
  1168
deba@481
  1169
    ///Set a row (i.e a constraint) of the LP
deba@481
  1170
deba@481
  1171
    ///\param r is the row to be modified
deba@481
  1172
    ///\param l is lower bound (-\ref INF means no bound)
deba@481
  1173
    ///\param e is a linear expression (see \ref Expr)
deba@481
  1174
    ///\param u is the upper bound (\ref INF means no bound)
deba@481
  1175
    void row(Row r, Value l, const Expr &e, Value u) {
deba@481
  1176
      e.simplify();
deba@482
  1177
      _setRowCoeffs(rows(id(r)), ExprIterator(e.comps.begin(), cols),
deba@482
  1178
                    ExprIterator(e.comps.end(), cols));
deba@482
  1179
      _setRowLowerBound(rows(id(r)),l - *e);
deba@482
  1180
      _setRowUpperBound(rows(id(r)),u - *e);
deba@481
  1181
    }
deba@481
  1182
deba@481
  1183
    ///Set a row (i.e a constraint) of the LP
deba@481
  1184
deba@481
  1185
    ///\param r is the row to be modified
deba@481
  1186
    ///\param c is a linear expression (see \ref Constr)
deba@481
  1187
    void row(Row r, const Constr &c) {
deba@481
  1188
      row(r, c.lowerBounded()?c.lowerBound():-INF,
deba@481
  1189
          c.expr(), c.upperBounded()?c.upperBound():INF);
deba@481
  1190
    }
deba@481
  1191
deba@481
  1192
deba@481
  1193
    ///Get a row (i.e a constraint) of the LP
deba@481
  1194
deba@481
  1195
    ///\param r is the row to get
deba@481
  1196
    ///\return the expression associated to the row
deba@481
  1197
    Expr row(Row r) const {
deba@481
  1198
      Expr e;
deba@482
  1199
      _getRowCoeffs(rows(id(r)), InsertIterator(e.comps, cols));
deba@481
  1200
      return e;
deba@481
  1201
    }
deba@481
  1202
deba@481
  1203
    ///Add a new row (i.e a new constraint) to the LP
deba@481
  1204
deba@481
  1205
    ///\param l is the lower bound (-\ref INF means no bound)
deba@481
  1206
    ///\param e is a linear expression (see \ref Expr)
deba@481
  1207
    ///\param u is the upper bound (\ref INF means no bound)
deba@481
  1208
    ///\return The created row.
deba@481
  1209
    Row addRow(Value l,const Expr &e, Value u) {
deba@481
  1210
      Row r=addRow();
deba@481
  1211
      row(r,l,e,u);
deba@481
  1212
      return r;
deba@481
  1213
    }
deba@481
  1214
deba@481
  1215
    ///Add a new row (i.e a new constraint) to the LP
deba@481
  1216
deba@481
  1217
    ///\param c is a linear expression (see \ref Constr)
deba@481
  1218
    ///\return The created row.
deba@481
  1219
    Row addRow(const Constr &c) {
deba@481
  1220
      Row r=addRow();
deba@481
  1221
      row(r,c);
deba@481
  1222
      return r;
deba@481
  1223
    }
deba@482
  1224
    ///Erase a column (i.e a variable) from the LP
deba@481
  1225
deba@482
  1226
    ///\param c is the column to be deleted
deba@482
  1227
    void erase(Col c) {
deba@482
  1228
      _eraseCol(cols(id(c)));
deba@482
  1229
      _eraseColId(cols(id(c)));
deba@481
  1230
    }
deba@482
  1231
    ///Erase a row (i.e a constraint) from the LP
deba@481
  1232
deba@481
  1233
    ///\param r is the row to be deleted
deba@482
  1234
    void erase(Row r) {
deba@482
  1235
      _eraseRow(rows(id(r)));
deba@482
  1236
      _eraseRowId(rows(id(r)));
deba@481
  1237
    }
deba@481
  1238
deba@481
  1239
    /// Get the name of a column
deba@481
  1240
deba@482
  1241
    ///\param c is the coresponding column
deba@481
  1242
    ///\return The name of the colunm
deba@481
  1243
    std::string colName(Col c) const {
deba@481
  1244
      std::string name;
deba@482
  1245
      _getColName(cols(id(c)), name);
deba@481
  1246
      return name;
deba@481
  1247
    }
deba@481
  1248
deba@481
  1249
    /// Set the name of a column
deba@481
  1250
deba@482
  1251
    ///\param c is the coresponding column
deba@481
  1252
    ///\param name The name to be given
deba@481
  1253
    void colName(Col c, const std::string& name) {
deba@482
  1254
      _setColName(cols(id(c)), name);
deba@481
  1255
    }
deba@481
  1256
deba@481
  1257
    /// Get the column by its name
deba@481
  1258
deba@481
  1259
    ///\param name The name of the column
deba@481
  1260
    ///\return the proper column or \c INVALID
deba@481
  1261
    Col colByName(const std::string& name) const {
deba@481
  1262
      int k = _colByName(name);
deba@482
  1263
      return k != -1 ? Col(cols[k]) : Col(INVALID);
deba@482
  1264
    }
deba@482
  1265
deba@482
  1266
    /// Get the name of a row
deba@482
  1267
deba@482
  1268
    ///\param r is the coresponding row
deba@482
  1269
    ///\return The name of the row
deba@482
  1270
    std::string rowName(Row r) const {
deba@482
  1271
      std::string name;
deba@482
  1272
      _getRowName(rows(id(r)), name);
deba@482
  1273
      return name;
deba@482
  1274
    }
deba@482
  1275
deba@482
  1276
    /// Set the name of a row
deba@482
  1277
deba@482
  1278
    ///\param r is the coresponding row
deba@482
  1279
    ///\param name The name to be given
deba@482
  1280
    void rowName(Row r, const std::string& name) {
deba@482
  1281
      _setRowName(rows(id(r)), name);
deba@482
  1282
    }
deba@482
  1283
deba@482
  1284
    /// Get the row by its name
deba@482
  1285
deba@482
  1286
    ///\param name The name of the row
deba@482
  1287
    ///\return the proper row or \c INVALID
deba@482
  1288
    Row rowByName(const std::string& name) const {
deba@482
  1289
      int k = _rowByName(name);
deba@482
  1290
      return k != -1 ? Row(rows[k]) : Row(INVALID);
deba@481
  1291
    }
deba@481
  1292
deba@481
  1293
    /// Set an element of the coefficient matrix of the LP
deba@481
  1294
deba@481
  1295
    ///\param r is the row of the element to be modified
deba@482
  1296
    ///\param c is the column of the element to be modified
deba@481
  1297
    ///\param val is the new value of the coefficient
deba@481
  1298
    void coeff(Row r, Col c, Value val) {
deba@482
  1299
      _setCoeff(rows(id(r)),cols(id(c)), val);
deba@481
  1300
    }
deba@481
  1301
deba@481
  1302
    /// Get an element of the coefficient matrix of the LP
deba@481
  1303
deba@482
  1304
    ///\param r is the row of the element
deba@482
  1305
    ///\param c is the column of the element
deba@481
  1306
    ///\return the corresponding coefficient
deba@481
  1307
    Value coeff(Row r, Col c) const {
deba@482
  1308
      return _getCoeff(rows(id(r)),cols(id(c)));
deba@481
  1309
    }
deba@481
  1310
deba@481
  1311
    /// Set the lower bound of a column (i.e a variable)
deba@481
  1312
deba@481
  1313
    /// The lower bound of a variable (column) has to be given by an
deba@481
  1314
    /// extended number of type Value, i.e. a finite number of type
deba@481
  1315
    /// Value or -\ref INF.
deba@481
  1316
    void colLowerBound(Col c, Value value) {
deba@482
  1317
      _setColLowerBound(cols(id(c)),value);
deba@481
  1318
    }
deba@481
  1319
deba@481
  1320
    /// Get the lower bound of a column (i.e a variable)
deba@481
  1321
deba@482
  1322
    /// This function returns the lower bound for column (variable) \c c
deba@481
  1323
    /// (this might be -\ref INF as well).
deba@482
  1324
    ///\return The lower bound for column \c c
deba@481
  1325
    Value colLowerBound(Col c) const {
deba@482
  1326
      return _getColLowerBound(cols(id(c)));
deba@481
  1327
    }
deba@481
  1328
deba@481
  1329
    ///\brief Set the lower bound of  several columns
deba@482
  1330
    ///(i.e variables) at once
deba@481
  1331
    ///
deba@481
  1332
    ///This magic function takes a container as its argument
deba@481
  1333
    ///and applies the function on all of its elements.
deba@482
  1334
    ///The lower bound of a variable (column) has to be given by an
deba@482
  1335
    ///extended number of type Value, i.e. a finite number of type
deba@482
  1336
    ///Value or -\ref INF.
deba@481
  1337
#ifdef DOXYGEN
deba@481
  1338
    template<class T>
deba@481
  1339
    void colLowerBound(T &t, Value value) { return 0;}
deba@481
  1340
#else
deba@481
  1341
    template<class T>
deba@482
  1342
    typename enable_if<typename T::value_type::LpCol,void>::type
deba@481
  1343
    colLowerBound(T &t, Value value,dummy<0> = 0) {
deba@481
  1344
      for(typename T::iterator i=t.begin();i!=t.end();++i) {
deba@481
  1345
        colLowerBound(*i, value);
deba@481
  1346
      }
deba@481
  1347
    }
deba@481
  1348
    template<class T>
deba@482
  1349
    typename enable_if<typename T::value_type::second_type::LpCol,
deba@481
  1350
                       void>::type
deba@481
  1351
    colLowerBound(T &t, Value value,dummy<1> = 1) {
deba@481
  1352
      for(typename T::iterator i=t.begin();i!=t.end();++i) {
deba@481
  1353
        colLowerBound(i->second, value);
deba@481
  1354
      }
deba@481
  1355
    }
deba@481
  1356
    template<class T>
deba@482
  1357
    typename enable_if<typename T::MapIt::Value::LpCol,
deba@481
  1358
                       void>::type
deba@481
  1359
    colLowerBound(T &t, Value value,dummy<2> = 2) {
deba@481
  1360
      for(typename T::MapIt i(t); i!=INVALID; ++i){
deba@481
  1361
        colLowerBound(*i, value);
deba@481
  1362
      }
deba@481
  1363
    }
deba@481
  1364
#endif
deba@481
  1365
deba@481
  1366
    /// Set the upper bound of a column (i.e a variable)
deba@481
  1367
deba@481
  1368
    /// The upper bound of a variable (column) has to be given by an
deba@481
  1369
    /// extended number of type Value, i.e. a finite number of type
deba@481
  1370
    /// Value or \ref INF.
deba@481
  1371
    void colUpperBound(Col c, Value value) {
deba@482
  1372
      _setColUpperBound(cols(id(c)),value);
deba@481
  1373
    };
deba@481
  1374
deba@481
  1375
    /// Get the upper bound of a column (i.e a variable)
deba@481
  1376
deba@482
  1377
    /// This function returns the upper bound for column (variable) \c c
deba@481
  1378
    /// (this might be \ref INF as well).
deba@482
  1379
    /// \return The upper bound for column \c c
deba@481
  1380
    Value colUpperBound(Col c) const {
deba@482
  1381
      return _getColUpperBound(cols(id(c)));
deba@481
  1382
    }
deba@481
  1383
deba@481
  1384
    ///\brief Set the upper bound of  several columns
deba@482
  1385
    ///(i.e variables) at once
deba@481
  1386
    ///
deba@481
  1387
    ///This magic function takes a container as its argument
deba@481
  1388
    ///and applies the function on all of its elements.
deba@482
  1389
    ///The upper bound of a variable (column) has to be given by an
deba@482
  1390
    ///extended number of type Value, i.e. a finite number of type
deba@482
  1391
    ///Value or \ref INF.
deba@481
  1392
#ifdef DOXYGEN
deba@481
  1393
    template<class T>
deba@481
  1394
    void colUpperBound(T &t, Value value) { return 0;}
deba@481
  1395
#else
tapolcai@561
  1396
    template<class T1>
tapolcai@561
  1397
    typename enable_if<typename T1::value_type::LpCol,void>::type
tapolcai@561
  1398
    colUpperBound(T1 &t, Value value,dummy<0> = 0) {
tapolcai@561
  1399
      for(typename T1::iterator i=t.begin();i!=t.end();++i) {
deba@481
  1400
        colUpperBound(*i, value);
deba@481
  1401
      }
deba@481
  1402
    }
tapolcai@561
  1403
    template<class T1>
tapolcai@561
  1404
    typename enable_if<typename T1::value_type::second_type::LpCol,
deba@481
  1405
                       void>::type
tapolcai@561
  1406
    colUpperBound(T1 &t, Value value,dummy<1> = 1) {
tapolcai@561
  1407
      for(typename T1::iterator i=t.begin();i!=t.end();++i) {
deba@481
  1408
        colUpperBound(i->second, value);
deba@481
  1409
      }
deba@481
  1410
    }
tapolcai@561
  1411
    template<class T1>
tapolcai@561
  1412
    typename enable_if<typename T1::MapIt::Value::LpCol,
deba@481
  1413
                       void>::type
tapolcai@561
  1414
    colUpperBound(T1 &t, Value value,dummy<2> = 2) {
tapolcai@561
  1415
      for(typename T1::MapIt i(t); i!=INVALID; ++i){
deba@481
  1416
        colUpperBound(*i, value);
deba@481
  1417
      }
deba@481
  1418
    }
deba@481
  1419
#endif
deba@481
  1420
deba@481
  1421
    /// Set the lower and the upper bounds of a column (i.e a variable)
deba@481
  1422
deba@481
  1423
    /// The lower and the upper bounds of
deba@481
  1424
    /// a variable (column) have to be given by an
deba@481
  1425
    /// extended number of type Value, i.e. a finite number of type
deba@481
  1426
    /// Value, -\ref INF or \ref INF.
deba@481
  1427
    void colBounds(Col c, Value lower, Value upper) {
deba@482
  1428
      _setColLowerBound(cols(id(c)),lower);
deba@482
  1429
      _setColUpperBound(cols(id(c)),upper);
deba@481
  1430
    }
deba@481
  1431
deba@481
  1432
    ///\brief Set the lower and the upper bound of several columns
deba@482
  1433
    ///(i.e variables) at once
deba@481
  1434
    ///
deba@481
  1435
    ///This magic function takes a container as its argument
deba@481
  1436
    ///and applies the function on all of its elements.
deba@481
  1437
    /// The lower and the upper bounds of
deba@481
  1438
    /// a variable (column) have to be given by an
deba@481
  1439
    /// extended number of type Value, i.e. a finite number of type
deba@481
  1440
    /// Value, -\ref INF or \ref INF.
deba@481
  1441
#ifdef DOXYGEN
deba@481
  1442
    template<class T>
deba@481
  1443
    void colBounds(T &t, Value lower, Value upper) { return 0;}
deba@481
  1444
#else
tapolcai@561
  1445
    template<class T2>
tapolcai@561
  1446
    typename enable_if<typename T2::value_type::LpCol,void>::type
tapolcai@561
  1447
    colBounds(T2 &t, Value lower, Value upper,dummy<0> = 0) {
tapolcai@561
  1448
      for(typename T2::iterator i=t.begin();i!=t.end();++i) {
deba@481
  1449
        colBounds(*i, lower, upper);
deba@481
  1450
      }
deba@481
  1451
    }
tapolcai@561
  1452
    template<class T2>
tapolcai@561
  1453
    typename enable_if<typename T2::value_type::second_type::LpCol, void>::type
tapolcai@561
  1454
    colBounds(T2 &t, Value lower, Value upper,dummy<1> = 1) {
tapolcai@561
  1455
      for(typename T2::iterator i=t.begin();i!=t.end();++i) {
deba@481
  1456
        colBounds(i->second, lower, upper);
deba@481
  1457
      }
deba@481
  1458
    }
tapolcai@561
  1459
    template<class T2>
tapolcai@561
  1460
    typename enable_if<typename T2::MapIt::Value::LpCol, void>::type
tapolcai@561
  1461
    colBounds(T2 &t, Value lower, Value upper,dummy<2> = 2) {
tapolcai@561
  1462
      for(typename T2::MapIt i(t); i!=INVALID; ++i){
deba@481
  1463
        colBounds(*i, lower, upper);
deba@481
  1464
      }
deba@481
  1465
    }
deba@481
  1466
#endif
deba@481
  1467
deba@482
  1468
    /// Set the lower bound of a row (i.e a constraint)
deba@481
  1469
deba@482
  1470
    /// The lower bound of a constraint (row) has to be given by an
deba@482
  1471
    /// extended number of type Value, i.e. a finite number of type
deba@482
  1472
    /// Value or -\ref INF.
deba@482
  1473
    void rowLowerBound(Row r, Value value) {
deba@482
  1474
      _setRowLowerBound(rows(id(r)),value);
deba@481
  1475
    }
deba@481
  1476
deba@482
  1477
    /// Get the lower bound of a row (i.e a constraint)
deba@481
  1478
deba@482
  1479
    /// This function returns the lower bound for row (constraint) \c c
deba@482
  1480
    /// (this might be -\ref INF as well).
deba@482
  1481
    ///\return The lower bound for row \c r
deba@482
  1482
    Value rowLowerBound(Row r) const {
deba@482
  1483
      return _getRowLowerBound(rows(id(r)));
deba@482
  1484
    }
deba@482
  1485
deba@482
  1486
    /// Set the upper bound of a row (i.e a constraint)
deba@482
  1487
deba@482
  1488
    /// The upper bound of a constraint (row) has to be given by an
deba@482
  1489
    /// extended number of type Value, i.e. a finite number of type
deba@482
  1490
    /// Value or -\ref INF.
deba@482
  1491
    void rowUpperBound(Row r, Value value) {
deba@482
  1492
      _setRowUpperBound(rows(id(r)),value);
deba@482
  1493
    }
deba@482
  1494
deba@482
  1495
    /// Get the upper bound of a row (i.e a constraint)
deba@482
  1496
deba@482
  1497
    /// This function returns the upper bound for row (constraint) \c c
deba@482
  1498
    /// (this might be -\ref INF as well).
deba@482
  1499
    ///\return The upper bound for row \c r
deba@482
  1500
    Value rowUpperBound(Row r) const {
deba@482
  1501
      return _getRowUpperBound(rows(id(r)));
deba@481
  1502
    }
deba@481
  1503
deba@481
  1504
    ///Set an element of the objective function
deba@482
  1505
    void objCoeff(Col c, Value v) {_setObjCoeff(cols(id(c)),v); };
deba@481
  1506
deba@481
  1507
    ///Get an element of the objective function
deba@482
  1508
    Value objCoeff(Col c) const { return _getObjCoeff(cols(id(c))); };
deba@481
  1509
deba@481
  1510
    ///Set the objective function
deba@481
  1511
deba@481
  1512
    ///\param e is a linear expression of type \ref Expr.
deba@482
  1513
    ///
deba@482
  1514
    void obj(const Expr& e) {
deba@482
  1515
      _setObjCoeffs(ExprIterator(e.comps.begin(), cols),
deba@482
  1516
                    ExprIterator(e.comps.end(), cols));
deba@482
  1517
      obj_const_comp = *e;
deba@481
  1518
    }
deba@481
  1519
deba@481
  1520
    ///Get the objective function
deba@481
  1521
deba@482
  1522
    ///\return the objective function as a linear expression of type
deba@482
  1523
    ///Expr.
deba@481
  1524
    Expr obj() const {
deba@481
  1525
      Expr e;
deba@482
  1526
      _getObjCoeffs(InsertIterator(e.comps, cols));
deba@482
  1527
      *e = obj_const_comp;
deba@481
  1528
      return e;
deba@481
  1529
    }
deba@481
  1530
deba@481
  1531
deba@482
  1532
    ///Set the direction of optimization
deba@482
  1533
    void sense(Sense sense) { _setSense(sense); }
deba@481
  1534
deba@482
  1535
    ///Query the direction of the optimization
deba@482
  1536
    Sense sense() const {return _getSense(); }
deba@481
  1537
deba@482
  1538
    ///Set the sense to maximization
deba@482
  1539
    void max() { _setSense(MAX); }
deba@482
  1540
deba@482
  1541
    ///Set the sense to maximization
deba@482
  1542
    void min() { _setSense(MIN); }
deba@482
  1543
deba@482
  1544
    ///Clears the problem
deba@482
  1545
    void clear() { _clear(); }
deba@481
  1546
deba@623
  1547
    /// Sets the message level of the solver
deba@623
  1548
    void messageLevel(MessageLevel level) { _messageLevel(level); }
deba@623
  1549
deba@481
  1550
    ///@}
deba@481
  1551
deba@482
  1552
  };
deba@482
  1553
deba@482
  1554
  /// Addition
deba@482
  1555
deba@482
  1556
  ///\relates LpBase::Expr
deba@482
  1557
  ///
deba@482
  1558
  inline LpBase::Expr operator+(const LpBase::Expr &a, const LpBase::Expr &b) {
deba@482
  1559
    LpBase::Expr tmp(a);
deba@482
  1560
    tmp+=b;
deba@482
  1561
    return tmp;
deba@482
  1562
  }
deba@482
  1563
  ///Substraction
deba@482
  1564
deba@482
  1565
  ///\relates LpBase::Expr
deba@482
  1566
  ///
deba@482
  1567
  inline LpBase::Expr operator-(const LpBase::Expr &a, const LpBase::Expr &b) {
deba@482
  1568
    LpBase::Expr tmp(a);
deba@482
  1569
    tmp-=b;
deba@482
  1570
    return tmp;
deba@482
  1571
  }
deba@482
  1572
  ///Multiply with constant
deba@482
  1573
deba@482
  1574
  ///\relates LpBase::Expr
deba@482
  1575
  ///
deba@482
  1576
  inline LpBase::Expr operator*(const LpBase::Expr &a, const LpBase::Value &b) {
deba@482
  1577
    LpBase::Expr tmp(a);
deba@482
  1578
    tmp*=b;
deba@482
  1579
    return tmp;
deba@482
  1580
  }
deba@482
  1581
deba@482
  1582
  ///Multiply with constant
deba@482
  1583
deba@482
  1584
  ///\relates LpBase::Expr
deba@482
  1585
  ///
deba@482
  1586
  inline LpBase::Expr operator*(const LpBase::Value &a, const LpBase::Expr &b) {
deba@482
  1587
    LpBase::Expr tmp(b);
deba@482
  1588
    tmp*=a;
deba@482
  1589
    return tmp;
deba@482
  1590
  }
deba@482
  1591
  ///Divide with constant
deba@482
  1592
deba@482
  1593
  ///\relates LpBase::Expr
deba@482
  1594
  ///
deba@482
  1595
  inline LpBase::Expr operator/(const LpBase::Expr &a, const LpBase::Value &b) {
deba@482
  1596
    LpBase::Expr tmp(a);
deba@482
  1597
    tmp/=b;
deba@482
  1598
    return tmp;
deba@482
  1599
  }
deba@482
  1600
deba@482
  1601
  ///Create constraint
deba@482
  1602
deba@482
  1603
  ///\relates LpBase::Constr
deba@482
  1604
  ///
deba@482
  1605
  inline LpBase::Constr operator<=(const LpBase::Expr &e,
deba@482
  1606
                                   const LpBase::Expr &f) {
deba@482
  1607
    return LpBase::Constr(0, f - e, LpBase::INF);
deba@482
  1608
  }
deba@482
  1609
deba@482
  1610
  ///Create constraint
deba@482
  1611
deba@482
  1612
  ///\relates LpBase::Constr
deba@482
  1613
  ///
deba@482
  1614
  inline LpBase::Constr operator<=(const LpBase::Value &e,
deba@482
  1615
                                   const LpBase::Expr &f) {
deba@482
  1616
    return LpBase::Constr(e, f, LpBase::NaN);
deba@482
  1617
  }
deba@482
  1618
deba@482
  1619
  ///Create constraint
deba@482
  1620
deba@482
  1621
  ///\relates LpBase::Constr
deba@482
  1622
  ///
deba@482
  1623
  inline LpBase::Constr operator<=(const LpBase::Expr &e,
deba@482
  1624
                                   const LpBase::Value &f) {
deba@482
  1625
    return LpBase::Constr(- LpBase::INF, e, f);
deba@482
  1626
  }
deba@482
  1627
deba@482
  1628
  ///Create constraint
deba@482
  1629
deba@482
  1630
  ///\relates LpBase::Constr
deba@482
  1631
  ///
deba@482
  1632
  inline LpBase::Constr operator>=(const LpBase::Expr &e,
deba@482
  1633
                                   const LpBase::Expr &f) {
deba@482
  1634
    return LpBase::Constr(0, e - f, LpBase::INF);
deba@482
  1635
  }
deba@482
  1636
deba@482
  1637
deba@482
  1638
  ///Create constraint
deba@482
  1639
deba@482
  1640
  ///\relates LpBase::Constr
deba@482
  1641
  ///
deba@482
  1642
  inline LpBase::Constr operator>=(const LpBase::Value &e,
deba@482
  1643
                                   const LpBase::Expr &f) {
deba@482
  1644
    return LpBase::Constr(LpBase::NaN, f, e);
deba@482
  1645
  }
deba@482
  1646
deba@482
  1647
deba@482
  1648
  ///Create constraint
deba@482
  1649
deba@482
  1650
  ///\relates LpBase::Constr
deba@482
  1651
  ///
deba@482
  1652
  inline LpBase::Constr operator>=(const LpBase::Expr &e,
deba@482
  1653
                                   const LpBase::Value &f) {
deba@482
  1654
    return LpBase::Constr(f, e, LpBase::INF);
deba@482
  1655
  }
deba@482
  1656
deba@482
  1657
  ///Create constraint
deba@482
  1658
deba@482
  1659
  ///\relates LpBase::Constr
deba@482
  1660
  ///
deba@482
  1661
  inline LpBase::Constr operator==(const LpBase::Expr &e,
deba@482
  1662
                                   const LpBase::Value &f) {
deba@482
  1663
    return LpBase::Constr(f, e, f);
deba@482
  1664
  }
deba@482
  1665
deba@482
  1666
  ///Create constraint
deba@482
  1667
deba@482
  1668
  ///\relates LpBase::Constr
deba@482
  1669
  ///
deba@482
  1670
  inline LpBase::Constr operator==(const LpBase::Expr &e,
deba@482
  1671
                                   const LpBase::Expr &f) {
deba@482
  1672
    return LpBase::Constr(0, f - e, 0);
deba@482
  1673
  }
deba@482
  1674
deba@482
  1675
  ///Create constraint
deba@482
  1676
deba@482
  1677
  ///\relates LpBase::Constr
deba@482
  1678
  ///
deba@482
  1679
  inline LpBase::Constr operator<=(const LpBase::Value &n,
deba@482
  1680
                                   const LpBase::Constr &c) {
deba@482
  1681
    LpBase::Constr tmp(c);
alpar@558
  1682
    LEMON_ASSERT(isNaN(tmp.lowerBound()), "Wrong LP constraint");
deba@482
  1683
    tmp.lowerBound()=n;
deba@482
  1684
    return tmp;
deba@482
  1685
  }
deba@482
  1686
  ///Create constraint
deba@482
  1687
deba@482
  1688
  ///\relates LpBase::Constr
deba@482
  1689
  ///
deba@482
  1690
  inline LpBase::Constr operator<=(const LpBase::Constr &c,
deba@482
  1691
                                   const LpBase::Value &n)
deba@482
  1692
  {
deba@482
  1693
    LpBase::Constr tmp(c);
alpar@558
  1694
    LEMON_ASSERT(isNaN(tmp.upperBound()), "Wrong LP constraint");
deba@482
  1695
    tmp.upperBound()=n;
deba@482
  1696
    return tmp;
deba@482
  1697
  }
deba@482
  1698
deba@482
  1699
  ///Create constraint
deba@482
  1700
deba@482
  1701
  ///\relates LpBase::Constr
deba@482
  1702
  ///
deba@482
  1703
  inline LpBase::Constr operator>=(const LpBase::Value &n,
deba@482
  1704
                                   const LpBase::Constr &c) {
deba@482
  1705
    LpBase::Constr tmp(c);
alpar@558
  1706
    LEMON_ASSERT(isNaN(tmp.upperBound()), "Wrong LP constraint");
deba@482
  1707
    tmp.upperBound()=n;
deba@482
  1708
    return tmp;
deba@482
  1709
  }
deba@482
  1710
  ///Create constraint
deba@482
  1711
deba@482
  1712
  ///\relates LpBase::Constr
deba@482
  1713
  ///
deba@482
  1714
  inline LpBase::Constr operator>=(const LpBase::Constr &c,
deba@482
  1715
                                   const LpBase::Value &n)
deba@482
  1716
  {
deba@482
  1717
    LpBase::Constr tmp(c);
alpar@558
  1718
    LEMON_ASSERT(isNaN(tmp.lowerBound()), "Wrong LP constraint");
deba@482
  1719
    tmp.lowerBound()=n;
deba@482
  1720
    return tmp;
deba@482
  1721
  }
deba@482
  1722
deba@482
  1723
  ///Addition
deba@482
  1724
deba@482
  1725
  ///\relates LpBase::DualExpr
deba@482
  1726
  ///
deba@482
  1727
  inline LpBase::DualExpr operator+(const LpBase::DualExpr &a,
deba@482
  1728
                                    const LpBase::DualExpr &b) {
deba@482
  1729
    LpBase::DualExpr tmp(a);
deba@482
  1730
    tmp+=b;
deba@482
  1731
    return tmp;
deba@482
  1732
  }
deba@482
  1733
  ///Substraction
deba@482
  1734
deba@482
  1735
  ///\relates LpBase::DualExpr
deba@482
  1736
  ///
deba@482
  1737
  inline LpBase::DualExpr operator-(const LpBase::DualExpr &a,
deba@482
  1738
                                    const LpBase::DualExpr &b) {
deba@482
  1739
    LpBase::DualExpr tmp(a);
deba@482
  1740
    tmp-=b;
deba@482
  1741
    return tmp;
deba@482
  1742
  }
deba@482
  1743
  ///Multiply with constant
deba@482
  1744
deba@482
  1745
  ///\relates LpBase::DualExpr
deba@482
  1746
  ///
deba@482
  1747
  inline LpBase::DualExpr operator*(const LpBase::DualExpr &a,
deba@482
  1748
                                    const LpBase::Value &b) {
deba@482
  1749
    LpBase::DualExpr tmp(a);
deba@482
  1750
    tmp*=b;
deba@482
  1751
    return tmp;
deba@482
  1752
  }
deba@482
  1753
deba@482
  1754
  ///Multiply with constant
deba@482
  1755
deba@482
  1756
  ///\relates LpBase::DualExpr
deba@482
  1757
  ///
deba@482
  1758
  inline LpBase::DualExpr operator*(const LpBase::Value &a,
deba@482
  1759
                                    const LpBase::DualExpr &b) {
deba@482
  1760
    LpBase::DualExpr tmp(b);
deba@482
  1761
    tmp*=a;
deba@482
  1762
    return tmp;
deba@482
  1763
  }
deba@482
  1764
  ///Divide with constant
deba@482
  1765
deba@482
  1766
  ///\relates LpBase::DualExpr
deba@482
  1767
  ///
deba@482
  1768
  inline LpBase::DualExpr operator/(const LpBase::DualExpr &a,
deba@482
  1769
                                    const LpBase::Value &b) {
deba@482
  1770
    LpBase::DualExpr tmp(a);
deba@482
  1771
    tmp/=b;
deba@482
  1772
    return tmp;
deba@482
  1773
  }
deba@482
  1774
deba@482
  1775
  /// \ingroup lp_group
deba@482
  1776
  ///
deba@482
  1777
  /// \brief Common base class for LP solvers
deba@482
  1778
  ///
deba@482
  1779
  /// This class is an abstract base class for LP solvers. This class
deba@482
  1780
  /// provides a full interface for set and modify an LP problem,
deba@482
  1781
  /// solve it and retrieve the solution. You can use one of the
deba@482
  1782
  /// descendants as a concrete implementation, or the \c Lp
deba@482
  1783
  /// default LP solver. However, if you would like to handle LP
deba@482
  1784
  /// solvers as reference or pointer in a generic way, you can use
deba@482
  1785
  /// this class directly.
deba@482
  1786
  class LpSolver : virtual public LpBase {
deba@482
  1787
  public:
deba@482
  1788
deba@482
  1789
    /// The problem types for primal and dual problems
deba@482
  1790
    enum ProblemType {
kpeter@631
  1791
      /// = 0. Feasible solution hasn't been found (but may exist).
deba@482
  1792
      UNDEFINED = 0,
kpeter@631
  1793
      /// = 1. The problem has no feasible solution.
deba@482
  1794
      INFEASIBLE = 1,
kpeter@631
  1795
      /// = 2. Feasible solution found.
deba@482
  1796
      FEASIBLE = 2,
kpeter@631
  1797
      /// = 3. Optimal solution exists and found.
deba@482
  1798
      OPTIMAL = 3,
kpeter@631
  1799
      /// = 4. The cost function is unbounded.
deba@482
  1800
      UNBOUNDED = 4
deba@482
  1801
    };
deba@482
  1802
deba@482
  1803
    ///The basis status of variables
deba@482
  1804
    enum VarStatus {
deba@482
  1805
      /// The variable is in the basis
deba@482
  1806
      BASIC, 
deba@482
  1807
      /// The variable is free, but not basic
deba@482
  1808
      FREE,
deba@482
  1809
      /// The variable has active lower bound 
deba@482
  1810
      LOWER,
deba@482
  1811
      /// The variable has active upper bound
deba@482
  1812
      UPPER,
deba@482
  1813
      /// The variable is non-basic and fixed
deba@482
  1814
      FIXED
deba@482
  1815
    };
deba@482
  1816
deba@482
  1817
  protected:
deba@482
  1818
deba@482
  1819
    virtual SolveExitStatus _solve() = 0;
deba@482
  1820
deba@482
  1821
    virtual Value _getPrimal(int i) const = 0;
deba@482
  1822
    virtual Value _getDual(int i) const = 0;
deba@482
  1823
deba@482
  1824
    virtual Value _getPrimalRay(int i) const = 0;
deba@482
  1825
    virtual Value _getDualRay(int i) const = 0;
deba@482
  1826
deba@482
  1827
    virtual Value _getPrimalValue() const = 0;
deba@482
  1828
deba@482
  1829
    virtual VarStatus _getColStatus(int i) const = 0;
deba@482
  1830
    virtual VarStatus _getRowStatus(int i) const = 0;
deba@482
  1831
deba@482
  1832
    virtual ProblemType _getPrimalType() const = 0;
deba@482
  1833
    virtual ProblemType _getDualType() const = 0;
deba@482
  1834
deba@482
  1835
  public:
deba@481
  1836
alpar@587
  1837
    ///Allocate a new LP problem instance
alpar@587
  1838
    virtual LpSolver* newSolver() const = 0;
alpar@587
  1839
    ///Make a copy of the LP problem
alpar@587
  1840
    virtual LpSolver* cloneSolver() const = 0;
alpar@587
  1841
deba@481
  1842
    ///\name Solve the LP
deba@481
  1843
deba@481
  1844
    ///@{
deba@481
  1845
deba@481
  1846
    ///\e Solve the LP problem at hand
deba@481
  1847
    ///
deba@481
  1848
    ///\return The result of the optimization procedure. Possible
deba@481
  1849
    ///values and their meanings can be found in the documentation of
deba@481
  1850
    ///\ref SolveExitStatus.
deba@481
  1851
    SolveExitStatus solve() { return _solve(); }
deba@481
  1852
deba@481
  1853
    ///@}
deba@481
  1854
kpeter@631
  1855
    ///\name Obtain the Solution
deba@481
  1856
deba@481
  1857
    ///@{
deba@481
  1858
deba@482
  1859
    /// The type of the primal problem
deba@482
  1860
    ProblemType primalType() const {
deba@482
  1861
      return _getPrimalType();
deba@481
  1862
    }
deba@481
  1863
deba@482
  1864
    /// The type of the dual problem
deba@482
  1865
    ProblemType dualType() const {
deba@482
  1866
      return _getDualType();
deba@481
  1867
    }
deba@481
  1868
deba@482
  1869
    /// Return the primal value of the column
deba@482
  1870
deba@482
  1871
    /// Return the primal value of the column.
deba@482
  1872
    /// \pre The problem is solved.
deba@482
  1873
    Value primal(Col c) const { return _getPrimal(cols(id(c))); }
deba@482
  1874
deba@482
  1875
    /// Return the primal value of the expression
deba@482
  1876
deba@482
  1877
    /// Return the primal value of the expression, i.e. the dot
deba@482
  1878
    /// product of the primal solution and the expression.
deba@482
  1879
    /// \pre The problem is solved.
deba@482
  1880
    Value primal(const Expr& e) const {
deba@482
  1881
      double res = *e;
deba@482
  1882
      for (Expr::ConstCoeffIt c(e); c != INVALID; ++c) {
deba@482
  1883
        res += *c * primal(c);
deba@482
  1884
      }
deba@482
  1885
      return res;
deba@481
  1886
    }
deba@482
  1887
    /// Returns a component of the primal ray
deba@482
  1888
    
deba@482
  1889
    /// The primal ray is solution of the modified primal problem,
deba@482
  1890
    /// where we change each finite bound to 0, and we looking for a
deba@482
  1891
    /// negative objective value in case of minimization, and positive
deba@482
  1892
    /// objective value for maximization. If there is such solution,
deba@482
  1893
    /// that proofs the unsolvability of the dual problem, and if a
deba@482
  1894
    /// feasible primal solution exists, then the unboundness of
deba@482
  1895
    /// primal problem.
deba@482
  1896
    ///
deba@482
  1897
    /// \pre The problem is solved and the dual problem is infeasible.
deba@482
  1898
    /// \note Some solvers does not provide primal ray calculation
deba@482
  1899
    /// functions.
deba@482
  1900
    Value primalRay(Col c) const { return _getPrimalRay(cols(id(c))); }
deba@481
  1901
deba@482
  1902
    /// Return the dual value of the row
deba@482
  1903
deba@482
  1904
    /// Return the dual value of the row.
deba@482
  1905
    /// \pre The problem is solved.
deba@482
  1906
    Value dual(Row r) const { return _getDual(rows(id(r))); }
deba@482
  1907
deba@482
  1908
    /// Return the dual value of the dual expression
deba@482
  1909
deba@482
  1910
    /// Return the dual value of the dual expression, i.e. the dot
deba@482
  1911
    /// product of the dual solution and the dual expression.
deba@482
  1912
    /// \pre The problem is solved.
deba@482
  1913
    Value dual(const DualExpr& e) const {
deba@482
  1914
      double res = 0.0;
deba@482
  1915
      for (DualExpr::ConstCoeffIt r(e); r != INVALID; ++r) {
deba@482
  1916
        res += *r * dual(r);
deba@481
  1917
      }
deba@481
  1918
      return res;
deba@481
  1919
    }
deba@481
  1920
deba@482
  1921
    /// Returns a component of the dual ray
deba@482
  1922
    
deba@482
  1923
    /// The dual ray is solution of the modified primal problem, where
deba@482
  1924
    /// we change each finite bound to 0 (i.e. the objective function
deba@482
  1925
    /// coefficients in the primal problem), and we looking for a
deba@482
  1926
    /// ositive objective value. If there is such solution, that
deba@482
  1927
    /// proofs the unsolvability of the primal problem, and if a
deba@482
  1928
    /// feasible dual solution exists, then the unboundness of
deba@482
  1929
    /// dual problem.
deba@482
  1930
    ///
deba@482
  1931
    /// \pre The problem is solved and the primal problem is infeasible.
deba@482
  1932
    /// \note Some solvers does not provide dual ray calculation
deba@482
  1933
    /// functions.
deba@482
  1934
    Value dualRay(Row r) const { return _getDualRay(rows(id(r))); }
deba@481
  1935
deba@482
  1936
    /// Return the basis status of the column
deba@481
  1937
deba@482
  1938
    /// \see VarStatus
deba@482
  1939
    VarStatus colStatus(Col c) const { return _getColStatus(cols(id(c))); }
deba@482
  1940
deba@482
  1941
    /// Return the basis status of the row
deba@482
  1942
deba@482
  1943
    /// \see VarStatus
deba@482
  1944
    VarStatus rowStatus(Row r) const { return _getRowStatus(rows(id(r))); }
deba@482
  1945
deba@482
  1946
    ///The value of the objective function
deba@481
  1947
deba@481
  1948
    ///\return
deba@481
  1949
    ///- \ref INF or -\ref INF means either infeasibility or unboundedness
deba@481
  1950
    /// of the primal problem, depending on whether we minimize or maximize.
deba@481
  1951
    ///- \ref NaN if no primal solution is found.
deba@481
  1952
    ///- The (finite) objective value if an optimal solution is found.
deba@482
  1953
    Value primal() const { return _getPrimalValue()+obj_const_comp;}
deba@481
  1954
    ///@}
deba@481
  1955
deba@482
  1956
  protected:
deba@482
  1957
deba@481
  1958
  };
deba@481
  1959
deba@481
  1960
deba@481
  1961
  /// \ingroup lp_group
deba@481
  1962
  ///
deba@481
  1963
  /// \brief Common base class for MIP solvers
deba@482
  1964
  ///
deba@482
  1965
  /// This class is an abstract base class for MIP solvers. This class
deba@482
  1966
  /// provides a full interface for set and modify an MIP problem,
deba@482
  1967
  /// solve it and retrieve the solution. You can use one of the
deba@482
  1968
  /// descendants as a concrete implementation, or the \c Lp
deba@482
  1969
  /// default MIP solver. However, if you would like to handle MIP
deba@482
  1970
  /// solvers as reference or pointer in a generic way, you can use
deba@482
  1971
  /// this class directly.
deba@482
  1972
  class MipSolver : virtual public LpBase {
deba@481
  1973
  public:
deba@481
  1974
deba@482
  1975
    /// The problem types for MIP problems
deba@482
  1976
    enum ProblemType {
kpeter@631
  1977
      /// = 0. Feasible solution hasn't been found (but may exist).
deba@482
  1978
      UNDEFINED = 0,
kpeter@631
  1979
      /// = 1. The problem has no feasible solution.
deba@482
  1980
      INFEASIBLE = 1,
kpeter@631
  1981
      /// = 2. Feasible solution found.
deba@482
  1982
      FEASIBLE = 2,
kpeter@631
  1983
      /// = 3. Optimal solution exists and found.
deba@482
  1984
      OPTIMAL = 3,
kpeter@631
  1985
      /// = 4. The cost function is unbounded.
kpeter@631
  1986
      ///The Mip or at least the relaxed problem is unbounded.
deba@482
  1987
      UNBOUNDED = 4
deba@482
  1988
    };
deba@482
  1989
alpar@587
  1990
    ///Allocate a new MIP problem instance
alpar@587
  1991
    virtual MipSolver* newSolver() const = 0;
alpar@587
  1992
    ///Make a copy of the MIP problem
alpar@587
  1993
    virtual MipSolver* cloneSolver() const = 0;
alpar@587
  1994
deba@482
  1995
    ///\name Solve the MIP
deba@482
  1996
deba@482
  1997
    ///@{
deba@482
  1998
deba@482
  1999
    /// Solve the MIP problem at hand
deba@482
  2000
    ///
deba@482
  2001
    ///\return The result of the optimization procedure. Possible
deba@482
  2002
    ///values and their meanings can be found in the documentation of
deba@482
  2003
    ///\ref SolveExitStatus.
deba@482
  2004
    SolveExitStatus solve() { return _solve(); }
deba@482
  2005
deba@482
  2006
    ///@}
deba@482
  2007
kpeter@631
  2008
    ///\name Set Column Type
deba@482
  2009
    ///@{
deba@482
  2010
deba@482
  2011
    ///Possible variable (column) types (e.g. real, integer, binary etc.)
deba@481
  2012
    enum ColTypes {
kpeter@631
  2013
      /// = 0. Continuous variable (default).
deba@481
  2014
      REAL = 0,
kpeter@631
  2015
      /// = 1. Integer variable.
deba@482
  2016
      INTEGER = 1
deba@481
  2017
    };
deba@481
  2018
deba@482
  2019
    ///Sets the type of the given column to the given type
deba@482
  2020
deba@482
  2021
    ///Sets the type of the given column to the given type.
deba@481
  2022
    ///
deba@481
  2023
    void colType(Col c, ColTypes col_type) {
deba@482
  2024
      _setColType(cols(id(c)),col_type);
deba@481
  2025
    }
deba@481
  2026
deba@481
  2027
    ///Gives back the type of the column.
deba@482
  2028
deba@482
  2029
    ///Gives back the type of the column.
deba@481
  2030
    ///
deba@481
  2031
    ColTypes colType(Col c) const {
deba@482
  2032
      return _getColType(cols(id(c)));
deba@482
  2033
    }
deba@482
  2034
    ///@}
deba@482
  2035
kpeter@631
  2036
    ///\name Obtain the Solution
deba@482
  2037
deba@482
  2038
    ///@{
deba@482
  2039
deba@482
  2040
    /// The type of the MIP problem
deba@482
  2041
    ProblemType type() const {
deba@482
  2042
      return _getType();
deba@481
  2043
    }
deba@481
  2044
deba@482
  2045
    /// Return the value of the row in the solution
deba@482
  2046
deba@482
  2047
    ///  Return the value of the row in the solution.
deba@482
  2048
    /// \pre The problem is solved.
deba@482
  2049
    Value sol(Col c) const { return _getSol(cols(id(c))); }
deba@482
  2050
deba@482
  2051
    /// Return the value of the expression in the solution
deba@482
  2052
deba@482
  2053
    /// Return the value of the expression in the solution, i.e. the
deba@482
  2054
    /// dot product of the solution and the expression.
deba@482
  2055
    /// \pre The problem is solved.
deba@482
  2056
    Value sol(const Expr& e) const {
deba@482
  2057
      double res = *e;
deba@482
  2058
      for (Expr::ConstCoeffIt c(e); c != INVALID; ++c) {
deba@482
  2059
        res += *c * sol(c);
deba@482
  2060
      }
deba@482
  2061
      return res;
deba@481
  2062
    }
deba@482
  2063
    ///The value of the objective function
deba@482
  2064
    
deba@482
  2065
    ///\return
deba@482
  2066
    ///- \ref INF or -\ref INF means either infeasibility or unboundedness
deba@482
  2067
    /// of the problem, depending on whether we minimize or maximize.
deba@482
  2068
    ///- \ref NaN if no primal solution is found.
deba@482
  2069
    ///- The (finite) objective value if an optimal solution is found.
deba@482
  2070
    Value solValue() const { return _getSolValue()+obj_const_comp;}
deba@482
  2071
    ///@}
deba@481
  2072
deba@481
  2073
  protected:
deba@481
  2074
deba@482
  2075
    virtual SolveExitStatus _solve() = 0;
deba@482
  2076
    virtual ColTypes _getColType(int col) const = 0;
deba@482
  2077
    virtual void _setColType(int col, ColTypes col_type) = 0;
deba@482
  2078
    virtual ProblemType _getType() const = 0;
deba@482
  2079
    virtual Value _getSol(int i) const = 0;
deba@482
  2080
    virtual Value _getSolValue() const = 0;
deba@481
  2081
deba@481
  2082
  };
deba@481
  2083
deba@481
  2084
deba@481
  2085
deba@481
  2086
} //namespace lemon
deba@481
  2087
deba@481
  2088
#endif //LEMON_LP_BASE_H