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