realroot_doc 0.1.1
|
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 */