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 <numerix/tangent.hpp>
00012 #include <basix/glue.hpp>
00013 
00014 #define int_literal(x) as_int (as_string (x))
00015 #define is_generic_literal is<literal>
00016 #define gen_literal_apply(f,v) gen (as<generic> (f), v)
00017 #define gen_literal_access(f,v) access (as<generic> (f), v)
00018 
00019 namespace mmx {
00020   static tangent<rational, rational>
00021   GLUE_1 (const rational &arg_1) {
00022     return tangent<rational, rational > (arg_1);
00023   }
00024   
00025   static tangent<rational, rational>
00026   GLUE_2 (const rational &arg_1) {
00027     return tangent<rational, rational > (arg_1);
00028   }
00029   
00030   static tangent<rational, rational>
00031   GLUE_3 (const rational &arg_1, const rational &arg_2) {
00032     return tangent<rational, rational > (arg_1, arg_2);
00033   }
00034   
00035   static rational
00036   GLUE_4 (const tangent<rational, rational> &arg_1) {
00037     return base (arg_1);
00038   }
00039   
00040   static rational
00041   GLUE_5 (const tangent<rational, rational> &arg_1) {
00042     return slope (arg_1);
00043   }
00044   
00045   static tangent<rational, rational>
00046   GLUE_6 (const tangent<rational, rational> &arg_1) {
00047     return -arg_1;
00048   }
00049   
00050   static tangent<rational, rational>
00051   GLUE_7 (const tangent<rational, rational> &arg_1) {
00052     return square (arg_1);
00053   }
00054   
00055   static tangent<rational, rational>
00056   GLUE_8 (const tangent<rational, rational> &arg_1, const tangent<rational, rational> &arg_2) {
00057     return arg_1 + arg_2;
00058   }
00059   
00060   static tangent<rational, rational>
00061   GLUE_9 (const tangent<rational, rational> &arg_1, const tangent<rational, rational> &arg_2) {
00062     return arg_1 - arg_2;
00063   }
00064   
00065   static tangent<rational, rational>
00066   GLUE_10 (const tangent<rational, rational> &arg_1, const tangent<rational, rational> &arg_2) {
00067     return arg_1 * arg_2;
00068   }
00069   
00070   static bool
00071   GLUE_11 (const tangent<rational, rational> &arg_1, const tangent<rational, rational> &arg_2) {
00072     return arg_1 == arg_2;
00073   }
00074   
00075   static bool
00076   GLUE_12 (const tangent<rational, rational> &arg_1, const tangent<rational, rational> &arg_2) {
00077     return arg_1 != arg_2;
00078   }
00079   
00080   static bool
00081   GLUE_13 (const tangent<rational, rational> &arg_1, const rational &arg_2) {
00082     return arg_1 == arg_2;
00083   }
00084   
00085   static bool
00086   GLUE_14 (const tangent<rational, rational> &arg_1, const rational &arg_2) {
00087     return arg_1 != arg_2;
00088   }
00089   
00090   static bool
00091   GLUE_15 (const rational &arg_1, const tangent<rational, rational> &arg_2) {
00092     return arg_1 == arg_2;
00093   }
00094   
00095   static bool
00096   GLUE_16 (const rational &arg_1, const tangent<rational, rational> &arg_2) {
00097     return arg_1 != arg_2;
00098   }
00099   
00100   static tangent<rational, rational>
00101   GLUE_17 (const tangent<rational, rational> &arg_1, const tangent<rational, rational> &arg_2) {
00102     return arg_1 / arg_2;
00103   }
00104   
00105   static tangent<complex<rational> , complex<rational> >
00106   GLUE_18 (const complex<rational> &arg_1) {
00107     return tangent<complex<rational>, complex<rational> > (arg_1);
00108   }
00109   
00110   static tangent<complex<rational> , complex<rational> >
00111   GLUE_19 (const complex<rational> &arg_1) {
00112     return tangent<complex<rational>, complex<rational> > (arg_1);
00113   }
00114   
00115   static tangent<complex<rational> , complex<rational> >
00116   GLUE_20 (const complex<rational> &arg_1, const complex<rational> &arg_2) {
00117     return tangent<complex<rational>, complex<rational> > (arg_1, arg_2);
00118   }
00119   
00120   static complex<rational>
00121   GLUE_21 (const tangent<complex<rational> , complex<rational> > &arg_1) {
00122     return base (arg_1);
00123   }
00124   
00125   static complex<rational>
00126   GLUE_22 (const tangent<complex<rational> , complex<rational> > &arg_1) {
00127     return slope (arg_1);
00128   }
00129   
00130   static tangent<complex<rational> , complex<rational> >
00131   GLUE_23 (const tangent<complex<rational> , complex<rational> > &arg_1) {
00132     return -arg_1;
00133   }
00134   
00135   static tangent<complex<rational> , complex<rational> >
00136   GLUE_24 (const tangent<complex<rational> , complex<rational> > &arg_1) {
00137     return square (arg_1);
00138   }
00139   
00140   static tangent<complex<rational> , complex<rational> >
00141   GLUE_25 (const tangent<complex<rational> , complex<rational> > &arg_1, const tangent<complex<rational> , complex<rational> > &arg_2) {
00142     return arg_1 + arg_2;
00143   }
00144   
00145   static tangent<complex<rational> , complex<rational> >
00146   GLUE_26 (const tangent<complex<rational> , complex<rational> > &arg_1, const tangent<complex<rational> , complex<rational> > &arg_2) {
00147     return arg_1 - arg_2;
00148   }
00149   
00150   static tangent<complex<rational> , complex<rational> >
00151   GLUE_27 (const tangent<complex<rational> , complex<rational> > &arg_1, const tangent<complex<rational> , complex<rational> > &arg_2) {
00152     return arg_1 * arg_2;
00153   }
00154   
00155   static bool
00156   GLUE_28 (const tangent<complex<rational> , complex<rational> > &arg_1, const tangent<complex<rational> , complex<rational> > &arg_2) {
00157     return arg_1 == arg_2;
00158   }
00159   
00160   static bool
00161   GLUE_29 (const tangent<complex<rational> , complex<rational> > &arg_1, const tangent<complex<rational> , complex<rational> > &arg_2) {
00162     return arg_1 != arg_2;
00163   }
00164   
00165   static bool
00166   GLUE_30 (const tangent<complex<rational> , complex<rational> > &arg_1, const complex<rational> &arg_2) {
00167     return arg_1 == arg_2;
00168   }
00169   
00170   static bool
00171   GLUE_31 (const tangent<complex<rational> , complex<rational> > &arg_1, const complex<rational> &arg_2) {
00172     return arg_1 != arg_2;
00173   }
00174   
00175   static bool
00176   GLUE_32 (const complex<rational> &arg_1, const tangent<complex<rational> , complex<rational> > &arg_2) {
00177     return arg_1 == arg_2;
00178   }
00179   
00180   static bool
00181   GLUE_33 (const complex<rational> &arg_1, const tangent<complex<rational> , complex<rational> > &arg_2) {
00182     return arg_1 != arg_2;
00183   }
00184   
00185   static tangent<complex<rational> , complex<rational> >
00186   GLUE_34 (const tangent<complex<rational> , complex<rational> > &arg_1, const tangent<complex<rational> , complex<rational> > &arg_2) {
00187     return arg_1 / arg_2;
00188   }
00189   
00190   static tangent<generic, generic>
00191   GLUE_35 (const tangent<rational, rational> &arg_1) {
00192     return as<tangent<generic, generic> > (arg_1);
00193   }
00194   
00195   static tangent<complex<rational> , complex<rational> >
00196   GLUE_36 (const tangent<rational, rational> &arg_1) {
00197     return as<tangent<complex<rational> , complex<rational> > > (arg_1);
00198   }
00199   
00200   static tangent<generic, generic>
00201   GLUE_37 (const tangent<complex<rational> , complex<rational> > &arg_1) {
00202     return as<tangent<generic, generic> > (arg_1);
00203   }
00204   
00205   void
00206   glue_tangent_rational () {
00207     static bool done = false;
00208     if (done) return;
00209     done = true;
00210     call_glue (string ("glue_complex_rational"));
00211     call_glue (string ("glue_tangent_generic"));
00212     define_type<tangent<rational, rational> > (gen (lit ("Tangent"), lit ("Rational"), lit ("Rational")));
00213     define_type<tangent<complex<rational> , complex<rational> > > (gen (lit ("Tangent"), gen (lit ("Complex"), lit ("Rational")), gen (lit ("Complex"), lit ("Rational"))));
00214     define ("tangent", GLUE_1);
00215     define_converter ("upgrade", GLUE_2, PENALTY_HOMOMORPHISM);
00216     define ("tangent", GLUE_3);
00217     define ("base", GLUE_4);
00218     define ("slope", GLUE_5);
00219     define ("-", GLUE_6);
00220     define ("square", GLUE_7);
00221     define ("+", GLUE_8);
00222     define ("-", GLUE_9);
00223     define ("*", GLUE_10);
00224     define ("=", GLUE_11);
00225     define ("!=", GLUE_12);
00226     define ("=", GLUE_13);
00227     define ("!=", GLUE_14);
00228     define ("=", GLUE_15);
00229     define ("!=", GLUE_16);
00230     define ("/", GLUE_17);
00231     define ("tangent", GLUE_18);
00232     define_converter ("upgrade", GLUE_19, PENALTY_HOMOMORPHISM);
00233     define ("tangent", GLUE_20);
00234     define ("base", GLUE_21);
00235     define ("slope", GLUE_22);
00236     define ("-", GLUE_23);
00237     define ("square", GLUE_24);
00238     define ("+", GLUE_25);
00239     define ("-", GLUE_26);
00240     define ("*", GLUE_27);
00241     define ("=", GLUE_28);
00242     define ("!=", GLUE_29);
00243     define ("=", GLUE_30);
00244     define ("!=", GLUE_31);
00245     define ("=", GLUE_32);
00246     define ("!=", GLUE_33);
00247     define ("/", GLUE_34);
00248     define_converter (":>", GLUE_35, PENALTY_PROMOTE_GENERIC);
00249     define_converter (":>", GLUE_36, PENALTY_HOMOMORPHISM);
00250     define_converter (":>", GLUE_37, PENALTY_PROMOTE_GENERIC);
00251   }
00252 }