Chris@16: // (C) Copyright 2007-2009 Andrew Sutton Chris@16: // Chris@16: // Use, modification and distribution are subject to the Chris@16: // Boost Software License, Version 1.0 (See accompanying file Chris@16: // LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_GRAPH_CLOSENESS_CENTRALITY_HPP Chris@16: #define BOOST_GRAPH_CLOSENESS_CENTRALITY_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: template > Chris@16: struct closeness_measure Chris@16: : public geodesic_measure Chris@16: { Chris@16: typedef geodesic_measure< Graph, DistanceType, ResultType> base_type; Chris@16: typedef typename base_type::distance_type distance_type; Chris@16: typedef typename base_type::result_type result_type; Chris@16: Chris@16: result_type operator ()(distance_type d, const Graph&) Chris@16: { Chris@16: BOOST_CONCEPT_ASSERT(( NumericValueConcept )); Chris@16: BOOST_CONCEPT_ASSERT(( NumericValueConcept )); Chris@16: BOOST_CONCEPT_ASSERT(( AdaptableUnaryFunctionConcept )); Chris@16: return (d == base_type::infinite_distance()) Chris@16: ? base_type::zero_result() Chris@16: : rec(result_type(d)); Chris@16: } Chris@16: Reciprocal rec; Chris@16: }; Chris@16: Chris@16: template Chris@16: inline closeness_measure< Chris@16: Graph, typename property_traits::value_type, double, Chris@16: detail::reciprocal > Chris@16: measure_closeness(const Graph&, DistanceMap) Chris@16: { Chris@16: typedef typename property_traits::value_type Distance; Chris@16: return closeness_measure >(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline closeness_measure< Chris@16: Graph, typename property_traits::value_type, T, Chris@16: detail::reciprocal > Chris@16: measure_closeness(const Graph&, DistanceMap) Chris@16: { Chris@16: typedef typename property_traits::value_type Distance; Chris@16: return closeness_measure >(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline closeness_measure< Chris@16: Graph, typename property_traits::value_type, T, Chris@16: Reciprocal> Chris@16: measure_closeness(const Graph&, DistanceMap) Chris@16: { Chris@16: typedef typename property_traits::value_type Distance; Chris@16: return closeness_measure(); Chris@16: } Chris@16: Chris@16: template Chris@16: inline typename Measure::result_type Chris@16: closeness_centrality(const Graph& g, Chris@16: DistanceMap dist, Chris@16: Measure measure, Chris@16: Combinator combine) Chris@16: { Chris@16: BOOST_CONCEPT_ASSERT(( VertexListGraphConcept )); Chris@16: typedef typename graph_traits::vertex_descriptor Vertex; Chris@16: BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept )); Chris@16: typedef typename property_traits::value_type Distance; Chris@16: BOOST_CONCEPT_ASSERT(( NumericValueConcept )); Chris@16: BOOST_CONCEPT_ASSERT(( DistanceMeasureConcept )); Chris@16: Chris@16: Distance n = detail::combine_distances(g, dist, combine, Distance(0)); Chris@16: return measure(n, g); Chris@16: } Chris@16: Chris@16: template Chris@16: inline typename Measure::result_type Chris@16: closeness_centrality(const Graph& g, DistanceMap dist, Measure measure) Chris@16: { Chris@16: BOOST_CONCEPT_ASSERT(( GraphConcept )); Chris@16: typedef typename graph_traits::vertex_descriptor Vertex; Chris@16: BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept )); Chris@16: typedef typename property_traits::value_type Distance; Chris@16: Chris@16: return closeness_centrality(g, dist, measure, std::plus()); Chris@16: } Chris@16: Chris@16: template Chris@16: inline double closeness_centrality(const Graph& g, DistanceMap dist) Chris@16: { return closeness_centrality(g, dist, measure_closeness(g, dist)); } Chris@16: Chris@16: template Chris@16: inline T closeness_centrality(const Graph& g, DistanceMap dist) Chris@16: { return closeness_centrality(g, dist, measure_closeness(g, dist)); } Chris@16: Chris@16: template Chris@16: inline void Chris@16: all_closeness_centralities(const Graph& g, Chris@16: DistanceMatrixMap dist, Chris@16: CentralityMap cent, Chris@16: Measure measure) Chris@16: { Chris@16: BOOST_CONCEPT_ASSERT(( VertexListGraphConcept )); Chris@16: typedef typename graph_traits::vertex_descriptor Vertex; Chris@16: BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept )); Chris@16: typedef typename property_traits::value_type DistanceMap; Chris@16: BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept )); Chris@16: BOOST_CONCEPT_ASSERT(( WritablePropertyMapConcept )); Chris@16: typedef typename property_traits::value_type Centrality; Chris@16: Chris@16: typename graph_traits::vertex_iterator i, end; Chris@16: for(boost::tie(i, end) = vertices(g); i != end; ++i) { Chris@16: DistanceMap dm = get(dist, *i); Chris@16: Centrality c = closeness_centrality(g, dm, measure); Chris@16: put(cent, *i, c); Chris@16: } Chris@16: } Chris@16: Chris@16: template Chris@16: inline void Chris@16: all_closeness_centralities(const Graph& g, Chris@16: DistanceMatrixMap dist, Chris@16: CentralityMap cent) Chris@16: { Chris@16: BOOST_CONCEPT_ASSERT(( GraphConcept )); Chris@16: typedef typename graph_traits::vertex_descriptor Vertex; Chris@16: BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept )); Chris@16: typedef typename property_traits::value_type DistanceMap; Chris@16: BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept )); Chris@16: typedef typename property_traits::value_type Result; Chris@16: Chris@16: all_closeness_centralities(g, dist, cent, measure_closeness(g, DistanceMap())); Chris@16: } Chris@16: Chris@16: } /* namespace boost */ Chris@16: Chris@16: #endif