realroot_doc 0.1.1
/Users/mourrain/Devel/mmx/realroot/include/realroot/polynomial_bernstein_glue.hpp
Go to the documentation of this file.
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