31template <
typename Scalar>
34template <
typename Scalar>
36template <
typename Scalar>
42template <
typename Scalar>
50template <
typename T,
typename... Args>
54 std::forward<Args>(args)...);
60template <
typename Scalar, ExpressionType T>
61struct BinaryMinusExpression;
63template <
typename Scalar, ExpressionType T>
64struct BinaryPlusExpression;
66template <
typename Scalar>
67struct ConstantExpression;
69template <
typename Scalar, ExpressionType T>
72template <
typename Scalar, ExpressionType T>
75template <
typename Scalar, ExpressionType T>
76struct UnaryMinusExpression;
82template <
typename Scalar>
88template <
typename Scalar_>
113 std::array<ExpressionPtr<Scalar>, 2>
args{
nullptr,
nullptr};
127 :
args{
std::move(lhs), nullptr} {}
155 if (lhs->is_constant(
Scalar(0))) {
158 }
else if (rhs->is_constant(
Scalar(0))) {
161 }
else if (lhs->is_constant(
Scalar(1))) {
163 }
else if (rhs->is_constant(
Scalar(1))) {
174 if (rhs->type() ==
LINEAR) {
181 }
else if (rhs->type() ==
CONSTANT) {
182 if (lhs->type() ==
LINEAR) {
189 }
else if (lhs->type() ==
LINEAR && rhs->type() ==
LINEAR) {
205 if (lhs->is_constant(
Scalar(0))) {
208 }
else if (rhs->is_constant(
Scalar(1))) {
219 if (lhs->type() ==
LINEAR) {
240 if (lhs ==
nullptr || lhs->is_constant(
Scalar(0))) {
242 }
else if (rhs ==
nullptr || rhs->is_constant(
Scalar(0))) {
251 auto type = std::max(lhs->type(), rhs->type());
270 return lhs = lhs + rhs;
282 if (lhs->is_constant(
Scalar(0))) {
283 if (rhs->is_constant(
Scalar(0))) {
289 }
else if (rhs->is_constant(
Scalar(0))) {
298 auto type = std::max(lhs->type(), rhs->type());
318 if (lhs->is_constant(
Scalar(0))) {
328 if (lhs->type() ==
LINEAR) {
352 [[maybe_unused]]
Scalar rhs)
const = 0;
363 virtual std::string_view
name()
const = 0;
372 [[maybe_unused]]
Scalar rhs,
373 [[maybe_unused]]
Scalar parent_adjoint)
const {
384 [[maybe_unused]]
Scalar rhs,
385 [[maybe_unused]]
Scalar parent_adjoint)
const {
416template <
typename Scalar>
421template <
typename Scalar>
423template <
typename Scalar>
425template <
typename Scalar>
427template <
typename Scalar>
429template <
typename Scalar>
436template <
typename Scalar, ExpressionType T>
450 std::string_view
name()
const override {
return "binary minus"; }
453 return parent_adjoint;
457 return -parent_adjoint;
463 return parent_adjoint;
469 return -parent_adjoint;
477template <
typename Scalar, ExpressionType T>
491 std::string_view
name()
const override {
return "binary plus"; }
494 return parent_adjoint;
498 return parent_adjoint;
504 return parent_adjoint;
510 return parent_adjoint;
517template <
typename Scalar>
532 std::string_view
name()
const override {
return "cbrt"; }
538 return parent_adjoint / (
Scalar(3) * c * c);
553template <
typename Scalar>
560 if (x->
val == Scalar(0)) {
563 }
else if (x->
val == Scalar(-1) || x->
val == Scalar(1)) {
576template <
typename Scalar>
588 std::string_view
name()
const override {
return "constant"; }
594template <
typename Scalar>
609 std::string_view
name()
const override {
return "decision variable"; }
616template <
typename Scalar, ExpressionType T>
629 std::string_view
name()
const override {
return "division"; }
632 return parent_adjoint / rhs;
636 return parent_adjoint * -lhs / (rhs * rhs);
642 return parent_adjoint / rhs;
648 return parent_adjoint * -lhs / (rhs * rhs);
656template <
typename Scalar, ExpressionType T>
669 std::string_view
name()
const override {
return "multiplication"; }
672 Scalar parent_adjoint)
const override {
673 return parent_adjoint * rhs;
677 Scalar parent_adjoint)
const override {
678 return parent_adjoint * lhs;
685 return parent_adjoint * rhs;
692 return parent_adjoint * lhs;
700template <
typename Scalar, ExpressionType T>
712 std::string_view
name()
const override {
return "unary minus"; }
715 return -parent_adjoint;
721 return -parent_adjoint;
729template <
typename Scalar>
738template <
typename Scalar>
745 stack.emplace_back(expr);
747 while (!stack.empty()) {
748 auto elem = stack.back();
753 if (--elem->ref_count == 0) {
754 if (elem->adjoint_expr !=
nullptr) {
755 stack.emplace_back(elem->adjoint_expr.get());
757 for (
auto&
arg : elem->args) {
758 if (
arg !=
nullptr) {
759 stack.emplace_back(
arg.get());
767 std::allocator_traits<
decltype(alloc)>::deallocate(
777template <
typename Scalar>
792 std::string_view
name()
const override {
return "abs"; }
796 return -parent_adjoint;
797 }
else if (x >
Scalar(0)) {
798 return parent_adjoint;
808 return -parent_adjoint;
809 }
else if (x->val >
Scalar(0)) {
810 return parent_adjoint;
821template <
typename Scalar>
843template <
typename Scalar>
858 std::string_view
name()
const override {
return "acos"; }
862 return -parent_adjoint /
sqrt(
Scalar(1) - x * x);
876template <
typename Scalar>
883 return constant_ptr(Scalar(std::numbers::pi) / Scalar(2));
897template <
typename Scalar>
912 std::string_view
name()
const override {
return "asin"; }
916 return parent_adjoint /
sqrt(
Scalar(1) - x * x);
930template <
typename Scalar>
952template <
typename Scalar>
967 std::string_view
name()
const override {
return "atan"; }
970 return parent_adjoint / (
Scalar(1) + x * x);
984template <
typename Scalar>
1006template <
typename Scalar>
1023 std::string_view
name()
const override {
return "atan2"; }
1026 return parent_adjoint * x / (y * y + x * x);
1030 return parent_adjoint * -y / (y * y + x * x);
1036 return parent_adjoint * x / (y * y + x * x);
1042 return parent_adjoint * -y / (y * y + x * x);
1051template <
typename Scalar>
1062 return constant_ptr(Scalar(std::numbers::pi) / Scalar(2));
1076template <
typename Scalar>
1091 std::string_view
name()
const override {
return "cos"; }
1095 return parent_adjoint * -
sin(x);
1101 return parent_adjoint * -
sin(x);
1109template <
typename Scalar>
1130template <
typename Scalar>
1145 std::string_view
name()
const override {
return "cosh"; }
1149 return parent_adjoint *
sinh(x);
1155 return parent_adjoint *
sinh(x);
1163template <
typename Scalar>
1184template <
typename Scalar>
1199 std::string_view
name()
const override {
return "erf"; }
1203 return parent_adjoint *
Scalar(2.0 * std::numbers::inv_sqrtpi) *
1210 return parent_adjoint *
1219template <
typename Scalar>
1241template <
typename Scalar>
1256 std::string_view
name()
const override {
return "exp"; }
1260 return parent_adjoint *
exp(x);
1266 return parent_adjoint *
exp(x);
1274template <
typename Scalar>
1292template <
typename Scalar>
1299template <
typename Scalar>
1316 std::string_view
name()
const override {
return "hypot"; }
1320 return parent_adjoint * x /
hypot(x, y);
1325 return parent_adjoint * y /
hypot(x, y);
1331 return parent_adjoint * x /
hypot(x, y);
1337 return parent_adjoint * y /
hypot(x, y);
1346template <
typename Scalar>
1370template <
typename Scalar>
1385 std::string_view
name()
const override {
return "log"; }
1388 return parent_adjoint / x;
1394 return parent_adjoint / x;
1402template <
typename Scalar>
1424template <
typename Scalar>
1439 std::string_view
name()
const override {
return "log10"; }
1442 return parent_adjoint / (
Scalar(std::numbers::ln10) * x);
1456template <
typename Scalar>
1475template <
typename Scalar>
1483template <
typename Scalar, ExpressionType T>
1494 return pow(base, power);
1499 std::string_view
name()
const override {
return "pow"; }
1502 Scalar parent_adjoint)
const override {
1504 return parent_adjoint *
pow(base, power -
Scalar(1)) * power;
1508 Scalar parent_adjoint)
const override {
1516 return parent_adjoint *
pow(base, power) *
log(base);
1530 if (base->val ==
Scalar(0)) {
1534 return parent_adjoint *
pow(base, power) *
log(base);
1544template <
typename Scalar>
1583template <
typename Scalar>
1594 }
else if (x ==
Scalar(0)) {
1603 std::string_view
name()
const override {
return "sign"; }
1610template <
typename Scalar>
1616 if (x->
val < Scalar(0)) {
1618 }
else if (x->
val == Scalar(0)) {
1632template <
typename Scalar>
1647 std::string_view
name()
const override {
return "sin"; }
1651 return parent_adjoint *
cos(x);
1657 return parent_adjoint *
cos(x);
1665template <
typename Scalar>
1687template <
typename Scalar>
1702 std::string_view
name()
const override {
return "sinh"; }
1706 return parent_adjoint *
cosh(x);
1712 return parent_adjoint *
cosh(x);
1720template <
typename Scalar>
1742template <
typename Scalar>
1757 std::string_view
name()
const override {
return "sqrt"; }
1761 return parent_adjoint / (
Scalar(2) *
sqrt(x));
1775template <
typename Scalar>
1782 if (x->
val == Scalar(0)) {
1785 }
else if (x->
val == Scalar(1)) {
1798template <
typename Scalar>
1813 std::string_view
name()
const override {
return "tan"; }
1819 return parent_adjoint / (c * c);
1826 return parent_adjoint / (c * c);
1834template <
typename Scalar>
1856template <
typename Scalar>
1871 std::string_view
name()
const override {
return "tanh"; }
1877 return parent_adjoint / (c * c);
1884 return parent_adjoint / (c * c);
1892template <
typename Scalar>
auto arg(const Char *name, const T &arg) -> detail::named_arg< Char, T >
Returns a named argument to be used in a formatting function.
Definition base.h:2846
sign
Definition base.h:689
A custom intrusive shared pointer implementation without thread synchronization overhead.
Definition intrusive_shared_ptr.hpp:27
wpi::util::SmallVector< T > small_vector
Definition small_vector.hpp:10
Definition expression_graph.hpp:11
ExpressionPtr< Scalar > cosh(const ExpressionPtr< Scalar > &x)
cosh() for Expressions.
Definition expression.hpp:1164
constexpr void inc_ref_count(Expression< Scalar > *expr)
Refcount increment for intrusive shared pointer.
Definition expression.hpp:730
ExpressionPtr< Scalar > cos(const ExpressionPtr< Scalar > &x)
cos() for Expressions.
Definition expression.hpp:1110
ExpressionPtr< Scalar > cbrt(const ExpressionPtr< Scalar > &x)
cbrt() for Expressions.
Definition expression.hpp:554
ExpressionPtr< Scalar > sin(const ExpressionPtr< Scalar > &x)
sin() for Expressions.
Definition expression.hpp:1666
ExpressionPtr< Scalar > hypot(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &y)
hypot() for Expressions.
Definition expression.hpp:1347
ExpressionPtr< Scalar > pow(const ExpressionPtr< Scalar > &base, const ExpressionPtr< Scalar > &power)
pow() for Expressions.
Definition expression.hpp:1545
ExpressionPtr< Scalar > sqrt(const ExpressionPtr< Scalar > &x)
sqrt() for Expressions.
Definition expression.hpp:1776
ExpressionPtr< Scalar > sinh(const ExpressionPtr< Scalar > &x)
sinh() for Expressions.
Definition expression.hpp:1721
ExpressionPtr< Scalar > erf(const ExpressionPtr< Scalar > &x)
erf() for Expressions.
Definition expression.hpp:1220
ExpressionPtr< Scalar > tan(const ExpressionPtr< Scalar > &x)
tan() for Expressions.
Definition expression.hpp:1835
ExpressionPtr< Scalar > constant_ptr(Scalar value)
Creates an intrusive shared pointer to a constant expression.
Definition expression.hpp:417
ExpressionPtr< Scalar > abs(const ExpressionPtr< Scalar > &x)
abs() for Expressions.
Definition expression.hpp:822
ExpressionPtr< Scalar > tanh(const ExpressionPtr< Scalar > &x)
tanh() for Expressions.
Definition expression.hpp:1893
constexpr bool USE_POOL_ALLOCATOR
Definition expression.hpp:28
ExpressionPtr< Scalar > exp(const ExpressionPtr< Scalar > &x)
exp() for Expressions.
Definition expression.hpp:1275
ExpressionPtr< Scalar > asin(const ExpressionPtr< Scalar > &x)
asin() for Expressions.
Definition expression.hpp:931
ExpressionPtr< Scalar > log(const ExpressionPtr< Scalar > &x)
log() for Expressions.
Definition expression.hpp:1403
void dec_ref_count(Expression< Scalar > *expr)
Refcount decrement for intrusive shared pointer.
Definition expression.hpp:739
ExpressionPtr< Scalar > acos(const ExpressionPtr< Scalar > &x)
acos() for Expressions.
Definition expression.hpp:877
ExpressionPtr< Scalar > atan(const ExpressionPtr< Scalar > &x)
atan() for Expressions.
Definition expression.hpp:985
IntrusiveSharedPtr< Expression< Scalar > > ExpressionPtr
Typedef for intrusive shared pointer to Expression.
Definition expression.hpp:43
ExpressionPtr< Scalar > atan2(const ExpressionPtr< Scalar > &y, const ExpressionPtr< Scalar > &x)
atan2() for Expressions.
Definition expression.hpp:1052
static ExpressionPtr< typename T::Scalar > make_expression_ptr(Args &&... args)
Creates an intrusive shared pointer to an expression from the global pool allocator.
Definition expression.hpp:51
ExpressionPtr< Scalar > log10(const ExpressionPtr< Scalar > &x)
log10() for Expressions.
Definition expression.hpp:1457
IntrusiveSharedPtr< T > make_intrusive_shared(Args &&... args)
Constructs an object of type T and wraps it in an intrusive shared pointer using args as the paramete...
Definition intrusive_shared_ptr.hpp:260
ExpressionType
Expression type.
Definition expression_type.hpp:16
@ CONSTANT
The expression is a constant.
Definition expression_type.hpp:20
@ QUADRATIC
The expression is composed of quadratic and lower-order operators.
Definition expression_type.hpp:24
@ LINEAR
The expression is composed of linear and lower-order operators.
Definition expression_type.hpp:22
@ NONLINEAR
The expression is composed of nonlinear and lower-order operators.
Definition expression_type.hpp:26
PoolAllocator< T > global_pool_allocator()
Returns an allocator for a global pool memory resource.
Definition pool.hpp:155
IntrusiveSharedPtr< T > allocate_intrusive_shared(Alloc alloc, Args &&... args)
Constructs an object of type T and wraps it in an intrusive shared pointer using alloc as the storage...
Definition intrusive_shared_ptr.hpp:274
Definition StringMap.hpp:773
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:792
constexpr AbsExpression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:782
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:790
Scalar grad_l(Scalar x, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:794
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:804
Scalar value(Scalar x, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:785
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:865
Scalar value(Scalar x, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:851
constexpr AcosExpression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:848
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:856
Scalar grad_l(Scalar x, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:860
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:858
Scalar grad_l(Scalar x, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:914
Scalar value(Scalar x, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:905
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:912
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:919
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:910
constexpr AsinExpression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:902
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &y, const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:1033
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:1023
Scalar value(Scalar y, Scalar x) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:1016
constexpr Atan2Expression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Constructs a binary expression (an operator with two arguments).
Definition expression.hpp:1012
Scalar grad_r(Scalar y, Scalar x, Scalar parent_adjoint) const override
Returns ∂/∂r as a Scalar.
Definition expression.hpp:1029
ExpressionPtr< Scalar > grad_expr_r(const ExpressionPtr< Scalar > &y, const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂r as an Expression.
Definition expression.hpp:1039
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:1021
Scalar grad_l(Scalar y, Scalar x, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:1025
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:967
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:973
constexpr AtanExpression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:957
Scalar value(Scalar x, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:960
Scalar grad_l(Scalar x, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:969
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:965
constexpr BinaryMinusExpression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Constructs a binary expression (an operator with two arguments).
Definition expression.hpp:442
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:460
ExpressionPtr< Scalar > grad_expr_r(const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂r as an Expression.
Definition expression.hpp:466
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:450
Scalar grad_r(Scalar, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂r as a Scalar.
Definition expression.hpp:456
Scalar value(Scalar lhs, Scalar rhs) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:446
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:448
Scalar grad_l(Scalar, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:452
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:501
Scalar value(Scalar lhs, Scalar rhs) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:487
ExpressionPtr< Scalar > grad_expr_r(const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂r as an Expression.
Definition expression.hpp:507
constexpr BinaryPlusExpression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Constructs a binary expression (an operator with two arguments).
Definition expression.hpp:483
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:489
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:491
Scalar grad_r(Scalar, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂r as a Scalar.
Definition expression.hpp:497
Scalar grad_l(Scalar, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:493
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:532
constexpr CbrtExpression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:522
Scalar grad_l(Scalar x, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:534
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:541
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:530
Scalar value(Scalar x, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:525
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:586
Scalar value(Scalar, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:584
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:588
constexpr ConstantExpression(Scalar value)
Constructs a nullary expression (an operator with no arguments).
Definition expression.hpp:581
Scalar value(Scalar x, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:1084
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:1089
constexpr CosExpression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:1081
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:1091
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:1098
Scalar grad_l(Scalar x, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:1093
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:1143
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:1145
Scalar value(Scalar x, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:1138
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:1152
constexpr CoshExpression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:1135
Scalar grad_l(Scalar x, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:1147
constexpr DecisionVariableExpression()=default
Constructs a decision variable expression with a value of zero.
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:609
Scalar value(Scalar, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:605
constexpr DecisionVariableExpression(Scalar value)
Constructs a nullary expression (an operator with no arguments).
Definition expression.hpp:602
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:607
constexpr DivExpression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Constructs a binary expression (an operator with two arguments).
Definition expression.hpp:622
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:627
Scalar grad_r(Scalar lhs, Scalar rhs, Scalar parent_adjoint) const override
Returns ∂/∂r as a Scalar.
Definition expression.hpp:635
ExpressionPtr< Scalar > grad_expr_r(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂r as an Expression.
Definition expression.hpp:645
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:629
Scalar grad_l(Scalar, Scalar rhs, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:631
Scalar value(Scalar lhs, Scalar rhs) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:625
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &rhs, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:639
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:1199
constexpr ErfExpression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:1189
Scalar grad_l(Scalar x, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:1201
Scalar value(Scalar x, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:1192
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:1207
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:1197
Scalar grad_l(Scalar x, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:1258
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:1256
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:1254
constexpr ExpExpression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:1246
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:1263
Scalar value(Scalar x, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:1249
An autodiff expression node.
Definition expression.hpp:89
Scalar val
The value of the expression node.
Definition expression.hpp:94
friend ExpressionPtr< Scalar > operator-(const ExpressionPtr< Scalar > &lhs)
Unary minus operator.
Definition expression.hpp:314
int32_t col
This expression's column in a Jacobian, or -1 otherwise.
Definition expression.hpp:103
virtual Scalar grad_r(Scalar lhs, Scalar rhs, Scalar parent_adjoint) const
Returns ∂/∂r as a Scalar.
Definition expression.hpp:383
std::array< ExpressionPtr< Scalar >, 2 > args
Expression arguments.
Definition expression.hpp:113
uint32_t ref_count
Reference count for intrusive shared pointer.
Definition expression.hpp:110
constexpr Expression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:126
virtual ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs, const ExpressionPtr< Scalar > &parent_adjoint) const
Returns ∂/∂l as an Expression.
Definition expression.hpp:395
virtual ExpressionPtr< Scalar > grad_expr_r(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs, const ExpressionPtr< Scalar > &parent_adjoint) const
Returns ∂/∂r as an Expression.
Definition expression.hpp:408
Scalar adjoint
The adjoint of the expression node, used during autodiff.
Definition expression.hpp:97
friend ExpressionPtr< Scalar > operator+(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs)
Expression-Expression addition operator.
Definition expression.hpp:235
constexpr bool is_constant(Scalar constant) const
Returns true if the expression is the given constant.
Definition expression.hpp:142
constexpr Expression()=default
Constructs a constant expression with a value of zero.
constexpr Expression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Constructs a binary expression (an operator with two arguments).
Definition expression.hpp:133
ExpressionPtr< Scalar > adjoint_expr
The adjoint of the expression node, used during gradient expression tree generation.
Definition expression.hpp:107
Scalar_ Scalar
Scalar type alias.
Definition expression.hpp:91
virtual ExpressionType type() const =0
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
friend ExpressionPtr< Scalar > operator/(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs)
Expression-Expression division operator.
Definition expression.hpp:200
uint32_t incoming_edges
Counts incoming edges for this node.
Definition expression.hpp:100
friend ExpressionPtr< Scalar > operator-(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs)
Expression-Expression subtraction operator.
Definition expression.hpp:277
friend ExpressionPtr< Scalar > operator*(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs)
Expression-Expression multiplication operator.
Definition expression.hpp:150
virtual ~Expression()=default
virtual Scalar value(Scalar lhs, Scalar rhs) const =0
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
virtual std::string_view name() const =0
Returns the name of this expression.
virtual Scalar grad_l(Scalar lhs, Scalar rhs, Scalar parent_adjoint) const
Returns ∂/∂l as a Scalar.
Definition expression.hpp:371
friend ExpressionPtr< Scalar > operator+=(ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs)
Expression-Expression compound addition operator.
Definition expression.hpp:268
constexpr Expression(Scalar value)
Constructs a nullary expression (an operator with no arguments).
Definition expression.hpp:121
friend ExpressionPtr< Scalar > operator+(const ExpressionPtr< Scalar > &lhs)
Unary plus operator.
Definition expression.hpp:340
constexpr HypotExpression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Constructs a binary expression (an operator with two arguments).
Definition expression.hpp:1305
ExpressionPtr< Scalar > grad_expr_r(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &y, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂r as an Expression.
Definition expression.hpp:1334
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:1314
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &y, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:1328
Scalar grad_l(Scalar x, Scalar y, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:1318
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:1316
Scalar value(Scalar x, Scalar y) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:1309
Scalar grad_r(Scalar x, Scalar y, Scalar parent_adjoint) const override
Returns ∂/∂r as a Scalar.
Definition expression.hpp:1323
Scalar value(Scalar x, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:1432
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:1439
constexpr Log10Expression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:1429
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:1437
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:1445
Scalar grad_l(Scalar x, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:1441
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:1391
Scalar grad_l(Scalar x, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:1387
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:1383
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:1385
constexpr LogExpression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:1375
Scalar value(Scalar x, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:1378
Scalar value(Scalar lhs, Scalar rhs) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:665
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:681
Scalar grad_l(Scalar lhs, Scalar rhs, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:671
constexpr MultExpression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Constructs a binary expression (an operator with two arguments).
Definition expression.hpp:662
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:667
Scalar grad_r(Scalar lhs, Scalar rhs, Scalar parent_adjoint) const override
Returns ∂/∂r as a Scalar.
Definition expression.hpp:676
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:669
ExpressionPtr< Scalar > grad_expr_r(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂r as an Expression.
Definition expression.hpp:688
Scalar value(Scalar base, Scalar power) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:1492
Scalar grad_l(Scalar base, Scalar power, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:1501
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:1497
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &base, const ExpressionPtr< Scalar > &power, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:1520
Scalar grad_r(Scalar base, Scalar power, Scalar parent_adjoint) const override
Returns ∂/∂r as a Scalar.
Definition expression.hpp:1507
ExpressionPtr< Scalar > grad_expr_r(const ExpressionPtr< Scalar > &base, const ExpressionPtr< Scalar > &power, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂r as an Expression.
Definition expression.hpp:1526
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:1499
constexpr PowExpression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Constructs a binary expression (an operator with two arguments).
Definition expression.hpp:1489
constexpr SignExpression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:1588
Scalar value(Scalar x, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:1591
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:1601
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:1603
Scalar grad_l(Scalar x, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:1649
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:1654
Scalar value(Scalar x, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:1640
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:1647
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:1645
constexpr SinExpression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:1637
Scalar grad_l(Scalar x, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:1704
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:1702
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:1700
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:1709
constexpr SinhExpression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:1692
Scalar value(Scalar x, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:1695
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:1755
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:1757
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:1764
constexpr SqrtExpression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:1747
Scalar grad_l(Scalar x, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:1759
Scalar value(Scalar x, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:1750
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:1822
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:1813
constexpr TanExpression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:1803
Scalar grad_l(Scalar x, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:1815
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:1811
Scalar value(Scalar x, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:1806
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:1869
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:1871
Scalar grad_l(Scalar x, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:1873
Scalar value(Scalar x, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:1864
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:1880
constexpr TanhExpression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:1861
constexpr UnaryMinusExpression(ExpressionPtr< Scalar > lhs)
Constructs an unary expression (an operator with one argument).
Definition expression.hpp:705
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &parent_adjoint) const override
Returns ∂/∂l as an Expression.
Definition expression.hpp:718
Scalar grad_l(Scalar, Scalar, Scalar parent_adjoint) const override
Returns ∂/∂l as a Scalar.
Definition expression.hpp:714
ExpressionType type() const override
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition expression.hpp:710
Scalar value(Scalar lhs, Scalar) const override
Either nullary operator with no arguments, unary operator with one argument, or binary operator with ...
Definition expression.hpp:708
std::string_view name() const override
Returns the name of this expression.
Definition expression.hpp:712