in FBSDKCoreKit/FBSDKCoreKit/AppEvents/Internal/ML/FBSDKModelRuntime.hpp [142:173]
static MTensor conv1D(const MTensor &x, const MTensor &w)
{
int n_examples = x.size(0);
int seq_len = x.size(1);
int input_size = x.size(2);
int kernel_size = w.size(0);
int output_size = w.size(2);
MTensor y({n_examples, seq_len - kernel_size + 1, output_size});
MTensor temp_x({kernel_size, input_size});
MTensor temp_w({kernel_size, input_size});
const float *x_data = x.data();
const float *w_data = w.data();
float *y_data = y.mutable_data();
float *temp_x_data = temp_x.mutable_data();
float *temp_w_data = temp_w.mutable_data();
float sum;
for (int n = 0; n < n_examples; n++) {
for (int o = 0; o < output_size; o++) {
for (int i = 0; i < seq_len - kernel_size + 1; i++) {
for (int m = 0; m < kernel_size; m++) {
for (int k = 0; k < input_size; k++) {
temp_x_data[m * input_size + k] = x_data[n * (seq_len * input_size) + (m + i) * input_size + k];
temp_w_data[m * input_size + k] = w_data[(m * input_size + k) * output_size + o];
}
}
vDSP_dotpr(temp_x_data, 1, temp_w_data, 1, &sum, (size_t)(kernel_size * input_size));
y_data[(n * (output_size * (seq_len - kernel_size + 1)) + i * output_size + o)] = sum;
}
}
}
return y;
}