COIN-OR::LEMON - Graph Library

Ignore:
Timestamp:
01/26/05 16:54:06 (15 years ago)
Author:
marci
Branch:
default
Phase:
public
Convert:
svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@1496
Message:

A proposal or test implementation for linear expression`

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/work/marci/lp/lp_solver_wrapper_3.h

    r1081 r1097  
    99// #include <stdio.h>
    1010#include <stdlib.h>
     11#include <iostream>
     12#include <map>
    1113// #include <stdio>
    1214//#include <stdlib>
     
    157159  };
    158160
     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
    159260  /*! \e
    160261   */
Note: See TracChangeset for help on using the changeset viewer.