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 }