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

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

More work on reassociation + distribution pass

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