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 <realroot/Interval_glue.hpp> 00012 #include <basix/glue.hpp> 00013 00014 #define int_literal(x) as_int (as_string (x)) 00015 #define is_generic_literal is<literal> 00016 #define gen_literal_apply(f,v) gen (as<generic> (f), v) 00017 #define gen_literal_access(f,v) access (as<generic> (f), v) 00018 00019 namespace mmx { 00020 static interval<rational> 00021 GLUE_1 (const rational &arg_1) { 00022 return interval<rational > (arg_1); 00023 } 00024 00025 static interval<rational> 00026 GLUE_2 (const rational &arg_1, const rational &arg_2) { 00027 return interval_from_pair (arg_1, arg_2); 00028 } 00029 00030 static interval<rational> 00031 GLUE_3 (const interval<rational> &arg_1) { 00032 return -arg_1; 00033 } 00034 00035 static interval<rational> 00036 GLUE_4 (const interval<rational> &arg_1, const interval<rational> &arg_2) { 00037 return arg_1 + arg_2; 00038 } 00039 00040 static interval<rational> 00041 GLUE_5 (const interval<rational> &arg_1, const interval<rational> &arg_2) { 00042 return arg_1 - arg_2; 00043 } 00044 00045 static interval<rational> 00046 GLUE_6 (const interval<rational> &arg_1, const interval<rational> &arg_2) { 00047 return arg_1 * arg_2; 00048 } 00049 00050 static interval<rational> 00051 GLUE_7 (const rational &arg_1, const interval<rational> &arg_2) { 00052 return arg_1 + arg_2; 00053 } 00054 00055 static interval<rational> 00056 GLUE_8 (const interval<rational> &arg_1, const rational &arg_2) { 00057 return arg_1 + arg_2; 00058 } 00059 00060 static interval<rational> 00061 GLUE_9 (const rational &arg_1, const interval<rational> &arg_2) { 00062 return arg_1 - arg_2; 00063 } 00064 00065 static interval<rational> 00066 GLUE_10 (const interval<rational> &arg_1, const rational &arg_2) { 00067 return arg_1 - arg_2; 00068 } 00069 00070 static interval<rational> 00071 GLUE_11 (const rational &arg_1, const interval<rational> &arg_2) { 00072 return arg_1 * arg_2; 00073 } 00074 00075 static interval<rational> 00076 GLUE_12 (const interval<rational> &arg_1, const rational &arg_2) { 00077 return arg_1 * arg_2; 00078 } 00079 00080 static interval<rational> 00081 GLUE_13 (const interval<rational> &arg_1, const interval<rational> &arg_2) { 00082 return arg_1 / arg_2; 00083 } 00084 00085 static rational 00086 GLUE_14 (const interval<rational> &arg_1) { 00087 return interval_lower (arg_1); 00088 } 00089 00090 static rational 00091 GLUE_15 (const interval<rational> &arg_1) { 00092 return interval_upper (arg_1); 00093 } 00094 00095 static interval<mmx_floating> 00096 GLUE_16 (const mmx_floating &arg_1) { 00097 return interval<mmx_floating > (arg_1); 00098 } 00099 00100 static interval<mmx_floating> 00101 GLUE_17 (const mmx_floating &arg_1, const mmx_floating &arg_2) { 00102 return interval_from_pair (arg_1, arg_2); 00103 } 00104 00105 static interval<mmx_floating> 00106 GLUE_18 (const interval<mmx_floating> &arg_1) { 00107 return -arg_1; 00108 } 00109 00110 static interval<mmx_floating> 00111 GLUE_19 (const interval<mmx_floating> &arg_1, const interval<mmx_floating> &arg_2) { 00112 return arg_1 + arg_2; 00113 } 00114 00115 static interval<mmx_floating> 00116 GLUE_20 (const interval<mmx_floating> &arg_1, const interval<mmx_floating> &arg_2) { 00117 return arg_1 - arg_2; 00118 } 00119 00120 static interval<mmx_floating> 00121 GLUE_21 (const interval<mmx_floating> &arg_1, const interval<mmx_floating> &arg_2) { 00122 return arg_1 * arg_2; 00123 } 00124 00125 static interval<mmx_floating> 00126 GLUE_22 (const mmx_floating &arg_1, const interval<mmx_floating> &arg_2) { 00127 return arg_1 + arg_2; 00128 } 00129 00130 static interval<mmx_floating> 00131 GLUE_23 (const interval<mmx_floating> &arg_1, const mmx_floating &arg_2) { 00132 return arg_1 + arg_2; 00133 } 00134 00135 static interval<mmx_floating> 00136 GLUE_24 (const mmx_floating &arg_1, const interval<mmx_floating> &arg_2) { 00137 return arg_1 - arg_2; 00138 } 00139 00140 static interval<mmx_floating> 00141 GLUE_25 (const interval<mmx_floating> &arg_1, const mmx_floating &arg_2) { 00142 return arg_1 - arg_2; 00143 } 00144 00145 static interval<mmx_floating> 00146 GLUE_26 (const mmx_floating &arg_1, const interval<mmx_floating> &arg_2) { 00147 return arg_1 * arg_2; 00148 } 00149 00150 static interval<mmx_floating> 00151 GLUE_27 (const interval<mmx_floating> &arg_1, const mmx_floating &arg_2) { 00152 return arg_1 * arg_2; 00153 } 00154 00155 static interval<mmx_floating> 00156 GLUE_28 (const interval<mmx_floating> &arg_1, const interval<mmx_floating> &arg_2) { 00157 return arg_1 / arg_2; 00158 } 00159 00160 static mmx_floating 00161 GLUE_29 (const interval<mmx_floating> &arg_1) { 00162 return interval_lower (arg_1); 00163 } 00164 00165 static mmx_floating 00166 GLUE_30 (const interval<mmx_floating> &arg_1) { 00167 return interval_upper (arg_1); 00168 } 00169 00170 void 00171 glue_interval () { 00172 static bool done = false; 00173 if (done) return; 00174 done = true; 00175 call_glue (string ("glue_rational")); 00176 call_glue (string ("glue_floating")); 00177 define_type<interval<rational> > (gen (lit ("Interval"), lit ("Rational"))); 00178 define ("interval", GLUE_1); 00179 define ("interval", GLUE_2); 00180 define ("-", GLUE_3); 00181 define ("+", GLUE_4); 00182 define ("-", GLUE_5); 00183 define ("*", GLUE_6); 00184 define ("+", GLUE_7); 00185 define ("+", GLUE_8); 00186 define ("-", GLUE_9); 00187 define ("-", GLUE_10); 00188 define ("*", GLUE_11); 00189 define ("*", GLUE_12); 00190 define ("/", GLUE_13); 00191 define ("lower", GLUE_14); 00192 define ("upper", GLUE_15); 00193 define_type<interval<mmx_floating> > (gen (lit ("Interval"), lit ("Floating"))); 00194 define ("interval", GLUE_16); 00195 define ("interval", GLUE_17); 00196 define ("-", GLUE_18); 00197 define ("+", GLUE_19); 00198 define ("-", GLUE_20); 00199 define ("*", GLUE_21); 00200 define ("+", GLUE_22); 00201 define ("+", GLUE_23); 00202 define ("-", GLUE_24); 00203 define ("-", GLUE_25); 00204 define ("*", GLUE_26); 00205 define ("*", GLUE_27); 00206 define ("/", GLUE_28); 00207 define ("lower", GLUE_29); 00208 define ("upper", GLUE_30); 00209 } 00210 }