def test_itersource_expansion(): import nipype.pipeline.engine as pe wf1 = pe.Workflow(name='test') node1 = pe.Node(TestInterface(), name='node1') node1.iterables = ('input1', [1, 2]) node2 = pe.Node(TestInterface(), name='node2') wf1.connect(node1, 'output1', node2, 'input1') node3 = pe.Node(TestInterface(), name='node3') node3.itersource = ('node1', 'input1') node3.iterables = [('input1', {1: [3, 4], 2: [5, 6, 7]})] wf1.connect(node2, 'output1', node3, 'input1') node4 = pe.Node(TestInterface(), name='node4') wf1.connect(node3, 'output1', node4, 'input1') wf3 = pe.Workflow(name='group') for i in [0, 1, 2]: wf3.add_nodes([wf1.clone(name='test%d' % i)]) wf3._flatgraph = wf3._create_flat_graph() # each expanded graph clone has: # 2 node1 expansion nodes, # 1 node2 per node1 replicate, # 2 node3 replicates for the node1 input1 value 1, # 3 node3 replicates for the node1 input1 value 2 and # 1 node4 successor per node3 replicate # => 2 + 2 + (2 + 3) + 5 = 14 nodes per expanded graph clone # => 3 * 14 = 42 nodes in the group yield assert_equal, len( pe.generate_expanded_graph(wf3._flatgraph).nodes()), 42
def test_identitynode_removal(): def test_function(arg1, arg2, arg3): import numpy as np return (np.array(arg1) + arg2 + arg3).tolist() wf = pe.Workflow(name="testidentity") n1 = pe.Node(niu.IdentityInterface(fields=['a', 'b']), name='src') n1.iterables = ('b', [0, 1, 2, 3]) n1.inputs.a = [0, 1, 2, 3] n2 = pe.Node(niu.Select(), name='selector') wf.connect(n1, ('a', test_function, 1, -1), n2, 'inlist') wf.connect(n1, 'b', n2, 'index') n3 = pe.Node(niu.IdentityInterface(fields=['c', 'd']), name='passer') n3.inputs.c = [1, 2, 3, 4] wf.connect(n2, 'out', n3, 'd') n4 = pe.Node(niu.Select(), name='selector2') wf.connect(n3, ('c', test_function, 1, -1), n4, 'inlist') wf.connect(n3, 'd', n4, 'index') fg = wf._create_flat_graph() wf._set_needed_outputs(fg) eg = pe.generate_expanded_graph(deepcopy(fg)) yield assert_equal, len(eg.nodes()), 8
def test_itersource_synchronize2_expansion(): import nipype.pipeline.engine as pe wf1 = pe.Workflow(name='test') node1 = pe.Node(TestInterface(), name='node1') node1.iterables = [('input1', [1, 2]), ('input2', [3, 4])] node1.synchronize = True node2 = pe.Node(TestInterface(), name='node2') wf1.connect(node1, 'output1', node2, 'input1') node3 = pe.Node(TestInterface(), name='node3') node3.itersource = ('node1', ['input1', 'input2']) node3.synchronize = True node3.iterables = [('input1', 'input2'), { (1, 3): [(5, 7), (6, 8)], (2, 4): [(None, 9)] }] wf1.connect(node2, 'output1', node3, 'input1') node4 = pe.Node(TestInterface(), name='node4') wf1.connect(node3, 'output1', node4, 'input1') wf3 = pe.Workflow(name='group') for i in [0, 1, 2]: wf3.add_nodes([wf1.clone(name='test%d' % i)]) wf3._flatgraph = wf3._create_flat_graph() # each expanded graph clone has: # 2 node1 expansion nodes, # 1 node2 per node1 replicate, # 2 node3 replicates for the node1 input1 value 1, # 1 node3 replicates for the node1 input1 value 2 and # 1 node4 successor per node3 replicate # => 2 + 2 + (2 + 1) + 3 = 10 nodes per expanded graph clone # => 3 * 10 = 30 nodes in the group yield assert_equal, len( pe.generate_expanded_graph(wf3._flatgraph).nodes()), 30
def test_itersource_expansion(): import nipype.pipeline.engine as pe wf1 = pe.Workflow(name='test') node1 = pe.Node(TestInterface(), name='node1') node1.iterables = ('input1', [1, 2]) node2 = pe.Node(TestInterface(), name='node2') wf1.connect(node1, 'output1', node2, 'input1') node3 = pe.Node(TestInterface(), name='node3') node3.itersource = ('node1', 'input1') node3.iterables = [('input1', {1: [3, 4], 2: [5, 6, 7]})] wf1.connect(node2, 'output1', node3, 'input1') node4 = pe.Node(TestInterface(), name='node4') wf1.connect(node3, 'output1', node4, 'input1') wf3 = pe.Workflow(name='group') for i in [0, 1, 2]: wf3.add_nodes([wf1.clone(name='test%d' % i)]) wf3._flatgraph = wf3._create_flat_graph() # each expanded graph clone has: # 2 node1 expansion nodes, # 1 node2 per node1 replicate, # 2 node3 replicates for the node1 input1 value 1, # 3 node3 replicates for the node1 input1 value 2 and # 1 node4 successor per node3 replicate # => 2 + 2 + (2 + 3) + 5 = 14 nodes per expanded graph clone # => 3 * 14 = 42 nodes in the group yield assert_equal, len(pe.generate_expanded_graph(wf3._flatgraph).nodes()), 42
def test_itersource_synchronize2_expansion(): import nipype.pipeline.engine as pe wf1 = pe.Workflow(name='test') node1 = pe.Node(TestInterface(), name='node1') node1.iterables = [('input1', [1, 2]), ('input2', [3, 4])] node1.synchronize = True node2 = pe.Node(TestInterface(), name='node2') wf1.connect(node1, 'output1', node2, 'input1') node3 = pe.Node(TestInterface(), name='node3') node3.itersource = ('node1', ['input1', 'input2']) node3.synchronize = True node3.iterables = [('input1', 'input2'), {(1, 3): [(5, 7), (6, 8)], (2, 4):[(None, 9)]}] wf1.connect(node2, 'output1', node3, 'input1') node4 = pe.Node(TestInterface(), name='node4') wf1.connect(node3, 'output1', node4, 'input1') wf3 = pe.Workflow(name='group') for i in [0, 1, 2]: wf3.add_nodes([wf1.clone(name='test%d' % i)]) wf3._flatgraph = wf3._create_flat_graph() # each expanded graph clone has: # 2 node1 expansion nodes, # 1 node2 per node1 replicate, # 2 node3 replicates for the node1 input1 value 1, # 1 node3 replicates for the node1 input1 value 2 and # 1 node4 successor per node3 replicate # => 2 + 2 + (2 + 1) + 3 = 10 nodes per expanded graph clone # => 3 * 10 = 30 nodes in the group yield assert_equal, len(pe.generate_expanded_graph(wf3._flatgraph).nodes()), 30
def test1(): pipe = pe.Workflow(name='pipe') mod1 = pe.Node(interface=TestInterface(), name='mod1') pipe.add_nodes([mod1]) pipe._flatgraph = pipe._create_flat_graph() pipe._execgraph = pe.generate_expanded_graph(deepcopy(pipe._flatgraph)) yield assert_equal, len(pipe._execgraph.nodes()), 1 yield assert_equal, len(pipe._execgraph.edges()), 0
def test1(): pipe = pe.Workflow(name='pipe') mod1 = pe.Node(interface=TestInterface(),name='mod1') pipe.add_nodes([mod1]) pipe._flatgraph = pipe._create_flat_graph() pipe._execgraph = pe.generate_expanded_graph(deepcopy(pipe._flatgraph)) yield assert_equal, len(pipe._execgraph.nodes()), 1 yield assert_equal, len(pipe._execgraph.edges()), 0
def test2(): pipe = pe.Workflow(name='pipe') mod1 = pe.Node(interface=TestInterface(),name='mod1') mod1.iterables = dict(input1=lambda:[1,2],input2=lambda:[1,2]) pipe.add_nodes([mod1]) pipe._flatgraph = pipe._create_flat_graph() pipe._execgraph = pe.generate_expanded_graph(deepcopy(pipe._flatgraph)) yield assert_equal, len(pipe._execgraph.nodes()), 4 yield assert_equal, len(pipe._execgraph.edges()), 0
def test2(): pipe = pe.Workflow(name='pipe') mod1 = pe.Node(interface=TestInterface(), name='mod1') mod1.iterables = dict(input1=lambda: [1, 2], input2=lambda: [1, 2]) pipe.add_nodes([mod1]) pipe._flatgraph = pipe._create_flat_graph() pipe._execgraph = pe.generate_expanded_graph(deepcopy(pipe._flatgraph)) yield assert_equal, len(pipe._execgraph.nodes()), 4 yield assert_equal, len(pipe._execgraph.edges()), 0
def test5(): pipe = pe.Workflow(name='pipe') mod1 = pe.Node(interface=TestInterface(),name='mod1') mod2 = pe.Node(interface=TestInterface(),name='mod2') mod1.iterables = dict(input1=lambda:[1,2]) mod2.iterables = dict(input1=lambda:[1,2]) pipe.connect([(mod1,mod2,[('output1','input2')])]) pipe._flatgraph = pipe._create_flat_graph() pipe._execgraph = pe.generate_expanded_graph(deepcopy(pipe._flatgraph)) yield assert_equal, len(pipe._execgraph.nodes()), 6 yield assert_equal, len(pipe._execgraph.edges()), 4
def test3(): pipe = pe.Workflow(name='pipe') mod1 = pe.Node(interface=TestInterface(), name='mod1') mod1.iterables = {} mod2 = pe.Node(interface=TestInterface(), name='mod2') mod2.iterables = dict(input1=lambda: [1, 2]) pipe.connect([(mod1, mod2, [('output1', 'input2')])]) pipe._flatgraph = pipe._create_flat_graph() pipe._execgraph = pe.generate_expanded_graph(deepcopy(pipe._flatgraph)) yield assert_equal, len(pipe._execgraph.nodes()), 3 yield assert_equal, len(pipe._execgraph.edges()), 2
def test_iterable_expansion(): import nipype.pipeline.engine as pe wf1 = pe.Workflow(name='test') node1 = pe.Node(TestInterface(), name='node1') node2 = pe.Node(TestInterface(), name='node2') node1.iterables = ('input1', [1, 2]) wf1.connect(node1, 'output1', node2, 'input2') wf3 = pe.Workflow(name='group') for i in [0, 1, 2]: wf3.add_nodes([wf1.clone(name='test%d' % i)]) wf3._flatgraph = wf3._create_flat_graph() yield assert_equal, len(pe.generate_expanded_graph(wf3._flatgraph).nodes()), 12
def prepare_graph(config, base_dir, uuid, graph): graph = pe.generate_expanded_graph(graph) for index, node in enumerate(graph): node.config = merge_dict(deepcopy(config), node.config) node.base_dir = base_dir node.index = index empty_workflow = pe.Workflow(name="empty") empty_workflow._configure_exec_nodes(graph) # self is not accessed graph.uuid = uuid return graph
def test_iterable_expansion(): import nipype.pipeline.engine as pe from nipype.interfaces.utility import IdentityInterface wf1 = pe.Workflow(name='test') node1 = pe.Node(IdentityInterface(fields=['in1']),name='node1') node2 = pe.Node(IdentityInterface(fields=['in2']),name='node2') node1.iterables = ('in1',[1,2]) wf1.connect(node1,'in1', node2, 'in2') wf3 = pe.Workflow(name='group') for i in [0,1,2]: wf3.add_nodes([wf1.clone(name='test%d'%i)]) wf3._flatgraph = wf3._create_flat_graph() yield assert_equal, len(pe.generate_expanded_graph(wf3._flatgraph).nodes()),12
def test_synchronize_tuples_expansion(): import nipype.pipeline.engine as pe wf1 = pe.Workflow(name='test') node1 = pe.Node(TestInterface(),name='node1') node2 = pe.Node(TestInterface(),name='node2') node1.iterables = [('input1','input2'), [(1,3), (2,4), (None,5)]] node1.synchronize = True wf1.connect(node1,'output1', node2, 'input2') wf3 = pe.Workflow(name='group') for i in [0,1,2]: wf3.add_nodes([wf1.clone(name='test%d'%i)]) wf3._flatgraph = wf3._create_flat_graph() # Identical to test_synchronize_expansion yield assert_equal, len(pe.generate_expanded_graph(wf3._flatgraph).nodes()), 18
def test_synchronize_tuples_expansion(): import nipype.pipeline.engine as pe wf1 = pe.Workflow(name='test') node1 = pe.Node(TestInterface(), name='node1') node2 = pe.Node(TestInterface(), name='node2') node1.iterables = [('input1', 'input2'), [(1, 3), (2, 4), (None, 5)]] node1.synchronize = True wf1.connect(node1, 'output1', node2, 'input2') wf3 = pe.Workflow(name='group') for i in [0, 1, 2]: wf3.add_nodes([wf1.clone(name='test%d' % i)]) wf3._flatgraph = wf3._create_flat_graph() # Identical to test_synchronize_expansion yield assert_equal, len( pe.generate_expanded_graph(wf3._flatgraph).nodes()), 18
def test_synchronize_expansion(): import nipype.pipeline.engine as pe wf1 = pe.Workflow(name='test') node1 = pe.Node(TestInterface(), name='node1') node1.iterables = [('input1', [1, 2]), ('input2', [3, 4, 5])] node1.synchronize = True node2 = pe.Node(TestInterface(), name='node2') wf1.connect(node1, 'output1', node2, 'input2') wf3 = pe.Workflow(name='group') for i in [0, 1, 2]: wf3.add_nodes([wf1.clone(name='test%d' % i)]) wf3._flatgraph = wf3._create_flat_graph() # Each expanded graph clone has: # 3 node1 expansion nodes and # 1 node2 replicate per node1 replicate # => 2 * 3 = 6 nodes per expanded subgraph # => 18 nodes in the group yield assert_equal, len(pe.generate_expanded_graph(wf3._flatgraph).nodes()), 18
def test8(): pipe = pe.Workflow(name='pipe') mod1 = pe.Node(interface=TestInterface(),name='mod1') mod2 = pe.Node(interface=TestInterface(),name='mod2') mod3 = pe.Node(interface=TestInterface(),name='mod3') mod1.iterables = dict(input1=lambda:[1,2]) mod2.iterables = dict(input1=lambda:[1,2]) mod3.iterables = {} pipe.connect([(mod1,mod3,[('output1','input2')]), (mod2,mod3,[('output1','input2')])]) pipe._flatgraph = pipe._create_flat_graph() pipe._execgraph = pe.generate_expanded_graph(deepcopy(pipe._flatgraph)) yield assert_equal, len(pipe._execgraph.nodes()), 8 yield assert_equal, len(pipe._execgraph.edges()), 8 edgenum = sorted([(len(pipe._execgraph.in_edges(node)) + \ len(pipe._execgraph.out_edges(node))) \ for node in pipe._execgraph.nodes()]) yield assert_true, edgenum[0]>0
def test8(): pipe = pe.Workflow(name='pipe') mod1 = pe.Node(interface=TestInterface(), name='mod1') mod2 = pe.Node(interface=TestInterface(), name='mod2') mod3 = pe.Node(interface=TestInterface(), name='mod3') mod1.iterables = dict(input1=lambda: [1, 2]) mod2.iterables = dict(input1=lambda: [1, 2]) mod3.iterables = {} pipe.connect([(mod1, mod3, [('output1', 'input1')]), (mod2, mod3, [('output1', 'input2')])]) pipe._flatgraph = pipe._create_flat_graph() pipe._execgraph = pe.generate_expanded_graph(deepcopy(pipe._flatgraph)) yield assert_equal, len(pipe._execgraph.nodes()), 8 yield assert_equal, len(pipe._execgraph.edges()), 8 edgenum = sorted([(len(pipe._execgraph.in_edges(node)) + \ len(pipe._execgraph.out_edges(node))) \ for node in pipe._execgraph.nodes()]) yield assert_true, edgenum[0] > 0