Skip to content

Commit ac84ef1

Browse files
authored
Merge pull request #2597 from effigies/fix/joinnode
FIX: Correctly connect JoinNodes in nested iterables
2 parents 9eaa2a3 + 6c9bb4d commit ac84ef1

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

nipype/pipeline/engine/tests/test_join.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,3 +627,35 @@ def sq(x):
627627
joinfield=['in1'])
628628
wf.connect(square, 'out', square_join, "in1")
629629
wf.run()
630+
631+
632+
def test_join_nestediters(tmpdir):
633+
tmpdir.chdir()
634+
635+
def exponent(x, p):
636+
return x ** p
637+
638+
wf = pe.Workflow('wf', base_dir=tmpdir.strpath)
639+
640+
xs = pe.Node(IdentityInterface(['x']),
641+
iterables=[('x', [1, 2])],
642+
name='xs')
643+
ps = pe.Node(IdentityInterface(['p']),
644+
iterables=[('p', [3, 4])],
645+
name='ps')
646+
exp = pe.Node(Function(function=exponent), name='exp')
647+
exp_joinx = pe.JoinNode(Merge(1, ravel_inputs=True),
648+
name='exp_joinx',
649+
joinsource='xs',
650+
joinfield=['in1'])
651+
exp_joinp = pe.JoinNode(Merge(1, ravel_inputs=True),
652+
name='exp_joinp',
653+
joinsource='ps',
654+
joinfield=['in1'])
655+
wf.connect([
656+
(xs, exp, [('x', 'x')]),
657+
(ps, exp, [('p', 'p')]),
658+
(exp, exp_joinx, [('out', 'in1')]),
659+
(exp_joinx, exp_joinp, [('out', 'in1')])])
660+
661+
wf.run()

nipype/pipeline/engine/utils.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,12 +1054,14 @@ def make_field_func(*pair):
10541054
for src_id in list(old_edge_dict.keys()):
10551055
# Drop the original JoinNodes; only concerned with
10561056
# generated Nodes
1057-
if hasattr(node, 'joinfield'):
1057+
if hasattr(node, 'joinfield') and node.itername == src_id:
10581058
continue
10591059
# Patterns:
10601060
# - src_id : Non-iterable node
1061-
# - src_id.[a-z]\d+ : IdentityInterface w/ iterables
1062-
# - src_id.[a-z]I.[a-z]\d+ : Non-IdentityInterface w/ iterables
1061+
# - src_id.[a-z]\d+ :
1062+
# IdentityInterface w/ iterables or nested JoinNode
1063+
# - src_id.[a-z]I.[a-z]\d+ :
1064+
# Non-IdentityInterface w/ iterables
10631065
# - src_idJ\d+ : JoinNode(IdentityInterface)
10641066
if re.match(src_id + r'((\.[a-z](I\.[a-z])?|J)\d+)?$',
10651067
node.itername):

0 commit comments

Comments
 (0)