19class ActivationModelQuadTpl :
public ActivationModelAbstractTpl<_Scalar> {
21 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
24 typedef _Scalar Scalar;
26 typedef ActivationModelAbstractTpl<Scalar> Base;
28 typedef typename MathBase::VectorXs VectorXs;
29 typedef typename MathBase::MatrixXs MatrixXs;
31 explicit ActivationModelQuadTpl(
const std::size_t nr) : Base(nr) {};
32 virtual ~ActivationModelQuadTpl() =
default;
34 virtual void calc(
const std::shared_ptr<ActivationDataAbstract>& data,
35 const Eigen::Ref<const VectorXs>& r)
override {
36 if (
static_cast<std::size_t
>(r.size()) != nr_) {
38 "Invalid argument: " <<
"r has wrong dimension (it should be " +
39 std::to_string(nr_) +
")");
41 data->a_value = Scalar(0.5) * r.dot(r);
44 virtual void calcDiff(
const std::shared_ptr<ActivationDataAbstract>& data,
45 const Eigen::Ref<const VectorXs>& r)
override {
46 if (
static_cast<std::size_t
>(r.size()) != nr_) {
48 "Invalid argument: " <<
"r has wrong dimension (it should be " +
49 std::to_string(nr_) +
")");
54 assert_pretty(MatrixXs(data->Arr).isApprox(MatrixXs::Identity(nr_, nr_)),
55 "Arr has wrong value");
58 virtual std::shared_ptr<ActivationDataAbstract> createData()
override {
59 std::shared_ptr<ActivationDataAbstract> data =
60 std::allocate_shared<ActivationDataAbstract>(
61 Eigen::aligned_allocator<ActivationDataAbstract>(),
this);
62 data->Arr.diagonal().setOnes();
66 template <
typename NewScalar>
67 ActivationModelQuadTpl<NewScalar> cast()
const {
68 typedef ActivationModelQuadTpl<NewScalar> ReturnType;
78 virtual void print(std::ostream& os)
const override {
79 os <<
"ActivationModelQuad {nr=" << nr_ <<
"}";