Skip to content
Open
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
eaa5a67
Algebraic Connectivity. This rewiring method rewires the network such…
Jul 19, 2022
55a2df4
Algebraic Connectivity. This rewiring method rewires such that the al…
Jul 19, 2022
e6062b7
Added Watts-Strogatz method
Jul 19, 2022
98d8721
added watts-strogatz
Jul 19, 2022
62371cf
added watts-strogatz
Jul 19, 2022
5226aef
updated __init__
Jul 19, 2022
9f95693
added connected watts strogatz method;
Jul 19, 2022
a38de55
fixed formatting connected_watts_strogatz
Jul 19, 2022
b33d783
Changed Watts-Strogatz to be global edge rewiring per discussion with…
Jul 19, 2022
5c34e92
minor formatting for global_rewiring
Jul 19, 2022
0ba9062
removed dk
Jul 19, 2022
a8360b3
added .base in global_rewiring.py
Jul 19, 2022
ea03b7d
Added probability p for choosing to rewire
Jul 19, 2022
4ddd53c
Jupyter notebook and DS_Store removed from commit
Jul 19, 2022
92ebb4c
removed extra .ds and .ipynb_checkpoints
Jul 19, 2022
6c12568
Updated global rewiring class to have full and step rewires. Also upd…
Jul 19, 2022
7f22f86
deleted notebook
Jul 19, 2022
1776e43
reformatted correclty
Jul 19, 2022
e52880f
Merge branch 'main' of https://github.com/netsiphd/netrw
Jul 19, 2022
365abf2
revised comments
Jul 19, 2022
561111e
why is this happening
Jul 20, 2022
abfdeb9
Merge branch 'main' of https://github.com/netsiphd/netrw
Jul 20, 2022
bfa90fa
updates
Jul 20, 2022
49a7ab8
robust branch
Jul 20, 2022
b5abf33
fix init
Jul 20, 2022
0abeb01
robust rewiring
Jul 20, 2022
c39fd0e
robust updat
Jul 20, 2022
5e6c611
robust updates
Jul 20, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 36 additions & 42 deletions netrw/rewire/robust_rewiring.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,19 @@
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:
Louzada, V. H. P., Daolio, F., Herrmann, H. J., & Tomassini, M. (2013). Smart rewiring for network robustness. Journal of Complex Networks, 1(2), 150–159. https://doi.org/10.1093/comnet/cnt010

* 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)
Expand All @@ -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