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/ring_monomial_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 ring_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 }
00129
00130 #undef TMPL
00131 #undef RING
00132 #undef POLYNOMIAL
00133 #endif //realroot_polynomial_tensor_glue_hpp