Skip to content

Commit 6f574b0

Browse files
committed
updating to networkx ver.2 (dev): removing all *_iter and adding list(*) in a few places (nodes_iter, in_edges_iter, etc., dont exist in ver 2, but nodes, in_edges, etc., are iterators); had to add .copy to .subgraph for ver 2 (otherwise its a view), but had to keep original code for ver 1
1 parent 4a0bd3d commit 6f574b0

File tree

3 files changed

+38
-31
lines changed

3 files changed

+38
-31
lines changed

nipype/pipeline/engine/tests/test_engine.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ def test_disconnect():
316316
flow1 = pe.Workflow(name='test')
317317
flow1.connect(a, 'a', b, 'a')
318318
flow1.disconnect(a, 'a', b, 'a')
319-
assert flow1._graph.edges() == []
319+
assert list(flow1._graph.edges()) == []
320320

321321

322322
def test_doubleconnect():
@@ -637,7 +637,7 @@ def func1(in1):
637637
n1.inputs.in1 = [1]
638638
eg = w1.run()
639639

640-
node = eg.nodes()[0]
640+
node = list(eg.nodes())[0]
641641
outjson = glob(os.path.join(node.output_dir(), '_0x*.json'))
642642
assert len(outjson) == 1
643643

nipype/pipeline/engine/utils.py

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from functools import reduce
2525
import numpy as np
2626
from ...utils.misc import package_check
27+
from distutils.version import LooseVersion
2728

2829
package_check('networkx', '1.3')
2930

@@ -267,7 +268,7 @@ def _write_detailed_dot(graph, dotfilename):
267268
for n in nx.topological_sort(graph):
268269
nodename = str(n)
269270
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):
271272
for cd in d['connect']:
272273
if isinstance(cd[0], (str, bytes)):
273274
outport = cd[0]
@@ -287,7 +288,7 @@ def _write_detailed_dot(graph, dotfilename):
287288
inputstr += '|<in%s> %s' % (replacefunk(ip), ip)
288289
inputstr += '}'
289290
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):
291292
for cd in d['connect']:
292293
if isinstance(cd[0], (str, bytes)):
293294
outport = cd[0]
@@ -446,7 +447,7 @@ def get_levels(G):
446447
levels = {}
447448
for n in nx.topological_sort(G):
448449
levels[n] = 0
449-
for pred in G.predecessors_iter(n):
450+
for pred in G.predecessors(n):
450451
levels[n] = max(levels[n], levels[pred] + 1)
451452
return levels
452453

