Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
150505d
improve create_graph_from_edgelist_documentation
seunghwak Sep 20, 2021
d58dfbf
Merge branch 'branch-21.10' of github.com:rapidsai/cugraph into fea_s…
seunghwak Sep 22, 2021
80a5d8d
initial implementation of symmetrize edgelist
seunghwak Sep 22, 2021
1210608
move symmetrize_edgelist to the detail space with majors/minors inste…
seunghwak Sep 22, 2021
7557fa1
add symmetrize member function to graph_t
seunghwak Sep 22, 2021
497ee32
Merge branch 'branch-21.10' of github.com:rapidsai/cugraph into fea_s…
seunghwak Sep 22, 2021
281c2ce
implement transpose_edgelist
seunghwak Sep 22, 2021
6c97224
add graph_t::transpose()
seunghwak Sep 22, 2021
6efdffa
transpoe => transpose (transpose graph) & transpose_graph_adjacency_m…
seunghwak Sep 23, 2021
ffc944c
add public symmetrize_edgelist function
seunghwak Sep 23, 2021
152c82c
refactor decompress_matrix_partition_to_edgelist
seunghwak Sep 23, 2021
f177ca4
add additional input argument checks to renumber_edgelist
seunghwak Sep 24, 2021
6cbcdd4
for SG, set the input parameter adj_matrix_partition_idx's default va…
seunghwak Sep 24, 2021
6d370ec
implement unrenumber_local_int_edges
seunghwak Sep 24, 2021
e4bf27d
cosmetic updates
seunghwak Sep 24, 2021
8097b21
add renumber_local_int_edges
seunghwak Sep 27, 2021
4600bd1
implement graph_t::symmetrize
seunghwak Sep 27, 2021
f9a0f57
update generator tests
seunghwak Sep 27, 2021
8a6b5fb
add check_diagonal to symmetrize_edgelist_from_triangular
seunghwak Sep 27, 2021
015da7f
minor API updates
seunghwak Sep 30, 2021
74eee0a
add symmetrize tests
seunghwak Sep 30, 2021
92d2b91
bug fixes
seunghwak Sep 30, 2021
5b7d745
Merge branch 'branch-21.12' of github.com:rapidsai/cugraph into fea_s…
seunghwak Sep 30, 2021
ccdfbbb
bug fixes
seunghwak Oct 1, 2021
9a9e5b4
add do_expensive_check to create_graph_from_edgeslist
seunghwak Oct 1, 2021
bbb137c
fix typo
seunghwak Oct 1, 2021
0c257ab
additional bug fixes
seunghwak Oct 1, 2021
3e4516c
update MG symmetrize test
seunghwak Oct 1, 2021
fd4da17
Merge branch 'branch-21.12' of github.com:rapidsai/cugraph into fea_s…
seunghwak Oct 1, 2021
401b98e
documentation & code cosmetics updates
seunghwak Oct 1, 2021
6783edb
clang-format
seunghwak Oct 1, 2021
6d292c4
compile error fix
seunghwak Oct 4, 2021
de3f50c
Merge branch 'branch-21.12' of github.com:rapidsai/cugraph into fea_t…
seunghwak Oct 4, 2021
53f8be9
pull symmetrize PR
seunghwak Oct 4, 2021
1c2bc87
implement transpose
seunghwak Oct 4, 2021
72f46d3
remove dead code
seunghwak Oct 4, 2021
e6f9a21
bug fixes
seunghwak Oct 5, 2021
0308c13
add tests
seunghwak Oct 5, 2021
35296fc
Merge branch 'branch-21.12' of github.com:rapidsai/cugraph into fea_s…
seunghwak Oct 13, 2021
7f8fa5c
Merge branch 'upstream_pr1833' into fea_transpose
seunghwak Oct 13, 2021
21943c2
resolve merge conflicts
seunghwak Oct 15, 2021
f369c06
fix erroneous FIXME comments
seunghwak Oct 15, 2021
5a79e94
clang-format
seunghwak Oct 15, 2021
89c4fc9
update documentation
seunghwak Oct 15, 2021
fbdcb9f
set do_expensive_check to false
seunghwak Oct 15, 2021
0e906aa
remove unused files
seunghwak Oct 15, 2021
becac46
fix error in documentation
seunghwak Oct 15, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cpp/include/cugraph/algorithms.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1387,6 +1387,7 @@ random_walks(raft::handle_t const& handle,
* @tparam multi_gpu Flag indicating whether template instantiation should target single-GPU (false)
* or multi-GPU (true).
* @param handle RAFT handle object to encapsulate resources (e.g. CUDA stream, communicator, and
* handles to various CUDA libraries) to run graph algorithms.
* @param graph_view Graph view object.
* @param components Pointer to the output component ID array.
* @param do_expensive_check A flag to run expensive checks for input arguments (if set to `true`).
Expand Down
102 changes: 98 additions & 4 deletions cpp/include/cugraph/graph.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,11 +97,56 @@ class graph_t<vertex_t, edge_t, weight_t, store_transposed, multi_gpu, std::enab
graph_meta_t<vertex_t, edge_t, multi_gpu> meta,
bool do_expensive_check = false);

