annotate DEPENDENCIES/generic/include/boost/graph/breadth_first_search.hpp @ 118:770eb830ec19 emscripten

Typo fix
author Chris Cannam
date Wed, 18 May 2016 16:14:08 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 //
Chris@16 2 //=======================================================================
Chris@16 3 // Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
Chris@16 4 // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
Chris@16 5 //
Chris@16 6 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 7 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 8 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 9 //=======================================================================
Chris@16 10 //
Chris@16 11 #ifndef BOOST_GRAPH_BREADTH_FIRST_SEARCH_HPP
Chris@16 12 #define BOOST_GRAPH_BREADTH_FIRST_SEARCH_HPP
Chris@16 13
Chris@16 14 /*
Chris@16 15 Breadth First Search Algorithm (Cormen, Leiserson, and Rivest p. 470)
Chris@16 16 */
Chris@16 17 #include <boost/config.hpp>
Chris@16 18 #include <vector>
Chris@16 19 #include <boost/pending/queue.hpp>
Chris@16 20 #include <boost/graph/graph_traits.hpp>
Chris@16 21 #include <boost/graph/graph_concepts.hpp>
Chris@16 22 #include <boost/graph/visitors.hpp>
Chris@16 23 #include <boost/graph/named_function_params.hpp>
Chris@16 24 #include <boost/graph/overloading.hpp>
Chris@16 25 #include <boost/graph/graph_concepts.hpp>
Chris@16 26 #include <boost/graph/two_bit_color_map.hpp>
Chris@16 27 #include <boost/concept/assert.hpp>
Chris@16 28
Chris@16 29 #ifdef BOOST_GRAPH_USE_MPI
Chris@16 30 #include <boost/graph/distributed/concepts.hpp>
Chris@16 31 #endif // BOOST_GRAPH_USE_MPI
Chris@16 32
Chris@16 33 namespace boost {
Chris@16 34
Chris@16 35 template <class Visitor, class Graph>
Chris@16 36 struct BFSVisitorConcept {
Chris@16 37 void constraints() {
Chris@16 38 BOOST_CONCEPT_ASSERT(( CopyConstructibleConcept<Visitor> ));
Chris@16 39 vis.initialize_vertex(u, g);
Chris@16 40 vis.discover_vertex(u, g);
Chris@16 41 vis.examine_vertex(u, g);
Chris@16 42 vis.examine_edge(e, g);
Chris@16 43 vis.tree_edge(e, g);
Chris@16 44 vis.non_tree_edge(e, g);
Chris@16 45 vis.gray_target(e, g);
Chris@16 46 vis.black_target(e, g);
Chris@16 47 vis.finish_vertex(u, g);
Chris@16 48 }
Chris@16 49 Visitor vis;
Chris@16 50 Graph g;
Chris@16 51 typename graph_traits<Graph>::vertex_descriptor u;
Chris@16 52 typename graph_traits<Graph>::edge_descriptor e;
Chris@16 53 };
Chris@16 54
Chris@16 55
Chris@16 56 // Multiple-source version
Chris@16 57 template <class IncidenceGraph, class Buffer, class BFSVisitor,
Chris@16 58 class ColorMap, class SourceIterator>
Chris@16 59 void breadth_first_visit
Chris@16 60 (const IncidenceGraph& g,
Chris@16 61 SourceIterator sources_begin, SourceIterator sources_end,
Chris@16 62 Buffer& Q, BFSVisitor vis, ColorMap color)
Chris@16 63 {
Chris@16 64 BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept<IncidenceGraph> ));
Chris@16 65 typedef graph_traits<IncidenceGraph> GTraits;
Chris@16 66 typedef typename GTraits::vertex_descriptor Vertex;
Chris@16 67 BOOST_CONCEPT_ASSERT(( BFSVisitorConcept<BFSVisitor, IncidenceGraph> ));
Chris@16 68 BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept<ColorMap, Vertex> ));
Chris@16 69 typedef typename property_traits<ColorMap>::value_type ColorValue;
Chris@16 70 typedef color_traits<ColorValue> Color;
Chris@16 71 typename GTraits::out_edge_iterator ei, ei_end;
Chris@16 72
Chris@16 73 for (; sources_begin != sources_end; ++sources_begin) {
Chris@16 74 Vertex s = *sources_begin;
Chris@16 75 put(color, s, Color::gray()); vis.discover_vertex(s, g);
Chris@16 76 Q.push(s);
Chris@16 77 }
Chris@16 78 while (! Q.empty()) {
Chris@16 79 Vertex u = Q.top(); Q.pop(); vis.examine_vertex(u, g);
Chris@16 80 for (boost::tie(ei, ei_end) = out_edges(u, g); ei != ei_end; ++ei) {
Chris@16 81 Vertex v = target(*ei, g); vis.examine_edge(*ei, g);
Chris@16 82 ColorValue v_color = get(color, v);
Chris@16 83 if (v_color == Color::white()) { vis.tree_edge(*ei, g);
Chris@16 84 put(color, v, Color::gray()); vis.discover_vertex(v, g);
Chris@16 85 Q.push(v);
Chris@16 86 } else { vis.non_tree_edge(*ei, g);
Chris@16 87 if (v_color == Color::gray()) vis.gray_target(*ei, g);
Chris@16 88 else vis.black_target(*ei, g);
Chris@16 89 }
Chris@16 90 } // end for
Chris@16 91 put(color, u, Color::black()); vis.finish_vertex(u, g);
Chris@16 92 } // end while
Chris@16 93 } // breadth_first_visit
Chris@16 94
Chris@16 95 // Single-source version
Chris@16 96 template <class IncidenceGraph, class Buffer, class BFSVisitor,
Chris@16 97 class ColorMap>
Chris@16 98 void breadth_first_visit
Chris@16 99 (const IncidenceGraph& g,
Chris@16 100 typename graph_traits<IncidenceGraph>::vertex_descriptor s,
Chris@16 101 Buffer& Q, BFSVisitor vis, ColorMap color)
Chris@16 102 {
Chris@16 103 typename graph_traits<IncidenceGraph>::vertex_descriptor sources[1] = {s};
Chris@16 104 breadth_first_visit(g, sources, sources + 1, Q, vis, color);
Chris@16 105 }
Chris@16 106
Chris@16 107
Chris@16 108 template <class VertexListGraph, class SourceIterator,
Chris@16 109 class Buffer, class BFSVisitor,
Chris@16 110 class ColorMap>
Chris@16 111 void breadth_first_search
Chris@16 112 (const VertexListGraph& g,
Chris@16 113 SourceIterator sources_begin, SourceIterator sources_end,
Chris@16 114 Buffer& Q, BFSVisitor vis, ColorMap color)
Chris@16 115 {
Chris@16 116 // Initialization
Chris@16 117 typedef typename property_traits<ColorMap>::value_type ColorValue;
Chris@16 118 typedef color_traits<ColorValue> Color;
Chris@16 119 typename boost::graph_traits<VertexListGraph>::vertex_iterator i, i_end;
Chris@16 120 for (boost::tie(i, i_end) = vertices(g); i != i_end; ++i) {
Chris@16 121 vis.initialize_vertex(*i, g);
Chris@16 122 put(color, *i, Color::white());
Chris@16 123 }
Chris@16 124 breadth_first_visit(g, sources_begin, sources_end, Q, vis, color);
Chris@16 125 }
Chris@16 126
Chris@16 127 template <class VertexListGraph, class Buffer, class BFSVisitor,
Chris@16 128 class ColorMap>
Chris@16 129 void breadth_first_search
Chris@16 130 (const VertexListGraph& g,
Chris@16 131 typename graph_traits<VertexListGraph>::vertex_descriptor s,
Chris@16 132 Buffer& Q, BFSVisitor vis, ColorMap color)
Chris@16 133 {
Chris@16 134 typename graph_traits<VertexListGraph>::vertex_descriptor sources[1] = {s};
Chris@16 135 breadth_first_search(g, sources, sources + 1, Q, vis, color);
Chris@16 136 }
Chris@16 137
Chris@16 138 namespace graph { struct bfs_visitor_event_not_overridden {}; }
Chris@16 139
Chris@16 140
Chris@16 141 template <class Visitors = null_visitor>
Chris@16 142 class bfs_visitor {
Chris@16 143 public:
Chris@16 144 bfs_visitor() { }
Chris@16 145 bfs_visitor(Visitors vis) : m_vis(vis) { }
Chris@16 146
Chris@16 147 template <class Vertex, class Graph>
Chris@16 148 graph::bfs_visitor_event_not_overridden
Chris@16 149 initialize_vertex(Vertex u, Graph& g)
Chris@16 150 {
Chris@16 151 invoke_visitors(m_vis, u, g, ::boost::on_initialize_vertex());
Chris@16 152 return graph::bfs_visitor_event_not_overridden();
Chris@16 153 }
Chris@16 154
Chris@16 155 template <class Vertex, class Graph>
Chris@16 156 graph::bfs_visitor_event_not_overridden
Chris@16 157 discover_vertex(Vertex u, Graph& g)
Chris@16 158 {
Chris@16 159 invoke_visitors(m_vis, u, g, ::boost::on_discover_vertex());
Chris@16 160 return graph::bfs_visitor_event_not_overridden();
Chris@16 161 }
Chris@16 162
Chris@16 163 template <class Vertex, class Graph>
Chris@16 164 graph::bfs_visitor_event_not_overridden
Chris@16 165 examine_vertex(Vertex u, Graph& g)
Chris@16 166 {
Chris@16 167 invoke_visitors(m_vis, u, g, ::boost::on_examine_vertex());
Chris@16 168 return graph::bfs_visitor_event_not_overridden();
Chris@16 169 }
Chris@16 170
Chris@16 171 template <class Edge, class Graph>
Chris@16 172 graph::bfs_visitor_event_not_overridden
Chris@16 173 examine_edge(Edge e, Graph& g)
Chris@16 174 {
Chris@16 175 invoke_visitors(m_vis, e, g, ::boost::on_examine_edge());
Chris@16 176 return graph::bfs_visitor_event_not_overridden();
Chris@16 177 }
Chris@16 178
Chris@16 179 template <class Edge, class Graph>
Chris@16 180 graph::bfs_visitor_event_not_overridden
Chris@16 181 tree_edge(Edge e, Graph& g)
Chris@16 182 {
Chris@16 183 invoke_visitors(m_vis, e, g, ::boost::on_tree_edge());
Chris@16 184 return graph::bfs_visitor_event_not_overridden();
Chris@16 185 }
Chris@16 186
Chris@16 187 template <class Edge, class Graph>
Chris@16 188 graph::bfs_visitor_event_not_overridden
Chris@16 189 non_tree_edge(Edge e, Graph& g)
Chris@16 190 {
Chris@16 191 invoke_visitors(m_vis, e, g, ::boost::on_non_tree_edge());
Chris@16 192 return graph::bfs_visitor_event_not_overridden();
Chris@16 193 }
Chris@16 194
Chris@16 195 template <class Edge, class Graph>
Chris@16 196 graph::bfs_visitor_event_not_overridden
Chris@16 197 gray_target(Edge e, Graph& g)
Chris@16 198 {
Chris@16 199 invoke_visitors(m_vis, e, g, ::boost::on_gray_target());
Chris@16 200 return graph::bfs_visitor_event_not_overridden();
Chris@16 201 }
Chris@16 202
Chris@16 203 template <class Edge, class Graph>
Chris@16 204 graph::bfs_visitor_event_not_overridden
Chris@16 205 black_target(Edge e, Graph& g)
Chris@16 206 {
Chris@16 207 invoke_visitors(m_vis, e, g, ::boost::on_black_target());
Chris@16 208 return graph::bfs_visitor_event_not_overridden();
Chris@16 209 }
Chris@16 210
Chris@16 211 template <class Vertex, class Graph>
Chris@16 212 graph::bfs_visitor_event_not_overridden
Chris@16 213 finish_vertex(Vertex u, Graph& g)
Chris@16 214 {
Chris@16 215 invoke_visitors(m_vis, u, g, ::boost::on_finish_vertex());
Chris@16 216 return graph::bfs_visitor_event_not_overridden();
Chris@16 217 }
Chris@16 218
Chris@16 219 BOOST_GRAPH_EVENT_STUB(on_initialize_vertex,bfs)
Chris@16 220 BOOST_GRAPH_EVENT_STUB(on_discover_vertex,bfs)
Chris@16 221 BOOST_GRAPH_EVENT_STUB(on_examine_vertex,bfs)
Chris@16 222 BOOST_GRAPH_EVENT_STUB(on_examine_edge,bfs)
Chris@16 223 BOOST_GRAPH_EVENT_STUB(on_tree_edge,bfs)
Chris@16 224 BOOST_GRAPH_EVENT_STUB(on_non_tree_edge,bfs)
Chris@16 225 BOOST_GRAPH_EVENT_STUB(on_gray_target,bfs)
Chris@16 226 BOOST_GRAPH_EVENT_STUB(on_black_target,bfs)
Chris@16 227 BOOST_GRAPH_EVENT_STUB(on_finish_vertex,bfs)
Chris@16 228
Chris@16 229 protected:
Chris@16 230 Visitors m_vis;
Chris@16 231 };
Chris@16 232 template <class Visitors>
Chris@16 233 bfs_visitor<Visitors>
Chris@16 234 make_bfs_visitor(Visitors vis) {
Chris@16 235 return bfs_visitor<Visitors>(vis);
Chris@16 236 }
Chris@16 237 typedef bfs_visitor<> default_bfs_visitor;
Chris@16 238
Chris@16 239
Chris@16 240 namespace detail {
Chris@16 241
Chris@16 242 template <class VertexListGraph, class ColorMap, class BFSVisitor,
Chris@16 243 class P, class T, class R>
Chris@16 244 void bfs_helper
Chris@16 245 (VertexListGraph& g,
Chris@16 246 typename graph_traits<VertexListGraph>::vertex_descriptor s,
Chris@16 247 ColorMap color,
Chris@16 248 BFSVisitor vis,
Chris@16 249 const bgl_named_params<P, T, R>& params,
Chris@16 250 boost::mpl::false_)
Chris@16 251 {
Chris@16 252 typedef graph_traits<VertexListGraph> Traits;
Chris@16 253 // Buffer default
Chris@16 254 typedef typename Traits::vertex_descriptor Vertex;
Chris@16 255 typedef boost::queue<Vertex> queue_t;
Chris@16 256 queue_t Q;
Chris@16 257 breadth_first_search
Chris@16 258 (g, s,
Chris@16 259 choose_param(get_param(params, buffer_param_t()), boost::ref(Q)).get(),
Chris@16 260 vis, color);
Chris@16 261 }
Chris@16 262
Chris@16 263 #ifdef BOOST_GRAPH_USE_MPI
Chris@16 264 template <class DistributedGraph, class ColorMap, class BFSVisitor,
Chris@16 265 class P, class T, class R>
Chris@16 266 void bfs_helper
Chris@16 267 (DistributedGraph& g,
Chris@16 268 typename graph_traits<DistributedGraph>::vertex_descriptor s,
Chris@16 269 ColorMap color,
Chris@16 270 BFSVisitor vis,
Chris@16 271 const bgl_named_params<P, T, R>& params,
Chris@16 272 boost::mpl::true_);
Chris@16 273 #endif // BOOST_GRAPH_USE_MPI
Chris@16 274
Chris@16 275 //-------------------------------------------------------------------------
Chris@16 276 // Choose between default color and color parameters. Using
Chris@16 277 // function dispatching so that we don't require vertex index if
Chris@16 278 // the color default is not being used.
Chris@16 279
Chris@16 280 template <class ColorMap>
Chris@16 281 struct bfs_dispatch {
Chris@16 282 template <class VertexListGraph, class P, class T, class R>
Chris@16 283 static void apply
Chris@16 284 (VertexListGraph& g,
Chris@16 285 typename graph_traits<VertexListGraph>::vertex_descriptor s,
Chris@16 286 const bgl_named_params<P, T, R>& params,
Chris@16 287 ColorMap color)
Chris@16 288 {
Chris@16 289 bfs_helper
Chris@16 290 (g, s, color,
Chris@16 291 choose_param(get_param(params, graph_visitor),
Chris@16 292 make_bfs_visitor(null_visitor())),
Chris@16 293 params,
Chris@16 294 boost::mpl::bool_<
Chris@16 295 boost::is_base_and_derived<
Chris@16 296 distributed_graph_tag,
Chris@16 297 typename graph_traits<VertexListGraph>::traversal_category>::value>());
Chris@16 298 }
Chris@16 299 };
Chris@16 300
Chris@16 301 template <>
Chris@16 302 struct bfs_dispatch<param_not_found> {
Chris@16 303 template <class VertexListGraph, class P, class T, class R>
Chris@16 304 static void apply
Chris@16 305 (VertexListGraph& g,
Chris@16 306 typename graph_traits<VertexListGraph>::vertex_descriptor s,
Chris@16 307 const bgl_named_params<P, T, R>& params,
Chris@16 308 param_not_found)
Chris@16 309 {
Chris@16 310 null_visitor null_vis;
Chris@16 311
Chris@16 312 bfs_helper
Chris@16 313 (g, s,
Chris@16 314 make_two_bit_color_map
Chris@16 315 (num_vertices(g),
Chris@16 316 choose_const_pmap(get_param(params, vertex_index),
Chris@16 317 g, vertex_index)),
Chris@16 318 choose_param(get_param(params, graph_visitor),
Chris@16 319 make_bfs_visitor(null_vis)),
Chris@16 320 params,
Chris@16 321 boost::mpl::bool_<
Chris@16 322 boost::is_base_and_derived<
Chris@16 323 distributed_graph_tag,
Chris@16 324 typename graph_traits<VertexListGraph>::traversal_category>::value>());
Chris@16 325 }
Chris@16 326 };
Chris@16 327
Chris@16 328 } // namespace detail
Chris@16 329
Chris@16 330 #if 1
Chris@16 331 // Named Parameter Variant
Chris@16 332 template <class VertexListGraph, class P, class T, class R>
Chris@16 333 void breadth_first_search
Chris@16 334 (const VertexListGraph& g,
Chris@16 335 typename graph_traits<VertexListGraph>::vertex_descriptor s,
Chris@16 336 const bgl_named_params<P, T, R>& params)
Chris@16 337 {
Chris@16 338 // The graph is passed by *const* reference so that graph adaptors
Chris@16 339 // (temporaries) can be passed into this function. However, the
Chris@16 340 // graph is not really const since we may write to property maps
Chris@16 341 // of the graph.
Chris@16 342 VertexListGraph& ng = const_cast<VertexListGraph&>(g);
Chris@16 343 typedef typename get_param_type< vertex_color_t, bgl_named_params<P,T,R> >::type C;
Chris@16 344 detail::bfs_dispatch<C>::apply(ng, s, params,
Chris@16 345 get_param(params, vertex_color));
Chris@16 346 }
Chris@16 347 #endif
Chris@16 348
Chris@16 349
Chris@16 350 // This version does not initialize colors, user has to.
Chris@16 351
Chris@16 352 template <class IncidenceGraph, class P, class T, class R>
Chris@16 353 void breadth_first_visit
Chris@16 354 (const IncidenceGraph& g,
Chris@16 355 typename graph_traits<IncidenceGraph>::vertex_descriptor s,
Chris@16 356 const bgl_named_params<P, T, R>& params)
Chris@16 357 {
Chris@16 358 // The graph is passed by *const* reference so that graph adaptors
Chris@16 359 // (temporaries) can be passed into this function. However, the
Chris@16 360 // graph is not really const since we may write to property maps
Chris@16 361 // of the graph.
Chris@16 362 IncidenceGraph& ng = const_cast<IncidenceGraph&>(g);
Chris@16 363
Chris@16 364 typedef graph_traits<IncidenceGraph> Traits;
Chris@16 365 // Buffer default
Chris@16 366 typedef typename Traits::vertex_descriptor vertex_descriptor;
Chris@16 367 typedef boost::queue<vertex_descriptor> queue_t;
Chris@16 368 queue_t Q;
Chris@16 369
Chris@16 370 breadth_first_visit
Chris@16 371 (ng, s,
Chris@16 372 choose_param(get_param(params, buffer_param_t()), boost::ref(Q)).get(),
Chris@16 373 choose_param(get_param(params, graph_visitor),
Chris@16 374 make_bfs_visitor(null_visitor())),
Chris@16 375 choose_pmap(get_param(params, vertex_color), ng, vertex_color)
Chris@16 376 );
Chris@16 377 }
Chris@16 378
Chris@16 379 namespace graph {
Chris@16 380 namespace detail {
Chris@16 381 template <typename Graph, typename Source>
Chris@16 382 struct breadth_first_search_impl {
Chris@16 383 typedef void result_type;
Chris@16 384 template <typename ArgPack>
Chris@16 385 void operator()(const Graph& g, const Source& source, const ArgPack& arg_pack) {
Chris@16 386 using namespace boost::graph::keywords;
Chris@16 387 typename boost::graph_traits<Graph>::vertex_descriptor sources[1] = {source};
Chris@16 388 boost::queue<typename boost::graph_traits<Graph>::vertex_descriptor> Q;
Chris@16 389 boost::breadth_first_search(g,
Chris@16 390 &sources[0],
Chris@16 391 &sources[1],
Chris@16 392 boost::unwrap_ref(arg_pack[_buffer | boost::ref(Q)]),
Chris@16 393 arg_pack[_visitor | make_bfs_visitor(null_visitor())],
Chris@16 394 boost::detail::make_color_map_from_arg_pack(g, arg_pack));
Chris@16 395 }
Chris@16 396 };
Chris@16 397 }
Chris@16 398 BOOST_GRAPH_MAKE_FORWARDING_FUNCTION(breadth_first_search, 2, 4)
Chris@16 399 }
Chris@16 400
Chris@16 401 #if 0
Chris@16 402 // Named Parameter Variant
Chris@16 403 BOOST_GRAPH_MAKE_OLD_STYLE_PARAMETER_FUNCTION(breadth_first_search, 2)
Chris@16 404 #endif
Chris@16 405
Chris@16 406 } // namespace boost
Chris@16 407
Chris@16 408 #ifdef BOOST_GRAPH_USE_MPI
Chris@16 409 # include <boost/graph/distributed/breadth_first_search.hpp>
Chris@16 410 #endif
Chris@16 411
Chris@16 412 #endif // BOOST_GRAPH_BREADTH_FIRST_SEARCH_HPP
Chris@16 413