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
29template <typename Scalar>
30class VariableMatrix;
31
32namespace detail {
33
34template <typename Scalar>
35VariableMatrix<Scalar> gradient_tree(
36 const detail::ExpressionGraph<Scalar>& top_list,
37 const VariableMatrix<Scalar>& wrt);
38
39} // namespace detail
40
41template <typename Scalar, int UpLo = Eigen::Lower | Eigen::Upper>
42 requires(UpLo == Eigen::Lower) || (UpLo == (Eigen::Lower | Eigen::Upper))
43class Hessian;
44
45template <typename Scalar>
46class Jacobian;
47
51template <typename Scalar_>
52class Variable : public SleipnirBase {
53 public:
55 using Scalar = Scalar_;
56
58 Variable() = default;
59
61 explicit constexpr Variable(std::nullptr_t) : expr{nullptr} {}
62
66 // NOLINTNEXTLINE (google-explicit-constructor)
68 requires(!MatrixLike<Scalar>)
69 : expr{detail::make_expression_ptr<detail::ConstantExpression<Scalar>>(
70 value)} {}
71
75 // NOLINTNEXTLINE (google-explicit-constructor)
77 slp_assert(value.rows() == 1 && value.cols() == 1);
78 }
79
83 // NOLINTNEXTLINE (google-explicit-constructor)
84 Variable(std::floating_point auto value)
85 : expr{detail::make_expression_ptr<detail::ConstantExpression<Scalar>>(
86 Scalar(value))} {}
87
91 // NOLINTNEXTLINE (google-explicit-constructor)
92 Variable(std::integral auto value)
93 : expr{detail::make_expression_ptr<detail::ConstantExpression<Scalar>>(
94 Scalar(value))} {}
95
99 explicit Variable(const detail::ExpressionPtr<Scalar>& expr) : expr{expr} {}
100
104 explicit constexpr Variable(detail::ExpressionPtr<Scalar>&& expr)
105 : expr{std::move(expr)} {}
106
112 expr =
113 detail::make_expression_ptr<detail::ConstantExpression<Scalar>>(value);
114 m_graph_initialized = false;
115
116 return *this;
117 }
118
123#ifndef SLEIPNIR_DISABLE_DIAGNOSTICS
124 // We only need to check the first argument since unary and binary operators
125 // both use it
126 if (expr->args[0] != nullptr) {
127 auto location = std::source_location::current();
128 slp::println(
129 stderr,
130 "WARNING: {}:{}: {}: Modified the value of a dependent variable",
131 location.file_name(), location.line(), location.function_name());
132 }
133#endif
134 expr->val = Scalar(value);
135 }
136
141 if (!m_graph_initialized) {
142 m_graph = detail::topological_sort(expr);
143 m_graph_initialized = true;
144 }
145 detail::update_values(m_graph);
146
147 return Scalar(expr->val);
148 }
149
154 ExpressionType type() const { return expr->type(); }
155
161 template <ScalarLike LHS, SleipnirScalarLike<Scalar> RHS>
162 friend Variable<Scalar> operator*(const LHS& lhs, const RHS& rhs) {
163 return Variable{Variable<Scalar>{lhs}.expr * rhs.expr};
164 }
165
171 template <SleipnirScalarLike<Scalar> LHS, ScalarLike RHS>
172 friend Variable<Scalar> operator*(const LHS& lhs, const RHS& rhs) {
173 return Variable{lhs.expr * Variable<Scalar>{rhs}.expr};
174 }
175
182 const Variable<Scalar>& rhs) {
183 return Variable{lhs.expr * rhs.expr};
184 }
185
191 *this = *this * rhs;
192 return *this;
193 }
194
201 const Variable<Scalar>& rhs) {
202 return Variable{lhs.expr / rhs.expr};
203 }
204
210 *this = *this / rhs;
211 return *this;
212 }
213
220 const Variable<Scalar>& rhs) {
221 return Variable{lhs.expr + rhs.expr};
222 }
223
229 *this = *this + rhs;
230 return *this;
231 }
232
239 const Variable<Scalar>& rhs) {
240 return Variable{lhs.expr - rhs.expr};
241 }
242
248 *this = *this - rhs;
249 return *this;
250 }
251
256 return Variable{-lhs.expr};
257 }
258
263 return Variable{+lhs.expr};
264 }
265
266 private:
269 detail::make_expression_ptr<detail::DecisionVariableExpression<Scalar>>();
270
273 detail::ExpressionGraph<Scalar> m_graph;
274
276 bool m_graph_initialized = false;
277
278 template <typename Scalar>
279 friend Variable<Scalar> abs(const Variable<Scalar>& x);
280 template <typename Scalar>
281 friend Variable<Scalar> acos(const Variable<Scalar>& x);
282 template <typename Scalar>
283 friend Variable<Scalar> asin(const Variable<Scalar>& x);
284 template <typename Scalar>
285 friend Variable<Scalar> atan(const Variable<Scalar>& x);
286 template <typename Scalar>
287 friend Variable<Scalar> atan2(const ScalarLike auto& y,
288 const Variable<Scalar>& x);
289 template <typename Scalar>
290 friend Variable<Scalar> atan2(const Variable<Scalar>& y,
291 const ScalarLike auto& x);
292 template <typename Scalar>
293 friend Variable<Scalar> atan2(const Variable<Scalar>& y,
294 const Variable<Scalar>& x);
295 template <typename Scalar>
296 friend Variable<Scalar> cbrt(const Variable<Scalar>& x);
297 template <typename Scalar>
298 friend Variable<Scalar> cos(const Variable<Scalar>& x);
299 template <typename Scalar>
300 friend Variable<Scalar> cosh(const Variable<Scalar>& x);
301 template <typename Scalar>
302 friend Variable<Scalar> erf(const Variable<Scalar>& x);
303 template <typename Scalar>
304 friend Variable<Scalar> exp(const Variable<Scalar>& x);
305 template <typename Scalar>
306 friend Variable<Scalar> hypot(const ScalarLike auto& x,
307 const Variable<Scalar>& y);
308 template <typename Scalar>
309 friend Variable<Scalar> hypot(const Variable<Scalar>& x,
310 const ScalarLike auto& y);
311 template <typename Scalar>
312 friend Variable<Scalar> hypot(const Variable<Scalar>& x,
313 const Variable<Scalar>& y);
314 template <typename Scalar>
315 friend Variable<Scalar> log(const Variable<Scalar>& x);
316 template <typename Scalar>
317 friend Variable<Scalar> log10(const Variable<Scalar>& x);
318 template <typename Scalar>
319 friend Variable<Scalar> max(const ScalarLike auto& a,
320 const Variable<Scalar>& b);
321 template <typename Scalar>
322 friend Variable<Scalar> max(const Variable<Scalar>& a,
323 const ScalarLike auto& b);
324 template <typename Scalar>
325 friend Variable<Scalar> max(const Variable<Scalar>& a,
326 const Variable<Scalar>& b);
327 template <typename Scalar>
328 friend Variable<Scalar> min(const ScalarLike auto& a,
329 const Variable<Scalar>& b);
330 template <typename Scalar>
331 friend Variable<Scalar> min(const Variable<Scalar>& a,
332 const ScalarLike auto& b);
333 template <typename Scalar>
334 friend Variable<Scalar> min(const Variable<Scalar>& a,
335 const Variable<Scalar>& b);
336 template <typename Scalar>
337 friend Variable<Scalar> pow(const ScalarLike auto& base,
338 const Variable<Scalar>& power);
339 template <typename Scalar>
340 friend Variable<Scalar> pow(const Variable<Scalar>& base,
341 const ScalarLike auto& power);
342 template <typename Scalar>
343 friend Variable<Scalar> pow(const Variable<Scalar>& base,
344 const Variable<Scalar>& power);
345 template <typename Scalar>
346 friend Variable<Scalar> sign(const Variable<Scalar>& x);
347 template <typename Scalar>
348 friend Variable<Scalar> sin(const Variable<Scalar>& x);
349 template <typename Scalar>
350 friend Variable<Scalar> sinh(const Variable<Scalar>& x);
351 template <typename Scalar>
352 friend Variable<Scalar> sqrt(const Variable<Scalar>& x);
353 template <typename Scalar>
354 friend Variable<Scalar> tan(const Variable<Scalar>& x);
355 template <typename Scalar>
356 friend Variable<Scalar> tanh(const Variable<Scalar>& x);
357 template <typename Scalar>
358 friend Variable<Scalar> hypot(const Variable<Scalar>& x,
359 const Variable<Scalar>& y,
360 const Variable<Scalar>& z);
361
362 template <typename Scalar>
363 friend VariableMatrix<Scalar> detail::gradient_tree(
364 const detail::ExpressionGraph<Scalar>& top_list,
366 template <typename Scalar, int UpLo>
367 requires(UpLo == Eigen::Lower) || (UpLo == (Eigen::Lower | Eigen::Upper))
368 friend class Hessian;
369 template <typename Scalar>
370 friend class Jacobian;
371};
372
373template <template <typename> typename T, typename Scalar>
374 requires SleipnirMatrixLike<T<Scalar>, Scalar>
375Variable(T<Scalar>) -> Variable<Scalar>;
376
377template <std::floating_point T>
378Variable(T) -> Variable<T>;
379
380template <std::integral T>
381Variable(T) -> Variable<T>;
382
387template <typename Scalar>
388Variable<Scalar> abs(const Variable<Scalar>& x) {
389 return Variable{detail::abs(x.expr)};
390}
391
396template <typename Scalar>
397Variable<Scalar> acos(const Variable<Scalar>& x) {
398 return Variable{detail::acos(x.expr)};
399}
400
405template <typename Scalar>
406Variable<Scalar> asin(const Variable<Scalar>& x) {
407 return Variable{detail::asin(x.expr)};
408}
409
414template <typename Scalar>
415Variable<Scalar> atan(const Variable<Scalar>& x) {
416 return Variable{detail::atan(x.expr)};
417}
418
424template <typename Scalar>
425Variable<Scalar> atan2(const ScalarLike auto& y, const Variable<Scalar>& x) {
426 return Variable{detail::atan2(Variable<Scalar>(y).expr, x.expr)};
427}
428
434template <typename Scalar>
435Variable<Scalar> atan2(const Variable<Scalar>& y, const ScalarLike auto& x) {
436 return Variable{detail::atan2(y.expr, Variable<Scalar>(x).expr)};
437}
438
444template <typename Scalar>
445Variable<Scalar> atan2(const Variable<Scalar>& y, const Variable<Scalar>& x) {
446 return Variable{detail::atan2(y.expr, x.expr)};
447}
448
453template <typename Scalar>
454Variable<Scalar> cbrt(const Variable<Scalar>& x) {
455 return Variable{detail::cbrt(x.expr)};
456}
457
462template <typename Scalar>
463Variable<Scalar> cos(const Variable<Scalar>& x) {
464 return Variable{detail::cos(x.expr)};
465}
466
471template <typename Scalar>
472Variable<Scalar> cosh(const Variable<Scalar>& x) {
473 return Variable{detail::cosh(x.expr)};
474}
475
480template <typename Scalar>
481Variable<Scalar> erf(const Variable<Scalar>& x) {
482 return Variable{detail::erf(x.expr)};
483}
484
489template <typename Scalar>
490Variable<Scalar> exp(const Variable<Scalar>& x) {
491 return Variable{detail::exp(x.expr)};
492}
493
499template <typename Scalar>
500Variable<Scalar> hypot(const ScalarLike auto& x, const Variable<Scalar>& y) {
501 return Variable{detail::hypot(Variable<Scalar>(x).expr, y.expr)};
502}
503
509template <typename Scalar>
510Variable<Scalar> hypot(const Variable<Scalar>& x, const ScalarLike auto& y) {
511 return Variable{detail::hypot(x.expr, Variable<Scalar>(y).expr)};
512}
513
519template <typename Scalar>
520Variable<Scalar> hypot(const Variable<Scalar>& x, const Variable<Scalar>& y) {
521 return Variable{detail::hypot(x.expr, y.expr)};
522}
523
528template <typename Scalar>
529Variable<Scalar> log(const Variable<Scalar>& x) {
530 return Variable{detail::log(x.expr)};
531}
532
537template <typename Scalar>
538Variable<Scalar> log10(const Variable<Scalar>& x) {
539 return Variable{detail::log10(x.expr)};
540}
541
549template <typename Scalar>
550Variable<Scalar> max(const ScalarLike auto& a, const Variable<Scalar>& b) {
551 return Variable{detail::max(Variable<Scalar>(a).expr, b.expr)};
552}
553
561template <typename Scalar>
562Variable<Scalar> max(const Variable<Scalar>& a, const ScalarLike auto& b) {
563 return Variable{detail::max(a.expr, Variable<Scalar>(b).expr)};
564}
565
573template <typename Scalar>
574Variable<Scalar> max(const Variable<Scalar>& a, const Variable<Scalar>& b) {
575 return Variable{detail::max(a.expr, b.expr)};
576}
577
585template <typename Scalar>
586Variable<Scalar> min(const ScalarLike auto& a, const Variable<Scalar>& b) {
587 return Variable{detail::min(Variable<Scalar>(a).expr, b.expr)};
588}
589
597template <typename Scalar>
598Variable<Scalar> min(const Variable<Scalar>& a, const ScalarLike auto& b) {
599 return Variable{detail::min(a.expr, Variable<Scalar>(b).expr)};
600}
601
609template <typename Scalar>
610Variable<Scalar> min(const Variable<Scalar>& a, const Variable<Scalar>& b) {
611 return Variable{detail::min(a.expr, b.expr)};
612}
613
619template <typename Scalar>
620Variable<Scalar> pow(const ScalarLike auto& base,
621 const Variable<Scalar>& power) {
622 return Variable{detail::pow(Variable<Scalar>(base).expr, power.expr)};
623}
624
630template <typename Scalar>
631Variable<Scalar> pow(const Variable<Scalar>& base,
632 const ScalarLike auto& power) {
633 return Variable{detail::pow(base.expr, Variable<Scalar>(power).expr)};
634}
635
641template <typename Scalar>
642Variable<Scalar> pow(const Variable<Scalar>& base,
643 const Variable<Scalar>& power) {
644 return Variable{detail::pow(base.expr, power.expr)};
645}
646
651template <typename Scalar>
652Variable<Scalar> sign(const Variable<Scalar>& x) {
653 return Variable{detail::sign(x.expr)};
654}
655
660template <typename Scalar>
661Variable<Scalar> sin(const Variable<Scalar>& x) {
662 return Variable{detail::sin(x.expr)};
663}
664
669template <typename Scalar>
670Variable<Scalar> sinh(const Variable<Scalar>& x) {
671 return Variable{detail::sinh(x.expr)};
672}
673
678template <typename Scalar>
679Variable<Scalar> sqrt(const Variable<Scalar>& x) {
680 return Variable{detail::sqrt(x.expr)};
681}
682
687template <typename Scalar>
688Variable<Scalar> tan(const Variable<Scalar>& x) {
689 return Variable{detail::tan(x.expr)};
690}
691
696template <typename Scalar>
697Variable<Scalar> tanh(const Variable<Scalar>& x) {
698 return Variable{detail::tanh(x.expr)};
699}
700
707template <typename Scalar>
708Variable<Scalar> hypot(const Variable<Scalar>& x, const Variable<Scalar>& y,
709 const Variable<Scalar>& z) {
710 return Variable{sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2))};
711}
712
713// The standard form for equality constraints is c(x) = 0, and the standard form
714// for inequality constraints is c(x) ≥ 0. make_constraints() takes constraints
715// of the form lhs = rhs or lhs ≥ rhs and converts them to lhs - rhs = 0 or
716// lhs - rhs ≥ 0.
717
718template <typename Scalar, ScalarLike LHS, ScalarLike RHS>
719 requires SleipnirScalarLike<LHS, Scalar> || SleipnirScalarLike<RHS, Scalar>
720auto make_constraints(LHS&& lhs, RHS&& rhs) {
721 gch::small_vector<Variable<Scalar>> constraints;
722 constraints.emplace_back(lhs - rhs);
723
724 return constraints;
725}
726
727template <typename Scalar, ScalarLike LHS, MatrixLike RHS>
728 requires SleipnirScalarLike<LHS, Scalar> || SleipnirMatrixLike<RHS, Scalar>
729auto make_constraints(LHS&& lhs, RHS&& rhs) {
730 gch::small_vector<Variable<Scalar>> constraints;
731 constraints.reserve(rhs.rows() * rhs.cols());
732
733 for (int row = 0; row < rhs.rows(); ++row) {
734 for (int col = 0; col < rhs.cols(); ++col) {
735 // Make right-hand side zero
736 constraints.emplace_back(lhs - rhs[row, col]);
737 }
738 }
739
740 return constraints;
741}
742
743template <typename Scalar, MatrixLike LHS, ScalarLike RHS>
744 requires SleipnirMatrixLike<LHS, Scalar> || SleipnirScalarLike<RHS, Scalar>
745auto make_constraints(LHS&& lhs, RHS&& rhs) {
746 gch::small_vector<Variable<Scalar>> constraints;
747 constraints.reserve(lhs.rows() * lhs.cols());
748
749 for (int row = 0; row < lhs.rows(); ++row) {
750 for (int col = 0; col < lhs.cols(); ++col) {
751 // Make right-hand side zero
752 constraints.emplace_back(lhs[row, col] - rhs);
753 }
754 }
755
756 return constraints;
757}
758
759template <typename Scalar, MatrixLike LHS, MatrixLike RHS>
760 requires SleipnirMatrixLike<LHS, Scalar> || SleipnirMatrixLike<RHS, Scalar>
761auto make_constraints(LHS&& lhs, RHS&& rhs) {
762 slp_assert(lhs.rows() == rhs.rows() && lhs.cols() == rhs.cols());
763
764 gch::small_vector<Variable<Scalar>> constraints;
765 constraints.reserve(lhs.rows() * lhs.cols());
766
767 for (int row = 0; row < lhs.rows(); ++row) {
768 for (int col = 0; col < lhs.cols(); ++col) {
769 // Make right-hand side zero
770 constraints.emplace_back(lhs[row, col] - rhs[row, col]);
771 }
772 }
773
774 return constraints;
775}
776
780template <typename Scalar>
783 gch::small_vector<Variable<Scalar>> constraints;
784
790 std::initializer_list<EqualityConstraints> equality_constraints) {
791 for (const auto& elem : equality_constraints) {
792 constraints.insert(constraints.end(), elem.constraints.begin(),
793 elem.constraints.end());
794 }
795 }
796
804 const std::vector<EqualityConstraints>& equality_constraints) {
805 for (const auto& elem : equality_constraints) {
806 constraints.insert(constraints.end(), elem.constraints.begin(),
807 elem.constraints.end());
808 }
809 }
810
818 template <typename LHS, typename RHS>
819 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
824
826 // NOLINTNEXTLINE (google-explicit-constructor)
827 operator bool() {
828 return std::ranges::all_of(constraints, [](auto& constraint) {
829 return constraint.value() == Scalar(0);
830 });
831 }
832};
833
837template <typename Scalar>
840 gch::small_vector<Variable<Scalar>> constraints;
841
847 std::initializer_list<InequalityConstraints> inequality_constraints) {
848 for (const auto& elem : inequality_constraints) {
849 constraints.insert(constraints.end(), elem.constraints.begin(),
850 elem.constraints.end());
851 }
852 }
853
861 const std::vector<InequalityConstraints>& inequality_constraints) {
862 for (const auto& elem : inequality_constraints) {
863 constraints.insert(constraints.end(), elem.constraints.begin(),
864 elem.constraints.end());
865 }
866 }
867
876 template <typename LHS, typename RHS>
877 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
882
884 // NOLINTNEXTLINE (google-explicit-constructor)
885 operator bool() {
886 return std::ranges::all_of(constraints, [](auto& constraint) {
887 return constraint.value() >= Scalar(0);
888 });
889 }
890};
891
896template <typename LHS, typename RHS>
897 requires(ScalarLike<LHS> || MatrixLike<LHS>) && SleipnirType<LHS> &&
898 (ScalarLike<RHS> || MatrixLike<RHS>) && (!SleipnirType<RHS>)
899auto operator==(LHS&& lhs, RHS&& rhs) {
900 return EqualityConstraints<typename std::decay_t<LHS>::Scalar>{lhs, rhs};
901}
902
907template <typename LHS, typename RHS>
908 requires(ScalarLike<LHS> || MatrixLike<LHS>) && (!SleipnirType<LHS>) &&
909 (ScalarLike<RHS> || MatrixLike<RHS>) && SleipnirType<RHS>
910auto operator==(LHS&& lhs, RHS&& rhs) {
911 return EqualityConstraints<typename std::decay_t<RHS>::Scalar>{lhs, rhs};
912}
913
918template <typename LHS, typename RHS>
919 requires(ScalarLike<LHS> || MatrixLike<LHS>) && SleipnirType<LHS> &&
920 (ScalarLike<RHS> || MatrixLike<RHS>) && SleipnirType<RHS>
921auto operator==(LHS&& lhs, RHS&& rhs) {
922 return EqualityConstraints<typename std::decay_t<LHS>::Scalar>{lhs, rhs};
923}
924
930template <typename LHS, typename RHS>
931 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
932 (ScalarLike<RHS> || MatrixLike<RHS>) &&
933 (SleipnirType<LHS> || SleipnirType<RHS>)
934auto operator<(LHS&& lhs, RHS&& rhs) {
935 return rhs >= lhs;
936}
937
943template <typename LHS, typename RHS>
944 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
945 (ScalarLike<RHS> || MatrixLike<RHS>) &&
946 (SleipnirType<LHS> || SleipnirType<RHS>)
947auto operator<=(LHS&& lhs, RHS&& rhs) {
948 return rhs >= lhs;
949}
950
956template <typename LHS, typename RHS>
957 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
958 (ScalarLike<RHS> || MatrixLike<RHS>) &&
959 (SleipnirType<LHS> || SleipnirType<RHS>)
960auto operator>(LHS&& lhs, RHS&& rhs) {
961 return lhs >= rhs;
962}
963
969template <typename LHS, typename RHS>
970 requires(ScalarLike<LHS> || MatrixLike<LHS>) && SleipnirType<LHS> &&
971 (ScalarLike<RHS> || MatrixLike<RHS>) && (!SleipnirType<RHS>)
972auto operator>=(LHS&& lhs, RHS&& rhs) {
973 return InequalityConstraints<typename std::decay_t<LHS>::Scalar>{lhs, rhs};
974}
975
981template <typename LHS, typename RHS>
982 requires(ScalarLike<LHS> || MatrixLike<LHS>) && (!SleipnirType<LHS>) &&
983 (ScalarLike<RHS> || MatrixLike<RHS>) && SleipnirType<RHS>
984auto operator>=(LHS&& lhs, RHS&& rhs) {
985 return InequalityConstraints<typename std::decay_t<RHS>::Scalar>{lhs, rhs};
986}
987
993template <typename LHS, typename RHS>
994 requires(ScalarLike<LHS> || MatrixLike<LHS>) && SleipnirType<LHS> &&
995 (ScalarLike<RHS> || MatrixLike<RHS>) && SleipnirType<RHS>
996auto operator>=(LHS&& lhs, RHS&& rhs) {
997 return InequalityConstraints<typename std::decay_t<LHS>::Scalar>{lhs, rhs};
998}
999
1005template <typename L, typename X, typename U>
1006 requires(ScalarLike<L> || MatrixLike<L>) && SleipnirType<X> &&
1007 (ScalarLike<U> || MatrixLike<U>)
1008auto bounds(L&& l, X&& x, U&& u) {
1009 return InequalityConstraints{l <= x, x <= u};
1010}
1011
1012} // namespace slp
1013
1014namespace Eigen {
1015
1020template <typename Scalar>
1021struct NumTraits<slp::Variable<Scalar>> : NumTraits<Scalar> {
1028
1030 static constexpr int IsComplex = 0;
1032 static constexpr int IsInteger = 0;
1034 static constexpr int IsSigned = 1;
1036 static constexpr int RequireInitialization = 1;
1038 static constexpr int ReadCost = 1;
1040 static constexpr int AddCost = 3;
1042 static constexpr int MulCost = 3;
1043};
1044
1045} // namespace Eigen
Definition hessian.hpp:30
Definition intrusive_shared_ptr.hpp:27
Definition jacobian.hpp:27
Definition sleipnir_base.hpp:9
Definition variable.hpp:52
ExpressionType type() const
Definition variable.hpp:154
friend Variable< Scalar > operator*(const LHS &lhs, const RHS &rhs)
Definition variable.hpp:162
Variable(const detail::ExpressionPtr< Scalar > &expr)
Definition variable.hpp:99
Variable< Scalar > & operator/=(const Variable< Scalar > &rhs)
Definition variable.hpp:209
Variable< Scalar > & operator*=(const Variable< Scalar > &rhs)
Definition variable.hpp:190
friend Variable< Scalar > operator+(const Variable< Scalar > &lhs, const Variable< Scalar > &rhs)
Definition variable.hpp:219
void set_value(Scalar value)
Definition variable.hpp:122
friend Variable< Scalar > operator/(const Variable< Scalar > &lhs, const Variable< Scalar > &rhs)
Definition variable.hpp:200
Variable(std::floating_point auto value)
Definition variable.hpp:84
constexpr Variable(detail::ExpressionPtr< Scalar > &&expr)
Definition variable.hpp:104
friend Variable< Scalar > operator+(const Variable< Scalar > &lhs)
Definition variable.hpp:262
Variable(Scalar value)
Definition variable.hpp:67
constexpr Variable(std::nullptr_t)
Constructs an empty Variable.
Definition variable.hpp:61
Variable< Scalar > & operator=(ScalarLike auto value)
Definition variable.hpp:111
Variable()=default
Constructs a linear Variable with a value of zero.
friend Variable< Scalar > operator-(const Variable< Scalar > &lhs)
Definition variable.hpp:255
friend Variable< Scalar > operator*(const Variable< Scalar > &lhs, const Variable< Scalar > &rhs)
Definition variable.hpp:181
Variable(std::integral auto value)
Definition variable.hpp:92
Variable(SleipnirMatrixLike< Scalar > auto value)
Definition variable.hpp:76
Variable< Scalar > & operator+=(const Variable< Scalar > &rhs)
Definition variable.hpp:228
Scalar_ Scalar
Scalar type alias.
Definition variable.hpp:55
Scalar value()
Definition variable.hpp:140
Variable< Scalar > & operator-=(const Variable< Scalar > &rhs)
Definition variable.hpp:247
friend Variable< Scalar > operator-(const Variable< Scalar > &lhs, const Variable< Scalar > &rhs)
Definition variable.hpp:238
Definition concepts.hpp:18
Definition concepts.hpp:24
Definition concepts.hpp:33
Definition concepts.hpp:15
Definition variable.hpp:781
EqualityConstraints(LHS &&lhs, RHS &&rhs)
Definition variable.hpp:822
EqualityConstraints(std::initializer_list< EqualityConstraints > equality_constraints)
Definition variable.hpp:789
gch::small_vector< Variable< Scalar > > constraints
A vector of scalar equality constraints.
Definition variable.hpp:783
EqualityConstraints(const std::vector< EqualityConstraints > &equality_constraints)
Definition variable.hpp:803
Definition variable.hpp:838
gch::small_vector< Variable< Scalar > > constraints
A vector of scalar inequality constraints.
Definition variable.hpp:840
InequalityConstraints(LHS &&lhs, RHS &&rhs)
Definition variable.hpp:880
InequalityConstraints(const std::vector< InequalityConstraints > &inequality_constraints)
Definition variable.hpp:860
InequalityConstraints(std::initializer_list< InequalityConstraints > inequality_constraints)
Definition variable.hpp:846