// return a new renumber_map
/**
* @brief Symmetrize this graph.
*
* @param handle RAFT handle object to encapsulate resources (e.g. CUDA stream, communicator, and
* handles to various CUDA libraries) to run graph algorithms.
* @param renumber_map Renumber map to recover the original vertex IDs from the renumbered vertex
* IDs.
* @param reciprocal If true, an edge is kept only when the reversed edge also exists. If false,
* keep (and symmetrize) all the edges that appear only in one direction.
* @return rmm::device_uvector<vertex_t> Return a new renumber map (to recover the original vertex
* IDs).
*/
rmm::device_uvector<vertex_t> symmetrize(raft::handle_t const& handle,
rmm::device_uvector<vertex_t>&& renumber_map,
bool reciprocal = false);

/**
* @brief Transpose this graph.
*
* @param handle RAFT handle object to encapsulate resources (e.g. CUDA stream, communicator, and
* handles to various CUDA libraries) to run graph algorithms.
* @param renumber_map Renumber map to recover the original vertex IDs from the renumbered vertex
* IDs.
* @return rmm::device_uvector<vertex_t> Return a new renumber map (to recover the original vertex
* IDs).
*/
rmm::device_uvector<vertex_t> transpose(raft::handle_t const& handle,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Question... this will work for callers that use C++ renumbering.

If we do python renumbering (for multi-column or strings), how would this function work? Would we have to provide a fake renumbering map (where i = i), and then use those values to look up values when we get back to python?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In SG, renumbering is optional, so you can provide std::nullopt.

In MG, renumbering is mandatory, so this question is relevant.

So, this depends on how the python renumbering is implemented. So, as you know, the C++ renumbering routine renumbers in a specific way to exploit this in optimizations as well. If the python renumbering satisfies all these requirements, we can create an identity mapping renumbering map (as you suggested) or look for a better option.

But if asking the python renumbering to satisfy all the detailed renumbering requirements is not very desirable, we may consider the renumbering process as the following.

Python renumbering
Multi-column AND|OR string IDs => integer IDs

C++ renumbering
Integer IDs to Integer IDs (mainly for optimization and can be mostly transparent to python users)

Then, really not that much changes with/or without python renumbering. This may add some additional overhead, but I guess String/multi-column renumbering is much more expensive than integer-to-integer renumbering and this leads to cleaner software architecture.

We run python renumbering, and then, run analytics as we have integer vertex ID inputs, and unrenumber to strings AND|OR multi-columns only when we need to return results to users.

What do you think and any concerns?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And this really depends on how python renumbering is implemented, but if python renumbering just maps multi-column/string IDs to integers, it just needs to find unique IDs, and create a mapping between original IDs to integer IDs.

If python renumbering also sorts vertex IDs within a partition by their degrees (as C++ layer uses this for various optimizations), it needs to compute the degrees for each unique vertex IDs, and I believe this can be done much more efficiently after converting to integer IDs than directly working on multi-column/string IDs.

So, the performance loss may not be really that significant.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks. I was mainly asking for clarification purposes (making sure we all understand the implications - especially @rlratzel whose team will have to use this feature).

I don't have any concerns over what you described. I believe the current python renumbering satisfies all the detailed renumbering requirements today. I suspect that the new string/multi-column renumbering can also satisfy those requirements. We can, while it is being developed, explore whether a two-phase renumbering would be more efficient or result in lower maintain cost at a minimal performance loss. For now we can just use the identity mapping to keep track of the numbering changes.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for covering this, I don't have any questions beyond what @ChuckHastings already asked.

rmm::device_uvector<vertex_t>&& renumber_map);

