# HG changeset patch # User marci # Date 1106754846 0 # Node ID c91e765266d717a340a9c1a33c7dcc876c15ceb1 # Parent 1cfb25ef14d208e1c926c12b5f31d21407132268 A proposal or test implementation for linear expression` diff -r 1cfb25ef14d2 -r c91e765266d7 src/work/marci/lp/expression.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/work/marci/lp/expression.h Wed Jan 26 15:54:06 2005 +0000 @@ -0,0 +1,91 @@ +// -*- c++ -*- +#ifndef LEMON_EXPRESSION_H +#define LEMON_EXPRESSION_H + +#include +#include + +namespace lemon { + + /*! \brief Linear expression + + \c Expr<_Col,_Value> implements a class of linear expressions with the + operations of addition and multiplication with scalar. + + \author Marton Makai + */ + template + class Expr; + + template + class Expr { + protected: + typedef + typename std::map<_Col, _Value> Data; + Data data; + public: + Expr() { } + 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+=(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; + } + } + return *this; + } + template + friend std::ostream& operator<<(std::ostream& os, + const Expr<_C, _V>& expr); + }; + + template + Expr<_Col, _Value> operator*(_Value _value, _Col _col) { + Expr<_Col, _Value> tmp(_col); + tmp*=_value; + return tmp; + } + + template + Expr<_Col, _Value> operator*(_Value _value, + const Expr<_Col, _Value>& expr) { + Expr<_Col, _Value> tmp(expr); + tmp*=_value; + return tmp; + } + + template + Expr<_Col, _Value> operator+(const Expr<_Col, _Value>& expr1, + const Expr<_Col, _Value>& expr2) { + Expr<_Col, _Value> tmp(expr1); + tmp+=expr2; + return tmp; + } + + template + 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; + } + +} //namespace lemon + +#endif //LEMON_EXPRESSION_H diff -r 1cfb25ef14d2 -r c91e765266d7 src/work/marci/lp/expression_test.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/work/marci/lp/expression_test.cc Wed Jan 26 15:54:06 2005 +0000 @@ -0,0 +1,23 @@ +#include +#include +#include + +using std::cout; +using std::endl; +using std::string; +using namespace lemon; + +int main() { + Expr b; + cout << b << endl; + Expr c("f"); + cout << c << endl; + Expr d=8.0*string("g"); + cout << d << endl; + c*=5; + cout << c << endl; + Expr e=c; + e+=8.9*9.0*string("l"); + cout << e << endl; + cout << c+d << endl; +} diff -r 1cfb25ef14d2 -r c91e765266d7 src/work/marci/lp/lp_solver_wrapper_3.h --- a/src/work/marci/lp/lp_solver_wrapper_3.h Wed Jan 26 09:00:40 2005 +0000 +++ b/src/work/marci/lp/lp_solver_wrapper_3.h Wed Jan 26 15:54:06 2005 +0000 @@ -8,6 +8,8 @@ // #include #include +#include +#include // #include //#include extern "C" { @@ -156,6 +158,105 @@ bool valid(const ClassIt& it) const { return it.i!=-1; } }; + template + class Expr; + + template + class SmallExpr { + template + 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 + // friend SmallExpr<_C, _V> operator* (_V _value, + // const SmallExpr<_C, _V>& expr); + template + friend std::ostream& operator<<(std::ostream& os, + const SmallExpr<_C, _V>& expr); + }; + + template + SmallExpr<_Col, _Value> + operator* (_Value value, + const SmallExpr<_Col, _Value>& expr) { + SmallExpr<_Col, _Value> tmp; + tmp=expr; + tmp*=value; + return tmp; + } + + template + std::ostream& operator<<(std::ostream& os, + const SmallExpr<_Col, _Value>& expr) { + os << expr.value << "*" << expr.col; + return os; + } + + template + 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 + // friend Expr<_C, _V> operator*(_V _value, const Expr<_C, _V>& expr); + template + friend std::ostream& operator<<(std::ostream& os, + const Expr<_C, _V>& expr); + }; + + template + Expr<_Col, _Value> operator*(_Value _value, + const Expr<_Col, _Value>& expr) { + Expr<_Col, _Value> tmp; + tmp=expr; + tmp*=_value; + return tmp; + } + + template + 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 */ template diff -r 1cfb25ef14d2 -r c91e765266d7 src/work/marci/lp/makefile --- a/src/work/marci/lp/makefile Wed Jan 26 09:00:40 2005 +0000 +++ b/src/work/marci/lp/makefile Wed Jan 26 15:54:06 2005 +0000 @@ -5,7 +5,7 @@ CXXFLAGS = -g -O2 -W -Wall $(INCLUDEDIRS) -ansi -pedantic LDFLAGS = -lglpk#-lcplex -lm -lpthread -lilocplex -L/usr/local/cplex/cplex75/lib/i86_linux2_glibc2.2_gcc3.0/static_mt# -L$(GLPKROOT)/lib -BINARIES = cplex_1 max_flow_by_lp# sample sample2 sample11 sample15 +BINARIES = expression_test max_flow_by_lp# sample sample2 sample11 sample15 #include ../makefile