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 }