12template<
typename Op,
typename E>
struct Unary;
15template<
typename E>
inline constexpr bool is_negation_v<Unary<Neg, E>> =
true;
23template<
typename Op,
typename E>
29 static constexpr std::size_t
arity_v = E::arity_v;
35 [[nodiscard]]
constexpr value_type eval(std::span<value_type const> args)
const {
36 if constexpr (std::is_same_v<Op, Neg>) {
37 return -
child.eval(args);
41 [[nodiscard]] [[deprecated(
"use eval() instead")]]
47 template<std::
size_t Dim>
49 if constexpr (std::is_same_v<Op, Neg>) {
50 return -
child.template derivative<Dim>();
55 if constexpr (std::is_same_v<Op, Neg>) {
56 return "(- " +
child.to_string() +
")";
63 requires is_expr_node_v<E>
65 if constexpr (is_zero_v<E>) {
67 }
else if constexpr (is_negation_v<E>) {
76 requires is_expr_node_v<E>
Expression layer for composable calculus.
typename negation_inner< E >::type negation_inner_t
constexpr auto operator-(L l, R r)
constexpr bool is_negation_v
constexpr auto operator+(L l, R r)
constexpr value_type eval(std::span< value_type const > args) const
std::string to_string() const
constexpr value_type evaluate(std::span< value_type const > args) const
constexpr auto derivative() const
constexpr Unary(E c) noexcept
typename E::value_type value_type
static constexpr std::size_t arity_v