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 <algebramix/permutation.hpp> 00015 #include <basix/row_tuple.hpp> 00016 #include <algebramix/matrix.hpp> 00017 #include <algebramix/matrix_ring_naive.hpp> 00018 #include <algebramix/matrix_integer.hpp> 00019 #include <algebramix/matrix_modular_integer.hpp> 00020 #include <algebramix/matrix_quotient.hpp> 00021 #include <algebramix/matrix_complex.hpp> 00022 #include <basix/tuple.hpp> 00023 #include <basix/alias.hpp> 00024 #include <basix/glue.hpp> 00025 00026 #define int_literal(x) as_int (as_string (x)) 00027 #define is_generic_literal is<literal> 00028 #define gen_literal_apply(f,v) gen (as<generic> (f), v) 00029 #define gen_literal_access(f,v) access (as<generic> (f), v) 00030 #define identity_matrix_integer identity_matrix<integer> 00031 #define hilbert_matrix_rational hilbert_matrix<rational> 00032 00033 namespace mmx { 00034 template<typename C> matrix<C> 00035 matrix_new (const vector<row_tuple<C> >& t) { 00036 if (N(t) == 0) return matrix<C> (); 00037 nat i, j, rows= N(t), cols= N(t[0]); 00038 C dummy= zero_cst<C> (); 00039 matrix<C> r (dummy, rows, cols); 00040 for (i=0; i<rows; i++) { 00041 ASSERT (N(t[i]) == cols, "unequal row lengths"); 00042 for (j=0; j<cols; j++) 00043 r(i,j)= t[i][j]; 00044 } 00045 return r; 00046 } 00047 00048 template<typename C> matrix<C> 00049 matrix_new (const vector<C>& t) { 00050 nat j, rows= 1, cols= N(t); 00051 C dummy= zero_cst<C> (); 00052 matrix<C> r (dummy, rows, cols); 00053 for (j=0; j<cols; j++) 00054 r(0,j)= t[j]; 00055 return r; 00056 } 00057 00058 template<typename C> vector<generic> 00059 wrap_column_reduced_echelon_with_permutation (const matrix<C>& m) { 00060 permutation permut; 00061 generic tp=as<generic> (column_reduced_echelon (m, permut)); 00062 return vec (tp, as<generic> (permut)); 00063 } 00064 00065 template<typename C> vector<generic> 00066 wrap_column_reduced_echelon_with_transform (const matrix<C>& m) { 00067 matrix<C> k; 00068 generic tp=as<generic> (column_reduced_echelon (m, k)); 00069 return vec (tp, as<generic> (k)); 00070 } 00071 00072 template<typename C> vector<generic> 00073 wrap_row_reduced_echelon_with_transform (const matrix<C>& m) { 00074 matrix<C> k; 00075 generic tp=as<generic> (row_reduced_echelon (m, k)); 00076 return vec (tp, as<generic> (k)); 00077 } 00078 } 00079 00080 00081 namespace mmx { 00082 static matrix<rational> 00083 GLUE_1 (const int &arg_1) { 00084 return hilbert_matrix_rational (arg_1); 00085 } 00086 00087 static row_tuple<rational> 00088 GLUE_2 (const tuple<rational> &arg_1) { 00089 return row_tuple<rational > (as_vector (arg_1)); 00090 } 00091 00092 static matrix<rational> 00093 GLUE_3 (const tuple<rational> &arg_1) { 00094 return matrix_new (as_vector (arg_1)); 00095 } 00096 00097 static matrix<rational> 00098 GLUE_4 (const tuple<row_tuple<rational> > &arg_1) { 00099 return matrix_new (as_vector (arg_1)); 00100 } 00101 00102 static matrix<rational> 00103 GLUE_5 (const tuple<row_tuple<rational> > &arg_1) { 00104 return matrix_new (as_vector (arg_1)); 00105 } 00106 00107 static int 00108 GLUE_6 (const matrix<rational> &arg_1) { 00109 return N (arg_1); 00110 } 00111 00112 static int 00113 GLUE_7 (const matrix<rational> &arg_1) { 00114 return rows (arg_1); 00115 } 00116 00117 static int 00118 GLUE_8 (const matrix<rational> &arg_1) { 00119 return cols (arg_1); 00120 } 00121 00122 static rational 00123 GLUE_9 (const matrix<rational> &arg_1, const int &arg_2, const int &arg_3) { 00124 return arg_1 (arg_2, arg_3); 00125 } 00126 00127 static alias<rational> 00128 GLUE_10 (const alias<matrix<rational> > &arg_1, const int &arg_2, const int &arg_3) { 00129 return alias_access<rational > (arg_1, arg_2, arg_3); 00130 } 00131 00132 static matrix<rational> 00133 GLUE_11 (const matrix<rational> &arg_1, const int &arg_2, const int &arg_3, const int &arg_4, const int &arg_5) { 00134 return range (arg_1, arg_2, arg_3, arg_4, arg_5); 00135 } 00136 00137 static matrix<rational> 00138 GLUE_12 (const matrix<rational> &arg_1) { 00139 return transpose (arg_1); 00140 } 00141 00142 static matrix<rational> 00143 GLUE_13 (const matrix<rational> &arg_1, const matrix<rational> &arg_2) { 00144 return horizontal_join (arg_1, arg_2); 00145 } 00146 00147 static matrix<rational> 00148 GLUE_14 (const matrix<rational> &arg_1, const matrix<rational> &arg_2) { 00149 return vertical_join (arg_1, arg_2); 00150 } 00151 00152 static matrix<rational> 00153 GLUE_15 (const matrix<rational> &arg_1, const permutation &arg_2) { 00154 return arg_1 * arg_2; 00155 } 00156 00157 static matrix<rational> 00158 GLUE_16 (const permutation &arg_1, const matrix<rational> &arg_2) { 00159 return arg_1 * arg_2; 00160 } 00161 00162 static matrix<rational> 00163 GLUE_17 (const rational &arg_1, const int &arg_2, const int &arg_3) { 00164 return fill_matrix (arg_1, arg_2, arg_3); 00165 } 00166 00167 static matrix<rational> 00168 GLUE_18 (const rational &arg_1, const int &arg_2) { 00169 return jordan_matrix (arg_1, arg_2); 00170 } 00171 00172 static matrix<rational> 00173 GLUE_19 (const matrix<rational> &arg_1) { 00174 return -arg_1; 00175 } 00176 00177 static matrix<rational> 00178 GLUE_20 (const matrix<rational> &arg_1) { 00179 return square (arg_1); 00180 } 00181 00182 static matrix<rational> 00183 GLUE_21 (const matrix<rational> &arg_1, const matrix<rational> &arg_2) { 00184 return arg_1 + arg_2; 00185 } 00186 00187 static matrix<rational> 00188 GLUE_22 (const matrix<rational> &arg_1, const matrix<rational> &arg_2) { 00189 return arg_1 - arg_2; 00190 } 00191 00192 static matrix<rational> 00193 GLUE_23 (const matrix<rational> &arg_1, const matrix<rational> &arg_2) { 00194 return arg_1 * arg_2; 00195 } 00196 00197 static matrix<rational> 00198 GLUE_24 (const rational &arg_1, const matrix<rational> &arg_2) { 00199 return arg_1 + arg_2; 00200 } 00201 00202 static matrix<rational> 00203 GLUE_25 (const matrix<rational> &arg_1, const rational &arg_2) { 00204 return arg_1 + arg_2; 00205 } 00206 00207 static matrix<rational> 00208 GLUE_26 (const rational &arg_1, const matrix<rational> &arg_2) { 00209 return arg_1 - arg_2; 00210 } 00211 00212 static matrix<rational> 00213 GLUE_27 (const matrix<rational> &arg_1, const rational &arg_2) { 00214 return arg_1 - arg_2; 00215 } 00216 00217 static matrix<rational> 00218 GLUE_28 (const rational &arg_1, const matrix<rational> &arg_2) { 00219 return arg_1 * arg_2; 00220 } 00221 00222 static matrix<rational> 00223 GLUE_29 (const matrix<rational> &arg_1, const rational &arg_2) { 00224 return arg_1 * arg_2; 00225 } 00226 00227 static bool 00228 GLUE_30 (const matrix<rational> &arg_1, const matrix<rational> &arg_2) { 00229 return arg_1 == arg_2; 00230 } 00231 00232 static bool 00233 GLUE_31 (const matrix<rational> &arg_1, const matrix<rational> &arg_2) { 00234 return arg_1 != arg_2; 00235 } 00236 00237 static bool 00238 GLUE_32 (const matrix<rational> &arg_1, const rational &arg_2) { 00239 return arg_1 == arg_2; 00240 } 00241 00242 static bool 00243 GLUE_33 (const matrix<rational> &arg_1, const rational &arg_2) { 00244 return arg_1 != arg_2; 00245 } 00246 00247 static bool 00248 GLUE_34 (const rational &arg_1, const matrix<rational> &arg_2) { 00249 return arg_1 == arg_2; 00250 } 00251 00252 static bool 00253 GLUE_35 (const rational &arg_1, const matrix<rational> &arg_2) { 00254 return arg_1 != arg_2; 00255 } 00256 00257 static matrix<rational> 00258 GLUE_36 (const rational &arg_1, const matrix<rational> &arg_2) { 00259 return arg_1 / arg_2; 00260 } 00261 00262 static matrix<rational> 00263 GLUE_37 (const matrix<rational> &arg_1, const rational &arg_2) { 00264 return arg_1 / arg_2; 00265 } 00266 00267 static matrix<rational> 00268 GLUE_38 (const matrix<rational> &arg_1, const matrix<rational> &arg_2) { 00269 return krylov (arg_1, arg_2); 00270 } 00271 00272 static rational 00273 GLUE_39 (const matrix<rational> &arg_1) { 00274 return det (arg_1); 00275 } 00276 00277 static matrix<rational> 00278 GLUE_40 (const matrix<rational> &arg_1) { 00279 return row_echelon (arg_1); 00280 } 00281 00282 static matrix<rational> 00283 GLUE_41 (const matrix<rational> &arg_1) { 00284 return column_echelon (arg_1); 00285 } 00286 00287 static matrix<rational> 00288 GLUE_42 (const matrix<rational> &arg_1) { 00289 return row_reduced_echelon (arg_1); 00290 } 00291 00292 static matrix<rational> 00293 GLUE_43 (const matrix<rational> &arg_1) { 00294 return column_reduced_echelon (arg_1); 00295 } 00296 00297 static vector<generic> 00298 GLUE_44 (const matrix<rational> &arg_1) { 00299 return wrap_row_reduced_echelon_with_transform (arg_1); 00300 } 00301 00302 static vector<generic> 00303 GLUE_45 (const matrix<rational> &arg_1) { 00304 return wrap_column_reduced_echelon_with_transform (arg_1); 00305 } 00306 00307 static vector<generic> 00308 GLUE_46 (const matrix<rational> &arg_1) { 00309 return wrap_column_reduced_echelon_with_permutation (arg_1); 00310 } 00311 00312 static matrix<rational> 00313 GLUE_47 (const matrix<rational> &arg_1) { 00314 return kernel (arg_1); 00315 } 00316 00317 static matrix<rational> 00318 GLUE_48 (const matrix<rational> &arg_1) { 00319 return image (arg_1); 00320 } 00321 00322 static int 00323 GLUE_49 (const matrix<rational> &arg_1) { 00324 return rank (arg_1); 00325 } 00326 00327 static matrix<rational> 00328 GLUE_50 (const matrix<rational> &arg_1) { 00329 return invert (arg_1); 00330 } 00331 00332 static row_tuple<rational> 00333 GLUE_51 (const row_tuple<integer> &arg_1) { 00334 return as<row_tuple<rational> > (arg_1); 00335 } 00336 00337 static matrix<rational> 00338 GLUE_52 (const matrix<integer> &arg_1) { 00339 return as<matrix<rational> > (arg_1); 00340 } 00341 00342 static row_tuple<complex<rational> > 00343 GLUE_53 (const row_tuple<integer> &arg_1) { 00344 return as<row_tuple<complex<rational> > > (arg_1); 00345 } 00346 00347 static matrix<complex<rational> > 00348 GLUE_54 (const matrix<integer> &arg_1) { 00349 return as<matrix<complex<rational> > > (arg_1); 00350 } 00351 00352 static row_tuple<generic> 00353 GLUE_55 (const row_tuple<rational> &arg_1) { 00354 return as<row_tuple<generic> > (arg_1); 00355 } 00356 00357 static matrix<generic> 00358 GLUE_56 (const matrix<rational> &arg_1) { 00359 return as<matrix<generic> > (arg_1); 00360 } 00361 00362 static row_tuple<generic> 00363 GLUE_57 (const row_tuple<complex<rational> > &arg_1) { 00364 return as<row_tuple<generic> > (arg_1); 00365 } 00366 00367 static matrix<generic> 00368 GLUE_58 (const matrix<complex<rational> > &arg_1) { 00369 return as<matrix<generic> > (arg_1); 00370 } 00371 00372 static vector<rational> 00373 GLUE_59 (const vector<int> &arg_1) { 00374 return as<vector<rational> > (arg_1); 00375 } 00376 00377 static vector<complex<rational> > 00378 GLUE_60 (const vector<int> &arg_1) { 00379 return as<vector<complex<rational> > > (arg_1); 00380 } 00381 00382 static vector<rational> 00383 GLUE_61 (const matrix<rational> &arg_1, const int &arg_2) { 00384 return row (arg_1, arg_2); 00385 } 00386 00387 static vector<rational> 00388 GLUE_62 (const matrix<rational> &arg_1, const int &arg_2) { 00389 return column (arg_1, arg_2); 00390 } 00391 00392 static row_tuple<complex<rational> > 00393 GLUE_63 (const tuple<complex<rational> > &arg_1) { 00394 return row_tuple<complex<rational> > (as_vector (arg_1)); 00395 } 00396 00397 static matrix<complex<rational> > 00398 GLUE_64 (const tuple<complex<rational> > &arg_1) { 00399 return matrix_new (as_vector (arg_1)); 00400 } 00401 00402 static matrix<complex<rational> > 00403 GLUE_65 (const tuple<row_tuple<complex<rational> > > &arg_1) { 00404 return matrix_new (as_vector (arg_1)); 00405 } 00406 00407 static matrix<complex<rational> > 00408 GLUE_66 (const tuple<row_tuple<complex<rational> > > &arg_1) { 00409 return matrix_new (as_vector (arg_1)); 00410 } 00411 00412 static int 00413 GLUE_67 (const matrix<complex<rational> > &arg_1) { 00414 return N (arg_1); 00415 } 00416 00417 static int 00418 GLUE_68 (const matrix<complex<rational> > &arg_1) { 00419 return rows (arg_1); 00420 } 00421 00422 static int 00423 GLUE_69 (const matrix<complex<rational> > &arg_1) { 00424 return cols (arg_1); 00425 } 00426 00427 static complex<rational> 00428 GLUE_70 (const matrix<complex<rational> > &arg_1, const int &arg_2, const int &arg_3) { 00429 return arg_1 (arg_2, arg_3); 00430 } 00431 00432 static alias<complex<rational> > 00433 GLUE_71 (const alias<matrix<complex<rational> > > &arg_1, const int &arg_2, const int &arg_3) { 00434 return alias_access<complex<rational> > (arg_1, arg_2, arg_3); 00435 } 00436 00437 static matrix<complex<rational> > 00438 GLUE_72 (const matrix<complex<rational> > &arg_1, const int &arg_2, const int &arg_3, const int &arg_4, const int &arg_5) { 00439 return range (arg_1, arg_2, arg_3, arg_4, arg_5); 00440 } 00441 00442 static vector<complex<rational> > 00443 GLUE_73 (const matrix<complex<rational> > &arg_1, const int &arg_2) { 00444 return row (arg_1, arg_2); 00445 } 00446 00447 static vector<complex<rational> > 00448 GLUE_74 (const matrix<complex<rational> > &arg_1, const int &arg_2) { 00449 return column (arg_1, arg_2); 00450 } 00451 00452 static matrix<complex<rational> > 00453 GLUE_75 (const matrix<complex<rational> > &arg_1) { 00454 return transpose (arg_1); 00455 } 00456 00457 static matrix<complex<rational> > 00458 GLUE_76 (const matrix<complex<rational> > &arg_1, const matrix<complex<rational> > &arg_2) { 00459 return horizontal_join (arg_1, arg_2); 00460 } 00461 00462 static matrix<complex<rational> > 00463 GLUE_77 (const matrix<complex<rational> > &arg_1, const matrix<complex<rational> > &arg_2) { 00464 return vertical_join (arg_1, arg_2); 00465 } 00466 00467 static matrix<complex<rational> > 00468 GLUE_78 (const matrix<complex<rational> > &arg_1, const permutation &arg_2) { 00469 return arg_1 * arg_2; 00470 } 00471 00472 static matrix<complex<rational> > 00473 GLUE_79 (const permutation &arg_1, const matrix<complex<rational> > &arg_2) { 00474 return arg_1 * arg_2; 00475 } 00476 00477 static matrix<rational> 00478 GLUE_80 (const vector<rational> &arg_1) { 00479 return toeplitz_matrix (arg_1); 00480 } 00481 00482 static matrix<rational> 00483 GLUE_81 (const vector<rational> &arg_1) { 00484 return hankel_matrix (arg_1); 00485 } 00486 00487 static matrix<rational> 00488 GLUE_82 (const vector<rational> &arg_1, const vector<rational> &arg_2) { 00489 return tensor_matrix (arg_1, arg_2); 00490 } 00491 00492 static matrix<rational> 00493 GLUE_83 (const vector<rational> &arg_1) { 00494 return vandermonde (arg_1); 00495 } 00496 00497 static vector<rational> 00498 GLUE_84 (const matrix<rational> &arg_1, const vector<rational> &arg_2) { 00499 return arg_1 * arg_2; 00500 } 00501 00502 static vector<rational> 00503 GLUE_85 (const vector<rational> &arg_1, const matrix<rational> &arg_2) { 00504 return arg_1 * arg_2; 00505 } 00506 00507 static matrix<complex<rational> > 00508 GLUE_86 (const complex<rational> &arg_1, const int &arg_2, const int &arg_3) { 00509 return fill_matrix (arg_1, arg_2, arg_3); 00510 } 00511 00512 static matrix<complex<rational> > 00513 GLUE_87 (const complex<rational> &arg_1, const int &arg_2) { 00514 return jordan_matrix (arg_1, arg_2); 00515 } 00516 00517 static matrix<complex<rational> > 00518 GLUE_88 (const vector<complex<rational> > &arg_1) { 00519 return toeplitz_matrix (arg_1); 00520 } 00521 00522 static matrix<complex<rational> > 00523 GLUE_89 (const vector<complex<rational> > &arg_1) { 00524 return hankel_matrix (arg_1); 00525 } 00526 00527 static matrix<complex<rational> > 00528 GLUE_90 (const vector<complex<rational> > &arg_1, const vector<complex<rational> > &arg_2) { 00529 return tensor_matrix (arg_1, arg_2); 00530 } 00531 00532 static matrix<complex<rational> > 00533 GLUE_91 (const vector<complex<rational> > &arg_1) { 00534 return vandermonde (arg_1); 00535 } 00536 00537 static matrix<complex<rational> > 00538 GLUE_92 (const matrix<complex<rational> > &arg_1) { 00539 return -arg_1; 00540 } 00541 00542 static matrix<complex<rational> > 00543 GLUE_93 (const matrix<complex<rational> > &arg_1) { 00544 return square (arg_1); 00545 } 00546 00547 static matrix<complex<rational> > 00548 GLUE_94 (const matrix<complex<rational> > &arg_1, const matrix<complex<rational> > &arg_2) { 00549 return arg_1 + arg_2; 00550 } 00551 00552 static matrix<complex<rational> > 00553 GLUE_95 (const matrix<complex<rational> > &arg_1, const matrix<complex<rational> > &arg_2) { 00554 return arg_1 - arg_2; 00555 } 00556 00557 static matrix<complex<rational> > 00558 GLUE_96 (const matrix<complex<rational> > &arg_1, const matrix<complex<rational> > &arg_2) { 00559 return arg_1 * arg_2; 00560 } 00561 00562 static matrix<complex<rational> > 00563 GLUE_97 (const complex<rational> &arg_1, const matrix<complex<rational> > &arg_2) { 00564 return arg_1 + arg_2; 00565 } 00566 00567 static matrix<complex<rational> > 00568 GLUE_98 (const matrix<complex<rational> > &arg_1, const complex<rational> &arg_2) { 00569 return arg_1 + arg_2; 00570 } 00571 00572 static matrix<complex<rational> > 00573 GLUE_99 (const complex<rational> &arg_1, const matrix<complex<rational> > &arg_2) { 00574 return arg_1 - arg_2; 00575 } 00576 00577 static matrix<complex<rational> > 00578 GLUE_100 (const matrix<complex<rational> > &arg_1, const complex<rational> &arg_2) { 00579 return arg_1 - arg_2; 00580 } 00581 00582 static matrix<complex<rational> > 00583 GLUE_101 (const complex<rational> &arg_1, const matrix<complex<rational> > &arg_2) { 00584 return arg_1 * arg_2; 00585 } 00586 00587 static matrix<complex<rational> > 00588 GLUE_102 (const matrix<complex<rational> > &arg_1, const complex<rational> &arg_2) { 00589 return arg_1 * arg_2; 00590 } 00591 00592 static vector<complex<rational> > 00593 GLUE_103 (const matrix<complex<rational> > &arg_1, const vector<complex<rational> > &arg_2) { 00594 return arg_1 * arg_2; 00595 } 00596 00597 static vector<complex<rational> > 00598 GLUE_104 (const vector<complex<rational> > &arg_1, const matrix<complex<rational> > &arg_2) { 00599 return arg_1 * arg_2; 00600 } 00601 00602 static bool 00603 GLUE_105 (const matrix<complex<rational> > &arg_1, const matrix<complex<rational> > &arg_2) { 00604 return arg_1 == arg_2; 00605 } 00606 00607 static bool 00608 GLUE_106 (const matrix<complex<rational> > &arg_1, const matrix<complex<rational> > &arg_2) { 00609 return arg_1 != arg_2; 00610 } 00611 00612 static bool 00613 GLUE_107 (const matrix<complex<rational> > &arg_1, const complex<rational> &arg_2) { 00614 return arg_1 == arg_2; 00615 } 00616 00617 static bool 00618 GLUE_108 (const matrix<complex<rational> > &arg_1, const complex<rational> &arg_2) { 00619 return arg_1 != arg_2; 00620 } 00621 00622 static bool 00623 GLUE_109 (const complex<rational> &arg_1, const matrix<complex<rational> > &arg_2) { 00624 return arg_1 == arg_2; 00625 } 00626 00627 static bool 00628 GLUE_110 (const complex<rational> &arg_1, const matrix<complex<rational> > &arg_2) { 00629 return arg_1 != arg_2; 00630 } 00631 00632 static matrix<complex<rational> > 00633 GLUE_111 (const complex<rational> &arg_1, const matrix<complex<rational> > &arg_2) { 00634 return arg_1 / arg_2; 00635 } 00636 00637 static matrix<complex<rational> > 00638 GLUE_112 (const matrix<complex<rational> > &arg_1, const complex<rational> &arg_2) { 00639 return arg_1 / arg_2; 00640 } 00641 00642 static matrix<complex<rational> > 00643 GLUE_113 (const matrix<complex<rational> > &arg_1, const matrix<complex<rational> > &arg_2) { 00644 return krylov (arg_1, arg_2); 00645 } 00646 00647 static complex<rational> 00648 GLUE_114 (const matrix<complex<rational> > &arg_1) { 00649 return det (arg_1); 00650 } 00651 00652 static matrix<complex<rational> > 00653 GLUE_115 (const matrix<complex<rational> > &arg_1) { 00654 return row_echelon (arg_1); 00655 } 00656 00657 static matrix<complex<rational> > 00658 GLUE_116 (const matrix<complex<rational> > &arg_1) { 00659 return column_echelon (arg_1); 00660 } 00661 00662 static matrix<complex<rational> > 00663 GLUE_117 (const matrix<complex<rational> > &arg_1) { 00664 return row_reduced_echelon (arg_1); 00665 } 00666 00667 static matrix<complex<rational> > 00668 GLUE_118 (const matrix<complex<rational> > &arg_1) { 00669 return column_reduced_echelon (arg_1); 00670 } 00671 00672 static vector<generic> 00673 GLUE_119 (const matrix<complex<rational> > &arg_1) { 00674 return wrap_row_reduced_echelon_with_transform (arg_1); 00675 } 00676 00677 static vector<generic> 00678 GLUE_120 (const matrix<complex<rational> > &arg_1) { 00679 return wrap_column_reduced_echelon_with_transform (arg_1); 00680 } 00681 00682 static vector<generic> 00683 GLUE_121 (const matrix<complex<rational> > &arg_1) { 00684 return wrap_column_reduced_echelon_with_permutation (arg_1); 00685 } 00686 00687 static matrix<complex<rational> > 00688 GLUE_122 (const matrix<complex<rational> > &arg_1) { 00689 return kernel (arg_1); 00690 } 00691 00692 static matrix<complex<rational> > 00693 GLUE_123 (const matrix<complex<rational> > &arg_1) { 00694 return image (arg_1); 00695 } 00696 00697 static int 00698 GLUE_124 (const matrix<complex<rational> > &arg_1) { 00699 return rank (arg_1); 00700 } 00701 00702 static matrix<complex<rational> > 00703 GLUE_125 (const matrix<complex<rational> > &arg_1) { 00704 return invert (arg_1); 00705 } 00706 00707 static matrix<rational> 00708 GLUE_126 (const matrix<rational> &arg_1) { 00709 return abs (arg_1); 00710 } 00711 00712 static row_tuple<complex<rational> > 00713 GLUE_127 (const row_tuple<rational> &arg_1) { 00714 return as<row_tuple<complex<rational> > > (arg_1); 00715 } 00716 00717 static matrix<complex<rational> > 00718 GLUE_128 (const matrix<rational> &arg_1) { 00719 return as<matrix<complex<rational> > > (arg_1); 00720 } 00721 00722 void 00723 glue_matrix_rational () { 00724 static bool done = false; 00725 if (done) return; 00726 done = true; 00727 call_glue (string ("glue_vector_rational")); 00728 call_glue (string ("glue_matrix_integer")); 00729 define_type<row_tuple<rational> > (gen (lit ("Row"), lit ("Rational"))); 00730 define_type<row_tuple<complex<rational> > > (gen (lit ("Row"), gen (lit ("Complex"), lit ("Rational")))); 00731 define_type<matrix<rational> > (gen (lit ("Matrix"), lit ("Rational"))); 00732 define_type<matrix<complex<rational> > > (gen (lit ("Matrix"), gen (lit ("Complex"), lit ("Rational")))); 00733 define ("hilbert_matrix", GLUE_1); 00734 define ("(.)", GLUE_2); 00735 define ("matrix", GLUE_3); 00736 define ("matrix", GLUE_4); 00737 define ("[]", GLUE_5); 00738 define ("#", GLUE_6); 00739 define ("rows", GLUE_7); 00740 define ("columns", GLUE_8); 00741 define (".[]", GLUE_9); 00742 define (".[]", GLUE_10); 00743 define (".[]", GLUE_11); 00744 define ("transpose", GLUE_12); 00745 define ("horizontal_join", GLUE_13); 00746 define ("vertical_join", GLUE_14); 00747 define ("*", GLUE_15); 00748 define ("*", GLUE_16); 00749 define ("fill_matrix", GLUE_17); 00750 define ("jordan_matrix", GLUE_18); 00751 define ("-", GLUE_19); 00752 define ("square", GLUE_20); 00753 define ("+", GLUE_21); 00754 define ("-", GLUE_22); 00755 define ("*", GLUE_23); 00756 define ("+", GLUE_24); 00757 define ("+", GLUE_25); 00758 define ("-", GLUE_26); 00759 define ("-", GLUE_27); 00760 define ("*", GLUE_28); 00761 define ("*", GLUE_29); 00762 define ("=", GLUE_30); 00763 define ("!=", GLUE_31); 00764 define ("=", GLUE_32); 00765 define ("!=", GLUE_33); 00766 define ("=", GLUE_34); 00767 define ("!=", GLUE_35); 00768 define ("/", GLUE_36); 00769 define ("/", GLUE_37); 00770 define ("krylov", GLUE_38); 00771 define ("det", GLUE_39); 00772 define ("row_echelon", GLUE_40); 00773 define ("column_echelon", GLUE_41); 00774 define ("row_reduced_echelon", GLUE_42); 00775 define ("column_reduced_echelon", GLUE_43); 00776 define ("row_reduced_echelon_with_transform", GLUE_44); 00777 define ("column_reduced_echelon_with_transform", GLUE_45); 00778 define ("column_reduced_echelon_with_permutation", GLUE_46); 00779 define ("ker", GLUE_47); 00780 define ("im", GLUE_48); 00781 define ("rank", GLUE_49); 00782 define ("invert", GLUE_50); 00783 define_converter (":>", GLUE_51, PENALTY_INCLUSION); 00784 define_converter (":>", GLUE_52, PENALTY_INCLUSION); 00785 define_converter (":>", GLUE_53, PENALTY_HOMOMORPHISM); 00786 define_converter (":>", GLUE_54, PENALTY_HOMOMORPHISM); 00787 define_converter (":>", GLUE_55, PENALTY_PROMOTE_GENERIC); 00788 define_converter (":>", GLUE_56, PENALTY_PROMOTE_GENERIC); 00789 define_converter (":>", GLUE_57, PENALTY_PROMOTE_GENERIC); 00790 define_converter (":>", GLUE_58, PENALTY_PROMOTE_GENERIC); 00791 define_converter (":>", GLUE_59, PENALTY_INCLUSION); 00792 define_converter (":>", GLUE_60, PENALTY_HOMOMORPHISM); 00793 define ("row", GLUE_61); 00794 define ("column", GLUE_62); 00795 define ("(.)", GLUE_63); 00796 define ("matrix", GLUE_64); 00797 define ("matrix", GLUE_65); 00798 define ("[]", GLUE_66); 00799 define ("#", GLUE_67); 00800 define ("rows", GLUE_68); 00801 define ("columns", GLUE_69); 00802 define (".[]", GLUE_70); 00803 define (".[]", GLUE_71); 00804 define (".[]", GLUE_72); 00805 define ("row", GLUE_73); 00806 define ("column", GLUE_74); 00807 define ("transpose", GLUE_75); 00808 define ("horizontal_join", GLUE_76); 00809 define ("vertical_join", GLUE_77); 00810 define ("*", GLUE_78); 00811 define ("*", GLUE_79); 00812 define ("toeplitz_matrix", GLUE_80); 00813 define ("hankel_matrix", GLUE_81); 00814 define ("tensor_matrix", GLUE_82); 00815 define ("vandermonde", GLUE_83); 00816 define ("*", GLUE_84); 00817 define ("*", GLUE_85); 00818 define ("fill_matrix", GLUE_86); 00819 define ("jordan_matrix", GLUE_87); 00820 define ("toeplitz_matrix", GLUE_88); 00821 define ("hankel_matrix", GLUE_89); 00822 define ("tensor_matrix", GLUE_90); 00823 define ("vandermonde", GLUE_91); 00824 define ("-", GLUE_92); 00825 define ("square", GLUE_93); 00826 define ("+", GLUE_94); 00827 define ("-", GLUE_95); 00828 define ("*", GLUE_96); 00829 define ("+", GLUE_97); 00830 define ("+", GLUE_98); 00831 define ("-", GLUE_99); 00832 define ("-", GLUE_100); 00833 define ("*", GLUE_101); 00834 define ("*", GLUE_102); 00835 define ("*", GLUE_103); 00836 define ("*", GLUE_104); 00837 define ("=", GLUE_105); 00838 define ("!=", GLUE_106); 00839 define ("=", GLUE_107); 00840 define ("!=", GLUE_108); 00841 define ("=", GLUE_109); 00842 define ("!=", GLUE_110); 00843 define ("/", GLUE_111); 00844 define ("/", GLUE_112); 00845 define ("krylov", GLUE_113); 00846 define ("det", GLUE_114); 00847 define ("row_echelon", GLUE_115); 00848 define ("column_echelon", GLUE_116); 00849 define ("row_reduced_echelon", GLUE_117); 00850 define ("column_reduced_echelon", GLUE_118); 00851 define ("row_reduced_echelon_with_transform", GLUE_119); 00852 define ("column_reduced_echelon_with_transform", GLUE_120); 00853 define ("column_reduced_echelon_with_permutation", GLUE_121); 00854 define ("ker", GLUE_122); 00855 define ("im", GLUE_123); 00856 define ("rank", GLUE_124); 00857 define ("invert", GLUE_125); 00858 define ("abs", GLUE_126); 00859 define_converter (":>", GLUE_127, PENALTY_HOMOMORPHISM); 00860 define_converter (":>", GLUE_128, PENALTY_HOMOMORPHISM); 00861 } 00862 }