src/work/marci/lp/lp_solver_wrapper_3.h
changeset 1098 e3b3667c6857
parent 1081 c0ad2673b11f
child 1099 91a8ee9d088d
equal deleted inserted replaced
1:bbd12d9b57db 2:44e532e453c7
     6 ///\file
     6 ///\file
     7 ///\brief Dijkstra algorithm.
     7 ///\brief Dijkstra algorithm.
     8 
     8 
     9 // #include <stdio.h>
     9 // #include <stdio.h>
    10 #include <stdlib.h>
    10 #include <stdlib.h>
       
    11 #include <iostream>
       
    12 #include <map>
    11 // #include <stdio>
    13 // #include <stdio>
    12 //#include <stdlib>
    14 //#include <stdlib>
    13 extern "C" {
    15 extern "C" {
    14 #include "glpk.h"
    16 #include "glpk.h"
    15 }
    17 }
   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: