From e79c1ab2382f047e6c232e898b34c0518b6fdf25 Mon Sep 17 00:00:00 2001 From: Nicolas Ollinger Date: Wed, 16 Dec 2020 21:46:27 +0100 Subject: [PATCH] PKG add scikit-image package (#866) Co-authored-by: Chigozie Nri --- packages/cloudpickle/meta.yaml | 9 ++ packages/cloudpickle/test_cloudpickle.py | 21 ++++ packages/pywavelets/meta.yaml | 16 +++ packages/pywavelets/patches/fft.patch | 13 ++ packages/pywavelets/test_pywt.py | 19 +++ packages/scikit-image/meta.yaml | 21 ++++ packages/scikit-image/patches/no-openmp.patch | 11 ++ .../patches/preferred_plugins.patch | 11 ++ packages/scikit-image/patches/unwrap.patch | 115 ++++++++++++++++++ packages/scikit-image/test_skimage.py | 47 +++++++ 10 files changed, 283 insertions(+) create mode 100644 packages/cloudpickle/meta.yaml create mode 100644 packages/cloudpickle/test_cloudpickle.py create mode 100644 packages/pywavelets/meta.yaml create mode 100644 packages/pywavelets/patches/fft.patch create mode 100644 packages/pywavelets/test_pywt.py create mode 100644 packages/scikit-image/meta.yaml create mode 100644 packages/scikit-image/patches/no-openmp.patch create mode 100644 packages/scikit-image/patches/preferred_plugins.patch create mode 100644 packages/scikit-image/patches/unwrap.patch create mode 100644 packages/scikit-image/test_skimage.py diff --git a/packages/cloudpickle/meta.yaml b/packages/cloudpickle/meta.yaml new file mode 100644 index 000000000..3c6068523 --- /dev/null +++ b/packages/cloudpickle/meta.yaml @@ -0,0 +1,9 @@ +package: + name: cloudpickle + version: 1.5.0 +source: + sha256: 820c9245cebdec7257211cbe88745101d5d6a042bca11336d78ebd4897ddbc82 + url: https://files.pythonhosted.org/packages/2b/42/1a742ae7a85e8e15a60696b0519f71db8ee04839fef6007c3859184fbe71/cloudpickle-1.5.0.tar.gz +test: + imports: + - cloudpickle diff --git a/packages/cloudpickle/test_cloudpickle.py b/packages/cloudpickle/test_cloudpickle.py new file mode 100644 index 000000000..20ae7fc38 --- /dev/null +++ b/packages/cloudpickle/test_cloudpickle.py @@ -0,0 +1,21 @@ +def test_cloudpickle(selenium): + selenium.load_package("cloudpickle") + selenium.run( + r""" +import cloudpickle +squared = lambda x: x ** 2 +pickled_lambda = cloudpickle.dumps(squared) + +import pickle +new_squared = pickle.loads(pickled_lambda) +assert new_squared(2) == 4 + +CONSTANT = 42 +def my_function(data: int) -> int: + return data + CONSTANT + +pickled_function = cloudpickle.dumps(my_function) +depickled_function = pickle.loads(pickled_function) +assert depickled_function(43) == 85 +""" + ) diff --git a/packages/pywavelets/meta.yaml b/packages/pywavelets/meta.yaml new file mode 100644 index 000000000..e491f8d73 --- /dev/null +++ b/packages/pywavelets/meta.yaml @@ -0,0 +1,16 @@ +package: + name: pywavelets + version: 1.1.1 +source: + sha256: 1a64b40f6acb4ffbaccce0545d7fc641744f95351f62e4c6aaa40549326008c9 + url: https://files.pythonhosted.org/packages/17/6b/ef989cfb3acff2ea966c5f28a7443ccaec2ee136675dfa0366db2635f78a/PyWavelets-1.1.1.tar.gz + patches: + - patches/fft.patch +requirements: + run: + - numpy + - matplotlib + - scipy +test: + imports: + - pywt diff --git a/packages/pywavelets/patches/fft.patch b/packages/pywavelets/patches/fft.patch new file mode 100644 index 000000000..7e4cce9c7 --- /dev/null +++ b/packages/pywavelets/patches/fft.patch @@ -0,0 +1,13 @@ +This patch can be removed once scipy is updated to >= 0.18 +AttributeError is raised by the absence of next_fast_len +--- PyWavelets-1.1.1/pywt/_cwt.py.old 2020-12-16 08:19:13.000000000 +0100 ++++ PyWavelets-1.1.1/pywt/_cwt.py 2020-12-16 08:20:23.000000000 +0100 +@@ -20,7 +20,7 @@ + import scipy.fftpack + fftmodule = scipy.fftpack + next_fast_len = fftmodule.next_fast_len +- except ImportError: ++ except (AttributeError, ImportError): + fftmodule = np.fft + + # provide a fallback so scipy is an optional requirement diff --git a/packages/pywavelets/test_pywt.py b/packages/pywavelets/test_pywt.py new file mode 100644 index 000000000..aaa934734 --- /dev/null +++ b/packages/pywavelets/test_pywt.py @@ -0,0 +1,19 @@ +def test_pywt(selenium): + selenium.load_package("pywavelets") + selenium.run( + r""" +import pywt +import numpy as np + +def checkit(a,v): + assert (np.rint(a) == v).all() + +x = [3, 7, 1, 1, -2, 5, 4, 6] +cA, cD = pywt.dwt(x, 'db2') +w = pywt.Wavelet('sym3') +checkit(pywt.idwt(cA, cD, 'db2'),x) +cA, cD = pywt.dwt(x, wavelet=w, mode='periodization') +checkit(pywt.idwt(cA, cD, 'sym3', 'symmetric'),[1,1,-2,5]) +checkit(pywt.idwt(cA, cD, 'sym3', 'periodization'),x) +""" + ) diff --git a/packages/scikit-image/meta.yaml b/packages/scikit-image/meta.yaml new file mode 100644 index 000000000..2d3837584 --- /dev/null +++ b/packages/scikit-image/meta.yaml @@ -0,0 +1,21 @@ +package: + name: scikit-image + version: 0.15.0 +source: + patches: + - patches/no-openmp.patch + - patches/unwrap.patch + - patches/preferred_plugins.patch + sha256: df111e654b47e5ea456c50553debe4c5ddd97258894c7ad3b7f2f9f10798e053 + url: https://files.pythonhosted.org/packages/e0/46/ca035f5d7d3414124a3a5ef22cd2e75c0c5149042a668375f1d44eb69f8f/scikit-image-0.15.0.tar.gz +requirements: + run: + - numpy + - scipy + - matplotlib + - networkx + - pillow + - pywavelets +test: + imports: + - skimage diff --git a/packages/scikit-image/patches/no-openmp.patch b/packages/scikit-image/patches/no-openmp.patch new file mode 100644 index 000000000..5763c8ae7 --- /dev/null +++ b/packages/scikit-image/patches/no-openmp.patch @@ -0,0 +1,11 @@ +This patch is integrated upstream in scikit-image 0.18.0 +--- a/setup.py 2019-04-01 22:30:11.000000000 +0000 ++++ b/setup.py 2020-12-16 06:21:52.600722138 +0000 +@@ -67,6 +67,7 @@ + class ConditionalOpenMP(build_ext): + + def can_compile_link(self): ++ return False + + cc = self.compiler + fname = 'test.c' diff --git a/packages/scikit-image/patches/preferred_plugins.patch b/packages/scikit-image/patches/preferred_plugins.patch new file mode 100644 index 000000000..f5759bc23 --- /dev/null +++ b/packages/scikit-image/patches/preferred_plugins.patch @@ -0,0 +1,11 @@ +--- a/skimage/io/manage_plugins.py 2019-03-19 07:17:05.000000000 +0100 ++++ b/skimage/io/manage_plugins.py 2020-12-16 12:03:52.000000000 +0100 +@@ -41,7 +41,7 @@ + # the following preferences. + preferred_plugins = { + # Default plugins for all types (overridden by specific types below). +- 'all': ['imageio', 'pil', 'matplotlib', 'qt'], ++ 'all': ['pil', 'matplotlib'], + 'imshow': ['matplotlib'], + 'imshow_collection': ['matplotlib'] + } diff --git a/packages/scikit-image/patches/unwrap.patch b/packages/scikit-image/patches/unwrap.patch new file mode 100644 index 000000000..4710d0acc --- /dev/null +++ b/packages/scikit-image/patches/unwrap.patch @@ -0,0 +1,115 @@ +This patch is integrated in scikit-image v0.18.0 +diff --git a/skimage/restoration/_unwrap_2d.pyx b/skimage/restoration/_unwrap_2d.pyx +index ad0dfa2280..8e2d6ee3ae 100644 +--- a/skimage/restoration/_unwrap_2d.pyx ++++ b/skimage/restoration/_unwrap_2d.pyx +@@ -3,13 +3,17 @@ + # cython: nonecheck=False + # cython: wraparound=False + +-cdef extern from *: +- void unwrap2D(double* wrapped_image, +- double* unwrapped_image, +- unsigned char* input_mask, +- int image_width, int image_height, +- int wrap_around_x, int wrap_around_y, +- char use_seed, unsigned int seed) nogil ++ ++cdef extern from "unwrap_2d_ljmu.h": ++ void unwrap2D( ++ double *wrapped_image, ++ double *UnwrappedImage, ++ unsigned char *input_mask, ++ int image_width, int image_height, ++ int wrap_around_x, int wrap_around_y, ++ char use_seed, unsigned int seed ++ ) nogil ++ + + def unwrap_2d(double[:, ::1] image, + unsigned char[:, ::1] mask, +diff --git a/skimage/restoration/_unwrap_3d.pyx b/skimage/restoration/_unwrap_3d.pyx +index eac50e70fb..2c9bbfbb1d 100644 +--- a/skimage/restoration/_unwrap_3d.pyx ++++ b/skimage/restoration/_unwrap_3d.pyx +@@ -3,13 +3,18 @@ + # cython: nonecheck=False + # cython: wraparound=False + +-cdef extern from *: +- void unwrap3D(double* wrapped_volume, +- double* unwrapped_volume, +- unsigned char* input_mask, +- int image_width, int image_height, int volume_depth, +- int wrap_around_x, int wrap_around_y, int wrap_around_z, +- char use_seed, unsigned int seed) nogil ++ ++cdef extern from "unwrap_3d_ljmu.h": ++ void unwrap3D( ++ double *wrapped_volume, ++ double *unwrapped_volume, ++ unsigned char *input_mask, ++ int volume_width, int volume_height, int volume_depth, ++ int wrap_around_x, int wrap_around_y, int wrap_around_z, ++ char use_seed, unsigned int seed ++ ) nogil ++ ++ + + def unwrap_3d(double[:, :, ::1] image, + unsigned char[:, :, ::1] mask, +diff --git a/skimage/restoration/unwrap_2d_ljmu.c b/skimage/restoration/unwrap_2d_ljmu.c +index 690a8d7741..ac60a7d98e 100644 +--- a/skimage/restoration/unwrap_2d_ljmu.c ++++ b/skimage/restoration/unwrap_2d_ljmu.c +@@ -39,6 +39,7 @@ + #define NOMASK 0 + #define MASK 1 + ++ + typedef struct { + double mod; + int x_connectivity; +diff --git a/skimage/restoration/unwrap_2d_ljmu.h b/skimage/restoration/unwrap_2d_ljmu.h +new file mode 100644 +index 0000000000..9b26d808ff +--- /dev/null ++++ b/skimage/restoration/unwrap_2d_ljmu.h +@@ -0,0 +1,9 @@ ++void unwrap2D( ++ double *wrapped_image, ++ double *UnwrappedImage, ++ unsigned char *input_mask, ++ int image_width, int image_height, ++ int wrap_around_x, int wrap_around_y, ++ char use_seed, unsigned int seed ++ ); ++ +diff --git a/skimage/restoration/unwrap_3d_ljmu.c b/skimage/restoration/unwrap_3d_ljmu.c +index fdd9847ae8..301414cb5e 100644 +--- a/skimage/restoration/unwrap_3d_ljmu.c ++++ b/skimage/restoration/unwrap_3d_ljmu.c +@@ -40,6 +40,8 @@ + #define NOMASK 0 + #define MASK 1 + ++ ++ + typedef struct { + double mod; + int x_connectivity; +diff --git a/skimage/restoration/unwrap_3d_ljmu.h b/skimage/restoration/unwrap_3d_ljmu.h +new file mode 100644 +index 0000000000..8038639073 +--- /dev/null ++++ b/skimage/restoration/unwrap_3d_ljmu.h +@@ -0,0 +1,9 @@ ++void unwrap3D( ++ double *wrapped_volume, ++ double *unwrapped_volume, ++ unsigned char *input_mask, ++ int volume_width, int volume_height, int volume_depth, ++ int wrap_around_x, int wrap_around_y, int wrap_around_z, ++ char use_seed, unsigned int seed ++ ); ++ diff --git a/packages/scikit-image/test_skimage.py b/packages/scikit-image/test_skimage.py new file mode 100644 index 000000000..ffd1480bf --- /dev/null +++ b/packages/scikit-image/test_skimage.py @@ -0,0 +1,47 @@ +def test_skimage(selenium): + selenium.load_package("scikit-image") + selenium.run( + r""" +import numpy as np + +from skimage import data +from skimage import color +from skimage.util import view_as_blocks + +# get astronaut from skimage.data in grayscale +l = color.rgb2gray(data.astronaut()) +assert l.size == 262144 +assert l.shape == (512,512) + +# size of blocks +block_shape = (4, 4) + +# see astronaut as a matrix of blocks (of shape block_shape) +view = view_as_blocks(l, block_shape) +assert view.shape == (128, 128, 4, 4) + +from skimage.filters import threshold_otsu + +to=threshold_otsu(l) +assert to.hex() == '0x1.8e00000000000p-2' + +from skimage.data import astronaut +from skimage.color import rgb2gray +from skimage.filters import sobel +from skimage.segmentation import felzenszwalb, slic, quickshift, watershed +from skimage.segmentation import mark_boundaries +from skimage.util import img_as_float + +img = img_as_float(astronaut()[::2, ::2]) + +segments_fz = felzenszwalb(img, scale=100, sigma=0.5, min_size=50) +segments_slic = slic(img, n_segments=250, compactness=10, sigma=1) +segments_quick = quickshift(img, kernel_size=3, max_dist=6, ratio=0.5) +gradient = sobel(rgb2gray(img)) +segments_watershed = watershed(gradient, markers=250, compactness=0.001) + +assert len(np.unique(segments_fz)) == 194 +assert len(np.unique(segments_slic)) == 190 +assert len(np.unique(segments_quick)) == 695 + """ + )