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 <numerix/complex.hpp>
00011 #include <algebramix/vector_unrolled.hpp>
00012 #include <algebramix/vector_simd.hpp>
00013 #include <algebramix/vector_modular.hpp>
00014 #include <basix/tuple.hpp>
00015 #include <basix/alias.hpp>
00016 #include <basix/glue.hpp>
00017
00018 #define int_literal(x) as_int (as_string (x))
00019 #define is_generic_literal is<literal>
00020 #define gen_literal_apply(f,v) gen (as<generic> (f), v)
00021 #define gen_literal_access(f,v) access (as<generic> (f), v)
00022
00023 namespace mmx {
00024 static vector<rational>
00025 GLUE_1 (const tuple<rational> &arg_1) {
00026 return vector<rational > (as_vector (arg_1));
00027 }
00028
00029 static vector<rational>
00030 GLUE_2 (const tuple<rational> &arg_1) {
00031 return vector<rational > (as_vector (arg_1));
00032 }
00033
00034 static iterator<generic>
00035 GLUE_3 (const vector<rational> &arg_1) {
00036 return as<iterator<generic> > (iterate (arg_1));
00037 }
00038
00039 static int
00040 GLUE_4 (const vector<rational> &arg_1) {
00041 return N (arg_1);
00042 }
00043
00044 static rational
00045 GLUE_5 (const vector<rational> &arg_1, const int &arg_2) {
00046 return arg_1[arg_2];
00047 }
00048
00049 static alias<rational>
00050 GLUE_6 (const alias<vector<rational> > &arg_1, const int &arg_2) {
00051 return alias_access<rational > (arg_1, arg_2);
00052 }
00053
00054 static vector<rational>
00055 GLUE_7 (const vector<rational> &arg_1, const int &arg_2, const int &arg_3) {
00056 return range (arg_1, arg_2, arg_3);
00057 }
00058
00059 static vector<rational>
00060 GLUE_8 (const vector<rational> &arg_1) {
00061 return reverse (arg_1);
00062 }
00063
00064 static vector<rational>
00065 GLUE_9 (const vector<rational> &arg_1, const vector<rational> &arg_2) {
00066 return append (arg_1, arg_2);
00067 }
00068
00069 static alias<vector<rational> >
00070 GLUE_10 (const alias<vector<rational> > &arg_1, const vector<rational> &arg_2) {
00071 return alias_write (arg_1, arg_2);
00072 }
00073
00074 static vector<rational>
00075 GLUE_11 (const rational &arg_1, const vector<rational> &arg_2) {
00076 return cons (arg_1, arg_2);
00077 }
00078
00079 static rational
00080 GLUE_12 (const vector<rational> &arg_1) {
00081 return car (arg_1);
00082 }
00083
00084 static vector<rational>
00085 GLUE_13 (const vector<rational> &arg_1) {
00086 return cdr (arg_1);
00087 }
00088
00089 static bool
00090 GLUE_14 (const vector<rational> &arg_1) {
00091 return is_nil (arg_1);
00092 }
00093
00094 static bool
00095 GLUE_15 (const vector<rational> &arg_1) {
00096 return is_atom (arg_1);
00097 }
00098
00099 static vector<rational>
00100 GLUE_16 (const vector<rational> &arg_1, const rational &arg_2) {
00101 return insert (arg_1, arg_2);
00102 }
00103
00104 static int
00105 GLUE_17 (const vector<rational> &arg_1, const rational &arg_2) {
00106 return find (arg_1, arg_2);
00107 }
00108
00109 static bool
00110 GLUE_18 (const vector<rational> &arg_1, const rational &arg_2) {
00111 return contains (arg_1, arg_2);
00112 }
00113
00114 static vector<complex<rational> >
00115 GLUE_19 (const tuple<complex<rational> > &arg_1) {
00116 return vector<complex<rational> > (as_vector (arg_1));
00117 }
00118
00119 static vector<complex<rational> >
00120 GLUE_20 (const tuple<complex<rational> > &arg_1) {
00121 return vector<complex<rational> > (as_vector (arg_1));
00122 }
00123
00124 static iterator<generic>
00125 GLUE_21 (const vector<complex<rational> > &arg_1) {
00126 return as<iterator<generic> > (iterate (arg_1));
00127 }
00128
00129 static int
00130 GLUE_22 (const vector<complex<rational> > &arg_1) {
00131 return N (arg_1);
00132 }
00133
00134 static complex<rational>
00135 GLUE_23 (const vector<complex<rational> > &arg_1, const int &arg_2) {
00136 return arg_1[arg_2];
00137 }
00138
00139 static alias<complex<rational> >
00140 GLUE_24 (const alias<vector<complex<rational> > > &arg_1, const int &arg_2) {
00141 return alias_access<complex<rational> > (arg_1, arg_2);
00142 }
00143
00144 static vector<complex<rational> >
00145 GLUE_25 (const vector<complex<rational> > &arg_1, const int &arg_2, const int &arg_3) {
00146 return range (arg_1, arg_2, arg_3);
00147 }
00148
00149 static vector<complex<rational> >
00150 GLUE_26 (const vector<complex<rational> > &arg_1) {
00151 return reverse (arg_1);
00152 }
00153
00154 static vector<complex<rational> >
00155 GLUE_27 (const vector<complex<rational> > &arg_1, const vector<complex<rational> > &arg_2) {
00156 return append (arg_1, arg_2);
00157 }
00158
00159 static alias<vector<complex<rational> > >
00160 GLUE_28 (const alias<vector<complex<rational> > > &arg_1, const vector<complex<rational> > &arg_2) {
00161 return alias_write (arg_1, arg_2);
00162 }
00163
00164 static vector<complex<rational> >
00165 GLUE_29 (const complex<rational> &arg_1, const vector<complex<rational> > &arg_2) {
00166 return cons (arg_1, arg_2);
00167 }
00168
00169 static complex<rational>
00170 GLUE_30 (const vector<complex<rational> > &arg_1) {
00171 return car (arg_1);
00172 }
00173
00174 static vector<complex<rational> >
00175 GLUE_31 (const vector<complex<rational> > &arg_1) {
00176 return cdr (arg_1);
00177 }
00178
00179 static bool
00180 GLUE_32 (const vector<complex<rational> > &arg_1) {
00181 return is_nil (arg_1);
00182 }
00183
00184 static bool
00185 GLUE_33 (const vector<complex<rational> > &arg_1) {
00186 return is_atom (arg_1);
00187 }
00188
00189 static vector<complex<rational> >
00190 GLUE_34 (const vector<complex<rational> > &arg_1, const complex<rational> &arg_2) {
00191 return insert (arg_1, arg_2);
00192 }
00193
00194 static int
00195 GLUE_35 (const vector<complex<rational> > &arg_1, const complex<rational> &arg_2) {
00196 return find (arg_1, arg_2);
00197 }
00198
00199 static bool
00200 GLUE_36 (const vector<complex<rational> > &arg_1, const complex<rational> &arg_2) {
00201 return contains (arg_1, arg_2);
00202 }
00203
00204 static vector<rational>
00205 GLUE_37 (const vector<integer> &arg_1) {
00206 return as<vector<rational> > (arg_1);
00207 }
00208
00209 static vector<complex<rational> >
00210 GLUE_38 (const vector<integer> &arg_1) {
00211 return as<vector<complex<rational> > > (arg_1);
00212 }
00213
00214 static vector<generic>
00215 GLUE_39 (const vector<rational> &arg_1) {
00216 return as<vector<generic> > (arg_1);
00217 }
00218
00219 static vector<generic>
00220 GLUE_40 (const vector<complex<rational> > &arg_1) {
00221 return as<vector<generic> > (arg_1);
00222 }
00223
00224 static vector<rational>
00225 GLUE_41 (const vector<rational> &arg_1) {
00226 return -arg_1;
00227 }
00228
00229 static vector<rational>
00230 GLUE_42 (const vector<rational> &arg_1) {
00231 return square (arg_1);
00232 }
00233
00234 static vector<rational>
00235 GLUE_43 (const vector<rational> &arg_1, const vector<rational> &arg_2) {
00236 return arg_1 + arg_2;
00237 }
00238
00239 static vector<rational>
00240 GLUE_44 (const vector<rational> &arg_1, const vector<rational> &arg_2) {
00241 return arg_1 - arg_2;
00242 }
00243
00244 static vector<rational>
00245 GLUE_45 (const vector<rational> &arg_1, const vector<rational> &arg_2) {
00246 return arg_1 * arg_2;
00247 }
00248
00249 static vector<rational>
00250 GLUE_46 (const rational &arg_1, const vector<rational> &arg_2) {
00251 return arg_1 + arg_2;
00252 }
00253
00254 static vector<rational>
00255 GLUE_47 (const vector<rational> &arg_1, const rational &arg_2) {
00256 return arg_1 + arg_2;
00257 }
00258
00259 static vector<rational>
00260 GLUE_48 (const rational &arg_1, const vector<rational> &arg_2) {
00261 return arg_1 - arg_2;
00262 }
00263
00264 static vector<rational>
00265 GLUE_49 (const vector<rational> &arg_1, const rational &arg_2) {
00266 return arg_1 - arg_2;
00267 }
00268
00269 static vector<rational>
00270 GLUE_50 (const rational &arg_1, const vector<rational> &arg_2) {
00271 return arg_1 * arg_2;
00272 }
00273
00274 static vector<rational>
00275 GLUE_51 (const vector<rational> &arg_1, const rational &arg_2) {
00276 return arg_1 * arg_2;
00277 }
00278
00279 static rational
00280 GLUE_52 (const vector<rational> &arg_1, const vector<rational> &arg_2) {
00281 return dot (arg_1, arg_2);
00282 }
00283
00284 static rational
00285 GLUE_53 (const vector<rational> &arg_1) {
00286 return big_mul (arg_1);
00287 }
00288
00289 static rational
00290 GLUE_54 (const vector<rational> &arg_1) {
00291 return big_add (arg_1);
00292 }
00293
00294 static bool
00295 GLUE_55 (const vector<rational> &arg_1, const vector<rational> &arg_2) {
00296 return arg_1 == arg_2;
00297 }
00298
00299 static bool
00300 GLUE_56 (const vector<rational> &arg_1, const vector<rational> &arg_2) {
00301 return arg_1 != arg_2;
00302 }
00303
00304 static bool
00305 GLUE_57 (const vector<rational> &arg_1, const rational &arg_2) {
00306 return arg_1 == arg_2;
00307 }
00308
00309 static bool
00310 GLUE_58 (const vector<rational> &arg_1, const rational &arg_2) {
00311 return arg_1 != arg_2;
00312 }
00313
00314 static bool
00315 GLUE_59 (const rational &arg_1, const vector<rational> &arg_2) {
00316 return arg_1 == arg_2;
00317 }
00318
00319 static bool
00320 GLUE_60 (const rational &arg_1, const vector<rational> &arg_2) {
00321 return arg_1 != arg_2;
00322 }
00323
00324 static vector<complex<rational> >
00325 GLUE_61 (const vector<complex<rational> > &arg_1) {
00326 return -arg_1;
00327 }
00328
00329 static vector<complex<rational> >
00330 GLUE_62 (const vector<complex<rational> > &arg_1) {
00331 return square (arg_1);
00332 }
00333
00334 static vector<complex<rational> >
00335 GLUE_63 (const vector<complex<rational> > &arg_1, const vector<complex<rational> > &arg_2) {
00336 return arg_1 + arg_2;
00337 }
00338
00339 static vector<complex<rational> >
00340 GLUE_64 (const vector<complex<rational> > &arg_1, const vector<complex<rational> > &arg_2) {
00341 return arg_1 - arg_2;
00342 }
00343
00344 static vector<complex<rational> >
00345 GLUE_65 (const vector<complex<rational> > &arg_1, const vector<complex<rational> > &arg_2) {
00346 return arg_1 * arg_2;
00347 }
00348
00349 static vector<complex<rational> >
00350 GLUE_66 (const complex<rational> &arg_1, const vector<complex<rational> > &arg_2) {
00351 return arg_1 + arg_2;
00352 }
00353
00354 static vector<complex<rational> >
00355 GLUE_67 (const vector<complex<rational> > &arg_1, const complex<rational> &arg_2) {
00356 return arg_1 + arg_2;
00357 }
00358
00359 static vector<complex<rational> >
00360 GLUE_68 (const complex<rational> &arg_1, const vector<complex<rational> > &arg_2) {
00361 return arg_1 - arg_2;
00362 }
00363
00364 static vector<complex<rational> >
00365 GLUE_69 (const vector<complex<rational> > &arg_1, const complex<rational> &arg_2) {
00366 return arg_1 - arg_2;
00367 }
00368
00369 static vector<complex<rational> >
00370 GLUE_70 (const complex<rational> &arg_1, const vector<complex<rational> > &arg_2) {
00371 return arg_1 * arg_2;
00372 }
00373
00374 static vector<complex<rational> >
00375 GLUE_71 (const vector<complex<rational> > &arg_1, const complex<rational> &arg_2) {
00376 return arg_1 * arg_2;
00377 }
00378
00379 static complex<rational>
00380 GLUE_72 (const vector<complex<rational> > &arg_1, const vector<complex<rational> > &arg_2) {
00381 return dot (arg_1, arg_2);
00382 }
00383
00384 static complex<rational>
00385 GLUE_73 (const vector<complex<rational> > &arg_1) {
00386 return big_mul (arg_1);
00387 }
00388
00389 static complex<rational>
00390 GLUE_74 (const vector<complex<rational> > &arg_1) {
00391 return big_add (arg_1);
00392 }
00393
00394 static bool
00395 GLUE_75 (const vector<complex<rational> > &arg_1, const vector<complex<rational> > &arg_2) {
00396 return arg_1 == arg_2;
00397 }
00398
00399 static bool
00400 GLUE_76 (const vector<complex<rational> > &arg_1, const vector<complex<rational> > &arg_2) {
00401 return arg_1 != arg_2;
00402 }
00403
00404 static bool
00405 GLUE_77 (const vector<complex<rational> > &arg_1, const complex<rational> &arg_2) {
00406 return arg_1 == arg_2;
00407 }
00408
00409 static bool
00410 GLUE_78 (const vector<complex<rational> > &arg_1, const complex<rational> &arg_2) {
00411 return arg_1 != arg_2;
00412 }
00413
00414 static bool
00415 GLUE_79 (const complex<rational> &arg_1, const vector<complex<rational> > &arg_2) {
00416 return arg_1 == arg_2;
00417 }
00418
00419 static bool
00420 GLUE_80 (const complex<rational> &arg_1, const vector<complex<rational> > &arg_2) {
00421 return arg_1 != arg_2;
00422 }
00423
00424 static vector<rational>
00425 GLUE_81 (const vector<rational> &arg_1) {
00426 return invert (arg_1);
00427 }
00428
00429 static vector<rational>
00430 GLUE_82 (const vector<rational> &arg_1, const vector<rational> &arg_2) {
00431 return arg_1 / arg_2;
00432 }
00433
00434 static vector<rational>
00435 GLUE_83 (const rational &arg_1, const vector<rational> &arg_2) {
00436 return arg_1 / arg_2;
00437 }
00438
00439 static vector<rational>
00440 GLUE_84 (const vector<rational> &arg_1, const rational &arg_2) {
00441 return arg_1 / arg_2;
00442 }
00443
00444 static vector<complex<rational> >
00445 GLUE_85 (const vector<complex<rational> > &arg_1) {
00446 return invert (arg_1);
00447 }
00448
00449 static vector<complex<rational> >
00450 GLUE_86 (const vector<complex<rational> > &arg_1, const vector<complex<rational> > &arg_2) {
00451 return arg_1 / arg_2;
00452 }
00453
00454 static vector<complex<rational> >
00455 GLUE_87 (const complex<rational> &arg_1, const vector<complex<rational> > &arg_2) {
00456 return arg_1 / arg_2;
00457 }
00458
00459 static vector<complex<rational> >
00460 GLUE_88 (const vector<complex<rational> > &arg_1, const complex<rational> &arg_2) {
00461 return arg_1 / arg_2;
00462 }
00463
00464 static bool
00465 GLUE_89 (const vector<rational> &arg_1, const vector<rational> &arg_2) {
00466 return arg_1 <= arg_2;
00467 }
00468
00469 static bool
00470 GLUE_90 (const vector<rational> &arg_1, const vector<rational> &arg_2) {
00471 return arg_1 >= arg_2;
00472 }
00473
00474 static bool
00475 GLUE_91 (const vector<rational> &arg_1, const vector<rational> &arg_2) {
00476 return arg_1 < arg_2;
00477 }
00478
00479 static bool
00480 GLUE_92 (const vector<rational> &arg_1, const vector<rational> &arg_2) {
00481 return arg_1 > arg_2;
00482 }
00483
00484 static bool
00485 GLUE_93 (const vector<rational> &arg_1, const rational &arg_2) {
00486 return arg_1 <= arg_2;
00487 }
00488
00489 static bool
00490 GLUE_94 (const vector<rational> &arg_1, const rational &arg_2) {
00491 return arg_1 >= arg_2;
00492 }
00493
00494 static bool
00495 GLUE_95 (const vector<rational> &arg_1, const rational &arg_2) {
00496 return arg_1 < arg_2;
00497 }
00498
00499 static bool
00500 GLUE_96 (const vector<rational> &arg_1, const rational &arg_2) {
00501 return arg_1 > arg_2;
00502 }
00503
00504 static bool
00505 GLUE_97 (const rational &arg_1, const vector<rational> &arg_2) {
00506 return arg_1 <= arg_2;
00507 }
00508
00509 static bool
00510 GLUE_98 (const rational &arg_1, const vector<rational> &arg_2) {
00511 return arg_1 >= arg_2;
00512 }
00513
00514 static bool
00515 GLUE_99 (const rational &arg_1, const vector<rational> &arg_2) {
00516 return arg_1 < arg_2;
00517 }
00518
00519 static bool
00520 GLUE_100 (const rational &arg_1, const vector<rational> &arg_2) {
00521 return arg_1 > arg_2;
00522 }
00523
00524 static vector<rational>
00525 GLUE_101 (const vector<rational> &arg_1, const vector<rational> &arg_2) {
00526 return inf (arg_1, arg_2);
00527 }
00528
00529 static vector<rational>
00530 GLUE_102 (const vector<rational> &arg_1, const vector<rational> &arg_2) {
00531 return sup (arg_1, arg_2);
00532 }
00533
00534 static vector<rational>
00535 GLUE_103 (const vector<rational> &arg_1) {
00536 return abs (arg_1);
00537 }
00538
00539 static vector<complex<rational> >
00540 GLUE_104 (const vector<rational> &arg_1) {
00541 return as<vector<complex<rational> > > (arg_1);
00542 }
00543
00544 void
00545 glue_vector_rational () {
00546 static bool done = false;
00547 if (done) return;
00548 done = true;
00549 call_glue (string ("glue_complex_rational"));
00550 call_glue (string ("glue_vector_integer"));
00551 define_type<vector<rational> > (gen (lit ("Vector"), lit ("Rational")));
00552 define_type<vector<complex<rational> > > (gen (lit ("Vector"), gen (lit ("Complex"), lit ("Rational"))));
00553 define ("vector", GLUE_1);
00554 define ("[]", GLUE_2);
00555 define_converter (":>", GLUE_3, PENALTY_CAST);
00556 define ("#", GLUE_4);
00557 define (".[]", GLUE_5);
00558 define (".[]", GLUE_6);
00559 define (".[]", GLUE_7);
00560 define ("reverse", GLUE_8);
00561 define ("><", GLUE_9);
00562 define ("<<", GLUE_10);
00563 define ("cons", GLUE_11);
00564 define ("car", GLUE_12);
00565 define ("cdr", GLUE_13);
00566 define ("nil?", GLUE_14);
00567 define ("atom?", GLUE_15);
00568 define ("insert", GLUE_16);
00569 define ("find", GLUE_17);
00570 define ("contains?", GLUE_18);
00571 define ("vector", GLUE_19);
00572 define ("[]", GLUE_20);
00573 define_converter (":>", GLUE_21, PENALTY_CAST);
00574 define ("#", GLUE_22);
00575 define (".[]", GLUE_23);
00576 define (".[]", GLUE_24);
00577 define (".[]", GLUE_25);
00578 define ("reverse", GLUE_26);
00579 define ("><", GLUE_27);
00580 define ("<<", GLUE_28);
00581 define ("cons", GLUE_29);
00582 define ("car", GLUE_30);
00583 define ("cdr", GLUE_31);
00584 define ("nil?", GLUE_32);
00585 define ("atom?", GLUE_33);
00586 define ("insert", GLUE_34);
00587 define ("find", GLUE_35);
00588 define ("contains?", GLUE_36);
00589 define_converter (":>", GLUE_37, PENALTY_INCLUSION);
00590 define_converter (":>", GLUE_38, PENALTY_HOMOMORPHISM);
00591 define_converter (":>", GLUE_39, PENALTY_PROMOTE_GENERIC);
00592 define_converter (":>", GLUE_40, PENALTY_PROMOTE_GENERIC);
00593 define ("-", GLUE_41);
00594 define ("square", GLUE_42);
00595 define ("+", GLUE_43);
00596 define ("-", GLUE_44);
00597 define ("*", GLUE_45);
00598 define ("+", GLUE_46);
00599 define ("+", GLUE_47);
00600 define ("-", GLUE_48);
00601 define ("-", GLUE_49);
00602 define ("*", GLUE_50);
00603 define ("*", GLUE_51);
00604 define ("dot", GLUE_52);
00605 define ("big_mul", GLUE_53);
00606 define ("big_add", GLUE_54);
00607 define ("=", GLUE_55);
00608 define ("!=", GLUE_56);
00609 define ("=", GLUE_57);
00610 define ("!=", GLUE_58);
00611 define ("=", GLUE_59);
00612 define ("!=", GLUE_60);
00613 define ("-", GLUE_61);
00614 define ("square", GLUE_62);
00615 define ("+", GLUE_63);
00616 define ("-", GLUE_64);
00617 define ("*", GLUE_65);
00618 define ("+", GLUE_66);
00619 define ("+", GLUE_67);
00620 define ("-", GLUE_68);
00621 define ("-", GLUE_69);
00622 define ("*", GLUE_70);
00623 define ("*", GLUE_71);
00624 define ("dot", GLUE_72);
00625 define ("big_mul", GLUE_73);
00626 define ("big_add", GLUE_74);
00627 define ("=", GLUE_75);
00628 define ("!=", GLUE_76);
00629 define ("=", GLUE_77);
00630 define ("!=", GLUE_78);
00631 define ("=", GLUE_79);
00632 define ("!=", GLUE_80);
00633 define ("invert", GLUE_81);
00634 define ("/", GLUE_82);
00635 define ("/", GLUE_83);
00636 define ("/", GLUE_84);
00637 define ("invert", GLUE_85);
00638 define ("/", GLUE_86);
00639 define ("/", GLUE_87);
00640 define ("/", GLUE_88);
00641 define ("<=", GLUE_89);
00642 define (">=", GLUE_90);
00643 define ("<", GLUE_91);
00644 define (">", GLUE_92);
00645 define ("<=", GLUE_93);
00646 define (">=", GLUE_94);
00647 define ("<", GLUE_95);
00648 define (">", GLUE_96);
00649 define ("<=", GLUE_97);
00650 define (">=", GLUE_98);
00651 define ("<", GLUE_99);
00652 define (">", GLUE_100);
00653 define ("inf", GLUE_101);
00654 define ("sup", GLUE_102);
00655 define ("abs", GLUE_103);
00656 define_converter (":>", GLUE_104, PENALTY_HOMOMORPHISM);
00657 }
00658 }