00001 00002 #include <basix/int.hpp> 00003 #include <basix/vector.hpp> 00004 #include <basix/port.hpp> 00005 #include <basix/literal.hpp> 00006 #include <numerix/integer.hpp> 00007 #include <numerix/modular.hpp> 00008 #include <numerix/modular_integer.hpp> 00009 #include <numerix/rational.hpp> 00010 #include <multimix/multivariate_coordinates.hpp> 00011 #include <multimix/multivariate_monomial.hpp> 00012 #include <multimix/multivariate_polynomial.hpp> 00013 #include <multimix/sparse_polynomial_integer.hpp> 00014 #include <multimix/sparse_polynomial_rational.hpp> 00015 #include <multimix/sparse_polynomial_modular.hpp> 00016 #include <multimix/sparse_polynomial_modular_integer.hpp> 00017 #include <numerix/complex.hpp> 00018 #include <algebramix/vector_unrolled.hpp> 00019 #include <algebramix/vector_simd.hpp> 00020 #include <algebramix/vector_modular.hpp> 00021 #include <mblad/bad.hpp> 00022 #include <basix/tuple.hpp> 00023 #include <basix/alias.hpp> 00024 #include <basix/glue.hpp> 00025 00026 #define int_literal(x) as_int (as_string (x)) 00027 #define is_generic_literal is<literal> 00028 #define gen_literal_apply(f,v) gen (as<generic> (f), v) 00029 #define gen_literal_access(f,v) access (as<generic> (f), v) 00030 #define mmx_coordinate multivariate_coordinate<> 00031 #define mmx_coordinates multivariate_coordinates<> 00032 #define mv_monomial multivariate<monomial<> > 00033 00034 #define mv_polynomial(C) multivariate<sparse_polynomial<C> > 00035 00036 00037 namespace mmx { 00038 #define Polynomial \ 00039 multivariate<sparse_polynomial<modular<modulus<C>, modular_local> > > 00040 template<typename C> Polynomial 00041 as_mv_polynomial_modular (const mv_polynomial(C)& f, const modulus<C>& p) { 00042 modular<modulus<C>, modular_local>::set_modulus (p); 00043 return as<Polynomial> (f); } 00044 #undef Polynomial 00045 } 00046 00047 template<typename R> vector<R> 00048 mmx_regular_chain_decision_system (const regular_chain<R>& chain) { 00049 return car (*chain); } 00050 00051 template<typename R> vector<generic> 00052 mmx_regular_chain_attrib (const regular_chain<R>& chain) { 00053 return cdr (*chain); } 00054 00055 00056 namespace mmx { 00057 static mmx_coordinate 00058 GLUE_1 (const mmx_coordinate &arg_1, const tuple<mmx_coordinate> &arg_2) { 00059 return derive (arg_1, as_vector (arg_2)); 00060 } 00061 00062 static vector<mv_polynomial(rational) > 00063 GLUE_2 (const regular_chain<mv_polynomial(rational) > &arg_1) { 00064 return mmx_regular_chain_decision_system (arg_1); 00065 } 00066 00067 static vector<generic> 00068 GLUE_3 (const regular_chain<mv_polynomial(rational) > &arg_1) { 00069 return mmx_regular_chain_attrib (arg_1); 00070 } 00071 00072 static vector<regular_chain<mv_polynomial(rational) > > 00073 GLUE_4 (const tuple<regular_chain<mv_polynomial(rational) > > &arg_1) { 00074 return vector<regular_chain<mv_polynomial(rational) > > (as_vector (arg_1)); 00075 } 00076 00077 static vector<regular_chain<mv_polynomial(rational) > > 00078 GLUE_5 (const tuple<regular_chain<mv_polynomial(rational) > > &arg_1) { 00079 return vector<regular_chain<mv_polynomial(rational) > > (as_vector (arg_1)); 00080 } 00081 00082 static iterator<generic> 00083 GLUE_6 (const vector<regular_chain<mv_polynomial(rational) > > &arg_1) { 00084 return as<iterator<generic> > (iterate (arg_1)); 00085 } 00086 00087 static int 00088 GLUE_7 (const vector<regular_chain<mv_polynomial(rational) > > &arg_1) { 00089 return N (arg_1); 00090 } 00091 00092 static regular_chain<mv_polynomial(rational) > 00093 GLUE_8 (const vector<regular_chain<mv_polynomial(rational) > > &arg_1, const int &arg_2) { 00094 return arg_1[arg_2]; 00095 } 00096 00097 static alias<regular_chain<mv_polynomial(rational) > > 00098 GLUE_9 (const alias<vector<regular_chain<mv_polynomial(rational) > > > &arg_1, const int &arg_2) { 00099 return alias_access<regular_chain<mv_polynomial(rational) > > (arg_1, arg_2); 00100 } 00101 00102 static vector<regular_chain<mv_polynomial(rational) > > 00103 GLUE_10 (const vector<regular_chain<mv_polynomial(rational) > > &arg_1, const int &arg_2, const int &arg_3) { 00104 return range (arg_1, arg_2, arg_3); 00105 } 00106 00107 static vector<regular_chain<mv_polynomial(rational) > > 00108 GLUE_11 (const vector<regular_chain<mv_polynomial(rational) > > &arg_1) { 00109 return reverse (arg_1); 00110 } 00111 00112 static vector<regular_chain<mv_polynomial(rational) > > 00113 GLUE_12 (const vector<regular_chain<mv_polynomial(rational) > > &arg_1, const vector<regular_chain<mv_polynomial(rational) > > &arg_2) { 00114 return append (arg_1, arg_2); 00115 } 00116 00117 static alias<vector<regular_chain<mv_polynomial(rational) > > > 00118 GLUE_13 (const alias<vector<regular_chain<mv_polynomial(rational) > > > &arg_1, const vector<regular_chain<mv_polynomial(rational) > > &arg_2) { 00119 return alias_write (arg_1, arg_2); 00120 } 00121 00122 static vector<regular_chain<mv_polynomial(rational) > > 00123 GLUE_14 (const regular_chain<mv_polynomial(rational) > &arg_1, const vector<regular_chain<mv_polynomial(rational) > > &arg_2) { 00124 return cons (arg_1, arg_2); 00125 } 00126 00127 static regular_chain<mv_polynomial(rational) > 00128 GLUE_15 (const vector<regular_chain<mv_polynomial(rational) > > &arg_1) { 00129 return car (arg_1); 00130 } 00131 00132 static vector<regular_chain<mv_polynomial(rational) > > 00133 GLUE_16 (const vector<regular_chain<mv_polynomial(rational) > > &arg_1) { 00134 return cdr (arg_1); 00135 } 00136 00137 static bool 00138 GLUE_17 (const vector<regular_chain<mv_polynomial(rational) > > &arg_1) { 00139 return is_nil (arg_1); 00140 } 00141 00142 static bool 00143 GLUE_18 (const vector<regular_chain<mv_polynomial(rational) > > &arg_1) { 00144 return is_atom (arg_1); 00145 } 00146 00147 static vector<regular_chain<mv_polynomial(rational) > > 00148 GLUE_19 (const vector<regular_chain<mv_polynomial(rational) > > &arg_1, const regular_chain<mv_polynomial(rational) > &arg_2) { 00149 return insert (arg_1, arg_2); 00150 } 00151 00152 static int 00153 GLUE_20 (const vector<regular_chain<mv_polynomial(rational) > > &arg_1, const regular_chain<mv_polynomial(rational) > &arg_2) { 00154 return find (arg_1, arg_2); 00155 } 00156 00157 static bool 00158 GLUE_21 (const vector<regular_chain<mv_polynomial(rational) > > &arg_1, const regular_chain<mv_polynomial(rational) > &arg_2) { 00159 return contains (arg_1, arg_2); 00160 } 00161 00162 static vector<generic> 00163 GLUE_22 (const vector<regular_chain<mv_polynomial(rational) > > &arg_1) { 00164 return as<vector<generic> > (arg_1); 00165 } 00166 00167 static vector<regular_chain<mv_polynomial(rational) > > 00168 GLUE_23 (const vector<mv_polynomial(rational) > &arg_1, const vector<mv_polynomial(rational) > &arg_2, const vector<mmx_coordinate> &arg_3, const vector<mmx_coordinate> &arg_4) { 00169 return bad_rosenfeld_groebner (arg_1, arg_2, arg_3, arg_4); 00170 } 00171 00172 static vector<regular_chain<mv_polynomial(rational) > > 00173 GLUE_24 (const vector<mv_polynomial(rational) > &arg_1, const vector<mmx_coordinate> &arg_2, const vector<mmx_coordinate> &arg_3) { 00174 return bad_rosenfeld_groebner (arg_1, arg_2, arg_3); 00175 } 00176 00177 void 00178 glue_bad () { 00179 static bool done = false; 00180 if (done) return; 00181 done = true; 00182 call_glue (string ("glue_basix_vector_generic")); 00183 call_glue (string ("glue_rational")); 00184 call_glue (string ("glue_coordinates")); 00185 call_glue (string ("glue_mvpolynomial_generic")); 00186 call_glue (string ("glue_mvpolynomial_rational")); 00187 define ("derivative", GLUE_1); 00188 define_type<regular_chain<mv_polynomial(rational) > > (gen (lit ("Regular_chain"), gen (lit ("MVPolynomial"), lit ("Rational")))); 00189 define (".decision_system", GLUE_2); 00190 define (".attrib", GLUE_3); 00191 define_type<vector<regular_chain<mv_polynomial(rational) > > > (gen (lit ("Vector"), gen (lit ("Regular_chain"), gen (lit ("MVPolynomial"), lit ("Rational"))))); 00192 define ("vector", GLUE_4); 00193 define ("[]", GLUE_5); 00194 define_converter (":>", GLUE_6, PENALTY_CAST); 00195 define ("#", GLUE_7); 00196 define (".[]", GLUE_8); 00197 define (".[]", GLUE_9); 00198 define (".[]", GLUE_10); 00199 define ("reverse", GLUE_11); 00200 define ("><", GLUE_12); 00201 define ("<<", GLUE_13); 00202 define ("cons", GLUE_14); 00203 define ("car", GLUE_15); 00204 define ("cdr", GLUE_16); 00205 define ("nil?", GLUE_17); 00206 define ("atom?", GLUE_18); 00207 define ("insert", GLUE_19); 00208 define ("find", GLUE_20); 00209 define ("contains?", GLUE_21); 00210 define_converter (":>", GLUE_22, PENALTY_PROMOTE_GENERIC); 00211 define ("bad_rosenfeld_groebner", GLUE_23); 00212 define ("bad_rosenfeld_groebner", GLUE_24); 00213 } 00214 }