00001 
00002 #include <basix/double.hpp>
00003 #include <basix/int.hpp>
00004 #include <basix/vector.hpp>
00005 #include <basix/port.hpp>
00006 #include <basix/literal.hpp>
00007 #include <numerix/integer.hpp>
00008 #include <numerix/modular.hpp>
00009 #include <numerix/modular_integer.hpp>
00010 #include <numerix/rational.hpp>
00011 #include <numerix/complex.hpp>
00012 #include <numerix/complex_double.hpp>
00013 #include <basix/glue.hpp>
00014 
00015 #define double_literal(x) as_double (as_string (x))
00016 #define int_literal(x) as_int (as_string (x))
00017 #define is_generic_literal is<literal>
00018 #define gen_literal_apply(f,v) gen (as<generic> (f), v)
00019 #define gen_literal_access(f,v) access (as<generic> (f), v)
00020 
00021 namespace mmx {
00022   static complex<double>
00023   GLUE_1 (const double &arg_1) {
00024     return complex<double > (arg_1);
00025   }
00026   
00027   static complex<double>
00028   GLUE_2 (const double &arg_1, const double &arg_2) {
00029     return complex<double > (arg_1, arg_2);
00030   }
00031   
00032   static complex<double>
00033   GLUE_3 (const double &arg_1) {
00034     return complex<double > (arg_1);
00035   }
00036   
00037   static double
00038   GLUE_4 (const complex<double> &arg_1) {
00039     return Re (arg_1);
00040   }
00041   
00042   static double
00043   GLUE_5 (const complex<double> &arg_1) {
00044     return Im (arg_1);
00045   }
00046   
00047   static complex<double>
00048   GLUE_6 (const complex<double> &arg_1) {
00049     return conj (arg_1);
00050   }
00051   
00052   static complex<double>
00053   GLUE_7 (const complex<double> &arg_1) {
00054     return times_i (arg_1);
00055   }
00056   
00057   static complex<double>
00058   GLUE_8 (const complex<double> &arg_1) {
00059     return over_i (arg_1);
00060   }
00061   
00062   static complex<double>
00063   GLUE_9 (const complex<double> &arg_1) {
00064     return -arg_1;
00065   }
00066   
00067   static complex<double>
00068   GLUE_10 (const complex<double> &arg_1) {
00069     return square (arg_1);
00070   }
00071   
00072   static complex<double>
00073   GLUE_11 (const complex<double> &arg_1, const complex<double> &arg_2) {
00074     return arg_1 + arg_2;
00075   }
00076   
00077   static complex<double>
00078   GLUE_12 (const complex<double> &arg_1, const complex<double> &arg_2) {
00079     return arg_1 - arg_2;
00080   }
00081   
00082   static complex<double>
00083   GLUE_13 (const complex<double> &arg_1, const complex<double> &arg_2) {
00084     return arg_1 * arg_2;
00085   }
00086   
00087   static complex<double>
00088   GLUE_14 (const double &arg_1, const complex<double> &arg_2) {
00089     return arg_1 + arg_2;
00090   }
00091   
00092   static complex<double>
00093   GLUE_15 (const complex<double> &arg_1, const double &arg_2) {
00094     return arg_1 + arg_2;
00095   }
00096   
00097   static complex<double>
00098   GLUE_16 (const double &arg_1, const complex<double> &arg_2) {
00099     return arg_1 - arg_2;
00100   }
00101   
00102   static complex<double>
00103   GLUE_17 (const complex<double> &arg_1, const double &arg_2) {
00104     return arg_1 - arg_2;
00105   }
00106   
00107   static complex<double>
00108   GLUE_18 (const double &arg_1, const complex<double> &arg_2) {
00109     return arg_1 * arg_2;
00110   }
00111   
00112   static complex<double>
00113   GLUE_19 (const complex<double> &arg_1, const double &arg_2) {
00114     return arg_1 * arg_2;
00115   }
00116   
00117   static bool
00118   GLUE_20 (const complex<double> &arg_1, const complex<double> &arg_2) {
00119     return arg_1 == arg_2;
00120   }
00121   
00122   static bool
00123   GLUE_21 (const complex<double> &arg_1, const complex<double> &arg_2) {
00124     return arg_1 != arg_2;
00125   }
00126   
00127   static bool
00128   GLUE_22 (const complex<double> &arg_1, const double &arg_2) {
00129     return arg_1 == arg_2;
00130   }
00131   
00132   static bool
00133   GLUE_23 (const complex<double> &arg_1, const double &arg_2) {
00134     return arg_1 != arg_2;
00135   }
00136   
00137   static bool
00138   GLUE_24 (const double &arg_1, const complex<double> &arg_2) {
00139     return arg_1 == arg_2;
00140   }
00141   
00142   static bool
00143   GLUE_25 (const double &arg_1, const complex<double> &arg_2) {
00144     return arg_1 != arg_2;
00145   }
00146   
00147   static complex<double>
00148   GLUE_26 (const complex<double> &arg_1) {
00149     return invert (arg_1);
00150   }
00151   
00152   static complex<double>
00153   GLUE_27 (const complex<double> &arg_1, const complex<double> &arg_2) {
00154     return arg_1 / arg_2;
00155   }
00156   
00157   static complex<double>
00158   GLUE_28 (const double &arg_1, const complex<double> &arg_2) {
00159     return arg_1 / arg_2;
00160   }
00161   
00162   static complex<double>
00163   GLUE_29 (const complex<double> &arg_1, const double &arg_2) {
00164     return arg_1 / arg_2;
00165   }
00166   
00167   static double
00168   GLUE_30 (const complex<double> &arg_1) {
00169     return abs (arg_1);
00170   }
00171   
00172   static double
00173   GLUE_31 (const complex<double> &arg_1) {
00174     return arg (arg_1);
00175   }
00176   
00177   static complex<double>
00178   GLUE_32 (const complex<double> &arg_1) {
00179     return sqrt (arg_1);
00180   }
00181   
00182   static complex<double>
00183   GLUE_33 (const complex<double> &arg_1) {
00184     return exp (arg_1);
00185   }
00186   
00187   static complex<double>
00188   GLUE_34 (const complex<double> &arg_1) {
00189     return log (arg_1);
00190   }
00191   
00192   static complex<double>
00193   GLUE_35 (const complex<double> &arg_1) {
00194     return cos (arg_1);
00195   }
00196   
00197   static complex<double>
00198   GLUE_36 (const complex<double> &arg_1) {
00199     return sin (arg_1);
00200   }
00201   
00202   static complex<double>
00203   GLUE_37 (const complex<double> &arg_1) {
00204     return tan (arg_1);
00205   }
00206   
00207   static complex<double>
00208   GLUE_38 (const complex<double> &arg_1) {
00209     return acos (arg_1);
00210   }
00211   
00212   static complex<double>
00213   GLUE_39 (const complex<double> &arg_1) {
00214     return asin (arg_1);
00215   }
00216   
00217   static complex<double>
00218   GLUE_40 (const complex<double> &arg_1) {
00219     return atan (arg_1);
00220   }
00221   
00222   static complex<double>
00223   GLUE_41 (const complex<double> &arg_1, const complex<double> &arg_2) {
00224     return pow (arg_1, arg_2);
00225   }
00226   
00227   static complex<double>
00228   GLUE_42 (const complex<double> &arg_1, const double &arg_2) {
00229     return pow (arg_1, arg_2);
00230   }
00231   
00232   static complex<double>
00233   GLUE_43 (const double &arg_1, const complex<double> &arg_2) {
00234     return pow (arg_1, arg_2);
00235   }
00236   
00237   static complex<double>
00238   GLUE_44 (const complex<double> &arg_1, const int &arg_2) {
00239     return sympow (arg_1, arg_2);
00240   }
00241   
00242   static bool
00243   GLUE_45 (const complex<double> &arg_1) {
00244     return is_finite (arg_1);
00245   }
00246   
00247   static bool
00248   GLUE_46 (const complex<double> &arg_1) {
00249     return is_infinite (arg_1);
00250   }
00251   
00252   static bool
00253   GLUE_47 (const complex<double> &arg_1) {
00254     return is_nan (arg_1);
00255   }
00256   
00257   static complex<double>
00258   GLUE_48 (const complex<double> &arg_1) {
00259     return times_infinity (arg_1);
00260   }
00261   
00262   static int
00263   GLUE_49 (const complex<double> &arg_1) {
00264     return precision (arg_1);
00265   }
00266   
00267   static complex<double>
00268   GLUE_50 (const complex<double> &arg_1, const int &arg_2) {
00269     return change_precision (arg_1, arg_2);
00270   }
00271   
00272   static int
00273   GLUE_51 (const complex<double> &arg_1) {
00274     return exponent (arg_1);
00275   }
00276   
00277   static double
00278   GLUE_52 (const complex<double> &arg_1) {
00279     return magnitude (arg_1);
00280   }
00281   
00282   static complex<double>
00283   GLUE_53 (const complex<double> &arg_1, const int &arg_2) {
00284     return incexp2 (arg_1, arg_2);
00285   }
00286   
00287   static complex<double>
00288   GLUE_54 (const complex<double> &arg_1, const int &arg_2) {
00289     return decexp2 (arg_1, arg_2);
00290   }
00291   
00292   static double
00293   GLUE_55 (const complex<double> &arg_1) {
00294     return rounding_error (arg_1);
00295   }
00296   
00297   static double
00298   GLUE_56 (const complex<double> &arg_1) {
00299     return additive_error (arg_1);
00300   }
00301   
00302   static double
00303   GLUE_57 (const complex<double> &arg_1) {
00304     return multiplicative_error (arg_1);
00305   }
00306   
00307   static double
00308   GLUE_58 (const complex<double> &arg_1) {
00309     return elementary_error (arg_1);
00310   }
00311   
00312   static complex<generic>
00313   GLUE_59 (const complex<double> &arg_1) {
00314     return as<complex<generic> > (arg_1);
00315   }
00316   
00317   static complex<double>
00318   GLUE_60 (const complex<rational> &arg_1) {
00319     return as<complex<double> > (arg_1);
00320   }
00321   
00322   void
00323   glue_complex_double () {
00324     static bool done = false;
00325     if (done) return;
00326     done = true;
00327     call_glue (string ("glue_double"));
00328     call_glue (string ("glue_complex_rational"));
00329     define_type<complex<double> > (gen (lit ("Complex"), lit ("Double")));
00330     define ("complex", GLUE_1);
00331     define ("complex", GLUE_2);
00332     define_converter ("upgrade", GLUE_3, PENALTY_HOMOMORPHISM);
00333     define ("Re", GLUE_4);
00334     define ("Im", GLUE_5);
00335     define ("conj", GLUE_6);
00336     define ("times_i", GLUE_7);
00337     define ("over_i", GLUE_8);
00338     define ("-", GLUE_9);
00339     define ("square", GLUE_10);
00340     define ("+", GLUE_11);
00341     define ("-", GLUE_12);
00342     define ("*", GLUE_13);
00343     define ("+", GLUE_14);
00344     define ("+", GLUE_15);
00345     define ("-", GLUE_16);
00346     define ("-", GLUE_17);
00347     define ("*", GLUE_18);
00348     define ("*", GLUE_19);
00349     define ("=", GLUE_20);
00350     define ("!=", GLUE_21);
00351     define ("=", GLUE_22);
00352     define ("!=", GLUE_23);
00353     define ("=", GLUE_24);
00354     define ("!=", GLUE_25);
00355     define ("invert", GLUE_26);
00356     define ("/", GLUE_27);
00357     define ("/", GLUE_28);
00358     define ("/", GLUE_29);
00359     define ("abs", GLUE_30);
00360     define ("arg", GLUE_31);
00361     define ("sqrt", GLUE_32);
00362     define ("exp", GLUE_33);
00363     define ("log", GLUE_34);
00364     define ("cos", GLUE_35);
00365     define ("sin", GLUE_36);
00366     define ("tan", GLUE_37);
00367     define ("arccos", GLUE_38);
00368     define ("arcsin", GLUE_39);
00369     define ("arctan", GLUE_40);
00370     define ("^", GLUE_41);
00371     define ("^", GLUE_42);
00372     define ("^", GLUE_43);
00373     define ("sym_pow", GLUE_44);
00374     define ("finite?", GLUE_45);
00375     define ("infinite?", GLUE_46);
00376     define ("nan?", GLUE_47);
00377     define ("times_infinity", GLUE_48);
00378     define ("precision", GLUE_49);
00379     define ("change_precision", GLUE_50);
00380     define ("exponent", GLUE_51);
00381     define ("magnitude", GLUE_52);
00382     define ("increase_exponent", GLUE_53);
00383     define ("decrease_exponent", GLUE_54);
00384     define ("rounding_error", GLUE_55);
00385     define ("additive_error", GLUE_56);
00386     define ("multiplicative_error", GLUE_57);
00387     define ("elementary_error", GLUE_58);
00388     define_converter (":>", GLUE_59, PENALTY_PROMOTE_GENERIC);
00389     define_converter (":>", GLUE_60, PENALTY_INCLUSION);
00390   }
00391 }