From a15312e3c882cd5a425faad46f06f38f123020ad Mon Sep 17 00:00:00 2001 From: Juan Nunez-Iglesias Date: Fri, 4 Oct 2013 15:21:50 +1000 Subject: [PATCH 1/6] Only raise umfpack warning if cg mode is used --- skimage/segmentation/random_walker_segmentation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skimage/segmentation/random_walker_segmentation.py b/skimage/segmentation/random_walker_segmentation.py index 9ef3a8fc..6ab7e1ce 100644 --- a/skimage/segmentation/random_walker_segmentation.py +++ b/skimage/segmentation/random_walker_segmentation.py @@ -324,7 +324,7 @@ def random_walker(data, labels, beta=130, mode='bf', tol=1.e-3, copy=True, """ - if UmfpackContext is None: + if UmfpackContext is None and mode == 'cg': warnings.warn('SciPy was built without UMFPACK. Consider rebuilding ' 'SciPy with UMFPACK, this will greatly speed up the ' 'random walker functions. You may also install pyamg ' From fc15f75f8dc45302a411307896255822f408a92c Mon Sep 17 00:00:00 2001 From: Juan Nunez-Iglesias Date: Sat, 5 Oct 2013 14:27:51 +1000 Subject: [PATCH 2/6] Monkey-patch UmfpackContext __del__ By putting the failing statement in a try: except: clause, the exception is caught and the error message is silenced. See https://groups.google.com/d/msg/scikit-image/FrM5IGP6wh4/1hp-FtVZmfcJ and http://stackoverflow.com/questions/13977970/ignore-exceptions-printed-to-stderr-in-del/13977992?noredirect=1#comment28386412_13977992 --- skimage/segmentation/random_walker_segmentation.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/skimage/segmentation/random_walker_segmentation.py b/skimage/segmentation/random_walker_segmentation.py index 6ab7e1ce..e71e7f09 100644 --- a/skimage/segmentation/random_walker_segmentation.py +++ b/skimage/segmentation/random_walker_segmentation.py @@ -9,14 +9,25 @@ significantly the performance. """ import warnings +import sys +import os import numpy as np from scipy import sparse, ndimage + try: from scipy.sparse.linalg.dsolve import umfpack + old_del = umfpack.UmfpackContext.__del__ + def new_del(self): + try: + old_del(self) + except AttributeError: + pass + umfpack.UmfpackContext.__del__ = new_del UmfpackContext = umfpack.UmfpackContext() except: UmfpackContext = None + try: from pyamg import ruge_stuben_solver amg_loaded = True From 248ac46dae4638fe57aeaafdb2a4ee4d9e7bf696 Mon Sep 17 00:00:00 2001 From: Juan Nunez-Iglesias Date: Mon, 7 Oct 2013 13:25:13 +1100 Subject: [PATCH 3/6] Remove unused imports in random_walker source --- skimage/segmentation/random_walker_segmentation.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/skimage/segmentation/random_walker_segmentation.py b/skimage/segmentation/random_walker_segmentation.py index e71e7f09..9079dda9 100644 --- a/skimage/segmentation/random_walker_segmentation.py +++ b/skimage/segmentation/random_walker_segmentation.py @@ -9,8 +9,6 @@ significantly the performance. """ import warnings -import sys -import os import numpy as np from scipy import sparse, ndimage From fb86bac3504c08ef43e12b96652990ec097dc19b Mon Sep 17 00:00:00 2001 From: Juan Nunez-Iglesias Date: Mon, 7 Oct 2013 13:33:17 +1100 Subject: [PATCH 4/6] Add comment and links explaining Umfpack import --- skimage/segmentation/random_walker_segmentation.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/skimage/segmentation/random_walker_segmentation.py b/skimage/segmentation/random_walker_segmentation.py index 9079dda9..aff0c131 100644 --- a/skimage/segmentation/random_walker_segmentation.py +++ b/skimage/segmentation/random_walker_segmentation.py @@ -13,6 +13,12 @@ import warnings import numpy as np from scipy import sparse, ndimage +# executive summary for next code block: try to import umfpack from +# scipy, but make sure not to raise a fuss if it fails since it's only +# needed to speed up a few cases. +# See discussions at: +# https://groups.google.com/d/msg/scikit-image/FrM5IGP6wh4/1hp-FtVZmfcJ +# http://stackoverflow.com/questions/13977970/ignore-exceptions-printed-to-stderr-in-del/13977992?noredirect=1#comment28386412_13977992 try: from scipy.sparse.linalg.dsolve import umfpack old_del = umfpack.UmfpackContext.__del__ From bfaf89e2f35e87b022c1e55cfa8fde3feb22d990 Mon Sep 17 00:00:00 2001 From: Juan Nunez-Iglesias Date: Tue, 8 Oct 2013 13:23:50 +1100 Subject: [PATCH 5/6] Deprecate default mode 'bf' in random_walker --- skimage/segmentation/random_walker_segmentation.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/skimage/segmentation/random_walker_segmentation.py b/skimage/segmentation/random_walker_segmentation.py index aff0c131..c475dcb7 100644 --- a/skimage/segmentation/random_walker_segmentation.py +++ b/skimage/segmentation/random_walker_segmentation.py @@ -187,7 +187,7 @@ def _build_laplacian(data, mask=None, beta=50, depth=1., multichannel=False): #----------- Random walker algorithm -------------------------------- -def random_walker(data, labels, beta=130, mode='bf', tol=1.e-3, copy=True, +def random_walker(data, labels, beta=130, mode=None, tol=1.e-3, copy=True, multichannel=False, return_full_prob=False, depth=1.): """Random walker algorithm for segmentation from markers. @@ -339,6 +339,12 @@ def random_walker(data, labels, beta=130, mode='bf', tol=1.e-3, copy=True, """ + if mode is None: + mode = 'bf' + warnings.warn("Default mode will change in the next release from 'bf' " + "to 'cg_mg' if pyamg is installed, else to 'cg' if " + "SciPy was built with UMFPACK, or to 'bf' otherwise.") + if UmfpackContext is None and mode == 'cg': warnings.warn('SciPy was built without UMFPACK. Consider rebuilding ' 'SciPy with UMFPACK, this will greatly speed up the ' From 0680f59fe170ef61934de0f447f48d269b28ce83 Mon Sep 17 00:00:00 2001 From: Juan Nunez-Iglesias Date: Tue, 8 Oct 2013 13:28:39 +1100 Subject: [PATCH 6/6] Add change in random_walker default mode to TODO --- TODO.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TODO.txt b/TODO.txt index 502961c8..db7ffe48 100644 --- a/TODO.txt +++ b/TODO.txt @@ -4,6 +4,8 @@ Version 0.10 * Remove deprecated parameter `epsilon` of `skimage.viewer.LineProfile` * Remove backwards-compatability of `skimage.measure.regionprops` * Remove {`ratio`, `sigma`} deprecation warnings of `skimage.segmentation.slic` +* Change default mode of random_walker segmentation to 'cg_mg' > 'cg' > 'bf', + depending on which optional dependencies are available. Version 0.9 -----------