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 }