Mercurial > repos > shellac > sam_consensus_v3
comparison env/lib/python3.9/site-packages/networkx/algorithms/assortativity/connectivity.py @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
| author | shellac |
|---|---|
| date | Mon, 22 Mar 2021 18:12:50 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:4f3585e2f14b |
|---|---|
| 1 from collections import defaultdict | |
| 2 | |
| 3 __all__ = ["average_degree_connectivity", "k_nearest_neighbors"] | |
| 4 | |
| 5 | |
| 6 def average_degree_connectivity( | |
| 7 G, source="in+out", target="in+out", nodes=None, weight=None | |
| 8 ): | |
| 9 r"""Compute the average degree connectivity of graph. | |
| 10 | |
| 11 The average degree connectivity is the average nearest neighbor degree of | |
| 12 nodes with degree k. For weighted graphs, an analogous measure can | |
| 13 be computed using the weighted average neighbors degree defined in | |
| 14 [1]_, for a node `i`, as | |
| 15 | |
| 16 .. math:: | |
| 17 | |
| 18 k_{nn,i}^{w} = \frac{1}{s_i} \sum_{j \in N(i)} w_{ij} k_j | |
| 19 | |
| 20 where `s_i` is the weighted degree of node `i`, | |
| 21 `w_{ij}` is the weight of the edge that links `i` and `j`, | |
| 22 and `N(i)` are the neighbors of node `i`. | |
| 23 | |
| 24 Parameters | |
| 25 ---------- | |
| 26 G : NetworkX graph | |
| 27 | |
| 28 source : "in"|"out"|"in+out" (default:"in+out") | |
| 29 Directed graphs only. Use "in"- or "out"-degree for source node. | |
| 30 | |
| 31 target : "in"|"out"|"in+out" (default:"in+out" | |
| 32 Directed graphs only. Use "in"- or "out"-degree for target node. | |
| 33 | |
| 34 nodes : list or iterable (optional) | |
| 35 Compute neighbor connectivity for these nodes. The default is all | |
| 36 nodes. | |
| 37 | |
| 38 weight : string or None, optional (default=None) | |
| 39 The edge attribute that holds the numerical value used as a weight. | |
| 40 If None, then each edge has weight 1. | |
| 41 | |
| 42 Returns | |
| 43 ------- | |
| 44 d : dict | |
| 45 A dictionary keyed by degree k with the value of average connectivity. | |
| 46 | |
| 47 Raises | |
| 48 ------ | |
| 49 ValueError | |
| 50 If either `source` or `target` are not one of 'in', | |
| 51 'out', or 'in+out'. | |
| 52 | |
| 53 Examples | |
| 54 -------- | |
| 55 >>> G = nx.path_graph(4) | |
| 56 >>> G.edges[1, 2]["weight"] = 3 | |
| 57 >>> nx.k_nearest_neighbors(G) | |
| 58 {1: 2.0, 2: 1.5} | |
| 59 >>> nx.k_nearest_neighbors(G, weight="weight") | |
| 60 {1: 2.0, 2: 1.75} | |
| 61 | |
| 62 See also | |
| 63 -------- | |
| 64 neighbors_average_degree | |
| 65 | |
| 66 Notes | |
| 67 ----- | |
| 68 This algorithm is sometimes called "k nearest neighbors" and is also | |
| 69 available as `k_nearest_neighbors`. | |
| 70 | |
| 71 References | |
| 72 ---------- | |
| 73 .. [1] A. Barrat, M. Barthélemy, R. Pastor-Satorras, and A. Vespignani, | |
| 74 "The architecture of complex weighted networks". | |
| 75 PNAS 101 (11): 3747–3752 (2004). | |
| 76 """ | |
| 77 # First, determine the type of neighbors and the type of degree to use. | |
| 78 if G.is_directed(): | |
| 79 if source not in ("in", "out", "in+out"): | |
| 80 raise ValueError('source must be one of "in", "out", or "in+out"') | |
| 81 if target not in ("in", "out", "in+out"): | |
| 82 raise ValueError('target must be one of "in", "out", or "in+out"') | |
| 83 direction = {"out": G.out_degree, "in": G.in_degree, "in+out": G.degree} | |
| 84 neighbor_funcs = { | |
| 85 "out": G.successors, | |
| 86 "in": G.predecessors, | |
| 87 "in+out": G.neighbors, | |
| 88 } | |
| 89 source_degree = direction[source] | |
| 90 target_degree = direction[target] | |
| 91 neighbors = neighbor_funcs[source] | |
| 92 # `reverse` indicates whether to look at the in-edge when | |
| 93 # computing the weight of an edge. | |
| 94 reverse = source == "in" | |
| 95 else: | |
| 96 source_degree = G.degree | |
| 97 target_degree = G.degree | |
| 98 neighbors = G.neighbors | |
| 99 reverse = False | |
| 100 dsum = defaultdict(int) | |
| 101 dnorm = defaultdict(int) | |
| 102 # Check if `source_nodes` is actually a single node in the graph. | |
| 103 source_nodes = source_degree(nodes) | |
| 104 if nodes in G: | |
| 105 source_nodes = [(nodes, source_degree(nodes))] | |
| 106 for n, k in source_nodes: | |
| 107 nbrdeg = target_degree(neighbors(n)) | |
| 108 if weight is None: | |
| 109 s = sum(d for n, d in nbrdeg) | |
| 110 else: # weight nbr degree by weight of (n,nbr) edge | |
| 111 if reverse: | |
| 112 s = sum(G[nbr][n].get(weight, 1) * d for nbr, d in nbrdeg) | |
| 113 else: | |
| 114 s = sum(G[n][nbr].get(weight, 1) * d for nbr, d in nbrdeg) | |
| 115 dnorm[k] += source_degree(n, weight=weight) | |
| 116 dsum[k] += s | |
| 117 | |
| 118 # normalize | |
| 119 dc = {} | |
| 120 for k, avg in dsum.items(): | |
| 121 dc[k] = avg | |
| 122 norm = dnorm[k] | |
| 123 if avg > 0 and norm > 0: | |
| 124 dc[k] /= norm | |
| 125 return dc | |
| 126 | |
| 127 | |
| 128 k_nearest_neighbors = average_degree_connectivity |
