source: icGREP/icgrep-devel/icgrep/pablo/optimizers/graph-facade.hpp @ 5350

Last change on this file since 5350 was 4767, checked in by nmedfort, 4 years ago

Work on reassociation pass

File size: 3.9 KB
Line 
1#ifndef GRAPHFACADE_HPP
2#define GRAPHFACADE_HPP
3
4#include <boost/graph/adjacency_list.hpp>
5#include <vector>
6
7template <class Graph, bool transposed = false>
8struct DirectedGraphFacade;
9
10template <class Graph>
11struct DirectedGraphFacade<Graph, false> {
12
13    using Vertex = typename boost::graph_traits<Graph>::vertex_descriptor;
14    using VertexIterator = typename boost::graph_traits<Graph>::vertex_iterator;
15    using Degree = typename boost::graph_traits<Graph>::degree_size_type;
16    using Edge = typename boost::graph_traits<Graph>::edge_descriptor;
17    using InEdgeIterator = typename boost::graph_traits<Graph>::in_edge_iterator;
18    using OutEdgeIterator = typename boost::graph_traits<Graph>::out_edge_iterator;
19
20    DirectedGraphFacade(Graph & G) : mG(G) {}
21    inline Degree in_degree(const Vertex u) const {
22        return boost::in_degree(u, mG);
23    }
24    inline Degree out_degree(const Vertex u) const {
25        return boost::out_degree(u, mG);
26    }
27    inline std::pair<VertexIterator, VertexIterator> vertices() const {
28        return boost::vertices(mG);
29    }
30    inline std::pair<InEdgeIterator, InEdgeIterator> in_edges(const Vertex u) const {
31        return boost::in_edges(u, mG);
32    }
33    inline std::pair<OutEdgeIterator, OutEdgeIterator> out_edges(const Vertex u) const {
34        return boost::out_edges(u, mG);
35    }
36    inline void add_edge(const Vertex u, const Vertex v) {
37        boost::add_edge(u, v, mG);
38    }
39    inline void remove_edge(const Vertex u, const Vertex v) {
40        boost::remove_edge(u, v, mG);
41    }
42    inline void clear_in_edges(const Vertex u) {
43        boost::clear_in_edges(u, mG);
44    }
45    inline void clear_out_edges(const Vertex u) {
46        boost::clear_out_edges(u, mG);
47    }
48    inline Vertex source(const Edge & e) const {
49        return boost::source(e, mG);
50    }
51    inline Vertex target(const Edge & e) const {
52        return boost::target(e, mG);
53    }
54private:
55    Graph & mG;
56};
57
58template <class Graph>
59struct DirectedGraphFacade<Graph, true> {
60
61    using Vertex = typename boost::graph_traits<Graph>::vertex_descriptor;
62    using VertexIterator = typename boost::graph_traits<Graph>::vertex_iterator;
63    using Degree = typename boost::graph_traits<Graph>::degree_size_type;
64    using Edge = typename boost::graph_traits<Graph>::edge_descriptor;
65    using InEdgeIterator = typename boost::graph_traits<Graph>::out_edge_iterator;
66    using OutEdgeIterator = typename boost::graph_traits<Graph>::in_edge_iterator;
67
68    DirectedGraphFacade(Graph & G) : mG(G) {}
69    inline Degree in_degree(const Vertex u) const {
70        return boost::out_degree(u, mG);
71    }
72    inline Degree out_degree(const Vertex u) const {
73        return boost::in_degree(u, mG);
74    }
75    inline std::pair<VertexIterator, VertexIterator> vertices() const {
76        return boost::vertices(mG);
77    }
78    inline std::pair<InEdgeIterator, InEdgeIterator> in_edges(const Vertex u) const {
79        return boost::out_edges(u, mG);
80    }
81    inline std::pair<OutEdgeIterator, OutEdgeIterator> out_edges(const Vertex u) const {
82        return boost::in_edges(u, mG);
83    }
84    inline void add_edge(const Vertex u, const Vertex v) {
85        boost::add_edge(v, u, mG);
86    }
87    inline void remove_edge(const Vertex u, const Vertex v) {
88        boost::remove_edge(v, u, mG);
89    }
90    inline void clear_in_edges(const Vertex u) {
91        boost::clear_out_edges(u, mG);
92    }
93    inline void clear_out_edges(const Vertex u) {
94        boost::clear_in_edges(u, mG);
95    }
96    inline Vertex source(const Edge & e) const {
97        return boost::target(e, mG);
98    }
99    inline Vertex target(const Edge & e) const {
100        return boost::source(e, mG);
101    }
102private:
103    Graph & mG;
104};
105
106template<class Graph>
107DirectedGraphFacade<Graph, false> makeGraphFacade(Graph & G) {
108    return DirectedGraphFacade<Graph, false>(G);
109}
110
111template<class Graph>
112DirectedGraphFacade<Graph, true> makeTransposedGraphFacade(Graph & G) {
113    return DirectedGraphFacade<Graph, true>(G);
114}
115
116#endif // GRAPHFACADE_HPP
Note: See TracBrowser for help on using the repository browser.