#include "csrc/OpApiCommon.h"
#include "csrc/functions.h"
constexpr float DEFAULT_VALUE = -1.0f;
constexpr size_t VOXEL_SIZES_SIZE = 3;
constexpr size_t COOR_RANGES_SIZE = 6;
at::Tensor point_to_voxel(const at::Tensor &points, const std::vector<float> voxel_sizes,
const std::vector<float> coor_ranges, const char *layout) {
TORCH_CHECK_NPU(points);
TORCH_CHECK(points.dim() == 2, "points.dim() must be 2, but got: ", points.dim());
TORCH_CHECK(
points.size(1) >= 3, "points must have at least 3 coordinate columns (x, y, z), but got: ", points.size(1));
at::Tensor voxels = at::empty({points.size(0)}, points.options().dtype(at::kFloat));
at::SmallVector<float, VOXEL_SIZES_SIZE> voxel_sizes_vector{DEFAULT_VALUE, DEFAULT_VALUE, DEFAULT_VALUE};
at::SmallVector<float, COOR_RANGES_SIZE> coor_ranges_vector{
DEFAULT_VALUE, DEFAULT_VALUE, DEFAULT_VALUE, DEFAULT_VALUE, DEFAULT_VALUE, DEFAULT_VALUE};
at::ArrayRef<float> voxel_sizes_value;
at::ArrayRef<float> coor_ranges_value;
if (voxel_sizes.empty()) {
voxel_sizes_value = at::ArrayRef<float>(voxel_sizes_vector);
} else {
TORCH_CHECK(
voxel_sizes.size() == VOXEL_SIZES_SIZE, "voxel_sizes.size() must be 3, but got: ", voxel_sizes.size());
voxel_sizes_value = at::ArrayRef<float>(voxel_sizes);
}
if (coor_ranges.empty()) {
coor_ranges_value = at::ArrayRef<float>(coor_ranges_vector);
} else {
TORCH_CHECK(
coor_ranges.size() == COOR_RANGES_SIZE, "coor_ranges.size() must be 6, but got: ", coor_ranges.size());
coor_ranges_value = at::ArrayRef<float>(coor_ranges);
}
at::Tensor points_transpose = points.transpose(0, 1);
EXEC_NPU_CMD(aclnnPointToVoxel, points_transpose, voxel_sizes_value, coor_ranges_value, layout, voxels);
return voxels;
}