/**
* @brief Transpose the storage format (no change in actual graph).
*
* In SG, convert between CSR and CSC. In multi-GPU, currently convert between CSR + DCSR hybrid
* and CSC + DCSC hybrid (but the internal representation in multi-GPU is subject to change).
*
* @param handle RAFT handle object to encapsulate resources (e.g. CUDA stream, communicator, and
* handles to various CUDA libraries) to run graph algorithms.
* @param renumber_map Renumber map to recover the original vertex IDs from the renumbered vertex
* IDs.
* @param destroy If true, destroy this graph to free-up memory.
* @return std::tuple<graph_t<vertex_t, edge_t, weight_t, !store_transposed, multi_gpu>,
* rmm::device_uvector<vertex_t>> Return a storage transposed graph and a new renumber map (to
* recover the original vertex IDs for the returned graph).
*/
std::tuple<graph_t<vertex_t, edge_t, weight_t, !store_transposed, multi_gpu>,
rmm::device_uvector<vertex_t>>
transpose_storage(raft::handle_t const& handle,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So this variation returns a new graph and a new renumbering map. Same question about multi-column/string renumbering.

Also, it's a shame that this function can't be const. Would it be better to have two separate functions, one that is const (where destroy is forced to false) and one that is not const (where destroy is forced to be true)? I suppose it depends upon how we plan on using this.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah... I can create a const one if necessary; not sure it will be actually necessary. If store_transposed is not a template parameter, this can be a void function changing internal representation, so non-const. If one wants to keep both representations, yeah... having a const might be necessary (but this requires 2x memory so undesirable for large scale analysis).

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm inclined to leave this as is unless/until we discover a need for a const version. I was just initially surprised that it was not... and then realized the destroy = true option would require the ability to modify the contents.

rmm::device_uvector<vertex_t>&& renumber_map,
bool destroy = false);

bool is_weighted() const { return adj_matrix_partition_weights_.has_value(); }

graph_view_t<vertex_t, edge_t, weight_t, store_transposed, multi_gpu> view() const
Expand Down Expand Up @@ -169,7 +214,7 @@ class graph_t<vertex_t, edge_t, weight_t, store_transposed, multi_gpu, std::enab
std::optional<rmm::device_uvector<weight_t>>>
decompress_to_edgelist(raft::handle_t const& handle,
std::optional<rmm::device_uvector<vertex_t>> const& renumber_map,
bool destroy);
bool destroy = false);

private:
std::vector<rmm::device_uvector<edge_t>> adj_matrix_partition_offsets_{};
Expand Down Expand Up @@ -220,12 +265,61 @@ class graph_t<vertex_t, edge_t, weight_t, store_transposed, multi_gpu, std::enab
graph_meta_t<vertex_t, edge_t, multi_gpu> meta,
bool do_expensive_check = false);

// return a new renumber_map if @p renumber_map is valid
/**
* @brief Symmetrize this graph.
*
* @param handle RAFT handle object to encapsulate resources (e.g. CUDA stream, communicator, and
* handles to various CUDA libraries) to run graph algorithms.
* @param renumber_map Optional renumber map to recover the original vertex IDs from the
* renumbered vertex IDs. If @p renuber_map.has_value() is false, this function assumes that
* vertex IDs are not renumbered.
* @param reciprocal If true, an edge is kept only when the reversed edge also exists. If false,
* keep (and symmetrize) all the edges that appear only in one direction.
* @return rmm::device_uvector<vertex_t> Return a new renumber map (to recover the original vertex
* IDs) if @p renumber_map.has_value() is true.
*/
std::optional<rmm::device_uvector<vertex_t>> symmetrize(
raft::handle_t const& handle,
std::optional<rmm::device_uvector<vertex_t>>&& renumber_map,
bool reciprocal = false);

