def bfs(G, start, return_sp_counter=False): """ Find the distances and predecessors for a breadth first traversal of a graph. Parameters ---------- G : cugraph.graph cuGraph graph descriptor, should contain the connectivity information as an adjacency list. start : Integer The index of the graph vertex from which the traversal begins return_sp_counter : bool, optional, default=False Indicates if shortest path counters should be returned Returns ------- df : cudf.DataFrame df['vertex'][i] gives the vertex id of the i'th vertex df['distance'][i] gives the path distance for the i'th vertex from the starting vertex df['predecessor'][i] gives for the i'th vertex the vertex it was reached from in the traversal df['sp_counter'][i] gives for the i'th vertex the number of shortest path leading to it during traversal (Only if retrun_sp_counter is True) Examples -------- >>> M = cudf.read_csv('datasets/karate.csv', delimiter=' ', >>> dtype=['int32', 'int32', 'float32'], header=None) >>> G = cugraph.Graph() >>> G.from_cudf_edgelist(M, source='0', destination='1') >>> df = cugraph.bfs(G, 0) """ if type(G) is Graph: directed = False else: directed = True if G.renumbered is True: start = G.lookup_internal_vertex_id(cudf.Series([start]))[0] df = bfs_wrapper.bfs(G, start, directed, return_sp_counter) if G.renumbered: df = G.unrenumber(df, "vertex") df = G.unrenumber(df, "predecessor") df["predecessor"].fillna(-1, inplace=True) return df
def bfs(G, start, directed=True): """ Find the distances and predecessors for a breadth first traversal of a graph. Parameters ---------- G : cugraph.graph cuGraph graph descriptor, should contain the connectivity information as an adjacency list. start : Integer The index of the graph vertex from which the traversal begins directed : bool Indicates whether the graph in question is a directed graph, or whether each edge has a corresponding reverse edge. (Allows optimizations if the graph is undirected) Returns ------- df : cudf.DataFrame df['vertex'][i] gives the vertex id of the i'th vertex df['distance'][i] gives the path distance for the i'th vertex from the starting vertex df['predecessor'][i] gives for the i'th vertex the vertex it was reached from in the traversal Examples -------- >>> M = cudf.read_csv('datasets/karate.csv', delimiter=' ', >>> dtype=['int32', 'int32', 'float32'], header=None) >>> sources = cudf.Series(M['0']) >>> destinations = cudf.Series(M['1']) >>> G = cugraph.Graph() >>> G.add_edge_list(sources, destinations, None) >>> df = cugraph.bfs(G, 0) """ df = bfs_wrapper.bfs(G, start, directed) return df
def bfs(G, start): """ Find the distances and predecessors for a breadth first traversal of a graph. Parameters ---------- G : cugraph.graph cuGraph graph descriptor, should contain the connectivity information as an adjacency list. start : Integer The index of the graph vertex from which the traversal begins Returns ------- df : cudf.DataFrame df['vertex'][i] gives the vertex id of the i'th vertex df['distance'][i] gives the path distance for the i'th vertex from the starting vertex df['predecessor'][i] gives for the i'th vertex the vertex it was reached from in the traversal Examples -------- >>> M = cudf.read_csv('datasets/karate.csv', delimiter=' ', >>> dtype=['int32', 'int32', 'float32'], header=None) >>> G = cugraph.Graph() >>> G.from_cudf_edgelist(M, source='0', destination='1') >>> df = cugraph.bfs(G, 0) """ if type(G) is Graph: directed = False else: directed = True df = bfs_wrapper.bfs(G, start, directed) return df
def bfs(G, start=None, return_sp_counter=None, i_start=None, directed=None, return_predecessors=None): """Find the distances and predecessors for a breadth first traversal of a graph. Parameters ---------- G : cugraph.Graph, networkx.Graph, CuPy or SciPy sparse matrix Graph or matrix object, which should contain the connectivity information. Edge weights, if present, should be single or double precision floating point values. start : Integer The index of the graph vertex from which the traversal begins return_sp_counter : bool, optional, default=False Indicates if shortest path counters should be returned i_start : Integer, optional Identical to start, added for API compatibility. Only start or i_start can be set, not both. directed : bool, optional NOTE For non-Graph-type (eg. sparse matrix) values of G only. Raises TypeError if used with a Graph object. If True (default), then convert the input matrix to a cugraph.DiGraph, otherwise a cugraph.Graph object will be used. Returns ------- Return value type is based on the input type. If G is a cugraph.Graph, returns: cudf.DataFrame df['vertex'] vertex IDs df['distance'] path distance for each vertex from the starting vertex df['predecessor'] for each i'th position in the column, the vertex ID immediately preceding the vertex at position i in the 'vertex' column df['sp_counter'] for each i'th position in the column, the number of shortest paths leading to the vertex at position i in the 'vertex' column (Only if retrun_sp_counter is True) If G is a networkx.Graph, returns: pandas.DataFrame with contents equivalent to the cudf.DataFrame described above. If G is a CuPy or SciPy matrix, returns: a 2-tuple of CuPy ndarrays (if CuPy matrix input) or Numpy ndarrays (if SciPy matrix input) representing: distance: cupy or numpy ndarray ndarray of shortest distances between source and vertex. predecessor: cupy or numpy ndarray ndarray of predecessors of a vertex on the path from source, which can be used to reconstruct the shortest paths. ...or if return_sp_counter is True, returns a 3-tuple with the above two arrays plus: sp_counter: cupy or numpy ndarray ndarray of number of shortest paths leading to each vertex. Examples -------- >>> M = cudf.read_csv('datasets/karate.csv', delimiter=' ', >>> dtype=['int32', 'int32', 'float32'], header=None) >>> G = cugraph.Graph() >>> G.from_cudf_edgelist(M, source='0', destination='1') >>> df = cugraph.bfs(G, 0) """ (start, return_sp_counter, directed) = \ _ensure_args(G, start, return_sp_counter, i_start, directed) # FIXME: allow nx_weight_attr to be specified (G, input_type) = ensure_cugraph_obj( G, nx_weight_attr="weight", matrix_graph_type=DiGraph if directed else Graph) if type(G) is Graph: is_directed = False else: is_directed = True if G.renumbered is True: start = G.lookup_internal_vertex_id(cudf.Series([start]))[0] df = bfs_wrapper.bfs(G, start, is_directed, return_sp_counter) if G.renumbered: df = G.unrenumber(df, "vertex") df = G.unrenumber(df, "predecessor") df["predecessor"].fillna(-1, inplace=True) return _convert_df_to_output_type(df, input_type)
def bfs(G, start, return_sp_counter=False): """ Find the distances and predecessors for a breadth first traversal of a graph. Parameters ---------- G : cuGraph.Graph, NetworkX.Graph, or CuPy sparse COO matrix cuGraph graph descriptor with connectivity information. Edge weights, if present, should be single or double precision floating point values. start : Integer The index of the graph vertex from which the traversal begins return_sp_counter : bool, optional, default=False Indicates if shortest path counters should be returned Returns ------- Return value type is based on the input type. If G is a cugraph.Graph, returns: cudf.DataFrame df['vertex'] vertex IDs df['distance'] path distance for each vertex from the starting vertex df['predecessor'] for each i'th position in the column, the vertex ID immediately preceding the vertex at position i in the 'vertex' column df['sp_counter'] for each i'th position in the column, the number of shortest paths leading to the vertex at position i in the 'vertex' column (Only if retrun_sp_counter is True) If G is a networkx.Graph, returns: pandas.DataFrame with contents equivalent to the cudf.DataFrame described above. If G is a CuPy sparse COO matrix, returns a 2-tuple of cupy.ndarray: distance: cupy.ndarray ndarray of shortest distances between source and vertex. predecessor: cupy.ndarray ndarray of predecessors of a vertex on the path from source, which can be used to reconstruct the shortest paths. sp_counter: cupy.ndarray ndarray of number of shortest paths leading to each vertex (only if retrun_sp_counter is True) Examples -------- >>> M = cudf.read_csv('datasets/karate.csv', delimiter=' ', >>> dtype=['int32', 'int32', 'float32'], header=None) >>> G = cugraph.Graph() >>> G.from_cudf_edgelist(M, source='0', destination='1') >>> df = cugraph.bfs(G, 0) """ # FIXME: allow nx_weight_attr to be specified (G, input_type) = ensure_cugraph_obj(G, nx_weight_attr="weight", matrix_graph_type=Graph) if type(G) is Graph: directed = False else: directed = True if G.renumbered is True: start = G.lookup_internal_vertex_id(cudf.Series([start]))[0] df = bfs_wrapper.bfs(G, start, directed, return_sp_counter) if G.renumbered: df = G.unrenumber(df, "vertex") df = G.unrenumber(df, "predecessor") df["predecessor"].fillna(-1, inplace=True) return _convert_df_to_output_type(df, input_type)