lemon/lp_base.h
author Peter Kovacs <kpeter@inf.elte.hu>
Tue, 15 Mar 2011 19:32:21 +0100
changeset 936 ddd3c0d3d9bf
parent 834 207ba6c0f2e4
child 958 9a716871028e
permissions -rw-r--r--
Implement the scaling Price Refinement heuristic in CostScaling (#417)
instead of Early Termination.

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