10 #ifndef CROCODDYL_CORE_ACTIVATIONS_QUADRATIC_FLAT_EXP_HPP_
11 #define CROCODDYL_CORE_ACTIVATIONS_QUADRATIC_FLAT_EXP_HPP_
13 #include "crocoddyl/core/activation-base.hpp"
14 #include "crocoddyl/core/fwd.hpp"
33 template <
typename _Scalar>
37 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
40 typedef _Scalar Scalar;
45 typedef typename MathBase::VectorXs VectorXs;
46 typedef typename MathBase::MatrixXs MatrixXs;
58 const Scalar alpha = Scalar(1.))
59 :
Base(nr), alpha_(alpha) {
60 if (alpha < Scalar(0.)) {
61 throw_pretty(
"Invalid argument: " <<
"alpha should be a positive value");
72 virtual void calc(
const std::shared_ptr<ActivationDataAbstract> &data,
73 const Eigen::Ref<const VectorXs> &r)
override {
74 if (
static_cast<std::size_t
>(r.size()) != nr_) {
76 "Invalid argument: " <<
"r has wrong dimension (it should be " +
77 std::to_string(nr_) +
")");
79 std::shared_ptr<Data> d = std::static_pointer_cast<Data>(data);
81 d->a0 = exp(-r.squaredNorm() / alpha_);
82 data->a_value = Scalar(1.0) - d->a0;
91 virtual void calcDiff(
const std::shared_ptr<ActivationDataAbstract> &data,
92 const Eigen::Ref<const VectorXs> &r)
override {
93 if (
static_cast<std::size_t
>(r.size()) != nr_) {
95 "Invalid argument: " <<
"r has wrong dimension (it should be " +
96 std::to_string(nr_) +
")");
98 std::shared_ptr<Data> d = std::static_pointer_cast<Data>(data);
100 d->a1 = Scalar(2.0) / alpha_ * d->a0;
101 data->Ar = d->a1 * r;
102 data->Arr.diagonal() = -Scalar(2.0) * d->a1 * r.array().square() / alpha_;
103 data->Arr.diagonal().array() += d->a1;
111 virtual std::shared_ptr<ActivationDataAbstract>
createData()
override {
112 std::shared_ptr<Data> data =
113 std::allocate_shared<Data>(Eigen::aligned_allocator<Data>(),
this);
117 template <
typename NewScalar>
120 ReturnType res(nr_, scalar_cast<NewScalar>(alpha_));
124 Scalar get_alpha()
const {
return alpha_; };
125 void set_alpha(
const Scalar alpha) { alpha_ = alpha; };
132 virtual void print(std::ostream &os)
const override {
133 os <<
"ActivationModelQuadFlatExp {nr=" << nr_ <<
", a=" << alpha_ <<
"}";
149 template <
typename _Scalar>
152 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
154 typedef _Scalar Scalar;
156 typedef typename MathBase::VectorXs VectorXs;
157 typedef typename MathBase::DiagonalMatrixXs DiagonalMatrixXs;
160 template <
typename Activation>
162 :
Base(activation), a0(Scalar(0)), a1(Scalar(0)) {}
175 CROCODDYL_DECLARE_EXTERN_TEMPLATE_CLASS(
177 CROCODDYL_DECLARE_EXTERN_TEMPLATE_STRUCT(
virtual std::shared_ptr< ActivationDataAbstract > createData() override
Create the quadratic-flat-exp activation data.
virtual void print(std::ostream &os) const override
Print relevant information of the quadratic flat-exp model.