70 [[nodiscard]]
constexpr value_type eval(std::span<value_type const> args)
const {
73 if constexpr (std::is_same_v<Tag, ExpTag>)
return std::exp(c_val);
74 else if constexpr (std::is_same_v<Tag, LogTag>)
return std::log(c_val);
75 else if constexpr (std::is_same_v<Tag, SinTag>)
return std::sin(c_val);
76 else if constexpr (std::is_same_v<Tag, CosTag>)
return std::cos(c_val);
77 else if constexpr (std::is_same_v<Tag, SqrtTag>)
return std::sqrt(c_val);
78 else if constexpr (std::is_same_v<Tag, AbsTag>)
return std::abs(c_val);
79 else if constexpr (std::is_same_v<Tag, TanTag>)
return std::tan(c_val);
80 else if constexpr (std::is_same_v<Tag, SinhTag>)
return std::sinh(c_val);
81 else if constexpr (std::is_same_v<Tag, CoshTag>)
return std::cosh(c_val);
82 else if constexpr (std::is_same_v<Tag, TanhTag>)
return std::tanh(c_val);
83 else if constexpr (std::is_same_v<Tag, AsinTag>)
return std::asin(c_val);
84 else if constexpr (std::is_same_v<Tag, AcosTag>)
return std::acos(c_val);
85 else if constexpr (std::is_same_v<Tag, AtanTag>)
return std::atan(c_val);
86 else if constexpr (std::is_same_v<Tag, AsinhTag>)
return std::asinh(c_val);
87 else if constexpr (std::is_same_v<Tag, AcoshTag>)
return std::acosh(c_val);
88 else if constexpr (std::is_same_v<Tag, AtanhTag>)
return std::atanh(c_val);
99 auto dc =
child.template derivative<Dim>();
101 if constexpr (std::is_same_v<Tag, ExpTag>) {
104 }
else if constexpr (std::is_same_v<Tag, LogTag>) {
107 }
else if constexpr (std::is_same_v<Tag, SinTag>) {
110 }
else if constexpr (std::is_same_v<Tag, CosTag>) {
113 }
else if constexpr (std::is_same_v<Tag, SqrtTag>) {
117 }
else if constexpr (std::is_same_v<Tag, AbsTag>) {
120 }
else if constexpr (std::is_same_v<Tag, TanTag>) {
124 }
else if constexpr (std::is_same_v<Tag, SinhTag>) {
127 }
else if constexpr (std::is_same_v<Tag, CoshTag>) {
130 }
else if constexpr (std::is_same_v<Tag, TanhTag>) {
132 auto tanh_child = *
this;
134 }
else if constexpr (std::is_same_v<Tag, AsinTag>) {
138 return (one / denom) * dc;
139 }
else if constexpr (std::is_same_v<Tag, AcosTag>) {
143 return -(one / denom) * dc;
144 }
else if constexpr (std::is_same_v<Tag, AtanTag>) {
148 }
else if constexpr (std::is_same_v<Tag, AsinhTag>) {
152 return (one / denom) * dc;
153 }
else if constexpr (std::is_same_v<Tag, AcoshTag>) {
157 return (one / denom) * dc;
158 }
else if constexpr (std::is_same_v<Tag, AtanhTag>) {