15#include <gch/small_vector.hpp>
17#include "sleipnir/autodiff/expression_type.hpp"
18#include "sleipnir/util/function_ref.hpp"
19#include "sleipnir/util/intrusive_shared_ptr.hpp"
20#include "sleipnir/util/pool.hpp"
22namespace slp::detail {
25inline constexpr bool USE_POOL_ALLOCATOR =
false;
27inline constexpr bool USE_POOL_ALLOCATOR =
true;
30template <
typename Scalar>
36template <
typename Scalar>
37using ExpressionPtr = IntrusiveSharedPtr<Expression<Scalar>>;
44template <
typename T,
typename... Args>
45static ExpressionPtr<typename T::Scalar> make_expression_ptr(Args&&... args) {
46 if constexpr (USE_POOL_ALLOCATOR) {
47 return allocate_intrusive_shared<T>(global_pool_allocator<T>(),
48 std::forward<Args>(args)...);
50 return make_intrusive_shared<T>(std::forward<Args>(args)...);
54template <
typename Scalar, ExpressionType T>
55struct BinaryMinusExpression;
57template <
typename Scalar, ExpressionType T>
58struct BinaryPlusExpression;
60template <
typename Scalar, ExpressionType T>
63template <
typename Scalar, ExpressionType T>
66template <
typename Scalar, ExpressionType T>
67struct UnaryMinusExpression;
73template <
typename Scalar>
74ExpressionPtr<Scalar> constant_ptr(Scalar value);
79template <
typename Scalar_>
130 return type() == ExpressionType::CONSTANT &&
val == constant;
139 using enum ExpressionType;
142 if (lhs->is_constant(
Scalar(0))) {
145 }
else if (rhs->is_constant(
Scalar(0))) {
148 }
else if (lhs->is_constant(
Scalar(1))) {
151 }
else if (rhs->is_constant(
Scalar(1))) {
157 if (lhs->type() == CONSTANT && rhs->type() == CONSTANT) {
158 return constant_ptr(lhs->val * rhs->val);
162 if (lhs->type() == CONSTANT) {
163 if (rhs->type() == LINEAR) {
165 }
else if (rhs->type() == QUADRATIC) {
170 }
else if (rhs->type() == CONSTANT) {
171 if (lhs->type() == LINEAR) {
173 }
else if (lhs->type() == QUADRATIC) {
178 }
else if (lhs->type() == LINEAR && rhs->type() == LINEAR) {
191 using enum ExpressionType;
194 if (lhs->is_constant(
Scalar(0))) {
197 }
else if (rhs->is_constant(
Scalar(1))) {
203 if (lhs->type() == CONSTANT && rhs->type() == CONSTANT) {
204 return constant_ptr(lhs->val / rhs->val);
208 if (rhs->type() == CONSTANT) {
209 if (lhs->type() == LINEAR) {
211 }
else if (lhs->type() == QUADRATIC) {
227 using enum ExpressionType;
231 if (lhs ==
nullptr || lhs->is_constant(
Scalar(0))) {
234 }
else if (rhs ==
nullptr || rhs->is_constant(
Scalar(0))) {
240 if (lhs->type() == CONSTANT && rhs->type() == CONSTANT) {
241 return constant_ptr(lhs->val + rhs->val);
244 auto type = std::max(lhs->type(), rhs->type());
245 if (
type == LINEAR) {
248 }
else if (
type == QUADRATIC) {
263 return lhs = lhs + rhs;
272 using enum ExpressionType;
275 if (lhs->is_constant(
Scalar(0))) {
276 if (rhs->is_constant(
Scalar(0))) {
283 }
else if (rhs->is_constant(
Scalar(0))) {
289 if (lhs->type() == CONSTANT && rhs->type() == CONSTANT) {
290 return constant_ptr(lhs->val - rhs->val);
293 auto type = std::max(lhs->type(), rhs->type());
294 if (
type == LINEAR) {
297 }
else if (
type == QUADRATIC) {
310 using enum ExpressionType;
313 if (lhs->is_constant(
Scalar(0))) {
319 if (lhs->type() == CONSTANT) {
320 return constant_ptr(-lhs->val);
323 if (lhs->type() == LINEAR) {
325 }
else if (lhs->type() == QUADRATIC) {
357 virtual ExpressionType
type()
const = 0;
362 virtual std::string_view
name()
const = 0;
375template <
typename Scalar, ExpressionType T>
399 ExpressionType
type()
const override {
return T; }
401 std::string_view
name()
const override {
return "binary minus"; }
404 lhs->adj += grad_l();
405 rhs->adj += grad_r();
409 lhs->adj_expr += grad_expr_l();
410 rhs->adj_expr += grad_expr_r();
414 Scalar grad_l()
const {
return this->
adj; }
416 Scalar grad_r()
const {
return -this->
adj; }
418 ExpressionPtr<Scalar> grad_expr_l()
const {
return this->
adj_expr; }
420 ExpressionPtr<Scalar> grad_expr_r()
const {
return -this->
adj_expr; }
427template <
typename Scalar, ExpressionType T>
451 ExpressionType
type()
const override {
return T; }
453 std::string_view
name()
const override {
return "binary plus"; }
456 lhs->adj += grad_l();
457 rhs->adj += grad_r();
461 lhs->adj_expr += grad_expr_l();
462 rhs->adj_expr += grad_expr_r();
466 Scalar grad_l()
const {
return this->
adj; }
468 Scalar grad_r()
const {
return this->
adj; }
470 ExpressionPtr<Scalar> grad_expr_l()
const {
return this->
adj_expr; }
472 ExpressionPtr<Scalar> grad_expr_r()
const {
return this->
adj_expr; }
478template <
typename Scalar>
499 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
501 std::string_view
name()
const override {
return "cbrt"; }
506 x->adj_expr += grad_expr_l();
519 return this->adj_expr / (constant_ptr(
Scalar(3)) *
c *
c);
527template <
typename Scalar>
528ExpressionPtr<Scalar> cbrt(
const ExpressionPtr<Scalar>& x) {
529 using enum ExpressionType;
533 if (x->type() == CONSTANT) {
534 if (x->val == Scalar(0)) {
537 }
else if (x->val == Scalar(-1) || x->val == Scalar(1)) {
540 return constant_ptr(cbrt(x->val));
544 return make_expression_ptr<CbrtExpression<Scalar>>(x);
550template <
typename Scalar>
560 ExpressionType
type()
const override {
return ExpressionType::CONSTANT; }
562 std::string_view
name()
const override {
return "constant"; }
565template <
typename Scalar>
573template <
typename Scalar>
586 ExpressionType
type()
const override {
return ExpressionType::LINEAR; }
588 std::string_view
name()
const override {
return "decision variable"; }
595template <
typename Scalar, ExpressionType T>
618 ExpressionType
type()
const override {
return T; }
620 std::string_view
name()
const override {
return "division"; }
623 lhs->adj += grad_l();
624 rhs->adj += grad_r();
628 lhs->adj_expr += grad_expr_l();
629 rhs->adj_expr += grad_expr_r();
633 Scalar grad_l()
const {
return this->
adj / rhs->val; };
636 return this->
adj * -lhs->val / (
rhs->val *
rhs->val);
639 ExpressionPtr<Scalar> grad_expr_l()
const {
return this->adj_expr /
rhs; }
641 ExpressionPtr<Scalar> grad_expr_r()
const {
642 return this->adj_expr * -
lhs / (
rhs *
rhs);
650template <
typename Scalar, ExpressionType T>
673 ExpressionType
type()
const override {
return T; }
675 std::string_view
name()
const override {
return "multiplication"; }
678 lhs->adj += grad_l();
679 rhs->adj += grad_r();
683 lhs->adj_expr += grad_expr_l();
684 rhs->adj_expr += grad_expr_r();
688 Scalar grad_l()
const {
return this->
adj * rhs->val; }
690 Scalar grad_r()
const {
return this->
adj * lhs->val; }
692 ExpressionPtr<Scalar> grad_expr_l()
const {
return this->adj_expr *
rhs; }
694 ExpressionPtr<Scalar> grad_expr_r()
const {
return this->adj_expr *
lhs; }
701template <
typename Scalar, ExpressionType T>
719 ExpressionType
type()
const override {
return T; }
721 std::string_view
name()
const override {
return "unary minus"; }
726 lhs->adj_expr += grad_expr_l();
730 Scalar grad_l()
const {
return -this->
adj; }
739template <
typename Scalar>
740constexpr void inc_ref_count(Expression<Scalar>* expr) {
748template <
typename Scalar>
749constexpr void dec_ref_count(Expression<Scalar>* expr) {
754 gch::small_vector<Expression<Scalar>*> stack;
755 stack.emplace_back(expr);
757 while (!stack.empty()) {
758 auto elem = stack.back();
763 if (--elem->ref_count == 0) {
764 if (elem->adj_expr !=
nullptr) {
765 stack.emplace_back(elem->adj_expr.get());
767 elem->visit_args([&stack](
const auto& arg) { stack.emplace_back(arg); });
771 if constexpr (USE_POOL_ALLOCATOR) {
772 auto alloc = global_pool_allocator<Expression<Scalar>>();
773 std::allocator_traits<
decltype(alloc)>::deallocate(alloc, elem, 1);
775 operator delete(elem);
784template <
typename Scalar>
804 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
806 std::string_view
name()
const override {
return "abs"; }
811 x->adj_expr += grad_expr_l();
818 }
else if (x->val >
Scalar(0)) {
825 ExpressionPtr<Scalar> grad_expr_l()
const {
return this->adj_expr * sign(
x); }
832template <
typename Scalar>
833ExpressionPtr<Scalar> abs(
const ExpressionPtr<Scalar>& x) {
834 using enum ExpressionType;
838 if (x->is_constant(Scalar(0))) {
844 if (x->type() == CONSTANT) {
845 return constant_ptr(abs(x->val));
848 return make_expression_ptr<AbsExpression<Scalar>>(x);
854template <
typename Scalar>
875 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
877 std::string_view
name()
const override {
return "acos"; }
882 x->adj_expr += grad_expr_l();
888 return -this->
adj / sqrt(
Scalar(1) -
x->val *
x->val);
892 return -this->adj_expr / sqrt(constant_ptr(
Scalar(1)) -
x *
x);
900template <
typename Scalar>
901ExpressionPtr<Scalar> acos(
const ExpressionPtr<Scalar>& x) {
902 using enum ExpressionType;
906 if (x->is_constant(Scalar(0))) {
907 return constant_ptr(Scalar(std::numbers::pi) / Scalar(2));
911 if (x->type() == CONSTANT) {
912 return constant_ptr(acos(x->val));
915 return make_expression_ptr<AcosExpression<Scalar>>(x);
921template <
typename Scalar>
942 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
944 std::string_view
name()
const override {
return "asin"; }
949 x->adj_expr += grad_expr_l();
955 return this->
adj / sqrt(
Scalar(1) -
x->val *
x->val);
959 return this->adj_expr / sqrt(constant_ptr(
Scalar(1)) -
x *
x);
967template <
typename Scalar>
968ExpressionPtr<Scalar> asin(
const ExpressionPtr<Scalar>& x) {
969 using enum ExpressionType;
973 if (x->is_constant(Scalar(0))) {
979 if (x->type() == CONSTANT) {
980 return constant_ptr(asin(x->val));
983 return make_expression_ptr<AsinExpression<Scalar>>(x);
989template <
typename Scalar>
1007 return atan(
x->val);
1010 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1012 std::string_view
name()
const override {
return "atan"; }
1017 x->adj_expr += grad_expr_l();
1021 Scalar grad_l()
const {
return this->
adj / (
Scalar(1) + x->val *
x->val); }
1024 return this->adj_expr / (constant_ptr(
Scalar(1)) +
x *
x);
1032template <
typename Scalar>
1033ExpressionPtr<Scalar> atan(
const ExpressionPtr<Scalar>& x) {
1034 using enum ExpressionType;
1038 if (x->is_constant(Scalar(0))) {
1044 if (x->type() == CONSTANT) {
1045 return constant_ptr(atan(x->val));
1048 return make_expression_ptr<AtanExpression<Scalar>>(x);
1054template <
typename Scalar>
1077 return atan2(
y->val,
x->val);
1080 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1082 std::string_view
name()
const override {
return "atan2"; }
1090 y->adj_expr += grad_expr_l();
1091 x->adj_expr += grad_expr_r();
1096 return this->
adj * x->val / (
y->val *
y->val +
x->val *
x->val);
1100 return this->
adj * -y->val / (
y->val *
y->val +
x->val *
x->val);
1103 ExpressionPtr<Scalar> grad_expr_l()
const {
1104 return this->adj_expr *
x / (
y *
y +
x *
x);
1107 ExpressionPtr<Scalar> grad_expr_r()
const {
1108 return this->adj_expr * -
y / (
y *
y +
x *
x);
1117template <
typename Scalar>
1118ExpressionPtr<Scalar> atan2(
const ExpressionPtr<Scalar>& y,
1119 const ExpressionPtr<Scalar>& x) {
1120 using enum ExpressionType;
1124 if (y->type() == CONSTANT && x->type() == CONSTANT) {
1125 return constant_ptr(atan2(y->val, x->val));
1128 return make_expression_ptr<Atan2Expression<Scalar>>(y, x);
1134template <
typename Scalar>
1154 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1156 std::string_view
name()
const override {
return "cos"; }
1161 x->adj_expr += grad_expr_l();
1167 return this->
adj * -sin(
x->val);
1177template <
typename Scalar>
1178ExpressionPtr<Scalar> cos(
const ExpressionPtr<Scalar>& x) {
1179 using enum ExpressionType;
1183 if (x->is_constant(Scalar(0))) {
1184 return constant_ptr(Scalar(1));
1188 if (x->type() == CONSTANT) {
1189 return constant_ptr(cos(x->val));
1192 return make_expression_ptr<CosExpression<Scalar>>(x);
1198template <
typename Scalar>
1216 return cosh(
x->val);
1219 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1221 std::string_view
name()
const override {
return "cosh"; }
1226 x->adj_expr += grad_expr_l();
1232 return this->
adj * sinh(
x->val);
1242template <
typename Scalar>
1243ExpressionPtr<Scalar> cosh(
const ExpressionPtr<Scalar>& x) {
1244 using enum ExpressionType;
1248 if (x->is_constant(Scalar(0))) {
1249 return constant_ptr(Scalar(1));
1253 if (x->type() == CONSTANT) {
1254 return constant_ptr(cosh(x->val));
1257 return make_expression_ptr<CoshExpression<Scalar>>(x);
1263template <
typename Scalar>
1283 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1285 std::string_view
name()
const override {
return "erf"; }
1290 x->adj_expr += grad_expr_l();
1296 return this->
adj *
Scalar(2.0 * std::numbers::inv_sqrtpi) *
1297 exp(-
x->val *
x->val);
1301 return this->adj_expr *
1302 constant_ptr(
Scalar(2.0 * std::numbers::inv_sqrtpi)) * exp(-
x *
x);
1310template <
typename Scalar>
1311ExpressionPtr<Scalar> erf(
const ExpressionPtr<Scalar>& x) {
1312 using enum ExpressionType;
1316 if (x->is_constant(Scalar(0))) {
1322 if (x->type() == CONSTANT) {
1323 return constant_ptr(erf(x->val));
1326 return make_expression_ptr<ErfExpression<Scalar>>(x);
1332template <
typename Scalar>
1352 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1354 std::string_view
name()
const override {
return "exp"; }
1359 x->adj_expr += grad_expr_l();
1365 return this->
adj * exp(
x->val);
1375template <
typename Scalar>
1376ExpressionPtr<Scalar> exp(
const ExpressionPtr<Scalar>& x) {
1377 using enum ExpressionType;
1381 if (x->is_constant(Scalar(0))) {
1382 return constant_ptr(Scalar(1));
1386 if (x->type() == CONSTANT) {
1387 return constant_ptr(exp(x->val));
1390 return make_expression_ptr<ExpExpression<Scalar>>(x);
1393template <
typename Scalar>
1394ExpressionPtr<Scalar> hypot(
const ExpressionPtr<Scalar>& x,
1395 const ExpressionPtr<Scalar>& y);
1400template <
typename Scalar>
1423 return hypot(
x->val,
y->val);
1426 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1428 std::string_view
name()
const override {
return "hypot"; }
1433 x->adj += this->
adj * x->val /
norm;
1434 y->adj += this->
adj * y->val /
norm;
1439 x->adj_expr += this->adj_expr *
x /
norm;
1440 y->adj_expr += this->adj_expr *
y /
norm;
1449template <
typename Scalar>
1452 using enum ExpressionType;
1456 if (x->is_constant(Scalar(0))) {
1458 }
else if (y->is_constant(Scalar(0))) {
1463 if (x->type() == CONSTANT && y->type() == CONSTANT) {
1464 return constant_ptr(hypot(x->val, y->val));
1467 return make_expression_ptr<Hypot2Expression<Scalar>>(x, y);
1470template <
typename Scalar>
1471ExpressionPtr<Scalar> hypot(
const ExpressionPtr<Scalar>& x,
1472 const ExpressionPtr<Scalar>& y,
1473 const ExpressionPtr<Scalar>& z);
1478template <
typename Scalar>
1507 return hypot(
x->val,
y->val,
z->val);
1510 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1512 std::string_view
name()
const override {
return "hypot"; }
1517 x->adj += this->
adj * x->val /
norm;
1518 y->adj += this->
adj * y->val /
norm;
1519 z->adj += this->
adj * z->val /
norm;
1524 x->adj_expr += this->adj_expr *
x /
norm;
1525 y->adj_expr += this->adj_expr *
y /
norm;
1526 z->adj_expr += this->adj_expr *
z /
norm;
1536template <
typename Scalar>
1540 using enum ExpressionType;
1544 if (x->is_constant(Scalar(0))) {
1546 }
else if (y->is_constant(Scalar(0))) {
1548 }
else if (z->is_constant(Scalar(0))) {
1553 if (x->type() == CONSTANT && y->type() == CONSTANT && z->type() == CONSTANT) {
1554 return constant_ptr(hypot(x->val, y->val, z->val));
1557 return make_expression_ptr<Hypot3Expression<Scalar>>(x, y, z);
1565template <
typename Scalar>
1607 return cond(
a->val,
b->val) ?
t->val :
f->val;
1610 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1612 std::string_view
name()
const override {
return "if-else"; }
1616 if (
cond(
a->val,
b->val)) {
1617 t->adj += this->
adj;
1619 f->adj += this->
adj;
1624 t->adj_expr += grad_expr_t();
1625 f->adj_expr += grad_expr_f();
1631 return if_else(
cond,
a,
b, this->adj_expr, constant_ptr(
Scalar(0)));
1636 return if_else(
cond,
a,
b, constant_ptr(
Scalar(0)), this->adj_expr);
1648template <
typename Scalar>
1649ExpressionPtr<Scalar> if_else(
1650 std::type_identity_t<
bool (*)(Scalar a, Scalar b)> cond,
1651 const ExpressionPtr<Scalar>& a,
const ExpressionPtr<Scalar>& b,
1652 const ExpressionPtr<Scalar>& t,
const ExpressionPtr<Scalar>& f) {
1653 using enum ExpressionType;
1659 }
else if (t->type() == CONSTANT && f->type() == CONSTANT &&
1666 if (a->type() == CONSTANT && b->type() == CONSTANT) {
1667 return cond(a->val, b->val) ? t : f;
1670 return make_expression_ptr<IfElseExpression<Scalar>>(cond, a, b, t, f);
1676template <
typename Scalar>
1696 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1698 std::string_view
name()
const override {
return "log"; }
1703 x->adj_expr += grad_expr_l();
1707 Scalar grad_l()
const {
return this->
adj / x->val; }
1716template <
typename Scalar>
1717ExpressionPtr<Scalar> log(
const ExpressionPtr<Scalar>& x) {
1718 using enum ExpressionType;
1722 if (x->is_constant(Scalar(0))) {
1728 if (x->type() == CONSTANT) {
1729 return constant_ptr(log(x->val));
1732 return make_expression_ptr<LogExpression<Scalar>>(x);
1738template <
typename Scalar>
1756 return log10(
x->val);
1759 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1761 std::string_view
name()
const override {
return "log10"; }
1766 x->adj_expr += grad_expr_l();
1771 return this->
adj / (
Scalar(std::numbers::ln10) *
x->val);
1775 return this->adj_expr / (constant_ptr(
Scalar(std::numbers::ln10)) *
x);
1783template <
typename Scalar>
1784ExpressionPtr<Scalar> log10(
const ExpressionPtr<Scalar>& x) {
1785 using enum ExpressionType;
1789 if (x->is_constant(Scalar(0))) {
1795 if (x->type() == CONSTANT) {
1796 return constant_ptr(log10(x->val));
1799 return make_expression_ptr<Log10Expression<Scalar>>(x);
1807template <
typename Scalar>
1830 return max(
a->val,
b->val);
1833 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1835 std::string_view
name()
const override {
return "max"; }
1843 a->adj_expr += grad_expr_l();
1844 b->adj_expr += grad_expr_r();
1852 ExpressionPtr<Scalar> grad_expr_l()
const {
1858 ExpressionPtr<Scalar> grad_expr_r()
const {
1870template <
typename Scalar>
1871ExpressionPtr<Scalar> max(
const ExpressionPtr<Scalar>& a,
1872 const ExpressionPtr<Scalar>& b) {
1873 using enum ExpressionType;
1877 if (a->type() == CONSTANT && b->type() == CONSTANT) {
1878 return constant_ptr(max(a->val, b->val));
1881 return make_expression_ptr<MaxExpression<Scalar>>(a, b);
1889template <
typename Scalar>
1912 return min(
a->val,
b->val);
1915 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
1917 std::string_view
name()
const override {
return "min"; }
1925 a->adj_expr += grad_expr_l();
1926 b->adj_expr += grad_expr_r();
1934 ExpressionPtr<Scalar> grad_expr_l()
const {
1940 ExpressionPtr<Scalar> grad_expr_r()
const {
1952template <
typename Scalar>
1953ExpressionPtr<Scalar> min(
const ExpressionPtr<Scalar>& a,
1954 const ExpressionPtr<Scalar>& b) {
1955 using enum ExpressionType;
1959 if (a->type() == CONSTANT && b->type() == CONSTANT) {
1960 return constant_ptr(min(a->val, b->val));
1963 return make_expression_ptr<MinExpression<Scalar>>(a, b);
1966template <
typename Scalar>
1967ExpressionPtr<Scalar> pow(
const ExpressionPtr<Scalar>& base,
1968 const ExpressionPtr<Scalar>& power);
1974template <
typename Scalar, ExpressionType T>
2001 ExpressionType
type()
const override {
return T; }
2003 std::string_view
name()
const override {
return "pow"; }
2006 base->adj += grad_l();
2007 power->adj += grad_r();
2011 base->adj_expr += grad_expr_l();
2012 power->adj_expr += grad_expr_r();
2028 ExpressionPtr<Scalar> grad_expr_l()
const {
2032 ExpressionPtr<Scalar> grad_expr_r()
const {
2042template <
typename Scalar>
2043ExpressionPtr<Scalar> pow(
const ExpressionPtr<Scalar>& base,
2044 const ExpressionPtr<Scalar>& power) {
2045 using enum ExpressionType;
2049 if (base->is_constant(Scalar(0))) {
2052 }
else if (base->is_constant(Scalar(1))) {
2056 if (power->is_constant(Scalar(0))) {
2057 return constant_ptr(Scalar(1));
2058 }
else if (power->is_constant(Scalar(1))) {
2064 if (base->type() == CONSTANT && power->type() == CONSTANT) {
2065 return constant_ptr(pow(base->val, power->val));
2068 if (power->is_constant(Scalar(2))) {
2069 if (base->type() == LINEAR) {
2070 return make_expression_ptr<MultExpression<Scalar, QUADRATIC>>(base, base);
2072 return make_expression_ptr<MultExpression<Scalar, NONLINEAR>>(base, base);
2076 return make_expression_ptr<PowExpression<Scalar, NONLINEAR>>(base, power);
2082template <
typename Scalar>
2101 }
else if (
x->val ==
Scalar(0)) {
2108 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
2110 std::string_view
name()
const override {
return "sign"; }
2117template <
typename Scalar>
2119 using enum ExpressionType;
2122 if (x->type() == CONSTANT) {
2123 if (x->val < Scalar(0)) {
2124 return constant_ptr(Scalar(-1));
2125 }
else if (x->val == Scalar(0)) {
2129 return constant_ptr(Scalar(1));
2133 return make_expression_ptr<SignExpression<Scalar>>(x);
2139template <
typename Scalar>
2159 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
2161 std::string_view
name()
const override {
return "sin"; }
2166 x->adj_expr += grad_expr_l();
2172 return this->
adj * cos(
x->val);
2182template <
typename Scalar>
2183ExpressionPtr<Scalar> sin(
const ExpressionPtr<Scalar>& x) {
2184 using enum ExpressionType;
2188 if (x->is_constant(Scalar(0))) {
2194 if (x->type() == CONSTANT) {
2195 return constant_ptr(sin(x->val));
2198 return make_expression_ptr<SinExpression<Scalar>>(x);
2204template <
typename Scalar>
2222 return sinh(
x->val);
2225 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
2227 std::string_view
name()
const override {
return "sinh"; }
2232 x->adj_expr += grad_expr_l();
2238 return this->
adj * cosh(
x->val);
2248template <
typename Scalar>
2249ExpressionPtr<Scalar> sinh(
const ExpressionPtr<Scalar>& x) {
2250 using enum ExpressionType;
2254 if (x->is_constant(Scalar(0))) {
2260 if (x->type() == CONSTANT) {
2261 return constant_ptr(sinh(x->val));
2264 return make_expression_ptr<SinhExpression<Scalar>>(x);
2270template <
typename Scalar>
2288 return sqrt(
x->val);
2291 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
2293 std::string_view
name()
const override {
return "sqrt"; }
2298 x->adj_expr += grad_expr_l();
2304 return this->
adj / (
Scalar(2) * sqrt(
x->val));
2308 return this->adj_expr / (constant_ptr(
Scalar(2)) * sqrt(
x));
2316template <
typename Scalar>
2317ExpressionPtr<Scalar> sqrt(
const ExpressionPtr<Scalar>& x) {
2318 using enum ExpressionType;
2322 if (x->type() == CONSTANT) {
2323 if (x->val == Scalar(0)) {
2326 }
else if (x->val == Scalar(1)) {
2329 return constant_ptr(sqrt(x->val));
2333 return make_expression_ptr<SqrtExpression<Scalar>>(x);
2339template <
typename Scalar>
2359 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
2361 std::string_view
name()
const override {
return "tan"; }
2366 x->adj_expr += grad_expr_l();
2373 auto c = cos(
x->val);
2374 return this->
adj / (
c *
c);
2379 return this->adj_expr / (
c *
c);
2387template <
typename Scalar>
2388ExpressionPtr<Scalar> tan(
const ExpressionPtr<Scalar>& x) {
2389 using enum ExpressionType;
2393 if (x->is_constant(Scalar(0))) {
2399 if (x->type() == CONSTANT) {
2400 return constant_ptr(tan(x->val));
2403 return make_expression_ptr<TanExpression<Scalar>>(x);
2409template <
typename Scalar>
2427 return tanh(
x->val);
2430 ExpressionType
type()
const override {
return ExpressionType::NONLINEAR; }
2432 std::string_view
name()
const override {
return "tanh"; }
2437 x->adj_expr += grad_expr_l();
2444 auto c = cosh(
x->val);
2445 return this->
adj / (
c *
c);
2450 return this->adj_expr / (
c *
c);
2458template <
typename Scalar>
2459ExpressionPtr<Scalar> tanh(
const ExpressionPtr<Scalar>& x) {
2460 using enum ExpressionType;
2464 if (x->is_constant(Scalar(0))) {
2470 if (x->type() == CONSTANT) {
2471 return constant_ptr(tanh(x->val));
2474 return make_expression_ptr<TanhExpression<Scalar>>(x);
Definition intrusive_shared_ptr.hpp:27
constexpr T * get() const noexcept
Definition intrusive_shared_ptr.hpp:178
Definition function_ref.hpp:13
Definition expression.hpp:785
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:794
ExpressionPtr< Scalar > x
Unary operator's operand.
Definition expression.hpp:787
std::string_view name() const override
Definition expression.hpp:806
constexpr AbsExpression(ExpressionPtr< Scalar > x)
Definition expression.hpp:792
ExpressionType type() const override
Definition expression.hpp:804
Scalar value() const override
Definition expression.hpp:799
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:808
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:810
Definition expression.hpp:855
constexpr AcosExpression(ExpressionPtr< Scalar > x)
Definition expression.hpp:862
ExpressionType type() const override
Definition expression.hpp:875
ExpressionPtr< Scalar > x
Unary operator's operand.
Definition expression.hpp:857
Scalar value() const override
Definition expression.hpp:870
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:879
std::string_view name() const override
Definition expression.hpp:877
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:881
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:865
Definition expression.hpp:922
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:948
constexpr AsinExpression(ExpressionPtr< Scalar > x)
Definition expression.hpp:929
ExpressionPtr< Scalar > x
Unary operator's operand.
Definition expression.hpp:924
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:932
Scalar value() const override
Definition expression.hpp:937
std::string_view name() const override
Definition expression.hpp:944
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:946
ExpressionType type() const override
Definition expression.hpp:942
Definition expression.hpp:1055
constexpr Atan2Expression(ExpressionPtr< Scalar > y, ExpressionPtr< Scalar > x)
Definition expression.hpp:1066
ExpressionPtr< Scalar > y
Binary operator's left operand.
Definition expression.hpp:1057
std::string_view name() const override
Definition expression.hpp:1082
Scalar value() const override
Definition expression.hpp:1075
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:1089
ExpressionPtr< Scalar > x
Binary operator's right operand.
Definition expression.hpp:1060
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:1084
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:1069
ExpressionType type() const override
Definition expression.hpp:1080
Definition expression.hpp:990
std::string_view name() const override
Definition expression.hpp:1012
Scalar value() const override
Definition expression.hpp:1005
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:1014
ExpressionPtr< Scalar > x
Unary operator's operand.
Definition expression.hpp:992
constexpr AtanExpression(ExpressionPtr< Scalar > x)
Definition expression.hpp:997
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:1000
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:1016
ExpressionType type() const override
Definition expression.hpp:1010
Definition expression.hpp:376
constexpr BinaryMinusExpression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Definition expression.hpp:387
Scalar value() const override
Definition expression.hpp:397
ExpressionPtr< Scalar > lhs
Binary operator's left operand.
Definition expression.hpp:378
ExpressionPtr< Scalar > rhs
Binary operator's right operand.
Definition expression.hpp:381
std::string_view name() const override
Definition expression.hpp:401
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:403
ExpressionType type() const override
Definition expression.hpp:399
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:391
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:408
Definition expression.hpp:428
ExpressionPtr< Scalar > rhs
Binary operator's right operand.
Definition expression.hpp:433
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:460
ExpressionPtr< Scalar > lhs
Binary operator's left operand.
Definition expression.hpp:430
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:455
constexpr BinaryPlusExpression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Definition expression.hpp:439
ExpressionType type() const override
Definition expression.hpp:451
Scalar value() const override
Definition expression.hpp:449
std::string_view name() const override
Definition expression.hpp:453
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:443
Definition expression.hpp:479
std::string_view name() const override
Definition expression.hpp:501
ExpressionPtr< Scalar > x
Unary operator's operand.
Definition expression.hpp:481
constexpr CbrtExpression(ExpressionPtr< Scalar > x)
Definition expression.hpp:486
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:505
ExpressionType type() const override
Definition expression.hpp:499
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:503
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:489
Scalar value() const override
Definition expression.hpp:494
Definition expression.hpp:551
ExpressionType type() const override
Definition expression.hpp:560
Scalar value() const override
Definition expression.hpp:558
std::string_view name() const override
Definition expression.hpp:562
constexpr ConstantExpression(Scalar value)
Definition expression.hpp:555
Definition expression.hpp:1135
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:1160
ExpressionType type() const override
Definition expression.hpp:1154
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:1144
Scalar value() const override
Definition expression.hpp:1149
std::string_view name() const override
Definition expression.hpp:1156
ExpressionPtr< Scalar > x
Unary operator's operand.
Definition expression.hpp:1137
constexpr CosExpression(ExpressionPtr< Scalar > x)
Definition expression.hpp:1142
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:1158
Definition expression.hpp:1199
ExpressionType type() const override
Definition expression.hpp:1219
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:1209
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:1225
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:1223
Scalar value() const override
Definition expression.hpp:1214
std::string_view name() const override
Definition expression.hpp:1221
constexpr CoshExpression(ExpressionPtr< Scalar > x)
Definition expression.hpp:1206
ExpressionPtr< Scalar > x
Unary operator's operand.
Definition expression.hpp:1201
Definition expression.hpp:574
Scalar value() const override
Definition expression.hpp:584
std::string_view name() const override
Definition expression.hpp:588
constexpr DecisionVariableExpression(Scalar value)
Definition expression.hpp:581
ExpressionType type() const override
Definition expression.hpp:586
constexpr DecisionVariableExpression()
Constructs a decision variable expression with a value of zero.
Definition expression.hpp:576
Definition expression.hpp:596
Scalar value() const override
Definition expression.hpp:616
constexpr DivExpression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Definition expression.hpp:607
ExpressionPtr< Scalar > lhs
Definition expression.hpp:598
ExpressionType type() const override
Definition expression.hpp:618
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:622
ExpressionPtr< Scalar > rhs
Definition expression.hpp:601
std::string_view name() const override
Definition expression.hpp:620
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:627
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:610
Definition expression.hpp:1264
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:1289
std::string_view name() const override
Definition expression.hpp:1285
ExpressionPtr< Scalar > x
Unary operator's operand.
Definition expression.hpp:1266
Scalar value() const override
Definition expression.hpp:1278
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:1273
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:1287
ExpressionType type() const override
Definition expression.hpp:1283
constexpr ErfExpression(ExpressionPtr< Scalar > x)
Definition expression.hpp:1271
Definition expression.hpp:1333
Scalar value() const override
Definition expression.hpp:1347
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:1358
constexpr ExpExpression(ExpressionPtr< Scalar > x)
Definition expression.hpp:1340
std::string_view name() const override
Definition expression.hpp:1354
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:1356
ExpressionType type() const override
Definition expression.hpp:1352
ExpressionPtr< Scalar > x
Unary operator's operand.
Definition expression.hpp:1335
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:1342
Definition expression.hpp:80
Scalar val
The value of the expression node.
Definition expression.hpp:85
virtual Scalar value() const =0
ExpressionPtr< Scalar > adj_expr
Definition expression.hpp:92
friend ExpressionPtr< Scalar > operator-(const ExpressionPtr< Scalar > &lhs)
Definition expression.hpp:309
virtual void accumulate_adjoints() const
Accumulates the child adjoints as Scalars.
Definition expression.hpp:365
uint32_t ref_count
Reference count for intrusive shared pointer.
Definition expression.hpp:113
friend ExpressionPtr< Scalar > operator+(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs)
Definition expression.hpp:225
int32_t scratch
Definition expression.hpp:110
constexpr bool is_constant(Scalar constant) const
Definition expression.hpp:129
Scalar adj
The adjoint of the expression node, used during autodiff.
Definition expression.hpp:88
constexpr Expression()=default
Constructs a constant expression with a value of zero.
Scalar_ Scalar
Scalar type alias.
Definition expression.hpp:82
virtual ExpressionType type() const =0
friend ExpressionPtr< Scalar > operator/(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs)
Definition expression.hpp:189
friend ExpressionPtr< Scalar > operator-(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs)
Definition expression.hpp:270
friend ExpressionPtr< Scalar > operator*(const ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs)
Definition expression.hpp:137
virtual std::string_view name() const =0
bool is_leaf
Definition expression.hpp:99
virtual void accumulate_adjoints_expr() const
Accumulates the child adjoints as Expressions.
Definition expression.hpp:368
virtual void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const
Definition expression.hpp:342
friend ExpressionPtr< Scalar > operator+=(ExpressionPtr< Scalar > &lhs, const ExpressionPtr< Scalar > &rhs)
Definition expression.hpp:261
constexpr Expression(Scalar value)
Definition expression.hpp:121
friend ExpressionPtr< Scalar > operator+(const ExpressionPtr< Scalar > &lhs)
Definition expression.hpp:335
Definition expression.hpp:1401
constexpr Hypot2Expression(ExpressionPtr< Scalar > x, ExpressionPtr< Scalar > y)
Definition expression.hpp:1412
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:1430
ExpressionPtr< Scalar > y
Binary operator's right operand.
Definition expression.hpp:1406
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:1437
std::string_view name() const override
Definition expression.hpp:1428
Scalar value() const override
Definition expression.hpp:1421
ExpressionType type() const override
Definition expression.hpp:1426
ExpressionPtr< Scalar > x
Binary operator's left operand.
Definition expression.hpp:1403
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:1415
Definition expression.hpp:1479
ExpressionPtr< Scalar > x
Ternary operator's first operand.
Definition expression.hpp:1481
ExpressionPtr< Scalar > y
Ternary operator's second operand.
Definition expression.hpp:1484
constexpr Hypot3Expression(ExpressionPtr< Scalar > x, ExpressionPtr< Scalar > y, ExpressionPtr< Scalar > z)
Definition expression.hpp:1494
std::string_view name() const override
Definition expression.hpp:1512
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:1498
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:1514
Scalar value() const override
Definition expression.hpp:1505
ExpressionPtr< Scalar > z
Ternary operator's third operand.
Definition expression.hpp:1487
ExpressionType type() const override
Definition expression.hpp:1510
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:1522
Definition expression.hpp:1566
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:1598
constexpr IfElseExpression(bool(*cond)(Scalar a, Scalar b), ExpressionPtr< Scalar > a, ExpressionPtr< Scalar > b, ExpressionPtr< Scalar > t, ExpressionPtr< Scalar > f)
Definition expression.hpp:1589
ExpressionPtr< Scalar > a
The condition's first argument.
Definition expression.hpp:1571
bool(* cond)(Scalar a, Scalar b)
Condition evaluated on a and b.
Definition expression.hpp:1568
ExpressionPtr< Scalar > b
The condition's second argument.
Definition expression.hpp:1574
ExpressionPtr< Scalar > t
Value selected when cond(a, b) is true.
Definition expression.hpp:1577
std::string_view name() const override
Definition expression.hpp:1612
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:1615
ExpressionType type() const override
Definition expression.hpp:1610
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:1623
ExpressionPtr< Scalar > f
Value selected when cond(a, b) is false.
Definition expression.hpp:1580
Scalar value() const override
Definition expression.hpp:1606
Definition expression.hpp:1739
std::string_view name() const override
Definition expression.hpp:1761
constexpr Log10Expression(ExpressionPtr< Scalar > x)
Definition expression.hpp:1746
ExpressionType type() const override
Definition expression.hpp:1759
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:1765
Scalar value() const override
Definition expression.hpp:1754
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:1763
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:1749
ExpressionPtr< Scalar > x
Unary operator's operand.
Definition expression.hpp:1741
Definition expression.hpp:1677
ExpressionPtr< Scalar > x
Unary operator's operand.
Definition expression.hpp:1679
Scalar value() const override
Definition expression.hpp:1691
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:1702
constexpr LogExpression(ExpressionPtr< Scalar > x)
Definition expression.hpp:1684
ExpressionType type() const override
Definition expression.hpp:1696
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:1686
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:1700
std::string_view name() const override
Definition expression.hpp:1698
Definition expression.hpp:1808
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:1842
ExpressionPtr< Scalar > b
Binary operator's right operand.
Definition expression.hpp:1813
Scalar value() const override
Definition expression.hpp:1828
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:1822
constexpr MaxExpression(ExpressionPtr< Scalar > a, ExpressionPtr< Scalar > b)
Definition expression.hpp:1819
ExpressionPtr< Scalar > a
Binary operator's left operand.
Definition expression.hpp:1810
ExpressionType type() const override
Definition expression.hpp:1833
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:1837
std::string_view name() const override
Definition expression.hpp:1835
Definition expression.hpp:1890
std::string_view name() const override
Definition expression.hpp:1917
ExpressionPtr< Scalar > b
Binary operator's right operand.
Definition expression.hpp:1895
ExpressionPtr< Scalar > a
Binary operator's left operand.
Definition expression.hpp:1892
constexpr MinExpression(ExpressionPtr< Scalar > a, ExpressionPtr< Scalar > b)
Definition expression.hpp:1901
ExpressionType type() const override
Definition expression.hpp:1915
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:1904
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:1919
Scalar value() const override
Definition expression.hpp:1910
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:1924
Definition expression.hpp:651
ExpressionPtr< Scalar > lhs
Binary operator's left operand.
Definition expression.hpp:653
Scalar value() const override
Definition expression.hpp:671
constexpr MultExpression(ExpressionPtr< Scalar > lhs, ExpressionPtr< Scalar > rhs)
Definition expression.hpp:662
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:677
ExpressionType type() const override
Definition expression.hpp:673
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:682
std::string_view name() const override
Definition expression.hpp:675
ExpressionPtr< Scalar > rhs
Binary operator's right operand.
Definition expression.hpp:656
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:665
Definition expression.hpp:1975
ExpressionPtr< Scalar > base
Binary operator's left operand.
Definition expression.hpp:1977
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:2010
constexpr PowExpression(ExpressionPtr< Scalar > base, ExpressionPtr< Scalar > power)
Definition expression.hpp:1986
ExpressionPtr< Scalar > power
Binary operator's right operand.
Definition expression.hpp:1980
ExpressionType type() const override
Definition expression.hpp:2001
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:2005
Scalar value() const override
Definition expression.hpp:1996
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:1990
std::string_view name() const override
Definition expression.hpp:2003
Definition expression.hpp:2083
constexpr SignExpression(ExpressionPtr< Scalar > x)
Definition expression.hpp:2090
Scalar value() const override
Definition expression.hpp:2098
ExpressionType type() const override
Definition expression.hpp:2108
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:2093
ExpressionPtr< Scalar > x
Unary operator's operand.
Definition expression.hpp:2085
std::string_view name() const override
Definition expression.hpp:2110
Definition expression.hpp:2140
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:2149
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:2163
ExpressionPtr< Scalar > x
Unary operator's operand.
Definition expression.hpp:2142
std::string_view name() const override
Definition expression.hpp:2161
Scalar value() const override
Definition expression.hpp:2154
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:2165
ExpressionType type() const override
Definition expression.hpp:2159
constexpr SinExpression(ExpressionPtr< Scalar > x)
Definition expression.hpp:2147
Definition expression.hpp:2205
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:2215
std::string_view name() const override
Definition expression.hpp:2227
ExpressionPtr< Scalar > x
Unary operator's operand.
Definition expression.hpp:2207
ExpressionType type() const override
Definition expression.hpp:2225
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:2231
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:2229
constexpr SinhExpression(ExpressionPtr< Scalar > x)
Definition expression.hpp:2212
Scalar value() const override
Definition expression.hpp:2220
Definition expression.hpp:2271
ExpressionType type() const override
Definition expression.hpp:2291
constexpr SqrtExpression(ExpressionPtr< Scalar > x)
Definition expression.hpp:2278
std::string_view name() const override
Definition expression.hpp:2293
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:2297
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:2281
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:2295
Scalar value() const override
Definition expression.hpp:2286
ExpressionPtr< Scalar > x
Unary operator's operand.
Definition expression.hpp:2273
Definition expression.hpp:2340
constexpr TanExpression(ExpressionPtr< Scalar > x)
Definition expression.hpp:2347
Scalar value() const override
Definition expression.hpp:2354
std::string_view name() const override
Definition expression.hpp:2361
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:2365
ExpressionType type() const override
Definition expression.hpp:2359
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:2363
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:2349
ExpressionPtr< Scalar > x
Unary operator's operand.
Definition expression.hpp:2342
Definition expression.hpp:2410
ExpressionPtr< Scalar > x
Unary operator's operand.
Definition expression.hpp:2412
Scalar value() const override
Definition expression.hpp:2425
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:2436
ExpressionType type() const override
Definition expression.hpp:2430
std::string_view name() const override
Definition expression.hpp:2432
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:2420
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:2434
constexpr TanhExpression(ExpressionPtr< Scalar > x)
Definition expression.hpp:2417
Definition expression.hpp:702
constexpr UnaryMinusExpression(ExpressionPtr< Scalar > lhs)
Definition expression.hpp:709
void accumulate_adjoints() const override
Accumulates the child adjoints as Scalars.
Definition expression.hpp:723
ExpressionType type() const override
Definition expression.hpp:719
void visit_args(function_ref< void(Expression< Scalar > *arg)> func) const override
Definition expression.hpp:712
void accumulate_adjoints_expr() const override
Accumulates the child adjoints as Expressions.
Definition expression.hpp:725
ExpressionPtr< Scalar > lhs
Unary operator's operand.
Definition expression.hpp:704
Scalar value() const override
Definition expression.hpp:717
std::string_view name() const override
Definition expression.hpp:721