123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- """
- Vitality measures.
- """
- from functools import partial
- import networkx as nx
- __all__ = ["closeness_vitality"]
- def closeness_vitality(G, node=None, weight=None, wiener_index=None):
- """Returns the closeness vitality for nodes in the graph.
- The *closeness vitality* of a node, defined in Section 3.6.2 of [1],
- is the change in the sum of distances between all node pairs when
- excluding that node.
- Parameters
- ----------
- G : NetworkX graph
- A strongly-connected graph.
- weight : string
- The name of the edge attribute used as weight. This is passed
- directly to the :func:`~networkx.wiener_index` function.
- node : object
- If specified, only the closeness vitality for this node will be
- returned. Otherwise, a dictionary mapping each node to its
- closeness vitality will be returned.
- Other parameters
- ----------------
- wiener_index : number
- If you have already computed the Wiener index of the graph
- `G`, you can provide that value here. Otherwise, it will be
- computed for you.
- Returns
- -------
- dictionary or float
- If `node` is None, this function returns a dictionary
- with nodes as keys and closeness vitality as the
- value. Otherwise, it returns only the closeness vitality for the
- specified `node`.
- The closeness vitality of a node may be negative infinity if
- removing that node would disconnect the graph.
- Examples
- --------
- >>> G = nx.cycle_graph(3)
- >>> nx.closeness_vitality(G)
- {0: 2.0, 1: 2.0, 2: 2.0}
- See Also
- --------
- closeness_centrality
- References
- ----------
- .. [1] Ulrik Brandes, Thomas Erlebach (eds.).
- *Network Analysis: Methodological Foundations*.
- Springer, 2005.
- <http://books.google.com/books?id=TTNhSm7HYrIC>
- """
- if wiener_index is None:
- wiener_index = nx.wiener_index(G, weight=weight)
- if node is not None:
- after = nx.wiener_index(G.subgraph(set(G) - {node}), weight=weight)
- return wiener_index - after
- vitality = partial(closeness_vitality, G, weight=weight, wiener_index=wiener_index)
- # TODO This can be trivially parallelized.
- return {v: vitality(node=v) for v in G}
|