annotate tools/myTools/bin/sfa/vis/sfv/sfv.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 import numpy as np
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
2 import networkx as nx
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
3
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
4 from qtpy.QtGui import QFont
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
5 from qtpy.QtGui import QColor
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
6 from qtpy.QtCore import QPointF
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
7 from qtpy.QtCore import Qt
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
8
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
9 import sfv
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
10 from sfv.graphics import LabelClassFactory
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
11 from sfv.graphics import HeaderClassFactory
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
12
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
13 import sfa
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
14
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
15 NegHeader = HeaderClassFactory.create('HAMMER')
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
16 PosHeader = HeaderClassFactory.create('ARROW')
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
17 TextLabel = LabelClassFactory.create('TEXT_LABEL')
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
18
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
19 def create_from_graphics(net, abbr=None, inputs=None, outputs=None):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
20 """Create sfv.base.Data object from SIF file.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
21
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
22 Parameters
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
23 ----------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
24 net : sfv.graphics.Network
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
25 Network graphics object of SFV.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
26 abbr : str
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
27 Abbreviation to denote this data object for the network.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
28 inputs : dict, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
29 Input information with default values
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
30 outputs : sequence, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
31 Output information.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
32
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
33 Returns
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
34 -------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
35 obj : sfv.base.Data
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
36 Data object with the information of network topology.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
37
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
38 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
39
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
40 if not abbr:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
41 abbr = net.name
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
42
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
43 class __Data(sfa.base.Data):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
44 def __init__(self):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
45 self._abbr = abbr
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
46 self._name = self._abbr
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
47
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
48 self._dg = sfv.to_networkx(net)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
49 nodes = sorted(self._dg.nodes)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
50 self._n2i = {name: i for i, name in enumerate(nodes)}
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
51 self._i2n = {idx: name for name, idx in self._n2i.items()}
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
52
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
53 self._A = nx.to_numpy_array(self._dg, nodes).T
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
54 ir, ic = self._A.nonzero()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
55 for i in range(ir.size):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
56 r, c = ir[i], ic[i]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
57
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
58 src = self._i2n[c]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
59 tgt = self._i2n[r]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
60 sign = self._dg.edges[src, tgt]['SIGN']
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
61 self._A[r, c] *= sign
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
62
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
63 self._inputs = inputs
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
64
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
65 if outputs:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
66 self._outputs = outputs
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
67
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
68 # The following members are not defined due to the lack of data.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
69 self._df_conds = None
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
70 self._df_exp = None
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
71 self._df_ptb = None
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
72 self._has_link_perturb = False
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
73 self._names_ptb = None
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
74 self._iadj_to_idf = None
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
75 # end of def __init__
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 class_name = ''.join([c for c in abbr.title() if c.isalnum()])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
79 __Data.__name__ = class_name + "Data"
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
80 return __Data()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
81
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
82
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
83 def visualize_signal_flow(net, F, act,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
84 A,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
85 n2i,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
86 color_up=None, color_dn=None,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
87 lw_min=1.0,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
88 lw_max=10.0,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
89 pct_link=90,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
90 show_label=True,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
91 show_act=True,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
92 pct_act=50,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
93 fmt_act='%.5f',
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
94 fix_node_size=False,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
95 fix_act_label=False,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
96 font=None):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
97 """Visualize signal flow using SFV.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
98
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
99 SFV (Seamless Flow Visualization) is a light-weight,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
100 programming-oriented python package to visualize
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
101 graphs and networks.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
102
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
103 This function is used in the SFV function,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
104 'execute(nav, net)', which is called in SFV program.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
105
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
106 Parameters
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
107 ----------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
108 net : sfv.graphics.Network
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
109 Network object that is given by sfv.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
110
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
111 F : numpy.ndarray
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
112 A matrix of signal flows.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
113 It is usually calculated as W2*x1 - W1*x1,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
114 where W is weight matrix and
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
115 x is a vector of activities at steady-state.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
116
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
117 act : numpy.ndarray
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
118 Change in the activities. It is usually calculated
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
119 as x2 - x1, where x is
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
120 the a vector of activities at steady-state.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
121
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
122 A : numpy.ndarray
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
123 Adjacency matrix of the network.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
124
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
125 n2i : dict
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
126 Name to index dictionary.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
127
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
128 color_up : numpy.ndarray or QtGui.QColor, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
129 Default is blue (i.e., QColor(0, 0, 255)),
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
130 if it is None.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
131
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
132 color_dn : numpy.ndarray or QtGui.QColor, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
133 Default is red (i.e., QColor(255, 0, 0)),
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
134 if it is None.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
135
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
136 lw_min : float, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
137 Minimum link width, which is also used for unchanged flow.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
138
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
139 lw_max : float, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
140 Maximum link width.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
141
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
142 pct_link : int, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
143 Percentile of link width, which is used to set
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
144 the maximum value for setting link widths.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
145 Default value is 90.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
146
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
147 show_label : bool, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
148 Show node label or not.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
149
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
150 show_act : bool, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
151 Show activity label or not.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
152
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
153 pct_act : int, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
154 Percentile of activity, which is used to set
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
155 the maximum value for coloring nodes.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
156 Default value is 50.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
157
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
158 fmt_act : str, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
159 Format string for activity label.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
160
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
161 fix_node_size : bool, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
162 Change the size of node or not.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
163 Default is False.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
164
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
165 fix_act_label : bool, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
166 Change the graphics of activity label or not.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
167 The activity value is changed irrespective of
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
168 this parameter. Default is False.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
169
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
170 font : QFont, optional
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
171 Font for the name and activity labels.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
172
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
173 Returns
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
174 -------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
175 None
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
176 """
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
177
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
178 i2n = {val:key for key, val in n2i.items()}
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
179 color_white = np.array([255, 255, 255])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
180
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
181 if not color_up:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
182 color_up = np.array([255, 0, 0])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
183 elif isinstance(color_up, QColor):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
184 color_up = np.array([color_up.red(),
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
185 color_up.green(),
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
186 color_up.blue()])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
187 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
188 raise ValueError("color_up should be 3-dimensional np.ndarray "
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
189 "or QtGui.QColor")
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
190
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
191 if not color_dn:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
192 color_dn = np.array([0, 0, 255])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
193 elif isinstance(color_dn, QColor):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
194 color_dn = np.array([color_dn.red(),
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
195 color_dn.green(),
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
196 color_dn.blue()])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
197 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
198 raise ValueError("color_dn should be 3-dimensional np.ndarray "
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
199 "or QtGui.QColor")
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
200
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
201 # Set the default font
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
202 if not font:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
203 font = QFont('Arial', 10)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
204
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
205 abs_act = np.abs(act)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
206 thr = np.percentile(abs_act, pct_act)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
207 thr = 1 if thr == 0 else thr
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
208
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
209 arr_t = np.zeros_like(act)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
210
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
211 for i, elem in enumerate(act):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
212 t = np.clip(np.abs(elem)/thr, a_min=0, a_max=1)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
213 arr_t[i] = t
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
214
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
215 for iden, node in net.nodes.items():
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
216 idx = n2i[iden]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
217
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
218 if not fix_node_size:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
219 radius = 20
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
220 node.width = node.height = radius
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
221
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
222 fold = act[idx]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
223
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
224 if fold > 0:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
225 color = color_white + arr_t[idx] * (color_up - color_white)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
226 elif fold <= 0:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
227 color = color_white + arr_t[idx] * (color_dn - color_white)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
228
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
229 color = np.int32(color)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
230 node['FILL_COLOR'] = QColor(*color)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
231 node['BORDER_WIDTH'] = 2
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
232 node['BORDER_COLOR'] = QColor(40, 40, 40)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
233
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
234 if show_label:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
235 _update_single_label_name(net, node, node.name,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
236 fix_node_size, font)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
237
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
238 if show_act:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
239 _update_single_label_activity(net, node, fold,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
240 fix_act_label,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
241 fmt_act, font)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
242 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
243 iden_label = '%s_act' % iden.upper()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
244 if iden_label in net.labels:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
245 net.remove_label(net.labels[iden_label])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
246 # end of for : update nodes and labels
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
247
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
248 _update_links(net, A, F, i2n, pct_link, lw_min, lw_max)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
249
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
250
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
251 def _update_links(net, A, F, i2n, pct_link, lw_min, lw_max):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
252 log_flows = np.log10(np.abs(F[F.nonzero()]))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
253 flow_max = log_flows.max()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
254 flow_min = log_flows.min()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
255 flow_thr = np.percentile(log_flows, pct_link)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
256
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
257 ir, ic = A.nonzero() #F.nonzero()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
258 for i, j in zip(ir, ic):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
259 tgt = i2n[i]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
260 src = i2n[j]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
261 f = F[i, j]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
262
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
263 link = net.nxdg[src][tgt]['VIS']
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
264
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
265 header_old = link.header
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
266 args_header = header_old.width, header_old.height, header_old.offset
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
267 if f > 0:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
268 header = PosHeader(*args_header)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
269 color_link = QColor(255, 10, 10, 70)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
270 elif f < 0:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
271 header = NegHeader(*args_header)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
272 color_link = QColor(10, 10, 255, 70)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
273 else: # When flow is zero, show the sign of the original link.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
274 if A[i, j]>0:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
275 header = PosHeader(*args_header)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
276 elif A[i, j]<0:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
277 header = NegHeader(*args_header)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
278 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
279 raise RuntimeError("The logic is abnormal.")
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
280
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
281 color_link = QColor(100, 100, 100, 100)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
282
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
283 link.header = header
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
284 link['FILL_COLOR'] = color_link
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
285
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
286 if f == 0:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
287 link.width = lw_min
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
288 elif (flow_max - flow_min) == 0:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
289 link.width = 0.5*(lw_max + lw_min)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
290 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
291 log_f = np.log10(np.abs(f))
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
292 log_f = np.clip(log_f, a_min=flow_min, a_max=flow_thr)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
293 lw = (log_f-flow_min)/(flow_max-flow_min)*(lw_max-lw_min) + lw_min
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
294 link.width = lw
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
295
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
296
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
297 def _update_single_label_name(net, node, name,
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
298 fix_node_size, font):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
299 label_name = net.labels[name]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
300
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
301 lightness = QColor(node['FILL_COLOR']).lightness()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
302 label_name['TEXT_COLOR'] = Qt.black
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
303
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
304 label_name['FONT'] = font
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
305
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
306 if lightness < 200:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
307 label_name['TEXT_COLOR'] = Qt.white
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
308 label_name['FONT_BOLD'] = True
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
309 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
310 label_name['TEXT_COLOR'] = Qt.black
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
311 label_name['FONT_BOLD'] = False
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
312
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
313 rect = label_name.boundingRect()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
314 label_name.setPos(-rect.width() / 2, -rect.height() / 2) # center
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
315 if not fix_node_size:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
316 node.width = 1.1 * rect.width()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
317 node.height = 1.1 * rect.height()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
318
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
319
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
320 def _update_single_label_activity(net, node, x, fix_act_label, fmt, font):
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
321 iden = '%s_act' % node.iden.upper()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
322 str_x = fmt % (x)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
323 if iden not in net.labels:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
324 label_act = TextLabel(node, text=str_x)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
325 label_act.iden = iden
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
326 else:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
327 label_act = net.labels[iden]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
328 label_act.text = str_x % (x)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
329
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
330 if not fix_act_label:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
331 label_act['FONT'] = font
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
332 label_act['TEXT_COLOR'] = QColor(20, 20, 20)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
333 rect = label_act.boundingRect()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
334 pos_x = node.width/2 + 0.5
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
335 label_act.setPos(pos_x, -rect.height() / 2)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
336
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
337 if iden not in net.labels:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
338 net.add_label(label_act)