@@ -21,7 +21,7 @@ def symmetrize_matrix(countmat):
2121 """
2222 return scipy .sparse .coo_matrix (0.5 * (countmat + countmat .transpose ()))
2323
24- def make_sink (transmat ,sink_states ):
24+ def _make_sink (transmat ,sink_states ):
2525 """
2626 Constructs a transition matrix with "sink states", where the columns are
2727 replaced with identity vectors (diagonal element = 1, off-diagonals = 0).
@@ -95,7 +95,7 @@ def mult_weights(transmat,tol=1e-6):
9595 banded_mat = trans_mult_iter (transmat ,tol )
9696 return banded_mat [:,0 ]
9797
98- def trans_mult_iter (transmat ,tol ,maxstep = 20 ):
98+ def _trans_mult_iter (transmat ,tol ,maxstep = 20 ):
9999 """
100100 Performs iterative multiplication of transmat until the maximum variation in
101101 the rows is less than tol.
@@ -139,9 +139,9 @@ def committor(transmat,basins,tol=1e-6,maxstep=20):
139139 # make sink_matrix
140140
141141 flat_sink = [i for b in basins for i in b ]
142- sink_mat = make_sink (transmat ,flat_sink )
142+ sink_mat = _make_sink (transmat ,flat_sink )
143143
144- sink_results = trans_mult_iter (sink_mat ,tol ,maxstep )
144+ sink_results = _trans_mult_iter (sink_mat ,tol ,maxstep )
145145
146146 committor = np .zeros ((transmat .shape [0 ],len (basins )),dtype = float )
147147
@@ -160,7 +160,7 @@ def committor(transmat,basins,tol=1e-6,maxstep=20):
160160
161161 return committor
162162
163- def extend (transmat ,hubstates ):
163+ def _extend (transmat ,hubstates ):
164164 """
165165 This function returns an extended transition matrix (2N x 2N)
166166 where one set of states (0..N-1) have NOT yet visited hubstates,
@@ -198,6 +198,27 @@ def extend(transmat,hubstates):
198198 ext_mat = scipy .sparse .coo_matrix ((data , (rows , cols )), shape = (2 * n ,2 * n ))
199199 return ext_mat
200200
201+ def _getring (transmat ,basin ,eig_weights ,tol ,maxstep ):
202+ """
203+ Given a transition matrix, and a set of states that form a basin,
204+ this returns a vector describing how probability exits that basin.
205+ """
206+ # make a matrix with sink states in every non-basin state
207+ n = transmat .shape [0 ]
208+ flat_sink = [i for i in range (n ) if i not in basin ]
209+ sink_mat = _make_sink (transmat ,flat_sink )
210+
211+ # see where the probability goes
212+ sink_results = _trans_mult_iter (sink_mat ,tol ,maxstep )
213+
214+ ringprob = np .zeros ((n ))
215+ for b in basin :
216+ for i in range (n ):
217+ if i not in basin :
218+ ringprob [i ] += sink_results [i ][b ]
219+
220+ return ringprob
221+
201222def hubscores (transmat ,hubstates ,basins ,tol = 1e-6 ,maxstep = 20 ,wts = None ):
202223 """
203224 This function computes hub scores, which are the probabilities that
@@ -228,20 +249,20 @@ def hubscores(transmat,hubstates,basins,tol=1e-6,maxstep=20,wts=None):
228249
229250 # make extended sink_matrix
230251 n = transmat .shape [0 ]
231- ext_transmat = extend (transmat ,hubstates )
252+ ext_transmat = _extend (transmat ,hubstates )
232253
233254 flat_sink = [i for b in basins for i in b ]
234255 flat_sink_ext = flat_sink + [i + n for i in flat_sink ]
235256
236- sink_mat = make_sink (ext_transmat ,flat_sink_ext )
257+ sink_mat = _make_sink (ext_transmat ,flat_sink_ext )
237258
238- sink_results = trans_mult_iter (sink_mat ,tol ,maxstep )
259+ sink_results = _trans_mult_iter (sink_mat ,tol ,maxstep )
239260
240261 if wts is None :
241262 wts = eig_weights (transmat )
242263
243264 h = np .zeros ((2 ,2 ),dtype = float )
244- ring = [getring (transmat ,b ,eig_weights ) for b in basins ]
265+ ring = [_getring (transmat ,b ,eig_weights , tol , maxstep ) for b in basins ]
245266
246267 for source ,sink in [[0 ,1 ],[1 ,0 ]]:
247268 for i ,p in enumerate (ring [source ]):
0 commit comments