Directory: | ./ |
---|---|
File: | include/crocoddyl/core/actuation/squashing/smooth-sat.hpp |
Date: | 2025-03-26 19:23:43 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 32 | 44 | 72.7% |
Branches: | 57 | 136 | 41.9% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /////////////////////////////////////////////////////////////////////////////// | ||
2 | // BSD 3-Clause License | ||
3 | // | ||
4 | // Copyright (C) 2019-2025, University of Edinburgh, IRI: CSIC-UPC, | ||
5 | // Heriot-Watt University | ||
6 | // Copyright note valid unless otherwise stated in individual files. | ||
7 | // All rights reserved. | ||
8 | /////////////////////////////////////////////////////////////////////////////// | ||
9 | |||
10 | #ifndef CROCODDYL_CORE_SQUASHING_SMOOTH_SAT_HPP_ | ||
11 | #define CROCODDYL_CORE_SQUASHING_SMOOTH_SAT_HPP_ | ||
12 | |||
13 | #include <stdexcept> | ||
14 | |||
15 | #include "crocoddyl/core/actuation/squashing-base.hpp" | ||
16 | #include "crocoddyl/core/fwd.hpp" | ||
17 | |||
18 | namespace crocoddyl { | ||
19 | |||
20 | template <typename _Scalar> | ||
21 | class SquashingModelSmoothSatTpl : public SquashingModelAbstractTpl<_Scalar> { | ||
22 | public: | ||
23 | EIGEN_MAKE_ALIGNED_OPERATOR_NEW | ||
24 |
1/2✓ Branch 3 taken 25 times.
✗ Branch 4 not taken.
|
100 | CROCODDYL_DERIVED_CAST(SquashingModelBase, SquashingModelSmoothSatTpl) |
25 | |||
26 | typedef _Scalar Scalar; | ||
27 | typedef MathBaseTpl<Scalar> MathBase; | ||
28 | typedef SquashingModelAbstractTpl<Scalar> Base; | ||
29 | typedef SquashingDataAbstractTpl<Scalar> SquashingDataAbstract; | ||
30 | typedef typename MathBase::VectorXs VectorXs; | ||
31 | |||
32 | 292 | SquashingModelSmoothSatTpl(const Eigen::Ref<const VectorXs>& u_lb, | |
33 | const Eigen::Ref<const VectorXs>& u_ub, | ||
34 | const std::size_t ns) | ||
35 |
2/4✓ Branch 2 taken 292 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 292 times.
✗ Branch 6 not taken.
|
292 | : Base(ns) { |
36 |
1/2✓ Branch 1 taken 292 times.
✗ Branch 2 not taken.
|
292 | u_lb_ = u_lb; |
37 |
1/2✓ Branch 1 taken 292 times.
✗ Branch 2 not taken.
|
292 | u_ub_ = u_ub; |
38 | |||
39 |
1/2✓ Branch 1 taken 292 times.
✗ Branch 2 not taken.
|
292 | s_lb_ = u_lb_; |
40 |
1/2✓ Branch 1 taken 292 times.
✗ Branch 2 not taken.
|
292 | s_ub_ = u_ub_; |
41 | |||
42 | 292 | smooth_ = Scalar(0.1); | |
43 | |||
44 |
3/6✓ Branch 1 taken 292 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 292 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 292 times.
✗ Branch 8 not taken.
|
292 | d_ = (u_ub_ - u_lb_) * smooth_; |
45 |
4/8✓ Branch 1 taken 292 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 292 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 292 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 292 times.
✗ Branch 11 not taken.
|
292 | a_ = d_.array() * d_.array(); |
46 | 292 | } | |
47 | |||
48 | 638 | virtual ~SquashingModelSmoothSatTpl() = default; | |
49 | |||
50 | 13599 | virtual void calc(const std::shared_ptr<SquashingDataAbstract>& data, | |
51 | const Eigen::Ref<const VectorXs>& s) override { | ||
52 | // Squashing function used: "Smooth abs": | ||
53 | // s(u) = 0.5*(lb + ub + sqrt(smooth + (u - lb)^2) - sqrt(smooth + (u - | ||
54 | // ub)^2)) | ||
55 |
13/26✓ Branch 1 taken 13599 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13599 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 13599 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 13599 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 13599 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 13599 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 13599 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 13599 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 13599 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 13599 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 13599 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 13599 times.
✗ Branch 35 not taken.
✓ Branch 38 taken 13599 times.
✗ Branch 39 not taken.
|
27198 | data->u = Scalar(0.5) * |
56 |
2/4✓ Branch 1 taken 13599 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13599 times.
✗ Branch 5 not taken.
|
13599 | (Eigen::sqrt(Eigen::pow((s - u_lb_).array(), 2) + a_.array()) - |
57 |
2/4✓ Branch 1 taken 13599 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13599 times.
✗ Branch 5 not taken.
|
13599 | Eigen::sqrt(Eigen::pow((s - u_ub_).array(), 2) + a_.array()) + |
58 |
1/2✓ Branch 2 taken 13599 times.
✗ Branch 3 not taken.
|
13599 | u_lb_.array() + u_ub_.array()); |
59 | 13599 | } | |
60 | |||
61 | 4702 | virtual void calcDiff(const std::shared_ptr<SquashingDataAbstract>& data, | |
62 | const Eigen::Ref<const VectorXs>& s) override { | ||
63 |
7/14✓ Branch 1 taken 4702 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4702 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4702 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4702 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4702 times.
✗ Branch 14 not taken.
✓ Branch 17 taken 4702 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 4702 times.
✗ Branch 21 not taken.
|
23510 | data->du_ds.diagonal() = |
64 |
1/2✓ Branch 1 taken 4702 times.
✗ Branch 2 not taken.
|
4702 | Scalar(0.5) * |
65 |
1/2✓ Branch 1 taken 4702 times.
✗ Branch 2 not taken.
|
4702 | (Eigen::pow(a_.array() + Eigen::pow((s - u_lb_).array(), 2), |
66 | ✗ | Scalar(-0.5)) | |
67 |
5/10✓ Branch 1 taken 4702 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4702 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4702 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4702 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4702 times.
✗ Branch 14 not taken.
|
9404 | .array() * |
68 |
1/2✓ Branch 1 taken 4702 times.
✗ Branch 2 not taken.
|
4702 | (s - u_lb_).array() - |
69 |
1/2✓ Branch 1 taken 4702 times.
✗ Branch 2 not taken.
|
4702 | Eigen::pow(a_.array() + Eigen::pow((s - u_ub_).array(), 2), |
70 | ✗ | Scalar(-0.5)) | |
71 |
5/10✓ Branch 1 taken 4702 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4702 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4702 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4702 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4702 times.
✗ Branch 14 not taken.
|
9404 | .array() * |
72 | 4702 | (s - u_ub_).array()); | |
73 | 4702 | } | |
74 | |||
75 | template <typename NewScalar> | ||
76 | 25 | SquashingModelSmoothSatTpl<NewScalar> cast() const { | |
77 | typedef SquashingModelSmoothSatTpl<NewScalar> ReturnType; | ||
78 |
4/8✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 25 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 25 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 25 times.
✗ Branch 11 not taken.
|
50 | ReturnType ret(u_lb_.template cast<NewScalar>(), |
79 | 25 | u_ub_.template cast<NewScalar>(), ns_); | |
80 | 25 | return ret; | |
81 | } | ||
82 | |||
83 | ✗ | const Scalar get_smooth() const { return smooth_; }; | |
84 | ✗ | void set_smooth(const Scalar smooth) { | |
85 | ✗ | if (smooth < 0.) { | |
86 | ✗ | throw_pretty("Invalid argument: " << "Smooth value has to be positive"); | |
87 | } | ||
88 | ✗ | smooth_ = smooth; | |
89 | |||
90 | ✗ | d_ = (u_ub_ - u_lb_) * smooth_; | |
91 | ✗ | a_ = d_.array() * d_.array(); | |
92 | |||
93 | ✗ | s_lb_ = u_lb_; | |
94 | ✗ | s_ub_ = u_ub_; | |
95 | } | ||
96 | |||
97 | ✗ | const VectorXs& get_d() const { return d_; }; | |
98 | |||
99 | private: | ||
100 | VectorXs a_; | ||
101 | VectorXs d_; | ||
102 | |||
103 | Scalar smooth_; | ||
104 | |||
105 | using Base::ns_; | ||
106 | using Base::s_lb_; | ||
107 | using Base::s_ub_; | ||
108 | using Base::u_lb_; | ||
109 | using Base::u_ub_; | ||
110 | }; | ||
111 | |||
112 | } // namespace crocoddyl | ||
113 | |||
114 | CROCODDYL_DECLARE_EXTERN_TEMPLATE_CLASS(crocoddyl::SquashingModelSmoothSatTpl) | ||
115 | |||
116 | #endif // CROCODDYL_CORE_SQUASHING_SMOOTH_SAT_HPP_ | ||
117 |