@@ -57,29 +57,33 @@ void IncrementPoint(at::TensorAccessor<T, 1>&& t, const vec3<T>& point) {
57
57
template <typename T>
58
58
T HullDistance (
59
59
const std::array<vec3<T>, 1 >& a,
60
- const std::array<vec3<T>, 2 >& b) {
60
+ const std::array<vec3<T>, 2 >& b,
61
+ const double /* min_triangle_area*/ ) {
61
62
using std::get;
62
63
return PointLine3DistanceForward (get<0 >(a), get<0 >(b), get<1 >(b));
63
64
}
64
65
template <typename T>
65
66
T HullDistance (
66
67
const std::array<vec3<T>, 1 >& a,
67
- const std::array<vec3<T>, 3 >& b) {
68
+ const std::array<vec3<T>, 3 >& b,
69
+ const double min_triangle_area) {
68
70
using std::get;
69
71
return PointTriangle3DistanceForward (
70
- get<0 >(a), get<0 >(b), get<1 >(b), get<2 >(b));
72
+ get<0 >(a), get<0 >(b), get<1 >(b), get<2 >(b), min_triangle_area );
71
73
}
72
74
template <typename T>
73
75
T HullDistance (
74
76
const std::array<vec3<T>, 2 >& a,
75
- const std::array<vec3<T>, 1 >& b) {
76
- return HullDistance (b, a);
77
+ const std::array<vec3<T>, 1 >& b,
78
+ const double /* min_triangle_area*/ ) {
79
+ return HullDistance (b, a, 1 );
77
80
}
78
81
template <typename T>
79
82
T HullDistance (
80
83
const std::array<vec3<T>, 3 >& a,
81
- const std::array<vec3<T>, 1 >& b) {
82
- return HullDistance (b, a);
84
+ const std::array<vec3<T>, 1 >& b,
85
+ const double min_triangle_area) {
86
+ return HullDistance (b, a, min_triangle_area);
83
87
}
84
88
85
89
template <typename T>
@@ -88,7 +92,8 @@ void HullHullDistanceBackward(
88
92
const std::array<vec3<T>, 2 >& b,
89
93
T grad_dist,
90
94
at::TensorAccessor<T, 1 >&& grad_a,
91
- at::TensorAccessor<T, 2 >&& grad_b) {
95
+ at::TensorAccessor<T, 2 >&& grad_b,
96
+ const double /* min_triangle_area*/ ) {
92
97
using std::get;
93
98
auto res =
94
99
PointLine3DistanceBackward (get<0 >(a), get<0 >(b), get<1 >(b), grad_dist);
@@ -102,10 +107,11 @@ void HullHullDistanceBackward(
102
107
const std::array<vec3<T>, 3 >& b,
103
108
T grad_dist,
104
109
at::TensorAccessor<T, 1 >&& grad_a,
105
- at::TensorAccessor<T, 2 >&& grad_b) {
110
+ at::TensorAccessor<T, 2 >&& grad_b,
111
+ const double min_triangle_area) {
106
112
using std::get;
107
113
auto res = PointTriangle3DistanceBackward (
108
- get<0 >(a), get<0 >(b), get<1 >(b), get<2 >(b), grad_dist);
114
+ get<0 >(a), get<0 >(b), get<1 >(b), get<2 >(b), grad_dist, min_triangle_area );
109
115
IncrementPoint (std::move (grad_a), get<0 >(res));
110
116
IncrementPoint (grad_b[0 ], get<1 >(res));
111
117
IncrementPoint (grad_b[1 ], get<2 >(res));
@@ -117,19 +123,21 @@ void HullHullDistanceBackward(
117
123
const std::array<vec3<T>, 1 >& b,
118
124
T grad_dist,
119
125
at::TensorAccessor<T, 2 >&& grad_a,
120
- at::TensorAccessor<T, 1 >&& grad_b) {
126
+ at::TensorAccessor<T, 1 >&& grad_b,
127
+ const double min_triangle_area) {
121
128
return HullHullDistanceBackward (
122
- b, a, grad_dist, std::move (grad_b), std::move (grad_a));
129
+ b, a, grad_dist, std::move (grad_b), std::move (grad_a), min_triangle_area );
123
130
}
124
131
template <typename T>
125
132
void HullHullDistanceBackward (
126
133
const std::array<vec3<T>, 2 >& a,
127
134
const std::array<vec3<T>, 1 >& b,
128
135
T grad_dist,
129
136
at::TensorAccessor<T, 2 >&& grad_a,
130
- at::TensorAccessor<T, 1 >&& grad_b) {
137
+ at::TensorAccessor<T, 1 >&& grad_b,
138
+ const double /* min_triangle_area*/ ) {
131
139
return HullHullDistanceBackward (
132
- b, a, grad_dist, std::move (grad_b), std::move (grad_a));
140
+ b, a, grad_dist, std::move (grad_b), std::move (grad_a), 1 );
133
141
}
134
142
135
143
template <int H>
@@ -150,7 +158,8 @@ std::tuple<at::Tensor, at::Tensor> HullHullDistanceForwardCpu(
150
158
const at::Tensor& as,
151
159
const at::Tensor& as_first_idx,
152
160
const at::Tensor& bs,
153
- const at::Tensor& bs_first_idx) {
161
+ const at::Tensor& bs_first_idx,
162
+ const double min_triangle_area) {
154
163
const int64_t A_N = as.size (0 );
155
164
const int64_t B_N = bs.size (0 );
156
165
const int64_t BATCHES = as_first_idx.size (0 );
@@ -190,7 +199,8 @@ std::tuple<at::Tensor, at::Tensor> HullHullDistanceForwardCpu(
190
199
size_t min_idx = 0 ;
191
200
auto a = ExtractHull<H1>(as_a[a_n]);
192
201
for (int64_t b_n = b_batch_start; b_n < b_batch_end; ++b_n) {
193
- float dist = HullDistance (a, ExtractHull<H2>(bs_a[b_n]));
202
+ float dist =
203
+ HullDistance (a, ExtractHull<H2>(bs_a[b_n]), min_triangle_area);
194
204
if (dist <= min_dist) {
195
205
min_dist = dist;
196
206
min_idx = b_n;
@@ -208,7 +218,8 @@ std::tuple<at::Tensor, at::Tensor> HullHullDistanceBackwardCpu(
208
218
const at::Tensor& as,
209
219
const at::Tensor& bs,
210
220
const at::Tensor& idx_bs,
211
- const at::Tensor& grad_dists) {
221
+ const at::Tensor& grad_dists,
222
+ const double min_triangle_area) {
212
223
const int64_t A_N = as.size (0 );
213
224
214
225
TORCH_CHECK (idx_bs.size (0 ) == A_N);
@@ -230,15 +241,21 @@ std::tuple<at::Tensor, at::Tensor> HullHullDistanceBackwardCpu(
230
241
auto a = ExtractHull<H1>(as_a[a_n]);
231
242
auto b = ExtractHull<H2>(bs_a[idx_bs_a[a_n]]);
232
243
HullHullDistanceBackward (
233
- a, b, grad_dists_a[a_n], grad_as_a[a_n], grad_bs_a[idx_bs_a[a_n]]);
244
+ a,
245
+ b,
246
+ grad_dists_a[a_n],
247
+ grad_as_a[a_n],
248
+ grad_bs_a[idx_bs_a[a_n]],
249
+ min_triangle_area);
234
250
}
235
251
return std::make_tuple (grad_as, grad_bs);
236
252
}
237
253
238
254
template <int H>
239
255
torch::Tensor PointHullArrayDistanceForwardCpu (
240
256
const torch::Tensor& points,
241
- const torch::Tensor& bs) {
257
+ const torch::Tensor& bs,
258
+ const double min_triangle_area) {
242
259
const int64_t P = points.size (0 );
243
260
const int64_t B_N = bs.size (0 );
244
261
@@ -254,7 +271,7 @@ torch::Tensor PointHullArrayDistanceForwardCpu(
254
271
auto dest = dists_a[p];
255
272
for (int64_t b_n = 0 ; b_n < B_N; ++b_n) {
256
273
auto b = ExtractHull<H>(bs_a[b_n]);
257
- dest[b_n] = HullDistance (point, b);
274
+ dest[b_n] = HullDistance (point, b, min_triangle_area );
258
275
}
259
276
}
260
277
return dists;
@@ -264,7 +281,8 @@ template <int H>
264
281
std::tuple<at::Tensor, at::Tensor> PointHullArrayDistanceBackwardCpu (
265
282
const at::Tensor& points,
266
283
const at::Tensor& bs,
267
- const at::Tensor& grad_dists) {
284
+ const at::Tensor& grad_dists,
285
+ const double min_triangle_area) {
268
286
const int64_t P = points.size (0 );
269
287
const int64_t B_N = bs.size (0 );
270
288
@@ -287,7 +305,12 @@ std::tuple<at::Tensor, at::Tensor> PointHullArrayDistanceBackwardCpu(
287
305
for (int64_t b_n = 0 ; b_n < B_N; ++b_n) {
288
306
auto b = ExtractHull<H>(bs_a[b_n]);
289
307
HullHullDistanceBackward (
290
- point, b, grad_dist[b_n], std::move (grad_point), grad_bs_a[b_n]);
308
+ point,
309
+ b,
310
+ grad_dist[b_n],
311
+ std::move (grad_point),
312
+ grad_bs_a[b_n],
313
+ min_triangle_area);
291
314
}
292
315
}
293
316
return std::make_tuple (grad_points, grad_bs);
@@ -299,63 +322,70 @@ std::tuple<torch::Tensor, torch::Tensor> PointFaceDistanceForwardCpu(
299
322
const torch::Tensor& points,
300
323
const torch::Tensor& points_first_idx,
301
324
const torch::Tensor& tris,
302
- const torch::Tensor& tris_first_idx) {
325
+ const torch::Tensor& tris_first_idx,
326
+ const double min_triangle_area) {
303
327
return HullHullDistanceForwardCpu<1 , 3 >(
304
- points, points_first_idx, tris, tris_first_idx);
328
+ points, points_first_idx, tris, tris_first_idx, min_triangle_area );
305
329
}
306
330
307
331
std::tuple<torch::Tensor, torch::Tensor> PointFaceDistanceBackwardCpu (
308
332
const torch::Tensor& points,
309
333
const torch::Tensor& tris,
310
334
const torch::Tensor& idx_points,
311
- const torch::Tensor& grad_dists) {
335
+ const torch::Tensor& grad_dists,
336
+ const double min_triangle_area) {
312
337
return HullHullDistanceBackwardCpu<1 , 3 >(
313
- points, tris, idx_points, grad_dists);
338
+ points, tris, idx_points, grad_dists, min_triangle_area );
314
339
}
315
340
316
341
std::tuple<torch::Tensor, torch::Tensor> FacePointDistanceForwardCpu (
317
342
const torch::Tensor& points,
318
343
const torch::Tensor& points_first_idx,
319
344
const torch::Tensor& tris,
320
- const torch::Tensor& tris_first_idx) {
345
+ const torch::Tensor& tris_first_idx,
346
+ const double min_triangle_area) {
321
347
return HullHullDistanceForwardCpu<3 , 1 >(
322
- tris, tris_first_idx, points, points_first_idx);
348
+ tris, tris_first_idx, points, points_first_idx, min_triangle_area );
323
349
}
324
350
325
351
std::tuple<torch::Tensor, torch::Tensor> FacePointDistanceBackwardCpu (
326
352
const torch::Tensor& points,
327
353
const torch::Tensor& tris,
328
354
const torch::Tensor& idx_tris,
329
- const torch::Tensor& grad_dists) {
330
- auto res =
331
- HullHullDistanceBackwardCpu<3 , 1 >(tris, points, idx_tris, grad_dists);
355
+ const torch::Tensor& grad_dists,
356
+ const double min_triangle_area) {
357
+ auto res = HullHullDistanceBackwardCpu<3 , 1 >(
358
+ tris, points, idx_tris, grad_dists, min_triangle_area);
332
359
return std::make_tuple (std::get<1 >(res), std::get<0 >(res));
333
360
}
334
361
335
362
torch::Tensor PointEdgeArrayDistanceForwardCpu (
336
363
const torch::Tensor& points,
337
364
const torch::Tensor& segms) {
338
- return PointHullArrayDistanceForwardCpu<2 >(points, segms);
365
+ return PointHullArrayDistanceForwardCpu<2 >(points, segms, 1 );
339
366
}
340
367
341
368
std::tuple<at::Tensor, at::Tensor> PointFaceArrayDistanceBackwardCpu (
342
369
const at::Tensor& points,
343
370
const at::Tensor& tris,
344
- const at::Tensor& grad_dists) {
345
- return PointHullArrayDistanceBackwardCpu<3 >(points, tris, grad_dists);
371
+ const at::Tensor& grad_dists,
372
+ const double min_triangle_area) {
373
+ return PointHullArrayDistanceBackwardCpu<3 >(
374
+ points, tris, grad_dists, min_triangle_area);
346
375
}
347
376
348
377
torch::Tensor PointFaceArrayDistanceForwardCpu (
349
378
const torch::Tensor& points,
350
- const torch::Tensor& tris) {
351
- return PointHullArrayDistanceForwardCpu<3 >(points, tris);
379
+ const torch::Tensor& tris,
380
+ const double min_triangle_area) {
381
+ return PointHullArrayDistanceForwardCpu<3 >(points, tris, min_triangle_area);
352
382
}
353
383
354
384
std::tuple<at::Tensor, at::Tensor> PointEdgeArrayDistanceBackwardCpu (
355
385
const at::Tensor& points,
356
386
const at::Tensor& segms,
357
387
const at::Tensor& grad_dists) {
358
- return PointHullArrayDistanceBackwardCpu<2 >(points, segms, grad_dists);
388
+ return PointHullArrayDistanceBackwardCpu<2 >(points, segms, grad_dists, 1 );
359
389
}
360
390
361
391
std::tuple<torch::Tensor, torch::Tensor> PointEdgeDistanceForwardCpu (
@@ -365,7 +395,7 @@ std::tuple<torch::Tensor, torch::Tensor> PointEdgeDistanceForwardCpu(
365
395
const torch::Tensor& segms_first_idx,
366
396
const int64_t /* max_points*/ ) {
367
397
return HullHullDistanceForwardCpu<1 , 2 >(
368
- points, points_first_idx, segms, segms_first_idx);
398
+ points, points_first_idx, segms, segms_first_idx, 1 );
369
399
}
370
400
371
401
std::tuple<torch::Tensor, torch::Tensor> PointEdgeDistanceBackwardCpu (
@@ -374,7 +404,7 @@ std::tuple<torch::Tensor, torch::Tensor> PointEdgeDistanceBackwardCpu(
374
404
const torch::Tensor& idx_points,
375
405
const torch::Tensor& grad_dists) {
376
406
return HullHullDistanceBackwardCpu<1 , 2 >(
377
- points, segms, idx_points, grad_dists);
407
+ points, segms, idx_points, grad_dists, 1 );
378
408
}
379
409
380
410
std::tuple<torch::Tensor, torch::Tensor> EdgePointDistanceForwardCpu (
@@ -384,15 +414,15 @@ std::tuple<torch::Tensor, torch::Tensor> EdgePointDistanceForwardCpu(
384
414
const torch::Tensor& segms_first_idx,
385
415
const int64_t /* max_segms*/ ) {
386
416
return HullHullDistanceForwardCpu<2 , 1 >(
387
- segms, segms_first_idx, points, points_first_idx);
417
+ segms, segms_first_idx, points, points_first_idx, 1 );
388
418
}
389
419
390
420
std::tuple<torch::Tensor, torch::Tensor> EdgePointDistanceBackwardCpu (
391
421
const torch::Tensor& points,
392
422
const torch::Tensor& segms,
393
423
const torch::Tensor& idx_segms,
394
424
const torch::Tensor& grad_dists) {
395
- auto res =
396
- HullHullDistanceBackwardCpu< 2 , 1 >( segms, points, idx_segms, grad_dists);
425
+ auto res = HullHullDistanceBackwardCpu< 2 , 1 >(
426
+ segms, points, idx_segms, grad_dists, 1 );
397
427
return std::make_tuple (std::get<1 >(res), std::get<0 >(res));
398
428
}
0 commit comments