/*! * Copyright (c) 2020 by Contributors * \file dgl/graph_traversal.h * \brief common graph traversal operations */ #ifndef DGL_GRAPH_TRAVERSAL_H_ #define DGL_GRAPH_TRAVERSAL_H_ #include "array.h" #include "base_heterograph.h" namespace dgl { ///////////////////////// Graph Traverse routines ////////////////////////// /*! * \brief Class for representing frontiers. * * Each frontier is a list of nodes/edges (specified by their ids). * An optional tag can be specified on each node/edge (represented by an int value). */ struct Frontiers { /*!\brief a vector store for the nodes/edges in all the frontiers */ IdArray ids; /*! * \brief a vector store for node/edge tags. Dtype is int64. * Empty if no tags are requested */ IdArray tags; /*!\brief a section vector to indicate each frontier Dtype is int64. */ IdArray sections; }; namespace aten { /*! * \brief Traverse the graph in a breadth-first-search (BFS) order. * * \param csr The input csr matrix. * \param sources Source nodes. * \return A Frontiers object containing the search result */ Frontiers BFSNodesFrontiers(const CSRMatrix& csr, IdArray source); /*! * \brief Traverse the graph in a breadth-first-search (BFS) order, returning * the edges of the BFS tree. * * \param csr The input csr matrix. * \param sources Source nodes. * \return A Frontiers object containing the search result */ Frontiers BFSEdgesFrontiers(const CSRMatrix& csr, IdArray source); /*! * \brief Traverse the graph in topological order. * * \param csr The input csr matrix. * \return A Frontiers object containing the search result */ Frontiers TopologicalNodesFrontiers(const CSRMatrix& csr); /*! * \brief Traverse the graph in a depth-first-search (DFS) order. * * \param csr The input csr matrix. * \param sources Source nodes. * \return A Frontiers object containing the search result */ Frontiers DGLDFSEdges(const CSRMatrix& csr, IdArray source); /*! * \brief Traverse the graph in a depth-first-search (DFS) order and return the * recorded edge tag if return_labels is specified. * * The traversal visit edges in its DFS order. Edges have three tags: * FORWARD(0), REVERSE(1), NONTREE(2) * * A FORWARD edge is one in which `u` has been visisted but `v` has not. * A REVERSE edge is one in which both `u` and `v` have been visisted and the edge * is in the DFS tree. * A NONTREE edge is one in which both `u` and `v` have been visisted but the edge * is NOT in the DFS tree. * * \param csr The input csr matrix. * \param sources Source nodes. * \param has_reverse_edge If true, REVERSE edges are included * \param has_nontree_edge If true, NONTREE edges are included * \param return_labels If true, return the recorded edge tags. * \return A Frontiers object containing the search result */ Frontiers DGLDFSLabeledEdges(const CSRMatrix& csr, IdArray source, const bool has_reverse_edge, const bool has_nontree_edge, const bool return_labels); } // namespace aten } // namespace dgl #endif // DGL_GRAPH_TRAVERSAL_H_