17 template <typename _Col, typename _Value> |
17 template <typename _Col, typename _Value> |
18 class Expr; |
18 class Expr; |
19 |
19 |
20 template <typename _Col, typename _Value> |
20 template <typename _Col, typename _Value> |
21 class Expr { |
21 class Expr { |
22 protected: |
22 // protected: |
|
23 public: |
23 typedef |
24 typedef |
24 typename std::map<_Col, _Value> Data; |
25 typename std::map<_Col, _Value> Data; |
25 Data data; |
26 Data data; |
26 public: |
27 public: |
|
28 void simplify() { |
|
29 for (typename Data::iterator i=data.begin(); |
|
30 i!=data.end(); ++i) { |
|
31 if ((*i).second==0) data.erase(i); |
|
32 } |
|
33 } |
27 Expr() { } |
34 Expr() { } |
28 Expr(_Col _col) { |
35 Expr(_Col _col) { |
29 data.insert(std::make_pair(_col, 1)); |
36 data.insert(std::make_pair(_col, 1)); |
30 } |
37 } |
31 Expr& operator*=(_Value _value) { |
38 Expr& operator*=(_Value _value) { |
32 for (typename Data::iterator i=data.begin(); |
39 for (typename Data::iterator i=data.begin(); |
33 i!=data.end(); ++i) { |
40 i!=data.end(); ++i) { |
34 (*i).second *= _value; |
41 (*i).second *= _value; |
35 } |
42 } |
|
43 simplify(); |
36 return *this; |
44 return *this; |
37 } |
45 } |
38 Expr& operator+=(const Expr<_Col, _Value>& expr) { |
46 Expr& operator+=(const Expr<_Col, _Value>& expr) { |
39 for (typename Data::const_iterator j=expr.data.begin(); |
47 for (typename Data::const_iterator j=expr.data.begin(); |
40 j!=expr.data.end(); ++j) { |
48 j!=expr.data.end(); ++j) { |
43 data.insert(std::make_pair((*j).first, (*j).second)); |
51 data.insert(std::make_pair((*j).first, (*j).second)); |
44 } else { |
52 } else { |
45 (*i).second+=(*j).second; |
53 (*i).second+=(*j).second; |
46 } |
54 } |
47 } |
55 } |
|
56 simplify(); |
|
57 return *this; |
|
58 } |
|
59 Expr& operator-=(const Expr<_Col, _Value>& expr) { |
|
60 for (typename Data::const_iterator j=expr.data.begin(); |
|
61 j!=expr.data.end(); ++j) { |
|
62 typename Data::iterator i=data.find((*j).first); |
|
63 if (i==data.end()) { |
|
64 data.insert(std::make_pair((*j).first, -(*j).second)); |
|
65 } else { |
|
66 (*i).second+=-(*j).second; |
|
67 } |
|
68 } |
|
69 simplify(); |
48 return *this; |
70 return *this; |
49 } |
71 } |
50 template <typename _C, typename _V> |
72 template <typename _C, typename _V> |
51 friend std::ostream& operator<<(std::ostream& os, |
73 friend std::ostream& operator<<(std::ostream& os, |
52 const Expr<_C, _V>& expr); |
74 const Expr<_C, _V>& expr); |
54 |
76 |
55 template <typename _Col, typename _Value> |
77 template <typename _Col, typename _Value> |
56 Expr<_Col, _Value> operator*(_Value _value, _Col _col) { |
78 Expr<_Col, _Value> operator*(_Value _value, _Col _col) { |
57 Expr<_Col, _Value> tmp(_col); |
79 Expr<_Col, _Value> tmp(_col); |
58 tmp*=_value; |
80 tmp*=_value; |
|
81 tmp.simplify(); |
59 return tmp; |
82 return tmp; |
60 } |
83 } |
61 |
84 |
62 template <typename _Col, typename _Value> |
85 template <typename _Col, typename _Value> |
63 Expr<_Col, _Value> operator*(_Value _value, |
86 Expr<_Col, _Value> operator*(_Value _value, |
64 const Expr<_Col, _Value>& expr) { |
87 const Expr<_Col, _Value>& expr) { |
65 Expr<_Col, _Value> tmp(expr); |
88 Expr<_Col, _Value> tmp(expr); |
66 tmp*=_value; |
89 tmp*=_value; |
|
90 tmp.simplify(); |
67 return tmp; |
91 return tmp; |
68 } |
92 } |
69 |
93 |
70 template <typename _Col, typename _Value> |
94 template <typename _Col, typename _Value> |
71 Expr<_Col, _Value> operator+(const Expr<_Col, _Value>& expr1, |
95 Expr<_Col, _Value> operator+(const Expr<_Col, _Value>& expr1, |
72 const Expr<_Col, _Value>& expr2) { |
96 const Expr<_Col, _Value>& expr2) { |
73 Expr<_Col, _Value> tmp(expr1); |
97 Expr<_Col, _Value> tmp(expr1); |
74 tmp+=expr2; |
98 tmp+=expr2; |
|
99 tmp.simplify(); |
|
100 return tmp; |
|
101 } |
|
102 |
|
103 template <typename _Col, typename _Value> |
|
104 Expr<_Col, _Value> operator-(const Expr<_Col, _Value>& expr1, |
|
105 const Expr<_Col, _Value>& expr2) { |
|
106 Expr<_Col, _Value> tmp(expr1); |
|
107 tmp-=expr2; |
|
108 tmp.simplify(); |
75 return tmp; |
109 return tmp; |
76 } |
110 } |
77 |
111 |
78 template <typename _Col, typename _Value> |
112 template <typename _Col, typename _Value> |
79 std::ostream& operator<<(std::ostream& os, |
113 std::ostream& operator<<(std::ostream& os, |