25  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
 
   27  typedef _Scalar Scalar;
 
   31  typedef typename MathBase::VectorXs VectorXs;
 
   34                             const Eigen::Ref<const VectorXs>& u_ub,
 
   43    smooth_ = Scalar(0.1);
 
   45    d_ = (u_ub_ - u_lb_) * smooth_;
 
   46    a_ = d_.array() * d_.array();
 
   51  virtual void calc(
const std::shared_ptr<SquashingDataAbstract>& data,
 
   52                    const Eigen::Ref<const VectorXs>& s) {
 
   56    data->u = Scalar(0.5) *
 
   57              (Eigen::sqrt(Eigen::pow((s - u_lb_).array(), 2) + a_.array()) -
 
   58               Eigen::sqrt(Eigen::pow((s - u_ub_).array(), 2) + a_.array()) +
 
   59               u_lb_.array() + u_ub_.array());
 
   62  virtual void calcDiff(
const std::shared_ptr<SquashingDataAbstract>& data,
 
   63                        const Eigen::Ref<const VectorXs>& s) {
 
   64    data->du_ds.diagonal() =
 
   66        (Eigen::pow(a_.array() + Eigen::pow((s - u_lb_).array(), 2),
 
   70         Eigen::pow(a_.array() + Eigen::pow((s - u_ub_).array(), 2),
 
   76  const Scalar get_smooth()
 const { 
return smooth_; };
 
   77  void set_smooth(
const Scalar smooth) {
 
   79      throw_pretty(
"Invalid argument: " << 
"Smooth value has to be positive");
 
   83    d_ = (u_ub_ - u_lb_) * smooth_;
 
   84    a_ = d_.array() * d_.array();
 
   90  const VectorXs& get_d()
 const { 
return d_; };