/**
* @brief Transpose this graph.
*
* @param handle RAFT handle object to encapsulate resources (e.g. CUDA stream, communicator, and
* handles to various CUDA libraries) to run graph algorithms.
* @param renumber_map Optional renumber map to recover the original vertex IDs from the
* renumbered vertex IDs. If @p renuber_map.has_value() is false, this function assumes that
* vertex IDs are not renumbered.
* @return rmm::device_uvector<vertex_t> Return a new renumber map (to recover the original vertex
* IDs) if @p renumber_map.has_value() is true.
*/
std::optional<rmm::device_uvector<vertex_t>> transpose(
raft::handle_t const& handle, std::optional<rmm::device_uvector<vertex_t>>&& renumber_map);

/**
* @brief Transpose the storage format (no change in actual graph).
*
* In SG, convert between CSR and CSC. In multi-GPU, currently convert between CSR + DCSR hybrid
* and CSC + DCSC hybrid (but the internal representation in multi-GPU is subject to change).
*
* @param handle RAFT handle object to encapsulate resources (e.g. CUDA stream, communicator, and
* handles to various CUDA libraries) to run graph algorithms.
* @param renumber_map Optional renumber map to recover the original vertex IDs from the
* renumbered vertex IDs. If @p renuber_map.has_value() is false, this function assumes that
* vertex IDs are not renumbered.
* @param destroy If true, destroy this graph to free-up memory.
* @return std::tuple<graph_t<vertex_t, edge_t, weight_t, !store_transposed, multi_gpu>,
* rmm::device_uvector<vertex_t>> Return a storage transposed graph and a optional new renumber
* map (to recover the original vertex IDs for the returned graph) The returned optional new
* renumber map is valid only if @p renumber_map.has_value() is true.
*/
std::tuple<graph_t<vertex_t, edge_t, weight_t, !store_transposed, multi_gpu>,
std::optional<rmm::device_uvector<vertex_t>>>
transpose_storage(raft::handle_t const& handle,
std::optional<rmm::device_uvector<vertex_t>>&& renumber_map,
bool destroy = false);

bool is_weighted() const { return weights_.has_value(); }

graph_view_t<vertex_t, edge_t, weight_t, store_transposed, multi_gpu> view() const
Expand Down Expand Up @@ -270,7 +364,7 @@ class graph_t<vertex_t, edge_t, weight_t, store_transposed, multi_gpu, std::enab
std::optional<rmm::device_uvector<weight_t>>>
decompress_to_edgelist(raft::handle_t const& handle,
std::optional<rmm::device_uvector<vertex_t>> const& renumber_map,
bool destroy);
bool destroy = false);

private:
friend class cugraph::serializer::serializer_t;
Expand Down
158 changes: 156 additions & 2 deletions cpp/src/structure/graph_impl.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -199,8 +199,6 @@ compress_edgelist(edgelist_t<vertex_t, edge_t, weight_t> const& edgelist,
}
}

// FIXME: need to add an option to sort neighbor lists

return std::make_tuple(
std::move(offsets), std::move(indices), std::move(weights), std::move(dcs_nzd_vertices));
}
Expand Down Expand Up @@ -748,6 +746,162 @@ graph_t<vertex_t, edge_t, weight_t, store_transposed, multi_gpu, std::enable_if_
return std::move(new_renumber_map);
}

