summaryrefslogtreecommitdiffstats
path: root/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/betweenness_subset.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/betweenness_subset.py')
-rw-r--r--lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/betweenness_subset.py263
1 files changed, 263 insertions, 0 deletions
diff --git a/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/betweenness_subset.py b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/betweenness_subset.py
new file mode 100644
index 0000000..cd4f8a2
--- /dev/null
+++ b/lib/python2.7/site-packages/setoolsgui/networkx/algorithms/centrality/betweenness_subset.py
@@ -0,0 +1,263 @@
+"""
+Betweenness centrality measures for subsets of nodes.
+"""
+# Copyright (C) 2004-2011 by
+# Aric Hagberg <hagberg@lanl.gov>
+# Dan Schult <dschult@colgate.edu>
+# Pieter Swart <swart@lanl.gov>
+# All rights reserved.
+# BSD license.
+__author__ = """Aric Hagberg (hagberg@lanl.gov)"""
+
+__all__ = ['betweenness_centrality_subset',
+ 'edge_betweenness_centrality_subset',
+ 'betweenness_centrality_source']
+
+import networkx as nx
+
+from networkx.algorithms.centrality.betweenness import\
+ _single_source_dijkstra_path_basic as dijkstra
+from networkx.algorithms.centrality.betweenness import\
+ _single_source_shortest_path_basic as shortest_path
+
+
+def betweenness_centrality_subset(G,sources,targets,
+ normalized=False,
+ weight=None):
+ """Compute betweenness centrality for a subset of nodes.
+
+ .. math::
+
+ c_B(v) =\sum_{s\in S, t \in T} \frac{\sigma(s, t|v)}{\sigma(s, t)}
+
+ where `S` is the set of sources, `T` is the set of targets,
+ `\sigma(s, t)` is the number of shortest `(s, t)`-paths,
+ and `\sigma(s, t|v)` is the number of those paths
+ passing through some node `v` other than `s, t`.
+ If `s = t`, `\sigma(s, t) = 1`,
+ and if `v \in {s, t}`, `\sigma(s, t|v) = 0` [2]_.
+
+
+ Parameters
+ ----------
+ G : graph
+
+ sources: list of nodes
+ Nodes to use as sources for shortest paths in betweenness
+
+ targets: list of nodes
+ Nodes to use as targets for shortest paths in betweenness
+
+ normalized : bool, optional
+ If True the betweenness values are normalized by `2/((n-1)(n-2))`
+ for graphs, and `1/((n-1)(n-2))` for directed graphs where `n`
+ is the number of nodes in G.
+
+ weight : None or string, optional
+ If None, all edge weights are considered equal.
+ Otherwise holds the name of the edge attribute used as weight.
+
+ Returns
+ -------
+ nodes : dictionary
+ Dictionary of nodes with betweenness centrality as the value.
+
+ See Also
+ --------
+ edge_betweenness_centrality
+ load_centrality
+
+ Notes
+ -----
+ The basic algorithm is from [1]_.
+
+ For weighted graphs the edge weights must be greater than zero.
+ Zero edge weights can produce an infinite number of equal length
+ paths between pairs of nodes.
+
+ The normalization might seem a little strange but it is the same
+ as in betweenness_centrality() and is designed to make
+ betweenness_centrality(G) be the same as
+ betweenness_centrality_subset(G,sources=G.nodes(),targets=G.nodes()).
+
+
+ References
+ ----------
+ .. [1] Ulrik Brandes, A Faster Algorithm for Betweenness Centrality.
+ Journal of Mathematical Sociology 25(2):163-177, 2001.
+ http://www.inf.uni-konstanz.de/algo/publications/b-fabc-01.pdf
+ .. [2] Ulrik Brandes: On Variants of Shortest-Path Betweenness
+ Centrality and their Generic Computation.
+ Social Networks 30(2):136-145, 2008.
+ http://www.inf.uni-konstanz.de/algo/publications/b-vspbc-08.pdf
+ """
+ b=dict.fromkeys(G,0.0) # b[v]=0 for v in G
+ for s in sources:
+ # single source shortest paths
+ if weight is None: # use BFS
+ S,P,sigma=shortest_path(G,s)
+ else: # use Dijkstra's algorithm
+ S,P,sigma=dijkstra(G,s,weight)
+ b=_accumulate_subset(b,S,P,sigma,s,targets)
+ b=_rescale(b,len(G),normalized=normalized,directed=G.is_directed())
+ return b
+
+
+def edge_betweenness_centrality_subset(G,sources,targets,
+ normalized=False,
+ weight=None):
+ """Compute betweenness centrality for edges for a subset of nodes.
+
+ .. math::
+
+ c_B(v) =\sum_{s\in S,t \in T} \frac{\sigma(s, t|e)}{\sigma(s, t)}
+
+ where `S` is the set of sources, `T` is the set of targets,
+ `\sigma(s, t)` is the number of shortest `(s, t)`-paths,
+ and `\sigma(s, t|e)` is the number of those paths
+ passing through edge `e` [2]_.
+
+ Parameters
+ ----------
+ G : graph
+ A networkx graph
+
+ sources: list of nodes
+ Nodes to use as sources for shortest paths in betweenness
+
+ targets: list of nodes
+ Nodes to use as targets for shortest paths in betweenness
+
+ normalized : bool, optional
+ If True the betweenness values are normalized by `2/(n(n-1))`
+ for graphs, and `1/(n(n-1))` for directed graphs where `n`
+ is the number of nodes in G.
+
+ weight : None or string, optional
+ If None, all edge weights are considered equal.
+ Otherwise holds the name of the edge attribute used as weight.
+
+ Returns
+ -------
+ edges : dictionary
+ Dictionary of edges with Betweenness centrality as the value.
+
+ See Also
+ --------
+ betweenness_centrality
+ edge_load
+
+ Notes
+ -----
+ The basic algorithm is from [1]_.
+
+ For weighted graphs the edge weights must be greater than zero.
+ Zero edge weights can produce an infinite number of equal length
+ paths between pairs of nodes.
+
+ The normalization might seem a little strange but it is the same
+ as in edge_betweenness_centrality() and is designed to make
+ edge_betweenness_centrality(G) be the same as
+ edge_betweenness_centrality_subset(G,sources=G.nodes(),targets=G.nodes()).
+
+ References
+ ----------
+ .. [1] Ulrik Brandes, A Faster Algorithm for Betweenness Centrality.
+ Journal of Mathematical Sociology 25(2):163-177, 2001.
+ http://www.inf.uni-konstanz.de/algo/publications/b-fabc-01.pdf
+ .. [2] Ulrik Brandes: On Variants of Shortest-Path Betweenness
+ Centrality and their Generic Computation.
+ Social Networks 30(2):136-145, 2008.
+ http://www.inf.uni-konstanz.de/algo/publications/b-vspbc-08.pdf
+
+ """
+
+ b=dict.fromkeys(G,0.0) # b[v]=0 for v in G
+ b.update(dict.fromkeys(G.edges(),0.0)) # b[e] for e in G.edges()
+ for s in sources:
+ # single source shortest paths
+ if weight is None: # use BFS
+ S,P,sigma=shortest_path(G,s)
+ else: # use Dijkstra's algorithm
+ S,P,sigma=dijkstra(G,s,weight)
+ b=_accumulate_edges_subset(b,S,P,sigma,s,targets)
+ for n in G: # remove nodes to only return edges
+ del b[n]
+ b=_rescale_e(b,len(G),normalized=normalized,directed=G.is_directed())
+ return b
+
+# obsolete name
+def betweenness_centrality_source(G,normalized=True,weight=None,sources=None):
+ if sources is None:
+ sources=G.nodes()
+ targets=G.nodes()
+ return betweenness_centrality_subset(G,sources,targets,normalized,weight)
+
+
+def _accumulate_subset(betweenness,S,P,sigma,s,targets):
+ delta=dict.fromkeys(S,0)
+ target_set=set(targets)
+ while S:
+ w=S.pop()
+ for v in P[w]:
+ if w in target_set:
+ delta[v]+=(sigma[v]/sigma[w])*(1.0+delta[w])
+ else:
+ delta[v]+=delta[w]/len(P[w])
+ if w != s:
+ betweenness[w]+=delta[w]
+ return betweenness
+
+def _accumulate_edges_subset(betweenness,S,P,sigma,s,targets):
+ delta=dict.fromkeys(S,0)
+ target_set=set(targets)
+ while S:
+ w=S.pop()
+ for v in P[w]:
+ if w in target_set:
+ c=(sigma[v]/sigma[w])*(1.0+delta[w])
+ else:
+ c=delta[w]/len(P[w])
+ if (v,w) not in betweenness:
+ betweenness[(w,v)]+=c
+ else:
+ betweenness[(v,w)]+=c
+ delta[v]+=c
+ if w != s:
+ betweenness[w]+=delta[w]
+ return betweenness
+
+
+
+
+def _rescale(betweenness,n,normalized,directed=False):
+ if normalized is True:
+ if n <=2:
+ scale=None # no normalization b=0 for all nodes
+ else:
+ scale=1.0/((n-1)*(n-2))
+ else: # rescale by 2 for undirected graphs
+ if not directed:
+ scale=1.0/2.0
+ else:
+ scale=None
+ if scale is not None:
+ for v in betweenness:
+ betweenness[v] *= scale
+ return betweenness
+
+def _rescale_e(betweenness,n,normalized,directed=False):
+ if normalized is True:
+ if n <=1:
+ scale=None # no normalization b=0 for all nodes
+ else:
+ scale=1.0/(n*(n-1))
+ else: # rescale by 2 for undirected graphs
+ if not directed:
+ scale=1.0/2.0
+ else:
+ scale=None
+ if scale is not None:
+ for v in betweenness:
+ betweenness[v] *= scale
+ return betweenness