]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/graph/astar_search.hpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / boost / graph / astar_search.hpp
CommitLineData
7c673cae
FG
1
2
3//
4//=======================================================================
5// Copyright (c) 2004 Kristopher Beevers
6//
7// Distributed under the Boost Software License, Version 1.0. (See
8// accompanying file LICENSE_1_0.txt or copy at
9// http://www.boost.org/LICENSE_1_0.txt)
10//=======================================================================
11//
12
13#ifndef BOOST_GRAPH_ASTAR_SEARCH_HPP
14#define BOOST_GRAPH_ASTAR_SEARCH_HPP
15
16
17#include <functional>
18#include <vector>
19#include <boost/limits.hpp>
20#include <boost/throw_exception.hpp>
21#include <boost/graph/named_function_params.hpp>
22#include <boost/graph/relax.hpp>
23#include <boost/graph/exception.hpp>
24#include <boost/graph/breadth_first_search.hpp>
25#include <boost/graph/iteration_macros.hpp>
26#include <boost/graph/detail/d_ary_heap.hpp>
27#include <boost/graph/property_maps/constant_property_map.hpp>
28#include <boost/property_map/property_map.hpp>
29#include <boost/property_map/vector_property_map.hpp>
30#include <boost/property_map/function_property_map.hpp>
31#include <boost/concept/assert.hpp>
32
33namespace boost {
34
35
36 template <class Heuristic, class Graph>
37 struct AStarHeuristicConcept {
38 void constraints()
39 {
40 BOOST_CONCEPT_ASSERT(( CopyConstructibleConcept<Heuristic> ));
41 h(u);
42 }
43 Heuristic h;
44 typename graph_traits<Graph>::vertex_descriptor u;
45 };
46
47
48 template <class Graph, class CostType>
92f5a8d4 49 class astar_heuristic
7c673cae
FG
50 {
51 public:
52 typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
92f5a8d4
TL
53 typedef Vertex argument_type;
54 typedef CostType result_type;
7c673cae
FG
55 astar_heuristic() {}
56 CostType operator()(Vertex u) { return static_cast<CostType>(0); }
57 };
58
59
60
61 template <class Visitor, class Graph>
62 struct AStarVisitorConcept {
63 void constraints()
64 {
65 BOOST_CONCEPT_ASSERT(( CopyConstructibleConcept<Visitor> ));
66 vis.initialize_vertex(u, g);
67 vis.discover_vertex(u, g);
68 vis.examine_vertex(u, g);
69 vis.examine_edge(e, g);
70 vis.edge_relaxed(e, g);
71 vis.edge_not_relaxed(e, g);
72 vis.black_target(e, g);
73 vis.finish_vertex(u, g);
74 }
75 Visitor vis;
76 Graph g;
77 typename graph_traits<Graph>::vertex_descriptor u;
78 typename graph_traits<Graph>::edge_descriptor e;
79 };
80
81
82 template <class Visitors = null_visitor>
83 class astar_visitor : public bfs_visitor<Visitors> {
84 public:
85 astar_visitor() {}
86 astar_visitor(Visitors vis)
87 : bfs_visitor<Visitors>(vis) {}
88
89 template <class Edge, class Graph>
90 void edge_relaxed(Edge e, const Graph& g) {
91 invoke_visitors(this->m_vis, e, g, on_edge_relaxed());
92 }
93 template <class Edge, class Graph>
94 void edge_not_relaxed(Edge e, const Graph& g) {
95 invoke_visitors(this->m_vis, e, g, on_edge_not_relaxed());
96 }
97 private:
98 template <class Edge, class Graph>
99 void tree_edge(Edge e, const Graph& g) {}
100 template <class Edge, class Graph>
101 void non_tree_edge(Edge e, const Graph& g) {}
102 };
103 template <class Visitors>
104 astar_visitor<Visitors>
105 make_astar_visitor(Visitors vis) {
106 return astar_visitor<Visitors>(vis);
107 }
108 typedef astar_visitor<> default_astar_visitor;
109
110
111 namespace detail {
112
113 template <class AStarHeuristic, class UniformCostVisitor,
114 class UpdatableQueue, class PredecessorMap,
115 class CostMap, class DistanceMap, class WeightMap,
116 class ColorMap, class BinaryFunction,
117 class BinaryPredicate>
118 struct astar_bfs_visitor
119 {
120
121 typedef typename property_traits<CostMap>::value_type C;
122 typedef typename property_traits<ColorMap>::value_type ColorValue;
123 typedef color_traits<ColorValue> Color;
124 typedef typename property_traits<DistanceMap>::value_type distance_type;
125
126 astar_bfs_visitor(AStarHeuristic h, UniformCostVisitor vis,
127 UpdatableQueue& Q, PredecessorMap p,
128 CostMap c, DistanceMap d, WeightMap w,
129 ColorMap col, BinaryFunction combine,
130 BinaryPredicate compare, C zero)
131 : m_h(h), m_vis(vis), m_Q(Q), m_predecessor(p), m_cost(c),
132 m_distance(d), m_weight(w), m_color(col),
133 m_combine(combine), m_compare(compare), m_zero(zero) {}
134
135
136 template <class Vertex, class Graph>
137 void initialize_vertex(Vertex u, const Graph& g) {
138 m_vis.initialize_vertex(u, g);
139 }
140 template <class Vertex, class Graph>
141 void discover_vertex(Vertex u, const Graph& g) {
142 m_vis.discover_vertex(u, g);
143 }
144 template <class Vertex, class Graph>
145 void examine_vertex(Vertex u, const Graph& g) {
146 m_vis.examine_vertex(u, g);
147 }
148 template <class Vertex, class Graph>
149 void finish_vertex(Vertex u, const Graph& g) {
150 m_vis.finish_vertex(u, g);
151 }
152 template <class Edge, class Graph>
153 void examine_edge(Edge e, const Graph& g) {
154 if (m_compare(get(m_weight, e), m_zero))
155 BOOST_THROW_EXCEPTION(negative_edge());
156 m_vis.examine_edge(e, g);
157 }
158 template <class Edge, class Graph>
159 void non_tree_edge(Edge, const Graph&) {}
160
161
162
163 template <class Edge, class Graph>
164 void tree_edge(Edge e, const Graph& g) {
165 using boost::get;
166 bool m_decreased =
167 relax(e, g, m_weight, m_predecessor, m_distance,
168 m_combine, m_compare);
169
170 if(m_decreased) {
171 m_vis.edge_relaxed(e, g);
172 put(m_cost, target(e, g),
173 m_combine(get(m_distance, target(e, g)),
174 m_h(target(e, g))));
175 } else
176 m_vis.edge_not_relaxed(e, g);
177 }
178
179
180 template <class Edge, class Graph>
181 void gray_target(Edge e, const Graph& g) {
182 using boost::get;
183 bool m_decreased =
184 relax(e, g, m_weight, m_predecessor, m_distance,
185 m_combine, m_compare);
186
187 if(m_decreased) {
188 put(m_cost, target(e, g),
189 m_combine(get(m_distance, target(e, g)),
190 m_h(target(e, g))));
191 m_Q.update(target(e, g));
192 m_vis.edge_relaxed(e, g);
193 } else
194 m_vis.edge_not_relaxed(e, g);
195 }
196
197
198 template <class Edge, class Graph>
199 void black_target(Edge e, const Graph& g) {
200 using boost::get;
201 bool m_decreased =
202 relax(e, g, m_weight, m_predecessor, m_distance,
203 m_combine, m_compare);
204
205 if(m_decreased) {
206 m_vis.edge_relaxed(e, g);
207 put(m_cost, target(e, g),
208 m_combine(get(m_distance, target(e, g)),
209 m_h(target(e, g))));
210 m_Q.push(target(e, g));
211 put(m_color, target(e, g), Color::gray());
212 m_vis.black_target(e, g);
213 } else
214 m_vis.edge_not_relaxed(e, g);
215 }
216
217
218
219 AStarHeuristic m_h;
220 UniformCostVisitor m_vis;
221 UpdatableQueue& m_Q;
222 PredecessorMap m_predecessor;
223 CostMap m_cost;
224 DistanceMap m_distance;
225 WeightMap m_weight;
226 ColorMap m_color;
227 BinaryFunction m_combine;
228 BinaryPredicate m_compare;
229 C m_zero;
230
231 };
232
233 } // namespace detail
234
235
236
237 template <typename VertexListGraph, typename AStarHeuristic,
238 typename AStarVisitor, typename PredecessorMap,
239 typename CostMap, typename DistanceMap,
240 typename WeightMap, typename ColorMap,
241 typename VertexIndexMap,
242 typename CompareFunction, typename CombineFunction,
243 typename CostInf, typename CostZero>
244 inline void
245 astar_search_no_init
246 (const VertexListGraph &g,
247 typename graph_traits<VertexListGraph>::vertex_descriptor s,
248 AStarHeuristic h, AStarVisitor vis,
249 PredecessorMap predecessor, CostMap cost,
250 DistanceMap distance, WeightMap weight,
251 ColorMap color, VertexIndexMap index_map,
252 CompareFunction compare, CombineFunction combine,
253 CostInf /*inf*/, CostZero zero)
254 {
255 typedef typename graph_traits<VertexListGraph>::vertex_descriptor
256 Vertex;
257 typedef boost::vector_property_map<std::size_t, VertexIndexMap> IndexInHeapMap;
258 IndexInHeapMap index_in_heap(index_map);
259 typedef d_ary_heap_indirect<Vertex, 4, IndexInHeapMap, CostMap, CompareFunction>
260 MutableQueue;
261 MutableQueue Q(cost, index_in_heap, compare);
262
263 detail::astar_bfs_visitor<AStarHeuristic, AStarVisitor,
264 MutableQueue, PredecessorMap, CostMap, DistanceMap,
265 WeightMap, ColorMap, CombineFunction, CompareFunction>
266 bfs_vis(h, vis, Q, predecessor, cost, distance, weight,
267 color, combine, compare, zero);
268
269 breadth_first_visit(g, s, Q, bfs_vis, color);
270 }
271
272 namespace graph_detail {
273 template <typename A, typename B>
274 struct select1st {
275 typedef std::pair<A, B> argument_type;
276 typedef A result_type;
277 A operator()(const std::pair<A, B>& p) const {return p.first;}
278 };
279 }
280
281 template <typename VertexListGraph, typename AStarHeuristic,
282 typename AStarVisitor, typename PredecessorMap,
283 typename CostMap, typename DistanceMap,
284 typename WeightMap,
285 typename CompareFunction, typename CombineFunction,
286 typename CostInf, typename CostZero>
287 inline void
288 astar_search_no_init_tree
289 (const VertexListGraph &g,
290 typename graph_traits<VertexListGraph>::vertex_descriptor s,
291 AStarHeuristic h, AStarVisitor vis,
292 PredecessorMap predecessor, CostMap cost,
293 DistanceMap distance, WeightMap weight,
294 CompareFunction compare, CombineFunction combine,
295 CostInf /*inf*/, CostZero zero)
296 {
297 typedef typename graph_traits<VertexListGraph>::vertex_descriptor
298 Vertex;
299 typedef typename property_traits<DistanceMap>::value_type Distance;
300 typedef d_ary_heap_indirect<
301 std::pair<Distance, Vertex>,
302 4,
303 null_property_map<std::pair<Distance, Vertex>, std::size_t>,
304 function_property_map<graph_detail::select1st<Distance, Vertex>, std::pair<Distance, Vertex> >,
305 CompareFunction>
306 MutableQueue;
307 MutableQueue Q(
308 make_function_property_map<std::pair<Distance, Vertex> >(graph_detail::select1st<Distance, Vertex>()),
309 null_property_map<std::pair<Distance, Vertex>, std::size_t>(),
310 compare);
311
312 vis.discover_vertex(s, g);
313 Q.push(std::make_pair(get(cost, s), s));
314 while (!Q.empty()) {
315 Vertex v;
316 Distance v_rank;
317 boost::tie(v_rank, v) = Q.top();
318 Q.pop();
319 vis.examine_vertex(v, g);
320 BGL_FORALL_OUTEDGES_T(v, e, g, VertexListGraph) {
321 Vertex w = target(e, g);
322 vis.examine_edge(e, g);
323 Distance e_weight = get(weight, e);
324 if (compare(e_weight, zero))
325 BOOST_THROW_EXCEPTION(negative_edge());
326 bool decreased =
327 relax(e, g, weight, predecessor, distance,
328 combine, compare);
92f5a8d4 329 combine(get(distance, v), e_weight);
7c673cae
FG
330 if (decreased) {
331 vis.edge_relaxed(e, g);
332 Distance w_rank = combine(get(distance, w), h(w));
333 put(cost, w, w_rank);
334 vis.discover_vertex(w, g);
335 Q.push(std::make_pair(w_rank, w));
336 } else {
337 vis.edge_not_relaxed(e, g);
338 }
339 }
340 vis.finish_vertex(v, g);
341 }
342 }
343
344 // Non-named parameter interface
345 template <typename VertexListGraph, typename AStarHeuristic,
346 typename AStarVisitor, typename PredecessorMap,
347 typename CostMap, typename DistanceMap,
348 typename WeightMap, typename VertexIndexMap,
349 typename ColorMap,
350 typename CompareFunction, typename CombineFunction,
351 typename CostInf, typename CostZero>
352 inline void
353 astar_search
354 (const VertexListGraph &g,
355 typename graph_traits<VertexListGraph>::vertex_descriptor s,
356 AStarHeuristic h, AStarVisitor vis,
357 PredecessorMap predecessor, CostMap cost,
358 DistanceMap distance, WeightMap weight,
359 VertexIndexMap index_map, ColorMap color,
360 CompareFunction compare, CombineFunction combine,
361 CostInf inf, CostZero zero)
362 {
363
364 typedef typename property_traits<ColorMap>::value_type ColorValue;
365 typedef color_traits<ColorValue> Color;
366 typename graph_traits<VertexListGraph>::vertex_iterator ui, ui_end;
367 for (boost::tie(ui, ui_end) = vertices(g); ui != ui_end; ++ui) {
368 put(color, *ui, Color::white());
369 put(distance, *ui, inf);
370 put(cost, *ui, inf);
371 put(predecessor, *ui, *ui);
372 vis.initialize_vertex(*ui, g);
373 }
374 put(distance, s, zero);
375 put(cost, s, h(s));
376
377 astar_search_no_init
378 (g, s, h, vis, predecessor, cost, distance, weight,
379 color, index_map, compare, combine, inf, zero);
380
381 }
382
383 // Non-named parameter interface
384 template <typename VertexListGraph, typename AStarHeuristic,
385 typename AStarVisitor, typename PredecessorMap,
386 typename CostMap, typename DistanceMap,
387 typename WeightMap,
388 typename CompareFunction, typename CombineFunction,
389 typename CostInf, typename CostZero>
390 inline void
391 astar_search_tree
392 (const VertexListGraph &g,
393 typename graph_traits<VertexListGraph>::vertex_descriptor s,
394 AStarHeuristic h, AStarVisitor vis,
395 PredecessorMap predecessor, CostMap cost,
396 DistanceMap distance, WeightMap weight,
397 CompareFunction compare, CombineFunction combine,
398 CostInf inf, CostZero zero)
399 {
400
401 typename graph_traits<VertexListGraph>::vertex_iterator ui, ui_end;
402 for (boost::tie(ui, ui_end) = vertices(g); ui != ui_end; ++ui) {
403 put(distance, *ui, inf);
404 put(cost, *ui, inf);
405 put(predecessor, *ui, *ui);
406 vis.initialize_vertex(*ui, g);
407 }
408 put(distance, s, zero);
409 put(cost, s, h(s));
410
411 astar_search_no_init_tree
412 (g, s, h, vis, predecessor, cost, distance, weight,
413 compare, combine, inf, zero);
414
415 }
416
417 // Named parameter interfaces
418 template <typename VertexListGraph,
419 typename AStarHeuristic,
420 typename P, typename T, typename R>
421 void
422 astar_search
423 (const VertexListGraph &g,
424 typename graph_traits<VertexListGraph>::vertex_descriptor s,
425 AStarHeuristic h, const bgl_named_params<P, T, R>& params)
426 {
427 using namespace boost::graph::keywords;
428 typedef bgl_named_params<P, T, R> params_type;
429 BOOST_GRAPH_DECLARE_CONVERTED_PARAMETERS(params_type, params)
430
431 // Distance type is the value type of the distance map if there is one,
432 // otherwise the value type of the weight map.
92f5a8d4
TL
433 typedef typename boost::detail::override_const_property_result<
434 arg_pack_type,
435 boost::graph::keywords::tag::weight_map,
436 edge_weight_t,
437 VertexListGraph
438 >::type weight_map_type;
439 typedef typename boost::property_traits<weight_map_type>::value_type D;
7c673cae 440 const D inf = arg_pack[_distance_inf || detail::get_max<D>()];
92f5a8d4
TL
441 const D zero_actual = D();
442 const D zero_d = arg_pack[_distance_zero | zero_actual];
443 null_visitor null_vis;
444 astar_visitor<null_visitor> default_visitor(null_vis);
445 typename boost::parameter::binding<
446 arg_pack_type,
447 boost::graph::keywords::tag::visitor,
448 dummy_property_map&
449 >::type vis = arg_pack[_visitor | default_visitor];
450 dummy_property_map dummy_prop;
451 typename boost::parameter::binding<
452 arg_pack_type,
453 boost::graph::keywords::tag::predecessor_map,
454 dummy_property_map&
455 >::type pred_map = arg_pack[_predecessor_map | dummy_prop];
456 boost::detail::make_property_map_from_arg_pack_gen<
457 boost::graph::keywords::tag::rank_map,
458 D
459 > rank_map_gen(zero_actual);
460 typename boost::detail::map_maker<
461 VertexListGraph,
462 arg_pack_type,
463 boost::graph::keywords::tag::rank_map,
464 D
465 >::map_type r_map = rank_map_gen(g, arg_pack);
466 boost::detail::make_property_map_from_arg_pack_gen<
467 boost::graph::keywords::tag::distance_map,
468 D
469 > dist_map_gen(zero_actual);
470 typename boost::detail::map_maker<
471 VertexListGraph,
472 arg_pack_type,
473 boost::graph::keywords::tag::distance_map,
474 D
475 >::map_type dist_map = dist_map_gen(g, arg_pack);
476 weight_map_type w_map = detail::override_const_property(arg_pack, _weight_map, g, edge_weight);
477 typename boost::detail::override_const_property_result<
478 arg_pack_type,
479 boost::graph::keywords::tag::vertex_index_map,
480 vertex_index_t,
481 VertexListGraph
482 >::type v_i_map = detail::override_const_property(arg_pack, _vertex_index_map, g, vertex_index);
483 typename boost::detail::map_maker<
484 VertexListGraph,
485 arg_pack_type,
486 boost::graph::keywords::tag::color_map,
487 boost::default_color_type
488 >::map_type c_map = boost::detail::make_color_map_from_arg_pack(g, arg_pack);
489 std::less<D> default_compare;
490 typename boost::parameter::binding<
491 arg_pack_type,
492 boost::graph::keywords::tag::distance_compare,
493 std::less<D>&
494 >::type dist_comp = arg_pack[_distance_compare | default_compare];
495 closed_plus<D> default_combine(inf);
496 typename boost::parameter::binding<
497 arg_pack_type,
498 boost::graph::keywords::tag::distance_combine,
499 closed_plus<D>&
500 >::type dist_comb = arg_pack[_distance_combine | default_combine];
7c673cae
FG
501 astar_search
502 (g, s, h,
92f5a8d4
TL
503 vis,
504 pred_map,
505 r_map,
506 dist_map,
507 w_map,
508 v_i_map,
509 c_map,
510 dist_comp,
511 dist_comb,
7c673cae 512 inf,
92f5a8d4 513 zero_d);
7c673cae
FG
514 }
515
7c673cae
FG
516 template <typename VertexListGraph,
517 typename AStarHeuristic,
518 typename P, typename T, typename R>
519 void
520 astar_search_tree
521 (const VertexListGraph &g,
522 typename graph_traits<VertexListGraph>::vertex_descriptor s,
523 AStarHeuristic h, const bgl_named_params<P, T, R>& params)
524 {
525 using namespace boost::graph::keywords;
526 typedef bgl_named_params<P, T, R> params_type;
527 BOOST_GRAPH_DECLARE_CONVERTED_PARAMETERS(params_type, params)
528
529 // Distance type is the value type of the distance map if there is one,
530 // otherwise the value type of the weight map.
92f5a8d4
TL
531 typedef typename boost::detail::override_const_property_result<
532 arg_pack_type,
533 boost::graph::keywords::tag::weight_map,
534 edge_weight_t,
535 VertexListGraph
536 >::type weight_map_type;
537 typedef typename boost::property_traits<weight_map_type>::value_type D;
7c673cae 538 const D inf = arg_pack[_distance_inf || detail::get_max<D>()];
92f5a8d4
TL
539 const D zero_actual = D();
540 const D zero_d = arg_pack[_distance_zero | zero_actual];
541 null_visitor null_vis;
542 astar_visitor<null_visitor> default_visitor(null_vis);
543 typename boost::parameter::binding<
544 arg_pack_type,
545 boost::graph::keywords::tag::visitor,
546 dummy_property_map&
547 >::type vis = arg_pack[_visitor | default_visitor];
548 dummy_property_map dummy_prop;
549 typename boost::parameter::binding<
550 arg_pack_type,
551 boost::graph::keywords::tag::predecessor_map,
552 dummy_property_map&
553 >::type pred_map = arg_pack[_predecessor_map | dummy_prop];
554 boost::detail::make_property_map_from_arg_pack_gen<
555 boost::graph::keywords::tag::rank_map,
556 D
557 > rank_map_gen(zero_actual);
558 typename boost::detail::map_maker<
559 VertexListGraph,
560 arg_pack_type,
561 boost::graph::keywords::tag::rank_map,
562 D
563 >::map_type r_map = rank_map_gen(g, arg_pack);
564 boost::detail::make_property_map_from_arg_pack_gen<
565 boost::graph::keywords::tag::distance_map,
566 D
567 > dist_map_gen(zero_actual);
568 typename boost::detail::map_maker<
569 VertexListGraph,
570 arg_pack_type,
571 boost::graph::keywords::tag::distance_map,
572 D
573 >::map_type dist_map = dist_map_gen(g, arg_pack);
574 weight_map_type w_map = detail::override_const_property(arg_pack, _weight_map, g, edge_weight);
575 std::less<D> default_compare;
576 typename boost::parameter::binding<
577 arg_pack_type,
578 boost::graph::keywords::tag::distance_compare,
579 std::less<D>&
580 >::type dist_comp = arg_pack[_distance_compare | default_compare];
581 closed_plus<D> default_combine(inf);
582 typename boost::parameter::binding<
583 arg_pack_type,
584 boost::graph::keywords::tag::distance_combine,
585 closed_plus<D>&
586 >::type dist_comb = arg_pack[_distance_combine | default_combine];
7c673cae
FG
587 astar_search_tree
588 (g, s, h,
92f5a8d4
TL
589 vis,
590 pred_map,
591 r_map,
592 dist_map,
593 w_map,
594 dist_comp,
595 dist_comb,
7c673cae 596 inf,
92f5a8d4 597 zero_d);
7c673cae
FG
598 }
599
600 template <typename VertexListGraph,
601 typename AStarHeuristic,
602 typename P, typename T, typename R>
603 void
604 astar_search_no_init
605 (const VertexListGraph &g,
606 typename graph_traits<VertexListGraph>::vertex_descriptor s,
607 AStarHeuristic h, const bgl_named_params<P, T, R>& params)
608 {
609 using namespace boost::graph::keywords;
610 typedef bgl_named_params<P, T, R> params_type;
611 BOOST_GRAPH_DECLARE_CONVERTED_PARAMETERS(params_type, params)
92f5a8d4
TL
612 typedef typename boost::detail::override_const_property_result<
613 arg_pack_type,
614 boost::graph::keywords::tag::weight_map,
615 edge_weight_t,
616 VertexListGraph
617 >::type weight_map_type;
7c673cae
FG
618 typedef typename boost::property_traits<weight_map_type>::value_type D;
619 const D inf = arg_pack[_distance_inf || detail::get_max<D>()];
92f5a8d4
TL
620 const D zero_actual = D();
621 const D zero_d = arg_pack[_distance_zero | zero_actual];
622 null_visitor null_vis;
623 astar_visitor<null_visitor> default_visitor(null_vis);
624 typename boost::parameter::binding<
625 arg_pack_type,
626 boost::graph::keywords::tag::visitor,
627 dummy_property_map&
628 >::type vis = arg_pack[_visitor | default_visitor];
629 dummy_property_map dummy_prop;
630 typename boost::parameter::binding<
631 arg_pack_type,
632 boost::graph::keywords::tag::predecessor_map,
633 dummy_property_map&
634 >::type pred_map = arg_pack[_predecessor_map | dummy_prop];
635 boost::detail::make_property_map_from_arg_pack_gen<
636 boost::graph::keywords::tag::rank_map,
637 D
638 > rank_map_gen(zero_actual);
639 typename boost::detail::map_maker<
640 VertexListGraph,
641 arg_pack_type,
642 boost::graph::keywords::tag::rank_map,
643 D
644 >::map_type r_map = rank_map_gen(g, arg_pack);
645 boost::detail::make_property_map_from_arg_pack_gen<
646 boost::graph::keywords::tag::distance_map,
647 D
648 > dist_map_gen(zero_actual);
649 typename boost::detail::map_maker<
650 VertexListGraph,
651 arg_pack_type,
652 boost::graph::keywords::tag::distance_map,
653 D
654 >::map_type dist_map = dist_map_gen(g, arg_pack);
655 weight_map_type w_map = detail::override_const_property(arg_pack, _weight_map, g, edge_weight);
656 typename boost::detail::map_maker<
657 VertexListGraph,
658 arg_pack_type,
659 boost::graph::keywords::tag::color_map,
660 boost::default_color_type
661 >::map_type c_map = boost::detail::make_color_map_from_arg_pack(g, arg_pack);
662 typename boost::detail::override_const_property_result<
663 arg_pack_type,
664 boost::graph::keywords::tag::vertex_index_map,
665 vertex_index_t,
666 VertexListGraph
667 >::type v_i_map = detail::override_const_property(arg_pack, _vertex_index_map, g, vertex_index);
668 std::less<D> default_compare;
669 typename boost::parameter::binding<
670 arg_pack_type,
671 boost::graph::keywords::tag::distance_compare,
672 std::less<D>&
673 >::type dist_comp = arg_pack[_distance_compare | default_compare];
674 closed_plus<D> default_combine(inf);
675 typename boost::parameter::binding<
676 arg_pack_type,
677 boost::graph::keywords::tag::distance_combine,
678 closed_plus<D>&
679 >::type dist_comb = arg_pack[_distance_combine | default_combine];
7c673cae
FG
680 astar_search_no_init
681 (g, s, h,
92f5a8d4
TL
682 vis,
683 pred_map,
684 r_map,
685 dist_map,
686 w_map,
687 c_map,
688 v_i_map,
689 dist_comp,
690 dist_comb,
7c673cae 691 inf,
92f5a8d4 692 zero_d);
7c673cae
FG
693 }
694
695 template <typename VertexListGraph,
696 typename AStarHeuristic,
697 typename P, typename T, typename R>
698 void
699 astar_search_no_init_tree
700 (const VertexListGraph &g,
701 typename graph_traits<VertexListGraph>::vertex_descriptor s,
702 AStarHeuristic h, const bgl_named_params<P, T, R>& params)
703 {
704 using namespace boost::graph::keywords;
705 typedef bgl_named_params<P, T, R> params_type;
706 BOOST_GRAPH_DECLARE_CONVERTED_PARAMETERS(params_type, params)
92f5a8d4
TL
707 typedef typename boost::detail::override_const_property_result<
708 arg_pack_type,
709 boost::graph::keywords::tag::weight_map,
710 edge_weight_t,
711 VertexListGraph
712 >::type weight_map_type;
7c673cae
FG
713 typedef typename boost::property_traits<weight_map_type>::value_type D;
714 const D inf = arg_pack[_distance_inf || detail::get_max<D>()];
92f5a8d4
TL
715 const D zero_actual = D();
716 const D zero_d = arg_pack[_distance_zero | zero_actual];
717 null_visitor null_vis;
718 astar_visitor<null_visitor> default_visitor(null_vis);
719 typename boost::parameter::binding<
720 arg_pack_type,
721 boost::graph::keywords::tag::visitor,
722 dummy_property_map&
723 >::type vis = arg_pack[_visitor | default_visitor];
724 dummy_property_map dummy_prop;
725 typename boost::parameter::binding<
726 arg_pack_type,
727 boost::graph::keywords::tag::predecessor_map,
728 dummy_property_map&
729 >::type pred_map = arg_pack[_predecessor_map | dummy_prop];
730 boost::detail::make_property_map_from_arg_pack_gen<
731 boost::graph::keywords::tag::rank_map,
732 D
733 > rank_map_gen(zero_actual);
734 typename boost::detail::map_maker<
735 VertexListGraph,
736 arg_pack_type,
737 boost::graph::keywords::tag::rank_map,
738 D
739 >::map_type r_map = rank_map_gen(g, arg_pack);
740 boost::detail::make_property_map_from_arg_pack_gen<
741 boost::graph::keywords::tag::distance_map,
742 D
743 > dist_map_gen(zero_actual);
744 typename boost::detail::map_maker<
745 VertexListGraph,
746 arg_pack_type,
747 boost::graph::keywords::tag::distance_map,
748 D
749 >::map_type dist_map = dist_map_gen(g, arg_pack);
750 weight_map_type w_map = detail::override_const_property(arg_pack, _weight_map, g, edge_weight);
751 std::less<D> default_compare;
752 typename boost::parameter::binding<
753 arg_pack_type,
754 boost::graph::keywords::tag::distance_compare,
755 std::less<D>&
756 >::type dist_comp = arg_pack[_distance_compare | default_compare];
757 closed_plus<D> default_combine(inf);
758 typename boost::parameter::binding<
759 arg_pack_type,
760 boost::graph::keywords::tag::distance_combine,
761 closed_plus<D>&
762 >::type dist_comb = arg_pack[_distance_combine | default_combine];
7c673cae
FG
763 astar_search_no_init_tree
764 (g, s, h,
92f5a8d4
TL
765 vis,
766 pred_map,
767 r_map,
768 dist_map,
769 w_map,
770 dist_comp,
771 dist_comb,
7c673cae 772 inf,
92f5a8d4 773 zero_d);
7c673cae
FG
774 }
775
776} // namespace boost
777
778#endif // BOOST_GRAPH_ASTAR_SEARCH_HPP