Skip to content

Commit 268e47d

Browse files
committed
RF: Split identification and uncollapsing traits
FIX: Improve collapse detection to correctly handle numpy arrays FIX: Uncollapse before modifying paths when loading results
1 parent 0696280 commit 268e47d

File tree

1 file changed

+26
-9
lines changed

1 file changed

+26
-9
lines changed

nipype/pipeline/engine/utils.py

+26-9
Original file line numberDiff line numberDiff line change
@@ -233,28 +233,45 @@ def write_report(node, report_type=None, is_mapnode=False):
233233
return
234234

235235

236-
def _protect_collapses(hastraits):
236+
def _identify_collapses(hastraits):
237237
raw = hastraits.trait_get()
238238
cloned = hastraits.clone_traits().trait_get()
239239

240+
collapsed = set()
240241
for key in cloned:
241-
val = raw[key]
242-
c = cloned[key]
243-
if c != val and hasattr(val, '__getitem__') and c == val[0]:
244-
raw[key] = [val]
242+
orig = raw[key]
243+
new = cloned[key]
244+
if isinstance(orig, list) and len(orig) == 1 and (
245+
not np.array_equal(orig, new) and np.array_equal(orig[0], new)):
246+
collapsed.add(key)
247+
248+
return collapsed
249+
245250

246-
return raw
251+
def _uncollapse(indexable, collapsed):
252+
for key in indexable:
253+
if key in collapsed:
254+
indexable[key] = [indexable[key]]
255+
return indexable
256+
257+
258+
def _protect_collapses(hastraits):
259+
collapsed = _identify_collapses(hastraits)
260+
return _uncollapse(hastraits.trait_get(), collapsed)
247261

248262

249263
def save_resultfile(result, cwd, name):
250264
"""Save a result pklz file to ``cwd``"""
251265
resultsfile = os.path.join(cwd, 'result_%s.pklz' % name)
252266
if result.outputs:
267+
collapsed = set()
253268
try:
254-
outputs = _protect_collapses(result.outputs)
269+
collapsed = _identify_collapses(result.outputs)
270+
outputs = _uncollapse(result.outputs.trait_get(), collapsed)
255271
except AttributeError:
256272
outputs = result.outputs.dictcopy() # outputs was a bunch
257-
result.outputs.set(**modify_paths(outputs, relative=True, basedir=cwd))
273+
outputs = modify_paths(outputs, relative=True, basedir=cwd)
274+
result.outputs.set(**_uncollapse(outputs, collapsed))
258275

259276
savepkl(resultsfile, result)
260277
logger.debug('saved results in %s', resultsfile)
@@ -306,7 +323,7 @@ def load_resultfile(path, name):
306323
else:
307324
if result.outputs:
308325
try:
309-
outputs = result.outputs.trait_get()
326+
outputs = _protect_collapses(result.outputs)
310327
except AttributeError:
311328
outputs = result.outputs.dictcopy() # outputs == Bunch
312329
try:

0 commit comments

Comments
 (0)