You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
		
		
		
		
		
			
		
			
				
					
					
						
							205 lines
						
					
					
						
							8.6 KiB
						
					
					
				
			
		
		
	
	
							205 lines
						
					
					
						
							8.6 KiB
						
					
					
				| // Copyright (C) 2004-2006 The Trustees of Indiana University. | |
|  | |
| // Use, modification and distribution is subject to the Boost Software | |
| // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at | |
| // http://www.boost.org/LICENSE_1_0.txt) | |
|  | |
| //  Authors: Douglas Gregor | |
| //           Andrew Lumsdaine | |
| #ifndef BOOST_GRAPH_PARALLEL_DIJKSTRA_HPP | |
| #define BOOST_GRAPH_PARALLEL_DIJKSTRA_HPP | |
|  | |
| #ifndef BOOST_GRAPH_USE_MPI | |
| #error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included" | |
| #endif | |
|  | |
| #include <boost/graph/dijkstra_shortest_paths.hpp> | |
| #include <boost/graph/overloading.hpp> | |
| #include <boost/graph/distributed/concepts.hpp> | |
| #include <boost/graph/parallel/properties.hpp> | |
| #include <boost/graph/distributed/crauser_et_al_shortest_paths.hpp> | |
| #include <boost/graph/distributed/eager_dijkstra_shortest_paths.hpp> | |
|  | |
| namespace boost { | |
| 
 | |
|   namespace graph { namespace detail { | |
| 
 | |
|      | |
|     template<typename Lookahead> | |
|     struct parallel_dijkstra_impl2 | |
|     { | |
|       template<typename DistributedGraph, typename DijkstraVisitor, | |
|                typename PredecessorMap, typename DistanceMap,  | |
|                typename WeightMap, typename IndexMap, typename ColorMap,  | |
|                typename Compare, typename Combine, typename DistInf,  | |
|                typename DistZero> | |
|       static void  | |
|       run(const DistributedGraph& g, | |
|           typename graph_traits<DistributedGraph>::vertex_descriptor s, | |
|           PredecessorMap predecessor, DistanceMap distance,  | |
|           typename property_traits<DistanceMap>::value_type lookahead, | |
|           WeightMap weight, IndexMap index_map, ColorMap color_map, | |
|           Compare compare, Combine combine, DistInf inf, DistZero zero, | |
|           DijkstraVisitor vis) | |
|       { | |
|         eager_dijkstra_shortest_paths(g, s, predecessor, distance, lookahead, | |
|                                       weight, index_map, color_map, compare, | |
|                                       combine, inf, zero, vis); | |
|       } | |
|     }; | |
| 
 | |
|     template<> | |
|     struct parallel_dijkstra_impl2< ::boost::detail::error_property_not_found > | |
|     { | |
|       template<typename DistributedGraph, typename DijkstraVisitor, | |
|                typename PredecessorMap, typename DistanceMap,  | |
|                typename WeightMap, typename IndexMap, typename ColorMap,  | |
|                typename Compare, typename Combine, typename DistInf,  | |
|                typename DistZero> | |
|       static void  | |
|       run(const DistributedGraph& g, | |
|           typename graph_traits<DistributedGraph>::vertex_descriptor s, | |
|           PredecessorMap predecessor, DistanceMap distance,  | |
|           ::boost::detail::error_property_not_found, | |
|           WeightMap weight, IndexMap index_map, ColorMap color_map, | |
|           Compare compare, Combine combine, DistInf inf, DistZero zero, | |
|           DijkstraVisitor vis) | |
|       { | |
|         crauser_et_al_shortest_paths(g, s, predecessor, distance, weight, | |
|                                      index_map, color_map, compare, combine, | |
|                                      inf, zero, vis); | |
|       } | |
|     }; | |
| 
 | |
|     template<typename ColorMap> | |
|     struct parallel_dijkstra_impl | |
|     { | |
|       template<typename DistributedGraph, typename DijkstraVisitor, | |
|                typename PredecessorMap, typename DistanceMap,  | |
|                typename Lookahead, typename WeightMap, typename IndexMap, | |
|                typename Compare, typename Combine,  | |
|                typename DistInf, typename DistZero> | |
|       static void  | |
|       run(const DistributedGraph& g, | |
|           typename graph_traits<DistributedGraph>::vertex_descriptor s, | |
|           PredecessorMap predecessor, DistanceMap distance,  | |
|           Lookahead lookahead, | |
|           WeightMap weight, IndexMap index_map, ColorMap color_map, | |
|           Compare compare, Combine combine, DistInf inf, DistZero zero, | |
|           DijkstraVisitor vis) | |
|       { | |
|         graph::detail::parallel_dijkstra_impl2<Lookahead> | |
|           ::run(g, s, predecessor, distance, lookahead, weight, index_map, | |
|                 color_map, compare, combine, inf, zero, vis); | |
|       } | |
|     }; | |
|      | |
|     template<> | |
|     struct parallel_dijkstra_impl< ::boost::detail::error_property_not_found > | |
|     { | |
|     private: | |
|       template<typename DistributedGraph, typename DijkstraVisitor, | |
|                typename PredecessorMap, typename DistanceMap,  | |
|                typename Lookahead, typename WeightMap, typename IndexMap, | |
|                typename ColorMap, typename Compare, typename Combine,  | |
|                typename DistInf, typename DistZero> | |
|       static void  | |
|       run_impl(const DistributedGraph& g, | |
|                typename graph_traits<DistributedGraph>::vertex_descriptor s, | |
|                PredecessorMap predecessor, DistanceMap distance,  | |
|                Lookahead lookahead, WeightMap weight, IndexMap index_map,  | |
|                ColorMap color_map, Compare compare, Combine combine,  | |
|                DistInf inf, DistZero zero, DijkstraVisitor vis) | |
|       { | |
|         BGL_FORALL_VERTICES_T(u, g, DistributedGraph) | |
|           BGL_FORALL_OUTEDGES_T(u, e, g, DistributedGraph) | |
|             local_put(color_map, target(e, g), white_color); | |
| 
 | |
|         graph::detail::parallel_dijkstra_impl2<Lookahead> | |
|           ::run(g, s, predecessor, distance, lookahead, weight, index_map, | |
|                 color_map, compare, combine, inf, zero, vis); | |
|       } | |
| 
 | |
|     public: | |
|       template<typename DistributedGraph, typename DijkstraVisitor, | |
|                typename PredecessorMap, typename DistanceMap,  | |
|                typename Lookahead, typename WeightMap, typename IndexMap, | |
|                typename Compare, typename Combine,  | |
|                typename DistInf, typename DistZero> | |
|       static void  | |
|       run(const DistributedGraph& g, | |
|           typename graph_traits<DistributedGraph>::vertex_descriptor s, | |
|           PredecessorMap predecessor, DistanceMap distance,  | |
|           Lookahead lookahead, WeightMap weight, IndexMap index_map,  | |
|           ::boost::detail::error_property_not_found, | |
|           Compare compare, Combine combine, DistInf inf, DistZero zero, | |
|           DijkstraVisitor vis) | |
|       { | |
|         typedef typename graph_traits<DistributedGraph>::vertices_size_type | |
|           vertices_size_type; | |
| 
 | |
|         vertices_size_type n = num_vertices(g); | |
|         std::vector<default_color_type> colors(n, white_color); | |
| 
 | |
|         run_impl(g, s, predecessor, distance, lookahead, weight, index_map, | |
|                  make_iterator_property_map(colors.begin(), index_map), | |
|                  compare, combine, inf, zero, vis); | |
|       } | |
|     }; | |
|   } } // end namespace graph::detail | |
|  | |
| 
 | |
|   /** Dijkstra's single-source shortest paths algorithm for distributed | |
|    * graphs. | |
|    * | |
|    * Also implements the heuristics of: | |
|    * | |
|    *   Andreas Crauser, Kurt Mehlhorn, Ulrich Meyer, and Peter | |
|    *   Sanders. A Parallelization of Dijkstra's Shortest Path | |
|    *   Algorithm. In Lubos Brim, Jozef Gruska, and Jiri Zlatuska, | |
|    *   editors, Mathematical Foundations of Computer Science (MFCS), | |
|    *   volume 1450 of Lecture Notes in Computer Science, pages | |
|    *   722--731, 1998. Springer. | |
|    */ | |
|   template<typename DistributedGraph, typename DijkstraVisitor, | |
|            typename PredecessorMap, typename DistanceMap, | |
|            typename WeightMap, typename IndexMap, typename Compare, | |
|            typename Combine, typename DistInf, typename DistZero, | |
|            typename T, typename Tag, typename Base> | |
|   inline | |
|   void | |
|   dijkstra_shortest_paths | |
|     (const DistributedGraph& g, | |
|      typename graph_traits<DistributedGraph>::vertex_descriptor s, | |
|      PredecessorMap predecessor, DistanceMap distance, WeightMap weight, | |
|      IndexMap index_map, | |
|      Compare compare, Combine combine, DistInf inf, DistZero zero, | |
|      DijkstraVisitor vis, | |
|      const bgl_named_params<T, Tag, Base>& params | |
|      BOOST_GRAPH_ENABLE_IF_MODELS_PARM(DistributedGraph,distributed_graph_tag)) | |
|   { | |
|     typedef typename graph_traits<DistributedGraph>::vertices_size_type | |
|       vertices_size_type; | |
| 
 | |
|     // Build a distributed property map for vertex colors, if we need it | |
|     bool use_default_color_map  | |
|       = is_default_param(get_param(params, vertex_color)); | |
|     vertices_size_type n = use_default_color_map? num_vertices(g) : 1; | |
|     std::vector<default_color_type> color(n, white_color); | |
|     typedef iterator_property_map<std::vector<default_color_type>::iterator, | |
|                                   IndexMap> DefColorMap; | |
|     DefColorMap color_map(color.begin(), index_map); | |
| 
 | |
|     typedef typename property_value< bgl_named_params<T, Tag, Base>, | |
|       vertex_color_t>::type color_map_type; | |
| 
 | |
|     graph::detail::parallel_dijkstra_impl<color_map_type> | |
|       ::run(g, s, predecessor, distance,  | |
|             get_param(params, lookahead_t()), | |
|             weight, index_map, | |
|             get_param(params, vertex_color), | |
|             compare, combine, inf, zero, vis); | |
|   } | |
| } // end namespace boost | |
|  | |
| #endif // BOOST_GRAPH_PARALLEL_DIJKSTRA_HPP
 | |
| 
 |