lemon/lp_base.h
author Peter Kovacs <kpeter@inf.elte.hu>
Tue, 24 Mar 2009 00:18:25 +0100
changeset 604 8c3112a66878
parent 511 06787db0ef5f
child 540 9db62975c32b
permissions -rw-r--r--
Use XTI implementation instead of ATI in NetworkSimplex (#234)

XTI (eXtended Threaded Index) is an imporved version of the widely
known ATI (Augmented Threaded Index) method for storing and updating
the spanning tree structure in Network Simplex algorithms.

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