Chris@16
|
1 // (C) Copyright 2007-2009 Andrew Sutton
|
Chris@16
|
2 //
|
Chris@16
|
3 // Use, modification and distribution are subject to the
|
Chris@16
|
4 // Boost Software License, Version 1.0 (See accompanying file
|
Chris@16
|
5 // LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
6
|
Chris@16
|
7 #ifndef BOOST_GRAPH_CLOSENESS_CENTRALITY_HPP
|
Chris@16
|
8 #define BOOST_GRAPH_CLOSENESS_CENTRALITY_HPP
|
Chris@16
|
9
|
Chris@16
|
10 #include <boost/graph/detail/geodesic.hpp>
|
Chris@16
|
11 #include <boost/graph/exterior_property.hpp>
|
Chris@16
|
12 #include <boost/concept/assert.hpp>
|
Chris@16
|
13
|
Chris@16
|
14 namespace boost
|
Chris@16
|
15 {
|
Chris@16
|
16 template <typename Graph,
|
Chris@16
|
17 typename DistanceType,
|
Chris@16
|
18 typename ResultType,
|
Chris@16
|
19 typename Reciprocal = detail::reciprocal<ResultType> >
|
Chris@16
|
20 struct closeness_measure
|
Chris@16
|
21 : public geodesic_measure<Graph, DistanceType, ResultType>
|
Chris@16
|
22 {
|
Chris@16
|
23 typedef geodesic_measure< Graph, DistanceType, ResultType> base_type;
|
Chris@16
|
24 typedef typename base_type::distance_type distance_type;
|
Chris@16
|
25 typedef typename base_type::result_type result_type;
|
Chris@16
|
26
|
Chris@16
|
27 result_type operator ()(distance_type d, const Graph&)
|
Chris@16
|
28 {
|
Chris@16
|
29 BOOST_CONCEPT_ASSERT(( NumericValueConcept<DistanceType> ));
|
Chris@16
|
30 BOOST_CONCEPT_ASSERT(( NumericValueConcept<ResultType> ));
|
Chris@16
|
31 BOOST_CONCEPT_ASSERT(( AdaptableUnaryFunctionConcept<Reciprocal,ResultType,ResultType> ));
|
Chris@16
|
32 return (d == base_type::infinite_distance())
|
Chris@16
|
33 ? base_type::zero_result()
|
Chris@16
|
34 : rec(result_type(d));
|
Chris@16
|
35 }
|
Chris@16
|
36 Reciprocal rec;
|
Chris@16
|
37 };
|
Chris@16
|
38
|
Chris@16
|
39 template <typename Graph, typename DistanceMap>
|
Chris@16
|
40 inline closeness_measure<
|
Chris@16
|
41 Graph, typename property_traits<DistanceMap>::value_type, double,
|
Chris@16
|
42 detail::reciprocal<double> >
|
Chris@16
|
43 measure_closeness(const Graph&, DistanceMap)
|
Chris@16
|
44 {
|
Chris@16
|
45 typedef typename property_traits<DistanceMap>::value_type Distance;
|
Chris@16
|
46 return closeness_measure<Graph, Distance, double, detail::reciprocal<double> >();
|
Chris@16
|
47 }
|
Chris@16
|
48
|
Chris@16
|
49 template <typename T, typename Graph, typename DistanceMap>
|
Chris@16
|
50 inline closeness_measure<
|
Chris@16
|
51 Graph, typename property_traits<DistanceMap>::value_type, T,
|
Chris@16
|
52 detail::reciprocal<T> >
|
Chris@16
|
53 measure_closeness(const Graph&, DistanceMap)
|
Chris@16
|
54 {
|
Chris@16
|
55 typedef typename property_traits<DistanceMap>::value_type Distance;
|
Chris@16
|
56 return closeness_measure<Graph, Distance, T, detail::reciprocal<T> >();
|
Chris@16
|
57 }
|
Chris@16
|
58
|
Chris@16
|
59 template <typename T, typename Graph, typename DistanceMap, typename Reciprocal>
|
Chris@16
|
60 inline closeness_measure<
|
Chris@16
|
61 Graph, typename property_traits<DistanceMap>::value_type, T,
|
Chris@16
|
62 Reciprocal>
|
Chris@16
|
63 measure_closeness(const Graph&, DistanceMap)
|
Chris@16
|
64 {
|
Chris@16
|
65 typedef typename property_traits<DistanceMap>::value_type Distance;
|
Chris@16
|
66 return closeness_measure<Graph, Distance, T, Reciprocal>();
|
Chris@16
|
67 }
|
Chris@16
|
68
|
Chris@16
|
69 template <typename Graph,
|
Chris@16
|
70 typename DistanceMap,
|
Chris@16
|
71 typename Measure,
|
Chris@16
|
72 typename Combinator>
|
Chris@16
|
73 inline typename Measure::result_type
|
Chris@16
|
74 closeness_centrality(const Graph& g,
|
Chris@16
|
75 DistanceMap dist,
|
Chris@16
|
76 Measure measure,
|
Chris@16
|
77 Combinator combine)
|
Chris@16
|
78 {
|
Chris@16
|
79 BOOST_CONCEPT_ASSERT(( VertexListGraphConcept<Graph> ));
|
Chris@16
|
80 typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
|
Chris@16
|
81 BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<DistanceMap,Vertex> ));
|
Chris@16
|
82 typedef typename property_traits<DistanceMap>::value_type Distance;
|
Chris@16
|
83 BOOST_CONCEPT_ASSERT(( NumericValueConcept<Distance> ));
|
Chris@16
|
84 BOOST_CONCEPT_ASSERT(( DistanceMeasureConcept<Measure,Graph> ));
|
Chris@16
|
85
|
Chris@16
|
86 Distance n = detail::combine_distances(g, dist, combine, Distance(0));
|
Chris@16
|
87 return measure(n, g);
|
Chris@16
|
88 }
|
Chris@16
|
89
|
Chris@16
|
90 template <typename Graph, typename DistanceMap, typename Measure>
|
Chris@16
|
91 inline typename Measure::result_type
|
Chris@16
|
92 closeness_centrality(const Graph& g, DistanceMap dist, Measure measure)
|
Chris@16
|
93 {
|
Chris@16
|
94 BOOST_CONCEPT_ASSERT(( GraphConcept<Graph> ));
|
Chris@16
|
95 typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
|
Chris@16
|
96 BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<DistanceMap,Vertex> ));
|
Chris@16
|
97 typedef typename property_traits<DistanceMap>::value_type Distance;
|
Chris@16
|
98
|
Chris@16
|
99 return closeness_centrality(g, dist, measure, std::plus<Distance>());
|
Chris@16
|
100 }
|
Chris@16
|
101
|
Chris@16
|
102 template <typename Graph, typename DistanceMap>
|
Chris@16
|
103 inline double closeness_centrality(const Graph& g, DistanceMap dist)
|
Chris@16
|
104 { return closeness_centrality(g, dist, measure_closeness(g, dist)); }
|
Chris@16
|
105
|
Chris@16
|
106 template <typename T, typename Graph, typename DistanceMap>
|
Chris@16
|
107 inline T closeness_centrality(const Graph& g, DistanceMap dist)
|
Chris@16
|
108 { return closeness_centrality(g, dist, measure_closeness<T>(g, dist)); }
|
Chris@16
|
109
|
Chris@16
|
110 template <typename Graph,
|
Chris@16
|
111 typename DistanceMatrixMap,
|
Chris@16
|
112 typename CentralityMap,
|
Chris@16
|
113 typename Measure>
|
Chris@16
|
114 inline void
|
Chris@16
|
115 all_closeness_centralities(const Graph& g,
|
Chris@16
|
116 DistanceMatrixMap dist,
|
Chris@16
|
117 CentralityMap cent,
|
Chris@16
|
118 Measure measure)
|
Chris@16
|
119 {
|
Chris@16
|
120 BOOST_CONCEPT_ASSERT(( VertexListGraphConcept<Graph> ));
|
Chris@16
|
121 typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
|
Chris@16
|
122 BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<DistanceMatrixMap,Vertex> ));
|
Chris@16
|
123 typedef typename property_traits<DistanceMatrixMap>::value_type DistanceMap;
|
Chris@16
|
124 BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<DistanceMap,Vertex> ));
|
Chris@16
|
125 BOOST_CONCEPT_ASSERT(( WritablePropertyMapConcept<CentralityMap,Vertex> ));
|
Chris@16
|
126 typedef typename property_traits<CentralityMap>::value_type Centrality;
|
Chris@16
|
127
|
Chris@16
|
128 typename graph_traits<Graph>::vertex_iterator i, end;
|
Chris@16
|
129 for(boost::tie(i, end) = vertices(g); i != end; ++i) {
|
Chris@16
|
130 DistanceMap dm = get(dist, *i);
|
Chris@16
|
131 Centrality c = closeness_centrality(g, dm, measure);
|
Chris@16
|
132 put(cent, *i, c);
|
Chris@16
|
133 }
|
Chris@16
|
134 }
|
Chris@16
|
135
|
Chris@16
|
136 template <typename Graph,
|
Chris@16
|
137 typename DistanceMatrixMap,
|
Chris@16
|
138 typename CentralityMap>
|
Chris@16
|
139 inline void
|
Chris@16
|
140 all_closeness_centralities(const Graph& g,
|
Chris@16
|
141 DistanceMatrixMap dist,
|
Chris@16
|
142 CentralityMap cent)
|
Chris@16
|
143 {
|
Chris@16
|
144 BOOST_CONCEPT_ASSERT(( GraphConcept<Graph> ));
|
Chris@16
|
145 typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
|
Chris@16
|
146 BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<DistanceMatrixMap,Vertex> ));
|
Chris@16
|
147 typedef typename property_traits<DistanceMatrixMap>::value_type DistanceMap;
|
Chris@16
|
148 BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<DistanceMap,Vertex> ));
|
Chris@16
|
149 typedef typename property_traits<CentralityMap>::value_type Result;
|
Chris@16
|
150
|
Chris@16
|
151 all_closeness_centralities(g, dist, cent, measure_closeness<Result>(g, DistanceMap()));
|
Chris@16
|
152 }
|
Chris@16
|
153
|
Chris@16
|
154 } /* namespace boost */
|
Chris@16
|
155
|
Chris@16
|
156 #endif
|