Skip to content

Commit 38bca1e

Browse files
committed
RF: Remove file-level nx imports in pipeline
1 parent 99ebbb4 commit 38bca1e

File tree

4 files changed

+33
-12
lines changed

4 files changed

+33
-12
lines changed

nipype/pipeline/engine/utils.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
from functools import reduce
2222

2323
import numpy as np
24-
import networkx as nx
2524
from future import standard_library
2625

2726
from ... import logging, config, LooseVersion
@@ -55,12 +54,6 @@
5554
logger = logging.getLogger('nipype.workflow')
5655
PY3 = sys.version_info[0] > 2
5756

58-
try:
59-
dfs_preorder = nx.dfs_preorder
60-
except AttributeError:
61-
dfs_preorder = nx.dfs_preorder_nodes
62-
logger.debug('networkx 1.4 dev or higher detected')
63-
6457

6558
def _parameterization_dir(param):
6659
"""
@@ -543,6 +536,7 @@ def _create_dot_graph(graph, show_connectinfo=False, simple_form=True):
543536
Ensures that edge info is pickleable.
544537
"""
545538
logger.debug('creating dot graph')
539+
import networkx as nx
546540
pklgraph = nx.DiGraph()
547541
for edge in graph.edges():
548542
data = graph.get_edge_data(*edge)
@@ -569,6 +563,7 @@ def _write_detailed_dot(graph, dotfilename):
569563
struct1:f2 -> struct3:here;
570564
}
571565
"""
566+
import networkx as nx
572567
text = ['digraph structs {', 'node [shape=record];']
573568
# write nodes
574569
edges = []
@@ -748,6 +743,7 @@ def evaluate_connect_function(function_source, args, first_arg):
748743

749744

750745
def get_levels(G):
746+
import networkx as nx
751747
levels = {}
752748
for n in nx.topological_sort(G):
753749
levels[n] = 0
@@ -891,6 +887,7 @@ def _identity_nodes(graph, include_iterables):
891887
are included if and only if the include_iterables flag is set
892888
to True.
893889
"""
890+
import networkx as nx
894891
return [
895892
node for node in nx.topological_sort(graph)
896893
if isinstance(node.interface, IdentityInterface) and (
@@ -994,6 +991,12 @@ def generate_expanded_graph(graph_in):
994991
and b=[3,4] this procedure will generate a graph with sub-graphs
995992
parameterized as (a=1,b=3), (a=1,b=4), (a=2,b=3) and (a=2,b=4).
996993
"""
994+
import networkx as nx
995+
try:
996+
dfs_preorder = nx.dfs_preorder
997+
except AttributeError:
998+
dfs_preorder = nx.dfs_preorder_nodes
999+
9971000
logger.debug("PE: expanding iterables")
9981001
graph_in = _remove_nonjoin_identity_nodes(graph_in, keep_iterables=True)
9991002
# standardize the iterables as {(field, function)} dictionaries
@@ -1222,6 +1225,7 @@ def _iterable_nodes(graph_in):
12221225
12231226
Return the iterable nodes list
12241227
"""
1228+
import networkx as nx
12251229
nodes = nx.topological_sort(graph_in)
12261230
inodes = [node for node in nodes if node.iterables is not None]
12271231
inodes_no_src = [node for node in inodes if not node.itersource]
@@ -1349,6 +1353,7 @@ def export_graph(graph_in,
13491353
Indicates whether to show the edge data on the graph. This
13501354
makes the graph rather cluttered. default [False]
13511355
"""
1356+
import networkx as nx
13521357
graph = deepcopy(graph_in)
13531358
if use_execgraph:
13541359
graph = generate_expanded_graph(graph)
@@ -1716,6 +1721,7 @@ def write_workflow_resources(graph, filename=None, append=None):
17161721
def topological_sort(graph, depth_first=False):
17171722
"""Returns a depth first sorted order if depth_first is True
17181723
"""
1724+
import networkx as nx
17191725
nodesort = list(nx.topological_sort(graph))
17201726
if not depth_first:
17211727
return nodesort, None

nipype/pipeline/engine/workflows.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import shutil
2020

2121
import numpy as np
22-
import networkx as nx
2322

2423
from ... import config, logging
2524
from ...utils.misc import str2bool
@@ -56,6 +55,7 @@ def __init__(self, name, base_dir=None):
5655
path to workflow storage
5756
5857
"""
58+
import networkx as nx
5959
super(Workflow, self).__init__(name, base_dir)
6060
self._graph = nx.DiGraph()
6161

@@ -366,6 +366,7 @@ def get_node(self, name):
366366
def list_node_names(self):
367367
"""List names of all nodes in a workflow
368368
"""
369+
import networkx as nx
369370
outlist = []
370371
for node in nx.topological_sort(self._graph):
371372
if isinstance(node, Workflow):
@@ -482,6 +483,7 @@ def export(self,
482483
whether to include node and workflow config values
483484
484485
"""
486+
import networkx as nx
485487
formats = ["python"]
486488
if format not in formats:
487489
raise ValueError('format must be one of: %s' % '|'.join(formats))
@@ -870,6 +872,7 @@ def _reset_hierarchy(self):
870872
def _generate_flatgraph(self):
871873
"""Generate a graph containing only Nodes or MapNodes
872874
"""
875+
import networkx as nx
873876
logger.debug('expanding workflow: %s', self)
874877
nodes2remove = []
875878
if not nx.is_directed_acyclic_graph(self._graph):
@@ -942,6 +945,7 @@ def _get_dot(self,
942945
level=0):
943946
"""Create a dot file with connection info
944947
"""
948+
import networkx as nx
945949
if prefix is None:
946950
prefix = ' '
947951
if hierarchy is None:

nipype/pipeline/plugins/base.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from ... import logging
2121
from ...utils.filemanip import loadpkl
2222
from ...utils.misc import str2bool
23-
from ..engine.utils import (nx, dfs_preorder, topological_sort)
23+
from ..engine.utils import topological_sort
2424
from ..engine import MapNode
2525
from .tools import report_crash, report_nodes_not_run, create_pyscript
2626

@@ -391,6 +391,8 @@ def _task_finished_cb(self, jobid, cached=False):
391391
def _generate_dependency_list(self, graph):
392392
""" Generates a dependency list for a list of graphs.
393393
"""
394+
import networkx as nx
395+
394396
self.procs, _ = topological_sort(graph)
395397
try:
396398
self.depidx = nx.to_scipy_sparse_matrix(
@@ -403,6 +405,11 @@ def _generate_dependency_list(self, graph):
403405
self.proc_pending = np.zeros(len(self.procs), dtype=bool)
404406

405407
def _remove_node_deps(self, jobid, crashfile, graph):
408+
import networkx as nx
409+
try:
410+
dfs_preorder = nx.dfs_preorder
411+
except AttributeError:
412+
dfs_preorder = nx.dfs_preorder_nodes
406413
subnodes = [s for s in dfs_preorder(graph, self.procs[jobid])]
407414
for node in subnodes:
408415
idx = self.procs.index(node)
@@ -538,6 +545,7 @@ def __init__(self, plugin_args=None):
538545
super(GraphPluginBase, self).__init__(plugin_args=plugin_args)
539546

540547
def run(self, graph, config, updatehash=False):
548+
import networkx as nx
541549
pyfiles = []
542550
dependencies = {}
543551
self._config = config

nipype/pipeline/plugins/linear.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@
77
absolute_import)
88

99
import os
10-
11-
import networkx as nx
1210
from .base import (PluginBase, logger, report_crash, report_nodes_not_run,
1311
str2bool)
14-
from ..engine.utils import dfs_preorder, topological_sort
12+
from ..engine.utils import topological_sort
1513

1614

1715
class LinearPlugin(PluginBase):
@@ -27,6 +25,11 @@ def run(self, graph, config, updatehash=False):
2725
graph : networkx digraph
2826
defines order of execution
2927
"""
28+
import networkx as nx
29+
try:
30+
dfs_preorder = nx.dfs_preorder
31+
except AttributeError:
32+
dfs_preorder = nx.dfs_preorder_nodes
3033

3134
if not isinstance(graph, nx.DiGraph):
3235
raise ValueError('Input must be a networkx digraph object')

0 commit comments

Comments
 (0)