C++ Mathematical Expression Library (ExprTk) https://www.partow.net/programming/exprtk/index.html
This commit is contained in:
parent
fc1e23a811
commit
5694e5d915
43
exprtk.hpp
43
exprtk.hpp
|
@ -21334,6 +21334,7 @@ namespace exprtk
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
brkcnt_list_.push_front(false);
|
brkcnt_list_.push_front(false);
|
||||||
|
|
||||||
if (0 == (loop_body = parse_multi_sequence("for-loop")))
|
if (0 == (loop_body = parse_multi_sequence("for-loop")))
|
||||||
{
|
{
|
||||||
set_error(
|
set_error(
|
||||||
|
@ -36256,6 +36257,45 @@ namespace exprtk
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class nthelement : public exprtk::igeneric_function<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
typedef typename exprtk::igeneric_function<T> igfun_t;
|
||||||
|
typedef typename igfun_t::parameter_list_t parameter_list_t;
|
||||||
|
typedef typename igfun_t::generic_type generic_type;
|
||||||
|
typedef typename generic_type::scalar_view scalar_t;
|
||||||
|
typedef typename generic_type::vector_view vector_t;
|
||||||
|
|
||||||
|
using exprtk::igeneric_function<T>::operator();
|
||||||
|
|
||||||
|
nthelement()
|
||||||
|
: exprtk::igeneric_function<T>("VT|VTTT")
|
||||||
|
{}
|
||||||
|
|
||||||
|
inline T operator()(const std::size_t& ps_index, parameter_list_t parameters)
|
||||||
|
{
|
||||||
|
vector_t vec(parameters[0]);
|
||||||
|
|
||||||
|
std::size_t n = 0;
|
||||||
|
std::size_t r0 = 0;
|
||||||
|
std::size_t r1 = vec.size() - 1;
|
||||||
|
|
||||||
|
if (!scalar_t(parameters[1]).to_uint(n))
|
||||||
|
return T(0);
|
||||||
|
|
||||||
|
if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,2,3))
|
||||||
|
return std::numeric_limits<T>::quiet_NaN();
|
||||||
|
else if (details::invalid_range(vec,r0,r1))
|
||||||
|
return std::numeric_limits<T>::quiet_NaN();
|
||||||
|
|
||||||
|
std::nth_element(vec.begin() + r0, vec.begin() + r0 + n , vec.begin() + r1 + 1);
|
||||||
|
|
||||||
|
return T(1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class sumk : public exprtk::igeneric_function<T>
|
class sumk : public exprtk::igeneric_function<T>
|
||||||
{
|
{
|
||||||
|
@ -36666,6 +36706,7 @@ namespace exprtk
|
||||||
shift_left <T> sl;
|
shift_left <T> sl;
|
||||||
shift_right<T> sr;
|
shift_right<T> sr;
|
||||||
sort <T> st;
|
sort <T> st;
|
||||||
|
nthelement <T> ne;
|
||||||
sumk <T> sk;
|
sumk <T> sk;
|
||||||
axpy <T> b1_axpy;
|
axpy <T> b1_axpy;
|
||||||
axpby <T> b1_axpby;
|
axpby <T> b1_axpby;
|
||||||
|
@ -36703,6 +36744,8 @@ namespace exprtk
|
||||||
return false;
|
return false;
|
||||||
else if (!symtab.add_function("sort" ,st))
|
else if (!symtab.add_function("sort" ,st))
|
||||||
return false;
|
return false;
|
||||||
|
else if (!symtab.add_function("nth_element" ,ne))
|
||||||
|
return false;
|
||||||
else if (!symtab.add_function("sumk" ,sk))
|
else if (!symtab.add_function("sumk" ,sk))
|
||||||
return false;
|
return false;
|
||||||
else if (!symtab.add_function("axpy" ,b1_axpy))
|
else if (!symtab.add_function("axpy" ,b1_axpy))
|
||||||
|
|
|
@ -41,7 +41,6 @@ void stddev_example()
|
||||||
expression_t expression;
|
expression_t expression;
|
||||||
|
|
||||||
parser_t parser;
|
parser_t parser;
|
||||||
|
|
||||||
parser.compile(stddev_program,expression);
|
parser.compile(stddev_program,expression);
|
||||||
|
|
||||||
T stddev = expression.value();
|
T stddev = expression.value();
|
||||||
|
|
|
@ -6532,6 +6532,7 @@ inline bool run_test18()
|
||||||
"var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
|
"var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
|
||||||
"var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
|
"var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
|
||||||
"var v[5] := {1,4,2,3,5}; var r[5] := {1,2,3,4,5}; sort(v,1,3); sum(v == r) == v[]",
|
"var v[5] := {1,4,2,3,5}; var r[5] := {1,2,3,4,5}; sort(v,1,3); sum(v == r) == v[]",
|
||||||
|
"var v[5] := {5,4,2,3,1}; var r[5] := {5,2,3,4,1}; sort(v,1,3); sum(v == r) == v[]",
|
||||||
"var v[5] := {3,1,2,4,5}; var r[5] := {1,2,3,4,5}; sort(v,0,2); sum(v == r) == v[]",
|
"var v[5] := {3,1,2,4,5}; var r[5] := {1,2,3,4,5}; sort(v,0,2); sum(v == r) == v[]",
|
||||||
"var v[5] := {1,2,5,3,4}; var r[5] := {1,2,3,4,5}; sort(v,2,4); sum(v == r) == v[]",
|
"var v[5] := {1,2,5,3,4}; var r[5] := {1,2,3,4,5}; sort(v,2,4); sum(v == r) == v[]",
|
||||||
|
|
||||||
|
@ -6549,12 +6550,18 @@ inline bool run_test18()
|
||||||
"var v[5] := {3,1,2,4,5}; var r[5] := {3,2,1,4,5}; sort(v,'descending',0,2); sum(v == r) == v[]",
|
"var v[5] := {3,1,2,4,5}; var r[5] := {3,2,1,4,5}; sort(v,'descending',0,2); sum(v == r) == v[]",
|
||||||
"var v[5] := {1,2,5,3,4}; var r[5] := {1,2,5,4,3}; sort(v,'descending',2,4); sum(v == r) == v[]",
|
"var v[5] := {1,2,5,3,4}; var r[5] := {1,2,5,4,3}; sort(v,'descending',2,4); sum(v == r) == v[]",
|
||||||
|
|
||||||
" var a := 2; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var r[3] := [0]; r := a*x+y; axpy(a,x,y); sum(y == r) == y[]",
|
"var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 2)); v[v[] / 2] == 5",
|
||||||
" var a := 2; var b := 3; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var r[3] := [0]; r := a*x+b*y; axpby(a,x,b,y); sum(y == r) == y[]",
|
"var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 3)); v[v[] / 3] == 4",
|
||||||
|
|
||||||
" var a := 2; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a*x+y; axpyz(a,x,y,z); sum(z == r) == z[]",
|
"var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 2)); sort(v,0,trunc(v[] / 2)); (v[v[] / 2] == 5) and (v[0] == 1)",
|
||||||
" var a := 2; var b := 3; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a*x+b*y; axpbyz(a,x,b,y,z); sum(z == r) == z[]",
|
"var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 3)); sort(v,0,trunc(v[] / 3)); (v[v[] / 3] == 4) and (v[0] == 1)",
|
||||||
" var a := 2; var b := 3; var x[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a*x+b; axpbz(a,x,b,z); sum(z == r) == z[]",
|
|
||||||
|
" var a := 2; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var r[3] := [0]; r := a * x + y; axpy(a,x,y); sum(y == r) == y[]",
|
||||||
|
" var a := 2; var b := 3; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var r[3] := [0]; r := a * x + b * y; axpby(a,x,b,y); sum(y == r) == y[]",
|
||||||
|
|
||||||
|
" var a := 2; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a * x + y; axpyz(a,x,y,z); sum(z == r) == z[]",
|
||||||
|
" var a := 2; var b := 3; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a * x + b * y; axpbyz(a,x,b,y,z); sum(z == r) == z[]",
|
||||||
|
" var a := 2; var b := 3; var x[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a * x + b; axpbz(a,x,b,z); sum(z == r) == z[]",
|
||||||
};
|
};
|
||||||
|
|
||||||
const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
|
const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
|
||||||
|
|
12
readme.txt
12
readme.txt
|
@ -1301,7 +1301,7 @@ with vectors:
|
||||||
avg, max, min, mul, dot, dotk, sum, sumk, count, all_true,
|
avg, max, min, mul, dot, dotk, sum, sumk, count, all_true,
|
||||||
all_false, any_true, any_false
|
all_false, any_true, any_false
|
||||||
(h) Transformation operations:
|
(h) Transformation operations:
|
||||||
copy, rotate-left/right, shift-left/right, sort
|
copy, rotate-left/right, shift-left/right, sort, nth_element
|
||||||
(i) BLAS-L1:
|
(i) BLAS-L1:
|
||||||
axpy, axpby, axpyz, axpbyz, axpbz
|
axpy, axpby, axpyz, axpbyz, axpbz
|
||||||
|
|
||||||
|
@ -2734,11 +2734,11 @@ file I/O package is made available for the given expression:
|
||||||
(e) count (f) copy
|
(e) count (f) copy
|
||||||
(g) rotate-left (h) rotate-right
|
(g) rotate-left (h) rotate-right
|
||||||
(i) shift-left (j) shift-right
|
(i) shift-left (j) shift-right
|
||||||
(k) sort (l) sumk
|
(k) sort (l) nth_element
|
||||||
(m) axpy (n) axpby
|
(m) sumk (n) axpy
|
||||||
(o) axpyz (p) axpbyz
|
(o) axpby (p) axpyz
|
||||||
(q) axpbz (r) dot
|
(q) axpbyz (r) axpbz
|
||||||
(s) dotk
|
(s) dot (t) dotk
|
||||||
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue