7#include <initializer_list>
8#include <source_location>
22#ifndef SLEIPNIR_DISABLE_DIAGNOSTICS
30class AdjointExpressionGraph;
32template <
int UpLo = Eigen::Lower | Eigen::Upper>
33 requires(UpLo == Eigen::Lower) || (UpLo == (Eigen::Lower | Eigen::Upper))
50 explicit Variable(std::nullptr_t) : expr{nullptr} {}
58 : expr{
detail::make_expression_ptr<
detail::ConstExpression>(value)} {}
66 : expr{
detail::make_expression_ptr<
detail::ConstExpression>(value)} {}
90 m_graph_initialized =
false;
101#ifndef SLEIPNIR_DISABLE_DIAGNOSTICS
104 if (expr->args[0] !=
nullptr) {
105 auto location = std::source_location::current();
108 "WARNING: {}:{}: {}: Modified the value of a dependent variable",
109 location.file_name(), location.line(), location.function_name());
124 return Variable{lhs.expr * rhs.expr};
147 return Variable{lhs.expr / rhs.expr};
170 return Variable{lhs.expr + rhs.expr};
193 return Variable{lhs.expr - rhs.expr};
231 if (!m_graph_initialized) {
233 m_graph_initialized =
true;
258 bool m_graph_initialized =
false;
288 requires(UpLo == Eigen::Lower) || (UpLo == (Eigen::Lower | Eigen::Upper))
500template <
typename LHS,
typename RHS>
508 constraints.emplace_back(lhs - rhs);
510 constraints.reserve(rhs.rows() * rhs.cols());
512 for (
int row = 0; row < rhs.rows(); ++row) {
513 for (
int col = 0; col < rhs.cols(); ++col) {
515 constraints.emplace_back(lhs - rhs(row, col));
519 constraints.reserve(lhs.rows() * lhs.cols());
521 for (
int row = 0; row < lhs.rows(); ++row) {
522 for (
int col = 0; col < lhs.cols(); ++col) {
524 constraints.emplace_back(lhs(row, col) - rhs);
528 slp_assert(lhs.rows() == rhs.rows() && lhs.cols() == rhs.cols());
529 constraints.reserve(lhs.rows() * lhs.cols());
531 for (
int row = 0; row < lhs.rows(); ++row) {
532 for (
int col = 0; col < lhs.cols(); ++col) {
534 constraints.emplace_back(lhs(row, col) - rhs(row, col));
555 std::initializer_list<EqualityConstraints> equality_constraints) {
556 for (
const auto& elem : equality_constraints) {
557 constraints.insert(constraints.end(), elem.constraints.begin(),
558 elem.constraints.end());
570 const std::vector<EqualityConstraints>& equality_constraints) {
571 for (
const auto& elem : equality_constraints) {
572 constraints.insert(constraints.end(), elem.constraints.begin(),
573 elem.constraints.end());
586 template <
typename LHS,
typename RHS>
597 return std::ranges::all_of(constraints, [](
auto& constraint) {
598 return constraint.value() == 0.0;
617 std::initializer_list<InequalityConstraints> inequality_constraints) {
618 for (
const auto& elem : inequality_constraints) {
619 constraints.insert(constraints.end(), elem.constraints.begin(),
620 elem.constraints.end());
633 const std::vector<InequalityConstraints>& inequality_constraints) {
634 for (
const auto& elem : inequality_constraints) {
635 constraints.insert(constraints.end(), elem.constraints.begin(),
636 elem.constraints.end());
649 template <
typename LHS,
typename RHS>
660 return std::ranges::all_of(constraints, [](
auto& constraint) {
661 return constraint.value() >= 0.0;
672template <
typename LHS,
typename RHS>
673 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
674 (ScalarLike<RHS> || MatrixLike<RHS>) &&
675 (SleipnirType<LHS> || SleipnirType<RHS>)
687template <
typename LHS,
typename RHS>
688 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
689 (ScalarLike<RHS> || MatrixLike<RHS>) &&
690 (SleipnirType<LHS> || SleipnirType<RHS>)
702template <
typename LHS,
typename RHS>
703 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
704 (ScalarLike<RHS> || MatrixLike<RHS>) &&
705 (SleipnirType<LHS> || SleipnirType<RHS>)
717template <
typename LHS,
typename RHS>
718 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
719 (ScalarLike<RHS> || MatrixLike<RHS>) &&
720 (SleipnirType<LHS> || SleipnirType<RHS>)
732template <
typename LHS,
typename RHS>
733 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
734 (ScalarLike<RHS> || MatrixLike<RHS>) &&
735 (SleipnirType<LHS> || SleipnirType<RHS>)
748struct NumTraits<
slp::Variable> : NumTraits<double> {
757 static constexpr int IsComplex = 0;
759 static constexpr int IsInteger = 0;
761 static constexpr int IsSigned = 1;
763 static constexpr int RequireInitialization = 1;
765 static constexpr int ReadCost = 1;
767 static constexpr int AddCost = 3;
769 static constexpr int MulCost = 3;
#define slp_assert(condition)
Abort in C++.
Definition assert.hpp:27
sign
Definition base.h:682
This class calculates the Hessian of a variable with respect to a vector of variables.
Definition hessian.hpp:30
This class calculates the Jacobian of a vector of variables with respect to a vector of variables.
Definition jacobian.hpp:26
An autodiff variable pointing to an expression node.
Definition variable.hpp:40
Variable(detail::ExpressionPtr &&expr)
Constructs a Variable pointing to the specified expression.
Definition variable.hpp:80
friend SLEIPNIR_DLLEXPORT Variable operator+(const Variable &lhs)
Unary plus operator.
Definition variable.hpp:221
friend SLEIPNIR_DLLEXPORT Variable operator*(const Variable &lhs, const Variable &rhs)
Variable-Variable multiplication operator.
Definition variable.hpp:122
Variable & operator=(double value)
Assignment operator for double.
Definition variable.hpp:88
Variable(std::nullptr_t)
Constructs an empty Variable.
Definition variable.hpp:50
Variable & operator-=(const Variable &rhs)
Variable-Variable compound subtraction operator.
Definition variable.hpp:202
friend SLEIPNIR_DLLEXPORT Variable operator-(const Variable &lhs)
Unary minus operator.
Definition variable.hpp:212
friend SLEIPNIR_DLLEXPORT Variable operator+(const Variable &lhs, const Variable &rhs)
Variable-Variable addition operator.
Definition variable.hpp:168
Variable & operator+=(const Variable &rhs)
Variable-Variable compound addition operator.
Definition variable.hpp:179
friend SLEIPNIR_DLLEXPORT Variable operator-(const Variable &lhs, const Variable &rhs)
Variable-Variable subtraction operator.
Definition variable.hpp:191
Variable & operator*=(const Variable &rhs)
Variable-Variable compound multiplication operator.
Definition variable.hpp:133
Variable(std::floating_point auto value)
Constructs a Variable from a floating point type.
Definition variable.hpp:57
friend SLEIPNIR_DLLEXPORT Variable operator/(const Variable &lhs, const Variable &rhs)
Variable-Variable division operator.
Definition variable.hpp:145
Variable()=default
Constructs a linear Variable with a value of zero.
Variable(std::integral auto value)
Constructs a Variable from an integral type.
Definition variable.hpp:65
void set_value(double value)
Sets Variable's internal value.
Definition variable.hpp:100
Variable & operator/=(const Variable &rhs)
Variable-Variable compound division operator.
Definition variable.hpp:156
ExpressionType type() const
Returns the type of this expression (constant, linear, quadratic, or nonlinear).
Definition variable.hpp:246
double value()
Returns the value of this variable.
Definition variable.hpp:230
Variable(const detail::ExpressionPtr &expr)
Constructs a Variable pointing to the specified expression.
Definition variable.hpp:73
This class is an adaptor type that performs value updates of an expression's adjoint graph.
Definition adjoint_expression_graph.hpp:22
Definition concepts.hpp:40
Definition concepts.hpp:13
Definition concepts.hpp:37
Definition variable.hpp:742
Converts a string literal into a format string that will be parsed at compile time and converted into...
Definition printf.h:50
wpi::SmallVector< T > small_vector
Definition small_vector.hpp:10
ExpressionPtr log10(const ExpressionPtr &x)
std::log10() for Expressions.
Definition expression.hpp:1386
ExpressionPtr tanh(const ExpressionPtr &x)
std::tanh() for Expressions.
Definition expression.hpp:1794
gch::small_vector< Expression * > topological_sort(const ExpressionPtr &root)
Generate a topological sort of an expression graph from parent to child.
Definition expression_graph.hpp:20
ExpressionPtr sqrt(const ExpressionPtr &x)
std::sqrt() for Expressions.
Definition expression.hpp:1695
ExpressionPtr tan(const ExpressionPtr &x)
std::tan() for Expressions.
Definition expression.hpp:1745
ExpressionPtr pow(const ExpressionPtr &base, const ExpressionPtr &power)
std::pow() for Expressions.
Definition expression.hpp:1473
ExpressionPtr exp(const ExpressionPtr &x)
std::exp() for Expressions.
Definition expression.hpp:1224
ExpressionPtr hypot(const ExpressionPtr &x, const ExpressionPtr &y)
std::hypot() for Expressions.
Definition expression.hpp:1286
ExpressionPtr atan(const ExpressionPtr &x)
std::atan() for Expressions.
Definition expression.hpp:964
ExpressionPtr erf(const ExpressionPtr &x)
std::erf() for Expressions.
Definition expression.hpp:1175
ExpressionPtr sinh(const ExpressionPtr &x)
std::sinh() for Expressions.
Definition expression.hpp:1645
ExpressionPtr acos(const ExpressionPtr &x)
std::acos() for Expressions.
Definition expression.hpp:866
ExpressionPtr cosh(const ExpressionPtr &x)
std::cosh() for Expressions.
Definition expression.hpp:1124
void update_values(const gch::small_vector< Expression * > &list)
Update the values of all nodes in this graph based on the values of their dependent nodes.
Definition expression_graph.hpp:77
ExpressionPtr atan2(const ExpressionPtr &y, const ExpressionPtr &x)
std::atan2() for Expressions.
Definition expression.hpp:1025
ExpressionPtr cos(const ExpressionPtr &x)
std::cos() for Expressions.
Definition expression.hpp:1076
static ExpressionPtr make_expression_ptr(Args &&... args)
Creates an intrusive shared pointer to an expression from the global pool allocator.
Definition expression.hpp:48
ExpressionPtr cbrt(const ExpressionPtr &x)
std::cbrt() for Expressions.
Definition expression.hpp:547
ExpressionPtr log(const ExpressionPtr &x)
std::log() for Expressions.
Definition expression.hpp:1336
ExpressionPtr sin(const ExpressionPtr &x)
std::sin() for Expressions.
Definition expression.hpp:1596
ExpressionPtr abs(const ExpressionPtr &x)
std::abs() for Expressions.
Definition expression.hpp:816
ExpressionPtr asin(const ExpressionPtr &x)
std::asin() for Expressions.
Definition expression.hpp:915
Definition expression_graph.hpp:11
SLEIPNIR_DLLEXPORT Variable sinh(const Variable &x)
std::sinh() for Variables.
Definition variable.hpp:446
ExpressionType
Expression type.
Definition expression_type.hpp:18
gch::small_vector< Variable > make_constraints(LHS &&lhs, RHS &&rhs)
Make a list of constraints.
Definition variable.hpp:504
SLEIPNIR_DLLEXPORT Variable log10(const Variable &x)
std::log10() for Variables.
Definition variable.hpp:419
SLEIPNIR_DLLEXPORT Variable cos(const Variable &x)
std::cos() for Variables.
Definition variable.hpp:353
SLEIPNIR_DLLEXPORT Variable erf(const Variable &x)
std::erf() for Variables.
Definition variable.hpp:371
SLEIPNIR_DLLEXPORT Variable cbrt(const Variable &x)
std::cbrt() for Variables.
Definition variable.hpp:344
SLEIPNIR_DLLEXPORT Variable acos(const Variable &x)
std::acos() for Variables.
Definition variable.hpp:307
SLEIPNIR_DLLEXPORT Variable pow(const Variable &base, const Variable &power)
std::pow() for Variables.
Definition variable.hpp:400
SLEIPNIR_DLLEXPORT Variable log(const Variable &x)
std::log() for Variables.
Definition variable.hpp:410
SLEIPNIR_DLLEXPORT Variable sqrt(const Variable &x)
std::sqrt() for Variables.
Definition variable.hpp:455
SLEIPNIR_DLLEXPORT Variable atan(const Variable &x)
std::atan() for Variables.
Definition variable.hpp:325
SLEIPNIR_DLLEXPORT Variable abs(const Variable &x)
std::abs() for Variables.
Definition variable.hpp:298
void println(fmt::format_string< T... > fmt, T &&... args)
Wrapper around fmt::println() that squelches write failure exceptions.
Definition print.hpp:48
SLEIPNIR_DLLEXPORT Variable tanh(const Variable &x)
std::tanh() for Variables.
Definition variable.hpp:473
SLEIPNIR_DLLEXPORT Variable hypot(const Variable &x, const Variable &y)
std::hypot() for Variables.
Definition variable.hpp:390
SLEIPNIR_DLLEXPORT Variable atan2(const Variable &y, const Variable &x)
std::atan2() for Variables.
Definition variable.hpp:335
SLEIPNIR_DLLEXPORT Variable sin(const Variable &x)
std::sin() for Variables.
Definition variable.hpp:437
SLEIPNIR_DLLEXPORT Variable asin(const Variable &x)
std::asin() for Variables.
Definition variable.hpp:316
SLEIPNIR_DLLEXPORT Variable cosh(const Variable &x)
std::cosh() for Variables.
Definition variable.hpp:362
Definition PointerIntPair.h:280
A vector of equality constraints of the form cₑ(x) = 0.
Definition variable.hpp:545
gch::small_vector< Variable > constraints
A vector of scalar equality constraints.
Definition variable.hpp:547
EqualityConstraints(std::initializer_list< EqualityConstraints > equality_constraints)
Concatenates multiple equality constraints.
Definition variable.hpp:554
EqualityConstraints(const std::vector< EqualityConstraints > &equality_constraints)
Concatenates multiple equality constraints.
Definition variable.hpp:569
EqualityConstraints(LHS &&lhs, RHS &&rhs)
Constructs an equality constraint from a left and right side.
Definition variable.hpp:590
A vector of inequality constraints of the form cᵢ(x) ≥ 0.
Definition variable.hpp:606
InequalityConstraints(const std::vector< InequalityConstraints > &inequality_constraints)
Concatenates multiple inequality constraints.
Definition variable.hpp:632
InequalityConstraints(std::initializer_list< InequalityConstraints > inequality_constraints)
Concatenates multiple inequality constraints.
Definition variable.hpp:616
InequalityConstraints(LHS &&lhs, RHS &&rhs)
Constructs an inequality constraint from a left and right side.
Definition variable.hpp:653
gch::small_vector< Variable > constraints
A vector of scalar inequality constraints.
Definition variable.hpp:608
#define SLEIPNIR_DLLEXPORT
Definition symbol_exports.hpp:34