14void sub(
const float*
a,
const float*
b,
float*
out,
size_t n) {
19 for (
size_t i = 0;
i <
n; ++
i)
out[
i] = std::max(0.0f,
x[
i]);
23 for (
size_t i = 0;
i <
n; ++
i)
out[
i] = 1.0f / (1.0f + std::exp(-
x[
i]));
27 for (
size_t i = 0;
i <
n; ++
i) {
35 for (
int j = 1;
j <
R; ++
j)
44 for (
size_t i = 0;
i <
n; ++
i) {
46 const float p = g *
diff;
51void scale(
const float*
x,
const float* g,
const float*
b,
float*
out,
int T,
int w) {
52 for (
int t = 0;
t <
T; ++
t) {
53 const size_t r =
static_cast<size_t>(
t) *
w;
62 for (
int t = 0;
t <
T; ++
t) {
63 const float ct =
c[
t];
64 const size_t r =
static_cast<size_t>(
t) *
w;
70 for (
int t = 0;
t <
T; ++
t) {
71 const float*
r =
x +
static_cast<size_t>(
t) *
w;
73 for (
int j = 0;
j <
w; ++
j) {
74 const float sq =
r[
j] *
r[
j];
77 out[
t] = std::sqrt(
ss /
static_cast<float>(
w) +
eps);
83 const size_t n =
static_cast<size_t>(
T) * d;
88 std::vector<float>
a(
S);
89 for (
int t = 0;
t <
T; ++
t) {
90 const size_t row =
static_cast<size_t>(
t) * d;
93 for (
size_t i = 0;
i <
S; ++
i) {
96 for (
int j = 0;
j < d; ++
j) {
97 const float sq =
s[
j] *
s[
j];
100 ss /=
static_cast<float>(d);
101 const float r = 1.0f / std::sqrt(
ss +
eps);
103 for (
int j = 0;
j < d; ++
j) {
112 float mx = -std::numeric_limits<float>::infinity();
113 for (
size_t i = 0;
i <
S; ++
i)
mx = std::max(
mx,
a[
i]);
115 for (
size_t i = 0;
i <
S; ++
i) {
116 a[
i] = std::exp(
a[
i] -
mx);
119 for (
size_t i = 0;
i <
S; ++
i)
a[
i] /=
z;
123 for (
int j = 0;
j < d; ++
j)
o[
j] =
s0[
j] *
a[0];
124 for (
size_t i = 1;
i <
S; ++
i) {
126 for (
int j = 0;
j < d; ++
j) {
127 const float p =
s[
j] *
a[
i];
135 const std::vector<std::vector<int>>&
rows,
int H,
int r,
int dn,
int dr,
int dv,
const float*
Kb,
136 const float*
Vb,
float scale) {
137 const size_t w =
static_cast<size_t>(
r) +
dr;
138#pragma omp parallel for schedule(dynamic)
139 for (
int t = 0;
t <
T; ++
t) {
140 const std::vector<int>&
vis =
rows[
t];
141 std::vector<float>
qa(
static_cast<size_t>(
r)),
u(
static_cast<size_t>(
r)),
s(
vis.size());
142 for (
int h = 0;
h <
H; ++
h) {
143 const float*
qnh =
qn + (
static_cast<size_t>(
t) *
H +
h) *
dn;
144 const float*
qrh =
qr + (
static_cast<size_t>(
t) *
H +
h) *
dr;
145 const float* K =
Kb +
static_cast<size_t>(
h) *
r *
dn;
146 const float*
V =
Vb +
static_cast<size_t>(
h) *
dv *
r;
147 for (
int i = 0;
i <
r; ++
i) {
149 for (
int k = 0;
k <
dn; ++
k) {
150 const float p = K[
static_cast<size_t>(
i) *
dn +
k] *
qnh[
k];
155 float mx = -std::numeric_limits<float>::infinity();
156 for (
size_t j = 0;
j <
vis.size(); ++
j) {
157 const float*
c =
kv +
static_cast<size_t>(
vis[
j]) *
w;
158 float a = 0.0f,
b = 0.0f;
159 for (
int i = 0;
i <
r; ++
i) {
160 const float p =
qa[
i] *
c[
i];
163 for (
int e = 0;
e <
dr; ++
e) {
167 const float sum =
a +
b;
172 for (
size_t j = 0;
j <
vis.size(); ++
j) {
173 s[
j] = std::exp(
s[
j] -
mx);
176 std::fill(
u.begin(),
u.end(), 0.0f);
177 for (
size_t j = 0;
j <
vis.size(); ++
j) {
178 const float a =
s[
j] /
z;
179 const float*
c =
kv +
static_cast<size_t>(
vis[
j]) *
w;
180 for (
int i = 0;
i <
r; ++
i) {
181 const float p =
a *
c[
i];
185 float*
o =
out + (
static_cast<size_t>(
t) *
H +
h) *
dv;
186 for (
int k = 0;
k <
dv; ++
k) {
188 for (
int i = 0;
i <
r; ++
i) {
189 const float p =
V[
static_cast<size_t>(
k) *
r +
i] *
u[
i];
201 const size_t width =
static_cast<size_t>(
group) * g;
202 for (
int t = 0;
t <
T; ++
t) {
203 const float*
row =
x +
static_cast<size_t>(
t) * width;
204 for (
int q = 0; q < g; ++q) {
206 for (
size_t k = 0;
k <
sizes.size(); ++
k) {
208 std::memcpy(
dst,
row +
static_cast<size_t>(q) *
group +
col,
static_cast<size_t>(
sizes[
k]) *
sizeof(
float));
const float * p[kIrDepthSourcesMax]
const float * col[expr::kMaxColumns]
void split_groups(const float *x, int T, const std::vector< int > &sizes, int g, const std::vector< float * > &outs)
void mor_gate(const float *x_in, float *x, size_t n, float g)
void mor_route(const float *l, int R, int &depth, float &gate)