realroot_doc 0.1.1
/Users/mourrain/Devel/mmx/realroot/include/realroot/polynomial_tensor_glue.hpp
Go to the documentation of this file.
00001 #ifndef realroot_tensor_monomials_glue_hpp
00002 #define realroot_tensor_monomials_glue_hpp
00003 //====================================================================
00004 #include <basix/mmx_syntax.hpp>
00005 #include <numerix/kernel.hpp>
00006 #include <realroot/Seq.hpp>
00007 #include <realroot/declare_glue.hpp>
00008 #include <realroot/polynomial_tensor.hpp>
00009 
00010 #define TMPL template<class C>
00011 #define RING ring<C, MonomialTensor >
00012 #define POLYNOMIAL polynomial<C, with<MonomialTensor> >
00013 //======================================================================
00014 namespace mmx {
00015   DECLARE_CLASS(MonomialTensor,"MonomialTensor")
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     return apply (GEN_ACCESS, Lv);
00034   }
00035 
00036   TMPL RING 
00037   ring_tensor_string(const scalar_set<C>& rg, const vector<string>& s) {
00038     string v;
00039     for(nat i=0;i<N(s);i++)   v <<" "<<s[i];
00040     return RING(as_charp(v));
00041   }
00042 
00043   TMPL RING ring_tensor_of(const ring<C, Sparse, DegRevLex> & r) {
00044     typedef ring<C, Sparse, DegRevLex>  SparseRing;
00045     std::string v;
00046     for(int i=0; i<r.nbvar(); i++) {
00047       v +=SparseRing::var[i];
00048       if(i<r.nbvar()-1) v +=" ";
00049     }
00050     return RING(v.data());;
00051   }
00052 
00053 
00054 
00055   TMPL RING 
00056   ring_tensor_generic(const scalar_set<C>& rg, const MonomialTensor& b,  
00057                     const vector<generic>& s) {
00058     string v;
00059     for(nat i=0;i<N(s);i++) v <<" "<<as_mmx(s[i]);
00060     return RING(as_charp(v));
00061   }
00062 
00063   TMPL RING ring_tensor_extend_generic(const RING& R, const vector<generic>& s) {
00064     int nv= RING::nbvar();
00065     for(nat j=0;j<N(s);j++) 
00066       R[nv+j] = POLYNOMIAL(as_charp(as_mmx(s[j])));
00067     return R;
00068   }
00069 
00070   TMPL syntactic flatten(const POLYNOMIAL& p) {
00071     typedef typename POLYNOMIAL::const_iterator iterator;
00072     typedef typename POLYNOMIAL::Ring         Ring;
00073     syntactic r(0);
00074     print_flatten(r,p.rep(),Ring::vars());
00075     return r;
00076   }
00077 
00078   TMPL POLYNOMIAL 
00079   polynomial_tensor(const RING& r, const C& c) {
00080     return POLYNOMIAL(c);
00081   }
00082 
00083   TMPL POLYNOMIAL 
00084   polynomial_tensor(const RING& r, const C& c, const int& d, const int& v) {
00085     return POLYNOMIAL(c,d,v);
00086   }
00087 
00088   TMPL POLYNOMIAL 
00089   polynomial_tensor(const RING& r, const string& s) {
00090     return POLYNOMIAL(as_charp(s));
00091   }
00092   
00093   TMPL POLYNOMIAL 
00094   polynomial_tensor(const RING& r, const generic& s) {
00095     return POLYNOMIAL(as_charp(as_mmx(s)));
00096   }
00097   
00098   TMPL POLYNOMIAL
00099   polynomial_tensor_of(const polynomial<C, with<Sparse, DegRevLex> > & f) {
00100     POLYNOMIAL r;
00101     convert(r.rep(), f.rep());
00102     return r;
00103   } 
00104 
00105   TMPL polynomial<C, with<Sparse, DegRevLex> > 
00106   polynomial_sparse_of(const POLYNOMIAL & f) {
00107     POLYNOMIAL r;
00108     convert(r.rep(), f.rep());
00109     return r;
00110   }
00111 
00112   TMPL vector<generic>
00113   polynomial_tensor_coefficients(const POLYNOMIAL& f, const int & v) {
00114     Seq<POLYNOMIAL> l = coefficients(f,v);
00115     vector<generic> r;
00116     for(unsigned i=0; i< l.size(); i++)
00117       r<< as<generic>(l[i]);
00118     return r;
00119   }
00120 
00121   TMPL vector<generic>
00122   polynomial_tensor_coefficients(const POLYNOMIAL& p) {
00123     vector<generic> r;
00124    for(unsigned i=0; i< p.size();i++)
00125      r<< as<generic>(p[i]);
00126    return r;
00127   }
00128 } //namespace mmx
00129 //======================================================================
00130 #undef TMPL
00131 #undef RING
00132 #undef POLYNOMIAL
00133 #endif //realroot_polynomial_tensor_glue_hpp