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 }