Skip to content

Commit a7df276

Browse files
committed
fix bug in similarity algorithms
1 parent 1ab044a commit a7df276

File tree

1 file changed

+70
-29
lines changed

1 file changed

+70
-29
lines changed

cpp/src/c_api/similarity.cpp

Lines changed: 70 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <cugraph/detail/shuffle_wrappers.hpp>
2727
#include <cugraph/detail/utility_wrappers.hpp>
2828
#include <cugraph/graph_functions.hpp>
29+
#include <cugraph/shuffle_functions.hpp>
2930

3031
#include <optional>
3132

@@ -131,7 +132,9 @@ struct similarity_functor : public cugraph::c_api::abstract_functor {
131132
graph_view,
132133
use_weight_ ? std::make_optional(edge_weights->view()) : std::nullopt,
133134
std::make_tuple(raft::device_span<vertex_t const>{v1.data(), v1.size()},
134-
raft::device_span<vertex_t const>{v2.data(), v2.size()}));
135+
raft::device_span<vertex_t const>{v2.data(), v2.size()}),
136+
do_expensive_check_
137+
);
135138

136139
result_ = new cugraph::c_api::cugraph_similarity_result_t{
137140
new cugraph::c_api::cugraph_type_erased_device_array_t(similarity_coefficients,
@@ -201,30 +204,58 @@ struct all_pairs_similarity_functor : public cugraph::c_api::abstract_functor {
201204

202205
auto number_map = reinterpret_cast<rmm::device_uvector<vertex_t>*>(graph_->number_map_);
203206

207+
std::optional<rmm::device_uvector<vertex_t>> vertices{std::nullopt};
208+
209+
if (vertices_ != nullptr) {
210+
vertices =
211+
rmm::device_uvector<vertex_t>{vertices_->size_, handle_.get_stream()};
212+
213+
raft::copy(vertices->data(),
214+
vertices_->as_type<vertex_t>(),
215+
vertices_->size_,
216+
handle_.get_stream());
217+
218+
//
219+
// Need to renumber vertices
220+
//
221+
cugraph::renumber_ext_vertices<vertex_t, multi_gpu>(
222+
handle_,
223+
vertices->data(),
224+
vertices->size(),
225+
number_map->data(),
226+
graph_view.local_vertex_partition_range_first(),
227+
graph_view.local_vertex_partition_range_last(),
228+
do_expensive_check_);
229+
230+
if constexpr (multi_gpu) { vertices = cugraph::shuffle_ext_vertices(handle_, std::move(*vertices)); }
231+
}
232+
204233
auto [v1, v2, similarity_coefficients] =
205234
call_similarity_(handle_,
206235
graph_view,
207236
use_weight_ ? std::make_optional(edge_weights->view()) : std::nullopt,
208-
vertices_ ? std::make_optional(raft::device_span<vertex_t const>{
209-
vertices_->as_type<vertex_t const>(), vertices_->size_})
210-
: std::nullopt,
211-
topk_ != SIZE_MAX ? std::make_optional(topk_) : std::nullopt);
212-
237+
vertices_ != nullptr ? std::make_optional(raft::device_span<vertex_t const>{
238+
vertices->data(), vertices->size()})
239+
: std::nullopt,
240+
topk_ != SIZE_MAX ? std::make_optional(topk_) : std::nullopt,
241+
do_expensive_check_
242+
);
243+
213244
cugraph::unrenumber_int_vertices<vertex_t, multi_gpu>(
214245
handle_,
215246
v1.data(),
216247
v1.size(),
217248
number_map->data(),
218249
graph_view.vertex_partition_range_lasts(),
219-
false);
250+
do_expensive_check_);
220251

221252
cugraph::unrenumber_int_vertices<vertex_t, multi_gpu>(
222253
handle_,
223254
v2.data(),
224255
v2.size(),
225256
number_map->data(),
226257
graph_view.vertex_partition_range_lasts(),
227-
false);
258+
do_expensive_check_);
228259

