10 #ifndef CROCODDYL_CORE_ACTIVATIONS_2NORM_BARRIER_HPP_
11 #define CROCODDYL_CORE_ACTIVATIONS_2NORM_BARRIER_HPP_
13 #include "crocoddyl/core/activation-base.hpp"
14 #include "crocoddyl/core/fwd.hpp"
38 template <
typename _Scalar>
42 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
45 typedef _Scalar Scalar;
50 typedef typename MathBase::VectorXs VectorXs;
63 const Scalar alpha = Scalar(0.1),
64 const bool true_hessian =
false)
66 if (alpha < Scalar(0.)) {
67 throw_pretty(
"Invalid argument: " <<
"alpha should be a positive value");
78 virtual void calc(
const std::shared_ptr<ActivationDataAbstract>& data,
79 const Eigen::Ref<const VectorXs>& r)
override {
80 if (
static_cast<std::size_t
>(r.size()) != nr_) {
82 "Invalid argument: " <<
"r has wrong dimension (it should be " +
83 std::to_string(nr_) +
")");
85 std::shared_ptr<Data> d = std::static_pointer_cast<Data>(data);
89 data->a_value = Scalar(0.5) * (d->d -
alpha_) * (d->d -
alpha_);
91 data->a_value = Scalar(0.0);
101 virtual void calcDiff(
const std::shared_ptr<ActivationDataAbstract>& data,
102 const Eigen::Ref<const VectorXs>& r)
override {
103 if (
static_cast<std::size_t
>(r.size()) != nr_) {
105 "Invalid argument: " <<
"r has wrong dimension (it should be " +
106 std::to_string(nr_) +
")");
108 std::shared_ptr<Data> d = std::static_pointer_cast<Data>(data);
111 data->Ar = (d->d -
alpha_) / d->d * r;
113 data->Arr.diagonal() =
114 alpha_ * r.array().square() / pow(d->d, Scalar(3));
115 data->Arr.diagonal().array() += (d->d -
alpha_) / d->d;
117 data->Arr.diagonal() =
119 pow(d->d, Scalar(2));
132 virtual std::shared_ptr<ActivationDataAbstract>
createData()
override {
133 return std::allocate_shared<Data>(Eigen::aligned_allocator<Data>(),
this);
136 template <
typename NewScalar>
147 void set_alpha(
const Scalar& alpha) {
alpha_ = alpha; };
154 virtual void print(std::ostream& os)
const override {
155 os <<
"ActivationModel2NormBarrier {nr=" << nr_ <<
", alpha=" <<
alpha_
166 template <
typename _Scalar>
169 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
171 typedef _Scalar Scalar;
173 typedef typename MathBase::VectorXs VectorXs;
174 typedef typename MathBase::DiagonalMatrixXs DiagonalMatrixXs;
177 template <
typename Activation>
179 :
Base(activation),
d(Scalar(0)) {}
191 CROCODDYL_DECLARE_EXTERN_TEMPLATE_CLASS(
193 CROCODDYL_DECLARE_EXTERN_TEMPLATE_STRUCT(
2-norm barrier activation
virtual void calcDiff(const std::shared_ptr< ActivationDataAbstract > &data, const Eigen::Ref< const VectorXs > &r) override
Compute the derivatives of the 2norm-barrier function.
Scalar alpha_
< Dimension of the residual vector
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 std::shared_ptr< ActivationDataAbstract > createData() override
Create the 2norm-barrier activation data.
const Scalar & get_alpha() const
Get and set the threshold factor.
virtual void calc(const std::shared_ptr< ActivationDataAbstract > &data, const Eigen::Ref< const VectorXs > &r) override
Compute the 2-norm barrier function.
virtual void print(std::ostream &os) const override
Print relevant information of the 2-norm barrier model.
Scalar d
Norm of the residual.