@@ -491,9 +492,9 @@ def _merge_graphs(supergraph, nodes, subgraph, nodeid, iterables,
491492
raise Exception(("Execution graph does not have a unique set of node "
492493
"names. Please rerun the workflow"))
493494
edgeinfo = {}
494-
for n in subgraph.nodes():
495+
for n in list(subgraph.nodes()):
495496
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]):
497498
# make sure edge is not part of subgraph
498499
if edge[0] not in subgraph.nodes():
499500
if n._hierarchy + n._id not in list(edgeinfo.keys()):
@@ -514,7 +515,7 @@ def _merge_graphs(supergraph, nodes, subgraph, nodeid, iterables,
514515
Gc = deepcopy(subgraph)
515516
ids = [n._hierarchy + n._id for n in Gc.nodes()]
516517
nodeidx = ids.index(nodeid)
517-
rootnode = Gc.nodes()[nodeidx]
518+
rootnode = list(Gc.nodes())[nodeidx]
518519
paramstr = ''
519520
for key, val in sorted(params.items()):
520521
paramstr = '{}_{}_{}'.format(
@@ -613,10 +614,10 @@ def _node_ports(graph, node):
613614
"""
614615
portinputs = {}
615616
portoutputs = {}
616-
for u, _, d in graph.in_edges_iter(node, data=True):
617+
for u, _, d in graph.in_edges(node, data=True):
617618
for src, dest in d['connect']:
618619
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):
620621
for src, dest in d['connect']:
621622
if isinstance(src, tuple):
622623
srcport = src[0]
@@ -682,7 +683,7 @@ def generate_expanded_graph(graph_in):
682683
logger.debug("PE: expanding iterables")
683684
graph_in = _remove_nonjoin_identity_nodes(graph_in, keep_iterables=True)
684685
# standardize the iterables as {(field, function)} dictionaries
685-
for node in graph_in.nodes_iter():
686+
for node in graph_in.nodes():
686687
if node.iterables:
687688
_standardize_iterables(node)
688689
allprefixes = list('abcdefghijklmnopqrstuvwxyz')
@@ -697,7 +698,7 @@ def generate_expanded_graph(graph_in):
697698
logger.debug("Expanding the iterable node %s..." % inode)
698699

699700
# 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()
701702
if hasattr(node, 'joinsource') and
702703
inode.name == node.joinsource and
703704
nx.has_path(graph_in, inode, node)]
@@ -709,7 +710,7 @@ def generate_expanded_graph(graph_in):
709710
for jnode in jnodes:
710711
in_edges = jedge_dict[jnode] = {}
711712
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):
713714
in_edges[src.itername] = data
714715
edges2remove.append((src, dest))
715716

@@ -726,7 +727,7 @@ def generate_expanded_graph(graph_in):
726727
src_fields = [src_fields]
727728
# find the unique iterable source node in the graph
728729
try:
729-
iter_src = next((node for node in graph_in.nodes_iter()
730+
iter_src = next((node for node in graph_in.nodes()
730731
if node.name == src_name and
731732
nx.has_path(graph_in, node, inode)))
732733
except StopIteration:
@@ -781,7 +782,11 @@ def make_field_func(*pair):
781782
inode._id += ('.' + iterable_prefix + 'I')
782783

783784
# 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()
785790
graph_in = _merge_graphs(graph_in, subnodes,
786791
subgraph, inode._hierarchy + inode._id,
787792
iterables, iterable_prefix, inode.synchronize)
@@ -793,7 +798,7 @@ def make_field_func(*pair):
793798
old_edge_dict = jedge_dict[jnode]
794799
# the edge source node replicates
795800
expansions = defaultdict(list)
796-
for node in graph_in.nodes_iter():
801+
for node in graph_in.nodes():
797802
for src_id, edge_data in list(old_edge_dict.items()):
798803
if node.itername.startswith(src_id):
799804
expansions[src_id].append(node)
@@ -1283,7 +1288,7 @@ def write_workflow_prov(graph, filename=None, format='all'):
12831288

12841289
# add dependencies (edges)
12851290
# Process->Process
1286-
for idx, edgeinfo in enumerate(graph.in_edges_iter()):
1291+
for idx, edgeinfo in enumerate(graph.in_edges()):
12871292
ps.g.wasStartedBy(processes[nodes.index(edgeinfo[1])],
12881293
starter=processes[nodes.index(edgeinfo[0])])
12891294

@@ -1295,7 +1300,7 @@ def write_workflow_prov(graph, filename=None, format='all'):
12951300
def topological_sort(graph, depth_first=False):
12961301
"""Returns a depth first sorted order if depth_first is True
12971302
"""
1298-
nodesort = nx.topological_sort(graph)
1303+
nodesort = list(nx.topological_sort(graph))
12991304
if not depth_first:
13001305
return nodesort, None
13011306
logger.debug("Performing depth first search")

nipype/pipeline/engine/workflows.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ def connect(self, *args, **kwargs):
185185
# check to see which ports of destnode are already
186186
# connected.
187187
if not disconnect and (destnode in self._graph.nodes()):
188-
for edge in self._graph.in_edges_iter(destnode):
188+
for edge in self._graph.in_edges(destnode):
189189
data = self._graph.get_edge_data(*edge)
190190
for sourceinfo, destname in data['connect']:
191191
if destname not in connected_ports[destnode]:
@@ -506,8 +506,8 @@ def export(self, filename=None, prefix="output", format="python",
506506
else:
507507
lines.append(line)
508508
# write connections
509-
for u, _, d in flatgraph.in_edges_iter(nbunch=node,
510-
data=True):
509+
for u, _, d in flatgraph.in_edges(nbunch=node,
510+
data=True):
511511
for cd in d['connect']:
512512
if isinstance(cd[0], tuple):
513513
args = list(cd[0])
@@ -633,7 +633,7 @@ def _write_report_info(self, workingdir, name, graph):
633633
total=N,
634634
name='Group_%05d' % gid))
635635
json_dict['maxN'] = maxN
636-
for u, v in graph.in_edges_iter():
636+
for u, v in graph.in_edges():
637637
json_dict['links'].append(dict(source=nodes.index(u),
638638
target=nodes.index(v),
639639
value=1))
@@ -654,7 +654,7 @@ def getname(u, i):
654654
json_dict = []
655655
for i, node in enumerate(nodes):
656656
imports = []
657-
for u, v in graph.in_edges_iter(nbunch=node):
657+
for u, v in graph.in_edges(nbunch=node):
658658
imports.append(getname(u, nodes.index(u)))
659659
json_dict.append(dict(name=getname(node, i),
660660
size=1,
@@ -669,7 +669,7 @@ def _set_needed_outputs(self, graph):
669669
return
670670
for node in graph.nodes():
671671
node.needed_outputs = []
672-
for edge in graph.out_edges_iter(node):
672+
for edge in graph.out_edges(node):
673673
data = graph.get_edge_data(*edge)
674674
sourceinfo = [v1[0] if isinstance(v1, tuple) else v1
675675
for v1, v2 in data['connect']]
@@ -683,7 +683,7 @@ def _configure_exec_nodes(self, graph):
683683
"""
684684
for node in graph.nodes():
685685
node.input_source = {}
686-
for edge in graph.in_edges_iter(node):
686+
for edge in graph.in_edges(node):
687687
data = graph.get_edge_data(*edge)
688688
for sourceinfo, field in data['connect']:
689689
node.input_source[field] = \
@@ -758,8 +758,8 @@ def _get_inputs(self):
758758
setattr(inputdict, node.name, node.inputs)
759759
else:
760760
taken_inputs = []
761-
for _, _, d in self._graph.in_edges_iter(nbunch=node,
762-
data=True):
761+
for _, _, d in self._graph.in_edges(nbunch=node,
762+
data=True):
763763
for cd in d['connect']:
764764
taken_inputs.append(cd[1])
765765
unconnectedinputs = TraitedSpec()
@@ -864,7 +864,8 @@ def _generate_flatgraph(self):
864864
# use in_edges instead of in_edges_iter to allow
865865
# disconnections to take place properly. otherwise, the
866866
# edge dict is modified.
867-
for u, _, d in self._graph.in_edges(nbunch=node, data=True):
867+
# dj: added list() for networkx ver.2
868+
for u, _, d in list(self._graph.in_edges(nbunch=node, data=True)):
868869
logger.debug('in: connections-> %s', to_str(d['connect']))
869870
for cd in deepcopy(d['connect']):
870871
logger.debug("in: %s", to_str(cd))
@@ -877,7 +878,8 @@ def _generate_flatgraph(self):
877878
self.disconnect(u, cd[0], node, cd[1])
878879
self.connect(srcnode, srcout, dstnode, dstin)
879880
# do not use out_edges_iter for reasons stated in in_edges
880-
for _, v, d in self._graph.out_edges(nbunch=node, data=True):
881+
# dj: for ver 2 use list(out_edges)
882+
for _, v, d in list(self._graph.out_edges(nbunch=node, data=True)):
881883
logger.debug('out: connections-> %s', to_str(d['connect']))
882884
for cd in deepcopy(d['connect']):
883885
logger.debug("out: %s", to_str(cd))
@@ -965,7 +967,7 @@ def _get_dot(self, prefix=None, hierarchy=None, colored=False,
965967
simple_form=simple_form, level=level + 3))
966968
dotlist.append('}')
967969
else:
968-
for subnode in self._graph.successors_iter(node):
970+
for subnode in self._graph.successors(node):
969971
if node._hierarchy != subnode._hierarchy:
970972
continue
971973
if not isinstance(subnode, Workflow):
@@ -980,7 +982,7 @@ def _get_dot(self, prefix=None, hierarchy=None, colored=False,
980982
subnodename))
981983
logger.debug('connection: %s', dotlist[-1])
982984
# add between workflow connections
983-
for u, v, d in self._graph.edges_iter(data=True):
985+
for u, v, d in self._graph.edges(data=True):
984986
uname = '.'.join(hierarchy + [u.fullname])
985987
vname = '.'.join(hierarchy + [v.fullname])
986988
for src, dest in d['connect']:

0 commit comments

Comments
 (0)