MathTL
algebra/infinite_vector.h
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
 All Classes Functions Variables Typedefs Enumerations