realroot_doc 0.1.1
/Users/mourrain/Devel/mmx/realroot/include/realroot/bernstein_bzenv.hpp
Go to the documentation of this file.
00001 /********************************************************************
00002  *   This file is part of the source code of the realroot library.
00003  *   Author(s): J.P. Pavone, GALAAD, INRIA
00004  *   $Id: bzenv.hpp,v 1.1 2005/07/11 10:03:55 jppavone Exp $
00005  ********************************************************************/
00006 #ifndef realroot_SOLVE_SBDSLV_BERNSTEIN_BZENV_H
00007 #define realroot_SOLVE_SBDSLV_BERNSTEIN_BZENV_H
00008 //--------------------------------------------------------------------
00009 #include <realroot/loops_vctops.hpp>
00010 #include <realroot/bernstein_binomials.hpp>
00011 //====================================================================
00012 namespace mmx {
00013 //--------------------------------------------------------------------
00014 namespace bernstein
00015 {
00016   template<class X>
00017   struct bzenv
00018   {
00019     typedef int size_t;
00020     binomials<X> m_bins;
00021     static bzenv * const  _default_ ;//= (bzenv*)(&(binomials<X>::_default_));
00022     
00023     bzenv( int n = 100 ) : m_bins(n) {};
00024     
00026     template< typename T >
00027     void scale( T * bzc, size_t sz, int st = 1 )
00028     {
00029       X * bins = m_bins.get(sz-1);
00030       int p = 0;
00031       for ( size_t i = 0; i < sz; i++, p += st ) bzc[p] *= bins[i]; 
00032     };
00033     
00035     template< typename T >
00036     void uscale( T * bzc, size_t sz, int st = 1 ) 
00037     {
00038       X * bins = m_bins.get(sz-1);
00039       int p = 0;
00040       for ( int i = 0; i < sz; i++, p+= st ) bzc[p] /= bins[i];
00041     };
00042     
00043     
00044     /* degree elevation in scaled bernstein basis */
00045     template < typename T >
00046     void scaled_elevate( T * dst, T * src, size_t sz, int sts, int stdst, size_t n )
00047     {
00048       X * bins = m_bins.get(n);
00049       vctops::convolution( dst, src, bins, sz, n+1, sts, 1, stdst );
00050     };
00051     
00052     /* degree elevation in bernstein basis        */
00053     template < typename T >
00054     void elevate( T * dst, T * src, size_t sz, int sts, int stdst, size_t n )
00055     {
00056       scale(src,sz,sts);
00057       scaled_elevate(dst,src,sz,sts,stdst,n);
00058       uscale(src,sz,sts);
00059       uscale(dst,sz+n,stdst);
00060     };
00061     
00062     /* bernstein basis -> monomial basis conversion */
00063     template< typename T >
00064     void toMonoms ( T * bzc, size_t sz, int st = 1 )
00065     {
00066       int i,k;
00067       for ( i = st; i != sz*st; i += st )
00068         for ( k = (sz-1)*st; k != i-st; k -= st )
00069           bzc[k] -= bzc[k-st];
00070       scale(bzc,sz,st);
00071     };
00072     
00073     /* monomials basis -> bernstein basis conversion */
00074     template< typename T > inline
00075     void fromMonomsToScaled( T * bzc, size_t sz, int st )
00076     {
00077       T tmp[sz];
00078       int i,k,p,l;
00079       X * bin;
00080       for ( p = 0, i = 0; i < sz; i++, p += st ) 
00081         { tmp[i] = bzc[p]; bzc[p] = 0; };
00082       for ( p = 0, i = 0; i < sz; i++, p += st )
00083         {
00084           bin = m_bins.get( sz-i-1 );
00085           for ( l = p, k = 0; k < sz-i; k++, l += st )
00086             bzc[l] += tmp[i]*bin[k];
00087         };
00088     };
00089     
00090     template< typename T >  inline
00091     void fromMonoms( T * bzc, size_t sz, int st = 1 )
00092     {
00093       fromMonomsToScaled( bzc, sz, st );
00094       uscale(bzc,sz,st);
00095     };
00096     X * get( size_t i ) { return m_bins.get(i); };
00097     const X& binomial( size_t n, size_t i ) { return m_bins.binomial(n,i); };
00098   };
00099   template<class X>
00100   bzenv<X> * const  bzenv<X>::_default_ = (bzenv<X>*)(&(binomials<X>::_default_));
00101 };
00102 //--------------------------------------------------------------------
00103 } //namespace mmx
00104 /********************************************************************/
00105 #endif //