9 #ifndef CROCODDYL_CORE_ACTIVATIONS_2NORM_BARRIER_HPP_
10 #define CROCODDYL_CORE_ACTIVATIONS_2NORM_BARRIER_HPP_
12 #include <pinocchio/utils/static-if.hpp>
15 #include "crocoddyl/core/activation-base.hpp"
16 #include "crocoddyl/core/fwd.hpp"
17 #include "crocoddyl/core/utils/exception.hpp"
41 template <
typename _Scalar>
45 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
47 typedef _Scalar Scalar;
52 typedef typename MathBase::VectorXs VectorXs;
65 const Scalar alpha = Scalar(0.1),
66 const bool true_hessian =
false)
68 if (alpha < Scalar(0.)) {
69 throw_pretty(
"Invalid argument: " <<
"alpha should be a positive value");
80 virtual void calc(
const boost::shared_ptr<ActivationDataAbstract>& data,
81 const Eigen::Ref<const VectorXs>& r) {
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 boost::shared_ptr<Data> d = boost::static_pointer_cast<Data>(data);
91 data->a_value = Scalar(0.5) * (d->d -
alpha_) * (d->d -
alpha_);
93 data->a_value = Scalar(0.0);
103 virtual void calcDiff(
const boost::shared_ptr<ActivationDataAbstract>& data,
104 const Eigen::Ref<const VectorXs>& r) {
105 if (
static_cast<std::size_t
>(r.size()) != nr_) {
107 "Invalid argument: " <<
"r has wrong dimension (it should be " +
108 std::to_string(nr_) +
")");
110 boost::shared_ptr<Data> d = boost::static_pointer_cast<Data>(data);
113 data->Ar = (d->d -
alpha_) / d->d * r;
115 data->Arr.diagonal() =
116 alpha_ * r.array().square() / std::pow(d->d, 3);
117 data->Arr.diagonal().array() += (d->d -
alpha_) / d->d;
119 data->Arr.diagonal() =
120 r.array().square() / std::pow(d->d, 2);
133 virtual boost::shared_ptr<ActivationDataAbstract>
createData() {
134 return boost::allocate_shared<Data>(Eigen::aligned_allocator<Data>(),
this);
141 void set_alpha(
const Scalar& alpha) {
alpha_ = alpha; };
148 virtual void print(std::ostream& os)
const {
149 os <<
"ActivationModel2NormBarrier {nr=" << nr_ <<
", alpha=" <<
alpha_
160 template <
typename _Scalar>
163 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
165 typedef _Scalar Scalar;
168 template <
typename Activation>
170 :
Base(activation),
d(Scalar(0)) {}
2-norm barrier activation
virtual boost::shared_ptr< ActivationDataAbstract > createData()
Create the 2norm-barrier activation data.
Scalar alpha_
< Dimension of the residual vector
virtual void calc(const boost::shared_ptr< ActivationDataAbstract > &data, const Eigen::Ref< const VectorXs > &r)
Compute the 2-norm barrier function.
virtual void print(std::ostream &os) const
Print relevant information of the 2-norm barrier model.
ActivationModel2NormBarrierTpl(const std::size_t nr, const Scalar alpha=Scalar(0.1), const bool true_hessian=false)
Initialize the 2-norm barrier activation model.
virtual void calcDiff(const boost::shared_ptr< ActivationDataAbstract > &data, const Eigen::Ref< const VectorXs > &r)
Compute the derivatives of the 2norm-barrier function.
const Scalar & get_alpha() const
Get and set the threshold factor.
Scalar d
Norm of the residual.