15#include <gch/small_vector.hpp>
17#include "sleipnir/autodiff/expression_type.hpp"
18#include "sleipnir/util/intrusive_shared_ptr.hpp"
19#include "sleipnir/util/pool.hpp"
21namespace slp::detail {
26inline constexpr bool USE_POOL_ALLOCATOR =
false;
28inline constexpr bool USE_POOL_ALLOCATOR =
true;
31template <
typename Scalar>
34template <
typename Scalar>
35constexpr void inc_ref_count(Expression<Scalar>* expr);
36template <
typename Scalar>
37constexpr void dec_ref_count(Expression<Scalar>* expr);
42template <
typename Scalar>
43using ExpressionPtr = IntrusiveSharedPtr<Expression<Scalar>>;
50template <
typename T,
typename... Args>
51static ExpressionPtr<typename T::Scalar> make_expression_ptr(Args&&... args) {
52 if constexpr (USE_POOL_ALLOCATOR) {
53 return allocate_intrusive_shared<T>(global_pool_allocator<T>(),
54 std::forward<Args>(args)...);
56 return make_intrusive_shared<T>(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>
83ExpressionPtr<Scalar> constant_ptr(Scalar value);
88template <
typename Scalar_>
104 std::array<ExpressionPtr<Scalar>, 2>
args{
nullptr,
nullptr};
148 return type() == ExpressionType::CONSTANT &&
val == constant;
157 using enum ExpressionType;
163 }
else if (
rhs->is_constant(
Scalar(0))) {
166 }
else if (
lhs->is_constant(
Scalar(1))) {
169 }
else if (
rhs->is_constant(
Scalar(1))) {
175 if (
lhs->type() == CONSTANT &&
rhs->type() == CONSTANT) {
176 return constant_ptr(
lhs->val *
rhs->val);
180 if (
lhs->type() == CONSTANT) {
181 if (
rhs->type() == LINEAR) {
183 }
else if (
rhs->type() == QUADRATIC) {
188 }
else if (
rhs->type() == CONSTANT) {
189 if (
lhs->type() == LINEAR) {
191 }
else if (
lhs->type() == QUADRATIC) {
196 }
else if (
lhs->type() == LINEAR &&
rhs->type() == LINEAR) {
209 using enum ExpressionType;
215 }
else if (
rhs->is_constant(
Scalar(1))) {
221 if (
lhs->type() == CONSTANT &&
rhs->type() == CONSTANT) {
222 return constant_ptr(
lhs->val /
rhs->val);
226 if (
rhs->type() == CONSTANT) {
227 if (
lhs->type() == LINEAR) {
229 }
else if (
lhs->type() == QUADRATIC) {
245 using enum ExpressionType;
252 }
else if (
rhs ==
nullptr ||
rhs->is_constant(
Scalar(0))) {
258 if (
lhs->type() == CONSTANT &&
rhs->type() == CONSTANT) {
259 return constant_ptr(
lhs->val +
rhs->val);
262 auto type = std::max(
lhs->type(),
rhs->type());
263 if (
type == LINEAR) {
266 }
else if (
type == QUADRATIC) {
290 using enum ExpressionType;
301 }
else if (
rhs->is_constant(
Scalar(0))) {
307 if (
lhs->type() == CONSTANT &&
rhs->type() == CONSTANT) {
308 return constant_ptr(
lhs->val -
rhs->val);
311 auto type = std::max(
lhs->type(),
rhs->type());
312 if (
type == LINEAR) {
315 }
else if (
type == QUADRATIC) {
328 using enum ExpressionType;
337 if (
lhs->type() == CONSTANT) {
338 return constant_ptr(-
lhs->val);
341 if (
lhs->type() == LINEAR) {
343 }
else if (
lhs->type() == QUADRATIC) {
371 virtual ExpressionType
type()
const = 0;
376 virtual std::string_view
name()
const = 0;
406 return constant_ptr(
Scalar(0));
417 return constant_ptr(
Scalar(0));
421template <
typename Scalar>
426template <
typename Scalar>
427ExpressionPtr<Scalar> cbrt(
const ExpressionPtr<Scalar>& x);
428template <
typename Scalar>
429ExpressionPtr<Scalar> exp(
const ExpressionPtr<Scalar>& x);
430template <
typename Scalar>
431ExpressionPtr<Scalar> sign(
const ExpressionPtr<Scalar>& x);
432template <
typename Scalar>
433ExpressionPtr<Scalar> sin(
const ExpressionPtr<Scalar>& x);
434template <
typename Scalar>
435ExpressionPtr<Scalar> sinh(
const ExpressionPtr<Scalar>& x);
436template <
typename Scalar>
437ExpressionPtr<Scalar> sqrt(
const ExpressionPtr<Scalar>& x);
443template <
typename Scalar, ExpressionType T>
455 ExpressionType
type()
const override {
return T; }
457 std::string_view
name()
const override {
return "binary minus"; }
480template <
typename Scalar, ExpressionType T>
492 ExpressionType
type()
const override {
return T; }
494 std::string_view
name()
const override {
return "binary plus"; }
516template <
typename Scalar>
529 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
531 std::string_view
name()
const override {
return "cbrt"; }
552template <
typename Scalar>
554 using enum ExpressionType;
558 if (x->type() == CONSTANT) {
559 if (x->val == Scalar(0)) {
562 }
else if (x->val == Scalar(-1) || x->val == Scalar(1)) {
565 return constant_ptr(cbrt(x->val));
569 return make_expression_ptr<CbrtExpression<Scalar>>(x);
575template <
typename Scalar>
585 ExpressionType
type()
const override {
return ExpressionType::CONSTANT; }
587 std::string_view
name()
const override {
return "constant"; }
593template <
typename Scalar>
606 ExpressionType
type()
const override {
return ExpressionType::LINEAR; }
608 std::string_view
name()
const override {
return "decision variable"; }
615template <
typename Scalar, ExpressionType T>
626 ExpressionType
type()
const override {
return T; }
628 std::string_view
name()
const override {
return "division"; }
653template <
typename Scalar, ExpressionType T>
664 ExpressionType
type()
const override {
return T; }
666 std::string_view
name()
const override {
return "multiplication"; }
669 return this->
adj * rhs;
673 return this->
adj * lhs;
693template <
typename Scalar, ExpressionType T>
703 ExpressionType
type()
const override {
return T; }
705 std::string_view
name()
const override {
return "unary minus"; }
720template <
typename Scalar>
729template <
typename Scalar>
730constexpr void dec_ref_count(Expression<Scalar>* expr) {
735 gch::small_vector<Expression<Scalar>*> stack;
736 stack.emplace_back(expr);
738 while (!stack.empty()) {
739 auto elem = stack.back();
744 if (--elem->ref_count == 0) {
745 if (elem->adj_expr !=
nullptr) {
746 stack.emplace_back(elem->adj_expr.get());
748 for (
auto& arg : elem->args) {
749 if (arg !=
nullptr) {
750 stack.emplace_back(arg.get());
756 if constexpr (USE_POOL_ALLOCATOR) {
757 auto alloc = global_pool_allocator<Expression<Scalar>>();
758 std::allocator_traits<
decltype(alloc)>::deallocate(
759 alloc, elem,
sizeof(Expression<Scalar>));
761 operator delete(elem);
770template <
typename Scalar>
783 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
785 std::string_view
name()
const override {
return "abs"; }
790 }
else if (x >
Scalar(0)) {
808template <
typename Scalar>
810 using enum ExpressionType;
814 if (x->is_constant(Scalar(0))) {
820 if (x->type() == CONSTANT) {
821 return constant_ptr(abs(x->val));
824 return make_expression_ptr<AbsExpression<Scalar>>(x);
830template <
typename Scalar>
843 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
845 std::string_view
name()
const override {
return "acos"; }
849 return -this->
adj / sqrt(
Scalar(1) - x * x);
863template <
typename Scalar>
865 using enum ExpressionType;
869 if (x->is_constant(Scalar(0))) {
870 return constant_ptr(Scalar(std::numbers::pi) / Scalar(2));
874 if (x->type() == CONSTANT) {
875 return constant_ptr(acos(x->val));
878 return make_expression_ptr<AcosExpression<Scalar>>(x);
884template <
typename Scalar>
897 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
899 std::string_view
name()
const override {
return "asin"; }
903 return this->
adj / sqrt(
Scalar(1) - x * x);
917template <
typename Scalar>
919 using enum ExpressionType;
923 if (x->is_constant(Scalar(0))) {
929 if (x->type() == CONSTANT) {
930 return constant_ptr(asin(x->val));
933 return make_expression_ptr<AsinExpression<Scalar>>(x);
939template <
typename Scalar>
952 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
954 std::string_view
name()
const override {
return "atan"; }
971template <
typename Scalar>
973 using enum ExpressionType;
977 if (x->is_constant(Scalar(0))) {
983 if (x->type() == CONSTANT) {
984 return constant_ptr(atan(x->val));
987 return make_expression_ptr<AtanExpression<Scalar>>(x);
993template <
typename Scalar>
1008 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1010 std::string_view
name()
const override {
return "atan2"; }
1013 return this->
adj * x / (y * y + x * x);
1017 return this->
adj * -y / (y * y + x * x);
1023 return this->
adj_expr * x / (y * y + x * x);
1029 return this->
adj_expr * -y / (y * y + x * x);
1038template <
typename Scalar>
1041 using enum ExpressionType;
1045 if (y->type() == CONSTANT && x->type() == CONSTANT) {
1046 return constant_ptr(atan2(y->val, x->val));
1049 return make_expression_ptr<Atan2Expression<Scalar>>(y, x);
1055template <
typename Scalar>
1068 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1070 std::string_view
name()
const override {
return "cos"; }
1074 return this->
adj * -sin(x);
1088template <
typename Scalar>
1090 using enum ExpressionType;
1094 if (x->is_constant(Scalar(0))) {
1095 return constant_ptr(Scalar(1));
1099 if (x->type() == CONSTANT) {
1100 return constant_ptr(cos(x->val));
1103 return make_expression_ptr<CosExpression<Scalar>>(x);
1109template <
typename Scalar>
1122 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1124 std::string_view
name()
const override {
return "cosh"; }
1128 return this->
adj * sinh(x);
1142template <
typename Scalar>
1144 using enum ExpressionType;
1148 if (x->is_constant(Scalar(0))) {
1149 return constant_ptr(Scalar(1));
1153 if (x->type() == CONSTANT) {
1154 return constant_ptr(cosh(x->val));
1157 return make_expression_ptr<CoshExpression<Scalar>>(x);
1163template <
typename Scalar>
1176 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1178 std::string_view
name()
const override {
return "erf"; }
1182 return this->
adj *
Scalar(2.0 * std::numbers::inv_sqrtpi) * exp(-x * x);
1189 constant_ptr(
Scalar(2.0 * std::numbers::inv_sqrtpi)) * exp(-x * x);
1197template <
typename Scalar>
1199 using enum ExpressionType;
1203 if (x->is_constant(Scalar(0))) {
1209 if (x->type() == CONSTANT) {
1210 return constant_ptr(erf(x->val));
1213 return make_expression_ptr<ErfExpression<Scalar>>(x);
1219template <
typename Scalar>
1232 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1234 std::string_view
name()
const override {
return "exp"; }
1238 return this->
adj * exp(x);
1252template <
typename Scalar>
1254 using enum ExpressionType;
1258 if (x->is_constant(Scalar(0))) {
1259 return constant_ptr(Scalar(1));
1263 if (x->type() == CONSTANT) {
1264 return constant_ptr(exp(x->val));
1267 return make_expression_ptr<ExpExpression<Scalar>>(x);
1270template <
typename Scalar>
1271ExpressionPtr<Scalar> hypot(
const ExpressionPtr<Scalar>& x,
1272 const ExpressionPtr<Scalar>& y);
1277template <
typename Scalar>
1292 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1294 std::string_view
name()
const override {
return "hypot"; }
1298 return this->
adj * x / hypot(x, y);
1303 return this->
adj * y / hypot(x, y);
1309 return this->
adj_expr * x / hypot(x, y);
1315 return this->
adj_expr * y / hypot(x, y);
1324template <
typename Scalar>
1327 using enum ExpressionType;
1331 if (x->is_constant(Scalar(0))) {
1333 }
else if (y->is_constant(Scalar(0))) {
1338 if (x->type() == CONSTANT && y->type() == CONSTANT) {
1339 return constant_ptr(hypot(x->val, y->val));
1342 return make_expression_ptr<HypotExpression<Scalar>>(x, y);
1348template <
typename Scalar>
1360 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1362 std::string_view
name()
const override {
return "is nonnegative"; }
1369template <
typename Scalar>
1371 if (x->type() == ExpressionType::CONSTANT) {
1372 return constant_ptr(x->val >= Scalar(0) ? Scalar(1) : Scalar(0));
1375 return make_expression_ptr<IsNonnegativeExpression<Scalar>>(x);
1381template <
typename Scalar>
1393 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1395 std::string_view
name()
const override {
return "is positive"; }
1402template <
typename Scalar>
1404 if (x->type() == ExpressionType::CONSTANT) {
1405 return constant_ptr(x->val > Scalar(0) ? Scalar(1) : Scalar(0));
1408 return make_expression_ptr<IsPositiveExpression<Scalar>>(x);
1414template <
typename Scalar>
1427 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1429 std::string_view
name()
const override {
return "log"; }
1444template <
typename Scalar>
1446 using enum ExpressionType;
1450 if (x->is_constant(Scalar(0))) {
1456 if (x->type() == CONSTANT) {
1457 return constant_ptr(log(x->val));
1460 return make_expression_ptr<LogExpression<Scalar>>(x);
1466template <
typename Scalar>
1479 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1481 std::string_view
name()
const override {
return "log10"; }
1484 return this->
adj / (
Scalar(std::numbers::ln10) * x);
1490 return this->
adj_expr / (constant_ptr(
Scalar(std::numbers::ln10)) * x);
1498template <
typename Scalar>
1500 using enum ExpressionType;
1504 if (x->is_constant(Scalar(0))) {
1510 if (x->type() == CONSTANT) {
1511 return constant_ptr(log10(x->val));
1514 return make_expression_ptr<Log10Expression<Scalar>>(x);
1522template <
typename Scalar>
1536 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1538 std::string_view
name()
const override {
return "max"; }
1553 return this->
adj_expr * is_nonnegative(
a -
b);
1572template <
typename Scalar>
1575 using enum ExpressionType;
1579 if (
a->type() == CONSTANT &&
b->type() == CONSTANT) {
1580 return constant_ptr(max(
a->val,
b->val));
1583 return make_expression_ptr<MaxExpression<Scalar>>(a, b);
1591template <
typename Scalar>
1605 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1607 std::string_view
name()
const override {
return "min"; }
1624 return this->
adj_expr * is_nonnegative(
b -
a);
1642template <
typename Scalar>
1645 using enum ExpressionType;
1649 if (
a->type() == CONSTANT &&
b->type() == CONSTANT) {
1650 return constant_ptr(min(
a->val,
b->val));
1653 return make_expression_ptr<MinExpression<Scalar>>(a, b);
1656template <
typename Scalar>
1657ExpressionPtr<Scalar> pow(
const ExpressionPtr<Scalar>& base,
1658 const ExpressionPtr<Scalar>& power);
1664template <
typename Scalar, ExpressionType T>
1678 ExpressionType
type()
const override {
return T; }
1680 std::string_view
name()
const override {
return "pow"; }
1712template <
typename Scalar>
1715 using enum ExpressionType;
1719 if (
base->is_constant(Scalar(0))) {
1722 }
else if (base->is_constant(Scalar(1))) {
1726 if (power->is_constant(Scalar(0))) {
1727 return constant_ptr(Scalar(1));
1728 }
else if (power->is_constant(Scalar(1))) {
1734 if (base->type() == CONSTANT && power->type() == CONSTANT) {
1735 return constant_ptr(pow(base->val, power->val));
1738 if (power->is_constant(Scalar(2))) {
1739 if (base->type() == LINEAR) {
1740 return make_expression_ptr<MultExpression<Scalar, QUADRATIC>>(base, base);
1742 return make_expression_ptr<MultExpression<Scalar, NONLINEAR>>(base, base);
1746 return make_expression_ptr<PowExpression<Scalar, NONLINEAR>>(base, power);
1752template <
typename Scalar>
1763 }
else if (x ==
Scalar(0)) {
1770 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1772 std::string_view
name()
const override {
return "sign"; }
1779template <
typename Scalar>
1781 using enum ExpressionType;
1784 if (x->type() == CONSTANT) {
1785 if (x->val < Scalar(0)) {
1786 return constant_ptr(Scalar(-1));
1787 }
else if (x->val == Scalar(0)) {
1791 return constant_ptr(Scalar(1));
1795 return make_expression_ptr<SignExpression<Scalar>>(x);
1801template <
typename Scalar>
1814 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1816 std::string_view
name()
const override {
return "sin"; }
1820 return this->
adj * cos(x);
1834template <
typename Scalar>
1836 using enum ExpressionType;
1840 if (x->is_constant(Scalar(0))) {
1846 if (x->type() == CONSTANT) {
1847 return constant_ptr(sin(x->val));
1850 return make_expression_ptr<SinExpression<Scalar>>(x);
1856template <
typename Scalar>
1869 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1871 std::string_view
name()
const override {
return "sinh"; }
1875 return this->
adj * cosh(x);
1889template <
typename Scalar>
1891 using enum ExpressionType;
1895 if (x->is_constant(Scalar(0))) {
1901 if (x->type() == CONSTANT) {
1902 return constant_ptr(sinh(x->val));
1905 return make_expression_ptr<SinhExpression<Scalar>>(x);
1911template <
typename Scalar>
1924 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1926 std::string_view
name()
const override {
return "sqrt"; }
1930 return this->
adj / (
Scalar(2) * sqrt(x));
1944template <
typename Scalar>
1946 using enum ExpressionType;
1950 if (x->type() == CONSTANT) {
1951 if (x->val == Scalar(0)) {
1954 }
else if (x->val == Scalar(1)) {
1957 return constant_ptr(sqrt(x->val));
1961 return make_expression_ptr<SqrtExpression<Scalar>>(x);
1967template <
typename Scalar>
1980 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1982 std::string_view
name()
const override {
return "tan"; }
1988 return this->
adj / (
c *
c);
2003template <
typename Scalar>
2005 using enum ExpressionType;
2009 if (x->is_constant(Scalar(0))) {
2015 if (x->type() == CONSTANT) {
2016 return constant_ptr(tan(x->val));
2019 return make_expression_ptr<TanExpression<Scalar>>(x);
2025template <
typename Scalar>
2038 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
2040 std::string_view
name()
const override {
return "tanh"; }
2046 return this->
adj / (
c *
c);
2061template <
typename Scalar>
2063 using enum ExpressionType;
2067 if (x->is_constant(Scalar(0))) {
2073 if (x->type() == CONSTANT) {
2074 return constant_ptr(tanh(x->val));
2077 return make_expression_ptr<TanhExpression<Scalar>>(x);
Definition intrusive_shared_ptr.hpp:27
Definition expression.hpp:771
std::string_view name() const override
Definition expression.hpp:785
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:797
constexpr AbsExpression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:775
ExpressionType type() const override
Definition expression.hpp:783
Scalar grad_l(Scalar x, Scalar) const override
Definition expression.hpp:787
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:778
Definition expression.hpp:831
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:838
constexpr AcosExpression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:835
ExpressionType type() const override
Definition expression.hpp:843
Scalar grad_l(Scalar x, Scalar) const override
Definition expression.hpp:847
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:852
std::string_view name() const override
Definition expression.hpp:845
Definition expression.hpp:885
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:892
Scalar grad_l(Scalar x, Scalar) const override
Definition expression.hpp:901
std::string_view name() const override
Definition expression.hpp:899
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:906
ExpressionType type() const override
Definition expression.hpp:897
constexpr AsinExpression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:889
Definition expression.hpp:994
std::string_view name() const override
Definition expression.hpp:1010
Scalar value(Scalar y, Scalar x) const override
Definition expression.hpp:1003
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &y, const ExpressionPtr< Scalar > &x) const override
Definition expression.hpp:1020
constexpr Atan2Expression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Definition expression.hpp:999
Scalar grad_l(Scalar y, Scalar x) const override
Definition expression.hpp:1012
Scalar grad_r(Scalar y, Scalar x) const override
Definition expression.hpp:1016
ExpressionPtr< Scalar > grad_expr_r(const ExpressionPtr< Scalar > &y, const ExpressionPtr< Scalar > &x) const override
Definition expression.hpp:1026
ExpressionType type() const override
Definition expression.hpp:1008
Definition expression.hpp:940
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:960
std::string_view name() const override
Definition expression.hpp:954
Scalar grad_l(Scalar x, Scalar) const override
Definition expression.hpp:956
constexpr AtanExpression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:944
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:947
ExpressionType type() const override
Definition expression.hpp:952
Definition expression.hpp:444
constexpr BinaryMinusExpression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Definition expression.hpp:449
std::string_view name() const override
Definition expression.hpp:457
ExpressionPtr< Scalar > grad_expr_r(const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:469
Scalar grad_r(Scalar, Scalar) const override
Definition expression.hpp:461
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:463
Scalar value(Scalar lhs, Scalar rhs) const override
Definition expression.hpp:453
ExpressionType type() const override
Definition expression.hpp:455
Scalar grad_l(Scalar, Scalar) const override
Definition expression.hpp:459
Definition expression.hpp:481
Scalar value(Scalar lhs, Scalar rhs) const override
Definition expression.hpp:490
Scalar grad_r(Scalar, Scalar) const override
Definition expression.hpp:498
Scalar grad_l(Scalar, Scalar) const override
Definition expression.hpp:496
constexpr BinaryPlusExpression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Definition expression.hpp:486
ExpressionType type() const override
Definition expression.hpp:492
ExpressionPtr< Scalar > grad_expr_r(const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:506
std::string_view name() const override
Definition expression.hpp:494
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:500
Definition expression.hpp:517
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:540
std::string_view name() const override
Definition expression.hpp:531
constexpr CbrtExpression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:521
Scalar grad_l(Scalar x, Scalar) const override
Definition expression.hpp:533
ExpressionType type() const override
Definition expression.hpp:529
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:524
Definition expression.hpp:576
ExpressionType type() const override
Definition expression.hpp:585
Scalar value(Scalar, Scalar) const override
Definition expression.hpp:583
std::string_view name() const override
Definition expression.hpp:587
constexpr ConstantExpression(Scalar value)
Definition expression.hpp:580
Definition expression.hpp:1056
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:1063
ExpressionType type() const override
Definition expression.hpp:1068
constexpr CosExpression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:1060
std::string_view name() const override
Definition expression.hpp:1070
Scalar grad_l(Scalar x, Scalar) const override
Definition expression.hpp:1072
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:1077
Definition expression.hpp:1110
ExpressionType type() const override
Definition expression.hpp:1122
std::string_view name() const override
Definition expression.hpp:1124
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:1117
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:1131
constexpr CoshExpression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:1114
Scalar grad_l(Scalar x, Scalar) const override
Definition expression.hpp:1126
Definition expression.hpp:594
constexpr DecisionVariableExpression()=default
Constructs a decision variable expression with a value of zero.
std::string_view name() const override
Definition expression.hpp:608
Scalar value(Scalar, Scalar) const override
Definition expression.hpp:604
constexpr DecisionVariableExpression(Scalar value)
Definition expression.hpp:601
ExpressionType type() const override
Definition expression.hpp:606
Definition expression.hpp:616
constexpr DivExpression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Definition expression.hpp:621
ExpressionType type() const override
Definition expression.hpp:626
ExpressionPtr< Scalar > grad_expr_r(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs) const override
Definition expression.hpp:642
std::string_view name() const override
Definition expression.hpp:628
Scalar value(Scalar lhs, Scalar rhs) const override
Definition expression.hpp:624
Scalar grad_l(Scalar, Scalar rhs) const override
Definition expression.hpp:630
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &rhs) const override
Definition expression.hpp:636
Scalar grad_r(Scalar lhs, Scalar rhs) const override
Definition expression.hpp:632
Definition expression.hpp:1164
std::string_view name() const override
Definition expression.hpp:1178
constexpr ErfExpression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:1168
Scalar grad_l(Scalar x, Scalar) const override
Definition expression.hpp:1180
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:1185
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:1171
ExpressionType type() const override
Definition expression.hpp:1176
Definition expression.hpp:1220
std::string_view name() const override
Definition expression.hpp:1234
ExpressionType type() const override
Definition expression.hpp:1232
constexpr ExpExpression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:1224
Scalar grad_l(Scalar x, Scalar) const override
Definition expression.hpp:1236
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:1241
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:1227
Definition expression.hpp:89
Scalar val
The value of the expression node.
Definition expression.hpp:94
ExpressionPtr< Scalar > adj_expr
Definition expression.hpp:101
friend ExpressionPtr< Scalar > operator-(const ExpressionPtr< Scalar > &lhs)
Definition expression.hpp:327
virtual Scalar grad_r(Scalar lhs, Scalar rhs) const
Definition expression.hpp:393
std::array< ExpressionPtr< Scalar >, 2 > args
Expression arguments.
Definition expression.hpp:104
uint32_t ref_count
Reference count for intrusive shared pointer.
Definition expression.hpp:118
constexpr Expression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:131
friend ExpressionPtr< Scalar > operator+(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs)
Definition expression.hpp:243
int32_t scratch
Definition expression.hpp:115
virtual Scalar grad_l(Scalar lhs, Scalar rhs) const
Definition expression.hpp:383
constexpr bool is_constant(Scalar constant) const
Definition expression.hpp:147
Scalar adj
The adjoint of the expression node, used during autodiff.
Definition expression.hpp:97
constexpr Expression()=default
Constructs a constant expression with a value of zero.
constexpr Expression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Definition expression.hpp:138
virtual ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs) const
Definition expression.hpp:403
Scalar_ Scalar
Scalar type alias.
Definition expression.hpp:91
virtual ExpressionType type() const =0
friend ExpressionPtr< Scalar > operator/(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs)
Definition expression.hpp:207
friend ExpressionPtr< Scalar > operator-(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs)
Definition expression.hpp:288
friend ExpressionPtr< Scalar > operator*(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs)
Definition expression.hpp:155
virtual Scalar value(Scalar lhs, Scalar rhs) const =0
virtual std::string_view name() const =0
virtual ExpressionPtr< Scalar > grad_expr_r(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs) const
Definition expression.hpp:414
friend ExpressionPtr< Scalar > operator+=(ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs)
Definition expression.hpp:279
constexpr Expression(Scalar value)
Definition expression.hpp:126
friend ExpressionPtr< Scalar > operator+(const ExpressionPtr< Scalar > &lhs)
Definition expression.hpp:353
Definition expression.hpp:1278
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &y) const override
Definition expression.hpp:1306
constexpr HypotExpression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Definition expression.hpp:1283
ExpressionType type() const override
Definition expression.hpp:1292
std::string_view name() const override
Definition expression.hpp:1294
ExpressionPtr< Scalar > grad_expr_r(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &y) const override
Definition expression.hpp:1312
Scalar value(Scalar x, Scalar y) const override
Definition expression.hpp:1287
Scalar grad_r(Scalar x, Scalar y) const override
Definition expression.hpp:1301
Scalar grad_l(Scalar x, Scalar y) const override
Definition expression.hpp:1296
Definition expression.hpp:1349
ExpressionType type() const override
Definition expression.hpp:1360
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:1356
std::string_view name() const override
Definition expression.hpp:1362
constexpr IsNonnegativeExpression(ExpressionPtr< Scalar > x)
Definition expression.hpp:1353
Definition expression.hpp:1382
std::string_view name() const override
Definition expression.hpp:1395
ExpressionType type() const override
Definition expression.hpp:1393
constexpr IsPositiveExpression(ExpressionPtr< Scalar > x)
Definition expression.hpp:1386
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:1389
Definition expression.hpp:1467
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:1474
std::string_view name() const override
Definition expression.hpp:1481
constexpr Log10Expression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:1471
ExpressionType type() const override
Definition expression.hpp:1479
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:1487
Scalar grad_l(Scalar x, Scalar) const override
Definition expression.hpp:1483
Definition expression.hpp:1415
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:1433
ExpressionType type() const override
Definition expression.hpp:1427
Scalar grad_l(Scalar x, Scalar) const override
Definition expression.hpp:1431
std::string_view name() const override
Definition expression.hpp:1429
constexpr LogExpression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:1419
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:1422
Definition expression.hpp:1523
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &a, const ExpressionPtr< Scalar > &b) const override
Definition expression.hpp:1548
Scalar value(Scalar a, Scalar b) const override
Definition expression.hpp:1531
Scalar grad_r(Scalar a, Scalar b) const override
Definition expression.hpp:1544
constexpr MaxExpression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Definition expression.hpp:1528
ExpressionPtr< Scalar > grad_expr_r(const ExpressionPtr< Scalar > &a, const ExpressionPtr< Scalar > &b) const override
Definition expression.hpp:1556
Scalar grad_l(Scalar a, Scalar b) const override
Definition expression.hpp:1540
ExpressionType type() const override
Definition expression.hpp:1536
std::string_view name() const override
Definition expression.hpp:1538
Definition expression.hpp:1592
std::string_view name() const override
Definition expression.hpp:1607
Scalar value(Scalar a, Scalar b) const override
Definition expression.hpp:1600
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &a, const ExpressionPtr< Scalar > &b) const override
Definition expression.hpp:1618
ExpressionType type() const override
Definition expression.hpp:1605
constexpr MinExpression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Definition expression.hpp:1597
ExpressionPtr< Scalar > grad_expr_r(const ExpressionPtr< Scalar > &a, const ExpressionPtr< Scalar > &b) const override
Definition expression.hpp:1627
Scalar grad_l(Scalar a, Scalar b) const override
Definition expression.hpp:1609
Scalar grad_r(Scalar a, Scalar b) const override
Definition expression.hpp:1613
Definition expression.hpp:654
Scalar grad_l(Scalar lhs, Scalar rhs) const override
Definition expression.hpp:668
Scalar value(Scalar lhs, Scalar rhs) const override
Definition expression.hpp:662
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs) const override
Definition expression.hpp:676
constexpr MultExpression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Definition expression.hpp:659
ExpressionType type() const override
Definition expression.hpp:664
std::string_view name() const override
Definition expression.hpp:666
ExpressionPtr< Scalar > grad_expr_r(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs) const override
Definition expression.hpp:682
Scalar grad_r(Scalar lhs, Scalar rhs) const override
Definition expression.hpp:672
Definition expression.hpp:1665
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &base, const ExpressionPtr< Scalar > &power) const override
Definition expression.hpp:1694
Scalar value(Scalar base, Scalar power) const override
Definition expression.hpp:1673
ExpressionType type() const override
Definition expression.hpp:1678
Scalar grad_l(Scalar base, Scalar power) const override
Definition expression.hpp:1682
ExpressionPtr< Scalar > grad_expr_r(const ExpressionPtr< Scalar > &base, const ExpressionPtr< Scalar > &power) const override
Definition expression.hpp:1700
Scalar grad_r(Scalar base, Scalar power) const override
Definition expression.hpp:1687
std::string_view name() const override
Definition expression.hpp:1680
constexpr PowExpression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Definition expression.hpp:1670
Definition expression.hpp:1753
constexpr SignExpression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:1757
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:1760
ExpressionType type() const override
Definition expression.hpp:1770
std::string_view name() const override
Definition expression.hpp:1772
Definition expression.hpp:1802
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:1809
std::string_view name() const override
Definition expression.hpp:1816
ExpressionType type() const override
Definition expression.hpp:1814
constexpr SinExpression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:1806
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:1823
Scalar grad_l(Scalar x, Scalar) const override
Definition expression.hpp:1818
Definition expression.hpp:1857
Scalar grad_l(Scalar x, Scalar) const override
Definition expression.hpp:1873
std::string_view name() const override
Definition expression.hpp:1871
ExpressionType type() const override
Definition expression.hpp:1869
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:1878
constexpr SinhExpression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:1861
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:1864
Definition expression.hpp:1912
ExpressionType type() const override
Definition expression.hpp:1924
Scalar grad_l(Scalar x, Scalar) const override
Definition expression.hpp:1928
std::string_view name() const override
Definition expression.hpp:1926
constexpr SqrtExpression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:1916
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:1919
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:1933
Definition expression.hpp:1968
std::string_view name() const override
Definition expression.hpp:1982
constexpr TanExpression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:1972
Scalar grad_l(Scalar x, Scalar) const override
Definition expression.hpp:1984
ExpressionType type() const override
Definition expression.hpp:1980
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:1991
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:1975
Definition expression.hpp:2026
Scalar grad_l(Scalar x, Scalar) const override
Definition expression.hpp:2042
ExpressionType type() const override
Definition expression.hpp:2038
std::string_view name() const override
Definition expression.hpp:2040
Scalar value(Scalar x, Scalar) const override
Definition expression.hpp:2033
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &x, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:2049
constexpr TanhExpression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:2030
Definition expression.hpp:694
Scalar grad_l(Scalar, Scalar) const override
Definition expression.hpp:707
constexpr UnaryMinusExpression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:698
ExpressionPtr< Scalar > grad_expr_l(const ExpressionPtr< Scalar > &, const ExpressionPtr< Scalar > &) const override
Definition expression.hpp:709
ExpressionType type() const override
Definition expression.hpp:703
Scalar value(Scalar lhs, Scalar) const override
Definition expression.hpp:701
std::string_view name() const override
Definition expression.hpp:705