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 <numerix/floating.hpp>
00014 #include <numerix/tangent.hpp>
00015 #include <basix/glue.hpp>
00016
00017 #define double_literal(x) as_double (as_string (x))
00018 #define int_literal(x) as_int (as_string (x))
00019 #define is_generic_literal is<literal>
00020 #define gen_literal_apply(f,v) gen (as<generic> (f), v)
00021 #define gen_literal_access(f,v) access (as<generic> (f), v)
00022
00023 namespace mmx {
00024 static tangent<mmx_floating, mmx_floating>
00025 GLUE_1 (const mmx_floating &arg_1) {
00026 return tangent<mmx_floating, mmx_floating > (arg_1);
00027 }
00028
00029 static tangent<mmx_floating, mmx_floating>
00030 GLUE_2 (const mmx_floating &arg_1) {
00031 return tangent<mmx_floating, mmx_floating > (arg_1);
00032 }
00033
00034 static tangent<mmx_floating, mmx_floating>
00035 GLUE_3 (const mmx_floating &arg_1, const mmx_floating &arg_2) {
00036 return tangent<mmx_floating, mmx_floating > (arg_1, arg_2);
00037 }
00038
00039 static mmx_floating
00040 GLUE_4 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00041 return base (arg_1);
00042 }
00043
00044 static mmx_floating
00045 GLUE_5 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00046 return slope (arg_1);
00047 }
00048
00049 static tangent<mmx_floating, mmx_floating>
00050 GLUE_6 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00051 return -arg_1;
00052 }
00053
00054 static tangent<mmx_floating, mmx_floating>
00055 GLUE_7 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00056 return square (arg_1);
00057 }
00058
00059 static tangent<mmx_floating, mmx_floating>
00060 GLUE_8 (const tangent<mmx_floating, mmx_floating> &arg_1, const tangent<mmx_floating, mmx_floating> &arg_2) {
00061 return arg_1 + arg_2;
00062 }
00063
00064 static tangent<mmx_floating, mmx_floating>
00065 GLUE_9 (const tangent<mmx_floating, mmx_floating> &arg_1, const tangent<mmx_floating, mmx_floating> &arg_2) {
00066 return arg_1 - arg_2;
00067 }
00068
00069 static tangent<mmx_floating, mmx_floating>
00070 GLUE_10 (const tangent<mmx_floating, mmx_floating> &arg_1, const tangent<mmx_floating, mmx_floating> &arg_2) {
00071 return arg_1 * arg_2;
00072 }
00073
00074 static bool
00075 GLUE_11 (const tangent<mmx_floating, mmx_floating> &arg_1, const tangent<mmx_floating, mmx_floating> &arg_2) {
00076 return arg_1 == arg_2;
00077 }
00078
00079 static bool
00080 GLUE_12 (const tangent<mmx_floating, mmx_floating> &arg_1, const tangent<mmx_floating, mmx_floating> &arg_2) {
00081 return arg_1 != arg_2;
00082 }
00083
00084 static bool
00085 GLUE_13 (const tangent<mmx_floating, mmx_floating> &arg_1, const mmx_floating &arg_2) {
00086 return arg_1 == arg_2;
00087 }
00088
00089 static bool
00090 GLUE_14 (const tangent<mmx_floating, mmx_floating> &arg_1, const mmx_floating &arg_2) {
00091 return arg_1 != arg_2;
00092 }
00093
00094 static bool
00095 GLUE_15 (const mmx_floating &arg_1, const tangent<mmx_floating, mmx_floating> &arg_2) {
00096 return arg_1 == arg_2;
00097 }
00098
00099 static bool
00100 GLUE_16 (const mmx_floating &arg_1, const tangent<mmx_floating, mmx_floating> &arg_2) {
00101 return arg_1 != arg_2;
00102 }
00103
00104 static tangent<mmx_floating, mmx_floating>
00105 GLUE_17 (const tangent<mmx_floating, mmx_floating> &arg_1, const tangent<mmx_floating, mmx_floating> &arg_2) {
00106 return arg_1 / arg_2;
00107 }
00108
00109 static tangent<mmx_floating, mmx_floating>
00110 GLUE_18 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00111 return sqrt (arg_1);
00112 }
00113
00114 static tangent<mmx_floating, mmx_floating>
00115 GLUE_19 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00116 return exp (arg_1);
00117 }
00118
00119 static tangent<mmx_floating, mmx_floating>
00120 GLUE_20 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00121 return log (arg_1);
00122 }
00123
00124 static tangent<mmx_floating, mmx_floating>
00125 GLUE_21 (const tangent<mmx_floating, mmx_floating> &arg_1, const tangent<mmx_floating, mmx_floating> &arg_2) {
00126 return pow (arg_1, arg_2);
00127 }
00128
00129 static tangent<mmx_floating, mmx_floating>
00130 GLUE_22 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00131 return cos (arg_1);
00132 }
00133
00134 static tangent<mmx_floating, mmx_floating>
00135 GLUE_23 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00136 return sin (arg_1);
00137 }
00138
00139 static tangent<mmx_floating, mmx_floating>
00140 GLUE_24 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00141 return tan (arg_1);
00142 }
00143
00144 static tangent<mmx_floating, mmx_floating>
00145 GLUE_25 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00146 return acos (arg_1);
00147 }
00148
00149 static tangent<mmx_floating, mmx_floating>
00150 GLUE_26 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00151 return asin (arg_1);
00152 }
00153
00154 static tangent<mmx_floating, mmx_floating>
00155 GLUE_27 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00156 return atan (arg_1);
00157 }
00158
00159 static bool
00160 GLUE_28 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00161 return is_finite (arg_1);
00162 }
00163
00164 static bool
00165 GLUE_29 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00166 return is_infinite (arg_1);
00167 }
00168
00169 static bool
00170 GLUE_30 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00171 return is_nan (arg_1);
00172 }
00173
00174 static tangent<mmx_floating, mmx_floating>
00175 GLUE_31 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00176 return times_infinity (arg_1);
00177 }
00178
00179 static int
00180 GLUE_32 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00181 return precision (arg_1);
00182 }
00183
00184 static tangent<mmx_floating, mmx_floating>
00185 GLUE_33 (const tangent<mmx_floating, mmx_floating> &arg_1, const int &arg_2) {
00186 return change_precision (arg_1, arg_2);
00187 }
00188
00189 static int
00190 GLUE_34 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00191 return exponent (arg_1);
00192 }
00193
00194 static double
00195 GLUE_35 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00196 return magnitude (arg_1);
00197 }
00198
00199 static tangent<mmx_floating, mmx_floating>
00200 GLUE_36 (const tangent<mmx_floating, mmx_floating> &arg_1, const int &arg_2) {
00201 return incexp2 (arg_1, arg_2);
00202 }
00203
00204 static tangent<mmx_floating, mmx_floating>
00205 GLUE_37 (const tangent<mmx_floating, mmx_floating> &arg_1, const int &arg_2) {
00206 return decexp2 (arg_1, arg_2);
00207 }
00208
00209 static tangent<mmx_floating, mmx_floating>
00210 GLUE_38 (const tangent<rational, rational> &arg_1) {
00211 return as<tangent<mmx_floating, mmx_floating> > (arg_1);
00212 }
00213
00214 static tangent<generic, generic>
00215 GLUE_39 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00216 return as<tangent<generic, generic> > (arg_1);
00217 }
00218
00219 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00220 GLUE_40 (const complex<mmx_floating> &arg_1) {
00221 return tangent<complex<mmx_floating>, complex<mmx_floating> > (arg_1);
00222 }
00223
00224 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00225 GLUE_41 (const complex<mmx_floating> &arg_1) {
00226 return tangent<complex<mmx_floating>, complex<mmx_floating> > (arg_1);
00227 }
00228
00229 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00230 GLUE_42 (const complex<mmx_floating> &arg_1, const complex<mmx_floating> &arg_2) {
00231 return tangent<complex<mmx_floating>, complex<mmx_floating> > (arg_1, arg_2);
00232 }
00233
00234 static complex<mmx_floating>
00235 GLUE_43 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00236 return base (arg_1);
00237 }
00238
00239 static complex<mmx_floating>
00240 GLUE_44 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00241 return slope (arg_1);
00242 }
00243
00244 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00245 GLUE_45 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00246 return -arg_1;
00247 }
00248
00249 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00250 GLUE_46 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00251 return square (arg_1);
00252 }
00253
00254 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00255 GLUE_47 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1, const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_2) {
00256 return arg_1 + arg_2;
00257 }
00258
00259 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00260 GLUE_48 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1, const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_2) {
00261 return arg_1 - arg_2;
00262 }
00263
00264 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00265 GLUE_49 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1, const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_2) {
00266 return arg_1 * arg_2;
00267 }
00268
00269 static bool
00270 GLUE_50 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1, const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_2) {
00271 return arg_1 == arg_2;
00272 }
00273
00274 static bool
00275 GLUE_51 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1, const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_2) {
00276 return arg_1 != arg_2;
00277 }
00278
00279 static bool
00280 GLUE_52 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1, const complex<mmx_floating> &arg_2) {
00281 return arg_1 == arg_2;
00282 }
00283
00284 static bool
00285 GLUE_53 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1, const complex<mmx_floating> &arg_2) {
00286 return arg_1 != arg_2;
00287 }
00288
00289 static bool
00290 GLUE_54 (const complex<mmx_floating> &arg_1, const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_2) {
00291 return arg_1 == arg_2;
00292 }
00293
00294 static bool
00295 GLUE_55 (const complex<mmx_floating> &arg_1, const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_2) {
00296 return arg_1 != arg_2;
00297 }
00298
00299 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00300 GLUE_56 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1, const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_2) {
00301 return arg_1 / arg_2;
00302 }
00303
00304 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00305 GLUE_57 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00306 return sqrt (arg_1);
00307 }
00308
00309 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00310 GLUE_58 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00311 return exp (arg_1);
00312 }
00313
00314 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00315 GLUE_59 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00316 return log (arg_1);
00317 }
00318
00319 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00320 GLUE_60 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1, const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_2) {
00321 return pow (arg_1, arg_2);
00322 }
00323
00324 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00325 GLUE_61 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00326 return cos (arg_1);
00327 }
00328
00329 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00330 GLUE_62 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00331 return sin (arg_1);
00332 }
00333
00334 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00335 GLUE_63 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00336 return tan (arg_1);
00337 }
00338
00339 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00340 GLUE_64 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00341 return acos (arg_1);
00342 }
00343
00344 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00345 GLUE_65 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00346 return asin (arg_1);
00347 }
00348
00349 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00350 GLUE_66 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00351 return atan (arg_1);
00352 }
00353
00354 static bool
00355 GLUE_67 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00356 return is_finite (arg_1);
00357 }
00358
00359 static bool
00360 GLUE_68 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00361 return is_infinite (arg_1);
00362 }
00363
00364 static bool
00365 GLUE_69 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00366 return is_nan (arg_1);
00367 }
00368
00369 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00370 GLUE_70 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00371 return times_infinity (arg_1);
00372 }
00373
00374 static int
00375 GLUE_71 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00376 return precision (arg_1);
00377 }
00378
00379 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00380 GLUE_72 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1, const int &arg_2) {
00381 return change_precision (arg_1, arg_2);
00382 }
00383
00384 static int
00385 GLUE_73 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00386 return exponent (arg_1);
00387 }
00388
00389 static double
00390 GLUE_74 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00391 return magnitude (arg_1);
00392 }
00393
00394 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00395 GLUE_75 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1, const int &arg_2) {
00396 return incexp2 (arg_1, arg_2);
00397 }
00398
00399 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00400 GLUE_76 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1, const int &arg_2) {
00401 return decexp2 (arg_1, arg_2);
00402 }
00403
00404 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00405 GLUE_77 (const tangent<rational, rational> &arg_1) {
00406 return as<tangent<complex<mmx_floating> , complex<mmx_floating> > > (arg_1);
00407 }
00408
00409 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00410 GLUE_78 (const tangent<complex<rational> , complex<rational> > &arg_1) {
00411 return as<tangent<complex<mmx_floating> , complex<mmx_floating> > > (arg_1);
00412 }
00413
00414 static tangent<complex<mmx_floating> , complex<mmx_floating> >
00415 GLUE_79 (const tangent<mmx_floating, mmx_floating> &arg_1) {
00416 return as<tangent<complex<mmx_floating> , complex<mmx_floating> > > (arg_1);
00417 }
00418
00419 static tangent<generic, generic>
00420 GLUE_80 (const tangent<complex<mmx_floating> , complex<mmx_floating> > &arg_1) {
00421 return as<tangent<generic, generic> > (arg_1);
00422 }
00423
00424 void
00425 glue_tangent_floating () {
00426 static bool done = false;
00427 if (done) return;
00428 done = true;
00429 call_glue (string ("glue_complex_double"));
00430 call_glue (string ("glue_complex_floating"));
00431 call_glue (string ("glue_tangent_double"));
00432 define_type<tangent<mmx_floating, mmx_floating> > (gen (lit ("Tangent"), lit ("Floating"), lit ("Floating")));
00433 define ("tangent", GLUE_1);
00434 define_converter ("upgrade", GLUE_2, PENALTY_HOMOMORPHISM);
00435 define ("tangent", GLUE_3);
00436 define ("base", GLUE_4);
00437 define ("slope", GLUE_5);
00438 define ("-", GLUE_6);
00439 define ("square", GLUE_7);
00440 define ("+", GLUE_8);
00441 define ("-", GLUE_9);
00442 define ("*", GLUE_10);
00443 define ("=", GLUE_11);
00444 define ("!=", GLUE_12);
00445 define ("=", GLUE_13);
00446 define ("!=", GLUE_14);
00447 define ("=", GLUE_15);
00448 define ("!=", GLUE_16);
00449 define ("/", GLUE_17);
00450 define ("sqrt", GLUE_18);
00451 define ("exp", GLUE_19);
00452 define ("log", GLUE_20);
00453 define ("^", GLUE_21);
00454 define ("cos", GLUE_22);
00455 define ("sin", GLUE_23);
00456 define ("tan", GLUE_24);
00457 define ("arccos", GLUE_25);
00458 define ("arcsin", GLUE_26);
00459 define ("arctan", GLUE_27);
00460 define ("finite?", GLUE_28);
00461 define ("infinite?", GLUE_29);
00462 define ("nan?", GLUE_30);
00463 define ("times_infinity", GLUE_31);
00464 define ("precision", GLUE_32);
00465 define ("change_precision", GLUE_33);
00466 define ("exponent", GLUE_34);
00467 define ("magnitude", GLUE_35);
00468 define ("increase_exponent", GLUE_36);
00469 define ("decrease_exponent", GLUE_37);
00470 define_converter (":>", GLUE_38, PENALTY_INCLUSION);
00471 define_converter (":>", GLUE_39, PENALTY_PROMOTE_GENERIC);
00472 define_type<tangent<complex<mmx_floating> , complex<mmx_floating> > > (gen (lit ("Tangent"), gen (lit ("Complex"), lit ("Floating")), gen (lit ("Complex"), lit ("Floating"))));
00473 define ("tangent", GLUE_40);
00474 define_converter ("upgrade", GLUE_41, PENALTY_HOMOMORPHISM);
00475 define ("tangent", GLUE_42);
00476 define ("base", GLUE_43);
00477 define ("slope", GLUE_44);
00478 define ("-", GLUE_45);
00479 define ("square", GLUE_46);
00480 define ("+", GLUE_47);
00481 define ("-", GLUE_48);
00482 define ("*", GLUE_49);
00483 define ("=", GLUE_50);
00484 define ("!=", GLUE_51);
00485 define ("=", GLUE_52);
00486 define ("!=", GLUE_53);
00487 define ("=", GLUE_54);
00488 define ("!=", GLUE_55);
00489 define ("/", GLUE_56);
00490 define ("sqrt", GLUE_57);
00491 define ("exp", GLUE_58);
00492 define ("log", GLUE_59);
00493 define ("^", GLUE_60);
00494 define ("cos", GLUE_61);
00495 define ("sin", GLUE_62);
00496 define ("tan", GLUE_63);
00497 define ("arccos", GLUE_64);
00498 define ("arcsin", GLUE_65);
00499 define ("arctan", GLUE_66);
00500 define ("finite?", GLUE_67);
00501 define ("infinite?", GLUE_68);
00502 define ("nan?", GLUE_69);
00503 define ("times_infinity", GLUE_70);
00504 define ("precision", GLUE_71);
00505 define ("change_precision", GLUE_72);
00506 define ("exponent", GLUE_73);
00507 define ("magnitude", GLUE_74);
00508 define ("increase_exponent", GLUE_75);
00509 define ("decrease_exponent", GLUE_76);
00510 define_converter (":>", GLUE_77, PENALTY_INCLUSION);
00511 define_converter (":>", GLUE_78, PENALTY_INCLUSION);
00512 define_converter (":>", GLUE_79, PENALTY_INCLUSION);
00513 define_converter (":>", GLUE_80, PENALTY_PROMOTE_GENERIC);
00514 }
00515 }