docc 0.8.3 (0d44999b)
C++ API Reference
Loading...
Searching...
No Matches
graph.h
Go to the documentation of this file.
1#pragma once
2
3#include <boost/bimap.hpp>
4#include <boost/functional/hash.hpp>
5#include <boost/graph/adjacency_list.hpp>
6#include <boost/graph/connected_components.hpp>
7#include <boost/graph/copy.hpp>
8#include <boost/graph/depth_first_search.hpp>
9#include <boost/graph/dominator_tree.hpp>
10#include <boost/graph/graph_traits.hpp>
11#include <boost/graph/reverse_graph.hpp>
12#include <boost/graph/strong_components.hpp>
13#include <boost/graph/topological_sort.hpp>
14#include <list>
15#include <ranges>
16#include <set>
17#include <tuple>
18#include <unordered_map>
19#include <unordered_set>
20
21namespace sdfg {
22namespace graph {
23
24typedef boost::adjacency_list<boost::listS, boost::listS, boost::bidirectionalS> Graph;
25typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;
26typedef boost::graph_traits<Graph>::edge_descriptor Edge;
27
28typedef boost::adjacency_list<boost::listS, boost::listS, boost::undirectedS> UndirectedGraph;
29typedef boost::graph_traits<UndirectedGraph>::edge_descriptor UndirectedEdge;
30
31typedef boost::reverse_graph<Graph> ReverseGraph;
32typedef boost::graph_traits<ReverseGraph>::edge_descriptor ReverseEdge;
33
34typedef std::unordered_map<Vertex, size_t> IndexMap;
35
36struct DFSVisitor : boost::default_dfs_visitor {
37 std::list<Vertex>& nodes_;
38 std::list<Edge>& back_edges_;
39
40 DFSVisitor(std::list<Edge>& back_edges, std::list<Vertex>& nodes) : nodes_(nodes), back_edges_(back_edges) {};
41
42 void discover_vertex(Vertex v, const Graph& g) {
43 nodes_.push_back(v);
44 };
45
46 void back_edge(Edge e, const Graph& g) {
47 back_edges_.push_back(e);
48 };
49};
50
52
53const std::tuple<
54 std::unique_ptr<const UndirectedGraph>,
55 const std::unordered_map<Vertex, Vertex>,
56 const std::unordered_map<Vertex, Vertex>>
58
59const std::list<Vertex> depth_first_search(const Graph& graph, const graph::Vertex start);
60
61std::pair<int, std::unordered_map<Vertex, size_t>> strongly_connected_components(const Graph& graph);
62
63std::pair<size_t, const std::unordered_map<Vertex, size_t>> weakly_connected_components(const Graph& graph);
64
65const std::unordered_map<Vertex, Vertex> dominator_tree(const Graph& graph, const Vertex src);
66
67const std::unordered_map<Vertex, Vertex> post_dominator_tree(Graph& graph);
68
69const std::list<graph::Vertex> topological_sort(const Graph& graph);
70
71bool is_acyclic(const Graph& graph);
72
73const std::list<Edge> back_edges(const Graph& graph, const graph::Vertex start);
74
76 const Graph& graph,
77 const Edge edge,
78 const Vertex v,
79 std::list<std::list<Edge>>& all_paths,
80 std::list<Edge>& current_path,
81 std::set<Vertex>& visited
82);
83
84const std::list<std::list<Edge>> all_simple_paths(const Graph& graph, const Vertex src, const Vertex dst);
85
86} // namespace graph
87} // namespace sdfg
Definition graph.h:22
boost::graph_traits< Graph >::vertex_descriptor Vertex
Definition graph.h:25
void all_simple_paths_dfs(const Graph &graph, const Edge edge, const Vertex v, std::list< std::list< Edge > > &all_paths, std::list< Edge > &current_path, std::set< Vertex > &visited)
const std::unordered_map< Vertex, Vertex > dominator_tree(const Graph &graph, const Vertex src)
boost::reverse_graph< Graph > ReverseGraph
Definition graph.h:31
const std::list< Edge > back_edges(const Graph &graph, const graph::Vertex start)
std::pair< size_t, const std::unordered_map< Vertex, size_t > > weakly_connected_components(const Graph &graph)
boost::graph_traits< Graph >::edge_descriptor Edge
Definition graph.h:26
boost::adjacency_list< boost::listS, boost::listS, boost::undirectedS > UndirectedGraph
Definition graph.h:28
boost::adjacency_list< boost::listS, boost::listS, boost::bidirectionalS > Graph
Definition graph.h:24
const std::unordered_map< Vertex, Vertex > post_dominator_tree(Graph &graph)
const std::list< graph::Vertex > topological_sort(const Graph &graph)
const std::tuple< std::unique_ptr< const UndirectedGraph >, const std::unordered_map< Vertex, Vertex >, const std::unordered_map< Vertex, Vertex > > undirected(const Graph &graph)
const ReverseGraph reverse(const Graph &graph)
std::unordered_map< Vertex, size_t > IndexMap
Definition graph.h:34
std::pair< int, std::unordered_map< Vertex, size_t > > strongly_connected_components(const Graph &graph)
boost::graph_traits< ReverseGraph >::edge_descriptor ReverseEdge
Definition graph.h:32
const std::list< Vertex > depth_first_search(const Graph &graph, const graph::Vertex start)
boost::graph_traits< UndirectedGraph >::edge_descriptor UndirectedEdge
Definition graph.h:29
const std::list< std::list< Edge > > all_simple_paths(const Graph &graph, const Vertex src, const Vertex dst)
bool is_acyclic(const Graph &graph)
Definition analysis.h:7
void discover_vertex(Vertex v, const Graph &g)
Definition graph.h:42
DFSVisitor(std::list< Edge > &back_edges, std::list< Vertex > &nodes)
Definition graph.h:40
std::list< Edge > & back_edges_
Definition graph.h:38
std::list< Vertex > & nodes_
Definition graph.h:37
void back_edge(Edge e, const Graph &g)
Definition graph.h:46