229260
result_ = new cugraph::c_api::cugraph_similarity_result_t{
230261
new cugraph::c_api::cugraph_type_erased_device_array_t(similarity_coefficients,
@@ -242,9 +273,10 @@ struct jaccard_functor {
242273
raft::handle_t const& handle,
243274
cugraph::graph_view_t<vertex_t, edge_t, false, multi_gpu> const& graph_view,
244275
std::optional<cugraph::edge_property_view_t<edge_t, weight_t const*>> edge_weight_view,
245-
std::tuple<raft::device_span<vertex_t const>, raft::device_span<vertex_t const>> vertex_pairs)
276+
std::tuple<raft::device_span<vertex_t const>, raft::device_span<vertex_t const>> vertex_pairs,
277+
bool do_expensive_check)
246278
{
247-
return cugraph::jaccard_coefficients(handle, graph_view, edge_weight_view, vertex_pairs);
279+
return cugraph::jaccard_coefficients(handle, graph_view, edge_weight_view, vertex_pairs, do_expensive_check);
248280
}
249281

250282
template <typename vertex_t, typename edge_t, typename weight_t, bool multi_gpu>
@@ -255,10 +287,11 @@ struct jaccard_functor {
255287
cugraph::graph_view_t<vertex_t, edge_t, false, multi_gpu> const& graph_view,
256288
std::optional<cugraph::edge_property_view_t<edge_t, weight_t const*>> edge_weight_view,
257289
std::optional<raft::device_span<vertex_t const>> vertices,
258-
std::optional<size_t> topk)
290+
std::optional<size_t> topk,
291+
bool do_expensive_check)
259292
{
260293
return cugraph::jaccard_all_pairs_coefficients(
261-
handle, graph_view, edge_weight_view, vertices, topk);
294+
handle, graph_view, edge_weight_view, vertices, topk, do_expensive_check);
262295
}
263296
};
264297

@@ -268,9 +301,10 @@ struct sorensen_functor {
268301
raft::handle_t const& handle,
269302
cugraph::graph_view_t<vertex_t, edge_t, false, multi_gpu> const& graph_view,
270303
std::optional<cugraph::edge_property_view_t<edge_t, weight_t const*>> edge_weight_view,
271-
std::tuple<raft::device_span<vertex_t const>, raft::device_span<vertex_t const>> vertex_pairs)
304+
std::tuple<raft::device_span<vertex_t const>, raft::device_span<vertex_t const>> vertex_pairs,
305+
bool do_expensive_check)
272306
{
273-
return cugraph::sorensen_coefficients(handle, graph_view, edge_weight_view, vertex_pairs);
307+
return cugraph::sorensen_coefficients(handle, graph_view, edge_weight_view, vertex_pairs, do_expensive_check);
274308
}
275309

276310
template <typename vertex_t, typename edge_t, typename weight_t, bool multi_gpu>
@@ -281,10 +315,11 @@ struct sorensen_functor {
281315
cugraph::graph_view_t<vertex_t, edge_t, false, multi_gpu> const& graph_view,
282316
std::optional<cugraph::edge_property_view_t<edge_t, weight_t const*>> edge_weight_view,
283317
std::optional<raft::device_span<vertex_t const>> vertices,
284-
std::optional<size_t> topk)
318+
std::optional<size_t> topk,
319+
bool do_expensive_check)
285320
{
286321
return cugraph::sorensen_all_pairs_coefficients(
287-
handle, graph_view, edge_weight_view, vertices, topk);
322+
handle, graph_view, edge_weight_view, vertices, topk, do_expensive_check);
288323
}
289324
};
290325

@@ -294,10 +329,11 @@ struct cosine_functor {
294329
raft::handle_t const& handle,
295330
cugraph::graph_view_t<vertex_t, edge_t, false, multi_gpu> const& graph_view,
296331
std::optional<cugraph::edge_property_view_t<edge_t, weight_t const*>> edge_weight_view,
297-
std::tuple<raft::device_span<vertex_t const>, raft::device_span<vertex_t const>> vertex_pairs)
332+
std::tuple<raft::device_span<vertex_t const>, raft::device_span<vertex_t const>> vertex_pairs,
333+
bool do_expensive_check)
298334
{
299335
return cugraph::cosine_similarity_coefficients(
300-
handle, graph_view, edge_weight_view, vertex_pairs);
336+
handle, graph_view, edge_weight_view, vertex_pairs, do_expensive_check);
301337
}
302338

