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 && !std::isnan(_lb);
602 ///Is the constraint upper bounded?
603 bool upperBounded() const {
604 return _ub != INF && !std::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
921 virtual LpBase* _newSolver() const = 0;
922 virtual LpBase* _cloneSolver() const = 0;
924 virtual int _addColId(int col) { return cols.addIndex(col); }
925 virtual int _addRowId(int row) { return rows.addIndex(row); }
927 virtual void _eraseColId(int col) { cols.eraseIndex(col); }
928 virtual void _eraseRowId(int row) { rows.eraseIndex(row); }
930 virtual int _addCol() = 0;
931 virtual int _addRow() = 0;
933 virtual void _eraseCol(int col) = 0;
934 virtual void _eraseRow(int row) = 0;
936 virtual void _getColName(int col, std::string& name) const = 0;
937 virtual void _setColName(int col, const std::string& name) = 0;
938 virtual int _colByName(const std::string& name) const = 0;
940 virtual void _getRowName(int row, std::string& name) const = 0;
941 virtual void _setRowName(int row, const std::string& name) = 0;
942 virtual int _rowByName(const std::string& name) const = 0;
944 virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e) = 0;
945 virtual void _getRowCoeffs(int i, InsertIterator b) const = 0;
947 virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e) = 0;
948 virtual void _getColCoeffs(int i, InsertIterator b) const = 0;
950 virtual void _setCoeff(int row, int col, Value value) = 0;
951 virtual Value _getCoeff(int row, int col) const = 0;
953 virtual void _setColLowerBound(int i, Value value) = 0;
954 virtual Value _getColLowerBound(int i) const = 0;
956 virtual void _setColUpperBound(int i, Value value) = 0;
957 virtual Value _getColUpperBound(int i) const = 0;
959 virtual void _setRowLowerBound(int i, Value value) = 0;
960 virtual Value _getRowLowerBound(int i) const = 0;
962 virtual void _setRowUpperBound(int i, Value value) = 0;
963 virtual Value _getRowUpperBound(int i) const = 0;
965 virtual void _setObjCoeffs(ExprIterator b, ExprIterator e) = 0;
966 virtual void _getObjCoeffs(InsertIterator b) const = 0;
968 virtual void _setObjCoeff(int i, Value obj_coef) = 0;
969 virtual Value _getObjCoeff(int i) const = 0;
971 virtual void _setSense(Sense) = 0;
972 virtual Sense _getSense() const = 0;
974 virtual void _clear() = 0;
976 virtual const char* _solverName() const = 0;
978 //Own protected stuff
980 //Constant component of the objective function
981 Value obj_const_comp;
983 LpBase() : rows(), cols(), obj_const_comp(0) {}
987 /// Virtual destructor
990 ///Creates a new LP problem
991 LpBase* newSolver() {return _newSolver();}
992 ///Makes a copy of the LP problem
993 LpBase* cloneSolver() {return _cloneSolver();}
995 ///Gives back the name of the solver.
996 const char* solverName() const {return _solverName();}
998 ///\name Build up and modify the LP
1002 ///Add a new empty column (i.e a new variable) to the LP
1003 Col addCol() { Col c; c._id = _addColId(_addCol()); return c;}
1005 ///\brief Adds several new columns (i.e variables) at once
1007 ///This magic function takes a container as its argument and fills
1008 ///its elements with new columns (i.e. variables)
1010 ///- a standard STL compatible iterable container with
1011 ///\ref Col as its \c values_type like
1013 ///std::vector<LpBase::Col>
1014 ///std::list<LpBase::Col>
1016 ///- a standard STL compatible iterable container with
1017 ///\ref Col as its \c mapped_type like
1019 ///std::map<AnyType,LpBase::Col>
1021 ///- an iterable lemon \ref concepts::WriteMap "write map" like
1023 ///ListGraph::NodeMap<LpBase::Col>
1024 ///ListGraph::ArcMap<LpBase::Col>
1026 ///\return The number of the created column.
1029 int addColSet(T &t) { return 0;}
1032 typename enable_if<typename T::value_type::LpCol,int>::type
1033 addColSet(T &t,dummy<0> = 0) {
1035 for(typename T::iterator i=t.begin();i!=t.end();++i) {*i=addCol();s++;}
1039 typename enable_if<typename T::value_type::second_type::LpCol,
1041 addColSet(T &t,dummy<1> = 1) {
1043 for(typename T::iterator i=t.begin();i!=t.end();++i) {
1050 typename enable_if<typename T::MapIt::Value::LpCol,
1052 addColSet(T &t,dummy<2> = 2) {
1054 for(typename T::MapIt i(t); i!=INVALID; ++i)
1063 ///Set a column (i.e a dual constraint) of the LP
1065 ///\param c is the column to be modified
1066 ///\param e is a dual linear expression (see \ref DualExpr)
1068 void col(Col c, const DualExpr &e) {
1070 _setColCoeffs(cols(id(c)), ExprIterator(e.comps.begin(), cols),
1071 ExprIterator(e.comps.end(), cols));
1074 ///Get a column (i.e a dual constraint) of the LP
1076 ///\param c is the column to get
1077 ///\return the dual expression associated to the column
1078 DualExpr col(Col c) const {
1080 _getColCoeffs(cols(id(c)), InsertIterator(e.comps, rows));
1084 ///Add a new column to the LP
1086 ///\param e is a dual linear expression (see \ref DualExpr)
1087 ///\param o is the corresponding component of the objective
1088 ///function. It is 0 by default.
1089 ///\return The created column.
1090 Col addCol(const DualExpr &e, Value o = 0) {
1097 ///Add a new empty row (i.e a new constraint) to the LP
1099 ///This function adds a new empty row (i.e a new constraint) to the LP.
1100 ///\return The created row
1101 Row addRow() { Row r; r._id = _addRowId(_addRow()); return r;}
1103 ///\brief Add several new rows (i.e constraints) at once
1105 ///This magic function takes a container as its argument and fills
1106 ///its elements with new row (i.e. variables)
1108 ///- a standard STL compatible iterable container with
1109 ///\ref Row as its \c values_type like
1111 ///std::vector<LpBase::Row>
1112 ///std::list<LpBase::Row>
1114 ///- a standard STL compatible iterable container with
1115 ///\ref Row as its \c mapped_type like
1117 ///std::map<AnyType,LpBase::Row>
1119 ///- an iterable lemon \ref concepts::WriteMap "write map" like
1121 ///ListGraph::NodeMap<LpBase::Row>
1122 ///ListGraph::ArcMap<LpBase::Row>
1124 ///\return The number of rows created.
1127 int addRowSet(T &t) { return 0;}
1130 typename enable_if<typename T::value_type::LpRow,int>::type
1131 addRowSet(T &t, dummy<0> = 0) {
1133 for(typename T::iterator i=t.begin();i!=t.end();++i) {*i=addRow();s++;}
1137 typename enable_if<typename T::value_type::second_type::LpRow, int>::type
1138 addRowSet(T &t, dummy<1> = 1) {
1140 for(typename T::iterator i=t.begin();i!=t.end();++i) {
1147 typename enable_if<typename T::MapIt::Value::LpRow, int>::type
1148 addRowSet(T &t, dummy<2> = 2) {
1150 for(typename T::MapIt i(t); i!=INVALID; ++i)
1159 ///Set a row (i.e a constraint) of the LP
1161 ///\param r is the row to be modified
1162 ///\param l is lower bound (-\ref INF means no bound)
1163 ///\param e is a linear expression (see \ref Expr)
1164 ///\param u is the upper bound (\ref INF means no bound)
1165 void row(Row r, Value l, const Expr &e, Value u) {
1167 _setRowCoeffs(rows(id(r)), ExprIterator(e.comps.begin(), cols),
1168 ExprIterator(e.comps.end(), cols));
1169 _setRowLowerBound(rows(id(r)),l - *e);
1170 _setRowUpperBound(rows(id(r)),u - *e);
1173 ///Set a row (i.e a constraint) of the LP
1175 ///\param r is the row to be modified
1176 ///\param c is a linear expression (see \ref Constr)
1177 void row(Row r, const Constr &c) {
1178 row(r, c.lowerBounded()?c.lowerBound():-INF,
1179 c.expr(), c.upperBounded()?c.upperBound():INF);
1183 ///Get a row (i.e a constraint) of the LP
1185 ///\param r is the row to get
1186 ///\return the expression associated to the row
1187 Expr row(Row r) const {
1189 _getRowCoeffs(rows(id(r)), InsertIterator(e.comps, cols));
1193 ///Add a new row (i.e a new constraint) to the LP
1195 ///\param l is the lower bound (-\ref INF means no bound)
1196 ///\param e is a linear expression (see \ref Expr)
1197 ///\param u is the upper bound (\ref INF means no bound)
1198 ///\return The created row.
1199 Row addRow(Value l,const Expr &e, Value u) {
1205 ///Add a new row (i.e a new constraint) to the LP
1207 ///\param c is a linear expression (see \ref Constr)
1208 ///\return The created row.
1209 Row addRow(const Constr &c) {
1214 ///Erase a column (i.e a variable) from the LP
1216 ///\param c is the column to be deleted
1218 _eraseCol(cols(id(c)));
1219 _eraseColId(cols(id(c)));
1221 ///Erase a row (i.e a constraint) from the LP
1223 ///\param r is the row to be deleted
1225 _eraseRow(rows(id(r)));
1226 _eraseRowId(rows(id(r)));
1229 /// Get the name of a column
1231 ///\param c is the coresponding column
1232 ///\return The name of the colunm
1233 std::string colName(Col c) const {
1235 _getColName(cols(id(c)), name);
1239 /// Set the name of a column
1241 ///\param c is the coresponding column
1242 ///\param name The name to be given
1243 void colName(Col c, const std::string& name) {
1244 _setColName(cols(id(c)), name);
1247 /// Get the column by its name
1249 ///\param name The name of the column
1250 ///\return the proper column or \c INVALID
1251 Col colByName(const std::string& name) const {
1252 int k = _colByName(name);
1253 return k != -1 ? Col(cols[k]) : Col(INVALID);
1256 /// Get the name of a row
1258 ///\param r is the coresponding row
1259 ///\return The name of the row
1260 std::string rowName(Row r) const {
1262 _getRowName(rows(id(r)), name);
1266 /// Set the name of a row
1268 ///\param r is the coresponding row
1269 ///\param name The name to be given
1270 void rowName(Row r, const std::string& name) {
1271 _setRowName(rows(id(r)), name);
1274 /// Get the row by its name
1276 ///\param name The name of the row
1277 ///\return the proper row or \c INVALID
1278 Row rowByName(const std::string& name) const {
1279 int k = _rowByName(name);
1280 return k != -1 ? Row(rows[k]) : Row(INVALID);
1283 /// Set an element of the coefficient matrix of the LP
1285 ///\param r is the row of the element to be modified
1286 ///\param c is the column of the element to be modified
1287 ///\param val is the new value of the coefficient
1288 void coeff(Row r, Col c, Value val) {
1289 _setCoeff(rows(id(r)),cols(id(c)), val);
1292 /// Get an element of the coefficient matrix of the LP
1294 ///\param r is the row of the element
1295 ///\param c is the column of the element
1296 ///\return the corresponding coefficient
1297 Value coeff(Row r, Col c) const {
1298 return _getCoeff(rows(id(r)),cols(id(c)));
1301 /// Set the lower bound of a column (i.e a variable)
1303 /// The lower bound of a variable (column) has to be given by an
1304 /// extended number of type Value, i.e. a finite number of type
1305 /// Value or -\ref INF.
1306 void colLowerBound(Col c, Value value) {
1307 _setColLowerBound(cols(id(c)),value);
1310 /// Get the lower bound of a column (i.e a variable)
1312 /// This function returns the lower bound for column (variable) \c c
1313 /// (this might be -\ref INF as well).
1314 ///\return The lower bound for column \c c
1315 Value colLowerBound(Col c) const {
1316 return _getColLowerBound(cols(id(c)));
1319 ///\brief Set the lower bound of several columns
1320 ///(i.e variables) at once
1322 ///This magic function takes a container as its argument
1323 ///and applies the function on all of its elements.
1324 ///The lower bound of a variable (column) has to be given by an
1325 ///extended number of type Value, i.e. a finite number of type
1326 ///Value or -\ref INF.
1329 void colLowerBound(T &t, Value value) { return 0;}
1332 typename enable_if<typename T::value_type::LpCol,void>::type
1333 colLowerBound(T &t, Value value,dummy<0> = 0) {
1334 for(typename T::iterator i=t.begin();i!=t.end();++i) {
1335 colLowerBound(*i, value);
1339 typename enable_if<typename T::value_type::second_type::LpCol,
1341 colLowerBound(T &t, Value value,dummy<1> = 1) {
1342 for(typename T::iterator i=t.begin();i!=t.end();++i) {
1343 colLowerBound(i->second, value);
1347 typename enable_if<typename T::MapIt::Value::LpCol,
1349 colLowerBound(T &t, Value value,dummy<2> = 2) {
1350 for(typename T::MapIt i(t); i!=INVALID; ++i){
1351 colLowerBound(*i, value);
1356 /// Set the upper bound of a column (i.e a variable)
1358 /// The upper bound of a variable (column) has to be given by an
1359 /// extended number of type Value, i.e. a finite number of type
1360 /// Value or \ref INF.
1361 void colUpperBound(Col c, Value value) {
1362 _setColUpperBound(cols(id(c)),value);
1365 /// Get the upper bound of a column (i.e a variable)
1367 /// This function returns the upper bound for column (variable) \c c
1368 /// (this might be \ref INF as well).
1369 /// \return The upper bound for column \c c
1370 Value colUpperBound(Col c) const {
1371 return _getColUpperBound(cols(id(c)));
1374 ///\brief Set the upper bound of several columns
1375 ///(i.e variables) at once
1377 ///This magic function takes a container as its argument
1378 ///and applies the function on all of its elements.
1379 ///The upper bound of a variable (column) has to be given by an
1380 ///extended number of type Value, i.e. a finite number of type
1381 ///Value or \ref INF.
1384 void colUpperBound(T &t, Value value) { return 0;}
1387 typename enable_if<typename T::value_type::LpCol,void>::type
1388 colUpperBound(T &t, Value value,dummy<0> = 0) {
1389 for(typename T::iterator i=t.begin();i!=t.end();++i) {
1390 colUpperBound(*i, value);
1394 typename enable_if<typename T::value_type::second_type::LpCol,
1396 colUpperBound(T &t, Value value,dummy<1> = 1) {
1397 for(typename T::iterator i=t.begin();i!=t.end();++i) {
1398 colUpperBound(i->second, value);
1402 typename enable_if<typename T::MapIt::Value::LpCol,
1404 colUpperBound(T &t, Value value,dummy<2> = 2) {
1405 for(typename T::MapIt i(t); i!=INVALID; ++i){
1406 colUpperBound(*i, value);
1411 /// Set the lower and the upper bounds of a column (i.e a variable)
1413 /// The lower and the upper bounds of
1414 /// a variable (column) have to be given by an
1415 /// extended number of type Value, i.e. a finite number of type
1416 /// Value, -\ref INF or \ref INF.
1417 void colBounds(Col c, Value lower, Value upper) {
1418 _setColLowerBound(cols(id(c)),lower);
1419 _setColUpperBound(cols(id(c)),upper);
1422 ///\brief Set the lower and the upper bound of several columns
1423 ///(i.e variables) at once
1425 ///This magic function takes a container as its argument
1426 ///and applies the function on all of its elements.
1427 /// The lower and the upper bounds of
1428 /// a variable (column) have to be given by an
1429 /// extended number of type Value, i.e. a finite number of type
1430 /// Value, -\ref INF or \ref INF.
1433 void colBounds(T &t, Value lower, Value upper) { return 0;}
1436 typename enable_if<typename T::value_type::LpCol,void>::type
1437 colBounds(T &t, Value lower, Value upper,dummy<0> = 0) {
1438 for(typename T::iterator i=t.begin();i!=t.end();++i) {
1439 colBounds(*i, lower, upper);
1443 typename enable_if<typename T::value_type::second_type::LpCol, void>::type
1444 colBounds(T &t, Value lower, Value upper,dummy<1> = 1) {
1445 for(typename T::iterator i=t.begin();i!=t.end();++i) {
1446 colBounds(i->second, lower, upper);
1450 typename enable_if<typename T::MapIt::Value::LpCol, void>::type
1451 colBounds(T &t, Value lower, Value upper,dummy<2> = 2) {
1452 for(typename T::MapIt i(t); i!=INVALID; ++i){
1453 colBounds(*i, lower, upper);
1458 /// Set the lower bound of a row (i.e a constraint)
1460 /// The lower bound of a constraint (row) has to be given by an
1461 /// extended number of type Value, i.e. a finite number of type
1462 /// Value or -\ref INF.
1463 void rowLowerBound(Row r, Value value) {
1464 _setRowLowerBound(rows(id(r)),value);
1467 /// Get the lower bound of a row (i.e a constraint)
1469 /// This function returns the lower bound for row (constraint) \c c
1470 /// (this might be -\ref INF as well).
1471 ///\return The lower bound for row \c r
1472 Value rowLowerBound(Row r) const {
1473 return _getRowLowerBound(rows(id(r)));
1476 /// Set the upper bound of a row (i.e a constraint)
1478 /// The upper bound of a constraint (row) has to be given by an
1479 /// extended number of type Value, i.e. a finite number of type
1480 /// Value or -\ref INF.
1481 void rowUpperBound(Row r, Value value) {
1482 _setRowUpperBound(rows(id(r)),value);
1485 /// Get the upper bound of a row (i.e a constraint)
1487 /// This function returns the upper bound for row (constraint) \c c
1488 /// (this might be -\ref INF as well).
1489 ///\return The upper bound for row \c r
1490 Value rowUpperBound(Row r) const {
1491 return _getRowUpperBound(rows(id(r)));
1494 ///Set an element of the objective function
1495 void objCoeff(Col c, Value v) {_setObjCoeff(cols(id(c)),v); };
1497 ///Get an element of the objective function
1498 Value objCoeff(Col c) const { return _getObjCoeff(cols(id(c))); };
1500 ///Set the objective function
1502 ///\param e is a linear expression of type \ref Expr.
1504 void obj(const Expr& e) {
1505 _setObjCoeffs(ExprIterator(e.comps.begin(), cols),
1506 ExprIterator(e.comps.end(), cols));
1507 obj_const_comp = *e;
1510 ///Get the objective function
1512 ///\return the objective function as a linear expression of type
1516 _getObjCoeffs(InsertIterator(e.comps, cols));
1517 *e = obj_const_comp;
1522 ///Set the direction of optimization
1523 void sense(Sense sense) { _setSense(sense); }
1525 ///Query the direction of the optimization
1526 Sense sense() const {return _getSense(); }
1528 ///Set the sense to maximization
1529 void max() { _setSense(MAX); }
1531 ///Set the sense to maximization
1532 void min() { _setSense(MIN); }
1534 ///Clears the problem
1535 void clear() { _clear(); }
1543 ///\relates LpBase::Expr
1545 inline LpBase::Expr operator+(const LpBase::Expr &a, const LpBase::Expr &b) {
1546 LpBase::Expr tmp(a);
1552 ///\relates LpBase::Expr
1554 inline LpBase::Expr operator-(const LpBase::Expr &a, const LpBase::Expr &b) {
1555 LpBase::Expr tmp(a);
1559 ///Multiply with constant
1561 ///\relates LpBase::Expr
1563 inline LpBase::Expr operator*(const LpBase::Expr &a, const LpBase::Value &b) {
1564 LpBase::Expr tmp(a);
1569 ///Multiply with constant
1571 ///\relates LpBase::Expr
1573 inline LpBase::Expr operator*(const LpBase::Value &a, const LpBase::Expr &b) {
1574 LpBase::Expr tmp(b);
1578 ///Divide with constant
1580 ///\relates LpBase::Expr
1582 inline LpBase::Expr operator/(const LpBase::Expr &a, const LpBase::Value &b) {
1583 LpBase::Expr tmp(a);
1588 ///Create constraint
1590 ///\relates LpBase::Constr
1592 inline LpBase::Constr operator<=(const LpBase::Expr &e,
1593 const LpBase::Expr &f) {
1594 return LpBase::Constr(0, f - e, LpBase::INF);
1597 ///Create constraint
1599 ///\relates LpBase::Constr
1601 inline LpBase::Constr operator<=(const LpBase::Value &e,
1602 const LpBase::Expr &f) {
1603 return LpBase::Constr(e, f, LpBase::NaN);
1606 ///Create constraint
1608 ///\relates LpBase::Constr
1610 inline LpBase::Constr operator<=(const LpBase::Expr &e,
1611 const LpBase::Value &f) {
1612 return LpBase::Constr(- LpBase::INF, e, f);
1615 ///Create constraint
1617 ///\relates LpBase::Constr
1619 inline LpBase::Constr operator>=(const LpBase::Expr &e,
1620 const LpBase::Expr &f) {
1621 return LpBase::Constr(0, e - f, LpBase::INF);
1625 ///Create constraint
1627 ///\relates LpBase::Constr
1629 inline LpBase::Constr operator>=(const LpBase::Value &e,
1630 const LpBase::Expr &f) {
1631 return LpBase::Constr(LpBase::NaN, f, e);
1635 ///Create constraint
1637 ///\relates LpBase::Constr
1639 inline LpBase::Constr operator>=(const LpBase::Expr &e,
1640 const LpBase::Value &f) {
1641 return LpBase::Constr(f, e, LpBase::INF);
1644 ///Create constraint
1646 ///\relates LpBase::Constr
1648 inline LpBase::Constr operator==(const LpBase::Expr &e,
1649 const LpBase::Value &f) {
1650 return LpBase::Constr(f, e, f);
1653 ///Create constraint
1655 ///\relates LpBase::Constr
1657 inline LpBase::Constr operator==(const LpBase::Expr &e,
1658 const LpBase::Expr &f) {
1659 return LpBase::Constr(0, f - e, 0);
1662 ///Create constraint
1664 ///\relates LpBase::Constr
1666 inline LpBase::Constr operator<=(const LpBase::Value &n,
1667 const LpBase::Constr &c) {
1668 LpBase::Constr tmp(c);
1669 LEMON_ASSERT(std::isnan(tmp.lowerBound()), "Wrong LP constraint");
1673 ///Create constraint
1675 ///\relates LpBase::Constr
1677 inline LpBase::Constr operator<=(const LpBase::Constr &c,
1678 const LpBase::Value &n)
1680 LpBase::Constr tmp(c);
1681 LEMON_ASSERT(std::isnan(tmp.upperBound()), "Wrong LP constraint");
1686 ///Create constraint
1688 ///\relates LpBase::Constr
1690 inline LpBase::Constr operator>=(const LpBase::Value &n,
1691 const LpBase::Constr &c) {
1692 LpBase::Constr tmp(c);
1693 LEMON_ASSERT(std::isnan(tmp.upperBound()), "Wrong LP constraint");
1697 ///Create constraint
1699 ///\relates LpBase::Constr
1701 inline LpBase::Constr operator>=(const LpBase::Constr &c,
1702 const LpBase::Value &n)
1704 LpBase::Constr tmp(c);
1705 LEMON_ASSERT(std::isnan(tmp.lowerBound()), "Wrong LP constraint");
1712 ///\relates LpBase::DualExpr
1714 inline LpBase::DualExpr operator+(const LpBase::DualExpr &a,
1715 const LpBase::DualExpr &b) {
1716 LpBase::DualExpr tmp(a);
1722 ///\relates LpBase::DualExpr
1724 inline LpBase::DualExpr operator-(const LpBase::DualExpr &a,
1725 const LpBase::DualExpr &b) {
1726 LpBase::DualExpr tmp(a);
1730 ///Multiply with constant
1732 ///\relates LpBase::DualExpr
1734 inline LpBase::DualExpr operator*(const LpBase::DualExpr &a,
1735 const LpBase::Value &b) {
1736 LpBase::DualExpr tmp(a);
1741 ///Multiply with constant
1743 ///\relates LpBase::DualExpr
1745 inline LpBase::DualExpr operator*(const LpBase::Value &a,
1746 const LpBase::DualExpr &b) {
1747 LpBase::DualExpr tmp(b);
1751 ///Divide with constant
1753 ///\relates LpBase::DualExpr
1755 inline LpBase::DualExpr operator/(const LpBase::DualExpr &a,
1756 const LpBase::Value &b) {
1757 LpBase::DualExpr tmp(a);
1762 /// \ingroup lp_group
1764 /// \brief Common base class for LP solvers
1766 /// This class is an abstract base class for LP solvers. This class
1767 /// provides a full interface for set and modify an LP problem,
1768 /// solve it and retrieve the solution. You can use one of the
1769 /// descendants as a concrete implementation, or the \c Lp
1770 /// default LP solver. However, if you would like to handle LP
1771 /// solvers as reference or pointer in a generic way, you can use
1772 /// this class directly.
1773 class LpSolver : virtual public LpBase {
1776 /// The problem types for primal and dual problems
1778 ///Feasible solution hasn't been found (but may exist).
1780 ///The problem has no feasible solution
1782 ///Feasible solution found
1784 ///Optimal solution exists and found
1786 ///The cost function is unbounded
1790 ///The basis status of variables
1792 /// The variable is in the basis
1794 /// The variable is free, but not basic
1796 /// The variable has active lower bound
1798 /// The variable has active upper bound
1800 /// The variable is non-basic and fixed
1806 virtual SolveExitStatus _solve() = 0;
1808 virtual Value _getPrimal(int i) const = 0;
1809 virtual Value _getDual(int i) const = 0;
1811 virtual Value _getPrimalRay(int i) const = 0;
1812 virtual Value _getDualRay(int i) const = 0;
1814 virtual Value _getPrimalValue() const = 0;
1816 virtual VarStatus _getColStatus(int i) const = 0;
1817 virtual VarStatus _getRowStatus(int i) const = 0;
1819 virtual ProblemType _getPrimalType() const = 0;
1820 virtual ProblemType _getDualType() const = 0;
1824 ///\name Solve the LP
1828 ///\e Solve the LP problem at hand
1830 ///\return The result of the optimization procedure. Possible
1831 ///values and their meanings can be found in the documentation of
1832 ///\ref SolveExitStatus.
1833 SolveExitStatus solve() { return _solve(); }
1837 ///\name Obtain the solution
1841 /// The type of the primal problem
1842 ProblemType primalType() const {
1843 return _getPrimalType();
1846 /// The type of the dual problem
1847 ProblemType dualType() const {
1848 return _getDualType();
1851 /// Return the primal value of the column
1853 /// Return the primal value of the column.
1854 /// \pre The problem is solved.
1855 Value primal(Col c) const { return _getPrimal(cols(id(c))); }
1857 /// Return the primal value of the expression
1859 /// Return the primal value of the expression, i.e. the dot
1860 /// product of the primal solution and the expression.
1861 /// \pre The problem is solved.
1862 Value primal(const Expr& e) const {
1864 for (Expr::ConstCoeffIt c(e); c != INVALID; ++c) {
1865 res += *c * primal(c);
1869 /// Returns a component of the primal ray
1871 /// The primal ray is solution of the modified primal problem,
1872 /// where we change each finite bound to 0, and we looking for a
1873 /// negative objective value in case of minimization, and positive
1874 /// objective value for maximization. If there is such solution,
1875 /// that proofs the unsolvability of the dual problem, and if a
1876 /// feasible primal solution exists, then the unboundness of
1879 /// \pre The problem is solved and the dual problem is infeasible.
1880 /// \note Some solvers does not provide primal ray calculation
1882 Value primalRay(Col c) const { return _getPrimalRay(cols(id(c))); }
1884 /// Return the dual value of the row
1886 /// Return the dual value of the row.
1887 /// \pre The problem is solved.
1888 Value dual(Row r) const { return _getDual(rows(id(r))); }
1890 /// Return the dual value of the dual expression
1892 /// Return the dual value of the dual expression, i.e. the dot
1893 /// product of the dual solution and the dual expression.
1894 /// \pre The problem is solved.
1895 Value dual(const DualExpr& e) const {
1897 for (DualExpr::ConstCoeffIt r(e); r != INVALID; ++r) {
1898 res += *r * dual(r);
1903 /// Returns a component of the dual ray
1905 /// The dual ray is solution of the modified primal problem, where
1906 /// we change each finite bound to 0 (i.e. the objective function
1907 /// coefficients in the primal problem), and we looking for a
1908 /// ositive objective value. If there is such solution, that
1909 /// proofs the unsolvability of the primal problem, and if a
1910 /// feasible dual solution exists, then the unboundness of
1913 /// \pre The problem is solved and the primal problem is infeasible.
1914 /// \note Some solvers does not provide dual ray calculation
1916 Value dualRay(Row r) const { return _getDualRay(rows(id(r))); }
1918 /// Return the basis status of the column
1921 VarStatus colStatus(Col c) const { return _getColStatus(cols(id(c))); }
1923 /// Return the basis status of the row
1926 VarStatus rowStatus(Row r) const { return _getRowStatus(rows(id(r))); }
1928 ///The value of the objective function
1931 ///- \ref INF or -\ref INF means either infeasibility or unboundedness
1932 /// of the primal problem, depending on whether we minimize or maximize.
1933 ///- \ref NaN if no primal solution is found.
1934 ///- The (finite) objective value if an optimal solution is found.
1935 Value primal() const { return _getPrimalValue()+obj_const_comp;}
1938 LpSolver* newSolver() {return _newSolver();}
1939 LpSolver* cloneSolver() {return _cloneSolver();}
1943 virtual LpSolver* _newSolver() const = 0;
1944 virtual LpSolver* _cloneSolver() const = 0;
1948 /// \ingroup lp_group
1950 /// \brief Common base class for MIP solvers
1952 /// This class is an abstract base class for MIP solvers. This class
1953 /// provides a full interface for set and modify an MIP problem,
1954 /// solve it and retrieve the solution. You can use one of the
1955 /// descendants as a concrete implementation, or the \c Lp
1956 /// default MIP solver. However, if you would like to handle MIP
1957 /// solvers as reference or pointer in a generic way, you can use
1958 /// this class directly.
1959 class MipSolver : virtual public LpBase {
1962 /// The problem types for MIP problems
1964 ///Feasible solution hasn't been found (but may exist).
1966 ///The problem has no feasible solution
1968 ///Feasible solution found
1970 ///Optimal solution exists and found
1972 ///The cost function is unbounded
1974 ///The Mip or at least the relaxed problem is unbounded
1978 ///\name Solve the MIP
1982 /// Solve the MIP problem at hand
1984 ///\return The result of the optimization procedure. Possible
1985 ///values and their meanings can be found in the documentation of
1986 ///\ref SolveExitStatus.
1987 SolveExitStatus solve() { return _solve(); }
1991 ///\name Setting column type
1994 ///Possible variable (column) types (e.g. real, integer, binary etc.)
1996 ///Continuous variable (default)
2002 ///Sets the type of the given column to the given type
2004 ///Sets the type of the given column to the given type.
2006 void colType(Col c, ColTypes col_type) {
2007 _setColType(cols(id(c)),col_type);
2010 ///Gives back the type of the column.
2012 ///Gives back the type of the column.
2014 ColTypes colType(Col c) const {
2015 return _getColType(cols(id(c)));
2019 ///\name Obtain the solution
2023 /// The type of the MIP problem
2024 ProblemType type() const {
2028 /// Return the value of the row in the solution
2030 /// Return the value of the row in the solution.
2031 /// \pre The problem is solved.
2032 Value sol(Col c) const { return _getSol(cols(id(c))); }
2034 /// Return the value of the expression in the solution
2036 /// Return the value of the expression in the solution, i.e. the
2037 /// dot product of the solution and the expression.
2038 /// \pre The problem is solved.
2039 Value sol(const Expr& e) const {
2041 for (Expr::ConstCoeffIt c(e); c != INVALID; ++c) {
2046 ///The value of the objective function
2049 ///- \ref INF or -\ref INF means either infeasibility or unboundedness
2050 /// of the problem, depending on whether we minimize or maximize.
2051 ///- \ref NaN if no primal solution is found.
2052 ///- The (finite) objective value if an optimal solution is found.
2053 Value solValue() const { return _getSolValue()+obj_const_comp;}
2058 virtual SolveExitStatus _solve() = 0;
2059 virtual ColTypes _getColType(int col) const = 0;
2060 virtual void _setColType(int col, ColTypes col_type) = 0;
2061 virtual ProblemType _getType() const = 0;
2062 virtual Value _getSol(int i) const = 0;
2063 virtual Value _getSolValue() const = 0;
2067 MipSolver* newSolver() {return _newSolver();}
2068 MipSolver* cloneSolver() {return _cloneSolver();}
2072 virtual MipSolver* _newSolver() const = 0;
2073 virtual MipSolver* _cloneSolver() const = 0;
2080 #endif //LEMON_LP_BASE_H