realroot_doc 0.1.1
|
00001 #ifndef realroot_ring_bernstein_glue_hpp 00002 #define realroot_ring_bernstein_glue_hpp 00003 #include <basix/mmx_syntax.hpp> 00004 #include <numerix/kernel.hpp> 00005 #include <realroot/Seq.hpp> 00006 #include <realroot/declare_glue.hpp> 00007 #include <realroot/polynomial_sparse.hpp> 00008 #include <realroot/polynomial_tensor.hpp> 00009 #include <realroot/polynomial_bernstein.hpp> 00010 #define TMPL template <class C> 00011 #define RING ring<C,Bernstein> 00012 #define POLYNOMIAL polynomial<C, with<Bernstein> > 00013 //====================================================================== 00014 namespace mmx { 00015 DECLARE_CLASS(Bernstein,"Bernstein") 00016 00017 TMPL unsigned hash(const RING& p){ return 1;} 00018 TMPL unsigned exact_hash(const RING& p){ return 1;} 00019 TMPL unsigned soft_hash(const RING& p){ return 1;} 00020 00021 TMPL bool exact_eq(const RING& p, const RING& q){ return true;} 00022 TMPL bool exact_neq(const RING& p, const RING& q){ return false;} 00023 00024 TMPL bool operator ==(const RING& p, const RING& q){ return true;} 00025 TMPL bool operator !=(const RING& p, const RING& q){ return false;} 00026 00027 TMPL syntactic flatten(const RING& rg) { 00028 syntactic CF= flatten(scalar_set<C>()); 00029 vector<syntactic> Lv; Lv <<CF; 00030 for(int i=0;i<rg.nbvar();i++) { 00031 Lv<<syntactic(RING::var[i].data()); 00032 } 00033 Lv<<syntactic("Bernstein"); 00034 return apply (GEN_ACCESS, Lv); 00035 } 00036 00037 TMPL RING 00038 ring_bernstein_string(const scalar_set<C>& rg, const vector<string>& s) { 00039 string v; 00040 for(nat i=0;i<N(s);i++) v <<" "<<s[i]; 00041 return RING(as_charp(v)); 00042 } 00043 00044 TMPL RING 00045 ring_tensor_of(const ring<C, Bernstein > & r) { 00046 typedef ring<C, Bernstein > Ring; 00047 std::string v; 00048 for(int i=0; i<r.nbvar(); i++) { 00049 v += Ring::var[i]; 00050 if(i<r.nbvar()-1) v +=" "; 00051 } 00052 return RING(v.data());; 00053 } 00054 00055 TMPL RING 00056 ring_bernstein_of(const ring<C, Sparse, DegRevLex > & r) { 00057 std::string v; 00058 for(int i=0; i<r.nbvar(); i++) { 00059 v += ring<C, Sparse, DegRevLex >::var[i]; 00060 if(i<r.nbvar()-1) v +=" "; 00061 } 00062 return RING(v.data());; 00063 } 00064 00065 00066 TMPL RING 00067 ring_bernstein_generic(const scalar_set<C>& rg, const Bernstein& b, const vector<generic>& s) { 00068 string v; 00069 for(nat i=0;i<N(s);i++) v <<" "<<as_mmx(s[i]); 00070 return RING(as_charp(v)); 00071 } 00072 00073 TMPL RING 00074 ring_bernstein_extend_generic(const RING& R, const vector<generic>& s) { 00075 int nv= RING::nbvar(); 00076 for(nat j=0;j<N(s);j++) 00077 R[nv+j] = POLYNOMIAL( as_charp(as_mmx(s[j])) ); 00078 return R; 00079 } 00080 00081 TMPL syntactic flatten(const POLYNOMIAL& p) { 00082 syntactic r(0); 00083 POLYNOMIAL tmp(p); 00084 tensor::convertb2m(tmp.rep()); 00085 print_flatten(r,tmp.rep(),RING::vars()); 00086 return r; 00087 } 00088 00089 TMPL POLYNOMIAL 00090 polynomial_bernstein(const RING& r, const C& c) { 00091 return POLYNOMIAL(c); 00092 } 00093 00094 TMPL POLYNOMIAL 00095 polynomial_bernstein(const RING& r, const C& c, const int& d, const int& v) { 00096 return POLYNOMIAL(c,d,v); 00097 } 00098 00099 TMPL POLYNOMIAL 00100 polynomial_bernstein(const RING& r, const string& s) { 00101 return POLYNOMIAL(as_charp(s)); 00102 } 00103 00104 TMPL POLYNOMIAL 00105 polynomial_bernstein(const RING& r, const generic& s) { 00106 return POLYNOMIAL(as_charp(as_mmx(s))); 00107 } 00108 00109 TMPL POLYNOMIAL 00110 polynomial_bernstein_of(const polynomial<C, with<Sparse,DegRevLex> > & f) { 00111 POLYNOMIAL r; 00112 convert(r.rep(), f.rep()); 00113 return r; 00114 } 00115 00116 TMPL polynomial<C, with<Sparse,DegRevLex> > 00117 polynomial_sparse_of(const POLYNOMIAL & f) { 00118 polynomial<C, with<Sparse,DegRevLex> > r; 00119 convert(r.rep(), f.rep()); 00120 return r; 00121 } 00122 00123 TMPL polynomial<C, with<MonomialTensor> > 00124 polynomial_tensor_of(const POLYNOMIAL & f) { 00125 polynomial<C, with<MonomialTensor> > r; 00126 convert(r.rep(), f.rep()); 00127 return r; 00128 } 00129 00130 TMPL vector<generic> 00131 polynomial_bernstein_coefficients(const POLYNOMIAL& f, const int & v) { 00132 Seq<POLYNOMIAL> l = coefficients(f,v); 00133 vector<generic> r; 00134 for(unsigned i=0; i< l.size(); i++) 00135 r<< as<generic>(l[i]); 00136 return r; 00137 } 00138 00139 TMPL vector<generic> 00140 polynomial_bernstein_coefficients(const POLYNOMIAL& p) { 00141 vector<generic> r; 00142 for(unsigned i=0; i< p.size();i++) 00143 r<< as<generic>(p[i]); 00144 return r; 00145 } 00146 } //namespace mmx 00147 //====================================================================== 00148 #undef TMPL 00149 #undef RING 00150 #undef POLYNOMIAL 00151 #endif //realroot_polynomial_bernstein_glue_hpp