13template<
typename Cond,
typename Then,
typename Else>
21 std::max({Cond::arity_v, Then::arity_v, Else::arity_v});
30 [[nodiscard]]
constexpr value_type eval(std::span<value_type const> args)
const {
38 [[nodiscard]] [[deprecated(
"use eval() instead")]]
44 template<std::
size_t Dim>
52 return "(if " +
condition.to_string() +
" "
61template<
typename C,
typename T,
typename E>
69template<
typename C,
typename T,
typename E>
70 requires (is_expr_node_v<C> && is_expr_node_v<T> && is_expr_node_v<E>)
71[[nodiscard]]
constexpr auto if_then_else(C cond, T then_expr, E else_expr) {
75template<
typename C,
typename T>
76 requires (is_expr_node_v<C> && std::is_arithmetic_v<T>)
77[[nodiscard]]
constexpr auto if_then_else(C cond, T then_val, T else_val) {
78 using VT =
typename C::value_type;
90 requires is_expr_node_v<E>
92 using T =
typename E::value_type;
98 requires is_expr_node_v<E>
99[[nodiscard]]
constexpr auto ramp(E e) {
100 using T =
typename E::value_type;
106 requires is_expr_node_v<E>
107[[nodiscard]]
constexpr auto sign(E e) {
108 using T =
typename E::value_type;
114template<
typename E,
typename T>
115 requires (is_expr_node_v<E> && std::is_arithmetic_v<T>)
116[[nodiscard]]
constexpr auto clamp(E e, T lo, T hi) {
117 using VT =
typename E::value_type;
118 auto lo_const =
Const<VT>{
static_cast<VT
>(lo)};
119 auto hi_const =
Const<VT>{
static_cast<VT
>(hi)};
120 auto upper_clamped =
if_then_else(hi_const - e, e, hi_const);
121 return if_then_else(e - lo_const, upper_clamped, lo_const);
126 requires is_expr_node_v<E>
Expression layer for composable calculus.
constexpr auto heaviside(E e)
constexpr auto indicator(E e)
constexpr bool is_conditional_v
constexpr auto clamp(E e, T lo, T hi)
constexpr auto if_then_else(C cond, T then_expr, E else_expr)
constexpr Conditional(Cond c, Then t, Else e) noexcept
typename Then::value_type value_type
constexpr value_type evaluate(std::span< value_type const > args) const
static constexpr std::size_t arity_v
constexpr value_type eval(std::span< value_type const > args) const
constexpr auto derivative() const
std::string to_string() const