basix_doc 0.1
/Users/mourrain/Devel/mmx/basix/include/basix/syntactic.hpp
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines