25
25
#include < Kokkos_Core.hpp>
26
26
#include < Kokkos_Profiling_ScopedRegion.hpp>
27
27
28
- namespace ArborX ::Details
28
+ namespace ArborX ::Experimental
29
29
{
30
30
31
- template <class MemorySpace , BoruvkaMode Mode = BoruvkaMode::MST>
31
+ template <class MemorySpace ,
32
+ Details::BoruvkaMode Mode = Details::BoruvkaMode::MST>
32
33
struct MinimumSpanningTree
33
34
{
34
35
using memory_space = MemorySpace;
@@ -69,11 +70,11 @@ struct MinimumSpanningTree
69
70
bvh.query (
70
71
space,
71
72
Experimental::attach_indices (Experimental::make_nearest (points, k)),
72
- MaxDistance<Points, decltype (core_distances)>{points,
73
- core_distances});
73
+ Details:: MaxDistance<Points, decltype (core_distances)>{
74
+ points, core_distances});
74
75
Kokkos::Profiling::popRegion ();
75
76
76
- MutualReachability<decltype (core_distances)> mutual_reachability{
77
+ Details:: MutualReachability<decltype (core_distances)> mutual_reachability{
77
78
core_distances};
78
79
Kokkos::Profiling::pushRegion (" ArborX::MST::boruvka" );
79
80
doBoruvka (space, bvh, mutual_reachability);
@@ -82,11 +83,11 @@ struct MinimumSpanningTree
82
83
else
83
84
{
84
85
Kokkos::Profiling::pushRegion (" ArborX::MST::boruvka" );
85
- doBoruvka (space, bvh, Euclidean{});
86
+ doBoruvka (space, bvh, Details:: Euclidean{});
86
87
Kokkos::Profiling::popRegion ();
87
88
}
88
89
89
- finalizeEdges (space, bvh, edges);
90
+ Details:: finalizeEdges (space, bvh, edges);
90
91
91
92
Kokkos::Profiling::popRegion ();
92
93
}
@@ -107,7 +108,7 @@ struct MinimumSpanningTree
107
108
Kokkos::view_alloc (space, Kokkos::WithoutInitializing,
108
109
" ArborX::MST::tree_parents" ),
109
110
2 * n - 1 );
110
- findParents (space, bvh, tree_parents);
111
+ Details:: findParents (space, bvh, tree_parents);
111
112
112
113
Kokkos::Profiling::pushRegion (" ArborX::MST::initialize_node_labels" );
113
114
Kokkos::View<int *, MemorySpace> labels (
@@ -118,7 +119,7 @@ struct MinimumSpanningTree
118
119
Kokkos::subview (labels, std::make_pair ((decltype (n))0 , n)));
119
120
Kokkos::Profiling::popRegion ();
120
121
121
- Kokkos::View<DirectedEdge *, MemorySpace> component_out_edges (
122
+ Kokkos::View<Details:: DirectedEdge *, MemorySpace> component_out_edges (
122
123
Kokkos::view_alloc (space, Kokkos::WithoutInitializing,
123
124
" ArborX::MST::component_out_edges" ),
124
125
n);
@@ -169,7 +170,7 @@ struct MinimumSpanningTree
169
170
170
171
Kokkos::View<int *, MemorySpace> sided_parents (" ArborX::MST::sided_parents" ,
171
172
0 );
172
- if constexpr (Mode == BoruvkaMode::HDBSCAN)
173
+ if constexpr (Mode == Details:: BoruvkaMode::HDBSCAN)
173
174
{
174
175
KokkosExt::reallocWithoutInitializing (space, edges_mapping, n - 1 );
175
176
KokkosExt::reallocWithoutInitializing (space, sided_parents, n - 1 );
@@ -189,16 +190,16 @@ struct MinimumSpanningTree
189
190
std::to_string (num_components));
190
191
191
192
// Propagate leaf node labels to internal nodes
192
- reduceLabels (space, tree_parents, labels);
193
+ Details:: reduceLabels (space, tree_parents, labels);
193
194
194
195
constexpr auto inf = KokkosExt::ArithmeticTraits::infinity<float >::value;
195
- constexpr DirectedEdge uninitialized_edge;
196
+ constexpr Details:: DirectedEdge uninitialized_edge;
196
197
Kokkos::deep_copy (space, component_out_edges, uninitialized_edge);
197
198
Kokkos::deep_copy (space, weights, inf);
198
199
Kokkos::deep_copy (space, radii, inf);
199
200
resetSharedRadii (space, bvh, labels, metric, radii);
200
201
201
- FindComponentNearestNeighbors (
202
+ Details:: FindComponentNearestNeighbors (
202
203
space, bvh, labels, weights, component_out_edges, metric, radii,
203
204
lower_bounds, std::bool_constant<use_shared_radii>());
204
205
retrieveEdges (space, labels, weights, component_out_edges);
@@ -207,48 +208,49 @@ struct MinimumSpanningTree
207
208
updateLowerBounds (space, labels, component_out_edges, lower_bounds);
208
209
}
209
210
210
- UpdateComponentsAndEdges<decltype (labels), decltype (component_out_edges),
211
- decltype (edges ), decltype (edges_mapping ),
212
- decltype (num_edges), Mode>
211
+ Details:: UpdateComponentsAndEdges<
212
+ decltype (labels), decltype (component_out_edges ), decltype (edges ),
213
+ decltype (edges_mapping), decltype (num_edges), Mode>
213
214
f{labels, component_out_edges, edges, edges_mapping, num_edges};
214
215
215
216
// For every component C and a found shortest edge `(u, w)`, add the
216
217
// edge to the list of MST edges.
217
218
Kokkos::parallel_for (
218
219
" ArborX::MST::update_unidirectional_edges" ,
219
- Kokkos::RangePolicy<ExecutionSpace, UnidirectionalEdgesTag>(space, 0 ,
220
- n),
220
+ Kokkos::RangePolicy<ExecutionSpace, Details:: UnidirectionalEdgesTag>(
221
+ space, 0 , n),
221
222
f);
222
223
223
224
int num_edges_host;
224
225
Kokkos::deep_copy (space, num_edges_host, num_edges);
225
226
space.fence ();
226
227
227
- if constexpr (Mode == BoruvkaMode::HDBSCAN)
228
+ if constexpr (Mode == Details:: BoruvkaMode::HDBSCAN)
228
229
{
229
230
Kokkos::parallel_for (
230
231
" ArborX::MST::update_bidirectional_edges" ,
231
- Kokkos::RangePolicy<ExecutionSpace, BidirectionalEdgesTag>(space, 0 ,
232
- n),
232
+ Kokkos::RangePolicy<ExecutionSpace, Details:: BidirectionalEdgesTag>(
233
+ space, 0 , n),
233
234
f);
234
235
235
236
if (iterations > 1 )
236
- updateSidedParents (space, labels, edges, edges_mapping, sided_parents ,
237
- edges_start, edges_end);
237
+ Details:: updateSidedParents (space, labels, edges, edges_mapping,
238
+ sided_parents, edges_start, edges_end);
238
239
else
239
240
{
240
241
Kokkos::Profiling::ScopedRegion guard (
241
242
" ArborX::MST::compute_vertex_parents" );
242
- assignVertexParents (space, labels, component_out_edges, edges_mapping ,
243
- bvh, dendrogram_parents);
243
+ Details:: assignVertexParents (space, labels, component_out_edges,
244
+ edges_mapping, bvh, dendrogram_parents);
244
245
}
245
246
}
246
247
247
248
// For every component C and a found shortest edge `(u, w)`, merge C
248
249
// with the component that w belongs to by updating the labels
249
250
Kokkos::parallel_for (
250
251
" ArborX::MST::update_labels" ,
251
- Kokkos::RangePolicy<ExecutionSpace, LabelsTag>(space, 0 , n), f);
252
+ Kokkos::RangePolicy<ExecutionSpace, Details::LabelsTag>(space, 0 , n),
253
+ f);
252
254
253
255
num_components = static_cast <int >(n) - num_edges_host;
254
256
@@ -267,17 +269,17 @@ struct MinimumSpanningTree
267
269
Kokkos::resize (component_out_edges, 0 );
268
270
Kokkos::resize (tree_parents, 0 );
269
271
270
- if constexpr (Mode == BoruvkaMode::HDBSCAN)
272
+ if constexpr (Mode == Details:: BoruvkaMode::HDBSCAN)
271
273
{
272
274
273
275
// Done with the recursion as there are no more alpha edges. Assign
274
276
// all current edges to the root chain.
275
277
Kokkos::deep_copy (space,
276
278
Kokkos::subview (sided_parents,
277
279
std::make_pair (edges_start, edges_end)),
278
- ROOT_CHAIN_VALUE);
280
+ Details:: ROOT_CHAIN_VALUE);
279
281
280
- computeParents (space, edges, sided_parents, dendrogram_parents);
282
+ Details:: computeParents (space, edges, sided_parents, dendrogram_parents);
281
283
282
284
KokkosExt::reallocWithoutInitializing (space, dendrogram_parent_heights,
283
285
n - 1 );
@@ -293,6 +295,6 @@ struct MinimumSpanningTree
293
295
}
294
296
};
295
297
296
- } // namespace ArborX::Details
298
+ } // namespace ArborX::Experimental
297
299
298
300
#endif
0 commit comments