@@ -199,8 +199,6 @@ compress_edgelist(edgelist_t<vertex_t, edge_t, weight_t> const& edgelist,
199199 }
200200 }
201201
202- // FIXME: need to add an option to sort neighbor lists
203-
204202 return std::make_tuple (
205203 std::move (offsets), std::move (indices), std::move (weights), std::move (dcs_nzd_vertices));
206204}
@@ -748,6 +746,162 @@ graph_t<vertex_t, edge_t, weight_t, store_transposed, multi_gpu, std::enable_if_
748746 return std::move (new_renumber_map);
749747}
750748
749+ template <typename vertex_t ,
750+ typename edge_t ,
751+ typename weight_t ,
752+ bool store_transposed,
753+ bool multi_gpu>
754+ rmm::device_uvector<vertex_t >
755+ graph_t <vertex_t , edge_t , weight_t , store_transposed, multi_gpu, std::enable_if_t <multi_gpu>>::
756+ transpose (raft::handle_t const & handle, rmm::device_uvector<vertex_t >&& renumber_map)
757+ {
758+ if (this ->is_symmetric ()) { return std::move (renumber_map); }
759+
760+ auto is_multigraph = this ->is_multigraph ();
761+
762+ auto wrapped_renumber_map = std::optional<rmm::device_uvector<vertex_t >>(std::move (renumber_map));
763+
764+ auto [edgelist_rows, edgelist_cols, edgelist_weights] =
765+ this ->decompress_to_edgelist (handle, wrapped_renumber_map, true );
766+
767+ std::tie (store_transposed ? edgelist_rows : edgelist_cols,
768+ store_transposed ? edgelist_cols : edgelist_rows,
769+ edgelist_weights) =
770+ detail::shuffle_edgelist_by_gpu_id (handle,
771+ std::move (store_transposed ? edgelist_rows : edgelist_cols),
772+ std::move (store_transposed ? edgelist_cols : edgelist_rows),
773+ std::move (edgelist_weights));
774+
775+ auto [transposed_graph, new_renumber_map] =
776+ create_graph_from_edgelist<vertex_t , edge_t , weight_t , store_transposed, multi_gpu>(
777+ handle,
778+ std::move (*wrapped_renumber_map),
779+ std::move (edgelist_cols),
780+ std::move (edgelist_rows),
781+ std::move (edgelist_weights),
782+ graph_properties_t {is_multigraph, false },
783+ true );
784+ *this = std::move (transposed_graph);
785+
786+ return std::move (*new_renumber_map);
787+ }
788+
789+ template <typename vertex_t ,
790+ typename edge_t ,
791+ typename weight_t ,
792+ bool store_transposed,
793+ bool multi_gpu>
794+ std::optional<rmm::device_uvector<vertex_t >>
795+ graph_t <vertex_t , edge_t , weight_t , store_transposed, multi_gpu, std::enable_if_t <!multi_gpu>>::
796+ transpose (raft::handle_t const & handle,
797+ std::optional<rmm::device_uvector<vertex_t >>&& renumber_map)
798+ {
799+ if (this ->is_symmetric ()) { return std::move (renumber_map); }
800+
801+ auto number_of_vertices = this ->get_number_of_vertices ();
802+ auto is_multigraph = this ->is_multigraph ();
803+ bool renumber = renumber_map.has_value ();
804+
805+ auto [edgelist_rows, edgelist_cols, edgelist_weights] =
806+ this ->decompress_to_edgelist (handle, renumber_map, true );
807+ auto vertex_span = renumber ? std::move (renumber_map)
808+ : std::make_optional<rmm::device_uvector<vertex_t >>(
809+ number_of_vertices, handle.get_stream ());
810+ if (!renumber) {
811+ thrust::sequence (
812+ handle.get_thrust_policy (), (*vertex_span).begin (), (*vertex_span).end (), vertex_t {0 });
813+ }
814+
815+ auto [transposed_graph, new_renumber_map] =
816+ create_graph_from_edgelist<vertex_t , edge_t , weight_t , store_transposed, multi_gpu>(
817+ handle,
818+ std::move (vertex_span),
819+ std::move (edgelist_cols),
820+ std::move (edgelist_rows),
821+ std::move (edgelist_weights),
822+ graph_properties_t {is_multigraph, false },
823+ renumber);
824+ *this = std::move (transposed_graph);
825+
826+ return std::move (new_renumber_map);
827+ }
828+
829+ template <typename vertex_t ,
830+ typename edge_t ,
831+ typename weight_t ,
832+ bool store_transposed,
833+ bool multi_gpu>
834+ std::tuple<graph_t <vertex_t , edge_t , weight_t , !store_transposed, multi_gpu>,
835+ rmm::device_uvector<vertex_t >>
836+ graph_t <vertex_t , edge_t , weight_t , store_transposed, multi_gpu, std::enable_if_t <multi_gpu>>::
837+ transpose_storage (raft::handle_t const & handle,
838+ rmm::device_uvector<vertex_t >&& renumber_map,
839+ bool destroy)
840+ {
841+ auto is_multigraph = this ->is_multigraph ();
842+
843+ auto wrapped_renumber_map = std::optional<rmm::device_uvector<vertex_t >>(std::move (renumber_map));
844+
845+ auto [edgelist_rows, edgelist_cols, edgelist_weights] =
846+ this ->decompress_to_edgelist (handle, wrapped_renumber_map, destroy);
847+
848+ std::tie (!store_transposed ? edgelist_cols : edgelist_rows,
849+ !store_transposed ? edgelist_rows : edgelist_cols,
850+ edgelist_weights) =
851+ detail::shuffle_edgelist_by_gpu_id (handle,
852+ std::move (!store_transposed ? edgelist_cols : edgelist_rows),
853+ std::move (!store_transposed ? edgelist_rows : edgelist_cols),
854+ std::move (edgelist_weights));
855+
856+ auto [storage_transposed_graph, new_renumber_map] =
857+ create_graph_from_edgelist<vertex_t , edge_t , weight_t , !store_transposed, multi_gpu>(
858+ handle,
859+ std::move (*wrapped_renumber_map),
860+ std::move (edgelist_rows),
861+ std::move (edgelist_cols),
862+ std::move (edgelist_weights),
863+ graph_properties_t {is_multigraph, false },
864+ true );
865+
866+ return std::make_tuple (std::move (storage_transposed_graph), std::move (*new_renumber_map));
867+ }
868+
869+ template <typename vertex_t ,
870+ typename edge_t ,
871+ typename weight_t ,
872+ bool store_transposed,
873+ bool multi_gpu>
874+ std::tuple<graph_t <vertex_t , edge_t , weight_t , !store_transposed, multi_gpu>,
875+ std::optional<rmm::device_uvector<vertex_t >>>
876+ graph_t <vertex_t , edge_t , weight_t , store_transposed, multi_gpu, std::enable_if_t <!multi_gpu>>::
877+ transpose_storage (raft::handle_t const & handle,
878+ std::optional<rmm::device_uvector<vertex_t >>&& renumber_map,
879+ bool destroy)
880+ {
881+ auto number_of_vertices = this ->get_number_of_vertices ();
882+ auto is_multigraph = this ->is_multigraph ();
883+ bool renumber = renumber_map.has_value ();
884+
885+ auto [edgelist_rows, edgelist_cols, edgelist_weights] =
886+ this ->decompress_to_edgelist (handle, renumber_map, destroy);
887+ auto vertex_span = renumber ? std::move (renumber_map)
888+ : std::make_optional<rmm::device_uvector<vertex_t >>(
889+ number_of_vertices, handle.get_stream ());
890+ if (!renumber) {
891+ thrust::sequence (
892+ handle.get_thrust_policy (), (*vertex_span).begin (), (*vertex_span).end (), vertex_t {0 });
893+ }
894+
895+ return create_graph_from_edgelist<vertex_t , edge_t , weight_t , !store_transposed, multi_gpu>(
896+ handle,
897+ std::move (vertex_span),
898+ std::move (edgelist_cols),
899+ std::move (edgelist_rows),
900+ std::move (edgelist_weights),
901+ graph_properties_t {is_multigraph, false },
902+ renumber);
903+ }
904+
751905template <typename vertex_t ,
752906 typename edge_t ,
753907 typename weight_t ,
0 commit comments