1.. Copyright (C) 2004-2009 The Trustees of Indiana University. 2 Use, modification and distribution is subject to the Boost Software 3 License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 4 http://www.boost.org/LICENSE_1_0.txt) 5 6============================= 7|Logo| Betweenness Centrality 8============================= 9 10:: 11 12 // named parameter versions 13 template<typename Graph, typename Param, typename Tag, typename Rest> 14 void 15 brandes_betweenness_centrality(const Graph& g, 16 const bgl_named_params<Param,Tag,Rest>& params); 17 18 template<typename Graph, typename CentralityMap> 19 void 20 brandes_betweenness_centrality(const Graph& g, CentralityMap centrality); 21 22 template<typename Graph, typename CentralityMap, typename EdgeCentralityMap> 23 void 24 brandes_betweenness_centrality(const Graph& g, CentralityMap centrality, 25 EdgeCentralityMap edge_centrality_map); 26 27 // non-named parameter versions 28 template<typename Graph, typename CentralityMap, typename EdgeCentralityMap, 29 typename IncomingMap, typename DistanceMap, typename DependencyMap, 30 typename PathCountMap, typename VertexIndexMap, typename Buffer> 31 void 32 brandes_betweenness_centrality(const Graph& g, 33 CentralityMap centrality, 34 EdgeCentralityMap edge_centrality_map, 35 IncomingMap incoming, 36 DistanceMap distance, 37 DependencyMap dependency, 38 PathCountMap path_count, 39 VertexIndexMap vertex_index, 40 Buffer sources, 41 typename property_traits<DistanceMap>::value_type delta); 42 43 template<typename Graph, typename CentralityMap, typename EdgeCentralityMap, 44 typename IncomingMap, typename DistanceMap, typename DependencyMap, 45 typename PathCountMap, typename VertexIndexMap, typename WeightMap, 46 typename Buffer> 47 void 48 brandes_betweenness_centrality(const Graph& g, 49 CentralityMap centrality, 50 EdgeCentralityMap edge_centrality_map, 51 IncomingMap incoming, 52 DistanceMap distance, 53 DependencyMap dependency, 54 PathCountMap path_count, 55 VertexIndexMap vertex_index, 56 Buffer sources, 57 typename property_traits<WeightMap>::value_type delta, 58 WeightMap weight_map); 59 60 // helper functions 61 template<typename Graph, typename CentralityMap> 62 typename property_traits<CentralityMap>::value_type 63 central_point_dominance(const Graph& g, CentralityMap centrality); 64 65The ``brandes_betweenness_centrality()`` function computes the 66betweenness centrality of the vertices and edges in a graph. The 67method of calculating betweenness centrality in *O(V)* space is due to 68Brandes [Brandes01]_. The algorithm itself is a modification of 69Brandes algorithm by Edmonds [Edmonds09]_. 70 71.. contents:: 72 73Where Defined 74------------- 75<``boost/graph/distributed/betweenness_centrality.hpp``> 76 77also accessible from 78 79<``boost/graph/betweenness_centrality.hpp``> 80 81Parameters 82---------- 83 84IN: ``const Graph& g`` 85 The graph type must be a model of `Distributed Graph`_. The graph 86 type must also model the `Incidence Graph`_ concept. 0-weighted 87 edges in ``g`` will result in undefined behavior. 88 89IN: ``CentralityMap centrality`` 90 A centrality map may be supplied to the algorithm, if not supplied a 91 ``dummy_property_map`` will be used and no vertex centrality 92 information will be recorded. The ``CentralityMap`` type must be a 93 `Distributed Property Map`_. The key type must be the graph's 94 vertex descriptor type. 95 96 **Default**: A ``dummy_property_map``. 97 98IN: ``EdgeCentralityMap edge_centrality_map`` 99 An edge centrality map may be supplied to the algorithm, if not 100 supplied a ``dummy_property_map`` will be used and no edge 101 centrality information will be recorded. The ``EdgeCentralityMap`` 102 type must be a `Distributed Property Map`_. The key type must be 103 the graph's vertex descriptor type. 104 105 **Default**: A ``dummy_property_map``. 106 107IN: ``IncomingMap incoming`` 108 The incoming map contains the incoming edges to a vertex that are 109 part of shortest paths to that vertex. The ``IncomingMap`` type 110 must be a `Distributed Property Map`_. Its key type and value type 111 must both be the graph's vertex descriptor type. 112 113 **Default**: An ``iterator_property_map`` created from a 114 ``std::vector`` of ``std::vector`` of the graph's vertex 115 descriptor type. 116 117IN: ``DistanceMap distance`` 118 The distance map records the distance to vertices during the 119 shortest paths portion of the algorithm. The ``DistanceMap`` type 120 must be a `Distributed Property Map`_. Its key type must be the 121 graph's vertex descriptor type. 122 123 **Default**: An ``iterator_property_map`` created from a 124 ``std::vector`` of the value type of the ``CentralityMap``. 125 126IN: ``DependencyMap dependency`` 127 The dependency map records the dependency of each vertex during the 128 centrality calculation portion of the algorithm. The 129 ``DependencyMap`` type must be a `Distributed Property Map`_. Its 130 key type must be the graph's vertex descriptor type. 131 132 **Default**: An ``iterator_property_map`` created from a 133 ``std::vector`` of the value type of the ``CentralityMap``. 134 135IN: ``PathCountMap path_count`` 136 137 The path count map records the number of shortest paths each vertex 138 is on during the centrality calculation portion of the algorithm. 139 The ``PathCountMap`` type must be a `Distributed Property Map`_. 140 Its key type must be the graph's vertex descriptor type. 141 142 **Default**: An ``iterator_property_map`` created from a 143 ``std::vector`` of the graph's degree size type. 144 145IN: ``VertexIndexMap vertex_index`` 146 A model of `Readable Property Map`_ whose key type is the vertex 147 descriptor type of the graph ``g`` and whose value type is an 148 integral type. The property map should map from vertices to their 149 (local) indices in the range *[0, num_vertices(g))*. 150 151 **Default**: ``get(vertex_index, g)`` 152 153IN: ``WeightMap weight_map`` 154 A model of `Readable Property Map`_ whose key type is the edge 155 descriptor type of the graph ``g``. If not supplied the betweenness 156 centrality calculation will be unweighted. 157 158IN: ``Buffer sources`` 159 A model of Buffer_ containing the starting vertices for the 160 algorithm. If ``sources`` is empty a complete betweenness 161 centrality calculation using all vertices in ``g`` will be 162 performed. The value type of the Buffer must be the graph's vertex 163 descriptor type. 164 165 **Default**: An empty ``boost::queue`` of int. 166 167Complexity 168---------- 169 170Computing the shortest paths, counting them, and computing the 171contribution to the centrality map is *O(V log V)*. Calculating exact 172betweenness centrality requires counting the shortest paths from all 173vertices in ``g``, thus exact betweenness centrality is *O(V^2 log 174V)*. 175 176Algorithm Description 177--------------------- 178 179For the vertices in ``sources`` (or all vertices in ``g`` when 180``sources`` is empty) the algorithm first calls a customized 181implementation of delta_stepping_shortest_paths_ which maintains a 182shortest path tree using an ``IncomingMap``. The ``IncomingMap`` 183contains the source of all incoming edges on shortest paths. 184 185The ``IncomingMap`` defines the shortest path DAG at the target of the 186edges in the shortest paths tree. In the bidirectional case edge 187flags could be used to translate the shortest paths information to the 188source of the edges. Setting edge flags during the shortest path 189computation rather than using an ``IncomingMap`` would result in 190adding an *O(V)* factor to the inner loop of the shortest paths 191computation to account for having to clear edge flags when a new 192shortest path is found. This would increase the complexity of the 193algorithm. Asymptotically, the current implementation is better, 194however using edge flags in the bidirectional case would reduce the 195number of supersteps required by the depth of the shortest paths DAG 196for each vertex. Currently an ``outgoing`` map is explicitly 197constructed by simply reversing the edges in the incoming map. Once 198the ``outgoing`` map is constructed it is traversed in dependency 199order from the source of the shortest paths calculation in order to 200compute path counts. Once path counts are computed the shortest paths 201DAG is again traversed in dependency order from the source to 202calculate the dependency and centrality of each vertex. 203 204The algorithm is complete when the centrality has been computed from 205all vertices in ``g``. 206 207Bibliography 208------------ 209 210.. [Brandes01] Ulrik Brandes. A Faster Algorithm for Betweenness 211 Centrality. In the Journal of Mathematical Sociology, volume 25 212 number 2, pages 163--177, 2001. 213 214.. [Edmonds09] Nick Edmonds, Torsten Hoefler, and Andrew Lumsdaine. 215 A Space-Efficient Parallel Algorithm for Computing Betweenness 216 Centrality in Sparse Networks. Indiana University tech report. 217 2009. 218 219----------------------------------------------------------------------------- 220 221Copyright (C) 2009 The Trustees of Indiana University. 222 223Authors: Nick Edmonds and Andrew Lumsdaine 224 225.. |Logo| image:: pbgl-logo.png 226 :align: middle 227 :alt: Parallel BGL 228 :target: http://www.osl.iu.edu/research/pbgl 229 230.. _delta_stepping_shortest_paths: dijkstra_shortest_paths.html 231.. _Distributed Graph: DistributedGraph.html 232.. _Incidence Graph: http://www.boost.org/libs/graph/doc/IncidenceGraph.html 233.. _Readable Property Map: http://www.boost.org/libs/property_map/ReadablePropertyMap.html 234.. _Buffer: http://www.boost.org/libs/graph/doc/Buffer.html 235.. _Process Group: process_group.html 236.. _Distributed Property Map: distributed_property_map.html 237