template <typename vertex_t,
typename edge_t,
typename weight_t,
bool store_transposed,
bool multi_gpu>
rmm::device_uvector<vertex_t>
graph_t<vertex_t, edge_t, weight_t, store_transposed, multi_gpu, std::enable_if_t<multi_gpu>>::
transpose(raft::handle_t const& handle, rmm::device_uvector<vertex_t>&& renumber_map)
{
if (this->is_symmetric()) { return std::move(renumber_map); }

auto is_multigraph = this->is_multigraph();

auto wrapped_renumber_map = std::optional<rmm::device_uvector<vertex_t>>(std::move(renumber_map));

auto [edgelist_rows, edgelist_cols, edgelist_weights] =
this->decompress_to_edgelist(handle, wrapped_renumber_map, true);

std::tie(store_transposed ? edgelist_rows : edgelist_cols,
store_transposed ? edgelist_cols : edgelist_rows,
edgelist_weights) =
detail::shuffle_edgelist_by_gpu_id(handle,
std::move(store_transposed ? edgelist_rows : edgelist_cols),
std::move(store_transposed ? edgelist_cols : edgelist_rows),
std::move(edgelist_weights));

auto [transposed_graph, new_renumber_map] =
create_graph_from_edgelist<vertex_t, edge_t, weight_t, store_transposed, multi_gpu>(
handle,
std::move(*wrapped_renumber_map),
std::move(edgelist_cols),
std::move(edgelist_rows),
std::move(edgelist_weights),
graph_properties_t{is_multigraph, false},
true);
*this = std::move(transposed_graph);

return std::move(*new_renumber_map);
}

template <typename vertex_t,
typename edge_t,
typename weight_t,
bool store_transposed,
bool multi_gpu>
std::optional<rmm::device_uvector<vertex_t>>
graph_t<vertex_t, edge_t, weight_t, store_transposed, multi_gpu, std::enable_if_t<!multi_gpu>>::
transpose(raft::handle_t const& handle,
std::optional<rmm::device_uvector<vertex_t>>&& renumber_map)
{
if (this->is_symmetric()) { return std::move(renumber_map); }

auto number_of_vertices = this->get_number_of_vertices();
auto is_multigraph = this->is_multigraph();
bool renumber = renumber_map.has_value();

auto [edgelist_rows, edgelist_cols, edgelist_weights] =
this->decompress_to_edgelist(handle, renumber_map, true);
auto vertex_span = renumber ? std::move(renumber_map)
: std::make_optional<rmm::device_uvector<vertex_t>>(
number_of_vertices, handle.get_stream());
if (!renumber) {
thrust::sequence(
handle.get_thrust_policy(), (*vertex_span).begin(), (*vertex_span).end(), vertex_t{0});
}

auto [transposed_graph, new_renumber_map] =
create_graph_from_edgelist<vertex_t, edge_t, weight_t, store_transposed, multi_gpu>(
handle,
std::move(vertex_span),
std::move(edgelist_cols),
std::move(edgelist_rows),
std::move(edgelist_weights),
graph_properties_t{is_multigraph, false},
renumber);
*this = std::move(transposed_graph);

return std::move(new_renumber_map);
}

template <typename vertex_t,
typename edge_t,
typename weight_t,
bool store_transposed,
bool multi_gpu>
std::tuple<graph_t<vertex_t, edge_t, weight_t, !store_transposed, multi_gpu>,
rmm::device_uvector<vertex_t>>
graph_t<vertex_t, edge_t, weight_t, store_transposed, multi_gpu, std::enable_if_t<multi_gpu>>::
transpose_storage(raft::handle_t const& handle,
rmm::device_uvector<vertex_t>&& renumber_map,
bool destroy)
{
auto is_multigraph = this->is_multigraph();

auto wrapped_renumber_map = std::optional<rmm::device_uvector<vertex_t>>(std::move(renumber_map));

auto [edgelist_rows, edgelist_cols, edgelist_weights] =
this->decompress_to_edgelist(handle, wrapped_renumber_map, destroy);

std::tie(!store_transposed ? edgelist_cols : edgelist_rows,
!store_transposed ? edgelist_rows : edgelist_cols,
edgelist_weights) =
detail::shuffle_edgelist_by_gpu_id(handle,
std::move(!store_transposed ? edgelist_cols : edgelist_rows),
std::move(!store_transposed ? edgelist_rows : edgelist_cols),
std::move(edgelist_weights));

auto [storage_transposed_graph, new_renumber_map] =
create_graph_from_edgelist<vertex_t, edge_t, weight_t, !store_transposed, multi_gpu>(
handle,
std::move(*wrapped_renumber_map),
std::move(edgelist_rows),
std::move(edgelist_cols),
std::move(edgelist_weights),
graph_properties_t{is_multigraph, false},
true);

return std::make_tuple(std::move(storage_transposed_graph), std::move(*new_renumber_map));
}

