1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
3 * This file is a part of LEMON, a generic C++ optimization library.
5 * Copyright (C) 2003-2010
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 /// = 0. It means that the problem has been successfully solved: either
56 ///an optimal solution has been found or infeasibility/unboundedness
59 /// = 1. Any other case (including the case when some user specified
60 ///limit has been exceeded).
64 ///Direction of the optimization
72 ///Enum for \c messageLevel() parameter
74 /// No output (default value).
76 /// Error messages only.
87 ///The floating point type used by the solver
89 ///The infinity constant
90 static const Value INF;
91 ///The not a number constant
92 static const Value NaN;
99 ///Refer to a column of the LP.
101 ///This type is used to refer to a column of the LP.
103 ///Its value remains valid and correct even after the addition or erase of
106 ///\note This class is similar to other Item types in LEMON, like
107 ///Node and Arc types in digraph.
112 explicit Col(int id) : _id(id) {}
114 typedef Value ExprValue;
116 /// Default constructor
118 /// \warning The default constructor sets the Col to an
121 /// Invalid constructor \& conversion.
123 /// This constructor initializes the Col to be invalid.
124 /// \sa Invalid for more details.
125 Col(const Invalid&) : _id(-1) {}
126 /// Equality operator
128 /// Two \ref Col "Col"s are equal if and only if they point to
129 /// the same LP column or both are invalid.
130 bool operator==(Col c) const {return _id == c._id;}
131 /// Inequality operator
133 /// \sa operator==(Col c)
135 bool operator!=(Col c) const {return _id != c._id;}
136 /// Artificial ordering operator.
138 /// To allow the use of this object in std::map or similar
139 /// associative container we require this.
141 /// \note This operator only have to define some strict ordering of
142 /// the items; this order has nothing to do with the iteration
143 /// ordering of the items.
144 bool operator<(Col c) const {return _id < c._id;}
147 ///Iterator for iterate over the columns of an LP problem
149 /// Its usage is quite simple, for example, you can count the number
150 /// of columns in an LP \c lp:
153 /// for (LpBase::ColIt c(lp); c!=INVALID; ++c) ++count;
155 class ColIt : public Col {
156 const LpBase *_solver;
158 /// Default constructor
160 /// \warning The default constructor sets the iterator
161 /// to an undefined value.
163 /// Sets the iterator to the first Col
165 /// Sets the iterator to the first Col.
167 ColIt(const LpBase &solver) : _solver(&solver)
169 _solver->cols.firstItem(_id);
171 /// Invalid constructor \& conversion
173 /// Initialize the iterator to be invalid.
174 /// \sa Invalid for more details.
175 ColIt(const Invalid&) : Col(INVALID) {}
178 /// Assign the iterator to the next column.
182 _solver->cols.nextItem(_id);
187 /// \brief Returns the ID of the column.
188 static int id(const Col& col) { return col._id; }
189 /// \brief Returns the column with the given ID.
191 /// \pre The argument should be a valid column ID in the LP problem.
192 static Col colFromId(int id) { return Col(id); }
194 ///Refer to a row of the LP.
196 ///This type is used to refer to a row of the LP.
198 ///Its value remains valid and correct even after the addition or erase of
201 ///\note This class is similar to other Item types in LEMON, like
202 ///Node and Arc types in digraph.
207 explicit Row(int id) : _id(id) {}
209 typedef Value ExprValue;
211 /// Default constructor
213 /// \warning The default constructor sets the Row to an
216 /// Invalid constructor \& conversion.
218 /// This constructor initializes the Row to be invalid.
219 /// \sa Invalid for more details.
220 Row(const Invalid&) : _id(-1) {}
221 /// Equality operator
223 /// Two \ref Row "Row"s are equal if and only if they point to
224 /// the same LP row or both are invalid.
225 bool operator==(Row r) const {return _id == r._id;}
226 /// Inequality operator
228 /// \sa operator==(Row r)
230 bool operator!=(Row r) const {return _id != r._id;}
231 /// Artificial ordering operator.
233 /// To allow the use of this object in std::map or similar
234 /// associative container we require this.
236 /// \note This operator only have to define some strict ordering of
237 /// the items; this order has nothing to do with the iteration
238 /// ordering of the items.
239 bool operator<(Row r) const {return _id < r._id;}
242 ///Iterator for iterate over the rows of an LP problem
244 /// Its usage is quite simple, for example, you can count the number
245 /// of rows in an LP \c lp:
248 /// for (LpBase::RowIt c(lp); c!=INVALID; ++c) ++count;
250 class RowIt : public Row {
251 const LpBase *_solver;
253 /// Default constructor
255 /// \warning The default constructor sets the iterator
256 /// to an undefined value.
258 /// Sets the iterator to the first Row
260 /// Sets the iterator to the first Row.
262 RowIt(const LpBase &solver) : _solver(&solver)
264 _solver->rows.firstItem(_id);
266 /// Invalid constructor \& conversion
268 /// Initialize the iterator to be invalid.
269 /// \sa Invalid for more details.
270 RowIt(const Invalid&) : Row(INVALID) {}
273 /// Assign the iterator to the next row.
277 _solver->rows.nextItem(_id);
282 /// \brief Returns the ID of the row.
283 static int id(const Row& row) { return row._id; }
284 /// \brief Returns the row with the given ID.
286 /// \pre The argument should be a valid row ID in the LP problem.
287 static Row rowFromId(int id) { return Row(id); }
291 ///Linear expression of variables and a constant component
293 ///This data structure stores a linear expression of the variables
294 ///(\ref Col "Col"s) and also has a constant component.
296 ///There are several ways to access and modify the contents of this
303 ///or you can also iterate through its elements.
306 ///for(LpBase::Expr::ConstCoeffIt i(e);i!=INVALID;++i)
307 /// s+=*i * primal(i);
309 ///(This code computes the primal value of the expression).
310 ///- Numbers (<tt>double</tt>'s)
311 ///and variables (\ref Col "Col"s) directly convert to an
312 ///\ref Expr and the usual linear operations are defined, so
315 ///2*v-3.12*(v-w/2)+2
316 ///v*2.1+(3*v+(v*12+w+6)*3)/2
318 ///are valid expressions.
319 ///The usual assignment operations are also defined.
322 ///e+=2*v-3.12*(v-w/2)+2;
326 ///- The constant member can be set and read by dereference
327 /// operator (unary *)
338 /// The key type of the expression
339 typedef LpBase::Col Key;
340 /// The value type of the expression
341 typedef LpBase::Value Value;
345 std::map<int, Value> comps;
348 typedef True SolverExpr;
349 /// Default constructor
351 /// Construct an empty expression, the coefficients and
352 /// the constant component are initialized to zero.
353 Expr() : const_comp(0) {}
354 /// Construct an expression from a column
356 /// Construct an expression, which has a term with \c c variable
357 /// and 1.0 coefficient.
358 Expr(const Col &c) : const_comp(0) {
359 typedef std::map<int, Value>::value_type pair_type;
360 comps.insert(pair_type(id(c), 1));
362 /// Construct an expression from a constant
364 /// Construct an expression, which's constant component is \c v.
366 Expr(const Value &v) : const_comp(v) {}
367 /// Returns the coefficient of the column
368 Value operator[](const Col& c) const {
369 std::map<int, Value>::const_iterator it=comps.find(id(c));
370 if (it != comps.end()) {
376 /// Returns the coefficient of the column
377 Value& operator[](const Col& c) {
380 /// Sets the coefficient of the column
381 void set(const Col &c, const Value &v) {
383 typedef std::map<int, Value>::value_type pair_type;
384 comps.insert(pair_type(id(c), v));
389 /// Returns the constant component of the expression
390 Value& operator*() { return const_comp; }
391 /// Returns the constant component of the expression
392 const Value& operator*() const { return const_comp; }
393 /// \brief Removes the coefficients which's absolute value does
394 /// not exceed \c epsilon. It also sets to zero the constant
395 /// component, if it does not exceed epsilon in absolute value.
396 void simplify(Value epsilon = 0.0) {
397 std::map<int, Value>::iterator it=comps.begin();
398 while (it != comps.end()) {
399 std::map<int, Value>::iterator jt=it;
401 if (std::fabs((*it).second) <= epsilon) comps.erase(it);
404 if (std::fabs(const_comp) <= epsilon) const_comp = 0;
407 void simplify(Value epsilon = 0.0) const {
408 const_cast<Expr*>(this)->simplify(epsilon);
411 ///Sets all coefficients and the constant component to 0.
417 ///Compound assignment
418 Expr &operator+=(const Expr &e) {
419 for (std::map<int, Value>::const_iterator it=e.comps.begin();
420 it!=e.comps.end(); ++it)
421 comps[it->first]+=it->second;
422 const_comp+=e.const_comp;
425 ///Compound assignment
426 Expr &operator-=(const Expr &e) {
427 for (std::map<int, Value>::const_iterator it=e.comps.begin();
428 it!=e.comps.end(); ++it)
429 comps[it->first]-=it->second;
430 const_comp-=e.const_comp;
433 ///Multiply with a constant
434 Expr &operator*=(const Value &v) {
435 for (std::map<int, Value>::iterator it=comps.begin();
436 it!=comps.end(); ++it)
441 ///Division with a constant
442 Expr &operator/=(const Value &c) {
443 for (std::map<int, Value>::iterator it=comps.begin();
444 it!=comps.end(); ++it)
450 ///Iterator over the expression
452 ///The iterator iterates over the terms of the expression.
456 ///for(LpBase::Expr::CoeffIt i(e);i!=INVALID;++i)
457 /// s+= *i * primal(i);
462 std::map<int, Value>::iterator _it, _end;
466 /// Sets the iterator to the first term
468 /// Sets the iterator to the first term of the expression.
471 : _it(e.comps.begin()), _end(e.comps.end()){}
473 /// Convert the iterator to the column of the term
474 operator Col() const {
475 return colFromId(_it->first);
478 /// Returns the coefficient of the term
479 Value& operator*() { return _it->second; }
481 /// Returns the coefficient of the term
482 const Value& operator*() const { return _it->second; }
485 /// Assign the iterator to the next term.
487 CoeffIt& operator++() { ++_it; return *this; }
489 /// Equality operator
490 bool operator==(Invalid) const { return _it == _end; }
491 /// Inequality operator
492 bool operator!=(Invalid) const { return _it != _end; }
495 /// Const iterator over the expression
497 ///The iterator iterates over the terms of the expression.
501 ///for(LpBase::Expr::ConstCoeffIt i(e);i!=INVALID;++i)
502 /// s+=*i * primal(i);
507 std::map<int, Value>::const_iterator _it, _end;
511 /// Sets the iterator to the first term
513 /// Sets the iterator to the first term of the expression.
515 ConstCoeffIt(const Expr& e)
516 : _it(e.comps.begin()), _end(e.comps.end()){}
518 /// Convert the iterator to the column of the term
519 operator Col() const {
520 return colFromId(_it->first);
523 /// Returns the coefficient of the term
524 const Value& operator*() const { return _it->second; }
528 /// Assign the iterator to the next term.
530 ConstCoeffIt& operator++() { ++_it; return *this; }
532 /// Equality operator
533 bool operator==(Invalid) const { return _it == _end; }
534 /// Inequality operator
535 bool operator!=(Invalid) const { return _it != _end; }
542 ///This data stucture represents a linear constraint in the LP.
543 ///Basically it is a linear expression with a lower or an upper bound
544 ///(or both). These parts of the constraint can be obtained by the member
545 ///functions \ref expr(), \ref lowerBound() and \ref upperBound(),
547 ///There are two ways to construct a constraint.
548 ///- You can set the linear expression and the bounds directly
549 /// by the functions above.
550 ///- The operators <tt>\<=</tt>, <tt>==</tt> and <tt>\>=</tt>
551 /// are defined between expressions, or even between constraints whenever
552 /// it makes sense. Therefore if \c e and \c f are linear expressions and
553 /// \c s and \c t are numbers, then the followings are valid expressions
554 /// and thus they can be used directly e.g. in \ref addRow() whenever
563 ///\warning The validity of a constraint is checked only at run
564 ///time, so e.g. \ref addRow(<tt>x[1]\<=x[2]<=5</tt>) will
565 ///compile, but will fail an assertion.
569 typedef LpBase::Expr Expr;
570 typedef Expr::Key Key;
571 typedef Expr::Value Value;
578 Constr() : _expr(), _lb(NaN), _ub(NaN) {}
580 Constr(Value lb, const Expr &e, Value ub) :
581 _expr(e), _lb(lb), _ub(ub) {}
582 Constr(const Expr &e) :
583 _expr(e), _lb(NaN), _ub(NaN) {}
591 ///Reference to the linear expression
592 Expr &expr() { return _expr; }
593 ///Cont reference to the linear expression
594 const Expr &expr() const { return _expr; }
595 ///Reference to the lower bound.
598 ///- \ref INF "INF": the constraint is lower unbounded.
599 ///- \ref NaN "NaN": lower bound has not been set.
600 ///- finite number: the lower bound
601 Value &lowerBound() { return _lb; }
602 ///The const version of \ref lowerBound()
603 const Value &lowerBound() const { return _lb; }
604 ///Reference to the upper bound.
607 ///- \ref INF "INF": the constraint is upper unbounded.
608 ///- \ref NaN "NaN": upper bound has not been set.
609 ///- finite number: the upper bound
610 Value &upperBound() { return _ub; }
611 ///The const version of \ref upperBound()
612 const Value &upperBound() const { return _ub; }
613 ///Is the constraint lower bounded?
614 bool lowerBounded() const {
615 return _lb != -INF && !isNaN(_lb);
617 ///Is the constraint upper bounded?
618 bool upperBounded() const {
619 return _ub != INF && !isNaN(_ub);
624 ///Linear expression of rows
626 ///This data structure represents a column of the matrix,
627 ///thas is it strores a linear expression of the dual variables
628 ///(\ref Row "Row"s).
630 ///There are several ways to access and modify the contents of this
637 ///or you can also iterate through its elements.
640 ///for(LpBase::DualExpr::ConstCoeffIt i(e);i!=INVALID;++i)
643 ///(This code computes the sum of all coefficients).
644 ///- Numbers (<tt>double</tt>'s)
645 ///and variables (\ref Row "Row"s) directly convert to an
646 ///\ref DualExpr and the usual linear operations are defined, so
650 ///v*2.1+(3*v+(v*12+w)*3)/2
652 ///are valid \ref DualExpr dual expressions.
653 ///The usual assignment operations are also defined.
656 ///e+=2*v-3.12*(v-w/2);
665 /// The key type of the expression
666 typedef LpBase::Row Key;
667 /// The value type of the expression
668 typedef LpBase::Value Value;
671 std::map<int, Value> comps;
674 typedef True SolverExpr;
675 /// Default constructor
677 /// Construct an empty expression, the coefficients are
678 /// initialized to zero.
680 /// Construct an expression from a row
682 /// Construct an expression, which has a term with \c r dual
683 /// variable and 1.0 coefficient.
684 DualExpr(const Row &r) {
685 typedef std::map<int, Value>::value_type pair_type;
686 comps.insert(pair_type(id(r), 1));
688 /// Returns the coefficient of the row
689 Value operator[](const Row& r) const {
690 std::map<int, Value>::const_iterator it = comps.find(id(r));
691 if (it != comps.end()) {
697 /// Returns the coefficient of the row
698 Value& operator[](const Row& r) {
701 /// Sets the coefficient of the row
702 void set(const Row &r, const Value &v) {
704 typedef std::map<int, Value>::value_type pair_type;
705 comps.insert(pair_type(id(r), v));
710 /// \brief Removes the coefficients which's absolute value does
711 /// not exceed \c epsilon.
712 void simplify(Value epsilon = 0.0) {
713 std::map<int, Value>::iterator it=comps.begin();
714 while (it != comps.end()) {
715 std::map<int, Value>::iterator jt=it;
717 if (std::fabs((*it).second) <= epsilon) comps.erase(it);
722 void simplify(Value epsilon = 0.0) const {
723 const_cast<DualExpr*>(this)->simplify(epsilon);
726 ///Sets all coefficients to 0.
730 ///Compound assignment
731 DualExpr &operator+=(const DualExpr &e) {
732 for (std::map<int, Value>::const_iterator it=e.comps.begin();
733 it!=e.comps.end(); ++it)
734 comps[it->first]+=it->second;
737 ///Compound assignment
738 DualExpr &operator-=(const DualExpr &e) {
739 for (std::map<int, Value>::const_iterator it=e.comps.begin();
740 it!=e.comps.end(); ++it)
741 comps[it->first]-=it->second;
744 ///Multiply with a constant
745 DualExpr &operator*=(const Value &v) {
746 for (std::map<int, Value>::iterator it=comps.begin();
747 it!=comps.end(); ++it)
751 ///Division with a constant
752 DualExpr &operator/=(const Value &v) {
753 for (std::map<int, Value>::iterator it=comps.begin();
754 it!=comps.end(); ++it)
759 ///Iterator over the expression
761 ///The iterator iterates over the terms of the expression.
765 ///for(LpBase::DualExpr::CoeffIt i(e);i!=INVALID;++i)
766 /// s+= *i * dual(i);
771 std::map<int, Value>::iterator _it, _end;
775 /// Sets the iterator to the first term
777 /// Sets the iterator to the first term of the expression.
780 : _it(e.comps.begin()), _end(e.comps.end()){}
782 /// Convert the iterator to the row of the term
783 operator Row() const {
784 return rowFromId(_it->first);
787 /// Returns the coefficient of the term
788 Value& operator*() { return _it->second; }
790 /// Returns the coefficient of the term
791 const Value& operator*() const { return _it->second; }
795 /// Assign the iterator to the next term.
797 CoeffIt& operator++() { ++_it; return *this; }
799 /// Equality operator
800 bool operator==(Invalid) const { return _it == _end; }
801 /// Inequality operator
802 bool operator!=(Invalid) const { return _it != _end; }
805 ///Iterator over the expression
807 ///The iterator iterates over the terms of the expression.
811 ///for(LpBase::DualExpr::ConstCoeffIt i(e);i!=INVALID;++i)
812 /// s+= *i * dual(i);
817 std::map<int, Value>::const_iterator _it, _end;
821 /// Sets the iterator to the first term
823 /// Sets the iterator to the first term of the expression.
825 ConstCoeffIt(const DualExpr& e)
826 : _it(e.comps.begin()), _end(e.comps.end()){}
828 /// Convert the iterator to the row of the term
829 operator Row() const {
830 return rowFromId(_it->first);
833 /// Returns the coefficient of the term
834 const Value& operator*() const { return _it->second; }
838 /// Assign the iterator to the next term.
840 ConstCoeffIt& operator++() { ++_it; return *this; }
842 /// Equality operator
843 bool operator==(Invalid) const { return _it == _end; }
844 /// Inequality operator
845 bool operator!=(Invalid) const { return _it != _end; }
852 class InsertIterator {
855 std::map<int, Value>& _host;
856 const _solver_bits::VarIndex& _index;
860 typedef std::output_iterator_tag iterator_category;
861 typedef void difference_type;
862 typedef void value_type;
863 typedef void reference;
864 typedef void pointer;
866 InsertIterator(std::map<int, Value>& host,
867 const _solver_bits::VarIndex& index)
868 : _host(host), _index(index) {}
870 InsertIterator& operator=(const std::pair<int, Value>& value) {
871 typedef std::map<int, Value>::value_type pair_type;
872 _host.insert(pair_type(_index[value.first], value.second));
876 InsertIterator& operator*() { return *this; }
877 InsertIterator& operator++() { return *this; }
878 InsertIterator operator++(int) { return *this; }
884 std::map<int, Value>::const_iterator _host_it;
885 const _solver_bits::VarIndex& _index;
888 typedef std::bidirectional_iterator_tag iterator_category;
889 typedef std::ptrdiff_t difference_type;
890 typedef const std::pair<int, Value> value_type;
891 typedef value_type reference;
895 pointer(value_type& _value) : value(_value) {}
896 value_type* operator->() { return &value; }
901 ExprIterator(const std::map<int, Value>::const_iterator& host_it,
902 const _solver_bits::VarIndex& index)
903 : _host_it(host_it), _index(index) {}
905 reference operator*() {
906 return std::make_pair(_index(_host_it->first), _host_it->second);
909 pointer operator->() {
910 return pointer(operator*());
913 ExprIterator& operator++() { ++_host_it; return *this; }
914 ExprIterator operator++(int) {
915 ExprIterator tmp(*this); ++_host_it; return tmp;
918 ExprIterator& operator--() { --_host_it; return *this; }
919 ExprIterator operator--(int) {
920 ExprIterator tmp(*this); --_host_it; return tmp;
923 bool operator==(const ExprIterator& it) const {
924 return _host_it == it._host_it;
927 bool operator!=(const ExprIterator& it) const {
928 return _host_it != it._host_it;
935 //Abstract virtual functions
937 virtual int _addColId(int col) { return cols.addIndex(col); }
938 virtual int _addRowId(int row) { return rows.addIndex(row); }
940 virtual void _eraseColId(int col) { cols.eraseIndex(col); }
941 virtual void _eraseRowId(int row) { rows.eraseIndex(row); }
943 virtual int _addCol() = 0;
944 virtual int _addRow() = 0;
946 virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
948 _setRowCoeffs(row, b, e);
949 _setRowLowerBound(row, l);
950 _setRowUpperBound(row, u);
954 virtual void _eraseCol(int col) = 0;
955 virtual void _eraseRow(int row) = 0;
957 virtual void _getColName(int col, std::string& name) const = 0;
958 virtual void _setColName(int col, const std::string& name) = 0;
959 virtual int _colByName(const std::string& name) const = 0;
961 virtual void _getRowName(int row, std::string& name) const = 0;
962 virtual void _setRowName(int row, const std::string& name) = 0;
963 virtual int _rowByName(const std::string& name) const = 0;
965 virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e) = 0;
966 virtual void _getRowCoeffs(int i, InsertIterator b) const = 0;
968 virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e) = 0;
969 virtual void _getColCoeffs(int i, InsertIterator b) const = 0;
971 virtual void _setCoeff(int row, int col, Value value) = 0;
972 virtual Value _getCoeff(int row, int col) const = 0;
974 virtual void _setColLowerBound(int i, Value value) = 0;
975 virtual Value _getColLowerBound(int i) const = 0;
977 virtual void _setColUpperBound(int i, Value value) = 0;
978 virtual Value _getColUpperBound(int i) const = 0;
980 virtual void _setRowLowerBound(int i, Value value) = 0;
981 virtual Value _getRowLowerBound(int i) const = 0;
983 virtual void _setRowUpperBound(int i, Value value) = 0;
984 virtual Value _getRowUpperBound(int i) const = 0;
986 virtual void _setObjCoeffs(ExprIterator b, ExprIterator e) = 0;
987 virtual void _getObjCoeffs(InsertIterator b) const = 0;
989 virtual void _setObjCoeff(int i, Value obj_coef) = 0;
990 virtual Value _getObjCoeff(int i) const = 0;
992 virtual void _setSense(Sense) = 0;
993 virtual Sense _getSense() const = 0;
995 virtual void _clear() = 0;
997 virtual const char* _solverName() const = 0;
999 virtual void _messageLevel(MessageLevel level) = 0;
1001 //Own protected stuff
1003 //Constant component of the objective function
1004 Value obj_const_comp;
1006 LpBase() : rows(), cols(), obj_const_comp(0) {}
1011 class UnsupportedFormatError : public Exception
1013 std::string _format;
1014 mutable std::string _what;
1016 explicit UnsupportedFormatError(std::string format) throw()
1017 : _format(format) { }
1018 virtual ~UnsupportedFormatError() throw() {}
1019 virtual const char* what() const throw() {
1022 std::ostringstream oss;
1023 oss << "lemon::UnsupportedFormatError: " << _format;
1027 if (!_what.empty()) return _what.c_str();
1028 else return "lemon::UnsupportedFormatError";
1033 virtual void _write(std::string, std::string format) const
1035 throw UnsupportedFormatError(format);
1040 /// Virtual destructor
1041 virtual ~LpBase() {}
1043 ///Gives back the name of the solver.
1044 const char* solverName() const {return _solverName();}
1046 ///\name Build Up and Modify the LP
1050 ///Add a new empty column (i.e a new variable) to the LP
1051 Col addCol() { Col c; c._id = _addColId(_addCol()); return c;}
1053 ///\brief Adds several new columns (i.e variables) at once
1055 ///This magic function takes a container as its argument and fills
1056 ///its elements with new columns (i.e. variables)
1058 ///- a standard STL compatible iterable container with
1059 ///\ref Col as its \c values_type like
1061 ///std::vector<LpBase::Col>
1062 ///std::list<LpBase::Col>
1064 ///- a standard STL compatible iterable container with
1065 ///\ref Col as its \c mapped_type like
1067 ///std::map<AnyType,LpBase::Col>
1069 ///- an iterable lemon \ref concepts::WriteMap "write map" like
1071 ///ListGraph::NodeMap<LpBase::Col>
1072 ///ListGraph::ArcMap<LpBase::Col>
1074 ///\return The number of the created column.
1077 int addColSet(T &t) { return 0;}
1080 typename enable_if<typename T::value_type::LpCol,int>::type
1081 addColSet(T &t,dummy<0> = 0) {
1083 for(typename T::iterator i=t.begin();i!=t.end();++i) {*i=addCol();s++;}
1087 typename enable_if<typename T::value_type::second_type::LpCol,
1089 addColSet(T &t,dummy<1> = 1) {
1091 for(typename T::iterator i=t.begin();i!=t.end();++i) {
1098 typename enable_if<typename T::MapIt::Value::LpCol,
1100 addColSet(T &t,dummy<2> = 2) {
1102 for(typename T::MapIt i(t); i!=INVALID; ++i)
1111 ///Set a column (i.e a dual constraint) of the LP
1113 ///\param c is the column to be modified
1114 ///\param e is a dual linear expression (see \ref DualExpr)
1116 void col(Col c, const DualExpr &e) {
1118 _setColCoeffs(cols(id(c)), ExprIterator(e.comps.begin(), rows),
1119 ExprIterator(e.comps.end(), rows));
1122 ///Get a column (i.e a dual constraint) of the LP
1124 ///\param c is the column to get
1125 ///\return the dual expression associated to the column
1126 DualExpr col(Col c) const {
1128 _getColCoeffs(cols(id(c)), InsertIterator(e.comps, rows));
1132 ///Add a new column to the LP
1134 ///\param e is a dual linear expression (see \ref DualExpr)
1135 ///\param o is the corresponding component of the objective
1136 ///function. It is 0 by default.
1137 ///\return The created column.
1138 Col addCol(const DualExpr &e, Value o = 0) {
1145 ///Add a new empty row (i.e a new constraint) to the LP
1147 ///This function adds a new empty row (i.e a new constraint) to the LP.
1148 ///\return The created row
1149 Row addRow() { Row r; r._id = _addRowId(_addRow()); return r;}
1151 ///\brief Add several new rows (i.e constraints) at once
1153 ///This magic function takes a container as its argument and fills
1154 ///its elements with new row (i.e. variables)
1156 ///- a standard STL compatible iterable container with
1157 ///\ref Row as its \c values_type like
1159 ///std::vector<LpBase::Row>
1160 ///std::list<LpBase::Row>
1162 ///- a standard STL compatible iterable container with
1163 ///\ref Row as its \c mapped_type like
1165 ///std::map<AnyType,LpBase::Row>
1167 ///- an iterable lemon \ref concepts::WriteMap "write map" like
1169 ///ListGraph::NodeMap<LpBase::Row>
1170 ///ListGraph::ArcMap<LpBase::Row>
1172 ///\return The number of rows created.
1175 int addRowSet(T &t) { return 0;}
1178 typename enable_if<typename T::value_type::LpRow,int>::type
1179 addRowSet(T &t, dummy<0> = 0) {
1181 for(typename T::iterator i=t.begin();i!=t.end();++i) {*i=addRow();s++;}
1185 typename enable_if<typename T::value_type::second_type::LpRow, int>::type
1186 addRowSet(T &t, dummy<1> = 1) {
1188 for(typename T::iterator i=t.begin();i!=t.end();++i) {
1195 typename enable_if<typename T::MapIt::Value::LpRow, int>::type
1196 addRowSet(T &t, dummy<2> = 2) {
1198 for(typename T::MapIt i(t); i!=INVALID; ++i)
1207 ///Set a row (i.e a constraint) of the LP
1209 ///\param r is the row to be modified
1210 ///\param l is lower bound (-\ref INF means no bound)
1211 ///\param e is a linear expression (see \ref Expr)
1212 ///\param u is the upper bound (\ref INF means no bound)
1213 void row(Row r, Value l, const Expr &e, Value u) {
1215 _setRowCoeffs(rows(id(r)), ExprIterator(e.comps.begin(), cols),
1216 ExprIterator(e.comps.end(), cols));
1217 _setRowLowerBound(rows(id(r)),l - *e);
1218 _setRowUpperBound(rows(id(r)),u - *e);
1221 ///Set a row (i.e a constraint) of the LP
1223 ///\param r is the row to be modified
1224 ///\param c is a linear expression (see \ref Constr)
1225 void row(Row r, const Constr &c) {
1226 row(r, c.lowerBounded()?c.lowerBound():-INF,
1227 c.expr(), c.upperBounded()?c.upperBound():INF);
1231 ///Get a row (i.e a constraint) of the LP
1233 ///\param r is the row to get
1234 ///\return the expression associated to the row
1235 Expr row(Row r) const {
1237 _getRowCoeffs(rows(id(r)), InsertIterator(e.comps, cols));
1241 ///Add a new row (i.e a new constraint) to the LP
1243 ///\param l is the lower bound (-\ref INF means no bound)
1244 ///\param e is a linear expression (see \ref Expr)
1245 ///\param u is the upper bound (\ref INF means no bound)
1246 ///\return The created row.
1247 Row addRow(Value l,const Expr &e, Value u) {
1250 r._id = _addRowId(_addRow(l - *e, ExprIterator(e.comps.begin(), cols),
1251 ExprIterator(e.comps.end(), cols), u - *e));
1255 ///Add a new row (i.e a new constraint) to the LP
1257 ///\param c is a linear expression (see \ref Constr)
1258 ///\return The created row.
1259 Row addRow(const Constr &c) {
1261 c.expr().simplify();
1262 r._id = _addRowId(_addRow(c.lowerBounded()?c.lowerBound()-*c.expr():-INF,
1263 ExprIterator(c.expr().comps.begin(), cols),
1264 ExprIterator(c.expr().comps.end(), cols),
1265 c.upperBounded()?c.upperBound()-*c.expr():INF));
1268 ///Erase a column (i.e a variable) from the LP
1270 ///\param c is the column to be deleted
1272 _eraseCol(cols(id(c)));
1273 _eraseColId(cols(id(c)));
1275 ///Erase a row (i.e a constraint) from the LP
1277 ///\param r is the row to be deleted
1279 _eraseRow(rows(id(r)));
1280 _eraseRowId(rows(id(r)));
1283 /// Get the name of a column
1285 ///\param c is the coresponding column
1286 ///\return The name of the colunm
1287 std::string colName(Col c) const {
1289 _getColName(cols(id(c)), name);
1293 /// Set the name of a column
1295 ///\param c is the coresponding column
1296 ///\param name The name to be given
1297 void colName(Col c, const std::string& name) {
1298 _setColName(cols(id(c)), name);
1301 /// Get the column by its name
1303 ///\param name The name of the column
1304 ///\return the proper column or \c INVALID
1305 Col colByName(const std::string& name) const {
1306 int k = _colByName(name);
1307 return k != -1 ? Col(cols[k]) : Col(INVALID);
1310 /// Get the name of a row
1312 ///\param r is the coresponding row
1313 ///\return The name of the row
1314 std::string rowName(Row r) const {
1316 _getRowName(rows(id(r)), name);
1320 /// Set the name of a row
1322 ///\param r is the coresponding row
1323 ///\param name The name to be given
1324 void rowName(Row r, const std::string& name) {
1325 _setRowName(rows(id(r)), name);
1328 /// Get the row by its name
1330 ///\param name The name of the row
1331 ///\return the proper row or \c INVALID
1332 Row rowByName(const std::string& name) const {
1333 int k = _rowByName(name);
1334 return k != -1 ? Row(rows[k]) : Row(INVALID);
1337 /// Set an element of the coefficient matrix of the LP
1339 ///\param r is the row of the element to be modified
1340 ///\param c is the column of the element to be modified
1341 ///\param val is the new value of the coefficient
1342 void coeff(Row r, Col c, Value val) {
1343 _setCoeff(rows(id(r)),cols(id(c)), val);
1346 /// Get an element of the coefficient matrix of the LP
1348 ///\param r is the row of the element
1349 ///\param c is the column of the element
1350 ///\return the corresponding coefficient
1351 Value coeff(Row r, Col c) const {
1352 return _getCoeff(rows(id(r)),cols(id(c)));
1355 /// Set the lower bound of a column (i.e a variable)
1357 /// The lower bound of a variable (column) has to be given by an
1358 /// extended number of type Value, i.e. a finite number of type
1359 /// Value or -\ref INF.
1360 void colLowerBound(Col c, Value value) {
1361 _setColLowerBound(cols(id(c)),value);
1364 /// Get the lower bound of a column (i.e a variable)
1366 /// This function returns the lower bound for column (variable) \c c
1367 /// (this might be -\ref INF as well).
1368 ///\return The lower bound for column \c c
1369 Value colLowerBound(Col c) const {
1370 return _getColLowerBound(cols(id(c)));
1373 ///\brief Set the lower bound of several columns
1374 ///(i.e variables) at once
1376 ///This magic function takes a container as its argument
1377 ///and applies the function on all of its elements.
1378 ///The lower bound of a variable (column) has to be given by an
1379 ///extended number of type Value, i.e. a finite number of type
1380 ///Value or -\ref INF.
1383 void colLowerBound(T &t, Value value) { return 0;}
1386 typename enable_if<typename T::value_type::LpCol,void>::type
1387 colLowerBound(T &t, Value value,dummy<0> = 0) {
1388 for(typename T::iterator i=t.begin();i!=t.end();++i) {
1389 colLowerBound(*i, value);
1393 typename enable_if<typename T::value_type::second_type::LpCol,
1395 colLowerBound(T &t, Value value,dummy<1> = 1) {
1396 for(typename T::iterator i=t.begin();i!=t.end();++i) {
1397 colLowerBound(i->second, value);
1401 typename enable_if<typename T::MapIt::Value::LpCol,
1403 colLowerBound(T &t, Value value,dummy<2> = 2) {
1404 for(typename T::MapIt i(t); i!=INVALID; ++i){
1405 colLowerBound(*i, value);
1410 /// Set the upper bound of a column (i.e a variable)
1412 /// The upper bound of a variable (column) has to be given by an
1413 /// extended number of type Value, i.e. a finite number of type
1414 /// Value or \ref INF.
1415 void colUpperBound(Col c, Value value) {
1416 _setColUpperBound(cols(id(c)),value);
1419 /// Get the upper bound of a column (i.e a variable)
1421 /// This function returns the upper bound for column (variable) \c c
1422 /// (this might be \ref INF as well).
1423 /// \return The upper bound for column \c c
1424 Value colUpperBound(Col c) const {
1425 return _getColUpperBound(cols(id(c)));
1428 ///\brief Set the upper bound of several columns
1429 ///(i.e variables) at once
1431 ///This magic function takes a container as its argument
1432 ///and applies the function on all of its elements.
1433 ///The upper bound of a variable (column) has to be given by an
1434 ///extended number of type Value, i.e. a finite number of type
1435 ///Value or \ref INF.
1438 void colUpperBound(T &t, Value value) { return 0;}
1441 typename enable_if<typename T1::value_type::LpCol,void>::type
1442 colUpperBound(T1 &t, Value value,dummy<0> = 0) {
1443 for(typename T1::iterator i=t.begin();i!=t.end();++i) {
1444 colUpperBound(*i, value);
1448 typename enable_if<typename T1::value_type::second_type::LpCol,
1450 colUpperBound(T1 &t, Value value,dummy<1> = 1) {
1451 for(typename T1::iterator i=t.begin();i!=t.end();++i) {
1452 colUpperBound(i->second, value);
1456 typename enable_if<typename T1::MapIt::Value::LpCol,
1458 colUpperBound(T1 &t, Value value,dummy<2> = 2) {
1459 for(typename T1::MapIt i(t); i!=INVALID; ++i){
1460 colUpperBound(*i, value);
1465 /// Set the lower and the upper bounds of a column (i.e a variable)
1467 /// The lower and the upper bounds of
1468 /// a variable (column) have to be given by an
1469 /// extended number of type Value, i.e. a finite number of type
1470 /// Value, -\ref INF or \ref INF.
1471 void colBounds(Col c, Value lower, Value upper) {
1472 _setColLowerBound(cols(id(c)),lower);
1473 _setColUpperBound(cols(id(c)),upper);
1476 ///\brief Set the lower and the upper bound of several columns
1477 ///(i.e variables) at once
1479 ///This magic function takes a container as its argument
1480 ///and applies the function on all of its elements.
1481 /// The lower and the upper bounds of
1482 /// a variable (column) have to be given by an
1483 /// extended number of type Value, i.e. a finite number of type
1484 /// Value, -\ref INF or \ref INF.
1487 void colBounds(T &t, Value lower, Value upper) { return 0;}
1490 typename enable_if<typename T2::value_type::LpCol,void>::type
1491 colBounds(T2 &t, Value lower, Value upper,dummy<0> = 0) {
1492 for(typename T2::iterator i=t.begin();i!=t.end();++i) {
1493 colBounds(*i, lower, upper);
1497 typename enable_if<typename T2::value_type::second_type::LpCol, void>::type
1498 colBounds(T2 &t, Value lower, Value upper,dummy<1> = 1) {
1499 for(typename T2::iterator i=t.begin();i!=t.end();++i) {
1500 colBounds(i->second, lower, upper);
1504 typename enable_if<typename T2::MapIt::Value::LpCol, void>::type
1505 colBounds(T2 &t, Value lower, Value upper,dummy<2> = 2) {
1506 for(typename T2::MapIt i(t); i!=INVALID; ++i){
1507 colBounds(*i, lower, upper);
1512 /// Set the lower bound of a row (i.e a constraint)
1514 /// The lower bound of a constraint (row) has to be given by an
1515 /// extended number of type Value, i.e. a finite number of type
1516 /// Value or -\ref INF.
1517 void rowLowerBound(Row r, Value value) {
1518 _setRowLowerBound(rows(id(r)),value);
1521 /// Get the lower bound of a row (i.e a constraint)
1523 /// This function returns the lower bound for row (constraint) \c c
1524 /// (this might be -\ref INF as well).
1525 ///\return The lower bound for row \c r
1526 Value rowLowerBound(Row r) const {
1527 return _getRowLowerBound(rows(id(r)));
1530 /// Set the upper bound of a row (i.e a constraint)
1532 /// The upper bound of a constraint (row) has to be given by an
1533 /// extended number of type Value, i.e. a finite number of type
1534 /// Value or -\ref INF.
1535 void rowUpperBound(Row r, Value value) {
1536 _setRowUpperBound(rows(id(r)),value);
1539 /// Get the upper bound of a row (i.e a constraint)
1541 /// This function returns the upper bound for row (constraint) \c c
1542 /// (this might be -\ref INF as well).
1543 ///\return The upper bound for row \c r
1544 Value rowUpperBound(Row r) const {
1545 return _getRowUpperBound(rows(id(r)));
1548 ///Set an element of the objective function
1549 void objCoeff(Col c, Value v) {_setObjCoeff(cols(id(c)),v); };
1551 ///Get an element of the objective function
1552 Value objCoeff(Col c) const { return _getObjCoeff(cols(id(c))); };
1554 ///Set the objective function
1556 ///\param e is a linear expression of type \ref Expr.
1558 void obj(const Expr& e) {
1559 _setObjCoeffs(ExprIterator(e.comps.begin(), cols),
1560 ExprIterator(e.comps.end(), cols));
1561 obj_const_comp = *e;
1564 ///Get the objective function
1566 ///\return the objective function as a linear expression of type
1570 _getObjCoeffs(InsertIterator(e.comps, cols));
1571 *e = obj_const_comp;
1576 ///Set the direction of optimization
1577 void sense(Sense sense) { _setSense(sense); }
1579 ///Query the direction of the optimization
1580 Sense sense() const {return _getSense(); }
1582 ///Set the sense to maximization
1583 void max() { _setSense(MAX); }
1585 ///Set the sense to maximization
1586 void min() { _setSense(MIN); }
1588 ///Clear the problem
1589 void clear() { _clear(); rows.clear(); cols.clear(); }
1591 /// Set the message level of the solver
1592 void messageLevel(MessageLevel level) { _messageLevel(level); }
1594 /// Write the problem to a file in the given format
1596 /// This function writes the problem to a file in the given format.
1597 /// Different solver backends may support different formats.
1598 /// Trying to write in an unsupported format will trigger
1599 /// \ref UnsupportedFormatError. For the supported formats,
1600 /// visit the documentation of the base class of the related backends
1601 /// (\ref CplexBase, \ref GlpkBase etc.)
1602 /// \param file The file path
1603 /// \param format The output file format.
1604 void write(std::string file, std::string format = "MPS") const
1606 _write(file.c_str(),format.c_str());
1615 ///\relates LpBase::Expr
1617 inline LpBase::Expr operator+(const LpBase::Expr &a, const LpBase::Expr &b) {
1618 LpBase::Expr tmp(a);
1624 ///\relates LpBase::Expr
1626 inline LpBase::Expr operator-(const LpBase::Expr &a, const LpBase::Expr &b) {
1627 LpBase::Expr tmp(a);
1631 ///Multiply with constant
1633 ///\relates LpBase::Expr
1635 inline LpBase::Expr operator*(const LpBase::Expr &a, const LpBase::Value &b) {
1636 LpBase::Expr tmp(a);
1641 ///Multiply with constant
1643 ///\relates LpBase::Expr
1645 inline LpBase::Expr operator*(const LpBase::Value &a, const LpBase::Expr &b) {
1646 LpBase::Expr tmp(b);
1650 ///Divide with constant
1652 ///\relates LpBase::Expr
1654 inline LpBase::Expr operator/(const LpBase::Expr &a, const LpBase::Value &b) {
1655 LpBase::Expr tmp(a);
1660 ///Create constraint
1662 ///\relates LpBase::Constr
1664 inline LpBase::Constr operator<=(const LpBase::Expr &e,
1665 const LpBase::Expr &f) {
1666 return LpBase::Constr(0, f - e, LpBase::NaN);
1669 ///Create constraint
1671 ///\relates LpBase::Constr
1673 inline LpBase::Constr operator<=(const LpBase::Value &e,
1674 const LpBase::Expr &f) {
1675 return LpBase::Constr(e, f, LpBase::NaN);
1678 ///Create constraint
1680 ///\relates LpBase::Constr
1682 inline LpBase::Constr operator<=(const LpBase::Expr &e,
1683 const LpBase::Value &f) {
1684 return LpBase::Constr(LpBase::NaN, e, f);
1687 ///Create constraint
1689 ///\relates LpBase::Constr
1691 inline LpBase::Constr operator>=(const LpBase::Expr &e,
1692 const LpBase::Expr &f) {
1693 return LpBase::Constr(0, e - f, LpBase::NaN);
1697 ///Create constraint
1699 ///\relates LpBase::Constr
1701 inline LpBase::Constr operator>=(const LpBase::Value &e,
1702 const LpBase::Expr &f) {
1703 return LpBase::Constr(LpBase::NaN, f, e);
1707 ///Create constraint
1709 ///\relates LpBase::Constr
1711 inline LpBase::Constr operator>=(const LpBase::Expr &e,
1712 const LpBase::Value &f) {
1713 return LpBase::Constr(f, e, LpBase::NaN);
1716 ///Create constraint
1718 ///\relates LpBase::Constr
1720 inline LpBase::Constr operator==(const LpBase::Expr &e,
1721 const LpBase::Value &f) {
1722 return LpBase::Constr(f, e, f);
1725 ///Create constraint
1727 ///\relates LpBase::Constr
1729 inline LpBase::Constr operator==(const LpBase::Expr &e,
1730 const LpBase::Expr &f) {
1731 return LpBase::Constr(0, f - e, 0);
1734 ///Create constraint
1736 ///\relates LpBase::Constr
1738 inline LpBase::Constr operator<=(const LpBase::Value &n,
1739 const LpBase::Constr &c) {
1740 LpBase::Constr tmp(c);
1741 LEMON_ASSERT(isNaN(tmp.lowerBound()), "Wrong LP constraint");
1745 ///Create constraint
1747 ///\relates LpBase::Constr
1749 inline LpBase::Constr operator<=(const LpBase::Constr &c,
1750 const LpBase::Value &n)
1752 LpBase::Constr tmp(c);
1753 LEMON_ASSERT(isNaN(tmp.upperBound()), "Wrong LP constraint");
1758 ///Create constraint
1760 ///\relates LpBase::Constr
1762 inline LpBase::Constr operator>=(const LpBase::Value &n,
1763 const LpBase::Constr &c) {
1764 LpBase::Constr tmp(c);
1765 LEMON_ASSERT(isNaN(tmp.upperBound()), "Wrong LP constraint");
1769 ///Create constraint
1771 ///\relates LpBase::Constr
1773 inline LpBase::Constr operator>=(const LpBase::Constr &c,
1774 const LpBase::Value &n)
1776 LpBase::Constr tmp(c);
1777 LEMON_ASSERT(isNaN(tmp.lowerBound()), "Wrong LP constraint");
1784 ///\relates LpBase::DualExpr
1786 inline LpBase::DualExpr operator+(const LpBase::DualExpr &a,
1787 const LpBase::DualExpr &b) {
1788 LpBase::DualExpr tmp(a);
1794 ///\relates LpBase::DualExpr
1796 inline LpBase::DualExpr operator-(const LpBase::DualExpr &a,
1797 const LpBase::DualExpr &b) {
1798 LpBase::DualExpr tmp(a);
1802 ///Multiply with constant
1804 ///\relates LpBase::DualExpr
1806 inline LpBase::DualExpr operator*(const LpBase::DualExpr &a,
1807 const LpBase::Value &b) {
1808 LpBase::DualExpr tmp(a);
1813 ///Multiply with constant
1815 ///\relates LpBase::DualExpr
1817 inline LpBase::DualExpr operator*(const LpBase::Value &a,
1818 const LpBase::DualExpr &b) {
1819 LpBase::DualExpr tmp(b);
1823 ///Divide with constant
1825 ///\relates LpBase::DualExpr
1827 inline LpBase::DualExpr operator/(const LpBase::DualExpr &a,
1828 const LpBase::Value &b) {
1829 LpBase::DualExpr tmp(a);
1834 /// \ingroup lp_group
1836 /// \brief Common base class for LP solvers
1838 /// This class is an abstract base class for LP solvers. This class
1839 /// provides a full interface for set and modify an LP problem,
1840 /// solve it and retrieve the solution. You can use one of the
1841 /// descendants as a concrete implementation, or the \c Lp
1842 /// default LP solver. However, if you would like to handle LP
1843 /// solvers as reference or pointer in a generic way, you can use
1844 /// this class directly.
1845 class LpSolver : virtual public LpBase {
1848 /// The problem types for primal and dual problems
1850 /// = 0. Feasible solution hasn't been found (but may exist).
1852 /// = 1. The problem has no feasible solution.
1854 /// = 2. Feasible solution found.
1856 /// = 3. Optimal solution exists and found.
1858 /// = 4. The cost function is unbounded.
1862 ///The basis status of variables
1864 /// The variable is in the basis
1866 /// The variable is free, but not basic
1868 /// The variable has active lower bound
1870 /// The variable has active upper bound
1872 /// The variable is non-basic and fixed
1878 virtual SolveExitStatus _solve() = 0;
1880 virtual Value _getPrimal(int i) const = 0;
1881 virtual Value _getDual(int i) const = 0;
1883 virtual Value _getPrimalRay(int i) const = 0;
1884 virtual Value _getDualRay(int i) const = 0;
1886 virtual Value _getPrimalValue() const = 0;
1888 virtual VarStatus _getColStatus(int i) const = 0;
1889 virtual VarStatus _getRowStatus(int i) const = 0;
1891 virtual ProblemType _getPrimalType() const = 0;
1892 virtual ProblemType _getDualType() const = 0;
1896 ///Allocate a new LP problem instance
1897 virtual LpSolver* newSolver() const = 0;
1898 ///Make a copy of the LP problem
1899 virtual LpSolver* cloneSolver() const = 0;
1901 ///\name Solve the LP
1905 ///\e Solve the LP problem at hand
1907 ///\return The result of the optimization procedure. Possible
1908 ///values and their meanings can be found in the documentation of
1909 ///\ref SolveExitStatus.
1910 SolveExitStatus solve() { return _solve(); }
1914 ///\name Obtain the Solution
1918 /// The type of the primal problem
1919 ProblemType primalType() const {
1920 return _getPrimalType();
1923 /// The type of the dual problem
1924 ProblemType dualType() const {
1925 return _getDualType();
1928 /// Return the primal value of the column
1930 /// Return the primal value of the column.
1931 /// \pre The problem is solved.
1932 Value primal(Col c) const { return _getPrimal(cols(id(c))); }
1934 /// Return the primal value of the expression
1936 /// Return the primal value of the expression, i.e. the dot
1937 /// product of the primal solution and the expression.
1938 /// \pre The problem is solved.
1939 Value primal(const Expr& e) const {
1941 for (Expr::ConstCoeffIt c(e); c != INVALID; ++c) {
1942 res += *c * primal(c);
1946 /// Returns a component of the primal ray
1948 /// The primal ray is solution of the modified primal problem,
1949 /// where we change each finite bound to 0, and we looking for a
1950 /// negative objective value in case of minimization, and positive
1951 /// objective value for maximization. If there is such solution,
1952 /// that proofs the unsolvability of the dual problem, and if a
1953 /// feasible primal solution exists, then the unboundness of
1956 /// \pre The problem is solved and the dual problem is infeasible.
1957 /// \note Some solvers does not provide primal ray calculation
1959 Value primalRay(Col c) const { return _getPrimalRay(cols(id(c))); }
1961 /// Return the dual value of the row
1963 /// Return the dual value of the row.
1964 /// \pre The problem is solved.
1965 Value dual(Row r) const { return _getDual(rows(id(r))); }
1967 /// Return the dual value of the dual expression
1969 /// Return the dual value of the dual expression, i.e. the dot
1970 /// product of the dual solution and the dual expression.
1971 /// \pre The problem is solved.
1972 Value dual(const DualExpr& e) const {
1974 for (DualExpr::ConstCoeffIt r(e); r != INVALID; ++r) {
1975 res += *r * dual(r);
1980 /// Returns a component of the dual ray
1982 /// The dual ray is solution of the modified primal problem, where
1983 /// we change each finite bound to 0 (i.e. the objective function
1984 /// coefficients in the primal problem), and we looking for a
1985 /// ositive objective value. If there is such solution, that
1986 /// proofs the unsolvability of the primal problem, and if a
1987 /// feasible dual solution exists, then the unboundness of
1990 /// \pre The problem is solved and the primal problem is infeasible.
1991 /// \note Some solvers does not provide dual ray calculation
1993 Value dualRay(Row r) const { return _getDualRay(rows(id(r))); }
1995 /// Return the basis status of the column
1998 VarStatus colStatus(Col c) const { return _getColStatus(cols(id(c))); }
2000 /// Return the basis status of the row
2003 VarStatus rowStatus(Row r) const { return _getRowStatus(rows(id(r))); }
2005 ///The value of the objective function
2008 ///- \ref INF or -\ref INF means either infeasibility or unboundedness
2009 /// of the primal problem, depending on whether we minimize or maximize.
2010 ///- \ref NaN if no primal solution is found.
2011 ///- The (finite) objective value if an optimal solution is found.
2012 Value primal() const { return _getPrimalValue()+obj_const_comp;}
2020 /// \ingroup lp_group
2022 /// \brief Common base class for MIP solvers
2024 /// This class is an abstract base class for MIP solvers. This class
2025 /// provides a full interface for set and modify an MIP problem,
2026 /// solve it and retrieve the solution. You can use one of the
2027 /// descendants as a concrete implementation, or the \c Lp
2028 /// default MIP solver. However, if you would like to handle MIP
2029 /// solvers as reference or pointer in a generic way, you can use
2030 /// this class directly.
2031 class MipSolver : virtual public LpBase {
2034 /// The problem types for MIP problems
2036 /// = 0. Feasible solution hasn't been found (but may exist).
2038 /// = 1. The problem has no feasible solution.
2040 /// = 2. Feasible solution found.
2042 /// = 3. Optimal solution exists and found.
2044 /// = 4. The cost function is unbounded.
2045 ///The Mip or at least the relaxed problem is unbounded.
2049 ///Allocate a new MIP problem instance
2050 virtual MipSolver* newSolver() const = 0;
2051 ///Make a copy of the MIP problem
2052 virtual MipSolver* cloneSolver() const = 0;
2054 ///\name Solve the MIP
2058 /// Solve the MIP problem at hand
2060 ///\return The result of the optimization procedure. Possible
2061 ///values and their meanings can be found in the documentation of
2062 ///\ref SolveExitStatus.
2063 SolveExitStatus solve() { return _solve(); }
2067 ///\name Set Column Type
2070 ///Possible variable (column) types (e.g. real, integer, binary etc.)
2072 /// = 0. Continuous variable (default).
2074 /// = 1. Integer variable.
2078 ///Sets the type of the given column to the given type
2080 ///Sets the type of the given column to the given type.
2082 void colType(Col c, ColTypes col_type) {
2083 _setColType(cols(id(c)),col_type);
2086 ///Gives back the type of the column.
2088 ///Gives back the type of the column.
2090 ColTypes colType(Col c) const {
2091 return _getColType(cols(id(c)));
2095 ///\name Obtain the Solution
2099 /// The type of the MIP problem
2100 ProblemType type() const {
2104 /// Return the value of the row in the solution
2106 /// Return the value of the row in the solution.
2107 /// \pre The problem is solved.
2108 Value sol(Col c) const { return _getSol(cols(id(c))); }
2110 /// Return the value of the expression in the solution
2112 /// Return the value of the expression in the solution, i.e. the
2113 /// dot product of the solution and the expression.
2114 /// \pre The problem is solved.
2115 Value sol(const Expr& e) const {
2117 for (Expr::ConstCoeffIt c(e); c != INVALID; ++c) {
2122 ///The value of the objective function
2125 ///- \ref INF or -\ref INF means either infeasibility or unboundedness
2126 /// of the problem, depending on whether we minimize or maximize.
2127 ///- \ref NaN if no primal solution is found.
2128 ///- The (finite) objective value if an optimal solution is found.
2129 Value solValue() const { return _getSolValue()+obj_const_comp;}
2134 virtual SolveExitStatus _solve() = 0;
2135 virtual ColTypes _getColType(int col) const = 0;
2136 virtual void _setColType(int col, ColTypes col_type) = 0;
2137 virtual ProblemType _getType() const = 0;
2138 virtual Value _getSol(int i) const = 0;
2139 virtual Value _getSolValue() const = 0;
2147 #endif //LEMON_LP_BASE_H