303339
template <typename vertex_t, typename edge_t, typename weight_t, bool multi_gpu>
@@ -308,10 +344,11 @@ struct cosine_functor {
308344
cugraph::graph_view_t<vertex_t, edge_t, false, multi_gpu> const& graph_view,
309345
std::optional<cugraph::edge_property_view_t<edge_t, weight_t const*>> edge_weight_view,
310346
std::optional<raft::device_span<vertex_t const>> vertices,
311-
std::optional<size_t> topk)
347+
std::optional<size_t> topk,
348+
bool do_expensive_check)
312349
{
313350
return cugraph::cosine_similarity_all_pairs_coefficients(
314-
handle, graph_view, edge_weight_view, vertices, topk);
351+
handle, graph_view, edge_weight_view, vertices, topk, do_expensive_check);
315352
}
316353
};
317354

@@ -321,9 +358,10 @@ struct overlap_functor {
321358
raft::handle_t const& handle,
322359
cugraph::graph_view_t<vertex_t, edge_t, false, multi_gpu> const& graph_view,
323360
std::optional<cugraph::edge_property_view_t<edge_t, weight_t const*>> edge_weight_view,
324-
std::tuple<raft::device_span<vertex_t const>, raft::device_span<vertex_t const>> vertex_pairs)
361+
std::tuple<raft::device_span<vertex_t const>, raft::device_span<vertex_t const>> vertex_pairs,
362+
bool do_expensive_check)
325363
{
326-
return cugraph::overlap_coefficients(handle, graph_view, edge_weight_view, vertex_pairs);
364+
return cugraph::overlap_coefficients(handle, graph_view, edge_weight_view, vertex_pairs, do_expensive_check);
327365
}
328366

329367
template <typename vertex_t, typename edge_t, typename weight_t, bool multi_gpu>
@@ -334,10 +372,11 @@ struct overlap_functor {
334372
cugraph::graph_view_t<vertex_t, edge_t, false, multi_gpu> const& graph_view,
335373
std::optional<cugraph::edge_property_view_t<edge_t, weight_t const*>> edge_weight_view,
336374
std::optional<raft::device_span<vertex_t const>> vertices,
337-
std::optional<size_t> topk)
375+
std::optional<size_t> topk,
376+
bool do_expensive_check)
338377
{
339378
return cugraph::overlap_all_pairs_coefficients(
340-
handle, graph_view, edge_weight_view, vertices, topk);
379+
handle, graph_view, edge_weight_view, vertices, topk, do_expensive_check);
341380
}
342381
};
343382

@@ -347,10 +386,11 @@ struct cosine_similarity_functor {
347386
raft::handle_t const& handle,
348387
cugraph::graph_view_t<vertex_t, edge_t, false, multi_gpu> const& graph_view,
349388
std::optional<cugraph::edge_property_view_t<edge_t, weight_t const*>> edge_weight_view,
350-
std::tuple<raft::device_span<vertex_t const>, raft::device_span<vertex_t const>> vertex_pairs)
389+
std::tuple<raft::device_span<vertex_t const>, raft::device_span<vertex_t const>> vertex_pairs,
390+
bool do_expensive_check)
351391
{
352392
return cugraph::cosine_similarity_coefficients(
353-
handle, graph_view, edge_weight_view, vertex_pairs);
393+
handle, graph_view, edge_weight_view, vertex_pairs, do_expensive_check);
354394
}
355395

356396
template <typename vertex_t, typename edge_t, typename weight_t, bool multi_gpu>
@@ -361,10 +401,11 @@ struct cosine_similarity_functor {
361401
cugraph::graph_view_t<vertex_t, edge_t, false, multi_gpu> const& graph_view,
362402
std::optional<cugraph::edge_property_view_t<edge_t, weight_t const*>> edge_weight_view,
363403
std::optional<raft::device_span<vertex_t const>> vertices,
364-
std::optional<size_t> topk)
404+
std::optional<size_t> topk,
405+
bool do_expensive_check)
365406
{
366407
return cugraph::cosine_similarity_all_pairs_coefficients(
367-
handle, graph_view, edge_weight_view, vertices, topk);
408+
handle, graph_view, edge_weight_view, vertices, topk, do_expensive_check);
368409
}
369410
};
370411

@@ -568,7 +609,7 @@ extern "C" cugraph_error_code_t cugraph_all_pairs_cosine_similarity_coefficients
568609
*error);
569610
}
570611
all_pairs_similarity_functor functor(
571-
handle, graph, vertices, overlap_functor{}, use_weight, topk, do_expensive_check);
612+
handle, graph, vertices, cosine_functor{}, use_weight, topk, do_expensive_check);
572613

573614
return cugraph::c_api::run_algorithm(graph, functor, result, error);
574615
}

0 commit comments

Comments
 (0)