MathTL
|
00001 // -*- c++ -*- 00002 00003 // +--------------------------------------------------------------------+ 00004 // | This file is part of MathTL - the Mathematical Template Library | 00005 // | | 00006 // | Copyright (c) 2002-2009 | 00007 // | Thorsten Raasch, Manuel Werner | 00008 // +--------------------------------------------------------------------+ 00009 00010 #ifndef _MATHTL_INFINITE_VECTOR_H 00011 #define _MATHTL_INFINITE_VECTOR_H 00012 00013 #include <set> 00014 #include <map> 00015 #include <algorithm> 00016 #include <iterator> 00017 #include <utils/array1d.h> 00018 #include <algebra/infinite_matrix.h> 00019 00020 // external functionality, for convenience: 00021 #include <algebra/vector_norms.h> 00022 #include <algebra/vector_arithmetics.h> 00023 00024 namespace MathTL 00025 { 00037 template <class C, class I = int> 00038 class InfiniteVector 00039 : protected std::map<I,C> 00040 { 00041 public: 00045 InfiniteVector(); 00046 00050 InfiniteVector(const InfiniteVector<C,I>& v); 00051 00055 class const_iterator 00056 : protected std::map<I,C>::const_iterator 00057 { 00058 public: 00062 typedef typename std::map<I,C>::const_iterator::iterator_category iterator_category; 00063 00067 typedef typename std::map<I,C>::const_iterator::value_type value_type; 00068 00072 typedef typename std::map<I,C>::const_iterator::difference_type difference_type; 00073 00077 typedef typename std::map<I,C>::const_iterator::pointer pointer; 00078 00082 typedef typename std::map<I,C>::const_iterator::reference reference; 00083 00087 const_iterator(const typename std::map<I,C>::const_iterator& entry); 00088 00092 const_iterator& operator ++ (); 00093 00097 const_iterator operator ++ (int step); 00098 00102 const C& operator * () const; 00103 00107 const C* operator -> () const; 00108 00113 I index() const; 00114 00118 bool operator == (const const_iterator& it) const; 00119 00123 bool operator != (const const_iterator& it) const; 00124 00128 bool operator < (const const_iterator& it) const; 00129 }; 00130 00134 const_iterator begin() const; 00135 00139 const_iterator end() const; 00140 00145 class const_reverse_iterator 00146 : protected std::reverse_iterator<typename std::map<I,C>::const_iterator> 00147 { 00148 public: 00152 const_reverse_iterator(const std::reverse_iterator<typename std::map<I,C>::const_iterator>& entry); 00153 00157 const_reverse_iterator& operator ++ (); 00158 00162 const_reverse_iterator operator ++ (int step); 00163 00167 const C& operator * () const; 00168 00172 const C* operator -> () const; 00173 00178 I index() const; 00179 00183 bool operator == (const const_reverse_iterator& it) const; 00184 00188 bool operator != (const const_reverse_iterator& it) const; 00189 00193 bool operator < (const const_reverse_iterator& it) const; 00194 }; 00195 00199 const_reverse_iterator rbegin() const; 00200 00204 const_reverse_iterator rend() const; 00205 00209 InfiniteVector<C,I>& operator = (const InfiniteVector<C,I>& v); 00210 00214 void swap (InfiniteVector<C,I>& v); 00215 00219 inline bool empty() const { return std::map<I,C>::empty(); } 00220 00224 void clear(); 00225 00229 bool operator == (const InfiniteVector<C,I>& v) const; 00230 00234 bool operator != (const InfiniteVector<C,I>& v) const; 00235 00239 C operator [] (const I& index) const; 00240 00244 C get_coefficient(const I& index) const; 00245 00249 C& operator [] (const I& index); 00250 00254 void set_coefficient(const I& index, const C value); 00255 00259 size_t size() const; 00260 00264 void support(std::set<I>& supp) const; 00265 00269 void clip(const std::set<I>& supp); 00270 00275 void compress(const double eta = 1e-15); 00276 00280 void add_coefficient(const I& index, const C increment); 00281 00285 void add(const InfiniteVector<C,I>& v); 00286 00290 void add(const C s, const InfiniteVector<C,I>& v); 00291 00296 void sadd(const C s, const InfiniteVector<C,I>& v); 00297 00301 void scale(const C s); 00302 00306 void scale(const InfiniteDiagonalMatrix<C,I>* D, const int k = 1); 00307 00311 InfiniteVector<C,I>& operator += (const InfiniteVector<C,I>& v); 00312 00316 void subtract(const InfiniteVector<C,I>& v); 00317 00321 InfiniteVector<C,I>& operator -= (const InfiniteVector<C,I>& v); 00322 00326 InfiniteVector<C,I>& operator *= (const C c); 00327 00331 InfiniteVector<C,I>& operator /= (const C c); 00332 00336 const C operator * (const InfiniteVector<C,I>& v) const; 00337 00342 struct decreasing_order 00343 : public std::binary_function<const std::pair<I,C>&, 00344 const std::pair<I,C>&, 00345 bool> 00346 { 00347 inline bool operator () (const std::pair<I,C>& p1, 00348 const std::pair<I,C>& p2) 00349 { 00350 return (fabs(p1.second) > fabs(p2.second)); 00351 } 00352 }; 00353 00357 double weak_norm(const double tau) const; 00358 00365 void COARSE(const double eps, InfiniteVector<C,I>& v) const; 00366 00367 // /*! 00368 // Computes v such that \|*this-v\|_{\ell_2}\le\epsilon; 00369 // In contrast to the usual coarse routine, here the 00370 // This routine is a suggestion from Rob Stevenson. 00371 // */ 00372 // void COARSE(const double eps, InfiniteVector<C,I>& v) const; 00373 00381 const double wrmsqr_norm(const double atol, const double rtol, 00382 const InfiniteVector<C,I>& v, const InfiniteVector<C,I>& w) const; 00383 }; 00384 00390 template <class C, class I> 00391 InfiniteVector<C,I> operator + (const InfiniteVector<C,I>& v1, 00392 const InfiniteVector<C,I>& v2) 00393 { 00394 InfiniteVector<C,I> r(v1); 00395 r += v2; 00396 return r; 00397 } 00398 00404 template <class C, class I> 00405 InfiniteVector<C,I> operator - (const InfiniteVector<C,I>& v1, 00406 const InfiniteVector<C,I>& v2) 00407 { 00408 InfiniteVector<C,I> r(v1); 00409 r -= v2; 00410 return r; 00411 } 00412 00414 template <class C, class I> 00415 InfiniteVector<C,I> operator - (const InfiniteVector<C,I>& v) 00416 { 00417 InfiniteVector<C,I> r(v); 00418 r -= C(-1); 00419 return r; 00420 } 00421 00423 template <class C, class I> 00424 InfiniteVector<C,I> operator * (const C c, const InfiniteVector<C,I>& v) 00425 { 00426 InfiniteVector<C,I> r(v); 00427 r *= c; 00428 return r; 00429 } 00430 00434 template <class C, class I> 00435 void swap(InfiniteVector<C,I>& v1, InfiniteVector<C,I>& v2); 00436 00440 template<class C, class I> 00441 std::ostream& operator << (std::ostream& os, const InfiniteVector<C,I>& v); 00442 } 00443 00444 // include implementation of inline functions 00445 #include <algebra/infinite_vector.cpp> 00446 00447 #endif