activation-weighted-log.hpp
Go to the documentation of this file.
1 // 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_WEIGHTED_LOG_HPP_
10 #define CROCODDYL_CORE_ACTIVATIONS_WEIGHTED_LOG_HPP_
11 
12 #include <crocoddyl/core/activation-base.hpp>
13 #include <crocoddyl/core/fwd.hpp>
14 #include <crocoddyl/core/utils/exception.hpp>
15 #include <stdexcept>
16 
17 #include "sobec/fwd.hpp"
18 
19 namespace sobec {
20 using namespace crocoddyl;
21 
22 template <typename _Scalar>
24  : public ActivationModelAbstractTpl<_Scalar> {
25  public:
26  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
27 
28  typedef _Scalar Scalar;
29  typedef MathBaseTpl<Scalar> MathBase;
30  typedef ActivationModelAbstractTpl<Scalar> Base;
31  typedef ActivationDataAbstractTpl<Scalar> ActivationDataAbstract;
33  typedef typename MathBase::VectorXs VectorXs;
34  typedef typename MathBase::MatrixXs MatrixXs;
35 
36  explicit ActivationModelWeightedLogTpl(const VectorXs &weights,
37  const Scalar &alpha = Scalar(1.))
38  : Base(weights.size()), weights_(weights), alpha_(alpha) {
39  if (alpha < Scalar(0.)) {
40  throw_pretty("Invalid argument: "
41  << "alpha should be a positive value");
42  }
43  };
45 
46  virtual void calc(const boost::shared_ptr<ActivationDataAbstract> &data,
47  const Eigen::Ref<const VectorXs> &r) {
48  if (static_cast<std::size_t>(r.size()) != nr_) {
49  throw_pretty("Invalid argument: "
50  << "r has wrong dimension (it should be " +
51  std::to_string(nr_) + ")");
52  }
53  boost::shared_ptr<Data> d = boost::static_pointer_cast<Data>(data);
54  d->Wr = weights_.cwiseProduct(r);
55  d->a0 = r.dot(d->Wr) / alpha_;
56  data->a_value = log(Scalar(1.0) + d->a0);
57  };
58 
59  virtual void calcDiff(const boost::shared_ptr<ActivationDataAbstract> &data,
60  const Eigen::Ref<const VectorXs> &r) {
61  if (static_cast<std::size_t>(r.size()) != nr_) {
62  throw_pretty("Invalid argument: "
63  << "r has wrong dimension (it should be " +
64  std::to_string(nr_) + ")");
65  }
66  boost::shared_ptr<Data> d = boost::static_pointer_cast<Data>(data);
67 
68  d->a1 = Scalar(2.0) / (alpha_ + alpha_ * d->a0);
69  data->Ar = d->a1 * d->Wr;
70  data->Arr.diagonal() = -d->a1 * d->a1 * d->Wr.array().square();
71  data->Arr.diagonal() += d->a1 * weights_;
72  };
73 
74  virtual boost::shared_ptr<ActivationDataAbstract> createData() {
75  boost::shared_ptr<Data> data =
76  boost::allocate_shared<Data>(Eigen::aligned_allocator<Data>(), this);
77  return data;
78  };
79 
80  Scalar get_alpha() const { return alpha_; };
81  void set_alpha(const Scalar alpha) { alpha_ = alpha; };
82  const VectorXs &get_weights() const { return weights_; };
83  void set_weights(const VectorXs &weights) {
84  if (weights.size() != weights_.size()) {
85  throw_pretty("Invalid argument: "
86  << "weight vector has wrong dimension (it should be " +
87  std::to_string(weights_.size()) + ")");
88  }
89 
90  weights_ = weights;
91  };
92 
93  virtual void print(std::ostream &os) const {
94  os << "ActivationModelWeightedLog {nr=" << nr_ << ", a=" << alpha_ << "}";
95  }
96 
97  protected:
98  using Base::nr_;
99 
100  private:
101  VectorXs weights_;
102  Scalar alpha_;
103 };
104 
105 template <typename _Scalar>
107  : public ActivationDataAbstractTpl<_Scalar> {
108  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
109 
110  typedef _Scalar Scalar;
111  typedef MathBaseTpl<Scalar> MathBase;
112  typedef typename MathBase::VectorXs VectorXs;
113  typedef ActivationDataAbstractTpl<Scalar> Base;
114 
115  template <typename Activation>
116  explicit ActivationDataWeightedLogTpl(Activation *const activation)
117  : Base(activation),
118  a0(0),
119  a1(0),
120  Wr(VectorXs::Zero(activation->get_nr())) {}
121 
122  Scalar a0;
123  Scalar a1;
125 };
126 
127 } // namespace sobec
128 
129 #endif // CROCODDYL_CORE_ACTIVATIONS_WEIGHTED_LOG_HPP_
sobec::ActivationModelWeightedLogTpl::VectorXs
MathBase::VectorXs VectorXs
Definition: activation-weighted-log.hpp:33
sobec::ActivationDataWeightedLogTpl::Base
ActivationDataAbstractTpl< Scalar > Base
Definition: activation-weighted-log.hpp:113
sobec::ActivationModelWeightedLogTpl::get_weights
const VectorXs & get_weights() const
Definition: activation-weighted-log.hpp:82
sobec::ActivationDataWeightedLogTpl
Definition: activation-weighted-log.hpp:106
sobec::ActivationDataWeightedLogTpl::Scalar
EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef _Scalar Scalar
Definition: activation-weighted-log.hpp:110
fwd.hpp
sobec::ActivationModelWeightedLogTpl::Data
ActivationDataWeightedLogTpl< Scalar > Data
Definition: activation-weighted-log.hpp:32
sobec::ActivationModelWeightedLogTpl::createData
virtual boost::shared_ptr< ActivationDataAbstract > createData()
Definition: activation-weighted-log.hpp:74
sobec::ActivationModelWeightedLogTpl::set_weights
void set_weights(const VectorXs &weights)
Definition: activation-weighted-log.hpp:83
sobec::ActivationDataWeightedLogTpl::Wr
VectorXs Wr
Definition: activation-weighted-log.hpp:124
sobec::ActivationModelWeightedLogTpl::print
virtual void print(std::ostream &os) const
Definition: activation-weighted-log.hpp:93
sobec::ActivationDataWeightedLogTpl::VectorXs
MathBase::VectorXs VectorXs
Definition: activation-weighted-log.hpp:112
sobec::ActivationModelWeightedLogTpl::set_alpha
void set_alpha(const Scalar alpha)
Definition: activation-weighted-log.hpp:81
sobec::ActivationModelWeightedLogTpl::get_alpha
Scalar get_alpha() const
Definition: activation-weighted-log.hpp:80
sobec::ActivationDataWeightedLogTpl::a1
Scalar a1
Definition: activation-weighted-log.hpp:123
sobec::ActivationDataWeightedLogTpl::ActivationDataWeightedLogTpl
ActivationDataWeightedLogTpl(Activation *const activation)
Definition: activation-weighted-log.hpp:116
sobec
Definition: activation-quad-ref.hpp:19
sobec::ActivationModelWeightedLogTpl::calc
virtual void calc(const boost::shared_ptr< ActivationDataAbstract > &data, const Eigen::Ref< const VectorXs > &r)
Definition: activation-weighted-log.hpp:46
sobec::ActivationModelWeightedLogTpl
Definition: activation-weighted-log.hpp:23
sobec::ActivationModelWeightedLogTpl::~ActivationModelWeightedLogTpl
virtual ~ActivationModelWeightedLogTpl()
Definition: activation-weighted-log.hpp:44
sobec::ActivationModelWeightedLogTpl::MatrixXs
MathBase::MatrixXs MatrixXs
Definition: activation-weighted-log.hpp:34
sobec::ActivationDataWeightedLogTpl::MathBase
MathBaseTpl< Scalar > MathBase
Definition: activation-weighted-log.hpp:111
sobec::ActivationModelWeightedLogTpl::calcDiff
virtual void calcDiff(const boost::shared_ptr< ActivationDataAbstract > &data, const Eigen::Ref< const VectorXs > &r)
Definition: activation-weighted-log.hpp:59
sobec::ActivationModelWeightedLogTpl::Base
ActivationModelAbstractTpl< Scalar > Base
Definition: activation-weighted-log.hpp:30
sobec::ActivationModelWeightedLogTpl::MathBase
MathBaseTpl< Scalar > MathBase
Definition: activation-weighted-log.hpp:29
sobec::ActivationModelWeightedLogTpl::ActivationModelWeightedLogTpl
ActivationModelWeightedLogTpl(const VectorXs &weights, const Scalar &alpha=Scalar(1.))
Definition: activation-weighted-log.hpp:36
sobec::ActivationModelWeightedLogTpl::ActivationDataAbstract
ActivationDataAbstractTpl< Scalar > ActivationDataAbstract
Definition: activation-weighted-log.hpp:31
sobec::ActivationModelWeightedLogTpl::Scalar
EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef _Scalar Scalar
Definition: activation-weighted-log.hpp:28
sobec::ActivationDataWeightedLogTpl::a0
Scalar a0
Definition: activation-weighted-log.hpp:122