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 }