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 }