From d45790e8ece0325b75009419eb60987a142dc805 Mon Sep 17 00:00:00 2001 From: lluc_laptop Date: Mon, 18 Jul 2022 16:51:58 -0400 Subject: [PATCH 1/3] added rwcm class --- netrw/rewire/rwcm.py | 68 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 netrw/rewire/rwcm.py diff --git a/netrw/rewire/rwcm.py b/netrw/rewire/rwcm.py new file mode 100644 index 0000000..fa0f033 --- /dev/null +++ b/netrw/rewire/rwcm.py @@ -0,0 +1,68 @@ +from . import BaseRewirer +import copy +import itertools as it +import random +import networkx as nx +import numpy as np + + +class rwcm(BaseRewirer): + + def weigth_swap(G, copy_graph=True): + if copy_graph: + G=copy.deepcopy(G) + + e_list=list(G.edges(data=True)) + e_1=random.choice(e_list) + e_list.remove(e_1) + e_2=random.choice(e_list) + + print(e_1) + print(e_2) + + w_1=e_1[2]['weight'] + w_2=e_2[2]['weight'] + + G.edges[e_1[0],e_1[1]]['weight']=w_2 + G.edges[e_2[0],e_2[1]]['weight']=w_1 + + return G + + def redistribute_weight(G, copy_graph=True): + if copy_graph: + G=copy.deepcopy(G) + + e_list=list(G.edges(data=True)) + e_1=random.choice(e_list) + e_list.remove(e_1) + e_2=random.choice(e_list) + + print(e_1) + print(e_2) + + a_1=random.random() + print(a_1) + + w_sum=e_1[2]['weight']+e_2[2]['weight'] + + G.edges[e_1[0],e_1[1]]['weight']=a_1*w_sum + G.edges[e_2[0],e_2[1]]['weight']=(1-a_1)*w_sum + + return G + + def original_rwcm(G, copy_graph=True): + if copy_graph: + G=copy.deepcopy(G) + + alphas=np.random.rand(len(G.edges())) + alphas=alphas/np.sum(alphas) + + w = [x[2]['weight'] for x in list(G.edges(data=True))] + w_sum=np.sum(w) + aw=alphas*w_sum + + e_list=list(G.edges()) + nx.set_edge_attributes(G,dict(zip(e_list,aw)),'weight') + + print(aw) + return G \ No newline at end of file From 153f7ac374fb2f26a17c758e40c6f99e6cb3188e Mon Sep 17 00:00:00 2001 From: lluc_laptop Date: Tue, 19 Jul 2022 15:54:08 -0400 Subject: [PATCH 2/3] Updated randomized weights configuration model --- netrw/rewire/randomized_weights.py | 93 ++++++++++++++++++++++++++++++ netrw/rewire/rwcm.py | 68 ---------------------- 2 files changed, 93 insertions(+), 68 deletions(-) create mode 100644 netrw/rewire/randomized_weights.py delete mode 100644 netrw/rewire/rwcm.py diff --git a/netrw/rewire/randomized_weights.py b/netrw/rewire/randomized_weights.py new file mode 100644 index 0000000..d796a7c --- /dev/null +++ b/netrw/rewire/randomized_weights.py @@ -0,0 +1,93 @@ +from .base import BaseRewirer +import copy +import itertools as it +import random +import networkx as nx +import numpy as np + + +class RandomizedWeightCM_swap(BaseRewirer): + """ + Swap weights of a weighted network without rewiring edges. + + - rewire_step: Swap weights bewteen two randomly chosen edges + - rewire: Over the list of edges, permutate the list of associated weigths + + 4th method is from Ghavasieh, A.; De Domenico, M. + "Multiscale Information Propagation in Emergent Functional Networks". + Entropy 2021, 23, 1369. https://doi.org/10.3390/e23101369 + """ + + def edge_pair_random_choice(self, G): + e_list = list(G.edges(data=True)) + e_1 = random.choice(e_list) + e_list.remove(e_1) + e_2 = random.choice(e_list) + + return e_1, e_2 + + def rewire_step(self, G, copy_graph=True): + if copy_graph: + G = copy.deepcopy(G) + + e_1, e_2 = self.edge_pair_random_choice(G) + + w_1 = e_1[2]["weight"] + w_2 = e_2[2]["weight"] + + G.edges[e_1[0], e_1[1]]["weight"] = w_2 + G.edges[e_2[0], e_2[1]]["weight"] = w_1 + + return G + + def rewire(self, G, copy_graph=True): + if copy_graph: + G = copy.deepcopy(G) + + e_list = list(G.edges()) + w_list = [x[2]["weight"] for x in list(G.edges(data=True))] + + w_list = np.random.permutation(w_list) + nx.set_edge_attributes(G, dict(zip(e_list, w_list)), "weight") + + return G + + +class RandomizedWeightCM_redistribution(BaseRewirer): + """ + Redistribute weights of a weighted network without rewiring edges. + + - rewire_step: the total sum of weight of a randomly chosen pair of links is randomly re-distributed over this two links + - rewire: The total sum of weights of all links in the netwrok is randomly distributed over the links + """ + + def rewire_step(self, G, copy_graph=True): + if copy_graph: + G = copy.deepcopy(G) + + e_1, e_2 = self.edge_pair_random_choice(G) + + a_1 = random.random() + + w_sum = e_1[2]["weight"] + e_2[2]["weight"] + + G.edges[e_1[0], e_1[1]]["weight"] = a_1 * w_sum + G.edges[e_2[0], e_2[1]]["weight"] = (1 - a_1) * w_sum + + return G + + def rewire(self, G, copy_graph=True): + if copy_graph: + G = copy.deepcopy(G) + + alphas = np.random.rand(len(G.edges())) + alphas = alphas / np.sum(alphas) + + w = [x[2]["weight"] for x in list(G.edges(data=True))] + w_sum = np.sum(w) + aw = alphas * w_sum + + e_list = list(G.edges()) + nx.set_edge_attributes(G, dict(zip(e_list, aw)), "weight") + + return G diff --git a/netrw/rewire/rwcm.py b/netrw/rewire/rwcm.py deleted file mode 100644 index fa0f033..0000000 --- a/netrw/rewire/rwcm.py +++ /dev/null @@ -1,68 +0,0 @@ -from . import BaseRewirer -import copy -import itertools as it -import random -import networkx as nx -import numpy as np - - -class rwcm(BaseRewirer): - - def weigth_swap(G, copy_graph=True): - if copy_graph: - G=copy.deepcopy(G) - - e_list=list(G.edges(data=True)) - e_1=random.choice(e_list) - e_list.remove(e_1) - e_2=random.choice(e_list) - - print(e_1) - print(e_2) - - w_1=e_1[2]['weight'] - w_2=e_2[2]['weight'] - - G.edges[e_1[0],e_1[1]]['weight']=w_2 - G.edges[e_2[0],e_2[1]]['weight']=w_1 - - return G - - def redistribute_weight(G, copy_graph=True): - if copy_graph: - G=copy.deepcopy(G) - - e_list=list(G.edges(data=True)) - e_1=random.choice(e_list) - e_list.remove(e_1) - e_2=random.choice(e_list) - - print(e_1) - print(e_2) - - a_1=random.random() - print(a_1) - - w_sum=e_1[2]['weight']+e_2[2]['weight'] - - G.edges[e_1[0],e_1[1]]['weight']=a_1*w_sum - G.edges[e_2[0],e_2[1]]['weight']=(1-a_1)*w_sum - - return G - - def original_rwcm(G, copy_graph=True): - if copy_graph: - G=copy.deepcopy(G) - - alphas=np.random.rand(len(G.edges())) - alphas=alphas/np.sum(alphas) - - w = [x[2]['weight'] for x in list(G.edges(data=True))] - w_sum=np.sum(w) - aw=alphas*w_sum - - e_list=list(G.edges()) - nx.set_edge_attributes(G,dict(zip(e_list,aw)),'weight') - - print(aw) - return G \ No newline at end of file From d7e592d2254b299eba0fa79f825c63ffe8d50264 Mon Sep 17 00:00:00 2001 From: lluc_laptop Date: Tue, 19 Jul 2022 16:27:47 -0400 Subject: [PATCH 3/3] renamed method names --- netrw/rewire/randomized_weights.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/netrw/rewire/randomized_weights.py b/netrw/rewire/randomized_weights.py index d796a7c..cf61695 100644 --- a/netrw/rewire/randomized_weights.py +++ b/netrw/rewire/randomized_weights.py @@ -26,7 +26,7 @@ def edge_pair_random_choice(self, G): return e_1, e_2 - def rewire_step(self, G, copy_graph=True): + def step_rewire(self, G, copy_graph=True): if copy_graph: G = copy.deepcopy(G) @@ -40,7 +40,7 @@ def rewire_step(self, G, copy_graph=True): return G - def rewire(self, G, copy_graph=True): + def full_rewire(self, G, copy_graph=True): if copy_graph: G = copy.deepcopy(G) @@ -61,7 +61,7 @@ class RandomizedWeightCM_redistribution(BaseRewirer): - rewire: The total sum of weights of all links in the netwrok is randomly distributed over the links """ - def rewire_step(self, G, copy_graph=True): + def step_rewire(self, G, copy_graph=True): if copy_graph: G = copy.deepcopy(G) @@ -76,7 +76,7 @@ def rewire_step(self, G, copy_graph=True): return G - def rewire(self, G, copy_graph=True): + def full_rewire(self, G, copy_graph=True): if copy_graph: G = copy.deepcopy(G)