From 878a97b071e250de66d8982c0f6697fd6c84571a Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Tue, 15 May 2018 09:41:47 -0400 Subject: [PATCH 1/4] DEBUG: Log dropped JoinNodes --- nipype/pipeline/engine/utils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nipype/pipeline/engine/utils.py b/nipype/pipeline/engine/utils.py index 08d357ff64..1dfbd1a932 100644 --- a/nipype/pipeline/engine/utils.py +++ b/nipype/pipeline/engine/utils.py @@ -1055,6 +1055,8 @@ def make_field_func(*pair): # Drop the original JoinNodes; only concerned with # generated Nodes if hasattr(node, 'joinfield'): + logger.warning("Dropping JoinNode: %s; src_id: %s", + node.itername, src_id) continue # Patterns: # - src_id : Non-iterable node From 75451e4253f20f80391d2ffa517fda8b08e86ec5 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Tue, 15 May 2018 09:48:30 -0400 Subject: [PATCH 2/4] ENH: Add debug in case the issue is in the second, more common case --- nipype/pipeline/engine/utils.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nipype/pipeline/engine/utils.py b/nipype/pipeline/engine/utils.py index 1dfbd1a932..70bff1e810 100644 --- a/nipype/pipeline/engine/utils.py +++ b/nipype/pipeline/engine/utils.py @@ -1066,6 +1066,9 @@ def make_field_func(*pair): if re.match(src_id + r'((\.[a-z](I\.[a-z])?|J)\d+)?$', node.itername): expansions[src_id].append(node) + else: + logger.debug("Unmatched pattern: %s; src_id: %s", + node.itername, src_id) for in_id, in_nodes in list(expansions.items()): logger.debug("The join node %s input %s was expanded" " to %d nodes.", jnode, in_id, len(in_nodes)) From 57c1fb61651efd2b1f0f36d314ab44964d0fb4ff Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Fri, 25 May 2018 09:53:35 -0400 Subject: [PATCH 3/4] TEST: Add nested iterables test --- nipype/pipeline/engine/tests/test_join.py | 32 +++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/nipype/pipeline/engine/tests/test_join.py b/nipype/pipeline/engine/tests/test_join.py index 54ff15048f..77fc0f2fdf 100644 --- a/nipype/pipeline/engine/tests/test_join.py +++ b/nipype/pipeline/engine/tests/test_join.py @@ -627,3 +627,35 @@ def sq(x): joinfield=['in1']) wf.connect(square, 'out', square_join, "in1") wf.run() + + +def test_join_nestediters(tmpdir): + tmpdir.chdir() + + def exponent(x, p): + return x ** p + + wf = pe.Workflow('wf', base_dir=tmpdir.strpath) + + xs = pe.Node(IdentityInterface(['x']), + iterables=[('x', [1, 2])], + name='xs') + ps = pe.Node(IdentityInterface(['p']), + iterables=[('p', [3, 4])], + name='ps') + exp = pe.Node(Function(function=exponent), name='exp') + exp_joinx = pe.JoinNode(Merge(1, ravel_inputs=True), + name='exp_joinx', + joinsource='xs', + joinfield=['in1']) + exp_joinp = pe.JoinNode(Merge(1, ravel_inputs=True), + name='exp_joinp', + joinsource='ps', + joinfield=['in1']) + wf.connect([ + (xs, exp, [('x', 'x')]), + (ps, exp, [('p', 'p')]), + (exp, exp_joinx, [('out', 'in1')]), + (exp_joinx, exp_joinp, [('out', 'in1')])]) + + wf.run() From 6c9bb4d2097a201b09fc6372d109139afafe1848 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Fri, 25 May 2018 09:54:03 -0400 Subject: [PATCH 4/4] FIX: Narrow check, update comment, remove warnings --- nipype/pipeline/engine/utils.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/nipype/pipeline/engine/utils.py b/nipype/pipeline/engine/utils.py index 70bff1e810..0a59aac26a 100644 --- a/nipype/pipeline/engine/utils.py +++ b/nipype/pipeline/engine/utils.py @@ -1054,21 +1054,18 @@ def make_field_func(*pair): for src_id in list(old_edge_dict.keys()): # Drop the original JoinNodes; only concerned with # generated Nodes - if hasattr(node, 'joinfield'): - logger.warning("Dropping JoinNode: %s; src_id: %s", - node.itername, src_id) + if hasattr(node, 'joinfield') and node.itername == src_id: continue # Patterns: # - src_id : Non-iterable node - # - src_id.[a-z]\d+ : IdentityInterface w/ iterables - # - src_id.[a-z]I.[a-z]\d+ : Non-IdentityInterface w/ iterables + # - src_id.[a-z]\d+ : + # IdentityInterface w/ iterables or nested JoinNode + # - src_id.[a-z]I.[a-z]\d+ : + # Non-IdentityInterface w/ iterables # - src_idJ\d+ : JoinNode(IdentityInterface) if re.match(src_id + r'((\.[a-z](I\.[a-z])?|J)\d+)?$', node.itername): expansions[src_id].append(node) - else: - logger.debug("Unmatched pattern: %s; src_id: %s", - node.itername, src_id) for in_id, in_nodes in list(expansions.items()): logger.debug("The join node %s input %s was expanded" " to %d nodes.", jnode, in_id, len(in_nodes))