154 } |
156 } |
155 /// True iff the iterator is valid. |
157 /// True iff the iterator is valid. |
156 bool valid(const ClassIt& it) const { return it.i!=-1; } |
158 bool valid(const ClassIt& it) const { return it.i!=-1; } |
157 }; |
159 }; |
158 |
160 |
|
161 template <typename _Col, typename _Value> |
|
162 class Expr; |
|
163 |
|
164 template <typename _Col, typename _Value> |
|
165 class SmallExpr { |
|
166 template <typename _C, typename _V> |
|
167 friend class Expr; |
|
168 protected: |
|
169 _Col col; |
|
170 _Value value; |
|
171 public: |
|
172 SmallExpr(_Col _col) : col(_col), value(1) { |
|
173 } |
|
174 SmallExpr& operator *= (_Value _value) { |
|
175 value*=_value; |
|
176 return *this; |
|
177 } |
|
178 // template <typename _C, typename _V> |
|
179 // friend SmallExpr<_C, _V> operator* (_V _value, |
|
180 // const SmallExpr<_C, _V>& expr); |
|
181 template <typename _C, typename _V> |
|
182 friend std::ostream& operator<<(std::ostream& os, |
|
183 const SmallExpr<_C, _V>& expr); |
|
184 }; |
|
185 |
|
186 template <typename _Col, typename _Value> |
|
187 SmallExpr<_Col, _Value> |
|
188 operator* (_Value value, |
|
189 const SmallExpr<_Col, _Value>& expr) { |
|
190 SmallExpr<_Col, _Value> tmp; |
|
191 tmp=expr; |
|
192 tmp*=value; |
|
193 return tmp; |
|
194 } |
|
195 |
|
196 template <typename _Col, typename _Value> |
|
197 std::ostream& operator<<(std::ostream& os, |
|
198 const SmallExpr<_Col, _Value>& expr) { |
|
199 os << expr.value << "*" << expr.col; |
|
200 return os; |
|
201 } |
|
202 |
|
203 template <typename _Col, typename _Value> |
|
204 class Expr { |
|
205 protected: |
|
206 typedef |
|
207 typename std::map<_Col, _Value> Data; |
|
208 Data data; |
|
209 public: |
|
210 Expr() { } |
|
211 Expr(SmallExpr<_Col, _Value> expr) { |
|
212 data.insert(std::make_pair(expr.col, expr.value)); |
|
213 } |
|
214 // Expr(_Col col) { |
|
215 // data.insert(std::make_pair(col, 1)); |
|
216 // } |
|
217 Expr& operator*=(_Value _value) { |
|
218 for (typename Data::iterator i=data.begin(); |
|
219 i!=data.end(); ++i) { |
|
220 (*i).second *= _value; |
|
221 } |
|
222 return *this; |
|
223 } |
|
224 Expr& operator+=(SmallExpr<_Col, _Value> expr) { |
|
225 typename Data::iterator i=data.find(expr.col); |
|
226 if (i==data.end()) { |
|
227 data.insert(std::make_pair(expr.col, expr.value)); |
|
228 } else { |
|
229 (*i).second+=expr.value; |
|
230 } |
|
231 return *this; |
|
232 } |
|
233 // template <typename _C, typename _V> |
|
234 // friend Expr<_C, _V> operator*(_V _value, const Expr<_C, _V>& expr); |
|
235 template <typename _C, typename _V> |
|
236 friend std::ostream& operator<<(std::ostream& os, |
|
237 const Expr<_C, _V>& expr); |
|
238 }; |
|
239 |
|
240 template <typename _Col, typename _Value> |
|
241 Expr<_Col, _Value> operator*(_Value _value, |
|
242 const Expr<_Col, _Value>& expr) { |
|
243 Expr<_Col, _Value> tmp; |
|
244 tmp=expr; |
|
245 tmp*=_value; |
|
246 return tmp; |
|
247 } |
|
248 |
|
249 template <typename _Col, typename _Value> |
|
250 std::ostream& operator<<(std::ostream& os, |
|
251 const Expr<_Col, _Value>& expr) { |
|
252 for (typename Expr<_Col, _Value>::Data::const_iterator i= |
|
253 expr.data.begin(); |
|
254 i!=expr.data.end(); ++i) { |
|
255 os << (*i).second << "*" << (*i).first << " "; |
|
256 } |
|
257 return os; |
|
258 } |
|
259 |
159 /*! \e |
260 /*! \e |
160 */ |
261 */ |
161 template <typename _Value> |
262 template <typename _Value> |
162 class LPSolverBase { |
263 class LPSolverBase { |
163 public: |
264 public: |