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 }