42 static constexpr inline double sid_tanh(
double x)
noexcept
46 const double x2 = x * x;
47 const double num = x*(945. + x2*(105. + x2));
48 const double den = 945. + x2*(420. + x2*15.);
53#elif defined(LAMBERT_TANH)
55 static constexpr inline double sid_tanh(
double x)
noexcept
59 const double x2 = x * x;
60 const double num = x*(135135. + x2*(17325. + x2*(378 + x2)));
61 const double den = 135135. + x2*(62370. + x2*(3150. + x2*28.));
67 static inline double sid_tanh(
double x)
74 static inline int clipper(
int x)
77 constexpr int threshold = 28000;
78 if (likely(x < threshold))
81 constexpr double max_val =
static_cast<double>(m);
82 constexpr double t = threshold / max_val;
83 constexpr double a = 1. - t;
84 constexpr double b = 1. / a;
86 double value =
static_cast<double>(x - threshold) / max_val;
87 value = t + a * sid_tanh(b * value);
88 return static_cast<int>(value * max_val);
94 static inline int softClipImpl(
int x)
96 return x < 0 ? -clipper<32768>(-x) : clipper<32767>(x);
103 static inline short softClip(
int x) {
return static_cast<short>(softClipImpl(x)); }
105 virtual int output()
const = 0;
127 const int out = (scaleFactor * output()) / 2;
128 return softClip(out);
131 virtual void reset() = 0;