19class SquashingModelSmoothSatTpl :
public SquashingModelAbstractTpl<_Scalar> {
21 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
24 typedef _Scalar Scalar;
26 typedef SquashingModelAbstractTpl<Scalar> Base;
28 typedef typename MathBase::VectorXs VectorXs;
30 SquashingModelSmoothSatTpl(
const Eigen::Ref<const VectorXs>& u_lb,
31 const Eigen::Ref<const VectorXs>& u_ub,
40 smooth_ = Scalar(0.1);
42 d_ = (u_ub_ - u_lb_) * smooth_;
43 a_ = d_.array() * d_.array();
46 virtual ~SquashingModelSmoothSatTpl() =
default;
48 virtual void calc(
const std::shared_ptr<SquashingDataAbstract>& data,
49 const Eigen::Ref<const VectorXs>& s)
override {
54 Scalar(0.5) * (Eigen::sqrt((s - u_lb_).array().square() + a_.array()) -
55 Eigen::sqrt((s - u_ub_).array().square() + a_.array()) +
56 u_lb_.array() + u_ub_.array());
59 virtual void calcDiff(
const std::shared_ptr<SquashingDataAbstract>& data,
60 const Eigen::Ref<const VectorXs>& s)
override {
61 data->du_ds.diagonal() =
63 ((s - u_lb_).array() /
64 Eigen::sqrt(a_.array() + (s - u_lb_).array().square()) -
66 Eigen::sqrt(a_.array() + (s - u_ub_).array().square()));
69 template <
typename NewScalar>
70 SquashingModelSmoothSatTpl<NewScalar> cast()
const {
71 typedef SquashingModelSmoothSatTpl<NewScalar> ReturnType;
72 ReturnType ret(u_lb_.template cast<NewScalar>(),
73 u_ub_.template cast<NewScalar>(), ns_);
74 ret.set_smooth(scalar_cast<NewScalar>(smooth_));
78 const Scalar get_smooth()
const {
return smooth_; };
79 void set_smooth(
const Scalar smooth) {
81 throw_pretty(
"Invalid argument: " <<
"Smooth value has to be positive");
85 d_ = (u_ub_ - u_lb_) * smooth_;
86 a_ = d_.array() * d_.array();
92 const VectorXs& get_d()
const {
return d_; };