template <typename vertex_t,
typename edge_t,
typename weight_t,
bool store_transposed,
bool multi_gpu>
std::tuple<graph_t<vertex_t, edge_t, weight_t, !store_transposed, multi_gpu>,
std::optional<rmm::device_uvector<vertex_t>>>
graph_t<vertex_t, edge_t, weight_t, store_transposed, multi_gpu, std::enable_if_t<!multi_gpu>>::
transpose_storage(raft::handle_t const& handle,
std::optional<rmm::device_uvector<vertex_t>>&& renumber_map,
bool destroy)
{
auto number_of_vertices = this->get_number_of_vertices();
auto is_multigraph = this->is_multigraph();
bool renumber = renumber_map.has_value();

auto [edgelist_rows, edgelist_cols, edgelist_weights] =
this->decompress_to_edgelist(handle, renumber_map, destroy);
auto vertex_span = renumber ? std::move(renumber_map)
: std::make_optional<rmm::device_uvector<vertex_t>>(
number_of_vertices, handle.get_stream());
if (!renumber) {
thrust::sequence(
handle.get_thrust_policy(), (*vertex_span).begin(), (*vertex_span).end(), vertex_t{0});
}

return create_graph_from_edgelist<vertex_t, edge_t, weight_t, !store_transposed, multi_gpu>(
handle,
std::move(vertex_span),
std::move(edgelist_cols),
std::move(edgelist_rows),
std::move(edgelist_weights),
graph_properties_t{is_multigraph, false},
renumber);
}

template <typename vertex_t,
typename edge_t,
typename weight_t,
Expand Down
18 changes: 17 additions & 1 deletion cpp/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,14 @@ ConfigureTest(GRAPH_TEST structure/graph_test.cpp)
# - Symmetrize tests ------------------------------------------------------------------------------
ConfigureTest(SYMMETRIZE_TEST structure/symmetrize_test.cpp)

###################################################################################################
# - Transpose tests ------------------------------------------------------------------------------
ConfigureTest(TRANSPOSE_TEST structure/transpose_test.cpp)

###################################################################################################
# - Transpose Storage tests -----------------------------------------------------------------------
ConfigureTest(TRANSPOSE_STORAGE_TEST structure/transpose_storage_test.cpp)

###################################################################################################
# - Weight-sum tests ------------------------------------------------------------------------------
ConfigureTest(WEIGHT_SUM_TEST structure/weight_sum_test.cpp)
Expand Down Expand Up @@ -440,9 +448,17 @@ if(BUILD_CUGRAPH_MG_TESTS)

if(MPI_CXX_FOUND)
###########################################################################################
# - MG SYMMETRIZE tests ---------------------------------------------------------------------
# - MG SYMMETRIZE tests -------------------------------------------------------------------
ConfigureTestMG(MG_SYMMETRIZE_TEST structure/mg_symmetrize_test.cpp)

###########################################################################################
# - MG Transpose tests --------------------------------------------------------------------
ConfigureTestMG(MG_TRANSPOSE_TEST structure/mg_transpose_test.cpp)

###########################################################################################
# - MG Transpose Storage tests ------------------------------------------------------------
ConfigureTestMG(MG_TRANSPOSE_STORAGE_TEST structure/mg_transpose_storage_test.cpp)

###########################################################################################
# - MG PAGERANK tests ---------------------------------------------------------------------
ConfigureTestMG(MG_PAGERANK_TEST link_analysis/mg_pagerank_test.cpp)
Expand Down
2 changes: 1 addition & 1 deletion cpp/tests/structure/mg_symmetrize_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ class Tests_MGSymmetrize
cugraph::test::construct_graph<vertex_t, edge_t, weight_t, store_transposed, false>(
handle, input_usecase, symmetrize_usecase.test_weighted, false);

// 4-4. run SG symmetrize Centrality
// 4-4. run SG symmetrize

auto d_sg_renumber_map_labels =
sg_graph.symmetrize(handle, std::nullopt, symmetrize_usecase.reciprocal);
Expand Down
Loading