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 <numerix/tangent.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 tangent<rational, rational> 00021 GLUE_1 (const rational &arg_1) { 00022 return tangent<rational, rational > (arg_1); 00023 } 00024 00025 static tangent<rational, rational> 00026 GLUE_2 (const rational &arg_1) { 00027 return tangent<rational, rational > (arg_1); 00028 } 00029 00030 static tangent<rational, rational> 00031 GLUE_3 (const rational &arg_1, const rational &arg_2) { 00032 return tangent<rational, rational > (arg_1, arg_2); 00033 } 00034 00035 static rational 00036 GLUE_4 (const tangent<rational, rational> &arg_1) { 00037 return base (arg_1); 00038 } 00039 00040 static rational 00041 GLUE_5 (const tangent<rational, rational> &arg_1) { 00042 return slope (arg_1); 00043 } 00044 00045 static tangent<rational, rational> 00046 GLUE_6 (const tangent<rational, rational> &arg_1) { 00047 return -arg_1; 00048 } 00049 00050 static tangent<rational, rational> 00051 GLUE_7 (const tangent<rational, rational> &arg_1) { 00052 return square (arg_1); 00053 } 00054 00055 static tangent<rational, rational> 00056 GLUE_8 (const tangent<rational, rational> &arg_1, const tangent<rational, rational> &arg_2) { 00057 return arg_1 + arg_2; 00058 } 00059 00060 static tangent<rational, rational> 00061 GLUE_9 (const tangent<rational, rational> &arg_1, const tangent<rational, rational> &arg_2) { 00062 return arg_1 - arg_2; 00063 } 00064 00065 static tangent<rational, rational> 00066 GLUE_10 (const tangent<rational, rational> &arg_1, const tangent<rational, rational> &arg_2) { 00067 return arg_1 * arg_2; 00068 } 00069 00070 static bool 00071 GLUE_11 (const tangent<rational, rational> &arg_1, const tangent<rational, rational> &arg_2) { 00072 return arg_1 == arg_2; 00073 } 00074 00075 static bool 00076 GLUE_12 (const tangent<rational, rational> &arg_1, const tangent<rational, rational> &arg_2) { 00077 return arg_1 != arg_2; 00078 } 00079 00080 static bool 00081 GLUE_13 (const tangent<rational, rational> &arg_1, const rational &arg_2) { 00082 return arg_1 == arg_2; 00083 } 00084 00085 static bool 00086 GLUE_14 (const tangent<rational, rational> &arg_1, const rational &arg_2) { 00087 return arg_1 != arg_2; 00088 } 00089 00090 static bool 00091 GLUE_15 (const rational &arg_1, const tangent<rational, rational> &arg_2) { 00092 return arg_1 == arg_2; 00093 } 00094 00095 static bool 00096 GLUE_16 (const rational &arg_1, const tangent<rational, rational> &arg_2) { 00097 return arg_1 != arg_2; 00098 } 00099 00100 static tangent<rational, rational> 00101 GLUE_17 (const tangent<rational, rational> &arg_1, const tangent<rational, rational> &arg_2) { 00102 return arg_1 / arg_2; 00103 } 00104 00105 static tangent<complex<rational> , complex<rational> > 00106 GLUE_18 (const complex<rational> &arg_1) { 00107 return tangent<complex<rational>, complex<rational> > (arg_1); 00108 } 00109 00110 static tangent<complex<rational> , complex<rational> > 00111 GLUE_19 (const complex<rational> &arg_1) { 00112 return tangent<complex<rational>, complex<rational> > (arg_1); 00113 } 00114 00115 static tangent<complex<rational> , complex<rational> > 00116 GLUE_20 (const complex<rational> &arg_1, const complex<rational> &arg_2) { 00117 return tangent<complex<rational>, complex<rational> > (arg_1, arg_2); 00118 } 00119 00120 static complex<rational> 00121 GLUE_21 (const tangent<complex<rational> , complex<rational> > &arg_1) { 00122 return base (arg_1); 00123 } 00124 00125 static complex<rational> 00126 GLUE_22 (const tangent<complex<rational> , complex<rational> > &arg_1) { 00127 return slope (arg_1); 00128 } 00129 00130 static tangent<complex<rational> , complex<rational> > 00131 GLUE_23 (const tangent<complex<rational> , complex<rational> > &arg_1) { 00132 return -arg_1; 00133 } 00134 00135 static tangent<complex<rational> , complex<rational> > 00136 GLUE_24 (const tangent<complex<rational> , complex<rational> > &arg_1) { 00137 return square (arg_1); 00138 } 00139 00140 static tangent<complex<rational> , complex<rational> > 00141 GLUE_25 (const tangent<complex<rational> , complex<rational> > &arg_1, const tangent<complex<rational> , complex<rational> > &arg_2) { 00142 return arg_1 + arg_2; 00143 } 00144 00145 static tangent<complex<rational> , complex<rational> > 00146 GLUE_26 (const tangent<complex<rational> , complex<rational> > &arg_1, const tangent<complex<rational> , complex<rational> > &arg_2) { 00147 return arg_1 - arg_2; 00148 } 00149 00150 static tangent<complex<rational> , complex<rational> > 00151 GLUE_27 (const tangent<complex<rational> , complex<rational> > &arg_1, const tangent<complex<rational> , complex<rational> > &arg_2) { 00152 return arg_1 * arg_2; 00153 } 00154 00155 static bool 00156 GLUE_28 (const tangent<complex<rational> , complex<rational> > &arg_1, const tangent<complex<rational> , complex<rational> > &arg_2) { 00157 return arg_1 == arg_2; 00158 } 00159 00160 static bool 00161 GLUE_29 (const tangent<complex<rational> , complex<rational> > &arg_1, const tangent<complex<rational> , complex<rational> > &arg_2) { 00162 return arg_1 != arg_2; 00163 } 00164 00165 static bool 00166 GLUE_30 (const tangent<complex<rational> , complex<rational> > &arg_1, const complex<rational> &arg_2) { 00167 return arg_1 == arg_2; 00168 } 00169 00170 static bool 00171 GLUE_31 (const tangent<complex<rational> , complex<rational> > &arg_1, const complex<rational> &arg_2) { 00172 return arg_1 != arg_2; 00173 } 00174 00175 static bool 00176 GLUE_32 (const complex<rational> &arg_1, const tangent<complex<rational> , complex<rational> > &arg_2) { 00177 return arg_1 == arg_2; 00178 } 00179 00180 static bool 00181 GLUE_33 (const complex<rational> &arg_1, const tangent<complex<rational> , complex<rational> > &arg_2) { 00182 return arg_1 != arg_2; 00183 } 00184 00185 static tangent<complex<rational> , complex<rational> > 00186 GLUE_34 (const tangent<complex<rational> , complex<rational> > &arg_1, const tangent<complex<rational> , complex<rational> > &arg_2) { 00187 return arg_1 / arg_2; 00188 } 00189 00190 static tangent<generic, generic> 00191 GLUE_35 (const tangent<rational, rational> &arg_1) { 00192 return as<tangent<generic, generic> > (arg_1); 00193 } 00194 00195 static tangent<complex<rational> , complex<rational> > 00196 GLUE_36 (const tangent<rational, rational> &arg_1) { 00197 return as<tangent<complex<rational> , complex<rational> > > (arg_1); 00198 } 00199 00200 static tangent<generic, generic> 00201 GLUE_37 (const tangent<complex<rational> , complex<rational> > &arg_1) { 00202 return as<tangent<generic, generic> > (arg_1); 00203 } 00204 00205 void 00206 glue_tangent_rational () { 00207 static bool done = false; 00208 if (done) return; 00209 done = true; 00210 call_glue (string ("glue_complex_rational")); 00211 call_glue (string ("glue_tangent_generic")); 00212 define_type<tangent<rational, rational> > (gen (lit ("Tangent"), lit ("Rational"), lit ("Rational"))); 00213 define_type<tangent<complex<rational> , complex<rational> > > (gen (lit ("Tangent"), gen (lit ("Complex"), lit ("Rational")), gen (lit ("Complex"), lit ("Rational")))); 00214 define ("tangent", GLUE_1); 00215 define_converter ("upgrade", GLUE_2, PENALTY_HOMOMORPHISM); 00216 define ("tangent", GLUE_3); 00217 define ("base", GLUE_4); 00218 define ("slope", GLUE_5); 00219 define ("-", GLUE_6); 00220 define ("square", GLUE_7); 00221 define ("+", GLUE_8); 00222 define ("-", GLUE_9); 00223 define ("*", GLUE_10); 00224 define ("=", GLUE_11); 00225 define ("!=", GLUE_12); 00226 define ("=", GLUE_13); 00227 define ("!=", GLUE_14); 00228 define ("=", GLUE_15); 00229 define ("!=", GLUE_16); 00230 define ("/", GLUE_17); 00231 define ("tangent", GLUE_18); 00232 define_converter ("upgrade", GLUE_19, PENALTY_HOMOMORPHISM); 00233 define ("tangent", GLUE_20); 00234 define ("base", GLUE_21); 00235 define ("slope", GLUE_22); 00236 define ("-", GLUE_23); 00237 define ("square", GLUE_24); 00238 define ("+", GLUE_25); 00239 define ("-", GLUE_26); 00240 define ("*", GLUE_27); 00241 define ("=", GLUE_28); 00242 define ("!=", GLUE_29); 00243 define ("=", GLUE_30); 00244 define ("!=", GLUE_31); 00245 define ("=", GLUE_32); 00246 define ("!=", GLUE_33); 00247 define ("/", GLUE_34); 00248 define_converter (":>", GLUE_35, PENALTY_PROMOTE_GENERIC); 00249 define_converter (":>", GLUE_36, PENALTY_HOMOMORPHISM); 00250 define_converter (":>", GLUE_37, PENALTY_PROMOTE_GENERIC); 00251 } 00252 }