in src/roi_sampling/roi_sampling_cpu.cpp [80:108]
void roi_sampling_backward_impl(
at::TensorAccessor<scalar_t, 4> dy,
at::TensorAccessor<coord_t, 2> bbx,
at::TensorAccessor<int64_t, 1> idx,
at::TensorAccessor<scalar_t, 4> dx,
Sampler sampler) {
auto roi_height = static_cast<coord_t>(dy.size(2)),
roi_width = static_cast<coord_t>(dy.size(3));
for (int64_t n = 0; n < idx.size(0); ++n) {
auto img_idx = idx[n];
auto i0 = bbx[n][0], j0 = bbx[n][1], i1 = bbx[n][2], j1 = bbx[n][3];
for (int64_t c = 0; c < dy.size(1); ++c) {
// Create indexer for this plane and image
auto accessor = dx[img_idx][c];
for (int64_t i_roi = 0; i_roi < dy.size(2); ++i_roi) {
auto y_img = roi_to_img(static_cast<coord_t>(i_roi) + coord_t(0.5), i0, i1, roi_height);
for (int64_t j_roi = 0; j_roi < dy.size(3); ++j_roi) {
auto x_img = roi_to_img(static_cast<coord_t>(j_roi) + coord_t(0.5), j0, j1, roi_width);
sampler.backward(y_img, x_img, dy[n][c][i_roi][j_roi], accessor);
}
}
}
}
}