9#ifndef CROCODDYL_CORE_ACTIVATIONS_SMOOTH_2NORM_HPP_ 10#define CROCODDYL_CORE_ACTIVATIONS_SMOOTH_2NORM_HPP_ 12#include "crocoddyl/core/activation-base.hpp" 13#include "crocoddyl/core/fwd.hpp" 31template <
typename _Scalar>
33 :
public ActivationModelAbstractTpl<_Scalar> {
35 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
38 typedef _Scalar Scalar;
40 typedef ActivationModelAbstractTpl<Scalar> Base;
42 typedef typename MathBase::VectorXs VectorXs;
43 typedef typename MathBase::MatrixXs MatrixXs;
54 const Scalar eps = Scalar(1.))
55 : Base(nr),
eps_(eps) {
56 if (eps < Scalar(0.)) {
57 throw_pretty(
"Invalid argument: " <<
"eps should be a positive value");
68 virtual void calc(
const std::shared_ptr<ActivationDataAbstract>& data,
69 const Eigen::Ref<const VectorXs>& r)
override {
70 if (
static_cast<std::size_t
>(r.size()) != nr_) {
72 "Invalid argument: " <<
"r has wrong dimension (it should be " +
73 std::to_string(nr_) +
")");
76 data->a_value = sqrt(r.squaredNorm() +
eps_);
85 virtual void calcDiff(
const std::shared_ptr<ActivationDataAbstract>& data,
86 const Eigen::Ref<const VectorXs>& r)
override {
87 if (
static_cast<std::size_t
>(r.size()) != nr_) {
89 "Invalid argument: " <<
"r has wrong dimension (it should be " +
90 std::to_string(nr_) +
")");
93 data->Ar = r / data->a_value;
94 data->Arr.diagonal().array() = Scalar(1) / pow(data->a_value, Scalar(3));
102 virtual std::shared_ptr<ActivationDataAbstract>
createData()
override {
103 return std::allocate_shared<ActivationDataAbstract>(
104 Eigen::aligned_allocator<ActivationDataAbstract>(),
this);
107 template <
typename NewScalar>
110 ReturnType res(nr_, scalar_cast<NewScalar>(
eps_));
120 virtual void print(std::ostream& os)
const override {
121 os <<
"ActivationModelSmooth2Norm {nr=" << nr_ <<
", eps=" <<
eps_ <<
"}";
130CROCODDYL_DECLARE_EXTERN_TEMPLATE_CLASS(
virtual void calcDiff(const std::shared_ptr< ActivationDataAbstract > &data, const Eigen::Ref< const VectorXs > &r) override
Compute the derivatives of the smooth-2Norm function.
ActivationModelSmooth2NormTpl(const std::size_t nr, const Scalar eps=Scalar(1.))
Initialize the smooth-2Norm activation model.
virtual std::shared_ptr< ActivationDataAbstract > createData() override
Create the smooth-2norm activation data.
virtual void calc(const std::shared_ptr< ActivationDataAbstract > &data, const Eigen::Ref< const VectorXs > &r) override
Compute the smooth-2Norm function.
virtual void print(std::ostream &os) const override
Print relevant information of the smooth-1norm model.