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