18#ifndef TESSERACT_LSTM_FUNCTIONS_H_
19#define TESSERACT_LSTM_FUNCTIONS_H_
49 auto index =
static_cast<unsigned>(
x);
56 return tanh_i0 + (tanh_i1 - tanh_i0) * (
x - index);
64 auto index =
static_cast<unsigned>(
x);
71 return l0 + (l1 - l0) * (
x - index);
98 return 0 <
y &&
y < 1 ? 1 : 0;
111 return 0 <
y ? 1 : 0;
137 return -1 <
y &&
y < 1 ? 1 : 0;
166 for (
int i = 0;
i < n; ++
i) {
167 inout[
i] = f(inout[
i]);
175 for (
int i = 0;
i < n; ++
i) {
176 out[
i] = f(u[
i]) * v[
i];
186 const T kMaxSoftmaxActivation = 86;
188 T max_output = inout[0];
189 for (
int i = 1;
i < n;
i++) {
191 if (
output > max_output) {
196 for (
int i = 0;
i < n;
i++) {
197 T prob = inout[
i] - max_output;
198 prob = std::exp(
ClipToRange(prob, -kMaxSoftmaxActivation,
static_cast<T
>(0)));
202 if (prob_total > 0) {
203 for (
int i = 0;
i < n;
i++) {
204 inout[
i] /= prob_total;
211 memcpy(
dest, src, n *
sizeof(
dest[0]));
216 for (
int i = 0;
i < n; ++
i) {
223 for (
int i = 0;
i < n; ++
i) {
230 for (
int i = 0;
i < n;
i++) {
231 out[
i] += u[
i] * v[
i];
238 for (
int i = 0;
i < n; ++
i) {
239 sum[
i] = v1[
i] + v2[
i] + v3[
i] + v4[
i] + v5[
i];
246 memset(vec, 0, n *
sizeof(*vec));
252 for (
int i = 0;
i < n; ++
i) {
260 if (nf <= 0 || n < nf) {
264 TFloat best_score = vec[0];
265 for (
int i = 1;
i < n; ++
i) {
266 if (vec[
i] > best_score) {
272 for (
int i = 0;
i < nf; ++
i, mask *= 2) {
273 vec[
i] = (index & mask) ? 1.0 : 0.0;
void FuncInplace(int n, TFloat *inout)
void CopyVector(unsigned n, const TFloat *src, TFloat *dest)
void FuncMultiply(const TFloat *u, const TFloat *v, int n, TFloat *out)
TFloat Logistic(TFloat x)
void SoftmaxInPlace(int n, T *inout)
void SumVectors(int n, const TFloat *v1, const TFloat *v2, const TFloat *v3, const TFloat *v4, const TFloat *v5, TFloat *sum)
T ClipToRange(const T &x, const T &lower_bound, const T &upper_bound)
constexpr TFloat kScaleFactor
void MultiplyAccumulate(int n, const TFloat *u, const TFloat *v, TFloat *out)
const TFloat LogisticTable[]
void CodeInBinary(int n, int nf, TFloat *vec)
void AccumulateVector(int n, const TFloat *src, TFloat *dest)
void ClipVector(int n, T lower, T upper, T *vec)
void MultiplyVectorsInPlace(int n, const TFloat *src, TFloat *inout)
void ZeroVector(unsigned n, T *vec)
TFloat operator()(TFloat x) const
TFloat operator()(TFloat y) const
TFloat operator()(TFloat x) const
TFloat operator()(TFloat y) const
TFloat operator()(TFloat x) const
TFloat operator()(TFloat y) const
TFloat operator()(TFloat x) const
TFloat operator()(TFloat y) const
TFloat operator()(TFloat x) const
TFloat operator()(TFloat y) const
TFloat operator()(TFloat x) const
TFloat operator()(TFloat y) const
TFloat operator()(TFloat) const
TFloat operator()(TFloat x) const