[Lemon-commits] [lemon_svn] marci: r1498 - hugo/trunk/src/work/marci/lp
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 20:45:53 CET 2006
Author: marci
Date: Thu Jan 27 18:44:04 2005
New Revision: 1498
Modified:
hugo/trunk/src/work/marci/lp/expression.h
hugo/trunk/src/work/marci/lp/lp_solver_wrapper_3.h
Log:
-=, - operators in expressions
Modified: hugo/trunk/src/work/marci/lp/expression.h
==============================================================================
--- hugo/trunk/src/work/marci/lp/expression.h (original)
+++ hugo/trunk/src/work/marci/lp/expression.h Thu Jan 27 18:44:04 2005
@@ -19,11 +19,18 @@
template <typename _Col, typename _Value>
class Expr {
- protected:
+// protected:
+ public:
typedef
typename std::map<_Col, _Value> Data;
Data data;
public:
+ void simplify() {
+ for (typename Data::iterator i=data.begin();
+ i!=data.end(); ++i) {
+ if ((*i).second==0) data.erase(i);
+ }
+ }
Expr() { }
Expr(_Col _col) {
data.insert(std::make_pair(_col, 1));
@@ -33,6 +40,7 @@
i!=data.end(); ++i) {
(*i).second *= _value;
}
+ simplify();
return *this;
}
Expr& operator+=(const Expr<_Col, _Value>& expr) {
@@ -45,6 +53,20 @@
(*i).second+=(*j).second;
}
}
+ simplify();
+ return *this;
+ }
+ Expr& operator-=(const Expr<_Col, _Value>& expr) {
+ for (typename Data::const_iterator j=expr.data.begin();
+ j!=expr.data.end(); ++j) {
+ typename Data::iterator i=data.find((*j).first);
+ if (i==data.end()) {
+ data.insert(std::make_pair((*j).first, -(*j).second));
+ } else {
+ (*i).second+=-(*j).second;
+ }
+ }
+ simplify();
return *this;
}
template <typename _C, typename _V>
@@ -56,6 +78,7 @@
Expr<_Col, _Value> operator*(_Value _value, _Col _col) {
Expr<_Col, _Value> tmp(_col);
tmp*=_value;
+ tmp.simplify();
return tmp;
}
@@ -64,6 +87,7 @@
const Expr<_Col, _Value>& expr) {
Expr<_Col, _Value> tmp(expr);
tmp*=_value;
+ tmp.simplify();
return tmp;
}
@@ -72,6 +96,16 @@
const Expr<_Col, _Value>& expr2) {
Expr<_Col, _Value> tmp(expr1);
tmp+=expr2;
+ tmp.simplify();
+ return tmp;
+ }
+
+ template <typename _Col, typename _Value>
+ Expr<_Col, _Value> operator-(const Expr<_Col, _Value>& expr1,
+ const Expr<_Col, _Value>& expr2) {
+ Expr<_Col, _Value> tmp(expr1);
+ tmp-=expr2;
+ tmp.simplify();
return tmp;
}
Modified: hugo/trunk/src/work/marci/lp/lp_solver_wrapper_3.h
==============================================================================
--- hugo/trunk/src/work/marci/lp/lp_solver_wrapper_3.h (original)
+++ hugo/trunk/src/work/marci/lp/lp_solver_wrapper_3.h Thu Jan 27 18:44:04 2005
@@ -27,6 +27,7 @@
//#include <lemon/list_graph.h>
//#include <lemon/graph_wrapper.h>
#include <lemon/invalid.h>
+#include <expression.h>
//#include <bfs_dfs.h>
//#include <stp.h>
//#include <lemon/max_flow.h>
@@ -143,7 +144,18 @@
ClassIt(const int& _i) : i(_i) { }
/// Invalid constructor.
ClassIt(const Invalid&) : i(-1) { }
+ friend bool operator<(const ClassIt& x, const ClassIt& y);
+ friend std::ostream& operator<<(std::ostream& os,
+ const ClassIt& it);
};
+ friend bool operator<(const ClassIt& x, const ClassIt& y) {
+ return (x.i < y.i);
+ }
+ friend std::ostream& operator<<(std::ostream& os,
+ const ClassIt& it) {
+ os << it.i;
+ return os;
+ }
/// First member of class \c class_id.
ClassIt& first(ClassIt& it, int class_id) const {
it.i=tips[class_id].first;
@@ -158,104 +170,6 @@
bool valid(const ClassIt& it) const { return it.i!=-1; }
};
- template <typename _Col, typename _Value>
- class Expr;
-
- template <typename _Col, typename _Value>
- class SmallExpr {
- template <typename _C, typename _V>
- friend class Expr;
- protected:
- _Col col;
- _Value value;
- public:
- SmallExpr(_Col _col) : col(_col), value(1) {
- }
- SmallExpr& operator *= (_Value _value) {
- value*=_value;
- return *this;
- }
- // template <typename _C, typename _V>
- // friend SmallExpr<_C, _V> operator* (_V _value,
- // const SmallExpr<_C, _V>& expr);
- template <typename _C, typename _V>
- friend std::ostream& operator<<(std::ostream& os,
- const SmallExpr<_C, _V>& expr);
- };
-
- template <typename _Col, typename _Value>
- SmallExpr<_Col, _Value>
- operator* (_Value value,
- const SmallExpr<_Col, _Value>& expr) {
- SmallExpr<_Col, _Value> tmp;
- tmp=expr;
- tmp*=value;
- return tmp;
- }
-
- template <typename _Col, typename _Value>
- std::ostream& operator<<(std::ostream& os,
- const SmallExpr<_Col, _Value>& expr) {
- os << expr.value << "*" << expr.col;
- return os;
- }
-
- template <typename _Col, typename _Value>
- class Expr {
- protected:
- typedef
- typename std::map<_Col, _Value> Data;
- Data data;
- public:
- Expr() { }
- Expr(SmallExpr<_Col, _Value> expr) {
- data.insert(std::make_pair(expr.col, expr.value));
- }
-// Expr(_Col col) {
-// data.insert(std::make_pair(col, 1));
-// }
- Expr& operator*=(_Value _value) {
- for (typename Data::iterator i=data.begin();
- i!=data.end(); ++i) {
- (*i).second *= _value;
- }
- return *this;
- }
- Expr& operator+=(SmallExpr<_Col, _Value> expr) {
- typename Data::iterator i=data.find(expr.col);
- if (i==data.end()) {
- data.insert(std::make_pair(expr.col, expr.value));
- } else {
- (*i).second+=expr.value;
- }
- return *this;
- }
- // template <typename _C, typename _V>
- // friend Expr<_C, _V> operator*(_V _value, const Expr<_C, _V>& expr);
- template <typename _C, typename _V>
- friend std::ostream& operator<<(std::ostream& os,
- const Expr<_C, _V>& expr);
- };
-
- template <typename _Col, typename _Value>
- Expr<_Col, _Value> operator*(_Value _value,
- const Expr<_Col, _Value>& expr) {
- Expr<_Col, _Value> tmp;
- tmp=expr;
- tmp*=_value;
- return tmp;
- }
-
- template <typename _Col, typename _Value>
- std::ostream& operator<<(std::ostream& os,
- const Expr<_Col, _Value>& expr) {
- for (typename Expr<_Col, _Value>::Data::const_iterator i=
- expr.data.begin();
- i!=expr.data.end(); ++i) {
- os << (*i).second << "*" << (*i).first << " ";
- }
- return os;
- }
/*! \e
*/
@@ -424,6 +338,39 @@
return _getObjCoef(col_iter_map[col_it]);
}
+ //MOST HIGH LEVEL, USER FRIEND FUNCTIONS
+
+ /// \e
+ typedef Expr<ColIt, _Value> Expression;
+ /// \e
+ typedef Expr<RowIt, _Value> DualExpression;
+ /// \e
+ void setRowCoeffs(RowIt row_it, const Expression& expr) {
+ std::vector<std::pair<int, _Value> > row_coeffs;
+ for(typename Expression::Data::const_iterator i=expr.data.begin();
+ i!=expr.data.end(); ++i) {
+ row_coeffs.push_back(std::make_pair
+ (col_iter_map[(*i).first], (*i).second));
+ }
+ _setRowCoeffs(row_iter_map[row_it], row_coeffs);
+ }
+ /// \e
+ void setColCoeffs(ColIt col_it, const DualExpression& expr) {
+ std::vector<std::pair<int, _Value> > col_coeffs;
+ for(typename DualExpression::Data::const_iterator i=expr.data.begin();
+ i!=expr.data.end(); ++i) {
+ col_coeffs.push_back(std::make_pair
+ (row_iter_map[(*i).first], (*i).second));
+ }
+ _setColCoeffs(col_iter_map[col_it], col_coeffs);
+ }
+ /// \e
+ void setObjCoeffs(const Expression& expr) {
+ for(typename Expression::Data::const_iterator i=expr.data.begin();
+ i!=expr.data.end(); ++i) {
+ setObjCoef((*i).first, (*i).second);
+ }
+ }
//SOLVER FUNCTIONS
/// \e
More information about the Lemon-commits
mailing list