diff --git a/netrw/rewire/robust_rewiring.py b/netrw/rewire/robust_rewiring.py index fe7a6e9..42f92ce 100644 --- a/netrw/rewire/robust_rewiring.py +++ b/netrw/rewire/robust_rewiring.py @@ -4,9 +4,11 @@ import random import copy from .base import BaseRewirer -import warnings - - +​ +​ +# In[14]: +​ +​ class RobustRewirer(BaseRewirer): """ Increases network robustness by building triangles around high degree nodes following algorithm described in: @@ -14,10 +16,7 @@ class RobustRewirer(BaseRewirer): * full_rewire rewires the graph N times """ - - def step_rewire( - self, G, copy_graph=False, timesteps=1, directed=False, verbose=False - ): + def step_rewire(self,G,copy_graph=False,timesteps=1,directed=False,verbose=False): if copy_graph: G = copy.deepcopy(G) @@ -32,62 +31,57 @@ def step_rewire( added_edges = {} for t in range(timesteps): +​ A = nx.adjacency_matrix(G) degree_list = G.degree - +​ neighbors = [] for i in range(len(degree_list)): - sorted_degrees = sorted( - list(degree_list(np.nonzero(A[i, :])[1])), key=itemgetter(1) - ) + sorted_degrees = sorted(list(degree_list(np.nonzero(A[i,:])[1])),key=itemgetter(1)) if len(sorted_degrees) > 1: if sorted_degrees[-2][1] > 1 and sorted_degrees[-1][1] > 1: neighbors.append(i) - index_i = neighbors[random.randint(0, len(neighbors) - 1)] - sorted_degrees_i = sorted( - list(degree_list(np.nonzero(A[index_i, :])[1])), key=itemgetter(1) - ) - +​ + index_i = neighbors[random.randint(0,len(neighbors)-1)] + sorted_degrees_i = sorted(list(degree_list(np.nonzero(A[index_i,:])[1])),key=itemgetter(1)) +​ min_degree = sorted_degrees_i[0][1] max_degree = sorted_degrees_i[-1][1] - +​ j = [] k = [] - +​ for item in sorted_degrees_i: if item[1] == min_degree: j.append(item[0]) if item[1] == max_degree: k.append(item[0]) - - index_j = j[random.randint(0, len(j) - 1)] - index_k = k[random.randint(0, len(k) - 1)] - - m = sorted( - list(degree_list(np.nonzero(A[index_j, :])[1])), key=itemgetter(1) - ) - n = sorted( - list(degree_list(np.nonzero(A[index_k, :])[1])), key=itemgetter(1) - ) - - index_m = m[random.randint(0, len(m) - 1)][0] - index_n = n[random.randint(0, len(n) - 1)][0] - - if len(np.unique([index_i, index_j, index_k, index_m, index_n])) == 5: - G.remove_edge(index_j, index_m) - G.remove_edge(index_k, index_n) - G.add_edge(index_k, index_j) - G.add_edge(index_m, index_n) - +​ + index_j = j[random.randint(0,len(j)-1)] + index_k = k[random.randint(0,len(k)-1)] +​ + m = sorted(list(degree_list(np.nonzero(A[index_j,:])[1])),key=itemgetter(1)) + n = sorted(list(degree_list(np.nonzero(A[index_k,:])[1])),key=itemgetter(1)) +​ + index_m = m[random.randint(0,len(m)-1)][0] + index_n = n[random.randint(0,len(n)-1)][0] +​ + if len(np.unique([index_i,index_j,index_k,index_m,index_n])) == 5: + G.remove_edge(index_j,index_m) + G.remove_edge(index_k,index_n) + G.add_edge(index_k,index_j) + G.add_edge(index_m,index_n) + if verbose: + removed_edges[t] = [(index_j,index_m),(index_k,index_n)] + added_edges[t] = [(index_k,index_j),(index_m,index_n)] +​ if verbose: return G, removed_edges, added_edges else: return G - def full_rewire( - self, G, copy_graph=True, timesteps=-1, directed=False, verbose=False - ): + def full_rewire(self,G,copy_graph=False,timesteps=-1,directed=False,verbose=False): if timesteps == -1: timesteps = int(len(G.nodes())) - G = self.step_rewire(G, copy_graph, timesteps, directed, verbose) + G = self.step_rewire(G,copy_graph,timesteps,directed,verbose) return G