vector CoarseConvFeaturizer::featurize_reduced()

in featurizers/coarse_conv_featurizer.cpp [149:209]


vector<Feature> CoarseConvFeaturizer::featurize_reduced(
    vector<char> const& data,
    size_t skip_frames,
    size_t combine_frames,
    std::pair<size_t, size_t> const &map_size,
    int32_t perspective,
    bool full) const {
  assert(perspective == 0 || perspective == 1);

  // Map size is (ydim, xdim)
  auto nBinX = (double)(map_size.second - resX) / strideX + 1;
  auto nBinY = (double)(map_size.first - resY) / strideY + 1;
  if (nBinX != (int)nBinX)
    std::cerr << "WARNING: X dimension of " << map_size.second <<
      " is not evenly tiled by kW " << resX <<
      " and stride " << strideX << " because you get " << nBinX << "bins\n";
  if (nBinY != (int)nBinY)
    std::cerr << "WARNING: Y dimension of " << map_size.first <<
      " is not evenly tiled by kW " << resY <<
      " and stride " << strideY << " because you get " << nBinY << "bins\n";

  vector<Feature> features;
  membuf mbuf(data);
  zstd::istreambuf zbuf(&mbuf);
  std::istream is(&zbuf);

  size_t nframes;
  readPOD(nframes, is);

  // Read all frames
  std::vector<Reduced*> rframes;
  for (auto i = 0U; i < nframes; i++) {
    auto rf = read_reduced_frame(is);
    if (this->until == 0 || i >= this->from) {
      rframes.push_back(rf);
    } else if (i >= this->until) {
      break;
    }
  }

  auto it = rframes.begin();
  while (it != rframes.end()) {
    auto begin = it;
    auto end = std::min(it + combine_frames, rframes.end());
    auto rframe = combine_reduced_frames(begin, end, perspective, full);
    it = std::min(it + skip_frames, rframes.end());

    // Featurize
    features.emplace_back(ceil(nBinY), vector<vector<double>>(ceil(nBinX),
          vector<double>(2 * feature_size, 0.0)));
    featurize_reduced_frame(features.back(), rframe, perspective, full);

    delete rframe;
  }

  // Clean up
  for (size_t j = 0; j < rframes.size(); j++) {
    delete rframes[j];
  }
  return features;
}