Crocoddyl
activation-base.hpp
1 // BSD 3-Clause License
3 //
4 // Copyright (C) 2019-2025, LAAS-CNRS, University of Edinburgh,
5 // Heriot-Watt University
6 // Copyright note valid unless otherwise stated in individual files.
7 // All rights reserved.
9 
10 #ifndef CROCODDYL_CORE_ACTIVATION_BASE_HPP_
11 #define CROCODDYL_CORE_ACTIVATION_BASE_HPP_
12 
13 #include "crocoddyl/core/fwd.hpp"
14 
15 namespace crocoddyl {
16 
18  public:
19  virtual ~ActivationModelBase() = default;
20 
22 };
23 
24 template <typename _Scalar>
26  public:
27  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
28 
29  typedef _Scalar Scalar;
32  typedef typename MathBase::VectorXs VectorXs;
33  typedef typename MathBase::MatrixXs MatrixXs;
34 
35  explicit ActivationModelAbstractTpl(const std::size_t nr) : nr_(nr) {};
36  virtual ~ActivationModelAbstractTpl() = default;
37 
38  virtual void calc(const std::shared_ptr<ActivationDataAbstract>& data,
39  const Eigen::Ref<const VectorXs>& r) = 0;
40  virtual void calcDiff(const std::shared_ptr<ActivationDataAbstract>& data,
41  const Eigen::Ref<const VectorXs>& r) = 0;
42  virtual std::shared_ptr<ActivationDataAbstract> createData() {
43  return std::allocate_shared<ActivationDataAbstract>(
44  Eigen::aligned_allocator<ActivationDataAbstract>(), this);
45  };
46 
47  std::size_t get_nr() const { return nr_; };
48 
52  friend std::ostream& operator<<(
53  std::ostream& os, const ActivationModelAbstractTpl<Scalar>& model) {
54  model.print(os);
55  return os;
56  }
57 
63  virtual void print(std::ostream& os) const {
64  os << boost::core::demangle(typeid(*this).name());
65  }
66 
67  protected:
68  std::size_t nr_;
69  ActivationModelAbstractTpl() : nr_(0) {};
70 };
71 
72 template <typename _Scalar>
74  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
75 
76  typedef _Scalar Scalar;
78  typedef typename MathBase::VectorXs VectorXs;
79  typedef typename MathBase::MatrixXs MatrixXs;
80  typedef typename MathBase::DiagonalMatrixXs DiagonalMatrixXs;
81 
82  template <template <typename Scalar> class Activation>
83  explicit ActivationDataAbstractTpl(Activation<Scalar>* const activation)
84  : a_value(Scalar(0.)),
85  Ar(VectorXs::Zero(activation->get_nr())),
86  Arr(DiagonalMatrixXs(activation->get_nr())) {
87  Arr.setZero();
88  }
89  virtual ~ActivationDataAbstractTpl() = default;
90 
91  Scalar a_value;
92  VectorXs Ar;
93  DiagonalMatrixXs Arr;
94 
95  static MatrixXs getHessianMatrix(
97  return data.Arr.diagonal().asDiagonal();
98  }
99  static void setHessianMatrix(ActivationDataAbstractTpl<Scalar>& data,
100  const MatrixXs& Arr) {
101  data.Arr.diagonal() = Arr.diagonal();
102  }
103 };
104 
105 } // namespace crocoddyl
106 
107 CROCODDYL_DECLARE_EXTERN_TEMPLATE_CLASS(crocoddyl::ActivationModelAbstractTpl)
108 CROCODDYL_DECLARE_EXTERN_TEMPLATE_STRUCT(crocoddyl::ActivationDataAbstractTpl)
109 
110 #endif // CROCODDYL_CORE_ACTIVATION_BASE_HPP_
friend std::ostream & operator<<(std::ostream &os, const ActivationModelAbstractTpl< Scalar > &model)
Print information on the activation model.
virtual void print(std::ostream &os) const
Print relevant information of the activation model.