24
24
from functools import reduce
25
25
import numpy as np
26
26
from ...utils .misc import package_check
27
+ from distutils .version import LooseVersion
27
28
28
29
package_check ('networkx' , '1.3' )
29
30
@@ -267,7 +268,7 @@ def _write_detailed_dot(graph, dotfilename):
267
268
for n in nx .topological_sort (graph ):
268
269
nodename = str (n )
269
270
inports = []
270
- for u , v , d in graph .in_edges_iter (nbunch = n , data = True ):
271
+ for u , v , d in graph .in_edges (nbunch = n , data = True ):
271
272
for cd in d ['connect' ]:
272
273
if isinstance (cd [0 ], (str , bytes )):
273
274
outport = cd [0 ]
@@ -287,7 +288,7 @@ def _write_detailed_dot(graph, dotfilename):
287
288
inputstr += '|<in%s> %s' % (replacefunk (ip ), ip )
288
289
inputstr += '}'
289
290
outports = []
290
- for u , v , d in graph .out_edges_iter (nbunch = n , data = True ):
291
+ for u , v , d in graph .out_edges (nbunch = n , data = True ):
291
292
for cd in d ['connect' ]:
292
293
if isinstance (cd [0 ], (str , bytes )):
293
294
outport = cd [0 ]
@@ -446,7 +447,7 @@ def get_levels(G):
446
447
levels = {}
447
448
for n in nx .topological_sort (G ):
448
449
levels [n ] = 0
449
- for pred in G .predecessors_iter (n ):
450
+ for pred in G .predecessors (n ):
450
451
levels [n ] = max (levels [n ], levels [pred ] + 1 )
451
452
return levels
452
453
@@ -491,9 +492,9 @@ def _merge_graphs(supergraph, nodes, subgraph, nodeid, iterables,
491
492
raise Exception (("Execution graph does not have a unique set of node "
492
493
"names. Please rerun the workflow" ))
493
494
edgeinfo = {}
494
- for n in subgraph .nodes ():
495
+ for n in list ( subgraph .nodes () ):
495
496
nidx = ids .index (n ._hierarchy + n ._id )
496
- for edge in supergraph .in_edges_iter ( supernodes [nidx ]):
497
+ for edge in supergraph .in_edges ( list ( supernodes ) [nidx ]):
497
498
# make sure edge is not part of subgraph
498
499
if edge [0 ] not in subgraph .nodes ():
499
500
if n ._hierarchy + n ._id not in list (edgeinfo .keys ()):
@@ -514,7 +515,7 @@ def _merge_graphs(supergraph, nodes, subgraph, nodeid, iterables,
514
515
Gc = deepcopy (subgraph )
515
516
ids = [n ._hierarchy + n ._id for n in Gc .nodes ()]
516
517
nodeidx = ids .index (nodeid )
517
- rootnode = Gc .nodes ()[nodeidx ]
518
+ rootnode = list ( Gc .nodes () )[nodeidx ]
518
519
paramstr = ''
519
520
for key , val in sorted (params .items ()):
520
521
paramstr = '{}_{}_{}' .format (
@@ -613,10 +614,10 @@ def _node_ports(graph, node):
613
614
"""
614
615
portinputs = {}
615
616
portoutputs = {}
616
- for u , _ , d in graph .in_edges_iter (node , data = True ):
617
+ for u , _ , d in graph .in_edges (node , data = True ):
617
618
for src , dest in d ['connect' ]:
618
619
portinputs [dest ] = (u , src )
619
- for _ , v , d in graph .out_edges_iter (node , data = True ):
620
+ for _ , v , d in graph .out_edges (node , data = True ):
620
621
for src , dest in d ['connect' ]:
621
622
if isinstance (src , tuple ):
622
623
srcport = src [0 ]
@@ -682,7 +683,7 @@ def generate_expanded_graph(graph_in):
682
683
logger .debug ("PE: expanding iterables" )
683
684
graph_in = _remove_nonjoin_identity_nodes (graph_in , keep_iterables = True )
684
685
# standardize the iterables as {(field, function)} dictionaries
685
- for node in graph_in .nodes_iter ():
686
+ for node in graph_in .nodes ():
686
687
if node .iterables :
687
688
_standardize_iterables (node )
688
689
allprefixes = list ('abcdefghijklmnopqrstuvwxyz' )
@@ -697,7 +698,7 @@ def generate_expanded_graph(graph_in):
697
698
logger .debug ("Expanding the iterable node %s..." % inode )
698
699
699
700
# the join successor nodes of the current iterable node
700
- jnodes = [node for node in graph_in .nodes_iter ()
701
+ jnodes = [node for node in graph_in .nodes ()
701
702
if hasattr (node , 'joinsource' ) and
702
703
inode .name == node .joinsource and
703
704
nx .has_path (graph_in , inode , node )]
@@ -709,7 +710,7 @@ def generate_expanded_graph(graph_in):
709
710
for jnode in jnodes :
710
711
in_edges = jedge_dict [jnode ] = {}
711
712
edges2remove = []
712
- for src , dest , data in graph_in .in_edges_iter (jnode , True ):
713
+ for src , dest , data in graph_in .in_edges (jnode , True ):
713
714
in_edges [src .itername ] = data
714
715
edges2remove .append ((src , dest ))
715
716
@@ -726,7 +727,7 @@ def generate_expanded_graph(graph_in):
726
727
src_fields = [src_fields ]
727
728
# find the unique iterable source node in the graph
728
729
try :
729
- iter_src = next ((node for node in graph_in .nodes_iter ()
730
+ iter_src = next ((node for node in graph_in .nodes ()
730
731
if node .name == src_name and
731
732
nx .has_path (graph_in , node , inode )))
732
733
except StopIteration :
@@ -781,7 +782,11 @@ def make_field_func(*pair):
781
782
inode ._id += ('.' + iterable_prefix + 'I' )
782
783
783
784
# merge the iterated subgraphs
784
- subgraph = graph_in .subgraph (subnodes )
785
+ # dj: the behaviour of .copy changes in version 2
786
+ if LooseVersion (nx .__version__ ) < LooseVersion ('2' ):
787
+ subgraph = graph_in .subgraph (subnodes )
788
+ else :
789
+ subgraph = graph_in .subgraph (subnodes ).copy ()
785
790
graph_in = _merge_graphs (graph_in , subnodes ,
786
791
subgraph , inode ._hierarchy + inode ._id ,
787
792
iterables , iterable_prefix , inode .synchronize )
@@ -793,7 +798,7 @@ def make_field_func(*pair):
793
798
old_edge_dict = jedge_dict [jnode ]
794
799
# the edge source node replicates
795
800
expansions = defaultdict (list )
796
- for node in graph_in .nodes_iter ():
801
+ for node in graph_in .nodes ():
797
802
for src_id , edge_data in list (old_edge_dict .items ()):
798
803
if node .itername .startswith (src_id ):
799
804
expansions [src_id ].append (node )
@@ -1283,7 +1288,7 @@ def write_workflow_prov(graph, filename=None, format='all'):
1283
1288
1284
1289
# add dependencies (edges)
1285
1290
# Process->Process
1286
- for idx , edgeinfo in enumerate (graph .in_edges_iter ()):
1291
+ for idx , edgeinfo in enumerate (graph .in_edges ()):
1287
1292
ps .g .wasStartedBy (processes [nodes .index (edgeinfo [1 ])],
1288
1293
starter = processes [nodes .index (edgeinfo [0 ])])
1289
1294
@@ -1295,7 +1300,7 @@ def write_workflow_prov(graph, filename=None, format='all'):
1295
1300
def topological_sort (graph , depth_first = False ):
1296
1301
"""Returns a depth first sorted order if depth_first is True
1297
1302
"""
1298
- nodesort = nx .topological_sort (graph )
1303
+ nodesort = list ( nx .topological_sort (graph ) )
1299
1304
if not depth_first :
1300
1305
return nodesort , None
1301
1306
logger .debug ("Performing depth first search" )
0 commit comments