static MTensor conv1D()

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;
  }