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/ring_sparse.hpp>
00008 #include <realroot/ring_monomial_tensor.hpp>
00009 #include <realroot/ring_bernstein_tensor.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_tensor(const RING& r, const C& c) {
00091 return POLYNOMIAL(c);
00092 }
00093
00094 TMPL POLYNOMIAL
00095 polynomial_bernstein_tensor(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_tensor(const RING& r, const string& s) {
00101 return POLYNOMIAL(as_charp(s));
00102 }
00103
00104 TMPL POLYNOMIAL
00105 polynomial_bernstein_tensor(const RING& r, const generic& s) {
00106 return POLYNOMIAL(as_charp(as_mmx(s)));
00107 }
00108
00109 TMPL POLYNOMIAL
00110 polynomial_bernstein_tensor_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_tensor_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_tensor_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 }
00147
00148 #undef TMPL
00149 #undef RING
00150 #undef POLYNOMIAL
00151 #endif //realroot_ring_bernstein_tensor_glue_hpp