void Metadata::createMetadataForDenseToSparse()

in sparseconvnet/SCN/Metadata/Metadata.cpp [178:214]


void Metadata<dimension>::createMetadataForDenseToSparse(
    /*long*/ at::Tensor &spatialSize,
    /*long*/ at::Tensor &nz_, long batchSize) {
  clear();
  setInputSpatialSize(spatialSize);
  inputSGs->resize(batchSize);
  auto &nActive = *inputNActive;
  nActive = nz_.size(0);

  long *nz = nz_.data_ptr<long>();

  std::vector<Int> br(batchSize + 1);
  if (batchSize == 1) {
    br[1] = nActive;
  } else {
    long b = 0;
    for (Int i = 0; i < nActive; i++) {
      long B = nz[i * (dimension + 1)];
      for (; b < B;)
        br[++b] = i;
    }
    for (; b < batchSize;)
      br[++b] = nActive;
  }
  Int b;
#pragma omp parallel for private(b)
  for (b = 0; b < batchSize; b++) {
    auto &sg = inputSGs->at(b);
    for (Int i = br[b]; i < br[b + 1]; i++) {
      Point<dimension> x;
      for (Int j = 0; j < dimension; j++) {
        x[j] = nz[i * (dimension + 1) + j + 1]; // 0-indexed
      }
      sg.mp[x] = i;
    }
  }
}