24 const std::string& method,
27 std::vector<PointXYZ> original_points;
28 std::vector<PointXYZ> subsampled_points;
29 std::vector<int> original_batches;
30 std::vector<int> subsampled_batches;
31 std::vector<float> original_features;
32 std::vector<float> subsampled_features;
33 std::vector<int> original_classes;
34 std::vector<int> subsampled_classes;
46 original_points = std::vector<PointXYZ>(
59 int64_t num_batches = batches_t.
GetShape()[0];
60 if (
static_cast<int64_t
>(batches_t.
Sum({0}).
Item<int32_t>()) !=
63 batches_t.
Sum({0}).
Item<int32_t>(), num_points);
68 num_batches, num_points);
72 int64_t feature_dim = -1;
79 if (features_t.
NumDims() != 2) {
83 if (features_t.
GetShape()[0] != num_points) {
85 "features's shape {} is not compatible with "
86 "points's shape {}, their first dimension must "
91 feature_dim = features_t.
GetShape()[1];
102 if (classes_t.
NumDims() != 1) {
106 if (classes_t.
GetShape()[0] != num_points) {
108 "classes's shape {} is not compatible with "
109 "points's shape {}, their first dimension must "
119 original_points, subsampled_points, original_features,
120 subsampled_features, original_classes, subsampled_classes,
121 original_batches, subsampled_batches, sampleDl, max_p);
124 int64_t num_subsampled_points =
125 static_cast<int64_t
>(subsampled_points.size());
127 reinterpret_cast<float*
>(subsampled_points.data()),
131 int64_t num_subsampled_batches =
132 static_cast<int64_t
>(subsampled_batches.size());
134 subsampled_batches, {num_subsampled_batches},
core::Int32);
135 if (
static_cast<int64_t
>(subsampled_batches_t.
Sum({0}).
Item<int32_t>()) !=
136 num_subsampled_points) {
138 "subsampled_batches got {} points, but subsampled_points got "
140 subsampled_batches_t.
Sum({0}).
Item<int32_t>(),
141 num_subsampled_points);
145 num_subsampled_batches, num_subsampled_points);
151 if (subsampled_features.size() % num_subsampled_points != 0) {
153 "Error: subsampled_points.size() {} is not a "
154 "multiple of num_subsampled_points {}.",
155 subsampled_points.size(), num_subsampled_points);
157 int64_t subsampled_feature_dim =
158 static_cast<int64_t
>(subsampled_features.size()) /
159 num_subsampled_points;
160 if (feature_dim != subsampled_feature_dim) {
162 "Error: input feature dim {} does not match "
163 "the subsampled feature dim {}.",
164 feature_dim, subsampled_feature_dim);
167 subsampled_features, {num_subsampled_points, feature_dim},
174 if (
static_cast<int64_t
>(subsampled_classes.size()) !=
175 num_subsampled_points) {
177 "Error: subsampled_classes.size() {} != "
178 "num_subsampled_points {}.",
179 subsampled_classes.size(), num_subsampled_points);
182 subsampled_classes, {num_subsampled_points},
core::Int32);
209 std::vector<PointXYZ> original_points;
210 std::vector<PointXYZ> subsampled_points;
211 std::vector<float> original_features;
212 std::vector<float> subsampled_features;
213 std::vector<int> original_classes;
214 std::vector<int> subsampled_classes;
226 original_points = std::vector<PointXYZ>(
234 int64_t feature_dim = -1;
241 if (features_t.
NumDims() != 2) {
245 if (features_t.
GetShape()[0] != num_points) {
247 "features's shape {} is not compatible with "
248 "points's shape {}, their first dimension must "
253 feature_dim = features_t.
GetShape()[1];
264 if (classes_t.
NumDims() != 1) {
268 if (classes_t.
GetShape()[0] != num_points) {
270 "classes's shape {} is not compatible with "
271 "points's shape {}, their first dimension must "
281 subsampled_features, original_classes, subsampled_classes,
285 int64_t num_subsampled_points =
286 static_cast<int64_t
>(subsampled_points.size());
288 reinterpret_cast<float*
>(subsampled_points.data()),
297 if (subsampled_features.size() % num_subsampled_points != 0) {
299 "Error: subsampled_points.size() {} is not a "
300 "multiple of num_subsampled_points {}.",
301 subsampled_points.size(), num_subsampled_points);
303 int64_t subsampled_feature_dim =
304 static_cast<int64_t
>(subsampled_features.size()) /
305 num_subsampled_points;
306 if (feature_dim != subsampled_feature_dim) {
308 "Error: input feature dim {} does not match "
309 "the subsampled feature dim {}.",
310 feature_dim, subsampled_feature_dim);
313 subsampled_features, {num_subsampled_points, feature_dim},
320 if (
static_cast<int64_t
>(subsampled_classes.size()) !=
321 num_subsampled_points) {
323 "Error: subsampled_classes.size() {} != "
324 "num_subsampled_points {}.",
325 subsampled_classes.size(), num_subsampled_points);
328 subsampled_classes, {num_subsampled_points},
core::Int32);
347 m_contrib.def(
"subsample", &
Subsample,
"points"_a,
348 "features"_a = py::none(),
"classes"_a = py::none(),
349 "sampleDl"_a = 0.1,
"verbose"_a = 0);
351 m_contrib.def(
"subsample_batch", &
SubsampleBatch,
"points"_a,
"batches"_a,
352 "features"_a = py::none(),
"classes"_a = py::none(),
353 "sampleDl"_a = 0.1,
"method"_a =
"barycenters",
"max_p"_a = 0,
std::string ToString() const
Tensor Contiguous() const
Tensor Sum(const SizeVector &dims, bool keepdim=false) const
std::vector< T > ToFlatVector() const
Retrieve all values as an std::vector, for debugging and testing.
int64_t NumElements() const
SizeVector GetShape() const
constexpr bool has_value() const noexcept
constexpr T const & value() const &
py::array TensorToPyArray(const Tensor &tensor)
Convert Tensor class to py::array (Numpy array).
Tensor PyArrayToTensor(py::array array, bool inplace)
void pybind_contrib_subsample(py::module &m_contrib)
const py::object Subsample(py::array points, utility::optional< py::array > features, utility::optional< py::array > classes, float sampleDl, int verbose)
void batch_grid_subsampling(std::vector< PointXYZ > &original_points, std::vector< PointXYZ > &subsampled_points, std::vector< float > &original_features, std::vector< float > &subsampled_features, std::vector< int > &original_classes, std::vector< int > &subsampled_classes, std::vector< int > &original_batches, std::vector< int > &subsampled_batches, float sampleDl, int max_p)
void grid_subsampling(std::vector< PointXYZ > &original_points, std::vector< PointXYZ > &subsampled_points, std::vector< float > &original_features, std::vector< float > &subsampled_features, std::vector< int > &original_classes, std::vector< int > &subsampled_classes, float sampleDl, int verbose)
const py::tuple SubsampleBatch(py::array points, py::array batches, utility::optional< py::array > features, utility::optional< py::array > classes, float sampleDl, const std::string &method, int max_p, int verbose)
Generic file read and write utility for python interface.