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 <cstddef>
8#include <initializer_list>
9#include <source_location>
10#include <type_traits>
11#include <utility>
12#include <vector>
13
14#include <Eigen/Core>
15#include <gch/small_vector.hpp>
16
17#include "sleipnir/autodiff/expression.hpp"
18#include "sleipnir/autodiff/expression_graph.hpp"
19#include "sleipnir/autodiff/expression_type.hpp"
20#include "sleipnir/autodiff/sleipnir_base.hpp"
21#include "sleipnir/util/assert.hpp"
22#include "sleipnir/util/concepts.hpp"
23
24#ifndef SLEIPNIR_DISABLE_DIAGNOSTICS
25#include "sleipnir/util/print.hpp"
26#endif
27
28namespace slp {
29
30// Forward declarations for friend declarations in Variable
31
32template <typename Scalar>
33class VariableMatrix;
34
35namespace detail {
36
37template <typename Scalar>
38VariableMatrix<Scalar> gradient_tree(
39 const detail::ExpressionGraph<Scalar>& top_list,
40 const VariableMatrix<Scalar>& wrt);
41
42} // namespace detail
43
44template <typename Scalar, int UpLo = Eigen::Lower | Eigen::Upper>
45 requires(UpLo == Eigen::Lower) || (UpLo == (Eigen::Lower | Eigen::Upper))
46class Hessian;
47
48template <typename Scalar>
49class Jacobian;
50
54template <typename Scalar_>
55class Variable : public SleipnirBase {
56 public:
58 using Scalar = Scalar_;
59
61 Variable() = default;
62
64 explicit constexpr Variable(std::nullptr_t) : expr{nullptr} {}
65
69 // NOLINTNEXTLINE (google-explicit-constructor)
71 requires(!MatrixLike<Scalar>)
72 : expr{detail::make_expression_ptr<detail::ConstantExpression<Scalar>>(
73 value)} {}
74
78 // NOLINTNEXTLINE (google-explicit-constructor)
80 slp_assert(value.rows() == 1 && value.cols() == 1);
81 }
82
86 // NOLINTNEXTLINE (google-explicit-constructor)
87 Variable(std::floating_point auto value)
88 : expr{detail::make_expression_ptr<detail::ConstantExpression<Scalar>>(
89 Scalar(value))} {}
90
94 // NOLINTNEXTLINE (google-explicit-constructor)
95 Variable(std::integral auto value)
96 : expr{detail::make_expression_ptr<detail::ConstantExpression<Scalar>>(
97 Scalar(value))} {}
98
102 explicit Variable(const detail::ExpressionPtr<Scalar>& expr) : expr{expr} {}
103
107 explicit constexpr Variable(detail::ExpressionPtr<Scalar>&& expr)
108 : expr{std::move(expr)} {}
109
115 expr =
116 detail::make_expression_ptr<detail::ConstantExpression<Scalar>>(value);
117 m_graph_initialized = false;
118
119 return *this;
120 }
121
126#ifndef SLEIPNIR_DISABLE_DIAGNOSTICS
127 // We only need to check the first argument since unary and binary operators
128 // both use it
129 if (expr->args[0] != nullptr) {
130 auto location = std::source_location::current();
131 slp::println(
132 stderr,
133 "WARNING: {}:{}: {}: Modified the value of a dependent variable",
134 location.file_name(), location.line(), location.function_name());
135 }
136#endif
137 expr->val = Scalar(value);
138 }
139
144 if (!m_graph_initialized) {
145 m_graph = detail::topological_sort(expr);
146 m_graph_initialized = true;
147 }
148 detail::update_values(m_graph);
149
150 return Scalar(expr->val);
151 }
152
157 ExpressionType type() const { return expr->type(); }
158
164 template <ScalarLike LHS, SleipnirScalarLike<Scalar> RHS>
165 friend Variable<Scalar> operator*(const LHS& lhs, const RHS& rhs) {
166 return Variable{Variable<Scalar>{lhs}.expr * rhs.expr};
167 }
168
174 template <SleipnirScalarLike<Scalar> LHS, ScalarLike RHS>
175 friend Variable<Scalar> operator*(const LHS& lhs, const RHS& rhs) {
176 return Variable{lhs.expr * Variable<Scalar>{rhs}.expr};
177 }
178
185 const Variable<Scalar>& rhs) {
186 return Variable{lhs.expr * rhs.expr};
187 }
188
194 *this = *this * rhs;
195 return *this;
196 }
197
204 const Variable<Scalar>& rhs) {
205 return Variable{lhs.expr / rhs.expr};
206 }
207
213 *this = *this / rhs;
214 return *this;
215 }
216
223 const Variable<Scalar>& rhs) {
224 return Variable{lhs.expr + rhs.expr};
225 }
226
232 *this = *this + rhs;
233 return *this;
234 }
235
242 const Variable<Scalar>& rhs) {
243 return Variable{lhs.expr - rhs.expr};
244 }
245
251 *this = *this - rhs;
252 return *this;
253 }
254
259 return Variable{-lhs.expr};
260 }
261
266 return Variable{+lhs.expr};
267 }
268
269 private:
272 detail::make_expression_ptr<detail::DecisionVariableExpression<Scalar>>();
273
276 detail::ExpressionGraph<Scalar> m_graph;
277
279 bool m_graph_initialized = false;
280
281 template <typename Scalar>
282 friend Variable<Scalar> abs(const Variable<Scalar>& x);
283 template <typename Scalar>
284 friend Variable<Scalar> acos(const Variable<Scalar>& x);
285 template <typename Scalar>
286 friend Variable<Scalar> asin(const Variable<Scalar>& x);
287 template <typename Scalar>
288 friend Variable<Scalar> atan(const Variable<Scalar>& x);
289 template <typename Scalar>
290 friend Variable<Scalar> atan2(const ScalarLike auto& y,
291 const Variable<Scalar>& x);
292 template <typename Scalar>
293 friend Variable<Scalar> atan2(const Variable<Scalar>& y,
294 const ScalarLike auto& x);
295 template <typename Scalar>
296 friend Variable<Scalar> atan2(const Variable<Scalar>& y,
297 const Variable<Scalar>& x);
298 template <typename Scalar>
299 friend Variable<Scalar> cbrt(const Variable<Scalar>& x);
300 template <typename Scalar>
301 friend Variable<Scalar> cos(const Variable<Scalar>& x);
302 template <typename Scalar>
303 friend Variable<Scalar> cosh(const Variable<Scalar>& x);
304 template <typename Scalar>
305 friend Variable<Scalar> erf(const Variable<Scalar>& x);
306 template <typename Scalar>
307 friend Variable<Scalar> exp(const Variable<Scalar>& x);
308 template <typename Scalar>
309 friend Variable<Scalar> hypot(const ScalarLike auto& x,
310 const Variable<Scalar>& y);
311 template <typename Scalar>
312 friend Variable<Scalar> hypot(const Variable<Scalar>& x,
313 const ScalarLike auto& y);
314 template <typename Scalar>
315 friend Variable<Scalar> hypot(const Variable<Scalar>& x,
316 const Variable<Scalar>& y);
317 template <typename Scalar>
318 friend Variable<Scalar> log(const Variable<Scalar>& x);
319 template <typename Scalar>
320 friend Variable<Scalar> log10(const Variable<Scalar>& x);
321 template <typename Scalar>
322 friend Variable<Scalar> max(const ScalarLike auto& a,
323 const Variable<Scalar>& b);
324 template <typename Scalar>
325 friend Variable<Scalar> max(const Variable<Scalar>& a,
326 const ScalarLike auto& b);
327 template <typename Scalar>
328 friend Variable<Scalar> max(const Variable<Scalar>& a,
329 const Variable<Scalar>& b);
330 template <typename Scalar>
331 friend Variable<Scalar> min(const ScalarLike auto& a,
332 const Variable<Scalar>& b);
333 template <typename Scalar>
334 friend Variable<Scalar> min(const Variable<Scalar>& a,
335 const ScalarLike auto& b);
336 template <typename Scalar>
337 friend Variable<Scalar> min(const Variable<Scalar>& a,
338 const Variable<Scalar>& b);
339 template <typename Scalar>
340 friend Variable<Scalar> pow(const ScalarLike auto& base,
341 const Variable<Scalar>& power);
342 template <typename Scalar>
343 friend Variable<Scalar> pow(const Variable<Scalar>& base,
344 const ScalarLike auto& power);
345 template <typename Scalar>
346 friend Variable<Scalar> pow(const Variable<Scalar>& base,
347 const Variable<Scalar>& power);
348 template <typename Scalar>
349 friend Variable<Scalar> sign(const Variable<Scalar>& x);
350 template <typename Scalar>
351 friend Variable<Scalar> sin(const Variable<Scalar>& x);
352 template <typename Scalar>
353 friend Variable<Scalar> sinh(const Variable<Scalar>& x);
354 template <typename Scalar>
355 friend Variable<Scalar> sqrt(const Variable<Scalar>& x);
356 template <typename Scalar>
357 friend Variable<Scalar> tan(const Variable<Scalar>& x);
358 template <typename Scalar>
359 friend Variable<Scalar> tanh(const Variable<Scalar>& x);
360 template <typename Scalar>
361 friend Variable<Scalar> hypot(const Variable<Scalar>& x,
362 const Variable<Scalar>& y,
363 const Variable<Scalar>& z);
364
365 template <typename Scalar>
366 friend VariableMatrix<Scalar> detail::gradient_tree(
367 const detail::ExpressionGraph<Scalar>& top_list,
369 template <typename Scalar, int UpLo>
370 requires(UpLo == Eigen::Lower) || (UpLo == (Eigen::Lower | Eigen::Upper))
371 friend class Hessian;
372 template <typename Scalar>
373 friend class Jacobian;
374};
375
376template <template <typename> typename T, typename Scalar>
377 requires SleipnirMatrixLike<T<Scalar>, Scalar>
378Variable(T<Scalar>) -> Variable<Scalar>;
379
380template <std::floating_point T>
381Variable(T) -> Variable<T>;
382
383template <std::integral T>
384Variable(T) -> Variable<T>;
385
390template <typename Scalar>
391Variable<Scalar> abs(const Variable<Scalar>& x) {
392 return Variable{detail::abs(x.expr)};
393}
394
399template <typename Scalar>
400Variable<Scalar> acos(const Variable<Scalar>& x) {
401 return Variable{detail::acos(x.expr)};
402}
403
408template <typename Scalar>
409Variable<Scalar> asin(const Variable<Scalar>& x) {
410 return Variable{detail::asin(x.expr)};
411}
412
417template <typename Scalar>
418Variable<Scalar> atan(const Variable<Scalar>& x) {
419 return Variable{detail::atan(x.expr)};
420}
421
427template <typename Scalar>
428Variable<Scalar> atan2(const ScalarLike auto& y, const Variable<Scalar>& x) {
429 return Variable{detail::atan2(Variable<Scalar>(y).expr, x.expr)};
430}
431
437template <typename Scalar>
438Variable<Scalar> atan2(const Variable<Scalar>& y, const ScalarLike auto& x) {
439 return Variable{detail::atan2(y.expr, Variable<Scalar>(x).expr)};
440}
441
447template <typename Scalar>
448Variable<Scalar> atan2(const Variable<Scalar>& y, const Variable<Scalar>& x) {
449 return Variable{detail::atan2(y.expr, x.expr)};
450}
451
456template <typename Scalar>
457Variable<Scalar> cbrt(const Variable<Scalar>& x) {
458 return Variable{detail::cbrt(x.expr)};
459}
460
465template <typename Scalar>
466Variable<Scalar> cos(const Variable<Scalar>& x) {
467 return Variable{detail::cos(x.expr)};
468}
469
474template <typename Scalar>
475Variable<Scalar> cosh(const Variable<Scalar>& x) {
476 return Variable{detail::cosh(x.expr)};
477}
478
483template <typename Scalar>
484Variable<Scalar> erf(const Variable<Scalar>& x) {
485 return Variable{detail::erf(x.expr)};
486}
487
492template <typename Scalar>
493Variable<Scalar> exp(const Variable<Scalar>& x) {
494 return Variable{detail::exp(x.expr)};
495}
496
502template <typename Scalar>
503Variable<Scalar> hypot(const ScalarLike auto& x, const Variable<Scalar>& y) {
504 return Variable{detail::hypot(Variable<Scalar>(x).expr, y.expr)};
505}
506
512template <typename Scalar>
513Variable<Scalar> hypot(const Variable<Scalar>& x, const ScalarLike auto& y) {
514 return Variable{detail::hypot(x.expr, Variable<Scalar>(y).expr)};
515}
516
522template <typename Scalar>
523Variable<Scalar> hypot(const Variable<Scalar>& x, const Variable<Scalar>& y) {
524 return Variable{detail::hypot(x.expr, y.expr)};
525}
526
531template <typename Scalar>
532Variable<Scalar> log(const Variable<Scalar>& x) {
533 return Variable{detail::log(x.expr)};
534}
535
540template <typename Scalar>
541Variable<Scalar> log10(const Variable<Scalar>& x) {
542 return Variable{detail::log10(x.expr)};
543}
544
552template <typename Scalar>
553Variable<Scalar> max(const ScalarLike auto& a, const Variable<Scalar>& b) {
554 return Variable{detail::max(Variable<Scalar>(a).expr, b.expr)};
555}
556
564template <typename Scalar>
565Variable<Scalar> max(const Variable<Scalar>& a, const ScalarLike auto& b) {
566 return Variable{detail::max(a.expr, Variable<Scalar>(b).expr)};
567}
568
576template <typename Scalar>
577Variable<Scalar> max(const Variable<Scalar>& a, const Variable<Scalar>& b) {
578 return Variable{detail::max(a.expr, b.expr)};
579}
580
588template <typename Scalar>
589Variable<Scalar> min(const ScalarLike auto& a, const Variable<Scalar>& b) {
590 return Variable{detail::min(Variable<Scalar>(a).expr, b.expr)};
591}
592
600template <typename Scalar>
601Variable<Scalar> min(const Variable<Scalar>& a, const ScalarLike auto& b) {
602 return Variable{detail::min(a.expr, Variable<Scalar>(b).expr)};
603}
604
612template <typename Scalar>
613Variable<Scalar> min(const Variable<Scalar>& a, const Variable<Scalar>& b) {
614 return Variable{detail::min(a.expr, b.expr)};
615}
616
622template <typename Scalar>
623Variable<Scalar> pow(const ScalarLike auto& base,
624 const Variable<Scalar>& power) {
625 return Variable{detail::pow(Variable<Scalar>(base).expr, power.expr)};
626}
627
633template <typename Scalar>
634Variable<Scalar> pow(const Variable<Scalar>& base,
635 const ScalarLike auto& power) {
636 return Variable{detail::pow(base.expr, Variable<Scalar>(power).expr)};
637}
638
644template <typename Scalar>
645Variable<Scalar> pow(const Variable<Scalar>& base,
646 const Variable<Scalar>& power) {
647 return Variable{detail::pow(base.expr, power.expr)};
648}
649
654template <typename Scalar>
655Variable<Scalar> sign(const Variable<Scalar>& x) {
656 return Variable{detail::sign(x.expr)};
657}
658
663template <typename Scalar>
664Variable<Scalar> sin(const Variable<Scalar>& x) {
665 return Variable{detail::sin(x.expr)};
666}
667
672template <typename Scalar>
673Variable<Scalar> sinh(const Variable<Scalar>& x) {
674 return Variable{detail::sinh(x.expr)};
675}
676
681template <typename Scalar>
682Variable<Scalar> sqrt(const Variable<Scalar>& x) {
683 return Variable{detail::sqrt(x.expr)};
684}
685
690template <typename Scalar>
691Variable<Scalar> tan(const Variable<Scalar>& x) {
692 return Variable{detail::tan(x.expr)};
693}
694
699template <typename Scalar>
700Variable<Scalar> tanh(const Variable<Scalar>& x) {
701 return Variable{detail::tanh(x.expr)};
702}
703
710template <typename Scalar>
711Variable<Scalar> hypot(const Variable<Scalar>& x, const Variable<Scalar>& y,
712 const Variable<Scalar>& z) {
713 return Variable{sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2))};
714}
715
716// The standard form for equality constraints is c(x) = 0, and the standard form
717// for inequality constraints is c(x) ≥ 0. make_constraints() takes constraints
718// of the form lhs = rhs or lhs ≥ rhs and converts them to lhs - rhs = 0 or
719// lhs - rhs ≥ 0.
720
721template <typename Scalar, ScalarLike LHS, ScalarLike RHS>
722 requires SleipnirScalarLike<LHS, Scalar> || SleipnirScalarLike<RHS, Scalar>
723auto make_constraints(LHS&& lhs, RHS&& rhs) {
724 gch::small_vector<Variable<Scalar>> constraints;
725 constraints.emplace_back(lhs - rhs);
726
727 return constraints;
728}
729
730template <typename Scalar, ScalarLike LHS, MatrixLike RHS>
731 requires SleipnirScalarLike<LHS, Scalar> || SleipnirMatrixLike<RHS, Scalar>
732auto make_constraints(LHS&& lhs, RHS&& rhs) {
733 gch::small_vector<Variable<Scalar>> constraints;
734 constraints.reserve(rhs.rows() * rhs.cols());
735
736 for (int row = 0; row < rhs.rows(); ++row) {
737 for (int col = 0; col < rhs.cols(); ++col) {
738 // Make right-hand side zero
739 constraints.emplace_back(lhs - rhs[row, col]);
740 }
741 }
742
743 return constraints;
744}
745
746template <typename Scalar, MatrixLike LHS, ScalarLike RHS>
747 requires SleipnirMatrixLike<LHS, Scalar> || SleipnirScalarLike<RHS, Scalar>
748auto make_constraints(LHS&& lhs, RHS&& rhs) {
749 gch::small_vector<Variable<Scalar>> constraints;
750 constraints.reserve(lhs.rows() * lhs.cols());
751
752 for (int row = 0; row < lhs.rows(); ++row) {
753 for (int col = 0; col < lhs.cols(); ++col) {
754 // Make right-hand side zero
755 constraints.emplace_back(lhs[row, col] - rhs);
756 }
757 }
758
759 return constraints;
760}
761
762template <typename Scalar, MatrixLike LHS, MatrixLike RHS>
763 requires SleipnirMatrixLike<LHS, Scalar> || SleipnirMatrixLike<RHS, Scalar>
764auto make_constraints(LHS&& lhs, RHS&& rhs) {
765 slp_assert(lhs.rows() == rhs.rows() && lhs.cols() == rhs.cols());
766
767 gch::small_vector<Variable<Scalar>> constraints;
768 constraints.reserve(lhs.rows() * lhs.cols());
769
770 for (int row = 0; row < lhs.rows(); ++row) {
771 for (int col = 0; col < lhs.cols(); ++col) {
772 // Make right-hand side zero
773 constraints.emplace_back(lhs[row, col] - rhs[row, col]);
774 }
775 }
776
777 return constraints;
778}
779
783template <typename Scalar>
786 gch::small_vector<Variable<Scalar>> constraints;
787
793 std::initializer_list<EqualityConstraints> equality_constraints) {
794 for (const auto& elem : equality_constraints) {
795 constraints.insert(constraints.end(), elem.constraints.begin(),
796 elem.constraints.end());
797 }
798 }
799
807 const std::vector<EqualityConstraints>& equality_constraints) {
808 for (const auto& elem : equality_constraints) {
809 constraints.insert(constraints.end(), elem.constraints.begin(),
810 elem.constraints.end());
811 }
812 }
813
821 template <typename LHS, typename RHS>
822 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
827
829 // NOLINTNEXTLINE (google-explicit-constructor)
830 operator bool() {
831 return std::ranges::all_of(constraints, [](auto& constraint) {
832 return constraint.value() == Scalar(0);
833 });
834 }
835};
836
840template <typename Scalar>
843 gch::small_vector<Variable<Scalar>> constraints;
844
850 std::initializer_list<InequalityConstraints> inequality_constraints) {
851 for (const auto& elem : inequality_constraints) {
852 constraints.insert(constraints.end(), elem.constraints.begin(),
853 elem.constraints.end());
854 }
855 }
856
864 const std::vector<InequalityConstraints>& inequality_constraints) {
865 for (const auto& elem : inequality_constraints) {
866 constraints.insert(constraints.end(), elem.constraints.begin(),
867 elem.constraints.end());
868 }
869 }
870
879 template <typename LHS, typename RHS>
880 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
885
887 // NOLINTNEXTLINE (google-explicit-constructor)
888 operator bool() {
889 return std::ranges::all_of(constraints, [](auto& constraint) {
890 return constraint.value() >= Scalar(0);
891 });
892 }
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<LHS>::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<RHS>::Scalar>{lhs, rhs};
915}
916
921template <typename LHS, typename RHS>
922 requires(ScalarLike<LHS> || MatrixLike<LHS>) && SleipnirType<LHS> &&
923 (ScalarLike<RHS> || MatrixLike<RHS>) && SleipnirType<RHS>
924auto operator==(LHS&& lhs, RHS&& rhs) {
925 return EqualityConstraints<typename std::decay_t<LHS>::Scalar>{lhs, rhs};
926}
927
933template <typename LHS, typename RHS>
934 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
935 (ScalarLike<RHS> || MatrixLike<RHS>) &&
936 (SleipnirType<LHS> || SleipnirType<RHS>)
937auto operator<(LHS&& lhs, RHS&& rhs) {
938 return rhs >= lhs;
939}
940
946template <typename LHS, typename RHS>
947 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
948 (ScalarLike<RHS> || MatrixLike<RHS>) &&
949 (SleipnirType<LHS> || SleipnirType<RHS>)
950auto operator<=(LHS&& lhs, RHS&& rhs) {
951 return rhs >= lhs;
952}
953
959template <typename LHS, typename RHS>
960 requires(ScalarLike<LHS> || MatrixLike<LHS>) &&
961 (ScalarLike<RHS> || MatrixLike<RHS>) &&
962 (SleipnirType<LHS> || SleipnirType<RHS>)
963auto operator>(LHS&& lhs, RHS&& rhs) {
964 return lhs >= rhs;
965}
966
972template <typename LHS, typename RHS>
973 requires(ScalarLike<LHS> || MatrixLike<LHS>) && SleipnirType<LHS> &&
974 (ScalarLike<RHS> || MatrixLike<RHS>) && (!SleipnirType<RHS>)
975auto operator>=(LHS&& lhs, RHS&& rhs) {
976 return InequalityConstraints<typename std::decay_t<LHS>::Scalar>{lhs, rhs};
977}
978
984template <typename LHS, typename RHS>
985 requires(ScalarLike<LHS> || MatrixLike<LHS>) && (!SleipnirType<LHS>) &&
986 (ScalarLike<RHS> || MatrixLike<RHS>) && SleipnirType<RHS>
987auto operator>=(LHS&& lhs, RHS&& rhs) {
988 return InequalityConstraints<typename std::decay_t<RHS>::Scalar>{lhs, rhs};
989}
990
996template <typename LHS, typename RHS>
997 requires(ScalarLike<LHS> || MatrixLike<LHS>) && SleipnirType<LHS> &&
998 (ScalarLike<RHS> || MatrixLike<RHS>) && SleipnirType<RHS>
999auto operator>=(LHS&& lhs, RHS&& rhs) {
1000 return InequalityConstraints<typename std::decay_t<LHS>::Scalar>{lhs, rhs};
1001}
1002
1008template <typename L, typename X, typename U>
1009 requires(ScalarLike<L> || MatrixLike<L>) && SleipnirType<X> &&
1010 (ScalarLike<U> || MatrixLike<U>)
1011auto bounds(L&& l, X&& x, U&& u) {
1012 return InequalityConstraints{l <= x, x <= u};
1013}
1014
1015} // namespace slp
1016
1017namespace Eigen {
1018
1023template <typename Scalar>
1024struct NumTraits<slp::Variable<Scalar>> : NumTraits<Scalar> {
1031
1033 static constexpr int IsComplex = 0;
1035 static constexpr int IsInteger = 0;
1037 static constexpr int IsSigned = 1;
1039 static constexpr int RequireInitialization = 1;
1041 static constexpr int ReadCost = 1;
1043 static constexpr int AddCost = 3;
1045 static constexpr int MulCost = 3;
1046};
1047
1048} // namespace Eigen
Definition hessian.hpp:35
Definition intrusive_shared_ptr.hpp:27
Definition jacobian.hpp:31
Definition sleipnir_base.hpp:9
Definition variable.hpp:55
ExpressionType type() const
Definition variable.hpp:157
friend Variable< Scalar > operator*(const LHS &lhs, const RHS &rhs)
Definition variable.hpp:165
Variable(const detail::ExpressionPtr< Scalar > &expr)
Definition variable.hpp:102
Variable< Scalar > & operator/=(const Variable< Scalar > &rhs)
Definition variable.hpp:212
Variable< Scalar > & operator*=(const Variable< Scalar > &rhs)
Definition variable.hpp:193
friend Variable< Scalar > operator+(const Variable< Scalar > &lhs, const Variable< Scalar > &rhs)
Definition variable.hpp:222
void set_value(Scalar value)
Definition variable.hpp:125
friend Variable< Scalar > operator/(const Variable< Scalar > &lhs, const Variable< Scalar > &rhs)
Definition variable.hpp:203
Variable(std::floating_point auto value)
Definition variable.hpp:87
constexpr Variable(detail::ExpressionPtr< Scalar > &&expr)
Definition variable.hpp:107
friend Variable< Scalar > operator+(const Variable< Scalar > &lhs)
Definition variable.hpp:265
Variable(Scalar value)
Definition variable.hpp:70
constexpr Variable(std::nullptr_t)
Constructs an empty Variable.
Definition variable.hpp:64
Variable< Scalar > & operator=(ScalarLike auto value)
Definition variable.hpp:114
Variable()=default
Constructs a linear Variable with a value of zero.
friend Variable< Scalar > operator-(const Variable< Scalar > &lhs)
Definition variable.hpp:258
friend Variable< Scalar > operator*(const Variable< Scalar > &lhs, const Variable< Scalar > &rhs)
Definition variable.hpp:184
Variable(std::integral auto value)
Definition variable.hpp:95
Variable(SleipnirMatrixLike< Scalar > auto value)
Definition variable.hpp:79
Variable< Scalar > & operator+=(const Variable< Scalar > &rhs)
Definition variable.hpp:231
Scalar_ Scalar
Scalar type alias.
Definition variable.hpp:58
Scalar value()
Definition variable.hpp:143
Variable< Scalar > & operator-=(const Variable< Scalar > &rhs)
Definition variable.hpp:250
friend Variable< Scalar > operator-(const Variable< Scalar > &lhs, const Variable< Scalar > &rhs)
Definition variable.hpp:241
Definition concepts.hpp:18
Definition concepts.hpp:24
Definition concepts.hpp:33
Definition concepts.hpp:15
Definition variable.hpp:784
EqualityConstraints(LHS &&lhs, RHS &&rhs)
Definition variable.hpp:825
EqualityConstraints(std::initializer_list< EqualityConstraints > equality_constraints)
Definition variable.hpp:792
gch::small_vector< Variable< Scalar > > constraints
A vector of scalar equality constraints.
Definition variable.hpp:786
EqualityConstraints(const std::vector< EqualityConstraints > &equality_constraints)
Definition variable.hpp:806
Definition variable.hpp:841
gch::small_vector< Variable< Scalar > > constraints
A vector of scalar inequality constraints.
Definition variable.hpp:843
InequalityConstraints(LHS &&lhs, RHS &&rhs)
Definition variable.hpp:883
InequalityConstraints(const std::vector< InequalityConstraints > &inequality_constraints)
Definition variable.hpp:863
InequalityConstraints(std::initializer_list< InequalityConstraints > inequality_constraints)
Definition variable.hpp:849