-
Notifications
You must be signed in to change notification settings - Fork 0
/
confmodel.py
71 lines (49 loc) · 1.71 KB
/
confmodel.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
"""
This script creates a configuration model for
bipartite networks
Return a bipartite graph with configuration model
(keeping degree sequence of both sets of nodes but rewiring links)
Parameters
aseq: degree sequence of top nodes
bseq: degree sequence of bottom nodes
Author: Demi Vasques
"""
import networkx as nx
from networkx.algorithms import bipartite
import random
import time
def conf_model(aseq, bseq):
t0 = time.time()
G=nx.empty_graph(0,create_using=nx.Graph())
# length and sum of each sequence
lena=len(aseq)
lenb=len(bseq)
suma=sum(aseq)
sumb=sum(bseq)
if not suma==sumb:
raise networkx.NetworkXError(\
'invalid degree sequences, sum(aseq)!=sum(bseq),%s,%s'\
%(suma,sumb))
G.add_nodes_from(range(lena),bipartite=0)
G.add_nodes_from(range(lena,lena+lenb,1),bipartite=1)
if max(aseq)==0: return G # done if no edges
# build lists of degree-repeated vertex numbers
stubs=[]
stubs.extend([[v]*aseq[v] for v in range(0,lena)])
astubs=[]
astubs=[x for subseq in stubs for x in subseq]
stubs=[]
stubs.extend([[v]*bseq[v-lena] for v in range(lena,lena+lenb)])
bstubs=[]
bstubs=[x for subseq in stubs for x in subseq]
# shuffle lists
random.shuffle(astubs)
random.shuffle(bstubs)
while astubs:
source = astubs.pop()
target = bstubs.pop()
G.add_edge(source,target)
#G.add_edges_from([[astubs[i],bstubs[i]] for i in range(suma)])
#G.name="bipartite_configuration_model"
print 'Running time to create config model network: ' + str(time.time() - t0)
return G