Crocoddyl
Loading...
Searching...
No Matches
smooth-1norm.hpp
1
2// BSD 3-Clause License
3//
4// Copyright (C) 2019-2026, LAAS-CNRS, University of Edinburgh,
5// Heriot-Watt University
6// Copyright note valid unless otherwise stated in individual files.
7// All rights reserved.
9
10#ifndef CROCODDYL_CORE_ACTIVATIONS_SMOOTH_1NORM_HPP_
11#define CROCODDYL_CORE_ACTIVATIONS_SMOOTH_1NORM_HPP_
12
13#include "crocoddyl/core/activation-base.hpp"
14#include "crocoddyl/core/fwd.hpp"
15
16namespace crocoddyl {
17
41template <typename _Scalar>
43 : public ActivationModelAbstractTpl<_Scalar> {
44 public:
45 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
47
48 typedef _Scalar Scalar;
49 typedef MathBaseTpl<Scalar> MathBase;
50 typedef ActivationModelAbstractTpl<Scalar> Base;
51 typedef ActivationDataAbstractTpl<Scalar> ActivationDataAbstract;
53 typedef typename MathBase::VectorXs VectorXs;
54 typedef typename MathBase::MatrixXs MatrixXs;
55
64 explicit ActivationModelSmooth1NormTpl(const std::size_t nr,
65 const Scalar delta = Scalar(1.))
66 : Base(nr), delta_(delta) {
67 if (delta_ <= Scalar(0.)) {
68 throw_pretty(
69 "Invalid argument: delta should be a strictly positive value");
70 }
71 };
72 virtual ~ActivationModelSmooth1NormTpl() = default;
73
80 virtual void calc(const std::shared_ptr<ActivationDataAbstract>& data,
81 const Eigen::Ref<const VectorXs>& r) override {
82 if (static_cast<std::size_t>(r.size()) != nr_) {
83 throw_pretty(
84 "Invalid argument: " << "r has wrong dimension (it should be " +
85 std::to_string(nr_) + ")");
86 }
87 std::shared_ptr<Data> d = std::static_pointer_cast<Data>(data);
88
89 d->a = (r.array().square() + delta_ * delta_).sqrt().matrix();
90 data->a_value =
91 delta_ * (r.array().square() / (d->a.array() + delta_)).sum();
92 };
93
100 virtual void calcDiff(const std::shared_ptr<ActivationDataAbstract>& data,
101 const Eigen::Ref<const VectorXs>& r) override {
102 if (static_cast<std::size_t>(r.size()) != nr_) {
103 throw_pretty(
104 "Invalid argument: " << "r has wrong dimension (it should be " +
105 std::to_string(nr_) + ")");
106 }
107
108 std::shared_ptr<Data> d = std::static_pointer_cast<Data>(data);
109 const VectorXs a_inv = d->a.cwiseInverse();
110
111 data->Ar = delta_ * r.cwiseProduct(a_inv);
112 data->Arr.diagonal() = delta_ * delta_ * delta_ *
113 a_inv.cwiseProduct(a_inv).cwiseProduct(a_inv);
114 };
115
121 virtual std::shared_ptr<ActivationDataAbstract> createData() override {
122 return std::allocate_shared<Data>(Eigen::aligned_allocator<Data>(), this);
123 };
124
125 template <typename NewScalar>
128 ReturnType res(nr_, scalar_cast<NewScalar>(delta_));
129 return res;
130 }
131
132 Scalar get_delta() const { return delta_; }
133
139 virtual void print(std::ostream& os) const override {
140 os << "ActivationModelSmooth1Norm {nr=" << nr_ << ", delta=" << delta_
141 << "}";
142 }
143
144 protected:
145 using Base::nr_;
146 Scalar delta_;
147};
148
149template <typename _Scalar>
150struct ActivationDataSmooth1NormTpl
151 : public ActivationDataAbstractTpl<_Scalar> {
152 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
153
154 typedef _Scalar Scalar;
155 typedef ActivationDataAbstractTpl<Scalar> Base;
156 typedef MathBaseTpl<Scalar> MathBase;
157 typedef typename MathBase::VectorXs VectorXs;
158 typedef typename MathBase::MatrixXs MatrixXs;
159 typedef typename MathBase::DiagonalMatrixXs DiagonalMatrixXs;
160
161 template <typename Activation>
162 explicit ActivationDataSmooth1NormTpl(Activation* const activation)
163 : Base(activation), a(VectorXs::Zero(activation->get_nr())) {}
164 virtual ~ActivationDataSmooth1NormTpl() = default;
165
166 VectorXs a;
167
168 using Base::a_value;
169 using Base::Ar;
170 using Base::Arr;
171};
172
173} // namespace crocoddyl
174
175CROCODDYL_DECLARE_EXTERN_TEMPLATE_CLASS(
177CROCODDYL_DECLARE_EXTERN_TEMPLATE_STRUCT(
179
180#endif // CROCODDYL_CORE_ACTIVATIONS_SMOOTH_1NORM_HPP_
virtual void calcDiff(const std::shared_ptr< ActivationDataAbstract > &data, const Eigen::Ref< const VectorXs > &r) override
Compute the derivatives of the smooth-abs function.
virtual std::shared_ptr< ActivationDataAbstract > createData() override
Create the smooth-abs activation data.
ActivationModelSmooth1NormTpl(const std::size_t nr, const Scalar delta=Scalar(1.))
Initialize the smooth-abs activation model.
virtual void calc(const std::shared_ptr< ActivationDataAbstract > &data, const Eigen::Ref< const VectorXs > &r) override
Compute the smooth-abs function.
virtual void print(std::ostream &os) const override
Print relevant information of the smooth-1norm model.