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