Crocoddyl
 
Loading...
Searching...
No Matches
quadratic-flat-exp.hpp
1
2// BSD 3-Clause License
3//
4// Copyright (C) 2020, LAAS-CNRS, University of Edinburgh
5// Copyright note valid unless otherwise stated in individual files.
6// All rights reserved.
8
9#ifndef CROCODDYL_CORE_ACTIVATIONS_QUADRATIC_FLAT_EXP_HPP_
10#define CROCODDYL_CORE_ACTIVATIONS_QUADRATIC_FLAT_EXP_HPP_
11
12#include "crocoddyl/core/activation-base.hpp"
13#include "crocoddyl/core/fwd.hpp"
14#include "crocoddyl/core/utils/exception.hpp"
15
16namespace crocoddyl {
17
18/*
19 * @brief Quadratic-flat-exp activation
20 *
21 * This activation function describes a quadratic exponential activation
22 * depending on the square norm of a residual vector, i.e. \f[ \begin{equation}
23 * 1 - exp(\|\mathbf{r}\|^2 / \alpha) \end{equation} \f] where \f$\alpha\f$
24 * defines the width of the quadratic basin, \f$r\f$ is the scalar residual,
25 * \f$nr\f$ is the dimension of the residual vector. Far
26 * away from zero, the quadFlat activation is nearly flat.
27 *
28 * The computation of the function and it derivatives are carried out in
29 * `calc()` and `caldDiff()`, respectively.
30 *
31 * \sa `calc()`, `calcDiff()`, `createData()`
32 */
33template <typename _Scalar>
35 : public ActivationModelAbstractTpl<_Scalar> {
36 public:
37 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
38
39 typedef _Scalar Scalar;
44 typedef typename MathBase::VectorXs VectorXs;
45 typedef typename MathBase::MatrixXs MatrixXs;
46
47 /*
48 * @brief Initialize the quadratic-flat-exp activation model
49 *
50 * The default `alpha` value is defined as 1.
51 *
52 * @param[in] nr Dimension of the residual vector
53 * @param[in] alpha Width of quadratic basin (default: 1.)
54 */
55
56 explicit ActivationModelQuadFlatExpTpl(const std::size_t &nr,
57 const Scalar &alpha = Scalar(1.))
58 : Base(nr), alpha_(alpha) {
59 if (alpha < Scalar(0.)) {
60 throw_pretty("Invalid argument: " << "alpha should be a positive value");
61 }
62 };
64
65 /*
66 * @brief Compute the quadratic-flat-exp function
67 *
68 * @param[in] data Quadratic-flat activation data
69 * @param[in] r Residual vector \f$\mathbf{r}\in\mathbb{R}^{nr}\f$
70 */
71 virtual void calc(const std::shared_ptr<ActivationDataAbstract> &data,
72 const Eigen::Ref<const VectorXs> &r) {
73 if (static_cast<std::size_t>(r.size()) != nr_) {
74 throw_pretty(
75 "Invalid argument: " << "r has wrong dimension (it should be " +
76 std::to_string(nr_) + ")");
77 }
78 std::shared_ptr<Data> d = std::static_pointer_cast<Data>(data);
79
80 d->a0 = exp(-r.squaredNorm() / alpha_);
81 data->a_value = Scalar(1.0) - d->a0;
82 };
83
84 /*
85 * @brief Compute the derivatives of the quadratic-flat-exp function
86 *
87 * @param[in] data Quadratic-flat activation data
88 * @param[in] r Residual vector \f$\mathbf{r}\in\mathbb{R}^{nr}\f$
89 */
90 virtual void calcDiff(const std::shared_ptr<ActivationDataAbstract> &data,
91 const Eigen::Ref<const VectorXs> &r) {
92 if (static_cast<std::size_t>(r.size()) != nr_) {
93 throw_pretty(
94 "Invalid argument: " << "r has wrong dimension (it should be " +
95 std::to_string(nr_) + ")");
96 }
97 std::shared_ptr<Data> d = std::static_pointer_cast<Data>(data);
98
99 d->a1 = Scalar(2.0) / alpha_ * d->a0;
100 data->Ar = d->a1 * r;
101 data->Arr.diagonal() = -Scalar(2.0) * d->a1 * r.array().square() / alpha_;
102 data->Arr.diagonal().array() += d->a1;
103 };
104
110 virtual std::shared_ptr<ActivationDataAbstract> createData() {
111 std::shared_ptr<Data> data =
112 std::allocate_shared<Data>(Eigen::aligned_allocator<Data>(), this);
113 return data;
114 };
115
116 Scalar get_alpha() const { return alpha_; };
117 void set_alpha(const Scalar alpha) { alpha_ = alpha; };
118
124 virtual void print(std::ostream &os) const {
125 os << "ActivationModelQuadFlatExp {nr=" << nr_ << ", a=" << alpha_ << "}";
126 }
127
128 protected:
129 using Base::nr_;
130
131 private:
132 Scalar alpha_;
133};
134
135/*
136 * @brief Data structure of the quadratic-flat-exp activation
137 *
138 * @param[in] a0 computed in calc to avoid recomputation
139 * @param[in] a1 computed in calcDiff to avoid recomputation
140 */
141template <typename _Scalar>
143 : public ActivationDataAbstractTpl<_Scalar> {
144 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
145
146 typedef _Scalar Scalar;
149
150 template <typename Activation>
151 explicit ActivationDataQuadFlatExpTpl(Activation *const activation)
152 : Base(activation), a0(0), a1(0) {}
153
154 Scalar a0;
155 Scalar a1;
156};
157
158} // namespace crocoddyl
159
160#endif // CROCODDYL_CORE_ACTIVATIONS_QUADRATIC_FLAT_EXP_HPP_
virtual void print(std::ostream &os) const
Print relevant information of the quadratic flat-exp model.
virtual std::shared_ptr< ActivationDataAbstract > createData()
Create the quadratic-flat-exp activation data.