@@ -616,21 +616,24 @@ def __init__(self, g, sink=None):
616
616
h = g .to_dictionary (multiple_edges = True )
617
617
g = {i : dict (Counter (h [i ])) for i in h }
618
618
else :
619
- vi = {v : g . vertices (). index ( v ) for v in g .vertices ()}
619
+ vi = {v : i for i , v in enumerate ( g .vertices () )}
620
620
ad = g .weighted_adjacency_matrix ()
621
- g = {v : {w : ad [vi [v ], vi [w ]] for w in g .neighbors (v )}
622
- for v in g . vertices () }
621
+ g = {v : {w : ad [vi [v ], vi [w ]] for w in g .neighbor_iterator (v )}
622
+ for v in g }
623
623
else :
624
624
raise SyntaxError (g )
625
625
626
626
# create digraph and initialize some variables
627
627
DiGraph .__init__ (self , g , weighted = True )
628
628
self ._dict = deepcopy (g )
629
+ vertices = self .vertices ()
629
630
if sink is None :
630
- sink = self .vertices ()[0 ]
631
- self ._sink = sink # key for sink
632
- self ._sink_ind = self .vertices ().index (sink )
633
- self ._nonsink_vertices = deepcopy (self .vertices ())
631
+ self ._sink = vertices [0 ]
632
+ self ._sink_ind = 0
633
+ else :
634
+ self ._sink = sink # key for sink
635
+ self ._sink_ind = vertices .index (sink )
636
+ self ._nonsink_vertices = vertices
634
637
del self ._nonsink_vertices [self ._sink_ind ]
635
638
# compute Laplacians:
636
639
self ._laplacian = self .laplacian_matrix (indegree = False )
@@ -1041,8 +1044,8 @@ def _set_in_degrees(self):
1041
1044
sage: '_in_degrees' in s.__dict__
1042
1045
True
1043
1046
"""
1044
- self ._in_degrees = {v : 0 for v in self . vertices () }
1045
- for e in self .edges ():
1047
+ self ._in_degrees = {v : 0 for v in self }
1048
+ for e in self .edge_iterator ():
1046
1049
self ._in_degrees [e [1 ]] += e [2 ]
1047
1050
1048
1051
def in_degree (self , v = None ):
@@ -1977,13 +1980,10 @@ def reorder_vertices(self):
1977
1980
sage: T.dict()
1978
1981
{0: {1: 1}, 1: {0: 1, 2: 1}, 2: {0: 1}}
1979
1982
"""
1980
-
1981
- # first order the vertices according to their distance from the sink
1982
- verts = sorted (self .vertices (),
1983
- key = lambda v : self .distance (v , self ._sink ), reverse = True )
1984
- perm = {}
1985
- for i in range (len (verts )):
1986
- perm [verts [i ]] = i
1983
+ # first order the vertices according to their distance to the sink
1984
+ distance_to_sink = self .reverse ().shortest_path_lengths (self ._sink )
1985
+ verts = sorted (self , key = lambda v : distance_to_sink [v ], reverse = True )
1986
+ perm = {v : i for i , v in enumerate (verts )}
1987
1987
old = self .dict ()
1988
1988
new = {}
1989
1989
for i in old :
@@ -2455,12 +2455,13 @@ def _set_ring(self):
2455
2455
sage: '_ring' in S.__dict__
2456
2456
True
2457
2457
"""
2458
- # first order the vertices according to their distance from the sink
2459
- verts = sorted ( self .vertices (),
2460
- key = lambda v : self . distance ( v , self . _sink ) )
2458
+ # first order the vertices according to their distance to the sink
2459
+ distance_to_sink = self .reverse (). shortest_path_lengths ( self . _sink )
2460
+ verts = sorted ( self , key = lambda v : distance_to_sink [ v ] )
2461
2461
2462
2462
# variable i refers to the i-th vertex in self.vertices()
2463
- names = [self .vertices ().index (v ) for v in reversed (verts )]
2463
+ vertex_to_int = {v : i for i , v in enumerate (self .vertices ())}
2464
+ names = [vertex_to_int [v ] for v in reversed (verts )]
2464
2465
2465
2466
vars = ''
2466
2467
for i in names :
@@ -2471,11 +2472,11 @@ def _set_ring(self):
2471
2472
# create the ideal
2472
2473
gens = []
2473
2474
for i in self .nonsink_vertices ():
2474
- new_gen = 'x' + str (self . vertices (). index ( i ) )
2475
+ new_gen = 'x' + str (vertex_to_int [ i ] )
2475
2476
new_gen += '^' + str (self .out_degree (i ))
2476
2477
new_gen += '-'
2477
2478
for j in self ._dict [i ]:
2478
- new_gen += 'x' + str (self . vertices (). index ( j ) )
2479
+ new_gen += 'x' + str (vertex_to_int [ j ] )
2479
2480
new_gen += '^' + str (self ._dict [i ][j ]) + '*'
2480
2481
new_gen = new_gen [:- 1 ]
2481
2482
gens .append (new_gen )
@@ -3535,7 +3536,7 @@ def fire_vertex(self, v):
3535
3536
"""
3536
3537
c = dict (self )
3537
3538
c [v ] -= self ._sandpile .out_degree (v )
3538
- for e in self ._sandpile .outgoing_edges (v ):
3539
+ for e in self ._sandpile .outgoing_edge_iterator (v ):
3539
3540
if e [1 ] != self ._sandpile .sink ():
3540
3541
c [e [1 ]] += e [2 ]
3541
3542
return SandpileConfig (self ._sandpile ,c )
@@ -3571,7 +3572,7 @@ def fire_script(self, sigma):
3571
3572
for i in range (len (sigma )):
3572
3573
v = self ._vertices [i ]
3573
3574
c [v ] -= sigma [i ]* self ._sandpile .out_degree (v )
3574
- for e in self ._sandpile .outgoing_edges (v ):
3575
+ for e in self ._sandpile .outgoing_edge_iterator (v ):
3575
3576
if e [1 ] != self ._sandpile .sink ():
3576
3577
c [e [1 ]] += sigma [i ]* e [2 ]
3577
3578
return SandpileConfig (self ._sandpile , c )
@@ -3612,7 +3613,7 @@ def fire_unstable(self):
3612
3613
c = dict (self )
3613
3614
for v in self .unstable ():
3614
3615
c [v ] -= self ._sandpile .out_degree (v )
3615
- for e in self ._sandpile .outgoing_edges (v ):
3616
+ for e in self ._sandpile .outgoing_edge_iterator (v ):
3616
3617
if e [1 ] != self ._sandpile .sink ():
3617
3618
c [e [1 ]] += e [2 ]
3618
3619
return SandpileConfig (self ._sandpile ,c )
@@ -3638,7 +3639,7 @@ def _set_stabilize(self):
3638
3639
dm = divmod (c [v ],s .out_degree (v ))
3639
3640
c [v ] = dm [1 ]
3640
3641
firing_vector [v ] += dm [0 ]
3641
- for e in s .outgoing_edges (v ):
3642
+ for e in s .outgoing_edge_iterator (v ):
3642
3643
if e [1 ] != s .sink ():
3643
3644
c [e [1 ]] += dm [0 ]* e [2 ]
3644
3645
unstable = c .unstable ()
@@ -4156,8 +4157,8 @@ def show(self, sink=True, colors=True, heights=False, directed=None, **kwds):
4156
4157
T .delete_vertex (self .sandpile ().sink ())
4157
4158
if heights :
4158
4159
a = {}
4159
- for i in T . vertices () :
4160
- if i == self .sandpile ().sink ():
4160
+ for i in T :
4161
+ if i == self .sandpile ().sink ():
4161
4162
a [i ] = str (i )
4162
4163
else :
4163
4164
a [i ] = str (i )+ ":" + str (self [i ])
@@ -4272,12 +4273,10 @@ def __init__(self, S, D):
4272
4273
"""
4273
4274
if len (D ) == S .num_verts ():
4274
4275
if type (D ) in [dict , SandpileDivisor , SandpileConfig ]:
4275
- dict .__init__ (self ,dict (D ))
4276
+ dict .__init__ (self , dict (D ))
4276
4277
elif isinstance (D , list ):
4277
- div = {}
4278
- for i in range (S .num_verts ()):
4279
- div [S .vertices ()[i ]] = D [i ]
4280
- dict .__init__ (self ,div )
4278
+ div = {v : D [i ] for i , v in enumerate (S .vertices ())}
4279
+ dict .__init__ (self , div )
4281
4280
else :
4282
4281
raise SyntaxError (D )
4283
4282
@@ -4809,8 +4808,8 @@ def fire_vertex(self, v):
4809
4808
"""
4810
4809
D = dict (self )
4811
4810
D [v ] -= self ._sandpile .out_degree (v )
4812
- for e in self ._sandpile .outgoing_edges (v ):
4813
- D [e [1 ]]+= e [2 ]
4811
+ for e in self ._sandpile .outgoing_edge_iterator (v ):
4812
+ D [e [1 ]] += e [2 ]
4814
4813
return SandpileDivisor (self ._sandpile ,D )
4815
4814
4816
4815
def fire_script (self , sigma ):
@@ -4844,8 +4843,8 @@ def fire_script(self, sigma):
4844
4843
for i in range (len (sigma )):
4845
4844
v = self ._vertices [i ]
4846
4845
D [v ] -= sigma [i ]* self ._sandpile .out_degree (v )
4847
- for e in self ._sandpile .outgoing_edges (v ):
4848
- D [e [1 ]]+= sigma [i ]* e [2 ]
4846
+ for e in self ._sandpile .outgoing_edge_iterator (v ):
4847
+ D [e [1 ]] += sigma [i ] * e [2 ]
4849
4848
return SandpileDivisor (self ._sandpile , D )
4850
4849
4851
4850
def unstable (self ):
@@ -4884,8 +4883,8 @@ def fire_unstable(self):
4884
4883
D = dict (self )
4885
4884
for v in self .unstable ():
4886
4885
D [v ] -= self ._sandpile .out_degree (v )
4887
- for e in self ._sandpile .outgoing_edges (v ):
4888
- D [e [1 ]]+= e [2 ]
4886
+ for e in self ._sandpile .outgoing_edge_iterator (v ):
4887
+ D [e [1 ]] += e [2 ]
4889
4888
return SandpileDivisor (self ._sandpile ,D )
4890
4889
4891
4890
def _set_q_reduced (self ):
@@ -6052,9 +6051,7 @@ def show(self, heights=True, directed=None, **kwds):
6052
6051
T = Graph (self .sandpile ())
6053
6052
6054
6053
if heights :
6055
- a = {}
6056
- for i in T .vertices ():
6057
- a [i ] = str (i ) + ":" + str (T [i ])
6054
+ a = {i : str (i ) + ":" + str (T [i ]) for i in T }
6058
6055
T .relabel (a )
6059
6056
T .show (** kwds )
6060
6057
0 commit comments