Sleipnir C++ API
Loading...
Searching...
No Matches
variable.hpp
1// Copyright (c) Sleipnir contributors
2
3#pragma once
4
5#include <algorithm>
6#include <concepts>
7#include <initializer_list>
8#include <source_location>
9#include <utility>
10#include <vector>
11
12#include <Eigen/Core>
13#include <gch/small_vector.hpp>
14
15#include "sleipnir/autodiff/expression.hpp"
16#include "sleipnir/autodiff/expression_graph.hpp"
17#include "sleipnir/autodiff/sleipnir_base.hpp"
18#include "sleipnir/util/assert.hpp"
19#include "sleipnir/util/concepts.hpp"
20
21#ifndef SLEIPNIR_DISABLE_DIAGNOSTICS
22#include "sleipnir/util/print.hpp"
23#endif
24
25namespace slp {
26
27// Forward declarations for friend declarations in Variable
28
29namespace detail {
30
31template <typename Scalar>
32class GradientExpressionGraph;
33
34} // namespace detail
35
36template <typename Scalar, int UpLo = Eigen::Lower | Eigen::Upper>
37 requires(UpLo == Eigen::Lower) || (UpLo == (Eigen::Lower | Eigen::Upper))
38class Hessian;
39
40template <typename Scalar>
41class Jacobian;
42
46template <typename Scalar_>
47class Variable : public SleipnirBase {
48 public:
50 using Scalar = Scalar_;
51
53 Variable() = default;
54
56 explicit constexpr Variable(std::nullptr_t) : expr{nullptr} {}
57
61 // NOLINTNEXTLINE (google-explicit-constructor)
63 requires(!MatrixLike<Scalar>)
64 : expr{detail::make_expression_ptr<detail::ConstantExpression<Scalar>>(
65 value)} {}
66
70 // NOLINTNEXTLINE (google-explicit-constructor)
72 slp_assert(value.rows() == 1 && value.cols() == 1);
73 }
74
78 // NOLINTNEXTLINE (google-explicit-constructor)
79 Variable(std::floating_point auto value)
80 : expr{detail::make_expression_ptr<detail::ConstantExpression<Scalar>>(
81 Scalar(value))} {}
82
86 // NOLINTNEXTLINE (google-explicit-constructor)
87 Variable(std::integral auto value)
88 : expr{detail::make_expression_ptr<detail::ConstantExpression<Scalar>>(
89 Scalar(value))} {}
90
94 explicit Variable(const detail::ExpressionPtr<Scalar>& expr) : expr{expr} {}
95
99 explicit constexpr Variable(detail::ExpressionPtr<Scalar>&& expr)
100 : expr{std::move(expr)} {}
101
107 expr =
108 detail::make_expression_ptr<detail::ConstantExpression<Scalar>>(value);
109 m_graph_initialized = false;
110
111 return *this;
112 }
113
118#ifndef SLEIPNIR_DISABLE_DIAGNOSTICS
119 // We only need to check the first argument since unary and binary operators
120 // both use it
121 if (expr->args[0] != nullptr) {
122 auto location = std::source_location::current();
123 slp::println(
124 stderr,
125 "WARNING: {}:{}: {}: Modified the value of a dependent variable",
126 location.file_name(), location.line(), location.function_name());
127 }
128#endif
129 expr->val = Scalar(value);
130 }
131
136 if (!m_graph_initialized) {
137 m_graph = detail::topological_sort(expr);
138 m_graph_initialized = true;
139 }
140 detail::update_values(m_graph);
141
142 return Scalar(expr->val);
143 }
144
149 ExpressionType type() const { return expr->type(); }
150
156 template <ScalarLike LHS, SleipnirScalarLike<Scalar> RHS>
157 friend Variable<Scalar> operator*(const LHS& lhs, const RHS& rhs) {
158 return Variable{Variable<Scalar>{lhs}.expr * rhs.expr};
159 }
160
166 template <SleipnirScalarLike<Scalar> LHS, ScalarLike RHS>
167 friend Variable<Scalar> operator*(const LHS& lhs, const RHS& rhs) {
168 return Variable{lhs.expr * Variable<Scalar>{rhs}.expr};
169 }
170
177 const Variable<Scalar>& rhs) {
178 return Variable{lhs.expr * rhs.expr};
179 }
180
186 *this = *this * rhs;
187 return *this;
188 }
189
196 const Variable<Scalar>& rhs) {
197 return Variable{lhs.expr / rhs.expr};
198 }
199
205 *this = *this / rhs;
206 return *this;
207 }
208
215 const Variable<Scalar>& rhs) {
216 return Variable{lhs.expr + rhs.expr};
217 }
218
224 *this = *this + rhs;
225 return *this;
226 }
227
234 const Variable<Scalar>& rhs) {
235 return Variable{lhs.expr - rhs.expr};
236 }
237
243 *this = *this - rhs;
244 return *this;
245 }
246
251 return Variable{-lhs.expr};
252 }
253
258 return Variable{+lhs.expr};
259 }
260
261 private:
264 detail::make_expression_ptr<detail::DecisionVariableExpression<Scalar>>();
265
268 gch::small_vector<detail::Expression<Scalar>*> m_graph;
269
271 bool m_graph_initialized = false;
272
273 template <typename Scalar>
274 friend Variable<Scalar> abs(const Variable<Scalar>& x);
275 template <typename Scalar>
276 friend Variable<Scalar> acos(const Variable<Scalar>& x);
277 template <typename Scalar>
278 friend Variable<Scalar> asin(const Variable<Scalar>& x);
279 template <typename Scalar>
280 friend Variable<Scalar> atan(const Variable<Scalar>& x);
281 template <typename Scalar>
282 friend Variable<Scalar> atan2(const ScalarLike auto& y,
283 const Variable<Scalar>& x);
284 template <typename Scalar>
285 friend Variable<Scalar> atan2(const Variable<Scalar>& y,
286 const ScalarLike auto& x);
287 template <typename Scalar>
288 friend Variable<Scalar> atan2(const Variable<Scalar>& y,
289 const Variable<Scalar>& x);
290 template <typename Scalar>
291 friend Variable<Scalar> cbrt(const Variable<Scalar>& x);
292 template <typename Scalar>
293 friend Variable<Scalar> cos(const Variable<Scalar>& x);
294 template <typename Scalar>
295 friend Variable<Scalar> cosh(const Variable<Scalar>& x);
296 template <typename Scalar>
297 friend Variable<Scalar> erf(const Variable<Scalar>& x);
298 template <typename Scalar>
299 friend Variable<Scalar> exp(const Variable<Scalar>& x);
300 template <typename Scalar>
301 friend Variable<Scalar> hypot(const ScalarLike auto& x,
302 const Variable<Scalar>& y);
303 template <typename Scalar>
304 friend Variable<Scalar> hypot(const Variable<Scalar>& x,
305 const ScalarLike auto& y);
306 template <typename Scalar>
307 friend Variable<Scalar> hypot(const Variable<Scalar>& x,
308 const Variable<Scalar>& y);
309 template <typename Scalar>
310 friend Variable<Scalar> log(const Variable<Scalar>& x);
311 template <typename Scalar>
312 friend Variable<Scalar> log10(const Variable<Scalar>& x);
313 template <typename Scalar>
314 friend Variable<Scalar> max(const ScalarLike auto& a,
315 const Variable<Scalar>& b);
316 template <typename Scalar>
317 friend Variable<Scalar> max(const Variable<Scalar>& a,
318 const ScalarLike auto& b);
319 template <typename Scalar>
320 friend Variable<Scalar> max(const Variable<Scalar>& a,
321 const Variable<Scalar>& b);
322 template <typename Scalar>
323 friend Variable<Scalar> min(const ScalarLike auto& a,
324 const Variable<Scalar>& b);
325 template <typename Scalar>
326 friend Variable<Scalar> min(const Variable<Scalar>& a,
327 const ScalarLike auto& b);
328 template <typename Scalar>
329 friend Variable<Scalar> min(const Variable<Scalar>& a,
330 const Variable<Scalar>& b);
331 template <typename Scalar>
332 friend Variable<Scalar> pow(const ScalarLike auto& base,
333 const Variable<Scalar>& power);
334 template <typename Scalar>
335 friend Variable<Scalar> pow(const Variable<Scalar>& base,
336 const ScalarLike auto& power);
337 template <typename Scalar>
338 friend Variable<Scalar> pow(const Variable<Scalar>& base,
339 const Variable<Scalar>& power);
340 template <typename Scalar>
341 friend Variable<Scalar> sign(const Variable<Scalar>& x);
342 template <typename Scalar>
343 friend Variable<Scalar> sin(const Variable<Scalar>& x);
344 template <typename Scalar>
345 friend Variable<Scalar> sinh(const Variable<Scalar>& x);
346 template <typename Scalar>
347 friend Variable<Scalar> sqrt(const Variable<Scalar>& x);
348 template <typename Scalar>
349 friend Variable<Scalar> tan(const Variable<Scalar>& x);
350 template <typename Scalar>
351 friend Variable<Scalar> tanh(const Variable<Scalar>& x);
352 template <typename Scalar>
353 friend Variable<Scalar> hypot(const Variable<Scalar>& x,
354 const Variable<Scalar>& y,
355 const Variable<Scalar>& z);
356
358 template <typename Scalar, int UpLo>
359 requires(UpLo == Eigen::Lower) || (UpLo == (Eigen::Lower | Eigen::Upper))
360 friend class Hessian;
361 template <typename Scalar>
362 friend class Jacobian;
363};
364
365template <template <typename> typename T, typename Scalar>
366 requires SleipnirMatrixLike<T<Scalar>, Scalar>
367Variable(T<Scalar>) -> Variable<Scalar>;
368
369template <std::floating_point T>
370Variable(T) -> Variable<T>;
371
372template <std::integral T>
373Variable(T) -> Variable<T>;
374
379template <typename Scalar>
380Variable<Scalar> abs(const Variable<Scalar>& x) {
381 return Variable{detail::abs(x.expr)};
382}
383
388template <typename Scalar>
389Variable<Scalar> acos(const Variable<Scalar>& x) {
390 return Variable{detail::acos(x.expr)};
391}
392
397template <typename Scalar>
398Variable<Scalar> asin(const Variable<Scalar>& x) {
399 return Variable{detail::asin(x.expr)};
400}
401
406template <typename Scalar>
407Variable<Scalar> atan(const Variable<Scalar>& x) {
408 return Variable{detail::atan(x.expr)};
409}
410
416template <typename Scalar>
417Variable<Scalar> atan2(const ScalarLike auto& y, const Variable<Scalar>& x) {
418 return Variable{detail::atan2(Variable<Scalar>(y).expr, x.expr)};
419}
420
426template <typename Scalar>
427Variable<Scalar> atan2(const Variable<Scalar>& y, const ScalarLike auto& x) {
428 return Variable{detail::atan2(y.expr, Variable<Scalar>(x).expr)};
429}
430
436template <typename Scalar>
437Variable<Scalar> atan2(const Variable<Scalar>& y, const Variable<Scalar>& x) {
438 return Variable{detail::atan2(y.expr, x.expr)};
439}
440
445template <typename Scalar>
446Variable<Scalar> cbrt(const Variable<Scalar>& x) {
447 return Variable{detail::cbrt(x.expr)};
448}
449
454template <typename Scalar>
455Variable<Scalar> cos(const Variable<Scalar>& x) {
456 return Variable{detail::cos(x.expr)};
457}
458
463template <typename Scalar>
464Variable<Scalar> cosh(const Variable<Scalar>& x) {
465 return Variable{detail::cosh(x.expr)};
466}
467
472template <typename Scalar>
473Variable<Scalar> erf(const Variable<Scalar>& x) {
474 return Variable{detail::erf(x.expr)};
475}
476
481template <typename Scalar>
482Variable<Scalar> exp(const Variable<Scalar>& x) {
483 return Variable{detail::exp(x.expr)};
484}
485
491template <typename Scalar>
492Variable<Scalar> hypot(const ScalarLike auto& x, const Variable<Scalar>& y) {
493 return Variable{detail::hypot(Variable<Scalar>(x).expr, y.expr)};
494}
495
501template <typename Scalar>
502Variable<Scalar> hypot(const Variable<Scalar>& x, const ScalarLike auto& y) {
503 return Variable{detail::hypot(x.expr, Variable<Scalar>(y).expr)};
504}
505
511template <typename Scalar>
512Variable<Scalar> hypot(const Variable<Scalar>& x, const Variable<Scalar>& y) {
513 return Variable{detail::hypot(x.expr, y.expr)};
514}
515
520template <typename Scalar>
521Variable<Scalar> log(const Variable<Scalar>& x) {
522 return Variable{detail::log(x.expr)};
523}
524
529template <typename Scalar>
530Variable<Scalar> log10(const Variable<Scalar>& x) {
531 return Variable{detail::log10(x.expr)};
532}
533
541template <typename Scalar>
542Variable<Scalar> max(const ScalarLike auto& a, const Variable<Scalar>& b) {
543 return Variable{detail::max(Variable<Scalar>(a).expr, b.expr)};
544}
545
553template <typename Scalar>
554Variable<Scalar> max(const Variable<Scalar>& a, const ScalarLike auto& b) {
555 return Variable{detail::max(a.expr, Variable<Scalar>(b).expr)};
556}
557
565template <typename Scalar>
566Variable<Scalar> max(const Variable<Scalar>& a, const Variable<Scalar>& b) {
567 return Variable{detail::max(a.expr, b.expr)};
568}
569
577template <typename Scalar>
578Variable<Scalar> min(const ScalarLike auto& a, const Variable<Scalar>& b) {
579 return Variable{detail::min(Variable<Scalar>(a).expr, b.expr)};
580}
581
589template <typename Scalar>
590Variable<Scalar> min(const Variable<Scalar>& a, const ScalarLike auto& b) {
591 return Variable{detail::min(a.expr, Variable<Scalar>(b).expr)};
592}
593
601template <typename Scalar>
602Variable<Scalar> min(const Variable<Scalar>& a, const Variable<Scalar>& b) {
603 return Variable{detail::min(a.expr, b.expr)};
604}
605
611template <typename Scalar>
612Variable<Scalar> pow(const ScalarLike auto& base,
613 const Variable<Scalar>& power) {
614 return Variable{detail::pow(Variable<Scalar>(base).expr, power.expr)};
615}
616
622template <typename Scalar>
623Variable<Scalar> pow(const Variable<Scalar>& base,
624 const ScalarLike auto& power) {
625 return Variable{detail::pow(base.expr, Variable<Scalar>(power).expr)};
626}
627
633template <typename Scalar>
634Variable<Scalar> pow(const Variable<Scalar>& base,
635 const Variable<Scalar>& power) {
636 return Variable{detail::pow(base.expr, power.expr)};
637}
638
643template <typename Scalar>
644Variable<Scalar> sign(const Variable<Scalar>& x) {
645 return Variable{detail::sign(x.expr)};
646}
647
652template <typename Scalar>
653Variable<Scalar> sin(const Variable<Scalar>& x) {
654 return Variable{detail::sin(x.expr)};
655}
656
661template <typename Scalar>
662Variable<Scalar> sinh(const Variable<Scalar>& x) {
663 return Variable{detail::sinh(x.expr)};
664}
665
670template <typename Scalar>
671Variable<Scalar> sqrt(const Variable<Scalar>& x) {
672 return Variable{detail::sqrt(x.expr)};
673}
674
679template <typename Scalar>
680Variable<Scalar> tan(const Variable<Scalar>& x) {
681 return Variable{detail::tan(x.expr)};
682}
683
688template <typename Scalar>
689Variable<Scalar> tanh(const Variable<Scalar>& x) {
690 return Variable{detail::tanh(x.expr)};
691}
692
699template <typename Scalar>
700Variable<Scalar> hypot(const Variable<Scalar>& x, const Variable<Scalar>& y,
701 const Variable<Scalar>& z) {
702 return Variable{sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2))};
703}
704
705// The standard form for equality constraints is c(x) = 0, and the standard form
706// for inequality constraints is c(x) ≥ 0. make_constraints() takes constraints
707// of the form lhs = rhs or lhs ≥ rhs and converts them to lhs - rhs = 0 or
708// lhs - rhs ≥ 0.
709
710template <typename Scalar, ScalarLike LHS, ScalarLike RHS>
711 requires SleipnirScalarLike<LHS, Scalar> || SleipnirScalarLike<RHS, Scalar>
712auto make_constraints(LHS&& lhs, RHS&& rhs) {
713 gch::small_vector<Variable<Scalar>> constraints;
714 constraints.emplace_back(lhs - rhs);
715
716 return constraints;
717}
718
719template <typename Scalar, ScalarLike LHS, MatrixLike RHS>
720 requires SleipnirScalarLike<LHS, Scalar> || SleipnirMatrixLike<RHS, Scalar>
721auto make_constraints(LHS&& lhs, RHS&& rhs) {
722 gch::small_vector<Variable<Scalar>> constraints;
723 constraints.reserve(rhs.rows() * rhs.cols());
724
725 for (int row = 0; row < rhs.rows(); ++row) {
726 for (int col = 0; col < rhs.cols(); ++col) {
727 // Make right-hand side zero
728 constraints.emplace_back(lhs - rhs[row, col]);
729 }
730 }
731
732 return constraints;
733}
734
735template <typename Scalar, MatrixLike LHS, ScalarLike RHS>
736 requires SleipnirMatrixLike<LHS, Scalar> || SleipnirScalarLike<RHS, Scalar>
737auto make_constraints(LHS&& lhs, RHS&& rhs) {
738 gch::small_vector<Variable<Scalar>> constraints;
739 constraints.reserve(lhs.rows() * lhs.cols());
740
741 for (int row = 0; row < lhs.rows(); ++row) {
742 for (int col = 0; col < lhs.cols(); ++col) {
743 // Make right-hand side zero
744 constraints.emplace_back(lhs[row, col] - rhs);
745 }
746 }
747
748 return constraints;
749}
750
751template <typename Scalar, MatrixLike LHS, MatrixLike RHS>
752 requires SleipnirMatrixLike<LHS, Scalar> || SleipnirMatrixLike<RHS, Scalar>
753auto make_constraints(LHS&& lhs, RHS&& rhs) {
754 slp_assert(lhs.rows() == rhs.rows() && lhs.cols() == rhs.cols());
755
756 gch::small_vector<Variable<Scalar>> constraints;
757 constraints.reserve(lhs.rows() * lhs.cols());
758
759 for (int row = 0; row < lhs.rows(); ++row) {
760 for (int col = 0; col < lhs.cols(); ++col) {
761 // Make right-hand side zero
762 constraints.emplace_back(lhs[row, col] - rhs[row, col]);
763 }
764 }
765
766 return constraints;
767}
768
772template <typename Scalar>
775 gch::small_vector<Variable<Scalar>> constraints;
776
782 std::initializer_list<EqualityConstraints> equality_constraints) {
783 for (const auto& elem : equality_constraints) {
784 constraints.insert(constraints.end(), elem.constraints.begin(),
785 elem.constraints.end());
786 }
787 }
788
796 const std::vector<EqualityConstraints>& equality_constraints) {
797 for (const auto& elem : equality_constraints) {
798 constraints.insert(constraints.end(), elem.constraints.begin(),
799 elem.constraints.end());
800 }
801 }
802
810 template <typename LHS, typename RHS>
811 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
816
818 // NOLINTNEXTLINE (google-explicit-constructor)
819 operator bool() {
820 return std::ranges::all_of(constraints, [](auto& constraint) {
821 return constraint.value() == Scalar(0);
822 });
823 }
824};
825
829template <typename Scalar>
832 gch::small_vector<Variable<Scalar>> constraints;
833
839 std::initializer_list<InequalityConstraints> inequality_constraints) {
840 for (const auto& elem : inequality_constraints) {
841 constraints.insert(constraints.end(), elem.constraints.begin(),
842 elem.constraints.end());
843 }
844 }
845
853 const std::vector<InequalityConstraints>& inequality_constraints) {
854 for (const auto& elem : inequality_constraints) {
855 constraints.insert(constraints.end(), elem.constraints.begin(),
856 elem.constraints.end());
857 }
858 }
859
868 template <typename LHS, typename RHS>
869 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
874
876 // NOLINTNEXTLINE (google-explicit-constructor)
877 operator bool() {
878 return std::ranges::all_of(constraints, [](auto& constraint) {
879 return constraint.value() >= Scalar(0);
880 });
881 }
882};
883
888template <typename LHS, typename RHS>
889 requires(ScalarLike<LHS> || MatrixLike<LHS>) && SleipnirType<LHS> &&
890 (ScalarLike<RHS> || MatrixLike<RHS>) && (!SleipnirType<RHS>)
891auto operator==(LHS&& lhs, RHS&& rhs) {
892 return EqualityConstraints<typename std::decay_t<LHS>::Scalar>{lhs, rhs};
893}
894
899template <typename LHS, typename RHS>
900 requires(ScalarLike<LHS> || MatrixLike<LHS>) && (!SleipnirType<LHS>) &&
901 (ScalarLike<RHS> || MatrixLike<RHS>) && SleipnirType<RHS>
902auto operator==(LHS&& lhs, RHS&& rhs) {
903 return EqualityConstraints<typename std::decay_t<RHS>::Scalar>{lhs, rhs};
904}
905
910template <typename LHS, typename RHS>
911 requires(ScalarLike<LHS> || MatrixLike<LHS>) && SleipnirType<LHS> &&
912 (ScalarLike<RHS> || MatrixLike<RHS>) && SleipnirType<RHS>
913auto operator==(LHS&& lhs, RHS&& rhs) {
914 return EqualityConstraints<typename std::decay_t<LHS>::Scalar>{lhs, rhs};
915}
916
922template <typename LHS, typename RHS>
923 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
924 (ScalarLike<RHS> || MatrixLike<RHS>) &&
925 (SleipnirType<LHS> || SleipnirType<RHS>)
926auto operator<(LHS&& lhs, RHS&& rhs) {
927 return rhs >= lhs;
928}
929
935template <typename LHS, typename RHS>
936 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
937 (ScalarLike<RHS> || MatrixLike<RHS>) &&
938 (SleipnirType<LHS> || SleipnirType<RHS>)
939auto operator<=(LHS&& lhs, RHS&& rhs) {
940 return rhs >= lhs;
941}
942
948template <typename LHS, typename RHS>
949 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
950 (ScalarLike<RHS> || MatrixLike<RHS>) &&
951 (SleipnirType<LHS> || SleipnirType<RHS>)
952auto operator>(LHS&& lhs, RHS&& rhs) {
953 return lhs >= rhs;
954}
955
961template <typename LHS, typename RHS>
962 requires(ScalarLike<LHS> || MatrixLike<LHS>) && SleipnirType<LHS> &&
963 (ScalarLike<RHS> || MatrixLike<RHS>) && (!SleipnirType<RHS>)
964auto operator>=(LHS&& lhs, RHS&& rhs) {
965 return InequalityConstraints<typename std::decay_t<LHS>::Scalar>{lhs, rhs};
966}
967
973template <typename LHS, typename RHS>
974 requires(ScalarLike<LHS> || MatrixLike<LHS>) && (!SleipnirType<LHS>) &&
975 (ScalarLike<RHS> || MatrixLike<RHS>) && SleipnirType<RHS>
976auto operator>=(LHS&& lhs, RHS&& rhs) {
977 return InequalityConstraints<typename std::decay_t<RHS>::Scalar>{lhs, rhs};
978}
979
985template <typename LHS, typename RHS>
986 requires(ScalarLike<LHS> || MatrixLike<LHS>) && SleipnirType<LHS> &&
987 (ScalarLike<RHS> || MatrixLike<RHS>) && SleipnirType<RHS>
988auto operator>=(LHS&& lhs, RHS&& rhs) {
989 return InequalityConstraints<typename std::decay_t<LHS>::Scalar>{lhs, rhs};
990}
991
997template <typename L, typename X, typename U>
998 requires(ScalarLike<L> || MatrixLike<L>) && SleipnirType<X> &&
999 (ScalarLike<U> || MatrixLike<U>)
1000auto bounds(L&& l, X&& x, U&& u) {
1001 return InequalityConstraints{l <= x, x <= u};
1002}
1003
1004} // namespace slp
1005
1006namespace Eigen {
1007
1012template <typename Scalar>
1013struct NumTraits<slp::Variable<Scalar>> : NumTraits<Scalar> {
1020
1022 static constexpr int IsComplex = 0;
1024 static constexpr int IsInteger = 0;
1026 static constexpr int IsSigned = 1;
1028 static constexpr int RequireInitialization = 1;
1030 static constexpr int ReadCost = 1;
1032 static constexpr int AddCost = 3;
1034 static constexpr int MulCost = 3;
1035};
1036
1037} // namespace Eigen
Definition hessian.hpp:28
Definition intrusive_shared_ptr.hpp:27
Definition jacobian.hpp:28
Definition sleipnir_base.hpp:9
Definition variable.hpp:47
ExpressionType type() const
Definition variable.hpp:149
friend Variable< Scalar > operator*(const LHS &lhs, const RHS &rhs)
Definition variable.hpp:157
Variable(const detail::ExpressionPtr< Scalar > &expr)
Definition variable.hpp:94
Variable< Scalar > & operator/=(const Variable< Scalar > &rhs)
Definition variable.hpp:204
Variable< Scalar > & operator*=(const Variable< Scalar > &rhs)
Definition variable.hpp:185
friend Variable< Scalar > operator+(const Variable< Scalar > &lhs, const Variable< Scalar > &rhs)
Definition variable.hpp:214
void set_value(Scalar value)
Definition variable.hpp:117
friend Variable< Scalar > operator/(const Variable< Scalar > &lhs, const Variable< Scalar > &rhs)
Definition variable.hpp:195
Variable(std::floating_point auto value)
Definition variable.hpp:79
constexpr Variable(detail::ExpressionPtr< Scalar > &&expr)
Definition variable.hpp:99
friend Variable< Scalar > operator+(const Variable< Scalar > &lhs)
Definition variable.hpp:257
Variable(Scalar value)
Definition variable.hpp:62
constexpr Variable(std::nullptr_t)
Constructs an empty Variable.
Definition variable.hpp:56
Variable< Scalar > & operator=(ScalarLike auto value)
Definition variable.hpp:106
Variable()=default
Constructs a linear Variable with a value of zero.
friend Variable< Scalar > operator-(const Variable< Scalar > &lhs)
Definition variable.hpp:250
friend Variable< Scalar > operator*(const Variable< Scalar > &lhs, const Variable< Scalar > &rhs)
Definition variable.hpp:176
Variable(std::integral auto value)
Definition variable.hpp:87
Variable(SleipnirMatrixLike< Scalar > auto value)
Definition variable.hpp:71
Variable< Scalar > & operator+=(const Variable< Scalar > &rhs)
Definition variable.hpp:223
Scalar_ Scalar
Scalar type alias.
Definition variable.hpp:50
Scalar value()
Definition variable.hpp:135
Variable< Scalar > & operator-=(const Variable< Scalar > &rhs)
Definition variable.hpp:242
friend Variable< Scalar > operator-(const Variable< Scalar > &lhs, const Variable< Scalar > &rhs)
Definition variable.hpp:233
Definition gradient_expression_graph.hpp:25
Definition concepts.hpp:18
Definition concepts.hpp:24
Definition concepts.hpp:33
Definition concepts.hpp:15
Definition variable.hpp:773
EqualityConstraints(LHS &&lhs, RHS &&rhs)
Definition variable.hpp:814
EqualityConstraints(std::initializer_list< EqualityConstraints > equality_constraints)
Definition variable.hpp:781
gch::small_vector< Variable< Scalar > > constraints
A vector of scalar equality constraints.
Definition variable.hpp:775
EqualityConstraints(const std::vector< EqualityConstraints > &equality_constraints)
Definition variable.hpp:795
Definition variable.hpp:830
gch::small_vector< Variable< Scalar > > constraints
A vector of scalar inequality constraints.
Definition variable.hpp:832
InequalityConstraints(LHS &&lhs, RHS &&rhs)
Definition variable.hpp:872
InequalityConstraints(const std::vector< InequalityConstraints > &inequality_constraints)
Definition variable.hpp:852
InequalityConstraints(std::initializer_list< InequalityConstraints > inequality_constraints)
Definition variable.hpp:838