10#ifndef CROCODDYL_CORE_ACTIVATIONS_SMOOTH_1NORM_HPP_ 11#define CROCODDYL_CORE_ACTIVATIONS_SMOOTH_1NORM_HPP_ 13#include "crocoddyl/core/activation-base.hpp" 14#include "crocoddyl/core/fwd.hpp" 41template <
typename _Scalar>
43 :
public ActivationModelAbstractTpl<_Scalar> {
45 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
48 typedef _Scalar Scalar;
50 typedef ActivationModelAbstractTpl<Scalar> Base;
53 typedef typename MathBase::VectorXs VectorXs;
54 typedef typename MathBase::MatrixXs MatrixXs;
65 const Scalar delta = Scalar(1.))
66 : Base(nr),
delta_(delta) {
67 if (
delta_ <= Scalar(0.)) {
69 "Invalid argument: delta should be a strictly positive value");
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_) {
84 "Invalid argument: " <<
"r has wrong dimension (it should be " +
85 std::to_string(nr_) +
")");
87 std::shared_ptr<Data> d = std::static_pointer_cast<Data>(data);
89 d->a = (r.array().square() +
delta_ *
delta_).sqrt().matrix();
91 delta_ * (r.array().square() / (d->a.array() +
delta_)).sum();
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_) {
104 "Invalid argument: " <<
"r has wrong dimension (it should be " +
105 std::to_string(nr_) +
")");
108 std::shared_ptr<Data> d = std::static_pointer_cast<Data>(data);
109 const VectorXs a_inv = d->a.cwiseInverse();
111 data->Ar =
delta_ * r.cwiseProduct(a_inv);
113 a_inv.cwiseProduct(a_inv).cwiseProduct(a_inv);
121 virtual std::shared_ptr<ActivationDataAbstract>
createData()
override {
122 return std::allocate_shared<Data>(Eigen::aligned_allocator<Data>(),
this);
125 template <
typename NewScalar>
128 ReturnType res(nr_, scalar_cast<NewScalar>(
delta_));
132 Scalar get_delta()
const {
return delta_; }
139 virtual void print(std::ostream& os)
const override {
140 os <<
"ActivationModelSmooth1Norm {nr=" << nr_ <<
", delta=" <<
delta_ 149template <
typename _Scalar>
150struct ActivationDataSmooth1NormTpl
151 :
public ActivationDataAbstractTpl<_Scalar> {
152 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
154 typedef _Scalar Scalar;
155 typedef ActivationDataAbstractTpl<Scalar> Base;
157 typedef typename MathBase::VectorXs VectorXs;
158 typedef typename MathBase::MatrixXs MatrixXs;
159 typedef typename MathBase::DiagonalMatrixXs DiagonalMatrixXs;
161 template <
typename Activation>
162 explicit ActivationDataSmooth1NormTpl(Activation*
const activation)
163 : Base(activation), a(VectorXs::Zero(activation->get_nr())) {}
164 virtual ~ActivationDataSmooth1NormTpl() =
default;
175CROCODDYL_DECLARE_EXTERN_TEMPLATE_CLASS(
177CROCODDYL_DECLARE_EXTERN_TEMPLATE_STRUCT(
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.