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