00001 00002 #include <basix/int.hpp> 00003 #include <basix/vector.hpp> 00004 #include <multimix/multivariate_coordinates.hpp> 00005 #include <basix/port.hpp> 00006 #include <basix/literal.hpp> 00007 #include <numerix/integer.hpp> 00008 #include <multimix/multivariate_monomial.hpp> 00009 #include <multimix/multivariate_polynomial.hpp> 00010 #include <multimix/sparse_polynomial_integer.hpp> 00011 #include <basix/tuple.hpp> 00012 #include <basix/alias.hpp> 00013 #include <basix/glue.hpp> 00014 00015 #define int_literal(x) as_int (as_string (x)) 00016 #define mmx_coordinate multivariate_coordinate<> 00017 #define mmx_coordinates multivariate_coordinates<> 00018 #define is_generic_literal is<literal> 00019 #define gen_literal_apply(f,v) gen (as<generic> (f), v) 00020 #define gen_literal_access(f,v) access (as<generic> (f), v) 00021 #define lmv_monomial multivariate<monomial<vector<integer> > > 00022 00023 #define lmv_polynomial(C) multivariate<sparse_polynomial<C,monomial<vector<integer> >,sparse_polynomial_naive> > 00024 00025 00026 namespace mmx { 00027 static lmv_polynomial(generic) 00028 GLUE_1 (const generic &arg_1) { 00029 return (lmv_polynomial(generic ) (arg_1)); 00030 } 00031 00032 static lmv_polynomial(generic) 00033 GLUE_2 (const generic &arg_1, const lmv_monomial &arg_2) { 00034 return (lmv_polynomial(generic ) (arg_1, arg_2)); 00035 } 00036 00037 static mmx_coordinates 00038 GLUE_3 (const lmv_polynomial(generic) &arg_1) { 00039 return arg_1.coords; 00040 } 00041 00042 static int 00043 GLUE_4 (const lmv_polynomial(generic) &arg_1) { 00044 return dim (arg_1); 00045 } 00046 00047 static lmv_polynomial(generic) 00048 GLUE_5 (const lmv_monomial &arg_1) { 00049 return (lmv_polynomial(generic ) (arg_1)); 00050 } 00051 00052 static lmv_polynomial(generic) 00053 GLUE_6 (const lmv_monomial &arg_1) { 00054 return (lmv_polynomial(generic ) (arg_1)); 00055 } 00056 00057 static int 00058 GLUE_7 (const lmv_polynomial(generic) &arg_1) { 00059 return N (arg_1); 00060 } 00061 00062 static generic 00063 GLUE_8 (const lmv_polynomial(generic) &arg_1, const int &arg_2) { 00064 return get_coefficient (arg_1, arg_2); 00065 } 00066 00067 static lmv_monomial 00068 GLUE_9 (const lmv_polynomial(generic) &arg_1, const int &arg_2) { 00069 return get_monomial (arg_1, arg_2); 00070 } 00071 00072 static generic 00073 GLUE_10 (const lmv_polynomial(generic) &arg_1, const lmv_monomial &arg_2) { 00074 return arg_1[arg_2]; 00075 } 00076 00077 static lmv_polynomial(generic) 00078 GLUE_11 (const lmv_polynomial(generic) &arg_1, const int &arg_2) { 00079 return homogeneous_part (arg_1, arg_2); 00080 } 00081 00082 static lmv_polynomial(generic) 00083 GLUE_12 (const lmv_polynomial(generic) &arg_1, const mmx_coordinate &arg_2, const int &arg_3) { 00084 return coefficient (arg_1, arg_2, arg_3); 00085 } 00086 00087 static lmv_polynomial(generic) 00088 GLUE_13 (const lmv_polynomial(generic) &arg_1) { 00089 return -arg_1; 00090 } 00091 00092 static lmv_polynomial(generic) 00093 GLUE_14 (const lmv_polynomial(generic) &arg_1, const lmv_polynomial(generic) &arg_2) { 00094 return arg_1 + arg_2; 00095 } 00096 00097 static lmv_polynomial(generic) 00098 GLUE_15 (const lmv_polynomial(generic) &arg_1, const lmv_polynomial(generic) &arg_2) { 00099 return arg_1 - arg_2; 00100 } 00101 00102 static lmv_polynomial(generic) 00103 GLUE_16 (const lmv_polynomial(generic) &arg_1, const lmv_polynomial(generic) &arg_2) { 00104 return arg_1 * arg_2; 00105 } 00106 00107 static lmv_polynomial(generic) 00108 GLUE_17 (const lmv_polynomial(generic) &arg_1) { 00109 return square (arg_1); 00110 } 00111 00112 static lmv_polynomial(generic) 00113 GLUE_18 (const lmv_monomial &arg_1, const lmv_polynomial(generic) &arg_2) { 00114 return arg_1 * arg_2; 00115 } 00116 00117 static lmv_polynomial(generic) 00118 GLUE_19 (const lmv_polynomial(generic) &arg_1, const lmv_monomial &arg_2) { 00119 return arg_1 * arg_2; 00120 } 00121 00122 static bool 00123 GLUE_20 (const lmv_polynomial(generic) &arg_1, const lmv_polynomial(generic) &arg_2) { 00124 return arg_1 == arg_2; 00125 } 00126 00127 static bool 00128 GLUE_21 (const lmv_polynomial(generic) &arg_1, const lmv_polynomial(generic) &arg_2) { 00129 return arg_1 != arg_2; 00130 } 00131 00132 static lmv_polynomial(generic) 00133 GLUE_22 (const lmv_polynomial(generic) &arg_1, const mmx_coordinate &arg_2) { 00134 return derive (arg_1, arg_2); 00135 } 00136 00137 static lmv_polynomial(generic) 00138 GLUE_23 (const lmv_polynomial(generic) &arg_1, const mmx_coordinate &arg_2) { 00139 return xderive (arg_1, arg_2); 00140 } 00141 00142 static lmv_polynomial(generic) 00143 GLUE_24 (const lmv_polynomial(generic) &arg_1, const lmv_polynomial(generic) &arg_2) { 00144 return arg_1 / arg_2; 00145 } 00146 00147 static lmv_polynomial(generic) 00148 GLUE_25 (const lmv_polynomial(generic) &arg_1, const lmv_monomial &arg_2) { 00149 return arg_1 / arg_2; 00150 } 00151 00152 static int 00153 GLUE_26 (const lmv_polynomial(generic) &arg_1) { 00154 return pr_hash (arg_1); 00155 } 00156 00157 static bool 00158 GLUE_27 (const lmv_polynomial(generic) &arg_1, const lmv_polynomial(generic) &arg_2) { 00159 return pr_eq (arg_1, arg_2); 00160 } 00161 00162 static bool 00163 GLUE_28 (const lmv_polynomial(generic) &arg_1, const lmv_polynomial(generic) &arg_2) { 00164 return pr_neq (arg_1, arg_2); 00165 } 00166 00167 static vector<lmv_polynomial(generic) > 00168 GLUE_29 (const tuple<lmv_polynomial(generic) > &arg_1) { 00169 return vector<lmv_polynomial(generic) > (as_vector (arg_1)); 00170 } 00171 00172 static vector<lmv_polynomial(generic) > 00173 GLUE_30 (const tuple<lmv_polynomial(generic) > &arg_1) { 00174 return vector<lmv_polynomial(generic) > (as_vector (arg_1)); 00175 } 00176 00177 static iterator<generic> 00178 GLUE_31 (const vector<lmv_polynomial(generic) > &arg_1) { 00179 return as<iterator<generic> > (iterate (arg_1)); 00180 } 00181 00182 static int 00183 GLUE_32 (const vector<lmv_polynomial(generic) > &arg_1) { 00184 return N (arg_1); 00185 } 00186 00187 static lmv_polynomial(generic) 00188 GLUE_33 (const vector<lmv_polynomial(generic) > &arg_1, const int &arg_2) { 00189 return arg_1[arg_2]; 00190 } 00191 00192 static alias<lmv_polynomial(generic) > 00193 GLUE_34 (const alias<vector<lmv_polynomial(generic) > > &arg_1, const int &arg_2) { 00194 return alias_access<lmv_polynomial(generic) > (arg_1, arg_2); 00195 } 00196 00197 static vector<lmv_polynomial(generic) > 00198 GLUE_35 (const vector<lmv_polynomial(generic) > &arg_1, const int &arg_2, const int &arg_3) { 00199 return range (arg_1, arg_2, arg_3); 00200 } 00201 00202 static vector<lmv_polynomial(generic) > 00203 GLUE_36 (const vector<lmv_polynomial(generic) > &arg_1) { 00204 return reverse (arg_1); 00205 } 00206 00207 static vector<lmv_polynomial(generic) > 00208 GLUE_37 (const vector<lmv_polynomial(generic) > &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00209 return append (arg_1, arg_2); 00210 } 00211 00212 static alias<vector<lmv_polynomial(generic) > > 00213 GLUE_38 (const alias<vector<lmv_polynomial(generic) > > &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00214 return alias_write (arg_1, arg_2); 00215 } 00216 00217 static void 00218 GLUE_39 (const vector<lmv_polynomial(generic) > &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00219 inside_append (arg_1, arg_2); 00220 } 00221 00222 static vector<lmv_polynomial(generic) > 00223 GLUE_40 (const lmv_polynomial(generic) &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00224 return cons (arg_1, arg_2); 00225 } 00226 00227 static lmv_polynomial(generic) 00228 GLUE_41 (const vector<lmv_polynomial(generic) > &arg_1) { 00229 return car (arg_1); 00230 } 00231 00232 static vector<lmv_polynomial(generic) > 00233 GLUE_42 (const vector<lmv_polynomial(generic) > &arg_1) { 00234 return cdr (arg_1); 00235 } 00236 00237 static bool 00238 GLUE_43 (const vector<lmv_polynomial(generic) > &arg_1) { 00239 return is_nil (arg_1); 00240 } 00241 00242 static bool 00243 GLUE_44 (const vector<lmv_polynomial(generic) > &arg_1) { 00244 return is_atom (arg_1); 00245 } 00246 00247 static vector<lmv_polynomial(generic) > 00248 GLUE_45 (const vector<lmv_polynomial(generic) > &arg_1, const lmv_polynomial(generic) &arg_2) { 00249 return insert (arg_1, arg_2); 00250 } 00251 00252 static int 00253 GLUE_46 (const vector<lmv_polynomial(generic) > &arg_1, const lmv_polynomial(generic) &arg_2) { 00254 return find (arg_1, arg_2); 00255 } 00256 00257 static bool 00258 GLUE_47 (const vector<lmv_polynomial(generic) > &arg_1, const lmv_polynomial(generic) &arg_2) { 00259 return contains (arg_1, arg_2); 00260 } 00261 00262 static vector<lmv_monomial> 00263 GLUE_48 (const vector<mmx_coordinate> &arg_1) { 00264 return as<vector<lmv_monomial> > (arg_1); 00265 } 00266 00267 static vector<lmv_polynomial(generic) > 00268 GLUE_49 (const vector<mmx_coordinate> &arg_1) { 00269 return as<vector<lmv_polynomial(generic) > > (arg_1); 00270 } 00271 00272 static vector<lmv_polynomial(generic) > 00273 GLUE_50 (const vector<lmv_monomial> &arg_1) { 00274 return as<vector<lmv_polynomial(generic) > > (arg_1); 00275 } 00276 00277 static vector<generic> 00278 GLUE_51 (const vector<lmv_polynomial(generic) > &arg_1) { 00279 return as<vector<generic> > (arg_1); 00280 } 00281 00282 static vector<lmv_monomial> 00283 GLUE_52 (const lmv_polynomial(generic) &arg_1) { 00284 return supp (arg_1); 00285 } 00286 00287 static generic 00288 GLUE_53 (const lmv_polynomial(generic) &arg_1, const vector<mmx_coordinate> &arg_2, const vector<generic> &arg_3) { 00289 return eval (arg_1, arg_2, arg_3); 00290 } 00291 00292 static int 00293 GLUE_54 (const vector<lmv_polynomial(generic) > &arg_1) { 00294 return pr_hash (arg_1); 00295 } 00296 00297 static bool 00298 GLUE_55 (const vector<lmv_polynomial(generic) > &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00299 return pr_eq (arg_1, arg_2); 00300 } 00301 00302 static bool 00303 GLUE_56 (const vector<lmv_polynomial(generic) > &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00304 return pr_neq (arg_1, arg_2); 00305 } 00306 00307 void 00308 glue_lmvpolynomial_generic () { 00309 static bool done = false; 00310 if (done) return; 00311 done = true; 00312 call_glue (string ("glue_lmonomial")); 00313 call_glue (string ("glue_basix_vector_generic")); 00314 define_type<lmv_polynomial(generic) > (gen (lit ("LMVPolynomial"), lit ("Generic"))); 00315 define ("lmvpolynomial", GLUE_1); 00316 define ("lmvpolynomial", GLUE_2); 00317 define (".coordinates", GLUE_3); 00318 define ("dim", GLUE_4); 00319 define ("lmvpolynomial", GLUE_5); 00320 define_converter ("upgrade", GLUE_6, PENALTY_PROMOTE_GENERIC); 00321 define ("#", GLUE_7); 00322 define ("coefficient", GLUE_8); 00323 define ("monomial", GLUE_9); 00324 define (".[]", GLUE_10); 00325 define (".[]", GLUE_11); 00326 define ("coefficient", GLUE_12); 00327 define ("-", GLUE_13); 00328 define ("+", GLUE_14); 00329 define ("-", GLUE_15); 00330 define ("*", GLUE_16); 00331 define ("square", GLUE_17); 00332 define ("*", GLUE_18); 00333 define ("*", GLUE_19); 00334 define ("=", GLUE_20); 00335 define ("!=", GLUE_21); 00336 define ("derive", GLUE_22); 00337 define ("xderive", GLUE_23); 00338 define ("/", GLUE_24); 00339 define ("/", GLUE_25); 00340 define ("hash%", GLUE_26); 00341 define ("=%", GLUE_27); 00342 define ("!=%", GLUE_28); 00343 define_type<vector<lmv_polynomial(generic) > > (gen (lit ("Vector"), gen (lit ("LMVPolynomial"), lit ("Generic")))); 00344 define ("vector", GLUE_29); 00345 define ("[]", GLUE_30); 00346 define_converter (":>", GLUE_31, PENALTY_PROMOTE_GENERIC); 00347 define ("#", GLUE_32); 00348 define (".[]", GLUE_33); 00349 define (".[]", GLUE_34); 00350 define (".[]", GLUE_35); 00351 define ("reverse", GLUE_36); 00352 define ("><", GLUE_37); 00353 define ("<<", GLUE_38); 00354 define ("append", GLUE_39); 00355 define ("cons", GLUE_40); 00356 define ("car", GLUE_41); 00357 define ("cdr", GLUE_42); 00358 define ("nil?", GLUE_43); 00359 define ("atom?", GLUE_44); 00360 define ("insert", GLUE_45); 00361 define ("find", GLUE_46); 00362 define ("contains?", GLUE_47); 00363 define_converter (":>", GLUE_48, PENALTY_INCLUSION); 00364 define_converter (":>", GLUE_49, PENALTY_PROMOTE_GENERIC); 00365 define_converter (":>", GLUE_50, PENALTY_PROMOTE_GENERIC); 00366 define_converter (":>", GLUE_51, PENALTY_PROMOTE_GENERIC); 00367 define ("supp", GLUE_52); 00368 define ("eval", GLUE_53); 00369 define ("hash%", GLUE_54); 00370 define ("=%", GLUE_55); 00371 define ("!=%", GLUE_56); 00372 } 00373 }