14template<std::
size_t Dim,
typename E>
15 requires is_expr_node_v<E>
17 return expr.template derivative<Dim>();
32 std::function<T(std::span<T const>)>
eval_fn;
38 requires is_expr_node_v<E>
40 :
eval_fn([expr](std::span<T const> args) {
return expr.eval(args); })
44 [[nodiscard]] T
eval(std::span<T const> args)
const {
49 [[nodiscard]] [[deprecated(
"use eval() instead")]]
64template<
typename E, std::size_t... Is>
66 using T =
typename E::value_type;
70 [](E e) {
return AnyExpr<T>{e.template derivative<Is>()}; }...
73 if (dim >=
sizeof...(Is)) {
77 return funcs[dim](expr);
86 requires is_expr_node_v<E>
95template<
typename E, std::size_t... Is>
97 return std::make_tuple(expr.template derivative<Is>()...);
103 requires is_expr_node_v<E>
110template<std::size_t Dim, std::size_t... Dims,
typename E>
111 requires is_expr_node_v<E>
113 if constexpr (
sizeof...(Dims) == 0) {
114 return expr.template derivative<Dim>();
116 return derivative_n<Dims...>(expr.template derivative<Dim>());
auto derivative_dispatch_impl(E expr, std::size_t dim, std::index_sequence< Is... >)
constexpr auto gradient_impl(E expr, std::index_sequence< Is... >)
Expression layer for composable calculus.
constexpr auto derivative_n(E expr)
constexpr auto derivative(E expr)
constexpr auto gradient(E expr)
static constexpr std::size_t arity_v
T evaluate(std::span< T const > args) const
std::function< T(std::span< T const >)> eval_fn
T eval(std::span< T const > args) const
std::string to_string() const
std::function< std::string()> to_string_fn