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