CMR  1.3.0
graph_utils.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <boost/graph/breadth_first_search.hpp>
4 #include <boost/graph/filtered_graph.hpp>
5 #include <boost/graph/adjacency_list.hpp>
6 
7 namespace tu
8 {
9 
10  namespace util
11  {
12 
22  template <typename Graph>
23  void reconnect_edge_target(Graph& graph, typename boost::graph_traits <Graph>::edge_descriptor edge,
24  typename boost::graph_traits <Graph>::vertex_descriptor old_vertex, typename boost::graph_traits <Graph>::vertex_descriptor new_vertex)
25  {
26  if (old_vertex != new_vertex)
27  {
28  boost::add_edge(boost::source(edge, graph), new_vertex, *((typename Graph::edge_property_type*) edge.get_property()), graph);
29  boost::remove_edge(edge, graph);
30  }
31  }
32 
42  template <typename Graph>
43  void reconnect_edge_source(Graph& graph, typename boost::graph_traits <Graph>::edge_descriptor edge,
44  typename boost::graph_traits <Graph>::vertex_descriptor old_vertex, typename boost::graph_traits <Graph>::vertex_descriptor new_vertex)
45  {
46  if (old_vertex != new_vertex)
47  {
48  boost::add_edge(boost::target(edge, graph), new_vertex, *((typename Graph::edge_property_type*) edge.get_property()), graph);
49  boost::remove_edge(edge, graph);
50  }
51  }
52 
62  template <typename Graph>
63  void reconnect_edge(Graph& graph, typename boost::graph_traits <Graph>::edge_descriptor edge,
64  typename boost::graph_traits <Graph>::vertex_descriptor old_vertex, typename boost::graph_traits <Graph>::vertex_descriptor new_vertex)
65  {
66  if (boost::source(edge, graph) == old_vertex)
67  reconnect_edge_source(graph, edge, old_vertex, new_vertex);
68  else
69  reconnect_edge_target(graph, edge, old_vertex, new_vertex);
70  }
71 
72  namespace detail
73  {
74 
79  template <typename OutputIterator, typename EventTag>
81  {
82  typedef EventTag event_filter;
83 
90  vertex_writer(OutputIterator iterator) :
91  _iterator(iterator)
92  {
93 
94  }
95 
103  template <typename Vertex, typename Graph>
104  void operator()(Vertex vertex, const Graph& graph)
105  {
106  CMR_UNUSED(graph);
107 
108  *_iterator++ = vertex;
109  }
110 
115  OutputIterator iterator() const
116  {
117  return _iterator;
118  }
119 
120  private:
121  OutputIterator _iterator;
122  };
123 
132  template <typename OutputIterator, typename EventTag>
133  inline vertex_writer <OutputIterator, EventTag> write_vertex(OutputIterator iterator, EventTag tag)
134  {
135  CMR_UNUSED(tag);
136 
138  }
139  }
140 
150  template <typename Graph, typename IndexMap, typename VertexSequence>
151  bool is_path(const Graph& graph, const IndexMap index_map, VertexSequence& path)
152  {
153  typedef boost::graph_traits <Graph> traits;
154  typename traits::vertex_iterator vertex_iter, vertex_end;
155  typename traits::vertex_descriptor start = traits::null_vertex();
156 
157  size_t path_length = 0;
158  for (boost::tie(vertex_iter, vertex_end) = boost::vertices(graph); vertex_iter != vertex_end; ++vertex_iter)
159  {
160  size_t degree = boost::out_degree(*vertex_iter, graph);
161  if (degree > 2)
162  return false;
163  else if (degree == 1)
164  start = *vertex_iter;
165  path_length += degree;
166  }
167  if (start == traits::null_vertex())
168  return false;
169 
170  path_length = path_length / 2 + 1;
171 
172  size_t size_before = path.size();
173 
175  boost::breadth_first_search(graph, start, boost::vertex_index_map(index_map).visitor(boost::make_bfs_visitor(detail::write_vertex(
176  std::back_inserter(path), boost::on_discover_vertex()))));
177 
178  return path.size() - size_before == path_length;
179  }
180 
189  template <typename Graph, typename IndexMap>
190  bool is_path(const Graph& graph, const IndexMap index_map)
191  {
192  std::vector <typename boost::graph_traits <Graph>::vertex_descriptor> path;
193  path.reserve(boost::num_vertices(graph));
194  return is_path(graph, index_map, path);
195  }
196 
204  template <typename Graph>
205  bool is_path(const Graph& g)
206  {
207  return is_path(g, boost::get(boost::vertex_index, g));
208  }
209 
219  template <typename Graph, typename IndexMap, typename Vertex>
220  bool find_star_vertex(const Graph& graph, const IndexMap index_map, Vertex& vertex)
221  {
222  CMR_UNUSED(index_map);
223 
224  typedef boost::graph_traits <Graph> traits;
225  typename traits::vertex_iterator vertex_iter, vertex_end;
226  typename traits::edge_iterator edge_iter, edge_end;
227 
228  size_t edges = 0;
229  for (boost::tie(edge_iter, edge_end) = boost::edges(graph); edge_iter != edge_end; ++edge_iter)
230  {
231  ++edges;
232  }
233 
234  for (boost::tie(vertex_iter, vertex_end) = boost::vertices(graph); vertex_iter != vertex_end; ++vertex_iter)
235  {
236  if (boost::out_degree(*vertex_iter, graph) == edges)
237  {
238  vertex = *vertex_iter;
239  return true;
240  }
241  }
242 
243  return false;
244  }
245 
254  template <typename Graph, typename Vertex>
255  bool find_star_vertex(const Graph& graph, Vertex& vertex)
256  {
257  return find_star_vertex(graph, boost::get(boost::vertex_index, graph), vertex);
258  }
259 
268  template <typename Graph, typename IndexMap>
269  bool is_star(const Graph& graph, const IndexMap index_map)
270  {
271  typename boost::graph_traits <Graph>::vertex_descriptor vertex;
272  return find_star_vertex(graph, index_map, vertex);
273  }
274 
282  template <typename Graph>
283  bool is_star(const Graph& graph)
284  {
285  return is_star(graph, boost::get(boost::vertex_index, graph));
286  }
287 
295  template <typename Graph, typename VertexSet>
296  void used_vertices(const Graph& graph, VertexSet& vertex_set)
297  {
298  typedef boost::graph_traits <Graph> traits;
299  typename traits::edge_iterator edge_iter, edge_end;
300 
301  for (boost::tie(edge_iter, edge_end) = boost::edges(graph); edge_iter != edge_end; ++edge_iter)
302  {
303  vertex_set.insert(boost::source(*edge_iter, graph));
304  vertex_set.insert(boost::target(*edge_iter, graph));
305  }
306  }
307 
308  }
309 } /* namespace tu */
#define CMR_UNUSED(x)
Definition: env.h:24
vertex_writer< OutputIterator, EventTag > write_vertex(OutputIterator iterator, EventTag tag)
Definition: graph_utils.hpp:133
bool find_star_vertex(const Graph &graph, const IndexMap index_map, Vertex &vertex)
Definition: graph_utils.hpp:220
bool is_path(const Graph &graph, const IndexMap index_map, VertexSequence &path)
Definition: graph_utils.hpp:151
void used_vertices(const Graph &graph, VertexSet &vertex_set)
Definition: graph_utils.hpp:296
void reconnect_edge_target(Graph &graph, typename boost::graph_traits< Graph >::edge_descriptor edge, typename boost::graph_traits< Graph >::vertex_descriptor old_vertex, typename boost::graph_traits< Graph >::vertex_descriptor new_vertex)
Definition: graph_utils.hpp:23
bool is_star(const Graph &graph, const IndexMap index_map)
Definition: graph_utils.hpp:269
void reconnect_edge(Graph &graph, typename boost::graph_traits< Graph >::edge_descriptor edge, typename boost::graph_traits< Graph >::vertex_descriptor old_vertex, typename boost::graph_traits< Graph >::vertex_descriptor new_vertex)
Definition: graph_utils.hpp:63
void reconnect_edge_source(Graph &graph, typename boost::graph_traits< Graph >::edge_descriptor edge, typename boost::graph_traits< Graph >::vertex_descriptor old_vertex, typename boost::graph_traits< Graph >::vertex_descriptor new_vertex)
Definition: graph_utils.hpp:43
Definition: algorithm.hpp:14
Definition: graph_utils.hpp:81
void operator()(Vertex vertex, const Graph &graph)
Definition: graph_utils.hpp:104
vertex_writer(OutputIterator iterator)
Definition: graph_utils.hpp:90
OutputIterator iterator() const
Definition: graph_utils.hpp:115
EventTag event_filter
Definition: graph_utils.hpp:82