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 }