Minsky
expressionWalker.h
Go to the documentation of this file.
1 /*
2  @copyright Steve Keen 2012
3  @author Russell Standish
4  This file is part of Minsky.
5 
6  Minsky is free software: you can redistribute it and/or modify it
7  under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  Minsky is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with Minsky. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
25 #ifndef EXPRESSIONWALKER_H
26 #define EXPRESSIONWALKER_H
27 #include "unitsExpressionWalker.h"
28 
29 #include <memory>
30 
31 namespace minsky
32 {
33  inline bool operator>(std::size_t x, const UnitsExpressionWalker& y) {return x>y.value;}
34 
36  {
37  if (x.units.empty()) return {};
38  int index=y.value;
39  if (index!=y.value)
40  throw std::runtime_error("index must be an integer for roots of dimensioned quanitites");
42  for (auto& i: x.units)
43  {
44  if (i.second % index)
45  throw std::runtime_error("input dimension "+i.first+" not a power to the index "+std::to_string(index));
46  r.units[i.first]=i.second/index;
47  }
48  return r;
49  }
50 
52  {
53  if (y.value<1) return root(x,1/y.value);
54  auto exponent=int(y.value);
55  if (exponent==y.value)
56  {
57  auto tmp=x;
58  for (auto& i: tmp.units)
59  i.second*=exponent;
60  return tmp;
61  }
64  return x;
65  }
66 
68  {x.checkDimensionless(); y.checkDimensionless(); return x;}
69 
71  {x.checkSameDims(y); auto tmp=x; tmp.units.clear(); return tmp;}
72 }
73 
74 // preload these system headers here, to prevent them from being loaded into anonymous namespace
75 #include <algorithm>
76 #include <cctype>
77 #include <cmath>
78 #include <complex>
79 #include <cstdio>
80 #include <cstdlib>
81 #include <cstring>
82 #include <ctime>
83 #include <deque>
84 #include <exception>
85 #include <functional>
86 #include <iterator>
87 #include <limits>
88 #include <list>
89 #include <map>
90 #include <set>
91 #include <stack>
92 #include <stdexcept>
93 #include <string>
94 #include <utility>
95 #include <vector>
96 #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
97 # include <windows.h>
98 #else
99 # include <sys/time.h>
100 # include <sys/types.h>
101 #endif
102 
103 namespace exprtk
104 {
105  namespace details
106  {
107  inline bool is_true(const minsky::UnitsExpressionWalker& x) {return x.value!=0;}
108  }
109 }
110 
111 #include <exprtk/exprtk.hpp>
112 
113 namespace exprtk
114 {
115  namespace details
116  {
117  template <>
118  inline bool string_to_real(const std::string& s, minsky::UnitsExpressionWalker& t)
119  {
120  t.units.clear();
121  try
122  {
123  t.value=stod(s);
124  }
125  catch (...)
126  {return false;}
127  return true;
128  }
129 
130  namespace numeric
131  {
132 #define exprtk_define_unary_function(Function) \
133  template <> \
134  inline minsky::UnitsExpressionWalker Function(const minsky::UnitsExpressionWalker x) \
135  {x.checkDimensionless(); return x;}
136 
137 #define exprtk_define_unary_function_not_dimensionless(Function) \
138  template <> \
139  inline minsky::UnitsExpressionWalker Function(const minsky::UnitsExpressionWalker x) \
140  {return x;}
141 
160  exprtk_define_unary_function_not_dimensionless(pos ) // apparently not used
175  template <> inline minsky::UnitsExpressionWalker sgn(const minsky::UnitsExpressionWalker x) {return {};}
181 
183  {
185  for (auto& i: x.units)
186  {
187  if (i.second % 2)
188  throw std::runtime_error("input dimension "+i.first+" not a square");
189  r.units[i.first]=i.second/2;
190  }
191  return r;
192  }
193 
194 
195  template <> inline int to_int32(const minsky::UnitsExpressionWalker x) {return int(x.value);}
196  template <> inline _int64_t to_int64(const minsky::UnitsExpressionWalker x) {return int64_t(x.value);}
197  template <> inline bool is_integer(const minsky::UnitsExpressionWalker x) {return int64_t(x.value)==x.value;}
198  template <> inline bool is_nan(const minsky::UnitsExpressionWalker x) {return false;}
199 
200 #define exprtk_define_binary_function(Function) \
201  template <> \
202  inline minsky::UnitsExpressionWalker Function \
203  (const minsky::UnitsExpressionWalker x, const minsky::UnitsExpressionWalker y) \
204  {x.checkSameDims(y); return x;}
205 
206 #define exprtk_define_binary_function_first_arg(Function) \
207  template <> \
208  inline minsky::UnitsExpressionWalker Function \
209  (const minsky::UnitsExpressionWalker x, const minsky::UnitsExpressionWalker y) \
210  {return x;}
211 
212 #define exprtk_define_binary_function_dimensionless(Function) \
213  template <> \
214  inline minsky::UnitsExpressionWalker Function \
215  (const minsky::UnitsExpressionWalker x, const minsky::UnitsExpressionWalker y) \
216  {x.checkSameDims(y); return {};}
217 
225 
226  template <> inline minsky::UnitsExpressionWalker root
228  {return minsky:: root(x,y);}
229 
241  }
242 
243 #define exprtk_define_binary_op_impl(Op, def) \
244  template <> \
245  struct Op##_op<minsky::UnitsExpressionWalker>: \
246  public opr_base<minsky::UnitsExpressionWalker> \
247  { \
248  using T=minsky::UnitsExpressionWalker; \
249  typedef typename opr_base<T>::Type Type; \
250  typedef typename opr_base<T>::RefType RefType; \
251  \
252  static inline T process(Type x, Type y) \
253  {return def;} \
254  static inline void assign(RefType t1, Type t2) \
255  {t1=t2;} \
256  static inline typename expression_node<T>::node_type type() \
257  { return expression_node<T>::e_##Op; } \
258  static inline details::operator_type operation() \
259  { return details::e_##Op; } \
260  };
261 
262 #define exprtk_define_binary_op(Op,op) exprtk_define_binary_op_impl(Op, x op y)
263 #define exprtk_define_binary_fun_op(Op,f) exprtk_define_binary_op_impl(Op, f(x,y))
264 
283 
284 
285  }
286 #undef exprtk_define_unary_function
287 #undef exprtk_define_binary_function
288 #undef exprtk_define_binary_op
289 #undef exprtk_define_binary_fun_op
290 #undef exprtk_define_binary_fun_op_impl
291 }
292 #endif
exprtk_define_unary_function_not_dimensionless(abs) exprtk_define_unary_function(acos) exprtk_define_unary_function(acosh) exprtk_define_unary_function(asin) exprtk_define_unary_function(asinh) exprtk_define_unary_function(atan) exprtk_define_unary_function(atanh) exprtk_define_unary_function(ceil) exprtk_define_unary_function(cos) exprtk_define_unary_function(cosh) exprtk_define_unary_function(exp) exprtk_define_unary_function(expm1) exprtk_define_unary_function(floor) exprtk_define_unary_function(log) exprtk_define_unary_function(log10) exprtk_define_unary_function(log2) exprtk_define_unary_function(log1p) exprtk_define_unary_function_not_dimensionless(neg) exprtk_define_unary_function_not_dimensionless(pos) exprtk_define_unary_function_not_dimensionless(round) exprtk_define_unary_function(sin) exprtk_define_unary_function(sinc) exprtk_define_unary_function(sinh) exprtk_define_unary_function(tan) exprtk_define_unary_function(tanh) exprtk_define_unary_function(cot) exprtk_define_unary_function(sec) exprtk_define_unary_function(csc) exprtk_define_unary_function(r2d) exprtk_define_unary_function(d2r) exprtk_define_unary_function(d2g) exprtk_define_unary_function(g2d) exprtk_define_unary_function(notl) template<> inline minsky
bool operator>(std::size_t x, const UnitsExpressionWalker &y)
Expr sin(const Expr &x)
Definition: expr.h:131
Expr cos(const Expr &x)
Definition: expr.h:137
int to_int32(const minsky::UnitsExpressionWalker x)
UnitsExpressionWalker pow(const UnitsExpressionWalker &x, const UnitsExpressionWalker &y)
_int64_t to_int64(const minsky::UnitsExpressionWalker x)
UnitsExpressionWalker checkDimensionless(const UnitsExpressionWalker &x, const UnitsExpressionWalker &y)
UnitsExpressionWalker root(const UnitsExpressionWalker &x, const UnitsExpressionWalker &y)
exprtk_define_binary_op(add,+) exprtk_define_binary_op(sub
Expr sqrt(const Expr &x)
Definition: expr.h:154
exprtk_define_binary_op_impl(mod, x) exprtk_define_binary_fun_op(pow
Creation and access to the minskyTCL_obj object, which has code to record whenever Minsky&#39;s state cha...
Definition: constMap.h:22
Expr exp(const Expr &x)
Definition: expr.h:126
exprtk_define_unary_function(erf) exprtk_define_unary_function(erfc) exprtk_define_unary_function(ncdf) exprtk_define_unary_function_not_dimensionless(frac) exprtk_define_unary_function_not_dimensionless(trunc) template<> inline minsky
UnitsExpressionWalker checkSameDims(const UnitsExpressionWalker &x, const UnitsExpressionWalker &y)
Expr sinh(const Expr &x)
Definition: expr.h:142
Expr cosh(const Expr &x)
Definition: expr.h:148
bool is_integer(const minsky::UnitsExpressionWalker x)
pow exprtk_define_binary_fun_op(lt, checkSameDims) exprtk_define_binary_fun_op(lte
void checkSameDims(const UnitsExpressionWalker &x) const
exprtk_define_binary_function_dimensionless(equal)
minsky::UnitsExpressionWalker root(const minsky::UnitsExpressionWalker x, const minsky::UnitsExpressionWalker y)
bool string_to_real(const std::string &s, minsky::UnitsExpressionWalker &t)
bool is_true(const minsky::UnitsExpressionWalker &x)
bool is_nan(const minsky::UnitsExpressionWalker x)
string to_string(CONST84 char *x)
Definition: minskyTCLObj.h:33
exprtk_define_binary_function_first_arg(modulus)
Expr log(const Expr &x)
Definition: expr.h:120