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 }