C++ Mathematical Expression Library (ExprTk) https://www.partow.net/programming/exprtk/index.html
This commit is contained in:
parent
365ddd29d6
commit
5a512341d9
53
exprtk.hpp
53
exprtk.hpp
|
@ -36479,6 +36479,56 @@ namespace exprtk
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class axpbz : 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();
|
||||||
|
|
||||||
|
axpbz()
|
||||||
|
: exprtk::igeneric_function<T>("TVTV|TVTVTT")
|
||||||
|
/*
|
||||||
|
z <- ax + b
|
||||||
|
Overloads:
|
||||||
|
0. TVTV - a, x(vector), b, z(vector)
|
||||||
|
1. TVTVTT - a, x(vector), b, z(vector), r0, r1
|
||||||
|
*/
|
||||||
|
{}
|
||||||
|
|
||||||
|
inline T operator()(const std::size_t& ps_index, parameter_list_t parameters)
|
||||||
|
{
|
||||||
|
vector_t x(parameters[1]);
|
||||||
|
vector_t z(parameters[3]);
|
||||||
|
|
||||||
|
std::size_t r0 = 0;
|
||||||
|
std::size_t r1 = x.size() - 1;
|
||||||
|
|
||||||
|
if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,4,5))
|
||||||
|
return std::numeric_limits<T>::quiet_NaN();
|
||||||
|
else if (details::invalid_range(x,r0,r1))
|
||||||
|
return std::numeric_limits<T>::quiet_NaN();
|
||||||
|
else if (details::invalid_range(z,r0,r1))
|
||||||
|
return std::numeric_limits<T>::quiet_NaN();
|
||||||
|
|
||||||
|
const T a = scalar_t(parameters[0])();
|
||||||
|
const T b = scalar_t(parameters[2])();
|
||||||
|
|
||||||
|
for (std::size_t i = r0; i <= r1; ++i)
|
||||||
|
{
|
||||||
|
z[i] = a * x[i] + b;
|
||||||
|
}
|
||||||
|
|
||||||
|
return T(1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class dot : public exprtk::igeneric_function<T>
|
class dot : public exprtk::igeneric_function<T>
|
||||||
{
|
{
|
||||||
|
@ -36595,6 +36645,7 @@ namespace exprtk
|
||||||
axpby <T> b1_axpby;
|
axpby <T> b1_axpby;
|
||||||
axpyz <T> b1_axpyz;
|
axpyz <T> b1_axpyz;
|
||||||
axpbyz <T> b1_axpbyz;
|
axpbyz <T> b1_axpbyz;
|
||||||
|
axpbz <T> b1_axpbz;
|
||||||
dot <T> dt;
|
dot <T> dt;
|
||||||
dotk <T> dtk;
|
dotk <T> dtk;
|
||||||
|
|
||||||
|
@ -36636,6 +36687,8 @@ namespace exprtk
|
||||||
return false;
|
return false;
|
||||||
else if (!symtab.add_function("axpbyz",b1_axpbyz))
|
else if (!symtab.add_function("axpbyz",b1_axpbyz))
|
||||||
return false;
|
return false;
|
||||||
|
else if (!symtab.add_function("axpbz" ,b1_axpbz))
|
||||||
|
return false;
|
||||||
else if (!symtab.add_function("dot" ,dt))
|
else if (!symtab.add_function("dot" ,dt))
|
||||||
return false;
|
return false;
|
||||||
else if (!symtab.add_function("dotk" ,dtk))
|
else if (!symtab.add_function("dotk" ,dtk))
|
||||||
|
|
|
@ -6536,12 +6536,14 @@ inline bool run_test18()
|
||||||
"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[]",
|
||||||
|
|
||||||
"var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
|
"var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
|
||||||
|
"var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v,'aScEnDiNg'); sum(v == r) == v[]",
|
||||||
"var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
|
"var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
|
||||||
"var v[5] := {1,4,2,3,5}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',1,3); sum(v == r) == v[]",
|
"var v[5] := {1,4,2,3,5}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',1,3); sum(v == r) == v[]",
|
||||||
"var v[5] := {3,1,2,4,5}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',0,2); sum(v == r) == v[]",
|
"var v[5] := {3,1,2,4,5}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',0,2); sum(v == r) == v[]",
|
||||||
"var v[5] := {1,2,5,3,4}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',2,4); sum(v == r) == v[]",
|
"var v[5] := {1,2,5,3,4}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',2,4); sum(v == r) == v[]",
|
||||||
|
|
||||||
"var v[5] := {1,3,5,2,4}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
|
"var v[5] := {1,3,5,2,4}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
|
||||||
|
"var v[5] := {1,3,5,2,4}; var r[5] := {5,4,3,2,1}; sort(v,'DeScEnDiNg'); sum(v == r) == v[]",
|
||||||
"var v[5] := {5,4,3,2,1}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
|
"var v[5] := {5,4,3,2,1}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
|
||||||
"var v[5] := {1,4,2,3,5}; var r[5] := {1,4,3,2,5}; sort(v,'descending',1,3); sum(v == r) == v[]",
|
"var v[5] := {1,4,2,3,5}; var r[5] := {1,4,3,2,5}; sort(v,'descending',1,3); 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] := {3,1,2,4,5}; var r[5] := {3,2,1,4,5}; sort(v,'descending',0,2); sum(v == r) == v[]",
|
||||||
|
@ -6552,6 +6554,7 @@ inline bool run_test18()
|
||||||
|
|
||||||
" 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 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 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);
|
||||||
|
|
Loading…
Reference in New Issue