annotate tools/myTools/bin/sfa/utils.py @ 1:7e5c71b2e71f draft default tip

Uploaded
author laurenmarazzi
date Wed, 22 Dec 2021 16:00:34 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
1 # -*- coding: utf-8 -*-
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
2 import sys
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
3 if sys.version_info <= (2, 8):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
4 from builtins import super
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
5
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
6 import os
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
7 import codecs
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
8 from collections import defaultdict
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
9
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
10 import numpy as np
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
11 import scipy as sp
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
12 import pandas as pd
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
13 import networkx as nx
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
14
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
15
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
16 __all__ = ["FrozenClass",
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
17 "Singleton",
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
18 "to_networkx_digraph",
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
19 "normalize",
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
20 "rand_swap",
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
21 "rand_flip",
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
22 "rand_weights",
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
23 "rand_structure",
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
24 "get_akey",
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
25 "get_avalue",]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
26
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
27
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
28 class FrozenClass(object):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
29
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
30 __isfrozen = False
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
31
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
32 def __setattr__(self, key, value):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
33 if self.__isfrozen and not hasattr(self, key):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
34 raise TypeError( "%r is a frozen class" % self )
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
35 object.__setattr__(self, key, value)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
36
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
37 def _freeze(self):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
38 self.__isfrozen = True
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
39
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
40 def _melt(self):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
41 self.__isfrozen = False
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
42
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
43 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
44 <Reference>
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
45 http://stackoverflow.com/questions/3603502/prevent-creating-new-attributes-outside-init
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
46 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
47 # end of def FrozenClass
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
48
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
49
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
50 def Singleton(_class):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
51 class __Singleton(_class):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
52 __instance = None
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
53
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
54 def __new__(cls, *args, **kwargs):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
55 if cls.__instance is None:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
56 cls.__instance = super().__new__(cls, *args, **kwargs)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
57
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
58 # Creation and initialization of '__initialized'
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
59 cls.__instance.__initialized = False
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
60 # end of if
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
61 return cls.__instance
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
62
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
63 def __init__(self, *args, **kwargs):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
64 if self.__initialized:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
65 return
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
66
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
67 super().__init__(*args, **kwargs)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
68 self.__initialized = True
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
69
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
70 def __repr__(self):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
71 return '<{0} Singleton object at {1}>'.format(
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
72 _class.__name__, hex(id(self)))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
73
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
74 def __str__(self):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
75 return super().__str__()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
76 # end of def class
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
77
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
78 __Singleton.__name__ = _class.__name__
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
79 return __Singleton
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
80
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
81 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
82 <References>
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
83 http://m.egloos.zum.com/mataeoh/v/7081556
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
84 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
85 # end of def Singleton
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
86
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
87 def normalize(A, norm_in=True, norm_out=True):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
88 # Check whether A is a square matrix
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
89 if A.shape[0] != A.shape[1]:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
90 raise ValueError(
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
91 "The A (adjacency matrix) should be square matrix.")
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
92
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
93 # Build propagation matrix (aka. transition matrix) _W from A
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
94 W = A.copy()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
95
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
96 # Norm. out-degree
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
97 if norm_out == True:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
98 sum_col_A = np.abs(A).sum(axis=0)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
99 sum_col_A[sum_col_A == 0] = 1
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
100 if norm_in == False:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
101 Dc = 1 / sum_col_A
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
102 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
103 Dc = 1 / np.sqrt(sum_col_A)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
104 # end of else
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
105 W = Dc * W # This is not matrix multiplication
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
106
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
107 # Norm. in-degree
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
108 if norm_in == True:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
109 sum_row_A = np.abs(A).sum(axis=1)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
110 sum_row_A[sum_row_A == 0] = 1
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
111 if norm_out == False:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
112 Dr = 1 / sum_row_A
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
113 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
114 Dr = 1 / np.sqrt(sum_row_A)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
115 # end of row
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
116 W = np.multiply(W, np.mat(Dr).T)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
117 # Converting np.mat to ndarray
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
118 # does not cost a lot.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
119 W = W.A
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
120 # end of if
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
121 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
122 The normalization above is the same as the follows:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
123 >>> np.diag(Dr).dot(A.dot(np.diag(Dc)))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
124 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
125 return W
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
126
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
127
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
128 # end of def normalize
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
129
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
130 def to_networkx_digraph(A, n2i=None):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
131 if not n2i:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
132 return nx.from_numpy_array(A, create_using=nx.Digraph)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
133
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
134 i2n = {ix:name for name, ix in n2i.items()}
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
135 dg = nx.DiGraph()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
136 ind_row, ind_col = A.nonzero()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
137 for ix_trg, ix_src in zip(ind_row, ind_col):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
138 name_src = i2n[ix_src]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
139 name_trg = i2n[ix_trg]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
140 sign = np.sign(A[ix_trg, ix_src])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
141 dg.add_edge(name_src, name_trg)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
142 dg.edges[name_src, name_trg]['SIGN'] = sign
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
143 # end of for
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
144 return dg
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
145 # end of for
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
146 # end of def to_networkx_digraph
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
147
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
148 def rand_swap(A, nsamp=10, noself=True, pivots=None, inplace=False):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
149 """Randomly rewire the network connections by swapping.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
150
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
151 Parameters
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
152 ----------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
153 A : numpy.ndarray
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
154 Adjacency matrix (connection matrix).
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
155 nsamp : int, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
156 Number of sampled connections to rewire
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
157 noself : bool, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
158 Whether to allow self-loop link.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
159 pivots : list, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
160 Indices of pivot nodes
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
161 inplace : bool, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
162 Modify the given adjacency matrix for rewiring.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
163
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
164
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
165 Returns
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
166 -------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
167 B : numpy.ndarray
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
168 The randomized matrix.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
169 The reference of the given W is returned, when inplace is True.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
170 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
171
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
172
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
173 if not inplace:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
174 A_org = A
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
175 B = A.copy() #np.array(A, dtype=np.float64)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
176 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
177 A_org = A.copy() #np.array(A, dtype=np.float64)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
178 B = A
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
179
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
180 cnt = 0
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
181 while cnt < nsamp:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
182 ir, ic = B.nonzero()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
183 if pivots:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
184 if np.random.uniform() < 0.5:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
185 isrc1 = np.random.choice(pivots)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
186 nz = B[:, isrc1].nonzero()[0]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
187 if len(nz) == 0:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
188 continue
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
189 itrg1 = np.random.choice(nz)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
190 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
191 itrg1 = np.random.choice(pivots)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
192 nz = B[itrg1, :].nonzero()[0]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
193 if len(nz) == 0:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
194 continue
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
195 isrc1 = np.random.choice(nz)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
196 # if-else
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
197
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
198 itrg2, isrc2 = itrg1, isrc1
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
199 while isrc1 == isrc2 and itrg1 == itrg2:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
200 i2 = np.random.randint(0, ir.size)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
201 itrg2, isrc2 = ir[i2], ic[i2]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
202 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
203 i1, i2 = 0, 0
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
204 while i1 == i2:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
205 i1, i2 = np.random.randint(0, ir.size, 2)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
206
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
207 itrg1, isrc1 = ir[i1], ic[i1]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
208 itrg2, isrc2 = ir[i2], ic[i2]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
209
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
210 if noself:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
211 if itrg2 == isrc1 or itrg1 == isrc2:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
212 continue
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
213
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
214 # Are the swapped links new?
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
215 if B[itrg2, isrc1] == 0 and B[itrg1, isrc2] == 0:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
216 a, b = B[itrg1, isrc1], B[itrg2, isrc2]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
217
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
218 # Are the swapped links in the original network?
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
219 if A_org[itrg2, isrc1] == a and A_org[itrg1, isrc2] == b:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
220 continue
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
221
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
222 B[itrg2, isrc1], B[itrg1, isrc2] = a, b
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
223 B[itrg1, isrc1], B[itrg2, isrc2] = 0, 0
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
224 cnt += 1
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
225 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
226 continue
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
227 # end of while
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
228
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
229 if not inplace:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
230 return B
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
231
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
232
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
233 def rand_flip(A, nsamp=10, pivots=None, inplace=False):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
234 """Randomly flip the signs of connections.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
235
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
236 Parameters
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
237 ----------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
238 A : numpy.ndarray
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
239 Adjacency matrix (connection matrix).
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
240 nsamp : int, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
241 Number of sampled connections to be flipped.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
242 pivots : list, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
243 Indices of pivot nodes
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
244 inplace : bool, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
245 Modify the given adjacency matrix for rewiring.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
246
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
247 Returns
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
248 -------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
249 B : numpy.ndarray
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
250 The randomized matrix.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
251 The reference of the given W is returned, when inplace is True.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
252 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
253 if not inplace:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
254 B = A.copy() #np.array(A, dtype=np.float64)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
255 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
256 B = A
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
257
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
258 ir, ic = B.nonzero()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
259 if pivots:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
260 iflip = np.random.choice(pivots, nsamp)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
261 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
262 iflip = np.random.randint(0, ir.size, nsamp)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
263
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
264 B[ir[iflip], ic[iflip]] *= -1
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
265 return B
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
266
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
267
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
268 def rand_weights(W, lb=-3, ub=3, inplace=False):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
269 """ Randomly sample the weights of connections in W from 10^(lb, ub).
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
270
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
271 Parameters
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
272 ----------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
273 W : numpy.ndarray
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
274 Adjacency (connection) or weight matrix.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
275 lb : float, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
276 The 10's exponent for lower bound
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
277 inplace : bool, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
278 Modify the given adjacency matrix for rewiring.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
279
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
280 Returns
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
281 -------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
282 B : numpy.ndarray
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
283 The randomly sampled weight matrix.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
284 The reference of the given W is returned, when inplace is True.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
285 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
286 if not inplace:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
287 B = np.array(W, dtype=np.float64)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
288 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
289 if not np.issubdtype(W.dtype, np.floating):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
290 raise ValueError("W.dtype given to rand_weights should be "
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
291 "a float type, not %s"%(W.dtype))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
292
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
293 B = W
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
294 # end of if-else
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
295
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
296 ir, ic = B.nonzero()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
297 weights_rand = 10 ** np.random.uniform(lb, ub,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
298 size=(ir.size,))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
299
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
300 B[ir, ic] = weights_rand*np.sign(B[ir, ic], dtype=np.float)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
301 """The above code is equal to the following:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
302
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
303 for i in range(ir.size):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
304 p, q = ir[i], ic[i]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
305 B[p, q] = weights_rand[i] * np.sign(B[p, q], dtype=np.float)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
306 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
307 return B
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
308
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
309
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
310 def rand_structure(A, nswap=10, nflip=10, noself=True, pivots=None, inplace=False):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
311 if not inplace:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
312 B = A.copy()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
313 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
314 B = A
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
315 if nflip > 0:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
316 B = rand_flip(B, nflip, pivots, inplace)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
317 if nswap > 0:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
318 B = rand_swap(B, nswap, noself, pivots, inplace)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
319 return B
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
320
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
321
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
322 def get_akey(d):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
323 """Get a key from a given dictionary.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
324 It returns the first key in d.keys().
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
325
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
326 Parameters
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
327 ----------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
328 d : dict
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
329 Dictionary of objects.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
330
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
331 Returns
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
332 -------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
333 obj : object
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
334 First item of iter(d.keys()).
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
335 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
336 return next(iter(d.keys()))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
337
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
338
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
339 def get_avalue(d):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
340 """Get a value from a given dictionary.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
341 It returns the value designated by sfa.get_akey().
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
342
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
343 Parameters
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
344 ----------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
345 d : dict
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
346 Dictionary of objects.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
347
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
348 Returns
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
349 -------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
350 obj : object
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
351 First item of d[iter(d.keys())].
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
352 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
353 akey = next(iter(d.keys()))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
354 return d[akey]