Chris@16
|
1 // Copyright (C) 2004-2006 The Trustees of Indiana University.
|
Chris@16
|
2
|
Chris@16
|
3 // Use, modification and distribution is subject to the Boost Software
|
Chris@16
|
4 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
5 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
6
|
Chris@16
|
7 // Authors: Douglas Gregor
|
Chris@16
|
8 // Andrew Lumsdaine
|
Chris@16
|
9 #ifndef BOOST_GRAPH_PARALLEL_DIJKSTRA_HPP
|
Chris@16
|
10 #define BOOST_GRAPH_PARALLEL_DIJKSTRA_HPP
|
Chris@16
|
11
|
Chris@16
|
12 #ifndef BOOST_GRAPH_USE_MPI
|
Chris@16
|
13 #error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
|
Chris@16
|
14 #endif
|
Chris@16
|
15
|
Chris@16
|
16 #include <boost/graph/dijkstra_shortest_paths.hpp>
|
Chris@16
|
17 #include <boost/graph/overloading.hpp>
|
Chris@16
|
18 #include <boost/graph/distributed/concepts.hpp>
|
Chris@16
|
19 #include <boost/graph/parallel/properties.hpp>
|
Chris@16
|
20 #include <boost/graph/distributed/crauser_et_al_shortest_paths.hpp>
|
Chris@16
|
21 #include <boost/graph/distributed/eager_dijkstra_shortest_paths.hpp>
|
Chris@16
|
22
|
Chris@16
|
23 namespace boost {
|
Chris@16
|
24
|
Chris@16
|
25 namespace graph { namespace detail {
|
Chris@16
|
26
|
Chris@16
|
27
|
Chris@16
|
28 template<typename Lookahead>
|
Chris@16
|
29 struct parallel_dijkstra_impl2
|
Chris@16
|
30 {
|
Chris@16
|
31 template<typename DistributedGraph, typename DijkstraVisitor,
|
Chris@16
|
32 typename PredecessorMap, typename DistanceMap,
|
Chris@16
|
33 typename WeightMap, typename IndexMap, typename ColorMap,
|
Chris@16
|
34 typename Compare, typename Combine, typename DistInf,
|
Chris@16
|
35 typename DistZero>
|
Chris@16
|
36 static void
|
Chris@16
|
37 run(const DistributedGraph& g,
|
Chris@16
|
38 typename graph_traits<DistributedGraph>::vertex_descriptor s,
|
Chris@16
|
39 PredecessorMap predecessor, DistanceMap distance,
|
Chris@16
|
40 typename property_traits<DistanceMap>::value_type lookahead,
|
Chris@16
|
41 WeightMap weight, IndexMap index_map, ColorMap color_map,
|
Chris@16
|
42 Compare compare, Combine combine, DistInf inf, DistZero zero,
|
Chris@16
|
43 DijkstraVisitor vis)
|
Chris@16
|
44 {
|
Chris@16
|
45 eager_dijkstra_shortest_paths(g, s, predecessor, distance, lookahead,
|
Chris@16
|
46 weight, index_map, color_map, compare,
|
Chris@16
|
47 combine, inf, zero, vis);
|
Chris@16
|
48 }
|
Chris@16
|
49 };
|
Chris@16
|
50
|
Chris@16
|
51 template<>
|
Chris@16
|
52 struct parallel_dijkstra_impl2< ::boost::param_not_found >
|
Chris@16
|
53 {
|
Chris@16
|
54 template<typename DistributedGraph, typename DijkstraVisitor,
|
Chris@16
|
55 typename PredecessorMap, typename DistanceMap,
|
Chris@16
|
56 typename WeightMap, typename IndexMap, typename ColorMap,
|
Chris@16
|
57 typename Compare, typename Combine, typename DistInf,
|
Chris@16
|
58 typename DistZero>
|
Chris@16
|
59 static void
|
Chris@16
|
60 run(const DistributedGraph& g,
|
Chris@16
|
61 typename graph_traits<DistributedGraph>::vertex_descriptor s,
|
Chris@16
|
62 PredecessorMap predecessor, DistanceMap distance,
|
Chris@16
|
63 ::boost::param_not_found,
|
Chris@16
|
64 WeightMap weight, IndexMap index_map, ColorMap color_map,
|
Chris@16
|
65 Compare compare, Combine combine, DistInf inf, DistZero zero,
|
Chris@16
|
66 DijkstraVisitor vis)
|
Chris@16
|
67 {
|
Chris@16
|
68 crauser_et_al_shortest_paths(g, s, predecessor, distance, weight,
|
Chris@16
|
69 index_map, color_map, compare, combine,
|
Chris@16
|
70 inf, zero, vis);
|
Chris@16
|
71 }
|
Chris@16
|
72 };
|
Chris@16
|
73
|
Chris@16
|
74 template<typename ColorMap>
|
Chris@16
|
75 struct parallel_dijkstra_impl
|
Chris@16
|
76 {
|
Chris@16
|
77 template<typename DistributedGraph, typename DijkstraVisitor,
|
Chris@16
|
78 typename PredecessorMap, typename DistanceMap,
|
Chris@16
|
79 typename Lookahead, typename WeightMap, typename IndexMap,
|
Chris@16
|
80 typename Compare, typename Combine,
|
Chris@16
|
81 typename DistInf, typename DistZero>
|
Chris@16
|
82 static void
|
Chris@16
|
83 run(const DistributedGraph& g,
|
Chris@16
|
84 typename graph_traits<DistributedGraph>::vertex_descriptor s,
|
Chris@16
|
85 PredecessorMap predecessor, DistanceMap distance,
|
Chris@16
|
86 Lookahead lookahead,
|
Chris@16
|
87 WeightMap weight, IndexMap index_map, ColorMap color_map,
|
Chris@16
|
88 Compare compare, Combine combine, DistInf inf, DistZero zero,
|
Chris@16
|
89 DijkstraVisitor vis)
|
Chris@16
|
90 {
|
Chris@16
|
91 graph::detail::parallel_dijkstra_impl2<Lookahead>
|
Chris@16
|
92 ::run(g, s, predecessor, distance, lookahead, weight, index_map,
|
Chris@16
|
93 color_map, compare, combine, inf, zero, vis);
|
Chris@16
|
94 }
|
Chris@16
|
95 };
|
Chris@16
|
96
|
Chris@16
|
97 template<>
|
Chris@16
|
98 struct parallel_dijkstra_impl< ::boost::param_not_found >
|
Chris@16
|
99 {
|
Chris@16
|
100 private:
|
Chris@16
|
101 template<typename DistributedGraph, typename DijkstraVisitor,
|
Chris@16
|
102 typename PredecessorMap, typename DistanceMap,
|
Chris@16
|
103 typename Lookahead, typename WeightMap, typename IndexMap,
|
Chris@16
|
104 typename ColorMap, typename Compare, typename Combine,
|
Chris@16
|
105 typename DistInf, typename DistZero>
|
Chris@16
|
106 static void
|
Chris@16
|
107 run_impl(const DistributedGraph& g,
|
Chris@16
|
108 typename graph_traits<DistributedGraph>::vertex_descriptor s,
|
Chris@16
|
109 PredecessorMap predecessor, DistanceMap distance,
|
Chris@16
|
110 Lookahead lookahead, WeightMap weight, IndexMap index_map,
|
Chris@16
|
111 ColorMap color_map, Compare compare, Combine combine,
|
Chris@16
|
112 DistInf inf, DistZero zero, DijkstraVisitor vis)
|
Chris@16
|
113 {
|
Chris@16
|
114 BGL_FORALL_VERTICES_T(u, g, DistributedGraph)
|
Chris@16
|
115 BGL_FORALL_OUTEDGES_T(u, e, g, DistributedGraph)
|
Chris@16
|
116 local_put(color_map, target(e, g), white_color);
|
Chris@16
|
117
|
Chris@16
|
118 graph::detail::parallel_dijkstra_impl2<Lookahead>
|
Chris@16
|
119 ::run(g, s, predecessor, distance, lookahead, weight, index_map,
|
Chris@16
|
120 color_map, compare, combine, inf, zero, vis);
|
Chris@16
|
121 }
|
Chris@16
|
122
|
Chris@16
|
123 public:
|
Chris@16
|
124 template<typename DistributedGraph, typename DijkstraVisitor,
|
Chris@16
|
125 typename PredecessorMap, typename DistanceMap,
|
Chris@16
|
126 typename Lookahead, typename WeightMap, typename IndexMap,
|
Chris@16
|
127 typename Compare, typename Combine,
|
Chris@16
|
128 typename DistInf, typename DistZero>
|
Chris@16
|
129 static void
|
Chris@16
|
130 run(const DistributedGraph& g,
|
Chris@16
|
131 typename graph_traits<DistributedGraph>::vertex_descriptor s,
|
Chris@16
|
132 PredecessorMap predecessor, DistanceMap distance,
|
Chris@16
|
133 Lookahead lookahead, WeightMap weight, IndexMap index_map,
|
Chris@16
|
134 ::boost::param_not_found,
|
Chris@16
|
135 Compare compare, Combine combine, DistInf inf, DistZero zero,
|
Chris@16
|
136 DijkstraVisitor vis)
|
Chris@16
|
137 {
|
Chris@16
|
138 typedef typename graph_traits<DistributedGraph>::vertices_size_type
|
Chris@16
|
139 vertices_size_type;
|
Chris@16
|
140
|
Chris@16
|
141 vertices_size_type n = num_vertices(g);
|
Chris@16
|
142 std::vector<default_color_type> colors(n, white_color);
|
Chris@16
|
143
|
Chris@16
|
144 run_impl(g, s, predecessor, distance, lookahead, weight, index_map,
|
Chris@16
|
145 make_iterator_property_map(colors.begin(), index_map),
|
Chris@16
|
146 compare, combine, inf, zero, vis);
|
Chris@16
|
147 }
|
Chris@16
|
148 };
|
Chris@16
|
149 } } // end namespace graph::detail
|
Chris@16
|
150
|
Chris@16
|
151
|
Chris@16
|
152 /** Dijkstra's single-source shortest paths algorithm for distributed
|
Chris@16
|
153 * graphs.
|
Chris@16
|
154 *
|
Chris@16
|
155 * Also implements the heuristics of:
|
Chris@16
|
156 *
|
Chris@16
|
157 * Andreas Crauser, Kurt Mehlhorn, Ulrich Meyer, and Peter
|
Chris@16
|
158 * Sanders. A Parallelization of Dijkstra's Shortest Path
|
Chris@16
|
159 * Algorithm. In Lubos Brim, Jozef Gruska, and Jiri Zlatuska,
|
Chris@16
|
160 * editors, Mathematical Foundations of Computer Science (MFCS),
|
Chris@16
|
161 * volume 1450 of Lecture Notes in Computer Science, pages
|
Chris@16
|
162 * 722--731, 1998. Springer.
|
Chris@16
|
163 */
|
Chris@16
|
164 template<typename DistributedGraph, typename DijkstraVisitor,
|
Chris@16
|
165 typename PredecessorMap, typename DistanceMap,
|
Chris@16
|
166 typename WeightMap, typename IndexMap, typename Compare,
|
Chris@16
|
167 typename Combine, typename DistInf, typename DistZero,
|
Chris@16
|
168 typename T, typename Tag, typename Base>
|
Chris@16
|
169 inline
|
Chris@16
|
170 void
|
Chris@16
|
171 dijkstra_shortest_paths
|
Chris@16
|
172 (const DistributedGraph& g,
|
Chris@16
|
173 typename graph_traits<DistributedGraph>::vertex_descriptor s,
|
Chris@16
|
174 PredecessorMap predecessor, DistanceMap distance, WeightMap weight,
|
Chris@16
|
175 IndexMap index_map,
|
Chris@16
|
176 Compare compare, Combine combine, DistInf inf, DistZero zero,
|
Chris@16
|
177 DijkstraVisitor vis,
|
Chris@16
|
178 const bgl_named_params<T, Tag, Base>& params
|
Chris@16
|
179 BOOST_GRAPH_ENABLE_IF_MODELS_PARM(DistributedGraph,distributed_graph_tag))
|
Chris@16
|
180 {
|
Chris@16
|
181 typedef typename graph_traits<DistributedGraph>::vertices_size_type
|
Chris@16
|
182 vertices_size_type;
|
Chris@16
|
183
|
Chris@16
|
184 // Build a distributed property map for vertex colors, if we need it
|
Chris@16
|
185 bool use_default_color_map
|
Chris@16
|
186 = is_default_param(get_param(params, vertex_color));
|
Chris@16
|
187 vertices_size_type n = use_default_color_map? num_vertices(g) : 1;
|
Chris@16
|
188 std::vector<default_color_type> color(n, white_color);
|
Chris@16
|
189 typedef iterator_property_map<std::vector<default_color_type>::iterator,
|
Chris@16
|
190 IndexMap> DefColorMap;
|
Chris@16
|
191 DefColorMap color_map(color.begin(), index_map);
|
Chris@16
|
192
|
Chris@16
|
193 typedef typename get_param_type< vertex_color_t, bgl_named_params<T, Tag, Base> >::type color_map_type;
|
Chris@16
|
194
|
Chris@16
|
195 graph::detail::parallel_dijkstra_impl<color_map_type>
|
Chris@16
|
196 ::run(g, s, predecessor, distance,
|
Chris@16
|
197 get_param(params, lookahead_t()),
|
Chris@16
|
198 weight, index_map,
|
Chris@16
|
199 get_param(params, vertex_color),
|
Chris@16
|
200 compare, combine, inf, zero, vis);
|
Chris@16
|
201 }
|
Chris@16
|
202 } // end namespace boost
|
Chris@16
|
203
|
Chris@16
|
204 #endif // BOOST_GRAPH_PARALLEL_DIJKSTRA_HPP
|