10 #ifndef CROCODDYL_CORE_ACTIVATIONS_QUADRATIC_BARRIER_HPP_
11 #define CROCODDYL_CORE_ACTIVATIONS_QUADRATIC_BARRIER_HPP_
13 #include "crocoddyl/core/activation-base.hpp"
14 #include "crocoddyl/core/fwd.hpp"
18 template <
typename _Scalar>
20 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
22 typedef _Scalar Scalar;
24 typedef typename MathBase::VectorXs VectorXs;
25 typedef typename MathBase::MatrixXs MatrixXs;
28 const Scalar b = Scalar(1.))
29 : lb(lower), ub(upper), beta(b) {
30 if (lb.size() != ub.size()) {
31 throw_pretty(
"Invalid argument: "
32 <<
"The lower and upper bounds don't have the same "
33 "dimension (lb,ub dimensions equal to " +
34 std::to_string(lb.size()) +
"," +
35 std::to_string(ub.size()) +
", respectively)");
37 if (beta < Scalar(0) || beta > Scalar(1.)) {
39 "Invalid argument: " <<
"The range of beta is between 0 and 1");
41 for (std::size_t i = 0; i < static_cast<std::size_t>(lb.size()); ++i) {
42 if (isfinite(lb(i)) && isfinite(ub(i))) {
43 if (lb(i) - ub(i) > Scalar(0)) {
44 throw_pretty(
"Invalid argument: "
45 <<
"The lower and upper bounds are badly defined; ub "
46 "has to be bigger / equals to lb");
50 if (!isfinite(lb(i))) {
51 lb(i) = -std::numeric_limits<Scalar>::max();
53 if (!isfinite(ub(i))) {
54 ub(i) = std::numeric_limits<Scalar>::max();
58 if (beta >= Scalar(0) && beta <= Scalar(1.)) {
59 for (std::size_t i = 0; i < static_cast<std::size_t>(lb.size()); ++i) {
61 if (lb(i) != (-std::numeric_limits<Scalar>::max()) &&
62 ub(i) != (std::numeric_limits<Scalar>::max())) {
63 Scalar m = Scalar(0.5) * (lb(i) + ub(i));
64 Scalar d = Scalar(0.5) * (ub(i) - lb(i));
74 : lb(other.lb), ub(other.ub), beta(other.beta) {}
77 template <
typename NewScalar>
80 ReturnType res(lb.template cast<NewScalar>(), ub.template cast<NewScalar>(),
81 scalar_cast<NewScalar>(beta));
103 void print(std::ostream& os)
const {
104 os <<
"ActivationBounds {lb=" << lb.transpose() <<
", ub=" << ub.transpose()
105 <<
", beta=" << beta <<
"}";
113 template <
typename _Scalar>
117 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
121 typedef _Scalar Scalar;
127 typedef typename MathBase::VectorXs VectorXs;
128 typedef typename MathBase::MatrixXs MatrixXs;
131 :
Base(bounds.lb.size()), bounds_(bounds) {};
134 virtual void calc(
const std::shared_ptr<ActivationDataAbstract>& data,
135 const Eigen::Ref<const VectorXs>& r)
override {
136 if (
static_cast<std::size_t
>(r.size()) != nr_) {
138 "Invalid argument: " <<
"r has wrong dimension (it should be " +
139 std::to_string(nr_) +
")");
142 std::shared_ptr<Data> d = std::static_pointer_cast<Data>(data);
144 d->rlb_min_ = (r - bounds_.lb).array().min(Scalar(0.));
145 d->rub_max_ = (r - bounds_.ub).array().max(Scalar(0.));
146 data->a_value = Scalar(0.5) * d->rlb_min_.matrix().squaredNorm() +
147 Scalar(0.5) * d->rub_max_.matrix().squaredNorm();
150 virtual void calcDiff(
const std::shared_ptr<ActivationDataAbstract>& data,
151 const Eigen::Ref<const VectorXs>& r)
override {
152 if (
static_cast<std::size_t
>(r.size()) != nr_) {
154 "Invalid argument: " <<
"r has wrong dimension (it should be " +
155 std::to_string(nr_) +
")");
158 std::shared_ptr<Data> d = std::static_pointer_cast<Data>(data);
159 data->Ar = (d->rlb_min_ + d->rub_max_).matrix();
161 using pinocchio::internal::if_then_else;
162 for (Eigen::Index i = 0; i < data->Arr.cols(); i++) {
163 data->Arr.diagonal()[i] = if_then_else(
164 pinocchio::internal::LE, r[i] - bounds_.lb[i], Scalar(0.), Scalar(1.),
165 if_then_else(pinocchio::internal::GE, r[i] - bounds_.ub[i],
166 Scalar(0.), Scalar(1.), Scalar(0.)));
170 virtual std::shared_ptr<ActivationDataAbstract> createData()
override {
171 return std::allocate_shared<Data>(Eigen::aligned_allocator<Data>(),
this);
174 template <
typename NewScalar>
177 ReturnType res(bounds_.template cast<NewScalar>());
189 virtual void print(std::ostream& os)
const override {
190 os <<
"ActivationModelQuadraticBarrier {nr=" << nr_ <<
"}";
200 template <
typename _Scalar>
203 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
205 typedef _Scalar Scalar;
207 typedef typename MathBase::ArrayXs ArrayXs;
208 typedef typename MathBase::VectorXs VectorXs;
209 typedef typename MathBase::DiagonalMatrixXs DiagonalMatrixXs;
212 template <
typename Activation>
215 rlb_min_(activation->get_nr()),
216 rub_max_(activation->get_nr()) {
232 CROCODDYL_DECLARE_EXTERN_TEMPLATE_CLASS(
234 CROCODDYL_DECLARE_EXTERN_TEMPLATE_STRUCT(
virtual void print(std::ostream &os) const override
Print relevant information of the quadratic barrier model.
friend std::ostream & operator<<(std::ostream &os, const ActivationBoundsTpl &bounds)
Print information on the activation bounds.