closeness_centrality.hpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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. #ifndef BOOST_GRAPH_CLOSENESS_CENTRALITY_HPP
  7. #define BOOST_GRAPH_CLOSENESS_CENTRALITY_HPP
  8. #include <boost/graph/detail/geodesic.hpp>
  9. #include <boost/graph/exterior_property.hpp>
  10. #include <boost/concept/assert.hpp>
  11. namespace boost
  12. {
  13. template <typename Graph,
  14. typename DistanceType,
  15. typename ResultType,
  16. typename Reciprocal = detail::reciprocal<ResultType> >
  17. struct closeness_measure
  18. : public geodesic_measure<Graph, DistanceType, ResultType>
  19. {
  20. typedef geodesic_measure< Graph, DistanceType, ResultType> base_type;
  21. typedef typename base_type::distance_type distance_type;
  22. typedef typename base_type::result_type result_type;
  23. result_type operator ()(distance_type d, const Graph&)
  24. {
  25. BOOST_CONCEPT_ASSERT(( NumericValueConcept<DistanceType> ));
  26. BOOST_CONCEPT_ASSERT(( NumericValueConcept<ResultType> ));
  27. BOOST_CONCEPT_ASSERT(( AdaptableUnaryFunctionConcept<Reciprocal,ResultType,ResultType> ));
  28. return (d == base_type::infinite_distance())
  29. ? base_type::zero_result()
  30. : rec(result_type(d));
  31. }
  32. Reciprocal rec;
  33. };
  34. template <typename Graph, typename DistanceMap>
  35. inline closeness_measure<
  36. Graph, typename property_traits<DistanceMap>::value_type, double,
  37. detail::reciprocal<double> >
  38. measure_closeness(const Graph&, DistanceMap)
  39. {
  40. typedef typename property_traits<DistanceMap>::value_type Distance;
  41. return closeness_measure<Graph, Distance, double, detail::reciprocal<double> >();
  42. }
  43. template <typename T, typename Graph, typename DistanceMap>
  44. inline closeness_measure<
  45. Graph, typename property_traits<DistanceMap>::value_type, T,
  46. detail::reciprocal<T> >
  47. measure_closeness(const Graph&, DistanceMap)
  48. {
  49. typedef typename property_traits<DistanceMap>::value_type Distance;
  50. return closeness_measure<Graph, Distance, T, detail::reciprocal<T> >();
  51. }
  52. template <typename T, typename Graph, typename DistanceMap, typename Reciprocal>
  53. inline closeness_measure<
  54. Graph, typename property_traits<DistanceMap>::value_type, T,
  55. Reciprocal>
  56. measure_closeness(const Graph&, DistanceMap)
  57. {
  58. typedef typename property_traits<DistanceMap>::value_type Distance;
  59. return closeness_measure<Graph, Distance, T, Reciprocal>();
  60. }
  61. template <typename Graph,
  62. typename DistanceMap,
  63. typename Measure,
  64. typename Combinator>
  65. inline typename Measure::result_type
  66. closeness_centrality(const Graph& g,
  67. DistanceMap dist,
  68. Measure measure,
  69. Combinator combine)
  70. {
  71. BOOST_CONCEPT_ASSERT(( VertexListGraphConcept<Graph> ));
  72. typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
  73. BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<DistanceMap,Vertex> ));
  74. typedef typename property_traits<DistanceMap>::value_type Distance;
  75. BOOST_CONCEPT_ASSERT(( NumericValueConcept<Distance> ));
  76. BOOST_CONCEPT_ASSERT(( DistanceMeasureConcept<Measure,Graph> ));
  77. Distance n = detail::combine_distances(g, dist, combine, Distance(0));
  78. return measure(n, g);
  79. }
  80. template <typename Graph, typename DistanceMap, typename Measure>
  81. inline typename Measure::result_type
  82. closeness_centrality(const Graph& g, DistanceMap dist, Measure measure)
  83. {
  84. BOOST_CONCEPT_ASSERT(( GraphConcept<Graph> ));
  85. typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
  86. BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<DistanceMap,Vertex> ));
  87. typedef typename property_traits<DistanceMap>::value_type Distance;
  88. return closeness_centrality(g, dist, measure, std::plus<Distance>());
  89. }
  90. template <typename Graph, typename DistanceMap>
  91. inline double closeness_centrality(const Graph& g, DistanceMap dist)
  92. { return closeness_centrality(g, dist, measure_closeness(g, dist)); }
  93. template <typename T, typename Graph, typename DistanceMap>
  94. inline T closeness_centrality(const Graph& g, DistanceMap dist)
  95. { return closeness_centrality(g, dist, measure_closeness<T>(g, dist)); }
  96. template <typename Graph,
  97. typename DistanceMatrixMap,
  98. typename CentralityMap,
  99. typename Measure>
  100. inline void
  101. all_closeness_centralities(const Graph& g,
  102. DistanceMatrixMap dist,
  103. CentralityMap cent,
  104. Measure measure)
  105. {
  106. BOOST_CONCEPT_ASSERT(( VertexListGraphConcept<Graph> ));
  107. typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
  108. BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<DistanceMatrixMap,Vertex> ));
  109. typedef typename property_traits<DistanceMatrixMap>::value_type DistanceMap;
  110. BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<DistanceMap,Vertex> ));
  111. BOOST_CONCEPT_ASSERT(( WritablePropertyMapConcept<CentralityMap,Vertex> ));
  112. typedef typename property_traits<CentralityMap>::value_type Centrality;
  113. typename graph_traits<Graph>::vertex_iterator i, end;
  114. for(boost::tie(i, end) = vertices(g); i != end; ++i) {
  115. DistanceMap dm = get(dist, *i);
  116. Centrality c = closeness_centrality(g, dm, measure);
  117. put(cent, *i, c);
  118. }
  119. }
  120. template <typename Graph,
  121. typename DistanceMatrixMap,
  122. typename CentralityMap>
  123. inline void
  124. all_closeness_centralities(const Graph& g,
  125. DistanceMatrixMap dist,
  126. CentralityMap cent)
  127. {
  128. BOOST_CONCEPT_ASSERT(( GraphConcept<Graph> ));
  129. typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
  130. BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<DistanceMatrixMap,Vertex> ));
  131. typedef typename property_traits<DistanceMatrixMap>::value_type DistanceMap;
  132. BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<DistanceMap,Vertex> ));
  133. typedef typename property_traits<CentralityMap>::value_type Result;
  134. all_closeness_centralities(g, dist, cent, measure_closeness<Result>(g, DistanceMap()));
  135. }
  136. } /* namespace boost */
  137. #endif