00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef __MMX_SERIES_VECTOR_HPP
00014 #define __MMX_SERIES_VECTOR_HPP
00015 #include <basix/vector.hpp>
00016 #include <algebramix/series.hpp>
00017 #include <algebramix/matrix.hpp>
00018 #include <algebramix/series_matrix.hpp>
00019
00020 namespace mmx {
00021 #define TMPL template<typename C, typename V, typename W>
00022 #define TMPLU template<typename C, typename V, typename U>
00023 #define TMPLWU template<typename C, typename V, typename W, typename U>
00024 #define Series series<C,V>
00025 #define Vector vector<C,W>
00026 #define Matrix matrix<C,U>
00027 #define Series_rep series_rep<C,V>
00028 #define Series_vector series<Vector,V>
00029 #define Vector_series vector<Series,W>
00030 #define Series_matrix series<Matrix,V>
00031 #define Matrix_series matrix<Series,U>
00032 #define Polynomial polynomial<C, typename series_polynomial_helper<C,V>::PV>
00033
00034
00035
00036
00037
00038 template<typename C, typename V>
00039 struct series_variant_helper<vector<C,V> > {
00040 typedef typename series_variant_helper<C>::SV SV;
00041 };
00042
00043
00044
00045
00046
00047 STYPE_TO_TYPE(TMPL,as_vector_type,Series_vector,Vector_series);
00048
00049 TMPL
00050 class vector_access_series_rep: public Series_rep {
00051 const Series_vector f;
00052 const nat i;
00053 public:
00054 vector_access_series_rep (const Series_vector& f2, nat i2):
00055 Series_rep (get_format1 (CF(f2))), f (f2), i (i2) {}
00056 syntactic expression (const syntactic& z) const {
00057 return access (flatten (f, z), flatten (i)); }
00058 void Increase_order (nat l) {
00059 Series_rep::Increase_order (l);
00060 increase_order (f, l); }
00061 C next () {
00062 if (is_a_scalar (f[this->n])) return C();
00063 return i < N(f[this->n]) ? f[this->n][i] : C(); }
00064 };
00065
00066 TMPL Series
00067 access (const Series_vector& f, nat i) {
00068 return (Series_rep*) new vector_access_series_rep<C,V,W> (f, i);
00069 }
00070
00071 TMPL Vector_series
00072 as_vector (const Series_vector& f, nat n) {
00073 Vector_series v (Series (get_format1 (CF(f))), n);
00074 for (nat i=0; i<n; i++)
00075 v[i]= access (f, i);
00076 return v;
00077 }
00078
00079 TMPL inline Vector_series
00080 as_vector (const Series_vector& f) {
00081 return as_vector (f, N(f[0]));
00082 }
00083
00084 TMPL syntactic
00085 flatten (const Vector_series& v, const syntactic& z) {
00086 syntactic g;
00087 nat i, n= N(v);
00088 vector<syntactic,W> r (g, n);
00089 for (i=0; i<n; i++)
00090 r[i]= flatten (v[i], z);
00091 return flatten (r);
00092 }
00093
00094 TMPL format<Vector >
00095 get_vector_format (const Vector_series& v) {
00096 format<Series > fm1= CF(v);
00097 format<C> fm2= get_format1 (fm1);
00098 C zero= promote (0, fm2);
00099 Vector r (zero, N(v));
00100 return get_format (r);
00101 }
00102
00103 TMPL
00104 class vector_series_rep: public series_rep<Vector,V> {
00105 const Vector_series v;
00106 public:
00107 vector_series_rep (const Vector_series& v2):
00108 series_rep<Vector,V> (get_vector_format (v2)), v (v2) {}
00109 syntactic expression (const syntactic& z) const {
00110 return flatten (v, z); }
00111 void Increase_order (nat l) {
00112 series_rep<Vector,V>::Increase_order (l);
00113 for (nat i=0; i<N(v); i++)
00114 increase_order (v[i], l); }
00115 Vector next () {
00116 nat i, n= N(v);
00117 Vector coeff (promote (0, get_format1 (CF(v))), n);
00118 for (i=0; i<n; i++)
00119 coeff[i]= v[i][this->n];
00120 return coeff; }
00121 };
00122
00123 TMPL Series_vector
00124 as_series (const Vector_series& v) {
00125 return (series_rep<Vector,V>*) new vector_series_rep<C,V,W> (v);
00126 }
00127
00128 TMPL Series_vector
00129 from_vector (const Vector_series& v) {
00130 return (series_rep<Vector,V>*) new vector_series_rep<C,V,W> (v);
00131 }
00132
00133 TMPL vector<Polynomial >
00134 range (const Vector_series& v, nat start, nat end) {
00135 vector<Polynomial > r= fill<Polynomial > (N(v));
00136 for (nat i=0; i<N(v); i++)
00137 r[i]= range (v[i], start, end);
00138 return r;
00139 }
00140
00141 TMPL
00142 class lshiftz_series_vector_rep: public series_rep<Vector,V> {
00143 Series_vector f;
00144 nat s;
00145 int shift;
00146 public:
00147 lshiftz_series_vector_rep (const Series_vector& f2, nat s2, int shift2):
00148 series_rep<Vector,V> (CF(f2)),
00149 f (f2), s (s2), shift (shift2) {}
00150 syntactic expression (const syntactic& z) const {
00151 return lshiftz (flatten (f, z), flatten (shift)); }
00152 void Increase_order (nat l) {
00153 series_rep<Vector,V>::Increase_order (l);
00154 increase_order (f, max (0, ((int) l) - shift)); }
00155 Vector next () { return shift > ((int) this->n)?
00156 Vector (promote (0, get_format1 (CF(f))), s):
00157 f[this->n - shift]; }
00158 };
00159
00160 TMPL inline Series_vector
00161 lshiftz_series_vector (const Series_vector& f, const nat& n,
00162 const int& shift=1) {
00163 if (is_exact_zero (f)) {
00164 Series zero (get_format1 (CF(f)));
00165 return as_series (Vector_series (zero, n));
00166 }
00167 return (series_rep<Vector,V>*)
00168 new lshiftz_series_vector_rep<C,V,W> (f, n, shift);
00169 }
00170
00171
00172
00173
00174
00175 TMPL Series_vector
00176 solve_vector_lde_init (const Series_vector& f, const Vector& c) {
00177 return unary_recursive_series<solve_vector_lde_op> (f, c);
00178 }
00179
00180 TMPL Vector_series
00181 solve_lde_init (const Vector_series& f, const Vector& c) {
00182 return as_vector (solve_vector_lde_init (as_series (f), c));
00183 }
00184
00185 TMPL Series
00186 solve_lde (const Vector_series& f, const Vector& c) {
00187 return read (solve_lde_init (f, c), 0);
00188 }
00189
00190 #undef Polynomial
00191 #undef Series_matrix
00192 #undef Matrix_series
00193 #undef Vector_series
00194 #undef Series_vector
00195 #undef Vector
00196 #undef Matrix
00197 #undef Series
00198 #undef Series_rep
00199 #undef TMPLWU
00200 #undef TMPLU
00201 #undef TMPL
00202 }
00203 #endif // __MMX_SERIES_VECTOR_HPP