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 <algebramix/vector_unrolled.hpp> 00008 #include <algebramix/vector_simd.hpp> 00009 #include <multimix/multivariate_coordinates.hpp> 00010 #include <multimix/multivariate_monomial.hpp> 00011 #include <multimix/multivariate_polynomial.hpp> 00012 #include <multimix/sparse_polynomial_integer.hpp> 00013 #include <basix/glue.hpp> 00014 00015 #define int_literal(x) as_int (as_string (x)) 00016 #define is_generic_literal is<literal> 00017 #define gen_literal_apply(f,v) gen (as<generic> (f), v) 00018 #define gen_literal_access(f,v) access (as<generic> (f), v) 00019 #define mmx_coordinate multivariate_coordinate<> 00020 #define mmx_coordinates multivariate_coordinates<> 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 integer 00028 GLUE_1 (const lmv_monomial &arg_1) { 00029 return deg (arg_1); 00030 } 00031 00032 static integer 00033 GLUE_2 (const lmv_monomial &arg_1) { 00034 return val (arg_1); 00035 } 00036 00037 static integer 00038 GLUE_3 (const lmv_monomial &arg_1, const mmx_coordinate &arg_2) { 00039 return deg (arg_1, arg_2); 00040 } 00041 00042 static integer 00043 GLUE_4 (const lmv_monomial &arg_1, const mmx_coordinate &arg_2) { 00044 return val (arg_1, arg_2); 00045 } 00046 00047 static lmv_monomial 00048 GLUE_5 (const lmv_monomial &arg_1, const integer &arg_2) { 00049 return binpow (arg_1, arg_2); 00050 } 00051 00052 static integer 00053 GLUE_6 (const lmv_polynomial(generic) &arg_1) { 00054 return deg (arg_1); 00055 } 00056 00057 static integer 00058 GLUE_7 (const lmv_polynomial(generic) &arg_1) { 00059 return val (arg_1); 00060 } 00061 00062 static integer 00063 GLUE_8 (const lmv_polynomial(generic) &arg_1, const mmx_coordinate &arg_2) { 00064 return deg (arg_1, arg_2); 00065 } 00066 00067 static integer 00068 GLUE_9 (const lmv_polynomial(generic) &arg_1, const mmx_coordinate &arg_2) { 00069 return val (arg_1, arg_2); 00070 } 00071 00072 static lmv_polynomial(generic) 00073 GLUE_10 (const lmv_polynomial(generic) &arg_1, const integer &arg_2) { 00074 return binpow (arg_1, arg_2); 00075 } 00076 00077 static lmv_polynomial(integer) 00078 GLUE_11 (const integer &arg_1) { 00079 return (lmv_polynomial(integer ) (arg_1)); 00080 } 00081 00082 static lmv_polynomial(integer) 00083 GLUE_12 (const integer &arg_1, const lmv_monomial &arg_2) { 00084 return (lmv_polynomial(integer ) (arg_1, arg_2)); 00085 } 00086 00087 static lmv_polynomial(integer) 00088 GLUE_13 (const integer &arg_1, const lmv_monomial &arg_2) { 00089 return (lmv_polynomial(integer ) (arg_1, arg_2)); 00090 } 00091 00092 static mmx_coordinates 00093 GLUE_14 (const lmv_polynomial(integer) &arg_1) { 00094 return arg_1.coords; 00095 } 00096 00097 static int 00098 GLUE_15 (const lmv_polynomial(integer) &arg_1) { 00099 return dim (arg_1); 00100 } 00101 00102 static lmv_polynomial(integer) 00103 GLUE_16 (const lmv_monomial &arg_1) { 00104 return (lmv_polynomial(integer ) (arg_1)); 00105 } 00106 00107 static lmv_polynomial(integer) 00108 GLUE_17 (const lmv_monomial &arg_1) { 00109 return (lmv_polynomial(integer ) (arg_1)); 00110 } 00111 00112 static int 00113 GLUE_18 (const lmv_polynomial(integer) &arg_1) { 00114 return N (arg_1); 00115 } 00116 00117 static integer 00118 GLUE_19 (const lmv_polynomial(integer) &arg_1, const int &arg_2) { 00119 return get_coefficient (arg_1, arg_2); 00120 } 00121 00122 static lmv_monomial 00123 GLUE_20 (const lmv_polynomial(integer) &arg_1, const int &arg_2) { 00124 return get_monomial (arg_1, arg_2); 00125 } 00126 00127 static integer 00128 GLUE_21 (const lmv_polynomial(integer) &arg_1, const lmv_monomial &arg_2) { 00129 return arg_1[arg_2]; 00130 } 00131 00132 static lmv_polynomial(integer) 00133 GLUE_22 (const lmv_polynomial(integer) &arg_1, const int &arg_2) { 00134 return homogeneous_part (arg_1, arg_2); 00135 } 00136 00137 static integer 00138 GLUE_23 (const lmv_polynomial(integer) &arg_1) { 00139 return deg (arg_1); 00140 } 00141 00142 static integer 00143 GLUE_24 (const lmv_polynomial(integer) &arg_1) { 00144 return val (arg_1); 00145 } 00146 00147 static integer 00148 GLUE_25 (const lmv_polynomial(integer) &arg_1, const mmx_coordinate &arg_2) { 00149 return deg (arg_1, arg_2); 00150 } 00151 00152 static integer 00153 GLUE_26 (const lmv_polynomial(integer) &arg_1, const mmx_coordinate &arg_2) { 00154 return val (arg_1, arg_2); 00155 } 00156 00157 static lmv_polynomial(integer) 00158 GLUE_27 (const lmv_polynomial(integer) &arg_1, const mmx_coordinate &arg_2, const int &arg_3) { 00159 return coefficient (arg_1, arg_2, arg_3); 00160 } 00161 00162 static lmv_polynomial(integer) 00163 GLUE_28 (const lmv_polynomial(integer) &arg_1) { 00164 return -arg_1; 00165 } 00166 00167 static lmv_polynomial(integer) 00168 GLUE_29 (const lmv_polynomial(integer) &arg_1, const lmv_polynomial(integer) &arg_2) { 00169 return arg_1 + arg_2; 00170 } 00171 00172 static lmv_polynomial(integer) 00173 GLUE_30 (const lmv_polynomial(integer) &arg_1, const lmv_polynomial(integer) &arg_2) { 00174 return arg_1 - arg_2; 00175 } 00176 00177 static lmv_polynomial(integer) 00178 GLUE_31 (const lmv_polynomial(integer) &arg_1, const lmv_polynomial(integer) &arg_2) { 00179 return arg_1 * arg_2; 00180 } 00181 00182 static lmv_polynomial(integer) 00183 GLUE_32 (const lmv_polynomial(integer) &arg_1) { 00184 return square (arg_1); 00185 } 00186 00187 static lmv_polynomial(integer) 00188 GLUE_33 (const lmv_polynomial(integer) &arg_1, const integer &arg_2) { 00189 return binpow (arg_1, arg_2); 00190 } 00191 00192 static lmv_polynomial(integer) 00193 GLUE_34 (const lmv_polynomial(integer) &arg_1, const integer &arg_2) { 00194 return arg_1 + arg_2; 00195 } 00196 00197 static lmv_polynomial(integer) 00198 GLUE_35 (const lmv_polynomial(integer) &arg_1, const integer &arg_2) { 00199 return arg_1 - arg_2; 00200 } 00201 00202 static lmv_polynomial(integer) 00203 GLUE_36 (const lmv_polynomial(integer) &arg_1, const integer &arg_2) { 00204 return arg_1 * arg_2; 00205 } 00206 00207 static lmv_polynomial(integer) 00208 GLUE_37 (const integer &arg_1, const lmv_polynomial(integer) &arg_2) { 00209 return arg_1 + arg_2; 00210 } 00211 00212 static lmv_polynomial(integer) 00213 GLUE_38 (const integer &arg_1, const lmv_polynomial(integer) &arg_2) { 00214 return arg_1 - arg_2; 00215 } 00216 00217 static lmv_polynomial(integer) 00218 GLUE_39 (const integer &arg_1, const lmv_polynomial(integer) &arg_2) { 00219 return arg_1 * arg_2; 00220 } 00221 00222 static lmv_polynomial(integer) 00223 GLUE_40 (const lmv_monomial &arg_1, const lmv_polynomial(integer) &arg_2) { 00224 return arg_1 * arg_2; 00225 } 00226 00227 static lmv_polynomial(integer) 00228 GLUE_41 (const lmv_polynomial(integer) &arg_1, const lmv_monomial &arg_2) { 00229 return arg_1 * arg_2; 00230 } 00231 00232 static bool 00233 GLUE_42 (const lmv_polynomial(integer) &arg_1, const lmv_polynomial(integer) &arg_2) { 00234 return arg_1 == arg_2; 00235 } 00236 00237 static bool 00238 GLUE_43 (const lmv_polynomial(integer) &arg_1, const lmv_polynomial(integer) &arg_2) { 00239 return arg_1 != arg_2; 00240 } 00241 00242 static bool 00243 GLUE_44 (const lmv_polynomial(integer) &arg_1, const integer &arg_2) { 00244 return eq_scalar (arg_1, arg_2); 00245 } 00246 00247 static bool 00248 GLUE_45 (const lmv_polynomial(integer) &arg_1, const integer &arg_2) { 00249 return neq_scalar (arg_1, arg_2); 00250 } 00251 00252 static bool 00253 GLUE_46 (const integer &arg_1, const lmv_polynomial(integer) &arg_2) { 00254 return scalar_eq (arg_1, arg_2); 00255 } 00256 00257 static bool 00258 GLUE_47 (const integer &arg_1, const lmv_polynomial(integer) &arg_2) { 00259 return scalar_neq (arg_1, arg_2); 00260 } 00261 00262 static lmv_polynomial(integer) 00263 GLUE_48 (const lmv_polynomial(integer) &arg_1, const mmx_coordinate &arg_2) { 00264 return derive (arg_1, arg_2); 00265 } 00266 00267 static lmv_polynomial(integer) 00268 GLUE_49 (const lmv_polynomial(integer) &arg_1, const mmx_coordinate &arg_2) { 00269 return xderive (arg_1, arg_2); 00270 } 00271 00272 static lmv_polynomial(generic) 00273 GLUE_50 (const lmv_polynomial(integer) &arg_1) { 00274 return as<lmv_polynomial(generic) > (arg_1); 00275 } 00276 00277 static int 00278 GLUE_51 (const lmv_polynomial(integer) &arg_1) { 00279 return pr_hash (arg_1); 00280 } 00281 00282 static bool 00283 GLUE_52 (const lmv_polynomial(integer) &arg_1, const lmv_polynomial(integer) &arg_2) { 00284 return pr_eq (arg_1, arg_2); 00285 } 00286 00287 static bool 00288 GLUE_53 (const lmv_polynomial(integer) &arg_1, const lmv_polynomial(integer) &arg_2) { 00289 return pr_neq (arg_1, arg_2); 00290 } 00291 00292 static vector<lmv_polynomial(generic) > 00293 GLUE_54 (const vector<lmv_polynomial(generic) > &arg_1) { 00294 return -arg_1; 00295 } 00296 00297 static vector<lmv_polynomial(generic) > 00298 GLUE_55 (const vector<lmv_polynomial(generic) > &arg_1) { 00299 return square (arg_1); 00300 } 00301 00302 static vector<lmv_polynomial(generic) > 00303 GLUE_56 (const vector<lmv_polynomial(generic) > &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00304 return arg_1 + arg_2; 00305 } 00306 00307 static vector<lmv_polynomial(generic) > 00308 GLUE_57 (const vector<lmv_polynomial(generic) > &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00309 return arg_1 - arg_2; 00310 } 00311 00312 static vector<lmv_polynomial(generic) > 00313 GLUE_58 (const vector<lmv_polynomial(generic) > &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00314 return arg_1 * arg_2; 00315 } 00316 00317 static vector<lmv_polynomial(generic) > 00318 GLUE_59 (const lmv_polynomial(generic) &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00319 return arg_1 + arg_2; 00320 } 00321 00322 static vector<lmv_polynomial(generic) > 00323 GLUE_60 (const vector<lmv_polynomial(generic) > &arg_1, const lmv_polynomial(generic) &arg_2) { 00324 return arg_1 + arg_2; 00325 } 00326 00327 static vector<lmv_polynomial(generic) > 00328 GLUE_61 (const lmv_polynomial(generic) &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00329 return arg_1 - arg_2; 00330 } 00331 00332 static vector<lmv_polynomial(generic) > 00333 GLUE_62 (const vector<lmv_polynomial(generic) > &arg_1, const lmv_polynomial(generic) &arg_2) { 00334 return arg_1 - arg_2; 00335 } 00336 00337 static vector<lmv_polynomial(generic) > 00338 GLUE_63 (const lmv_polynomial(generic) &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00339 return arg_1 * arg_2; 00340 } 00341 00342 static vector<lmv_polynomial(generic) > 00343 GLUE_64 (const vector<lmv_polynomial(generic) > &arg_1, const lmv_polynomial(generic) &arg_2) { 00344 return arg_1 * arg_2; 00345 } 00346 00347 static lmv_polynomial(generic) 00348 GLUE_65 (const vector<lmv_polynomial(generic) > &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00349 return dot (arg_1, arg_2); 00350 } 00351 00352 static lmv_polynomial(generic) 00353 GLUE_66 (const vector<lmv_polynomial(generic) > &arg_1) { 00354 return big_mul (arg_1); 00355 } 00356 00357 static lmv_polynomial(generic) 00358 GLUE_67 (const vector<lmv_polynomial(generic) > &arg_1) { 00359 return big_add (arg_1); 00360 } 00361 00362 static bool 00363 GLUE_68 (const vector<lmv_polynomial(generic) > &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00364 return arg_1 == arg_2; 00365 } 00366 00367 static bool 00368 GLUE_69 (const vector<lmv_polynomial(generic) > &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00369 return arg_1 != arg_2; 00370 } 00371 00372 static bool 00373 GLUE_70 (const vector<lmv_polynomial(generic) > &arg_1, const lmv_polynomial(generic) &arg_2) { 00374 return arg_1 == arg_2; 00375 } 00376 00377 static bool 00378 GLUE_71 (const vector<lmv_polynomial(generic) > &arg_1, const lmv_polynomial(generic) &arg_2) { 00379 return arg_1 != arg_2; 00380 } 00381 00382 static bool 00383 GLUE_72 (const lmv_polynomial(generic) &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00384 return arg_1 == arg_2; 00385 } 00386 00387 static bool 00388 GLUE_73 (const lmv_polynomial(generic) &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00389 return arg_1 != arg_2; 00390 } 00391 00392 static vector<lmv_polynomial(generic) > 00393 GLUE_74 (const vector<lmv_polynomial(generic) > &arg_1) { 00394 return invert (arg_1); 00395 } 00396 00397 static vector<lmv_polynomial(generic) > 00398 GLUE_75 (const vector<lmv_polynomial(generic) > &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00399 return arg_1 / arg_2; 00400 } 00401 00402 static vector<lmv_polynomial(generic) > 00403 GLUE_76 (const lmv_polynomial(generic) &arg_1, const vector<lmv_polynomial(generic) > &arg_2) { 00404 return arg_1 / arg_2; 00405 } 00406 00407 static vector<lmv_polynomial(generic) > 00408 GLUE_77 (const vector<lmv_polynomial(generic) > &arg_1, const lmv_polynomial(generic) &arg_2) { 00409 return arg_1 / arg_2; 00410 } 00411 00412 static vector<lmv_monomial> 00413 GLUE_78 (const lmv_polynomial(integer) &arg_1) { 00414 return supp (arg_1); 00415 } 00416 00417 static integer 00418 GLUE_79 (const lmv_polynomial(integer) &arg_1, const vector<mmx_coordinate> &arg_2, const vector<integer> &arg_3) { 00419 return eval (arg_1, arg_2, arg_3); 00420 } 00421 00422 void 00423 glue_lmvpolynomial_integer () { 00424 static bool done = false; 00425 if (done) return; 00426 done = true; 00427 call_glue (string ("glue_vector_integer")); 00428 call_glue (string ("glue_lmvpolynomial_generic")); 00429 define ("deg", GLUE_1); 00430 define ("val", GLUE_2); 00431 define ("deg", GLUE_3); 00432 define ("val", GLUE_4); 00433 define ("^", GLUE_5); 00434 define_type<lmv_polynomial(integer) > (gen (lit ("LMVPolynomial"), lit ("Integer"))); 00435 define ("deg", GLUE_6); 00436 define ("val", GLUE_7); 00437 define ("deg", GLUE_8); 00438 define ("val", GLUE_9); 00439 define ("^", GLUE_10); 00440 define ("lmvpolynomial", GLUE_11); 00441 define ("lmvpolynomial", GLUE_12); 00442 define ("*", GLUE_13); 00443 define (".coordinates", GLUE_14); 00444 define ("dim", GLUE_15); 00445 define ("lmvpolynomial", GLUE_16); 00446 define_converter ("upgrade", GLUE_17, PENALTY_INCLUSION); 00447 define ("#", GLUE_18); 00448 define ("coefficient", GLUE_19); 00449 define ("monomial", GLUE_20); 00450 define (".[]", GLUE_21); 00451 define (".[]", GLUE_22); 00452 define ("deg", GLUE_23); 00453 define ("val", GLUE_24); 00454 define ("deg", GLUE_25); 00455 define ("val", GLUE_26); 00456 define ("coefficient", GLUE_27); 00457 define ("-", GLUE_28); 00458 define ("+", GLUE_29); 00459 define ("-", GLUE_30); 00460 define ("*", GLUE_31); 00461 define ("square", GLUE_32); 00462 define ("^", GLUE_33); 00463 define ("+", GLUE_34); 00464 define ("-", GLUE_35); 00465 define ("*", GLUE_36); 00466 define ("+", GLUE_37); 00467 define ("-", GLUE_38); 00468 define ("*", GLUE_39); 00469 define ("*", GLUE_40); 00470 define ("*", GLUE_41); 00471 define ("=", GLUE_42); 00472 define ("!=", GLUE_43); 00473 define ("=", GLUE_44); 00474 define ("!=", GLUE_45); 00475 define ("=", GLUE_46); 00476 define ("!=", GLUE_47); 00477 define ("derive", GLUE_48); 00478 define ("xderive", GLUE_49); 00479 define_converter (":>", GLUE_50, PENALTY_PROMOTE_GENERIC); 00480 define ("hash%", GLUE_51); 00481 define ("=%", GLUE_52); 00482 define ("!=%", GLUE_53); 00483 define ("-", GLUE_54); 00484 define ("square", GLUE_55); 00485 define ("+", GLUE_56); 00486 define ("-", GLUE_57); 00487 define ("*", GLUE_58); 00488 define ("+", GLUE_59); 00489 define ("+", GLUE_60); 00490 define ("-", GLUE_61); 00491 define ("-", GLUE_62); 00492 define ("*", GLUE_63); 00493 define ("*", GLUE_64); 00494 define ("dot", GLUE_65); 00495 define ("big_mul", GLUE_66); 00496 define ("big_add", GLUE_67); 00497 define ("=", GLUE_68); 00498 define ("!=", GLUE_69); 00499 define ("=", GLUE_70); 00500 define ("!=", GLUE_71); 00501 define ("=", GLUE_72); 00502 define ("!=", GLUE_73); 00503 define ("invert", GLUE_74); 00504 define ("/", GLUE_75); 00505 define ("/", GLUE_76); 00506 define ("/", GLUE_77); 00507 define ("supp", GLUE_78); 00508 define ("eval", GLUE_79); 00509 } 00510 }