36 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
38 typedef _Scalar Scalar;
43 typedef typename MathBase::VectorXs VectorXs;
44 typedef typename MathBase::MatrixXs MatrixXs;
56 const Scalar &alpha = Scalar(1.))
57 :
Base(nr), alpha_(alpha) {
58 if (alpha < Scalar(0.)) {
59 throw_pretty(
"Invalid argument: " <<
"alpha should be a positive value");
70 virtual void calc(
const std::shared_ptr<ActivationDataAbstract> &data,
71 const Eigen::Ref<const VectorXs> &r) {
72 if (
static_cast<std::size_t
>(r.size()) != nr_) {
74 "Invalid argument: " <<
"r has wrong dimension (it should be " +
75 std::to_string(nr_) +
")");
77 std::shared_ptr<Data> d = std::static_pointer_cast<Data>(data);
78 d->a0 = r.squaredNorm() / alpha_;
79 data->a_value = log(Scalar(1.0) + d->a0);
88 virtual void calcDiff(
const std::shared_ptr<ActivationDataAbstract> &data,
89 const Eigen::Ref<const VectorXs> &r) {
90 if (
static_cast<std::size_t
>(r.size()) != nr_) {
92 "Invalid argument: " <<
"r has wrong dimension (it should be " +
93 std::to_string(nr_) +
")");
95 std::shared_ptr<Data> d = std::static_pointer_cast<Data>(data);
97 d->a1 = Scalar(2.0) / (alpha_ + alpha_ * d->a0);
99 data->Arr.diagonal() = -d->a1 * d->a1 * r.array().square();
100 data->Arr.diagonal().array() += d->a1;
108 virtual std::shared_ptr<ActivationDataAbstract> createData() {
109 std::shared_ptr<Data> data =
110 std::allocate_shared<Data>(Eigen::aligned_allocator<Data>(),
this);
114 Scalar get_alpha()
const {
return alpha_; };
115 void set_alpha(
const Scalar alpha) { alpha_ = alpha; };
122 virtual void print(std::ostream &os)
const {
123 os <<
"ActivationModelQuadFlatLog {nr=" << nr_ <<
", a=" << alpha_ <<
"}";