1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
3 * This file is a part of LEMON, a generic C++ optimization library.
5 * Copyright (C) 2003-2008
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
9 * Permission to use, modify and distribute this software is granted
10 * provided that this copyright notice appears in all copies. For
11 * precise terms see the accompanying LICENSE file.
13 * This software is provided "AS IS" with no warranty of any kind,
14 * express or implied, and with no claim as to its suitability for any
19 #ifndef LEMON_LP_BASE_H
20 #define LEMON_LP_BASE_H
26 #include<lemon/math.h>
28 #include<lemon/error.h>
29 #include<lemon/assert.h>
31 #include<lemon/core.h>
32 #include<lemon/bits/solver_bits.h>
35 ///\brief The interface of the LP solver interface.
39 ///Common base class for LP and MIP solvers
41 ///Usually this class is not used directly, please use one of the concrete
42 ///implementations of the solver interface.
48 _solver_bits::VarIndex rows;
49 _solver_bits::VarIndex cols;
53 ///Possible outcomes of an LP solving procedure
54 enum SolveExitStatus {
55 ///This means that the problem has been successfully solved: either
56 ///an optimal solution has been found or infeasibility/unboundedness
59 ///Any other case (including the case when some user specified
60 ///limit has been exceeded)
64 ///Direction of the optimization
72 ///The floating point type used by the solver
74 ///The infinity constant
75 static const Value INF;
76 ///The not a number constant
77 static const Value NaN;
84 ///Refer to a column of the LP.
86 ///This type is used to refer to a column of the LP.
88 ///Its value remains valid and correct even after the addition or erase of
91 ///\note This class is similar to other Item types in LEMON, like
92 ///Node and Arc types in digraph.
97 explicit Col(int id) : _id(id) {}
99 typedef Value ExprValue;
101 /// Default constructor
103 /// \warning The default constructor sets the Col to an
106 /// Invalid constructor \& conversion.
108 /// This constructor initializes the Col to be invalid.
109 /// \sa Invalid for more details.
110 Col(const Invalid&) : _id(-1) {}
111 /// Equality operator
113 /// Two \ref Col "Col"s are equal if and only if they point to
114 /// the same LP column or both are invalid.
115 bool operator==(Col c) const {return _id == c._id;}
116 /// Inequality operator
118 /// \sa operator==(Col c)
120 bool operator!=(Col c) const {return _id != c._id;}
121 /// Artificial ordering operator.
123 /// To allow the use of this object in std::map or similar
124 /// associative container we require this.
126 /// \note This operator only have to define some strict ordering of
127 /// the items; this order has nothing to do with the iteration
128 /// ordering of the items.
129 bool operator<(Col c) const {return _id < c._id;}
132 ///Iterator for iterate over the columns of an LP problem
134 /// Its usage is quite simple, for example you can count the number
135 /// of columns in an LP \c lp:
138 /// for (LpBase::ColIt c(lp); c!=INVALID; ++c) ++count;
140 class ColIt : public Col {
141 const LpBase *_solver;
143 /// Default constructor
145 /// \warning The default constructor sets the iterator
146 /// to an undefined value.
148 /// Sets the iterator to the first Col
150 /// Sets the iterator to the first Col.
152 ColIt(const LpBase &solver) : _solver(&solver)
154 _solver->cols.firstItem(_id);
156 /// Invalid constructor \& conversion
158 /// Initialize the iterator to be invalid.
159 /// \sa Invalid for more details.
160 ColIt(const Invalid&) : Col(INVALID) {}
163 /// Assign the iterator to the next column.
167 _solver->cols.nextItem(_id);
172 /// \brief Returns the ID of the column.
173 static int id(const Col& col) { return col._id; }
174 /// \brief Returns the column with the given ID.
176 /// \pre The argument should be a valid column ID in the LP problem.
177 static Col colFromId(int id) { return Col(id); }
179 ///Refer to a row of the LP.
181 ///This type is used to refer to a row of the LP.
183 ///Its value remains valid and correct even after the addition or erase of
186 ///\note This class is similar to other Item types in LEMON, like
187 ///Node and Arc types in digraph.
192 explicit Row(int id) : _id(id) {}
194 typedef Value ExprValue;
196 /// Default constructor
198 /// \warning The default constructor sets the Row to an
201 /// Invalid constructor \& conversion.
203 /// This constructor initializes the Row to be invalid.
204 /// \sa Invalid for more details.
205 Row(const Invalid&) : _id(-1) {}
206 /// Equality operator
208 /// Two \ref Row "Row"s are equal if and only if they point to
209 /// the same LP row or both are invalid.
210 bool operator==(Row r) const {return _id == r._id;}
211 /// Inequality operator
213 /// \sa operator==(Row r)
215 bool operator!=(Row r) const {return _id != r._id;}
216 /// Artificial ordering operator.
218 /// To allow the use of this object in std::map or similar
219 /// associative container we require this.
221 /// \note This operator only have to define some strict ordering of
222 /// the items; this order has nothing to do with the iteration
223 /// ordering of the items.
224 bool operator<(Row r) const {return _id < r._id;}
227 ///Iterator for iterate over the rows of an LP problem
229 /// Its usage is quite simple, for example you can count the number
230 /// of rows in an LP \c lp:
233 /// for (LpBase::RowIt c(lp); c!=INVALID; ++c) ++count;
235 class RowIt : public Row {
236 const LpBase *_solver;
238 /// Default constructor
240 /// \warning The default constructor sets the iterator
241 /// to an undefined value.
243 /// Sets the iterator to the first Row
245 /// Sets the iterator to the first Row.
247 RowIt(const LpBase &solver) : _solver(&solver)
249 _solver->rows.firstItem(_id);
251 /// Invalid constructor \& conversion
253 /// Initialize the iterator to be invalid.
254 /// \sa Invalid for more details.
255 RowIt(const Invalid&) : Row(INVALID) {}
258 /// Assign the iterator to the next row.
262 _solver->rows.nextItem(_id);
267 /// \brief Returns the ID of the row.
268 static int id(const Row& row) { return row._id; }
269 /// \brief Returns the row with the given ID.
271 /// \pre The argument should be a valid row ID in the LP problem.
272 static Row rowFromId(int id) { return Row(id); }
276 ///Linear expression of variables and a constant component
278 ///This data structure stores a linear expression of the variables
279 ///(\ref Col "Col"s) and also has a constant component.
281 ///There are several ways to access and modify the contents of this
288 ///or you can also iterate through its elements.
291 ///for(LpBase::Expr::ConstCoeffIt i(e);i!=INVALID;++i)
292 /// s+=*i * primal(i);
294 ///(This code computes the primal value of the expression).
295 ///- Numbers (<tt>double</tt>'s)
296 ///and variables (\ref Col "Col"s) directly convert to an
297 ///\ref Expr and the usual linear operations are defined, so
300 ///2*v-3.12*(v-w/2)+2
301 ///v*2.1+(3*v+(v*12+w+6)*3)/2
303 ///are valid expressions.
304 ///The usual assignment operations are also defined.
307 ///e+=2*v-3.12*(v-w/2)+2;
311 ///- The constant member can be set and read by dereference
312 /// operator (unary *)
323 /// The key type of the expression
324 typedef LpBase::Col Key;
325 /// The value type of the expression
326 typedef LpBase::Value Value;
330 std::map<int, Value> comps;
333 typedef True SolverExpr;
334 /// Default constructor
336 /// Construct an empty expression, the coefficients and
337 /// the constant component are initialized to zero.
338 Expr() : const_comp(0) {}
339 /// Construct an expression from a column
341 /// Construct an expression, which has a term with \c c variable
342 /// and 1.0 coefficient.
343 Expr(const Col &c) : const_comp(0) {
344 typedef std::map<int, Value>::value_type pair_type;
345 comps.insert(pair_type(id(c), 1));
347 /// Construct an expression from a constant
349 /// Construct an expression, which's constant component is \c v.
351 Expr(const Value &v) : const_comp(v) {}
352 /// Returns the coefficient of the column
353 Value operator[](const Col& c) const {
354 std::map<int, Value>::const_iterator it=comps.find(id(c));
355 if (it != comps.end()) {
361 /// Returns the coefficient of the column
362 Value& operator[](const Col& c) {
365 /// Sets the coefficient of the column
366 void set(const Col &c, const Value &v) {
368 typedef std::map<int, Value>::value_type pair_type;
369 comps.insert(pair_type(id(c), v));
374 /// Returns the constant component of the expression
375 Value& operator*() { return const_comp; }
376 /// Returns the constant component of the expression
377 const Value& operator*() const { return const_comp; }
378 /// \brief Removes the coefficients which's absolute value does
379 /// not exceed \c epsilon. It also sets to zero the constant
380 /// component, if it does not exceed epsilon in absolute value.
381 void simplify(Value epsilon = 0.0) {
382 std::map<int, Value>::iterator it=comps.begin();
383 while (it != comps.end()) {
384 std::map<int, Value>::iterator jt=it;
386 if (std::fabs((*it).second) <= epsilon) comps.erase(it);
389 if (std::fabs(const_comp) <= epsilon) const_comp = 0;
392 void simplify(Value epsilon = 0.0) const {
393 const_cast<Expr*>(this)->simplify(epsilon);
396 ///Sets all coefficients and the constant component to 0.
402 ///Compound assignment
403 Expr &operator+=(const Expr &e) {
404 for (std::map<int, Value>::const_iterator it=e.comps.begin();
405 it!=e.comps.end(); ++it)
406 comps[it->first]+=it->second;
407 const_comp+=e.const_comp;
410 ///Compound assignment
411 Expr &operator-=(const Expr &e) {
412 for (std::map<int, Value>::const_iterator it=e.comps.begin();
413 it!=e.comps.end(); ++it)
414 comps[it->first]-=it->second;
415 const_comp-=e.const_comp;
418 ///Multiply with a constant
419 Expr &operator*=(const Value &v) {
420 for (std::map<int, Value>::iterator it=comps.begin();
421 it!=comps.end(); ++it)
426 ///Division with a constant
427 Expr &operator/=(const Value &c) {
428 for (std::map<int, Value>::iterator it=comps.begin();
429 it!=comps.end(); ++it)
435 ///Iterator over the expression
437 ///The iterator iterates over the terms of the expression.
441 ///for(LpBase::Expr::CoeffIt i(e);i!=INVALID;++i)
442 /// s+= *i * primal(i);
447 std::map<int, Value>::iterator _it, _end;
451 /// Sets the iterator to the first term
453 /// Sets the iterator to the first term of the expression.
456 : _it(e.comps.begin()), _end(e.comps.end()){}
458 /// Convert the iterator to the column of the term
459 operator Col() const {
460 return colFromId(_it->first);
463 /// Returns the coefficient of the term
464 Value& operator*() { return _it->second; }
466 /// Returns the coefficient of the term
467 const Value& operator*() const { return _it->second; }
470 /// Assign the iterator to the next term.
472 CoeffIt& operator++() { ++_it; return *this; }
474 /// Equality operator
475 bool operator==(Invalid) const { return _it == _end; }
476 /// Inequality operator
477 bool operator!=(Invalid) const { return _it != _end; }
480 /// Const iterator over the expression
482 ///The iterator iterates over the terms of the expression.
486 ///for(LpBase::Expr::ConstCoeffIt i(e);i!=INVALID;++i)
487 /// s+=*i * primal(i);
492 std::map<int, Value>::const_iterator _it, _end;
496 /// Sets the iterator to the first term
498 /// Sets the iterator to the first term of the expression.
500 ConstCoeffIt(const Expr& e)
501 : _it(e.comps.begin()), _end(e.comps.end()){}
503 /// Convert the iterator to the column of the term
504 operator Col() const {
505 return colFromId(_it->first);
508 /// Returns the coefficient of the term
509 const Value& operator*() const { return _it->second; }
513 /// Assign the iterator to the next term.
515 ConstCoeffIt& operator++() { ++_it; return *this; }
517 /// Equality operator
518 bool operator==(Invalid) const { return _it == _end; }
519 /// Inequality operator
520 bool operator!=(Invalid) const { return _it != _end; }
527 ///This data stucture represents a linear constraint in the LP.
528 ///Basically it is a linear expression with a lower or an upper bound
529 ///(or both). These parts of the constraint can be obtained by the member
530 ///functions \ref expr(), \ref lowerBound() and \ref upperBound(),
532 ///There are two ways to construct a constraint.
533 ///- You can set the linear expression and the bounds directly
534 /// by the functions above.
535 ///- The operators <tt>\<=</tt>, <tt>==</tt> and <tt>\>=</tt>
536 /// are defined between expressions, or even between constraints whenever
537 /// it makes sense. Therefore if \c e and \c f are linear expressions and
538 /// \c s and \c t are numbers, then the followings are valid expressions
539 /// and thus they can be used directly e.g. in \ref addRow() whenever
548 ///\warning The validity of a constraint is checked only at run
549 ///time, so e.g. \ref addRow(<tt>x[1]\<=x[2]<=5</tt>) will
550 ///compile, but will fail an assertion.
554 typedef LpBase::Expr Expr;
555 typedef Expr::Key Key;
556 typedef Expr::Value Value;
563 Constr() : _expr(), _lb(NaN), _ub(NaN) {}
565 Constr(Value lb, const Expr &e, Value ub) :
566 _expr(e), _lb(lb), _ub(ub) {}
567 Constr(const Expr &e) :
568 _expr(e), _lb(NaN), _ub(NaN) {}
576 ///Reference to the linear expression
577 Expr &expr() { return _expr; }
578 ///Cont reference to the linear expression
579 const Expr &expr() const { return _expr; }
580 ///Reference to the lower bound.
583 ///- \ref INF "INF": the constraint is lower unbounded.
584 ///- \ref NaN "NaN": lower bound has not been set.
585 ///- finite number: the lower bound
586 Value &lowerBound() { return _lb; }
587 ///The const version of \ref lowerBound()
588 const Value &lowerBound() const { return _lb; }
589 ///Reference to the upper bound.
592 ///- \ref INF "INF": the constraint is upper unbounded.
593 ///- \ref NaN "NaN": upper bound has not been set.
594 ///- finite number: the upper bound
595 Value &upperBound() { return _ub; }
596 ///The const version of \ref upperBound()
597 const Value &upperBound() const { return _ub; }
598 ///Is the constraint lower bounded?
599 bool lowerBounded() const {
600 return _lb != -INF && !isNaN(_lb);
602 ///Is the constraint upper bounded?
603 bool upperBounded() const {
604 return _ub != INF && !isNaN(_ub);
609 ///Linear expression of rows
611 ///This data structure represents a column of the matrix,
612 ///thas is it strores a linear expression of the dual variables
613 ///(\ref Row "Row"s).
615 ///There are several ways to access and modify the contents of this
622 ///or you can also iterate through its elements.
625 ///for(LpBase::DualExpr::ConstCoeffIt i(e);i!=INVALID;++i)
628 ///(This code computes the sum of all coefficients).
629 ///- Numbers (<tt>double</tt>'s)
630 ///and variables (\ref Row "Row"s) directly convert to an
631 ///\ref DualExpr and the usual linear operations are defined, so
635 ///v*2.1+(3*v+(v*12+w)*3)/2
637 ///are valid \ref DualExpr dual expressions.
638 ///The usual assignment operations are also defined.
641 ///e+=2*v-3.12*(v-w/2);
650 /// The key type of the expression
651 typedef LpBase::Row Key;
652 /// The value type of the expression
653 typedef LpBase::Value Value;
656 std::map<int, Value> comps;
659 typedef True SolverExpr;
660 /// Default constructor
662 /// Construct an empty expression, the coefficients are
663 /// initialized to zero.
665 /// Construct an expression from a row
667 /// Construct an expression, which has a term with \c r dual
668 /// variable and 1.0 coefficient.
669 DualExpr(const Row &r) {
670 typedef std::map<int, Value>::value_type pair_type;
671 comps.insert(pair_type(id(r), 1));
673 /// Returns the coefficient of the row
674 Value operator[](const Row& r) const {
675 std::map<int, Value>::const_iterator it = comps.find(id(r));
676 if (it != comps.end()) {
682 /// Returns the coefficient of the row
683 Value& operator[](const Row& r) {
686 /// Sets the coefficient of the row
687 void set(const Row &r, const Value &v) {
689 typedef std::map<int, Value>::value_type pair_type;
690 comps.insert(pair_type(id(r), v));
695 /// \brief Removes the coefficients which's absolute value does
696 /// not exceed \c epsilon.
697 void simplify(Value epsilon = 0.0) {
698 std::map<int, Value>::iterator it=comps.begin();
699 while (it != comps.end()) {
700 std::map<int, Value>::iterator jt=it;
702 if (std::fabs((*it).second) <= epsilon) comps.erase(it);
707 void simplify(Value epsilon = 0.0) const {
708 const_cast<DualExpr*>(this)->simplify(epsilon);
711 ///Sets all coefficients to 0.
715 ///Compound assignment
716 DualExpr &operator+=(const DualExpr &e) {
717 for (std::map<int, Value>::const_iterator it=e.comps.begin();
718 it!=e.comps.end(); ++it)
719 comps[it->first]+=it->second;
722 ///Compound assignment
723 DualExpr &operator-=(const DualExpr &e) {
724 for (std::map<int, Value>::const_iterator it=e.comps.begin();
725 it!=e.comps.end(); ++it)
726 comps[it->first]-=it->second;
729 ///Multiply with a constant
730 DualExpr &operator*=(const Value &v) {
731 for (std::map<int, Value>::iterator it=comps.begin();
732 it!=comps.end(); ++it)
736 ///Division with a constant
737 DualExpr &operator/=(const Value &v) {
738 for (std::map<int, Value>::iterator it=comps.begin();
739 it!=comps.end(); ++it)
744 ///Iterator over the expression
746 ///The iterator iterates over the terms of the expression.
750 ///for(LpBase::DualExpr::CoeffIt i(e);i!=INVALID;++i)
751 /// s+= *i * dual(i);
756 std::map<int, Value>::iterator _it, _end;
760 /// Sets the iterator to the first term
762 /// Sets the iterator to the first term of the expression.
765 : _it(e.comps.begin()), _end(e.comps.end()){}
767 /// Convert the iterator to the row of the term
768 operator Row() const {
769 return rowFromId(_it->first);
772 /// Returns the coefficient of the term
773 Value& operator*() { return _it->second; }
775 /// Returns the coefficient of the term
776 const Value& operator*() const { return _it->second; }
780 /// Assign the iterator to the next term.
782 CoeffIt& operator++() { ++_it; return *this; }
784 /// Equality operator
785 bool operator==(Invalid) const { return _it == _end; }
786 /// Inequality operator
787 bool operator!=(Invalid) const { return _it != _end; }
790 ///Iterator over the expression
792 ///The iterator iterates over the terms of the expression.
796 ///for(LpBase::DualExpr::ConstCoeffIt i(e);i!=INVALID;++i)
797 /// s+= *i * dual(i);
802 std::map<int, Value>::const_iterator _it, _end;
806 /// Sets the iterator to the first term
808 /// Sets the iterator to the first term of the expression.
810 ConstCoeffIt(const DualExpr& e)
811 : _it(e.comps.begin()), _end(e.comps.end()){}
813 /// Convert the iterator to the row of the term
814 operator Row() const {
815 return rowFromId(_it->first);
818 /// Returns the coefficient of the term
819 const Value& operator*() const { return _it->second; }
823 /// Assign the iterator to the next term.
825 ConstCoeffIt& operator++() { ++_it; return *this; }
827 /// Equality operator
828 bool operator==(Invalid) const { return _it == _end; }
829 /// Inequality operator
830 bool operator!=(Invalid) const { return _it != _end; }
837 class InsertIterator {
840 std::map<int, Value>& _host;
841 const _solver_bits::VarIndex& _index;
845 typedef std::output_iterator_tag iterator_category;
846 typedef void difference_type;
847 typedef void value_type;
848 typedef void reference;
849 typedef void pointer;
851 InsertIterator(std::map<int, Value>& host,
852 const _solver_bits::VarIndex& index)
853 : _host(host), _index(index) {}
855 InsertIterator& operator=(const std::pair<int, Value>& value) {
856 typedef std::map<int, Value>::value_type pair_type;
857 _host.insert(pair_type(_index[value.first], value.second));
861 InsertIterator& operator*() { return *this; }
862 InsertIterator& operator++() { return *this; }
863 InsertIterator operator++(int) { return *this; }
869 std::map<int, Value>::const_iterator _host_it;
870 const _solver_bits::VarIndex& _index;
873 typedef std::bidirectional_iterator_tag iterator_category;
874 typedef std::ptrdiff_t difference_type;
875 typedef const std::pair<int, Value> value_type;
876 typedef value_type reference;
880 pointer(value_type& _value) : value(_value) {}
881 value_type* operator->() { return &value; }
886 ExprIterator(const std::map<int, Value>::const_iterator& host_it,
887 const _solver_bits::VarIndex& index)
888 : _host_it(host_it), _index(index) {}
890 reference operator*() {
891 return std::make_pair(_index(_host_it->first), _host_it->second);
894 pointer operator->() {
895 return pointer(operator*());
898 ExprIterator& operator++() { ++_host_it; return *this; }
899 ExprIterator operator++(int) {
900 ExprIterator tmp(*this); ++_host_it; return tmp;
903 ExprIterator& operator--() { --_host_it; return *this; }
904 ExprIterator operator--(int) {
905 ExprIterator tmp(*this); --_host_it; return tmp;
908 bool operator==(const ExprIterator& it) const {
909 return _host_it == it._host_it;
912 bool operator!=(const ExprIterator& it) const {
913 return _host_it != it._host_it;
920 //Abstract virtual functions
922 virtual int _addColId(int col) { return cols.addIndex(col); }
923 virtual int _addRowId(int row) { return rows.addIndex(row); }
925 virtual void _eraseColId(int col) { cols.eraseIndex(col); }
926 virtual void _eraseRowId(int row) { rows.eraseIndex(row); }
928 virtual int _addCol() = 0;
929 virtual int _addRow() = 0;
931 virtual void _eraseCol(int col) = 0;
932 virtual void _eraseRow(int row) = 0;
934 virtual void _getColName(int col, std::string& name) const = 0;
935 virtual void _setColName(int col, const std::string& name) = 0;
936 virtual int _colByName(const std::string& name) const = 0;
938 virtual void _getRowName(int row, std::string& name) const = 0;
939 virtual void _setRowName(int row, const std::string& name) = 0;
940 virtual int _rowByName(const std::string& name) const = 0;
942 virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e) = 0;
943 virtual void _getRowCoeffs(int i, InsertIterator b) const = 0;
945 virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e) = 0;
946 virtual void _getColCoeffs(int i, InsertIterator b) const = 0;
948 virtual void _setCoeff(int row, int col, Value value) = 0;
949 virtual Value _getCoeff(int row, int col) const = 0;
951 virtual void _setColLowerBound(int i, Value value) = 0;
952 virtual Value _getColLowerBound(int i) const = 0;
954 virtual void _setColUpperBound(int i, Value value) = 0;
955 virtual Value _getColUpperBound(int i) const = 0;
957 virtual void _setRowLowerBound(int i, Value value) = 0;
958 virtual Value _getRowLowerBound(int i) const = 0;
960 virtual void _setRowUpperBound(int i, Value value) = 0;
961 virtual Value _getRowUpperBound(int i) const = 0;
963 virtual void _setObjCoeffs(ExprIterator b, ExprIterator e) = 0;
964 virtual void _getObjCoeffs(InsertIterator b) const = 0;
966 virtual void _setObjCoeff(int i, Value obj_coef) = 0;
967 virtual Value _getObjCoeff(int i) const = 0;
969 virtual void _setSense(Sense) = 0;
970 virtual Sense _getSense() const = 0;
972 virtual void _clear() = 0;
974 virtual const char* _solverName() const = 0;
976 //Own protected stuff
978 //Constant component of the objective function
979 Value obj_const_comp;
981 LpBase() : rows(), cols(), obj_const_comp(0) {}
985 /// Virtual destructor
988 ///Gives back the name of the solver.
989 const char* solverName() const {return _solverName();}
991 ///\name Build up and modify the LP
995 ///Add a new empty column (i.e a new variable) to the LP
996 Col addCol() { Col c; c._id = _addColId(_addCol()); return c;}
998 ///\brief Adds several new columns (i.e variables) at once
1000 ///This magic function takes a container as its argument and fills
1001 ///its elements with new columns (i.e. variables)
1003 ///- a standard STL compatible iterable container with
1004 ///\ref Col as its \c values_type like
1006 ///std::vector<LpBase::Col>
1007 ///std::list<LpBase::Col>
1009 ///- a standard STL compatible iterable container with
1010 ///\ref Col as its \c mapped_type like
1012 ///std::map<AnyType,LpBase::Col>
1014 ///- an iterable lemon \ref concepts::WriteMap "write map" like
1016 ///ListGraph::NodeMap<LpBase::Col>
1017 ///ListGraph::ArcMap<LpBase::Col>
1019 ///\return The number of the created column.
1022 int addColSet(T &t) { return 0;}
1025 typename enable_if<typename T::value_type::LpCol,int>::type
1026 addColSet(T &t,dummy<0> = 0) {
1028 for(typename T::iterator i=t.begin();i!=t.end();++i) {*i=addCol();s++;}
1032 typename enable_if<typename T::value_type::second_type::LpCol,
1034 addColSet(T &t,dummy<1> = 1) {
1036 for(typename T::iterator i=t.begin();i!=t.end();++i) {
1043 typename enable_if<typename T::MapIt::Value::LpCol,
1045 addColSet(T &t,dummy<2> = 2) {
1047 for(typename T::MapIt i(t); i!=INVALID; ++i)
1056 ///Set a column (i.e a dual constraint) of the LP
1058 ///\param c is the column to be modified
1059 ///\param e is a dual linear expression (see \ref DualExpr)
1061 void col(Col c, const DualExpr &e) {
1063 _setColCoeffs(cols(id(c)), ExprIterator(e.comps.begin(), rows),
1064 ExprIterator(e.comps.end(), rows));
1067 ///Get a column (i.e a dual constraint) of the LP
1069 ///\param c is the column to get
1070 ///\return the dual expression associated to the column
1071 DualExpr col(Col c) const {
1073 _getColCoeffs(cols(id(c)), InsertIterator(e.comps, rows));
1077 ///Add a new column to the LP
1079 ///\param e is a dual linear expression (see \ref DualExpr)
1080 ///\param o is the corresponding component of the objective
1081 ///function. It is 0 by default.
1082 ///\return The created column.
1083 Col addCol(const DualExpr &e, Value o = 0) {
1090 ///Add a new empty row (i.e a new constraint) to the LP
1092 ///This function adds a new empty row (i.e a new constraint) to the LP.
1093 ///\return The created row
1094 Row addRow() { Row r; r._id = _addRowId(_addRow()); return r;}
1096 ///\brief Add several new rows (i.e constraints) at once
1098 ///This magic function takes a container as its argument and fills
1099 ///its elements with new row (i.e. variables)
1101 ///- a standard STL compatible iterable container with
1102 ///\ref Row as its \c values_type like
1104 ///std::vector<LpBase::Row>
1105 ///std::list<LpBase::Row>
1107 ///- a standard STL compatible iterable container with
1108 ///\ref Row as its \c mapped_type like
1110 ///std::map<AnyType,LpBase::Row>
1112 ///- an iterable lemon \ref concepts::WriteMap "write map" like
1114 ///ListGraph::NodeMap<LpBase::Row>
1115 ///ListGraph::ArcMap<LpBase::Row>
1117 ///\return The number of rows created.
1120 int addRowSet(T &t) { return 0;}
1123 typename enable_if<typename T::value_type::LpRow,int>::type
1124 addRowSet(T &t, dummy<0> = 0) {
1126 for(typename T::iterator i=t.begin();i!=t.end();++i) {*i=addRow();s++;}
1130 typename enable_if<typename T::value_type::second_type::LpRow, int>::type
1131 addRowSet(T &t, dummy<1> = 1) {
1133 for(typename T::iterator i=t.begin();i!=t.end();++i) {
1140 typename enable_if<typename T::MapIt::Value::LpRow, int>::type
1141 addRowSet(T &t, dummy<2> = 2) {
1143 for(typename T::MapIt i(t); i!=INVALID; ++i)
1152 ///Set a row (i.e a constraint) of the LP
1154 ///\param r is the row to be modified
1155 ///\param l is lower bound (-\ref INF means no bound)
1156 ///\param e is a linear expression (see \ref Expr)
1157 ///\param u is the upper bound (\ref INF means no bound)
1158 void row(Row r, Value l, const Expr &e, Value u) {
1160 _setRowCoeffs(rows(id(r)), ExprIterator(e.comps.begin(), cols),
1161 ExprIterator(e.comps.end(), cols));
1162 _setRowLowerBound(rows(id(r)),l - *e);
1163 _setRowUpperBound(rows(id(r)),u - *e);
1166 ///Set a row (i.e a constraint) of the LP
1168 ///\param r is the row to be modified
1169 ///\param c is a linear expression (see \ref Constr)
1170 void row(Row r, const Constr &c) {
1171 row(r, c.lowerBounded()?c.lowerBound():-INF,
1172 c.expr(), c.upperBounded()?c.upperBound():INF);
1176 ///Get a row (i.e a constraint) of the LP
1178 ///\param r is the row to get
1179 ///\return the expression associated to the row
1180 Expr row(Row r) const {
1182 _getRowCoeffs(rows(id(r)), InsertIterator(e.comps, cols));
1186 ///Add a new row (i.e a new constraint) to the LP
1188 ///\param l is the lower bound (-\ref INF means no bound)
1189 ///\param e is a linear expression (see \ref Expr)
1190 ///\param u is the upper bound (\ref INF means no bound)
1191 ///\return The created row.
1192 Row addRow(Value l,const Expr &e, Value u) {
1198 ///Add a new row (i.e a new constraint) to the LP
1200 ///\param c is a linear expression (see \ref Constr)
1201 ///\return The created row.
1202 Row addRow(const Constr &c) {
1207 ///Erase a column (i.e a variable) from the LP
1209 ///\param c is the column to be deleted
1211 _eraseCol(cols(id(c)));
1212 _eraseColId(cols(id(c)));
1214 ///Erase a row (i.e a constraint) from the LP
1216 ///\param r is the row to be deleted
1218 _eraseRow(rows(id(r)));
1219 _eraseRowId(rows(id(r)));
1222 /// Get the name of a column
1224 ///\param c is the coresponding column
1225 ///\return The name of the colunm
1226 std::string colName(Col c) const {
1228 _getColName(cols(id(c)), name);
1232 /// Set the name of a column
1234 ///\param c is the coresponding column
1235 ///\param name The name to be given
1236 void colName(Col c, const std::string& name) {
1237 _setColName(cols(id(c)), name);
1240 /// Get the column by its name
1242 ///\param name The name of the column
1243 ///\return the proper column or \c INVALID
1244 Col colByName(const std::string& name) const {
1245 int k = _colByName(name);
1246 return k != -1 ? Col(cols[k]) : Col(INVALID);
1249 /// Get the name of a row
1251 ///\param r is the coresponding row
1252 ///\return The name of the row
1253 std::string rowName(Row r) const {
1255 _getRowName(rows(id(r)), name);
1259 /// Set the name of a row
1261 ///\param r is the coresponding row
1262 ///\param name The name to be given
1263 void rowName(Row r, const std::string& name) {
1264 _setRowName(rows(id(r)), name);
1267 /// Get the row by its name
1269 ///\param name The name of the row
1270 ///\return the proper row or \c INVALID
1271 Row rowByName(const std::string& name) const {
1272 int k = _rowByName(name);
1273 return k != -1 ? Row(rows[k]) : Row(INVALID);
1276 /// Set an element of the coefficient matrix of the LP
1278 ///\param r is the row of the element to be modified
1279 ///\param c is the column of the element to be modified
1280 ///\param val is the new value of the coefficient
1281 void coeff(Row r, Col c, Value val) {
1282 _setCoeff(rows(id(r)),cols(id(c)), val);
1285 /// Get an element of the coefficient matrix of the LP
1287 ///\param r is the row of the element
1288 ///\param c is the column of the element
1289 ///\return the corresponding coefficient
1290 Value coeff(Row r, Col c) const {
1291 return _getCoeff(rows(id(r)),cols(id(c)));
1294 /// Set the lower bound of a column (i.e a variable)
1296 /// The lower bound of a variable (column) has to be given by an
1297 /// extended number of type Value, i.e. a finite number of type
1298 /// Value or -\ref INF.
1299 void colLowerBound(Col c, Value value) {
1300 _setColLowerBound(cols(id(c)),value);
1303 /// Get the lower bound of a column (i.e a variable)
1305 /// This function returns the lower bound for column (variable) \c c
1306 /// (this might be -\ref INF as well).
1307 ///\return The lower bound for column \c c
1308 Value colLowerBound(Col c) const {
1309 return _getColLowerBound(cols(id(c)));
1312 ///\brief Set the lower bound of several columns
1313 ///(i.e variables) at once
1315 ///This magic function takes a container as its argument
1316 ///and applies the function on all of its elements.
1317 ///The lower bound of a variable (column) has to be given by an
1318 ///extended number of type Value, i.e. a finite number of type
1319 ///Value or -\ref INF.
1322 void colLowerBound(T &t, Value value) { return 0;}
1325 typename enable_if<typename T::value_type::LpCol,void>::type
1326 colLowerBound(T &t, Value value,dummy<0> = 0) {
1327 for(typename T::iterator i=t.begin();i!=t.end();++i) {
1328 colLowerBound(*i, value);
1332 typename enable_if<typename T::value_type::second_type::LpCol,
1334 colLowerBound(T &t, Value value,dummy<1> = 1) {
1335 for(typename T::iterator i=t.begin();i!=t.end();++i) {
1336 colLowerBound(i->second, value);
1340 typename enable_if<typename T::MapIt::Value::LpCol,
1342 colLowerBound(T &t, Value value,dummy<2> = 2) {
1343 for(typename T::MapIt i(t); i!=INVALID; ++i){
1344 colLowerBound(*i, value);
1349 /// Set the upper bound of a column (i.e a variable)
1351 /// The upper bound of a variable (column) has to be given by an
1352 /// extended number of type Value, i.e. a finite number of type
1353 /// Value or \ref INF.
1354 void colUpperBound(Col c, Value value) {
1355 _setColUpperBound(cols(id(c)),value);
1358 /// Get the upper bound of a column (i.e a variable)
1360 /// This function returns the upper bound for column (variable) \c c
1361 /// (this might be \ref INF as well).
1362 /// \return The upper bound for column \c c
1363 Value colUpperBound(Col c) const {
1364 return _getColUpperBound(cols(id(c)));
1367 ///\brief Set the upper bound of several columns
1368 ///(i.e variables) at once
1370 ///This magic function takes a container as its argument
1371 ///and applies the function on all of its elements.
1372 ///The upper bound of a variable (column) has to be given by an
1373 ///extended number of type Value, i.e. a finite number of type
1374 ///Value or \ref INF.
1377 void colUpperBound(T &t, Value value) { return 0;}
1380 typename enable_if<typename T1::value_type::LpCol,void>::type
1381 colUpperBound(T1 &t, Value value,dummy<0> = 0) {
1382 for(typename T1::iterator i=t.begin();i!=t.end();++i) {
1383 colUpperBound(*i, value);
1387 typename enable_if<typename T1::value_type::second_type::LpCol,
1389 colUpperBound(T1 &t, Value value,dummy<1> = 1) {
1390 for(typename T1::iterator i=t.begin();i!=t.end();++i) {
1391 colUpperBound(i->second, value);
1395 typename enable_if<typename T1::MapIt::Value::LpCol,
1397 colUpperBound(T1 &t, Value value,dummy<2> = 2) {
1398 for(typename T1::MapIt i(t); i!=INVALID; ++i){
1399 colUpperBound(*i, value);
1404 /// Set the lower and the upper bounds of a column (i.e a variable)
1406 /// The lower and the upper bounds of
1407 /// a variable (column) have to be given by an
1408 /// extended number of type Value, i.e. a finite number of type
1409 /// Value, -\ref INF or \ref INF.
1410 void colBounds(Col c, Value lower, Value upper) {
1411 _setColLowerBound(cols(id(c)),lower);
1412 _setColUpperBound(cols(id(c)),upper);
1415 ///\brief Set the lower and the upper bound of several columns
1416 ///(i.e variables) at once
1418 ///This magic function takes a container as its argument
1419 ///and applies the function on all of its elements.
1420 /// The lower and the upper bounds of
1421 /// a variable (column) have to be given by an
1422 /// extended number of type Value, i.e. a finite number of type
1423 /// Value, -\ref INF or \ref INF.
1426 void colBounds(T &t, Value lower, Value upper) { return 0;}
1429 typename enable_if<typename T2::value_type::LpCol,void>::type
1430 colBounds(T2 &t, Value lower, Value upper,dummy<0> = 0) {
1431 for(typename T2::iterator i=t.begin();i!=t.end();++i) {
1432 colBounds(*i, lower, upper);
1436 typename enable_if<typename T2::value_type::second_type::LpCol, void>::type
1437 colBounds(T2 &t, Value lower, Value upper,dummy<1> = 1) {
1438 for(typename T2::iterator i=t.begin();i!=t.end();++i) {
1439 colBounds(i->second, lower, upper);
1443 typename enable_if<typename T2::MapIt::Value::LpCol, void>::type
1444 colBounds(T2 &t, Value lower, Value upper,dummy<2> = 2) {
1445 for(typename T2::MapIt i(t); i!=INVALID; ++i){
1446 colBounds(*i, lower, upper);
1451 /// Set the lower bound of a row (i.e a constraint)
1453 /// The lower bound of a constraint (row) has to be given by an
1454 /// extended number of type Value, i.e. a finite number of type
1455 /// Value or -\ref INF.
1456 void rowLowerBound(Row r, Value value) {
1457 _setRowLowerBound(rows(id(r)),value);
1460 /// Get the lower bound of a row (i.e a constraint)
1462 /// This function returns the lower bound for row (constraint) \c c
1463 /// (this might be -\ref INF as well).
1464 ///\return The lower bound for row \c r
1465 Value rowLowerBound(Row r) const {
1466 return _getRowLowerBound(rows(id(r)));
1469 /// Set the upper bound of a row (i.e a constraint)
1471 /// The upper bound of a constraint (row) has to be given by an
1472 /// extended number of type Value, i.e. a finite number of type
1473 /// Value or -\ref INF.
1474 void rowUpperBound(Row r, Value value) {
1475 _setRowUpperBound(rows(id(r)),value);
1478 /// Get the upper bound of a row (i.e a constraint)
1480 /// This function returns the upper bound for row (constraint) \c c
1481 /// (this might be -\ref INF as well).
1482 ///\return The upper bound for row \c r
1483 Value rowUpperBound(Row r) const {
1484 return _getRowUpperBound(rows(id(r)));
1487 ///Set an element of the objective function
1488 void objCoeff(Col c, Value v) {_setObjCoeff(cols(id(c)),v); };
1490 ///Get an element of the objective function
1491 Value objCoeff(Col c) const { return _getObjCoeff(cols(id(c))); };
1493 ///Set the objective function
1495 ///\param e is a linear expression of type \ref Expr.
1497 void obj(const Expr& e) {
1498 _setObjCoeffs(ExprIterator(e.comps.begin(), cols),
1499 ExprIterator(e.comps.end(), cols));
1500 obj_const_comp = *e;
1503 ///Get the objective function
1505 ///\return the objective function as a linear expression of type
1509 _getObjCoeffs(InsertIterator(e.comps, cols));
1510 *e = obj_const_comp;
1515 ///Set the direction of optimization
1516 void sense(Sense sense) { _setSense(sense); }
1518 ///Query the direction of the optimization
1519 Sense sense() const {return _getSense(); }
1521 ///Set the sense to maximization
1522 void max() { _setSense(MAX); }
1524 ///Set the sense to maximization
1525 void min() { _setSense(MIN); }
1527 ///Clears the problem
1528 void clear() { _clear(); }
1536 ///\relates LpBase::Expr
1538 inline LpBase::Expr operator+(const LpBase::Expr &a, const LpBase::Expr &b) {
1539 LpBase::Expr tmp(a);
1545 ///\relates LpBase::Expr
1547 inline LpBase::Expr operator-(const LpBase::Expr &a, const LpBase::Expr &b) {
1548 LpBase::Expr tmp(a);
1552 ///Multiply with constant
1554 ///\relates LpBase::Expr
1556 inline LpBase::Expr operator*(const LpBase::Expr &a, const LpBase::Value &b) {
1557 LpBase::Expr tmp(a);
1562 ///Multiply with constant
1564 ///\relates LpBase::Expr
1566 inline LpBase::Expr operator*(const LpBase::Value &a, const LpBase::Expr &b) {
1567 LpBase::Expr tmp(b);
1571 ///Divide with constant
1573 ///\relates LpBase::Expr
1575 inline LpBase::Expr operator/(const LpBase::Expr &a, const LpBase::Value &b) {
1576 LpBase::Expr tmp(a);
1581 ///Create constraint
1583 ///\relates LpBase::Constr
1585 inline LpBase::Constr operator<=(const LpBase::Expr &e,
1586 const LpBase::Expr &f) {
1587 return LpBase::Constr(0, f - e, LpBase::INF);
1590 ///Create constraint
1592 ///\relates LpBase::Constr
1594 inline LpBase::Constr operator<=(const LpBase::Value &e,
1595 const LpBase::Expr &f) {
1596 return LpBase::Constr(e, f, LpBase::NaN);
1599 ///Create constraint
1601 ///\relates LpBase::Constr
1603 inline LpBase::Constr operator<=(const LpBase::Expr &e,
1604 const LpBase::Value &f) {
1605 return LpBase::Constr(- LpBase::INF, e, f);
1608 ///Create constraint
1610 ///\relates LpBase::Constr
1612 inline LpBase::Constr operator>=(const LpBase::Expr &e,
1613 const LpBase::Expr &f) {
1614 return LpBase::Constr(0, e - f, LpBase::INF);
1618 ///Create constraint
1620 ///\relates LpBase::Constr
1622 inline LpBase::Constr operator>=(const LpBase::Value &e,
1623 const LpBase::Expr &f) {
1624 return LpBase::Constr(LpBase::NaN, f, e);
1628 ///Create constraint
1630 ///\relates LpBase::Constr
1632 inline LpBase::Constr operator>=(const LpBase::Expr &e,
1633 const LpBase::Value &f) {
1634 return LpBase::Constr(f, e, LpBase::INF);
1637 ///Create constraint
1639 ///\relates LpBase::Constr
1641 inline LpBase::Constr operator==(const LpBase::Expr &e,
1642 const LpBase::Value &f) {
1643 return LpBase::Constr(f, e, f);
1646 ///Create constraint
1648 ///\relates LpBase::Constr
1650 inline LpBase::Constr operator==(const LpBase::Expr &e,
1651 const LpBase::Expr &f) {
1652 return LpBase::Constr(0, f - e, 0);
1655 ///Create constraint
1657 ///\relates LpBase::Constr
1659 inline LpBase::Constr operator<=(const LpBase::Value &n,
1660 const LpBase::Constr &c) {
1661 LpBase::Constr tmp(c);
1662 LEMON_ASSERT(isNaN(tmp.lowerBound()), "Wrong LP constraint");
1666 ///Create constraint
1668 ///\relates LpBase::Constr
1670 inline LpBase::Constr operator<=(const LpBase::Constr &c,
1671 const LpBase::Value &n)
1673 LpBase::Constr tmp(c);
1674 LEMON_ASSERT(isNaN(tmp.upperBound()), "Wrong LP constraint");
1679 ///Create constraint
1681 ///\relates LpBase::Constr
1683 inline LpBase::Constr operator>=(const LpBase::Value &n,
1684 const LpBase::Constr &c) {
1685 LpBase::Constr tmp(c);
1686 LEMON_ASSERT(isNaN(tmp.upperBound()), "Wrong LP constraint");
1690 ///Create constraint
1692 ///\relates LpBase::Constr
1694 inline LpBase::Constr operator>=(const LpBase::Constr &c,
1695 const LpBase::Value &n)
1697 LpBase::Constr tmp(c);
1698 LEMON_ASSERT(isNaN(tmp.lowerBound()), "Wrong LP constraint");
1705 ///\relates LpBase::DualExpr
1707 inline LpBase::DualExpr operator+(const LpBase::DualExpr &a,
1708 const LpBase::DualExpr &b) {
1709 LpBase::DualExpr tmp(a);
1715 ///\relates LpBase::DualExpr
1717 inline LpBase::DualExpr operator-(const LpBase::DualExpr &a,
1718 const LpBase::DualExpr &b) {
1719 LpBase::DualExpr tmp(a);
1723 ///Multiply with constant
1725 ///\relates LpBase::DualExpr
1727 inline LpBase::DualExpr operator*(const LpBase::DualExpr &a,
1728 const LpBase::Value &b) {
1729 LpBase::DualExpr tmp(a);
1734 ///Multiply with constant
1736 ///\relates LpBase::DualExpr
1738 inline LpBase::DualExpr operator*(const LpBase::Value &a,
1739 const LpBase::DualExpr &b) {
1740 LpBase::DualExpr tmp(b);
1744 ///Divide with constant
1746 ///\relates LpBase::DualExpr
1748 inline LpBase::DualExpr operator/(const LpBase::DualExpr &a,
1749 const LpBase::Value &b) {
1750 LpBase::DualExpr tmp(a);
1755 /// \ingroup lp_group
1757 /// \brief Common base class for LP solvers
1759 /// This class is an abstract base class for LP solvers. This class
1760 /// provides a full interface for set and modify an LP problem,
1761 /// solve it and retrieve the solution. You can use one of the
1762 /// descendants as a concrete implementation, or the \c Lp
1763 /// default LP solver. However, if you would like to handle LP
1764 /// solvers as reference or pointer in a generic way, you can use
1765 /// this class directly.
1766 class LpSolver : virtual public LpBase {
1769 /// The problem types for primal and dual problems
1771 ///Feasible solution hasn't been found (but may exist).
1773 ///The problem has no feasible solution
1775 ///Feasible solution found
1777 ///Optimal solution exists and found
1779 ///The cost function is unbounded
1783 ///The basis status of variables
1785 /// The variable is in the basis
1787 /// The variable is free, but not basic
1789 /// The variable has active lower bound
1791 /// The variable has active upper bound
1793 /// The variable is non-basic and fixed
1799 virtual SolveExitStatus _solve() = 0;
1801 virtual Value _getPrimal(int i) const = 0;
1802 virtual Value _getDual(int i) const = 0;
1804 virtual Value _getPrimalRay(int i) const = 0;
1805 virtual Value _getDualRay(int i) const = 0;
1807 virtual Value _getPrimalValue() const = 0;
1809 virtual VarStatus _getColStatus(int i) const = 0;
1810 virtual VarStatus _getRowStatus(int i) const = 0;
1812 virtual ProblemType _getPrimalType() const = 0;
1813 virtual ProblemType _getDualType() const = 0;
1817 ///Allocate a new LP problem instance
1818 virtual LpSolver* newSolver() const = 0;
1819 ///Make a copy of the LP problem
1820 virtual LpSolver* cloneSolver() const = 0;
1822 ///\name Solve the LP
1826 ///\e Solve the LP problem at hand
1828 ///\return The result of the optimization procedure. Possible
1829 ///values and their meanings can be found in the documentation of
1830 ///\ref SolveExitStatus.
1831 SolveExitStatus solve() { return _solve(); }
1835 ///\name Obtain the solution
1839 /// The type of the primal problem
1840 ProblemType primalType() const {
1841 return _getPrimalType();
1844 /// The type of the dual problem
1845 ProblemType dualType() const {
1846 return _getDualType();
1849 /// Return the primal value of the column
1851 /// Return the primal value of the column.
1852 /// \pre The problem is solved.
1853 Value primal(Col c) const { return _getPrimal(cols(id(c))); }
1855 /// Return the primal value of the expression
1857 /// Return the primal value of the expression, i.e. the dot
1858 /// product of the primal solution and the expression.
1859 /// \pre The problem is solved.
1860 Value primal(const Expr& e) const {
1862 for (Expr::ConstCoeffIt c(e); c != INVALID; ++c) {
1863 res += *c * primal(c);
1867 /// Returns a component of the primal ray
1869 /// The primal ray is solution of the modified primal problem,
1870 /// where we change each finite bound to 0, and we looking for a
1871 /// negative objective value in case of minimization, and positive
1872 /// objective value for maximization. If there is such solution,
1873 /// that proofs the unsolvability of the dual problem, and if a
1874 /// feasible primal solution exists, then the unboundness of
1877 /// \pre The problem is solved and the dual problem is infeasible.
1878 /// \note Some solvers does not provide primal ray calculation
1880 Value primalRay(Col c) const { return _getPrimalRay(cols(id(c))); }
1882 /// Return the dual value of the row
1884 /// Return the dual value of the row.
1885 /// \pre The problem is solved.
1886 Value dual(Row r) const { return _getDual(rows(id(r))); }
1888 /// Return the dual value of the dual expression
1890 /// Return the dual value of the dual expression, i.e. the dot
1891 /// product of the dual solution and the dual expression.
1892 /// \pre The problem is solved.
1893 Value dual(const DualExpr& e) const {
1895 for (DualExpr::ConstCoeffIt r(e); r != INVALID; ++r) {
1896 res += *r * dual(r);
1901 /// Returns a component of the dual ray
1903 /// The dual ray is solution of the modified primal problem, where
1904 /// we change each finite bound to 0 (i.e. the objective function
1905 /// coefficients in the primal problem), and we looking for a
1906 /// ositive objective value. If there is such solution, that
1907 /// proofs the unsolvability of the primal problem, and if a
1908 /// feasible dual solution exists, then the unboundness of
1911 /// \pre The problem is solved and the primal problem is infeasible.
1912 /// \note Some solvers does not provide dual ray calculation
1914 Value dualRay(Row r) const { return _getDualRay(rows(id(r))); }
1916 /// Return the basis status of the column
1919 VarStatus colStatus(Col c) const { return _getColStatus(cols(id(c))); }
1921 /// Return the basis status of the row
1924 VarStatus rowStatus(Row r) const { return _getRowStatus(rows(id(r))); }
1926 ///The value of the objective function
1929 ///- \ref INF or -\ref INF means either infeasibility or unboundedness
1930 /// of the primal problem, depending on whether we minimize or maximize.
1931 ///- \ref NaN if no primal solution is found.
1932 ///- The (finite) objective value if an optimal solution is found.
1933 Value primal() const { return _getPrimalValue()+obj_const_comp;}
1941 /// \ingroup lp_group
1943 /// \brief Common base class for MIP solvers
1945 /// This class is an abstract base class for MIP solvers. This class
1946 /// provides a full interface for set and modify an MIP problem,
1947 /// solve it and retrieve the solution. You can use one of the
1948 /// descendants as a concrete implementation, or the \c Lp
1949 /// default MIP solver. However, if you would like to handle MIP
1950 /// solvers as reference or pointer in a generic way, you can use
1951 /// this class directly.
1952 class MipSolver : virtual public LpBase {
1955 /// The problem types for MIP problems
1957 ///Feasible solution hasn't been found (but may exist).
1959 ///The problem has no feasible solution
1961 ///Feasible solution found
1963 ///Optimal solution exists and found
1965 ///The cost function is unbounded
1967 ///The Mip or at least the relaxed problem is unbounded
1971 ///Allocate a new MIP problem instance
1972 virtual MipSolver* newSolver() const = 0;
1973 ///Make a copy of the MIP problem
1974 virtual MipSolver* cloneSolver() const = 0;
1976 ///\name Solve the MIP
1980 /// Solve the MIP problem at hand
1982 ///\return The result of the optimization procedure. Possible
1983 ///values and their meanings can be found in the documentation of
1984 ///\ref SolveExitStatus.
1985 SolveExitStatus solve() { return _solve(); }
1989 ///\name Setting column type
1992 ///Possible variable (column) types (e.g. real, integer, binary etc.)
1994 ///Continuous variable (default)
2000 ///Sets the type of the given column to the given type
2002 ///Sets the type of the given column to the given type.
2004 void colType(Col c, ColTypes col_type) {
2005 _setColType(cols(id(c)),col_type);
2008 ///Gives back the type of the column.
2010 ///Gives back the type of the column.
2012 ColTypes colType(Col c) const {
2013 return _getColType(cols(id(c)));
2017 ///\name Obtain the solution
2021 /// The type of the MIP problem
2022 ProblemType type() const {
2026 /// Return the value of the row in the solution
2028 /// Return the value of the row in the solution.
2029 /// \pre The problem is solved.
2030 Value sol(Col c) const { return _getSol(cols(id(c))); }
2032 /// Return the value of the expression in the solution
2034 /// Return the value of the expression in the solution, i.e. the
2035 /// dot product of the solution and the expression.
2036 /// \pre The problem is solved.
2037 Value sol(const Expr& e) const {
2039 for (Expr::ConstCoeffIt c(e); c != INVALID; ++c) {
2044 ///The value of the objective function
2047 ///- \ref INF or -\ref INF means either infeasibility or unboundedness
2048 /// of the problem, depending on whether we minimize or maximize.
2049 ///- \ref NaN if no primal solution is found.
2050 ///- The (finite) objective value if an optimal solution is found.
2051 Value solValue() const { return _getSolValue()+obj_const_comp;}
2056 virtual SolveExitStatus _solve() = 0;
2057 virtual ColTypes _getColType(int col) const = 0;
2058 virtual void _setColType(int col, ColTypes col_type) = 0;
2059 virtual ProblemType _getType() const = 0;
2060 virtual Value _getSol(int i) const = 0;
2061 virtual Value _getSolValue() const = 0;
2069 #endif //LEMON_LP_BASE_H