basix_doc 0.1
|
00001 00002 /****************************************************************************** 00003 * MODULE : syntactic.hpp 00004 * DESCRIPTION: Syntactic expressions with basic simplification 00005 * COPYRIGHT : (C) 2008 Joris van der Hoeven 00006 ******************************************************************************* 00007 * This software falls under the GNU general public license and comes WITHOUT 00008 * ANY WARRANTY WHATSOEVER. See the file $TEXMACS_PATH/LICENSE for more details. 00009 * If you don't have this file, write to the Free Software Foundation, Inc., 00010 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00011 ******************************************************************************/ 00012 00013 #ifndef __SYNTACTIC_HPP 00014 #define __SYNTACTIC_HPP 00015 #include <basix/generic.hpp> 00016 00018 00019 namespace mmx { 00020 00021 /****************************************************************************** 00022 * The syntactic wrapper type 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 template<typename C> syntactic 00042 generic_concrete_rep<C>::expression () const { 00043 return flatten (rep); } 00044 00045 /****************************************************************************** 00046 * Syntactic routines 00047 ******************************************************************************/ 00048 00049 inline generic as_generic (const syntactic& g) { return *g; } 00050 inline syntactic as_syntactic (const generic& g) { return syntactic (g); } 00051 inline nat hash (const syntactic& c) { return hash (*c); } 00052 inline nat exact_hash (const syntactic& c) { return exact_hash (*c); } 00053 inline nat hard_hash (const syntactic& c) { return hard_hash (*c); } 00054 inline bool operator == (const syntactic& c1, const syntactic& c2) { 00055 return (*c1) == (*c2); } 00056 inline bool operator != (const syntactic& c1, const syntactic& c2) { 00057 return (*c1) != (*c2); } 00058 inline bool exact_eq (const syntactic& c1, const syntactic& c2) { 00059 return exact_eq (*c1, *c2); } 00060 inline bool exact_neq (const syntactic& c1, const syntactic& c2) { 00061 return exact_neq (*c1, *c2); } 00062 inline bool hard_eq (const syntactic& c1, const syntactic& c2) { 00063 return hard_eq (*c1, *c2); } 00064 inline bool hard_neq (const syntactic& c1, const syntactic& c2) { 00065 return hard_neq (*c1, *c2); } 00066 inline syntactic flatten (const syntactic& g) { return g; } 00067 00068 bool is_atom (const syntactic& g); 00069 string as_string (const syntactic& g); 00070 00071 bool is_func (const syntactic& g, const char* f); 00072 bool is_func (const syntactic& g, const char* f, nat n); 00073 bool is_func (const syntactic& g, const syntactic& f); 00074 bool is_func (const syntactic& g, const syntactic& f, nat n); 00075 bool is_func (const syntactic& g, const generic& f); 00076 bool is_func (const syntactic& g, const generic& f, nat n); 00077 00078 syntactic access (const syntactic& g, const syntactic& i); 00079 syntactic access (const syntactic& g, const syntactic& i, const syntactic& j); 00080 00081 vector<syntactic> components (const syntactic& g); 00082 vector<syntactic> arguments (const syntactic& g); 00083 00084 /****************************************************************************** 00085 * Syntactic function application 00086 ******************************************************************************/ 00087 00088 inline syntactic syn (const syntactic& f) { 00089 return as_syntactic (gen (*f)); } 00090 inline syntactic syn (const syntactic& f, const syntactic& a1) { 00091 return as_syntactic (gen (*f, *a1)); } 00092 inline syntactic syn (const syntactic& f, const syntactic& a1, 00093 const syntactic& a2) { 00094 return as_syntactic (gen (*f, *a1, *a2)); } 00095 inline syntactic syn (const syntactic& f, const syntactic& a1, 00096 const syntactic& a2, const syntactic& a3) { 00097 return as_syntactic (gen (*f, *a1, *a2, *a3)); } 00098 inline syntactic syn (const syntactic& f, 00099 const syntactic& a1, const syntactic& a2, 00100 const syntactic& a3, const syntactic& a4) { 00101 return as_syntactic (gen (*f, *a1, *a2, *a3, *a4)); } 00102 inline syntactic syn (const syntactic& f, const vector<syntactic>& a) { 00103 const vector<generic>* ptr= (vector<generic>*) ((void*) (&a)); 00104 return as_syntactic (gen (*f, *ptr)); } 00105 00106 inline syntactic syn (const char* f) { 00107 return as_syntactic (gen (generic (f))); } 00108 inline syntactic syn (const char* f, const syntactic& a1) { 00109 return as_syntactic (gen (generic (f), *a1)); } 00110 inline syntactic syn (const char* f, const syntactic& a1, 00111 const syntactic& a2) { 00112 return as_syntactic (gen (generic (f), *a1, *a2)); } 00113 inline syntactic syn (const char* f, const syntactic& a1, 00114 const syntactic& a2, const syntactic& a3) { 00115 return as_syntactic (gen (generic (f), *a1, *a2, *a3)); } 00116 inline syntactic syn (const char* f, 00117 const syntactic& a1, const syntactic& a2, 00118 const syntactic& a3, const syntactic& a4) { 00119 return as_syntactic (gen (generic (f), *a1, *a2, *a3, *a4)); } 00120 inline syntactic syn (const char* f, const vector<syntactic>& a) { 00121 const vector<generic>* ptr= (vector<generic>*) ((void*) (&a)); 00122 return as_syntactic (gen (generic (f), *ptr)); } 00123 00124 inline syntactic syn (const generic& f) { 00125 return as_syntactic (gen (f)); } 00126 inline syntactic syn (const generic& f, const syntactic& a1) { 00127 return as_syntactic (gen (f, *a1)); } 00128 inline syntactic syn (const generic& f, const syntactic& a1, 00129 const syntactic& a2) { 00130 return as_syntactic (gen (f, *a1, *a2)); } 00131 inline syntactic syn (const generic& f, const syntactic& a1, 00132 const syntactic& a2, const syntactic& a3) { 00133 return as_syntactic (gen (f, *a1, *a2, *a3)); } 00134 inline syntactic syn (const generic& f, 00135 const syntactic& a1, const syntactic& a2, 00136 const syntactic& a3, const syntactic& a4) { 00137 return as_syntactic (gen (f, *a1, *a2, *a3, *a4)); } 00138 inline syntactic syn (const generic& f, const vector<syntactic>& a) { 00139 const vector<generic>* ptr= (vector<generic>*) ((void*) (&a)); 00140 return as_syntactic (gen (f, *ptr)); } 00141 00142 /****************************************************************************** 00143 * Semantic function application 00144 ******************************************************************************/ 00145 00146 syntactic apply (const syntactic& f); 00147 syntactic apply (const syntactic& f, const syntactic& a1); 00148 syntactic apply (const syntactic& f, const syntactic& a1, const syntactic& a2); 00149 syntactic apply (const syntactic& f, const syntactic& a1, const syntactic& a2, 00150 const syntactic& a3); 00151 syntactic apply (const syntactic& f, const syntactic& a1, const syntactic& a2, 00152 const syntactic& a3, const syntactic& a4); 00153 syntactic apply (const syntactic& f, const syntactic& a1, 00154 const syntactic& a2, const syntactic& a3, 00155 const syntactic& a4, const syntactic& a5); 00156 syntactic apply (const syntactic& f, const syntactic& a1, 00157 const syntactic& a2, const syntactic& a3, 00158 const syntactic& a4, const syntactic& a5, 00159 const syntactic& a6); 00160 syntactic apply (const syntactic& f, const vector<syntactic>& a); 00161 00162 inline syntactic apply (const char* f) { 00163 return apply (syntactic (f)); } 00164 inline syntactic apply (const char* f, const syntactic& a1) { 00165 return apply (syntactic (f), a1); } 00166 inline syntactic apply (const char* f, const syntactic& a1, 00167 const syntactic& a2) { 00168 return apply (syntactic (f), a1, a2); } 00169 inline syntactic apply (const char* f, const syntactic& a1, 00170 const syntactic& a2, const syntactic& a3) { 00171 return apply (syntactic (f), a1, a2, a3); } 00172 inline syntactic apply (const char* f, 00173 const syntactic& a1, const syntactic& a2, 00174 const syntactic& a3, const syntactic& a4) { 00175 return apply (syntactic (f), a1, a2, a3, a4); } 00176 inline syntactic apply (const char* f, 00177 const syntactic& a1, const syntactic& a2, 00178 const syntactic& a3, const syntactic& a4, 00179 const syntactic& a5) { 00180 return apply (syntactic (f), a1, a2, a3, a4, a5); } 00181 inline syntactic apply (const char* f, 00182 const syntactic& a1, const syntactic& a2, 00183 const syntactic& a3, const syntactic& a4, 00184 const syntactic& a5, const syntactic& a6) { 00185 return apply (syntactic (f), a1, a2, a3, a4, a5, a6); } 00186 inline syntactic apply (const char* f, const vector<syntactic>& a) { 00187 return apply (syntactic (f), a); } 00188 00189 inline syntactic apply (const generic& f) { 00190 return apply (as_syntactic (f)); } 00191 inline syntactic apply (const generic& f, const syntactic& a1) { 00192 return apply (as_syntactic (f), a1); } 00193 inline syntactic apply (const generic& f, const syntactic& a1, 00194 const syntactic& a2) { 00195 return apply (as_syntactic (f), a1, a2); } 00196 inline syntactic apply (const generic& f, const syntactic& a1, 00197 const syntactic& a2, const syntactic& a3) { 00198 return apply (as_syntactic (f), a1, a2, a3); } 00199 inline syntactic apply (const generic& f, 00200 const syntactic& a1, const syntactic& a2, 00201 const syntactic& a3, const syntactic& a4) { 00202 return apply (as_syntactic (f), a1, a2, a3, a4); } 00203 inline syntactic apply (const generic& f, 00204 const syntactic& a1, const syntactic& a2, 00205 const syntactic& a3, const syntactic& a4, 00206 const syntactic& a5) { 00207 return apply (as_syntactic (f), a1, a2, a3, a4, a5); } 00208 inline syntactic apply (const generic& f, 00209 const syntactic& a1, const syntactic& a2, 00210 const syntactic& a3, const syntactic& a4, 00211 const syntactic& a5, const syntactic& a6) { 00212 return apply (as_syntactic (f), a1, a2, a3, a4, a5, a6); } 00213 inline syntactic apply (const generic& f, const vector<syntactic>& a) { 00214 return apply (as_syntactic (f), a); } 00215 00216 /****************************************************************************** 00217 * Mathematical functions 00218 ******************************************************************************/ 00219 00220 void set_smallest (syntactic& x); 00221 void set_largest (syntactic& x); 00222 void set_accuracy (syntactic& x); 00223 void set_pi (syntactic& x); 00224 void set_log2 (syntactic& x); 00225 void set_euler (syntactic& x); 00226 void set_catalan (syntactic& x); 00227 void set_imaginary (syntactic& x); 00228 void set_nan (syntactic& x); 00229 void set_fuzz (syntactic& x); 00230 void set_infinity (syntactic& x); 00231 void set_maximal (syntactic& x); 00232 void set_minimal (syntactic& x); 00233 00234 bool set_frac_flag (bool new_val); 00235 syntactic migrate_negate (const syntactic& g, nat maximal); 00236 syntactic operator - (const syntactic& g); 00237 syntactic square (const syntactic& g); 00238 syntactic invert (const syntactic& g); 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 operator / (const syntactic& g1, const syntactic& g2); 00243 syntactic gcd (const syntactic& g1, const syntactic& g2); 00244 syntactic lcm (const syntactic& g1, const syntactic& g2); 00245 syntactic xgcd (const syntactic& g1, const syntactic& g2); 00246 syntactic ordered_sum (const vector<syntactic>& v); 00247 syntactic ordered_product (const vector<syntactic>& v); 00248 00249 syntactic sqrt (const syntactic& g); 00250 syntactic exp (const syntactic& g); 00251 syntactic log (const syntactic& g); 00252 syntactic cos (const syntactic& g); 00253 syntactic sin (const syntactic& g); 00254 syntactic tan (const syntactic& g); 00255 syntactic acos (const syntactic& g); 00256 syntactic asin (const syntactic& g); 00257 syntactic atan (const syntactic& g); 00258 syntactic cosh (const syntactic& g); 00259 syntactic sinh (const syntactic& g); 00260 syntactic tanh (const syntactic& g); 00261 syntactic acosh (const syntactic& g); 00262 syntactic asinh (const syntactic& g); 00263 syntactic atanh (const syntactic& g); 00264 syntactic pow (const syntactic& g1, const syntactic& g2); 00265 syntactic pow (const syntactic& g1, const int& g2); 00266 syntactic pow (const int& g1, const syntactic& g2); 00267 syntactic hypot (const syntactic& g1, const syntactic& g2); 00268 syntactic atan2 (const syntactic& g1, const syntactic& g2); 00269 syntactic trig (const syntactic& g); 00270 syntactic Re (const syntactic& g1); 00271 syntactic Im (const syntactic& g1); 00272 syntactic abs (const syntactic& g1); 00273 syntactic arg (const syntactic& g1); 00274 syntactic conj (const syntactic& g1); 00275 syntactic gaussian (const syntactic& g1, const syntactic& g2); 00276 syntactic polar (const syntactic& g1, const syntactic& g2); 00277 00278 syntactic center (const syntactic& g1); 00279 syntactic radius (const syntactic& g1); 00280 syntactic numerator (const syntactic& x); 00281 syntactic denominator (const syntactic& x); 00282 00283 syntactic operator << (const syntactic& x1, const syntactic& x2); 00284 syntactic operator >> (const syntactic& x1, const syntactic& x2); 00285 syntactic lshiftz (const syntactic& g, const syntactic& sh); 00286 syntactic rshiftz (const syntactic& g, const syntactic& sh); 00287 syntactic derive (const syntactic& g); 00288 syntactic derive (const syntactic& g, const syntactic& v); 00289 syntactic xderive (const syntactic& g); 00290 syntactic xderive (const syntactic& g, const syntactic& v); 00291 syntactic integrate (const syntactic& g); 00292 syntactic integrate (const syntactic& g, const syntactic& v); 00293 syntactic sqrt_init (const syntactic& x, const syntactic& c); 00294 syntactic log_init (const syntactic& x, const syntactic& c); 00295 syntactic acos_init (const syntactic& x, const syntactic& c); 00296 syntactic asin_init (const syntactic& x, const syntactic& c); 00297 syntactic atan_init (const syntactic& x, const syntactic& c); 00298 syntactic integrate_init (const syntactic& x, const syntactic& c); 00299 syntactic integrate_init (const syntactic& g, const syntactic& v, 00300 const syntactic& c); 00301 syntactic solve_lde_init (const syntactic& x, const syntactic& c); 00302 syntactic inject (const syntactic& x, const syntactic& y, const syntactic& z); 00303 syntactic project (const syntactic& x, const syntactic& y); 00304 00305 /****************************************************************************** 00306 * Flattening 00307 ******************************************************************************/ 00308 00309 extern string as_string (void* ptr); 00310 00311 template<typename C> inline syntactic 00312 flatten (C* const & x) { 00313 return as_string ((void*) x); 00314 } 00315 00316 syntactic flatten (const bool& b); 00317 syntactic flatten (const char& i); 00318 syntactic flatten (const signed char& i); 00319 syntactic flatten (const unsigned char& i); 00320 syntactic flatten (const short int& i); 00321 syntactic flatten (const short unsigned int& i); 00322 syntactic flatten (const int& i); 00323 syntactic flatten (const unsigned int& i); 00324 syntactic flatten (const long int& i); 00325 syntactic flatten (const long unsigned int& i); 00326 syntactic flatten (const long long int& i); 00327 syntactic flatten (const long long unsigned int& i); 00328 syntactic flatten (const float& x); 00329 syntactic flatten (const double& x); 00330 syntactic flatten (const long double& x); 00331 syntactic flatten (const char* const & s); 00332 syntactic flatten (const string& s); 00333 00334 } // namespace mmx 00335 #endif // __SYNTACTIC_HPP