00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef __SYNTACTIC_HPP
00014 #define __SYNTACTIC_HPP
00015 #include <basix/generic.hpp>
00016
00018
00019 namespace mmx {
00020
00021
00022
00023
00024
00025 class syntactic {
00026 MMX_ALLOCATORS
00027 protected:
00028 generic rep;
00029 inline syntactic (const generic& g): rep (g) {}
00030 public:
00031 inline syntactic (): rep () {}
00032 inline syntactic (const char* s): rep (s) {}
00033 inline syntactic (const string& s): rep (s) {}
00034 syntactic (const int& i);
00035 inline generic operator * () const { return rep; }
00036 friend syntactic as_syntactic (const generic& g);
00037 inline friend nat N (const syntactic& g) { return N (g.rep); }
00038 inline syntactic operator [] (nat i) const { return syntactic (rep[i]); }
00039 };
00040
00041
00042
00043
00044
00045 inline generic as_generic (const syntactic& g) { return *g; }
00046 inline syntactic as_syntactic (const generic& g) { return syntactic (g); }
00047 inline nat hash (const syntactic& c) { return hash (*c); }
00048 inline nat exact_hash (const syntactic& c) { return exact_hash (*c); }
00049 inline nat hard_hash (const syntactic& c) { return hard_hash (*c); }
00050 inline bool operator == (const syntactic& c1, const syntactic& c2) {
00051 return (*c1) == (*c2); }
00052 inline bool operator != (const syntactic& c1, const syntactic& c2) {
00053 return (*c1) != (*c2); }
00054 inline bool exact_eq (const syntactic& c1, const syntactic& c2) {
00055 return exact_eq (*c1, *c2); }
00056 inline bool exact_neq (const syntactic& c1, const syntactic& c2) {
00057 return exact_neq (*c1, *c2); }
00058 inline bool hard_eq (const syntactic& c1, const syntactic& c2) {
00059 return hard_eq (*c1, *c2); }
00060 inline bool hard_neq (const syntactic& c1, const syntactic& c2) {
00061 return hard_neq (*c1, *c2); }
00062 inline syntactic flatten (const syntactic& g) { return g; }
00063
00064 bool is_atom (const syntactic& g);
00065 string as_string (const syntactic& g);
00066
00067 bool is_func (const syntactic& g, const char* f);
00068 bool is_func (const syntactic& g, const char* f, nat n);
00069 bool is_func (const syntactic& g, const syntactic& f);
00070 bool is_func (const syntactic& g, const syntactic& f, nat n);
00071 bool is_func (const syntactic& g, const generic& f);
00072 bool is_func (const syntactic& g, const generic& f, nat n);
00073
00074 syntactic access (const syntactic& g, const syntactic& i);
00075 syntactic access (const syntactic& g, const syntactic& i, const syntactic& j);
00076
00077 vector<syntactic> components (const syntactic& g);
00078 vector<syntactic> arguments (const syntactic& g);
00079
00080
00081
00082
00083
00084 inline syntactic syn (const syntactic& f) {
00085 return as_syntactic (gen (*f)); }
00086 inline syntactic syn (const syntactic& f, const syntactic& a1) {
00087 return as_syntactic (gen (*f, *a1)); }
00088 inline syntactic syn (const syntactic& f, const syntactic& a1,
00089 const syntactic& a2) {
00090 return as_syntactic (gen (*f, *a1, *a2)); }
00091 inline syntactic syn (const syntactic& f, const syntactic& a1,
00092 const syntactic& a2, const syntactic& a3) {
00093 return as_syntactic (gen (*f, *a1, *a2, *a3)); }
00094 inline syntactic syn (const syntactic& f,
00095 const syntactic& a1, const syntactic& a2,
00096 const syntactic& a3, const syntactic& a4) {
00097 return as_syntactic (gen (*f, *a1, *a2, *a3, *a4)); }
00098 inline syntactic syn (const syntactic& f, const vector<syntactic>& a) {
00099 const vector<generic>* ptr= (vector<generic>*) ((void*) (&a));
00100 return as_syntactic (gen (*f, *ptr)); }
00101
00102 inline syntactic syn (const char* f) {
00103 return as_syntactic (gen (generic (f))); }
00104 inline syntactic syn (const char* f, const syntactic& a1) {
00105 return as_syntactic (gen (generic (f), *a1)); }
00106 inline syntactic syn (const char* f, const syntactic& a1,
00107 const syntactic& a2) {
00108 return as_syntactic (gen (generic (f), *a1, *a2)); }
00109 inline syntactic syn (const char* f, const syntactic& a1,
00110 const syntactic& a2, const syntactic& a3) {
00111 return as_syntactic (gen (generic (f), *a1, *a2, *a3)); }
00112 inline syntactic syn (const char* f,
00113 const syntactic& a1, const syntactic& a2,
00114 const syntactic& a3, const syntactic& a4) {
00115 return as_syntactic (gen (generic (f), *a1, *a2, *a3, *a4)); }
00116 inline syntactic syn (const char* f, const vector<syntactic>& a) {
00117 const vector<generic>* ptr= (vector<generic>*) ((void*) (&a));
00118 return as_syntactic (gen (generic (f), *ptr)); }
00119
00120 inline syntactic syn (const generic& f) {
00121 return as_syntactic (gen (f)); }
00122 inline syntactic syn (const generic& f, const syntactic& a1) {
00123 return as_syntactic (gen (f, *a1)); }
00124 inline syntactic syn (const generic& f, const syntactic& a1,
00125 const syntactic& a2) {
00126 return as_syntactic (gen (f, *a1, *a2)); }
00127 inline syntactic syn (const generic& f, const syntactic& a1,
00128 const syntactic& a2, const syntactic& a3) {
00129 return as_syntactic (gen (f, *a1, *a2, *a3)); }
00130 inline syntactic syn (const generic& f,
00131 const syntactic& a1, const syntactic& a2,
00132 const syntactic& a3, const syntactic& a4) {
00133 return as_syntactic (gen (f, *a1, *a2, *a3, *a4)); }
00134 inline syntactic syn (const generic& f, const vector<syntactic>& a) {
00135 const vector<generic>* ptr= (vector<generic>*) ((void*) (&a));
00136 return as_syntactic (gen (f, *ptr)); }
00137
00138
00139
00140
00141
00142 syntactic apply (const syntactic& f);
00143 syntactic apply (const syntactic& f, const syntactic& a1);
00144 syntactic apply (const syntactic& f, const syntactic& a1, const syntactic& a2);
00145 syntactic apply (const syntactic& f, const syntactic& a1, const syntactic& a2,
00146 const syntactic& a3);
00147 syntactic apply (const syntactic& f, const syntactic& a1, const syntactic& a2,
00148 const syntactic& a3, const syntactic& a4);
00149 syntactic apply (const syntactic& f, const syntactic& a1,
00150 const syntactic& a2, const syntactic& a3,
00151 const syntactic& a4, const syntactic& a5);
00152 syntactic apply (const syntactic& f, const syntactic& a1,
00153 const syntactic& a2, const syntactic& a3,
00154 const syntactic& a4, const syntactic& a5,
00155 const syntactic& a6);
00156 syntactic apply (const syntactic& f, const vector<syntactic>& a);
00157
00158 inline syntactic apply (const char* f) {
00159 return apply (syntactic (f)); }
00160 inline syntactic apply (const char* f, const syntactic& a1) {
00161 return apply (syntactic (f), a1); }
00162 inline syntactic apply (const char* f, const syntactic& a1,
00163 const syntactic& a2) {
00164 return apply (syntactic (f), a1, a2); }
00165 inline syntactic apply (const char* f, const syntactic& a1,
00166 const syntactic& a2, const syntactic& a3) {
00167 return apply (syntactic (f), a1, a2, a3); }
00168 inline syntactic apply (const char* f,
00169 const syntactic& a1, const syntactic& a2,
00170 const syntactic& a3, const syntactic& a4) {
00171 return apply (syntactic (f), a1, a2, a3, a4); }
00172 inline syntactic apply (const char* f,
00173 const syntactic& a1, const syntactic& a2,
00174 const syntactic& a3, const syntactic& a4,
00175 const syntactic& a5) {
00176 return apply (syntactic (f), a1, a2, a3, a4, a5); }
00177 inline syntactic apply (const char* f,
00178 const syntactic& a1, const syntactic& a2,
00179 const syntactic& a3, const syntactic& a4,
00180 const syntactic& a5, const syntactic& a6) {
00181 return apply (syntactic (f), a1, a2, a3, a4, a5, a6); }
00182 inline syntactic apply (const char* f, const vector<syntactic>& a) {
00183 return apply (syntactic (f), a); }
00184
00185 inline syntactic apply (const generic& f) {
00186 return apply (as_syntactic (f)); }
00187 inline syntactic apply (const generic& f, const syntactic& a1) {
00188 return apply (as_syntactic (f), a1); }
00189 inline syntactic apply (const generic& f, const syntactic& a1,
00190 const syntactic& a2) {
00191 return apply (as_syntactic (f), a1, a2); }
00192 inline syntactic apply (const generic& f, const syntactic& a1,
00193 const syntactic& a2, const syntactic& a3) {
00194 return apply (as_syntactic (f), a1, a2, a3); }
00195 inline syntactic apply (const generic& f,
00196 const syntactic& a1, const syntactic& a2,
00197 const syntactic& a3, const syntactic& a4) {
00198 return apply (as_syntactic (f), a1, a2, a3, a4); }
00199 inline syntactic apply (const generic& f,
00200 const syntactic& a1, const syntactic& a2,
00201 const syntactic& a3, const syntactic& a4,
00202 const syntactic& a5) {
00203 return apply (as_syntactic (f), a1, a2, a3, a4, a5); }
00204 inline syntactic apply (const generic& f,
00205 const syntactic& a1, const syntactic& a2,
00206 const syntactic& a3, const syntactic& a4,
00207 const syntactic& a5, const syntactic& a6) {
00208 return apply (as_syntactic (f), a1, a2, a3, a4, a5, a6); }
00209 inline syntactic apply (const generic& f, const vector<syntactic>& a) {
00210 return apply (as_syntactic (f), a); }
00211
00212 #define syntactic_apply mmx::apply
00213
00214
00215
00216
00217
00218 void set_default (syntactic& x);
00219 void set_smallest (syntactic& x);
00220 void set_largest (syntactic& x);
00221 void set_accuracy (syntactic& x);
00222 void set_pi (syntactic& x);
00223 void set_log2 (syntactic& x);
00224 void set_euler (syntactic& x);
00225 void set_catalan (syntactic& x);
00226 void set_imaginary (syntactic& x);
00227 void set_nan (syntactic& x);
00228 void set_fuzz (syntactic& x);
00229 void set_infinity (syntactic& x);
00230 void set_maximal (syntactic& x);
00231 void set_minimal (syntactic& x);
00232
00233 bool set_frac_flag (bool new_val);
00234 syntactic migrate_negate (const syntactic& g, nat maximal);
00235 syntactic operator - (const syntactic& g);
00236 syntactic square (const syntactic& g);
00237 syntactic invert (const syntactic& g);
00238 syntactic operator + (const syntactic& g1, const syntactic& g2);
00239 syntactic operator - (const syntactic& g1, const syntactic& g2);
00240 syntactic operator * (const syntactic& g1, const syntactic& g2);
00241 syntactic operator / (const syntactic& g1, const syntactic& g2);
00242 syntactic gcd (const syntactic& g1, const syntactic& g2);
00243 syntactic lcm (const syntactic& g1, const syntactic& g2);
00244 syntactic xgcd (const syntactic& g1, const syntactic& g2);
00245 syntactic ordered_sum (const vector<syntactic>& v);
00246 syntactic ordered_product (const vector<syntactic>& v);
00247
00248 bool operator < (const syntactic& x, const syntactic& y);
00249 bool operator <= (const syntactic& x, const syntactic& y);
00250 bool operator > (const syntactic& x, const syntactic& y);
00251 bool operator >= (const syntactic& x, const syntactic& y);
00252
00253 syntactic sqrt (const syntactic& g);
00254 syntactic exp (const syntactic& g);
00255 syntactic log (const syntactic& g);
00256 syntactic cos (const syntactic& g);
00257 syntactic sin (const syntactic& g);
00258 syntactic tan (const syntactic& g);
00259 syntactic acos (const syntactic& g);
00260 syntactic asin (const syntactic& g);
00261 syntactic atan (const syntactic& g);
00262 syntactic cosh (const syntactic& g);
00263 syntactic sinh (const syntactic& g);
00264 syntactic tanh (const syntactic& g);
00265 syntactic acosh (const syntactic& g);
00266 syntactic asinh (const syntactic& g);
00267 syntactic atanh (const syntactic& g);
00268 syntactic pow (const syntactic& g1, const syntactic& g2);
00269 syntactic pow (const syntactic& g1, const int& g2);
00270 syntactic pow (const int& g1, const syntactic& g2);
00271 syntactic hypot (const syntactic& g1, const syntactic& g2);
00272 syntactic atan2 (const syntactic& g1, const syntactic& g2);
00273 syntactic trig (const syntactic& g);
00274 syntactic Re (const syntactic& g1);
00275 syntactic Im (const syntactic& g1);
00276 syntactic abs (const syntactic& g1);
00277 syntactic arg (const syntactic& g1);
00278 syntactic conj (const syntactic& g1);
00279 syntactic gaussian (const syntactic& g1, const syntactic& g2);
00280 syntactic polar (const syntactic& g1, const syntactic& g2);
00281
00282 syntactic center (const syntactic& g1);
00283 syntactic radius (const syntactic& g1);
00284 syntactic numerator (const syntactic& x);
00285 syntactic denominator (const syntactic& x);
00286
00287 syntactic operator << (const syntactic& x1, const syntactic& x2);
00288 syntactic operator >> (const syntactic& x1, const syntactic& x2);
00289 syntactic lshiftz (const syntactic& g, const syntactic& sh);
00290 syntactic rshiftz (const syntactic& g, const syntactic& sh);
00291 syntactic derive (const syntactic& g);
00292 syntactic derive (const syntactic& g, const syntactic& v);
00293 syntactic xderive (const syntactic& g);
00294 syntactic xderive (const syntactic& g, const syntactic& v);
00295 syntactic integrate (const syntactic& g);
00296 syntactic integrate (const syntactic& g, const syntactic& v);
00297 syntactic sqrt_init (const syntactic& x, const syntactic& c);
00298 syntactic log_init (const syntactic& x, const syntactic& c);
00299 syntactic acos_init (const syntactic& x, const syntactic& c);
00300 syntactic asin_init (const syntactic& x, const syntactic& c);
00301 syntactic atan_init (const syntactic& x, const syntactic& c);
00302 syntactic integrate_init (const syntactic& x, const syntactic& c);
00303 syntactic integrate_init (const syntactic& g, const syntactic& v,
00304 const syntactic& c);
00305 syntactic solve_lde_init (const syntactic& x, const syntactic& c);
00306 syntactic inject (const syntactic& x, const syntactic& y, const syntactic& z);
00307 syntactic project (const syntactic& x, const syntactic& y);
00308
00309
00310
00311
00312
00313 bool operator == (const vector<syntactic>& v, const vector<syntactic>& w);
00314 bool operator != (const vector<syntactic>& v, const vector<syntactic>& w);
00315 bool exact_eq (const vector<syntactic>& v, const vector<syntactic>& w);
00316 bool exact_new (const vector<syntactic>& v, const vector<syntactic>& w);
00317
00318
00319
00320
00321
00322 extern string as_string (void* ptr);
00323
00324 template<typename C> inline syntactic
00325 flatten (C* const & x) {
00326 return as_string ((void*) x);
00327 }
00328
00329 syntactic flatten (const bool& b);
00330 syntactic flatten (const char& i);
00331 syntactic flatten (const signed char& i);
00332 syntactic flatten (const unsigned char& i);
00333 syntactic flatten (const short int& i);
00334 syntactic flatten (const short unsigned int& i);
00335 syntactic flatten (const int& i);
00336 syntactic flatten (const unsigned int& i);
00337 syntactic flatten (const long int& i);
00338 syntactic flatten (const long unsigned int& i);
00339 syntactic flatten (const long long int& i);
00340 syntactic flatten (const long long unsigned int& i);
00341 syntactic flatten (const float& x);
00342 syntactic flatten (const double& x);
00343 syntactic flatten (const long double& x);
00344 syntactic flatten (const char* const & s);
00345 syntactic flatten (const string& s);
00346
00347 template<typename C> syntactic
00348 generic_concrete_rep<C>::expression () const {
00349 return flatten (rep); }
00350
00351 }
00352 #endif // __SYNTACTIC_HPP