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