#include void tmk_gelu(float* x, long n) { for (long i = 0; i < n; i++) { float v = x[i]; x[i] = 0.5f * v * (1.0f + erff(fmaxf(fminf(v * 0.70710678118654752f, 6.f), -6.f))); } } void tmk_silu(float* x, long n) { for (long i = 0; i < n; i++) x[i] = x[i] / (1.0f + expf(fmaxf(fminf(-x[i], 80.f), -80.f))); } void tmk_elu(float* x, long n) { for (long i = 0; i < n; i++) { float v = x[i], e = expf(fmaxf(fminf(v, 0.f), -30.f)) - 1.f; x[i] = v > 0.f ? v : e; } } void tmk_softmax_band(float* s, long R, int P, int T, int off, int win) { for (long r = 0; r < R; r++) { float* v = s + r * P; int i = (int)(r % T), hi = i + off, lo = hi - (win - 1); if (lo < 0) lo = 0; if (hi > P - 1) hi = P - 1; float mx = -3.0e38f; for (int j = lo; j <= hi; j++) mx = v[j] > mx ? v[j] : mx; float sum = 0.f; for (int j = lo; j <= hi; j++) { float e = expf(fmaxf(v[j] - mx, -80.f)); v[j] = e; sum += e; } const float inv = 1.0f / sum; for (int j = 0; j < lo; j++) v[j] = 0.f; for (int j = lo; j <= hi; j++) v[j] *= inv; for (int j = hi + 1; j < P; j++) v[j] = 0.f; } }