Mercurial > hg > vamp-build-and-test
comparison DEPENDENCIES/generic/include/boost/graph/eccentricity.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
15:663ca0da4350 | 16:2665513ce2d3 |
---|---|
1 // (C) Copyright 2007-2009 Andrew Sutton | |
2 // | |
3 // Use, modification and distribution are subject to the | |
4 // Boost Software License, Version 1.0 (See accompanying file | |
5 // LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) | |
6 | |
7 #ifndef BOOST_GRAPH_ECCENTRICITY_HPP | |
8 #define BOOST_GRAPH_ECCENTRICITY_HPP | |
9 | |
10 #include <boost/next_prior.hpp> | |
11 #include <boost/config.hpp> | |
12 #include <boost/graph/detail/geodesic.hpp> | |
13 #include <boost/concept/assert.hpp> | |
14 | |
15 namespace boost | |
16 { | |
17 template <typename Graph, | |
18 typename DistanceMap, | |
19 typename Combinator> | |
20 inline typename property_traits<DistanceMap>::value_type | |
21 eccentricity(const Graph& g, DistanceMap dist, Combinator combine) | |
22 { | |
23 BOOST_CONCEPT_ASSERT(( GraphConcept<Graph> )); | |
24 typedef typename graph_traits<Graph>::vertex_descriptor Vertex; | |
25 BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<DistanceMap,Vertex> )); | |
26 typedef typename property_traits<DistanceMap>::value_type Distance; | |
27 | |
28 return detail::combine_distances(g, dist, combine, Distance(0)); | |
29 } | |
30 | |
31 template <typename Graph, typename DistanceMap> | |
32 inline typename property_traits<DistanceMap>::value_type | |
33 eccentricity(const Graph& g, DistanceMap dist) | |
34 { | |
35 BOOST_CONCEPT_ASSERT(( GraphConcept<Graph> )); | |
36 typedef typename graph_traits<Graph>::vertex_descriptor Vertex; | |
37 BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<DistanceMap,Vertex> )); | |
38 typedef typename property_traits<DistanceMap>::value_type Distance; | |
39 | |
40 return eccentricity(g, dist, detail::maximize<Distance>()); | |
41 } | |
42 | |
43 template <typename Graph, typename DistanceMatrix, typename EccentricityMap> | |
44 inline std::pair<typename property_traits<EccentricityMap>::value_type, | |
45 typename property_traits<EccentricityMap>::value_type> | |
46 all_eccentricities(const Graph& g, const DistanceMatrix& dist, EccentricityMap ecc) | |
47 { | |
48 BOOST_CONCEPT_ASSERT(( VertexListGraphConcept<Graph> )); | |
49 typedef typename graph_traits<Graph>::vertex_descriptor Vertex; | |
50 typedef typename graph_traits<Graph>::vertex_iterator VertexIterator; | |
51 BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<DistanceMatrix,Vertex> )); | |
52 typedef typename property_traits<DistanceMatrix>::value_type DistanceMap; | |
53 BOOST_CONCEPT_ASSERT(( WritablePropertyMapConcept<EccentricityMap,Vertex> )); | |
54 typedef typename property_traits<EccentricityMap>::value_type Eccentricity; | |
55 BOOST_USING_STD_MIN(); | |
56 BOOST_USING_STD_MAX(); | |
57 | |
58 Eccentricity | |
59 r = numeric_values<Eccentricity>::infinity(), | |
60 d = numeric_values<Eccentricity>::zero(); | |
61 VertexIterator i, end; | |
62 boost::tie(i, end) = vertices(g); | |
63 for(boost::tie(i, end) = vertices(g); i != end; ++i) { | |
64 DistanceMap dm = get(dist, *i); | |
65 Eccentricity e = eccentricity(g, dm); | |
66 put(ecc, *i, e); | |
67 | |
68 // track the radius and diameter at the same time | |
69 r = min BOOST_PREVENT_MACRO_SUBSTITUTION (r, e); | |
70 d = max BOOST_PREVENT_MACRO_SUBSTITUTION (d, e); | |
71 } | |
72 return std::make_pair(r, d); | |
73 } | |
74 | |
75 template <typename Graph, typename EccentricityMap> | |
76 inline std::pair<typename property_traits<EccentricityMap>::value_type, | |
77 typename property_traits<EccentricityMap>::value_type> | |
78 radius_and_diameter(const Graph& g, EccentricityMap ecc) | |
79 { | |
80 BOOST_CONCEPT_ASSERT(( VertexListGraphConcept<Graph> )); | |
81 typedef typename graph_traits<Graph>::vertex_descriptor Vertex; | |
82 typedef typename graph_traits<Graph>::vertex_iterator VertexIterator; | |
83 BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<EccentricityMap, Vertex> )); | |
84 typedef typename property_traits<EccentricityMap>::value_type Eccentricity; | |
85 BOOST_USING_STD_MIN(); | |
86 BOOST_USING_STD_MAX(); | |
87 | |
88 VertexIterator i, end; | |
89 boost::tie(i, end) = vertices(g); | |
90 Eccentricity radius = get(ecc, *i); | |
91 Eccentricity diameter = get(ecc, *i); | |
92 for(i = boost::next(i); i != end; ++i) { | |
93 Eccentricity cur = get(ecc, *i); | |
94 radius = min BOOST_PREVENT_MACRO_SUBSTITUTION (radius, cur); | |
95 diameter = max BOOST_PREVENT_MACRO_SUBSTITUTION (diameter, cur); | |
96 } | |
97 return std::make_pair(radius, diameter); | |
98 } | |
99 | |
100 | |
101 template <typename Graph, typename EccentricityMap> | |
102 inline typename property_traits<EccentricityMap>::value_type | |
103 radius(const Graph& g, EccentricityMap ecc) | |
104 { return radius_and_diameter(g, ecc).first; } | |
105 | |
106 | |
107 template <typename Graph, typename EccentricityMap> | |
108 inline typename property_traits<EccentricityMap>::value_type | |
109 diameter(const Graph& g, EccentricityMap ecc) | |
110 { return radius_and_diameter(g, ecc).second; } | |
111 | |
112 } /* namespace boost */ | |
113 | |
114 #endif |