| """Provides functions for computing the efficiency of nodes and graphs.""" |
|
|
| import networkx as nx |
| from networkx.exception import NetworkXNoPath |
|
|
| from ..utils import not_implemented_for |
|
|
| __all__ = ["efficiency", "local_efficiency", "global_efficiency"] |
|
|
|
|
| @not_implemented_for("directed") |
| @nx._dispatchable |
| def efficiency(G, u, v): |
| """Returns the efficiency of a pair of nodes in a graph. |
| |
| The *efficiency* of a pair of nodes is the multiplicative inverse of the |
| shortest path distance between the nodes [1]_. Returns 0 if no path |
| between nodes. |
| |
| Parameters |
| ---------- |
| G : :class:`networkx.Graph` |
| An undirected graph for which to compute the average local efficiency. |
| u, v : node |
| Nodes in the graph ``G``. |
| |
| Returns |
| ------- |
| float |
| Multiplicative inverse of the shortest path distance between the nodes. |
| |
| Examples |
| -------- |
| >>> G = nx.Graph([(0, 1), (0, 2), (0, 3), (1, 2), (1, 3)]) |
| >>> nx.efficiency(G, 2, 3) # this gives efficiency for node 2 and 3 |
| 0.5 |
| |
| Notes |
| ----- |
| Edge weights are ignored when computing the shortest path distances. |
| |
| See also |
| -------- |
| local_efficiency |
| global_efficiency |
| |
| References |
| ---------- |
| .. [1] Latora, Vito, and Massimo Marchiori. |
| "Efficient behavior of small-world networks." |
| *Physical Review Letters* 87.19 (2001): 198701. |
| <https://doi.org/10.1103/PhysRevLett.87.198701> |
| |
| """ |
| try: |
| eff = 1 / nx.shortest_path_length(G, u, v) |
| except NetworkXNoPath: |
| eff = 0 |
| return eff |
|
|
|
|
| @not_implemented_for("directed") |
| @nx._dispatchable |
| def global_efficiency(G): |
| """Returns the average global efficiency of the graph. |
| |
| The *efficiency* of a pair of nodes in a graph is the multiplicative |
| inverse of the shortest path distance between the nodes. The *average |
| global efficiency* of a graph is the average efficiency of all pairs of |
| nodes [1]_. |
| |
| Parameters |
| ---------- |
| G : :class:`networkx.Graph` |
| An undirected graph for which to compute the average global efficiency. |
| |
| Returns |
| ------- |
| float |
| The average global efficiency of the graph. |
| |
| Examples |
| -------- |
| >>> G = nx.Graph([(0, 1), (0, 2), (0, 3), (1, 2), (1, 3)]) |
| >>> round(nx.global_efficiency(G), 12) |
| 0.916666666667 |
| |
| Notes |
| ----- |
| Edge weights are ignored when computing the shortest path distances. |
| |
| See also |
| -------- |
| local_efficiency |
| |
| References |
| ---------- |
| .. [1] Latora, Vito, and Massimo Marchiori. |
| "Efficient behavior of small-world networks." |
| *Physical Review Letters* 87.19 (2001): 198701. |
| <https://doi.org/10.1103/PhysRevLett.87.198701> |
| |
| """ |
| n = len(G) |
| denom = n * (n - 1) |
| if denom != 0: |
| lengths = nx.all_pairs_shortest_path_length(G) |
| g_eff = 0 |
| for source, targets in lengths: |
| for target, distance in targets.items(): |
| if distance > 0: |
| g_eff += 1 / distance |
| g_eff /= denom |
| |
| |
| else: |
| g_eff = 0 |
| |
| |
| return g_eff |
|
|
|
|
| @not_implemented_for("directed") |
| @nx._dispatchable |
| def local_efficiency(G): |
| """Returns the average local efficiency of the graph. |
| |
| The *efficiency* of a pair of nodes in a graph is the multiplicative |
| inverse of the shortest path distance between the nodes. The *local |
| efficiency* of a node in the graph is the average global efficiency of the |
| subgraph induced by the neighbors of the node. The *average local |
| efficiency* is the average of the local efficiencies of each node [1]_. |
| |
| Parameters |
| ---------- |
| G : :class:`networkx.Graph` |
| An undirected graph for which to compute the average local efficiency. |
| |
| Returns |
| ------- |
| float |
| The average local efficiency of the graph. |
| |
| Examples |
| -------- |
| >>> G = nx.Graph([(0, 1), (0, 2), (0, 3), (1, 2), (1, 3)]) |
| >>> nx.local_efficiency(G) |
| 0.9166666666666667 |
| |
| Notes |
| ----- |
| Edge weights are ignored when computing the shortest path distances. |
| |
| See also |
| -------- |
| global_efficiency |
| |
| References |
| ---------- |
| .. [1] Latora, Vito, and Massimo Marchiori. |
| "Efficient behavior of small-world networks." |
| *Physical Review Letters* 87.19 (2001): 198701. |
| <https://doi.org/10.1103/PhysRevLett.87.198701> |
| |
| """ |
| efficiency_list = (global_efficiency(G.subgraph(G[v])) for v in G) |
| return sum(efficiency_list) / len(G) |
|
|