realroot_doc 0.1.1
/Users/mourrain/Devel/mmx/realroot/include/realroot/tensor_bernstein.hpp
Go to the documentation of this file.
00001 #ifndef realroot_tensor_bernstein_hpp
00002 #define realroot_tensor_bernstein_hpp
00003 
00004 #include "realroot/tensor_monomials.hpp"
00005 
00006 #define TMPL template<class C> 
00007 #define Polynomial bernstein<C> 
00008 namespace mmx {
00009 
00010 namespace tensor
00011 {
00012   template<class C>
00013   struct bernstein : monomials<C>
00014   {
00015     typedef monomials<C>                       base_type;
00016     typedef typename base_type::value_type     value_type;
00017     typedef typename base_type::vector_type    vector_type;
00018     typedef typename base_type::iterator       iterator;
00019     typedef typename base_type::const_iterator const_iterator;
00020     typedef typename base_type::size_type      size_type;
00021 
00022     bernstein( const C& x = 0 );
00023     bernstein( int v, int d): base_type(v,d) {
00024       convertm2b(*this);
00025     }
00026     bernstein( const C& c, int v, int d): base_type(c,v,d) {
00027       convertm2b(*this);
00028     }
00029     bernstein( const bernstein<C>& p) : base_type(p) {
00030       //      std::cout<<"\tcopy"<<std::endl;
00031     }
00032 
00033     template<class X, class O> 
00034     bernstein( const sparse::monomial_seq<X,O>& pol ):base_type(pol) {
00035       convertm2b(*this);
00036     }
00037 
00038     bernstein( const char* str ):base_type(str) {
00039       convertm2b(*this);
00040     }
00041 
00042     template<class VECT> 
00043     bernstein( const char* str, const VECT& bx):base_type(str) {
00044       convertm2b(*this, bx);
00045     }
00046     
00047     template<class O, class VECT> 
00048     bernstein( const sparse::monomial_seq<C,O>& pol, const VECT& bx):base_type(pol) {
00049       convertm2b(*this, bx);
00050     }
00051     
00052 
00053     template<class X, class O, class VECT> 
00054     bernstein(const sparse::monomial_seq<X,O>& mpol, const VECT& bx ):base_type(mpol)     {
00055       convertm2b(*this, bx);
00056     }
00057 
00058     bernstein( const eenv & e);
00059     bernstein( const eenv& e, const C& c );
00060     bernstein( int nvr, const int * szs, const int * vrs = 0 );
00061 
00062     bernstein& operator=( const C& x );
00063     C& operator[]( int i ) { return this->data[i]; };
00064     C  operator[]( int i ) const { return this->data[i]; };
00065     bool operator==( const C& c ) const { return base_type::esz() == 1 && base_type::data[0] == c; };
00066     bool operator==( const bernstein& mp ) const;
00067   };
00068   
00069   template<class C> inline
00070   unsigned size(const bernstein<C>& p) {return p.size();}
00071 
00072   template<class C> inline int 
00073   degree(const bernstein<C>& p) {return degree((const monomials<C>&)p);}
00074 
00075   template<class C> inline int
00076   degree(const bernstein<C>& p, int v) {return degree((const monomials<C>&)p,v);}
00077 
00078 
00079   TMPL Polynomial diff(const Polynomial& p, int v)
00080   {
00081     Polynomial dp(p);   diff(dp,p,v);   return dp;
00082   }
00083 
00084   template<class C,class U> void coefficients(Seq<U>& r, const Polynomial& p, int v){
00085 
00086   }
00087   
00088 };
00089 
00090 } //namespace mmx
00091 
00092 #include "tensor_bernstein_fcts.hpp"
00093 
00094 //======================================================================
00095 namespace mmx {
00096 # undef  Polynomial
00097 # define Polynomial tensor::bernstein<C>
00098 # define TMPL template<class C>
00099 
00100 template<class A, class B> struct use;
00101 struct operators_of;
00102 
00103 TMPL struct use<operators_of,Polynomial> {
00104 
00105     static inline void 
00106     add (Polynomial &r, const Polynomial &a ) { 
00107       tensor::add (r, a); 
00108     }
00109     static inline void 
00110     add (Polynomial &r, const Polynomial &a, const Polynomial &b) {
00111       tensor::add (r, a, b); 
00112     }
00113     static inline void
00114     add (Polynomial &r, const Polynomial &a, const C & b) {
00115       tensor::add (r, a, b); 
00116     }
00117     static inline void
00118     add (Polynomial &r, const C & a, const Polynomial &b) {
00119       tensor::add (r, b, a); 
00120     }
00121     static inline void
00122     sub (Polynomial &r, const Polynomial &a ) {
00123       tensor::sub (r, a ); 
00124     }
00125     static inline void
00126     sub (Polynomial &r, const Polynomial &a, const Polynomial &b) {
00127       tensor::sub (r, a, b); 
00128     }
00129     static inline void
00130     sub (Polynomial &r, const C & a, const Polynomial &b) {
00131       tensor::sub (r, a, b); 
00132     }
00133     static inline void
00134     sub (Polynomial &r, const Polynomial &a, const C & b) {
00135       tensor::sub (r, a, b); 
00136     }
00137     static inline void
00138     mul (Polynomial &r, const Polynomial &a ) {
00139       tensor::mul (r, a ); 
00140     }
00141     static inline void
00142     mul (Polynomial &r, const Polynomial &a, const Polynomial &b) {
00143       tensor::mul (r, a, b); 
00144 }
00145     static inline void
00146     mul (Polynomial &r, const Polynomial &a, const C & b) {
00147       tensor::mul (r, a, b); }
00148     static inline void
00149     mul (Polynomial &r, const C & a, const Polynomial &b) {
00150       tensor::mul (r, b, a); 
00151     }
00152     static inline void
00153     div (Polynomial &r, const Polynomial &a, const Polynomial &b) {
00154       tensor::div (r, a, b); 
00155     }
00156     static inline void
00157     div (Polynomial &r, const Polynomial &a, const C & b) {
00158       tensor::div (r, a, b); 
00159     }
00160    //  static inline void
00161 //     rem (Polynomial &r, const Polynomial &a, const Polynomial &b) {
00162 //       tensor::rem (r, b, a); 
00163 //     }
00164 };
00165 # undef Polynomial
00166 # undef TMPL
00167 //====================================================================
00168 } //namespace mmx
00169 #undef TMPL
00170 #undef Polynomial
00171 #endif /* realroot_tensor_bernstein_hpp */