Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-scikit-image for 
openSUSE:Factory checked in at 2023-08-28 17:11:59
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-scikit-image (Old)
 and      /work/SRC/openSUSE:Factory/.python-scikit-image.new.1766 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-scikit-image"

Mon Aug 28 17:11:59 2023 rev:18 rq:1105471 version:0.21.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-scikit-image/python-scikit-image.changes  
2023-07-11 15:57:03.917088299 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-scikit-image.new.1766/python-scikit-image.changes
        2023-08-28 17:12:00.545742802 +0200
@@ -1,0 +2,6 @@
+Tue Aug 22 19:18:49 UTC 2023 - Markéta Machová <mmach...@suse.com>
+
+- Add upstream patches np-warn.patch and skimage-numpy125.patch
+  to fix build with NumPy 1.25
+
+-------------------------------------------------------------------

New:
----
  np-warn.patch
  skimage-numpy125.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-scikit-image.spec ++++++
--- /var/tmp/diff_new_pack.dW8wiw/_old  2023-08-28 17:12:01.829788914 +0200
+++ /var/tmp/diff_new_pack.dW8wiw/_new  2023-08-28 17:12:01.833789058 +0200
@@ -32,6 +32,10 @@
 License:        BSD-3-Clause
 URL:            https://scikit-image.org/
 Source0:        
https://files.pythonhosted.org/packages/source/s/scikit-image/%{srcname}-%{version}.tar.gz
+# PATCH-FIX-UPSTREAM np-warn.patch gh#scikit-image/scikit-image#7052
+Patch:          np-warn.patch
+# PATCH-FIX-UPSTREAM skimage-numpy125.patch gh#scikit-image/scikit-image#6970
+Patch:          skimage-numpy125.patch
 BuildRequires:  %{python_module Cython >= 0.29.21}
 BuildRequires:  %{python_module devel >= 3.7}
 BuildRequires:  %{python_module meson-python}

++++++ np-warn.patch ++++++
>From 2cc363d015b71b3cbe14f179f19bbb4ea2e6ab0e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Gr=C3=BCter?= <la...@mailbox.org>
Date: Sat, 8 Jul 2023 21:09:06 +0200
Subject: [PATCH] Mark NaN-related deprecation warning in np.clip as optional
 (#7052)

We already have our own warning that informs users and this deprecation
didn't really effect the behavior of rescale_intensity. So, mark the
warning as optional until we can remove it. No need for matching the
NumPy version number here.
---
 TODO.txt                                |  3 +++
 skimage/exposure/tests/test_exposure.py | 15 ++++++---------
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/skimage/exposure/tests/test_exposure.py 
b/skimage/exposure/tests/test_exposure.py
index ed8dd6bc85f..8ec7d13bf7f 100644
--- a/skimage/exposure/tests/test_exposure.py
+++ b/skimage/exposure/tests/test_exposure.py
@@ -368,19 +368,16 @@ def test_rescale_nan_warning(in_range, out_range):
     )
 
     # 2019/11/10 Passing NaN to np.clip raises a DeprecationWarning for
-    # versions above 1.17
-    # TODO: Remove once NumPy removes this DeprecationWarning
+    # versions above 1.17, "|\A\Z" marks as optional warning
+    # TODO: Remove once NumPy 1.25.0 is minimal dependency
     numpy_warning_1_17_plus = (
-        "Passing `np.nan` to mean no clipping in np.clip"
+        "|\\A\\ZPassing `np.nan` to mean no clipping in np.clip"
     )
 
-    if in_range == "image":
-        exp_warn = [msg, numpy_warning_1_17_plus]
-    else:
-        exp_warn = [msg]
+    with expected_warnings([msg, numpy_warning_1_17_plus]):
+        result = exposure.rescale_intensity(image, in_range, out_range)
 
-    with expected_warnings(exp_warn):
-        exposure.rescale_intensity(image, in_range, out_range)
+    assert np.all(np.isnan(result))
 
 
 @pytest.mark.parametrize(

++++++ skimage-numpy125.patch ++++++
>From 01a9282f4ea2cd5523ff41e1ebcf88491ac76ca2 Mon Sep 17 00:00:00 2001
From: Jarrod Millman <jarrod.mill...@gmail.com>
Date: Thu, 17 Aug 2023 11:40:50 -0700
Subject: [PATCH] Fix for NumPy 1.25 (#6970)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* Fix for NumPy 1.25

* Revert #6973

* Revert "Don't test numpy prerelease on azure (#6996)"

This reverts commit e57c23d3d9072fa7b810fc40dc7e9082791b0629.

* Skip warning check on older, noisier versions of NumPy

* Remove upperpin

* Use stable sort in _raveled_offsets_and_distances

NumPy enabled optimizations for quicksort on AVX-512 enabled
processors [1]. We sort based on neighbor distances which can be equal.
The default quicksort is not stable and could have different behavior on
AVX-512. Test this assumption.

[1] 
https://numpy.org/devdocs/release/1.25.0-notes.html#faster-np-argsort-on-avx-512-enabled-processors

* Fix forgotten doctest in _offsets_to_raveled_neighbors

after updating to stable sort internally.

* Fix for NumPy 1.25

* Revert #6973

* Revert "Don't test numpy prerelease on azure (#6996)"

This reverts commit e57c23d3d9072fa7b810fc40dc7e9082791b0629.

* Skip warning check on older, noisier versions of NumPy

* Remove upperpin

* Use stable sort in _raveled_offsets_and_distances

NumPy enabled optimizations for quicksort on AVX-512 enabled
processors [1]. We sort based on neighbor distances which can be equal.
The default quicksort is not stable and could have different behavior on
AVX-512. Test this assumption.

[1] 
https://numpy.org/devdocs/release/1.25.0-notes.html#faster-np-argsort-on-avx-512-enabled-processors

* Fix forgotten doctest in _offsets_to_raveled_neighbors

after updating to stable sort internally.

* Handle rank>0 scalar arrays

https://github.com/numpy/numpy/issues/10404

* Use stable sort

* Use stable sort in max_tree (debug)

See if it does anything.

* Use stable sort in _get_high_intensity_peaks (debug)

See if it does anything.

* Upper pin numpy<1.26 for tests

---------

Co-authored-by: Stefan van der Walt <stef...@berkeley.edu>
Co-authored-by: Lars Grüter <la...@mailbox.org>
---
 .github/workflows/wheels_recipe.yml     | 24 ++++++++++-------------
 azure-pipelines.yml                     |  4 ++--
 skimage/exposure/tests/test_exposure.py | 26 ++++++++++---------------
 skimage/feature/peak.py                 |  2 +-
 skimage/measure/fit.py                  |  4 ++--
 skimage/morphology/_util.py             | 11 ++++++-----
 skimage/morphology/max_tree.py          |  2 +-
 skimage/morphology/tests/test_util.py   | 22 ++++++++++-----------
 tools/github/before_install.sh          |  5 ++---
 9 files changed, 45 insertions(+), 55 deletions(-)

diff --git a/skimage/exposure/tests/test_exposure.py 
b/skimage/exposure/tests/test_exposure.py
index 8ec7d13bf7f..ac2cf02be0c 100644
--- a/skimage/exposure/tests/test_exposure.py
+++ b/skimage/exposure/tests/test_exposure.py
@@ -7,6 +7,7 @@
                            assert_array_almost_equal,
                            assert_array_equal,
                            assert_equal)
+from packaging.version import Version
 
 from skimage import data
 from skimage import exposure
@@ -354,6 +355,10 @@ def test_rescale_same_values():
     assert_array_almost_equal(out, image)
 
 
+@pytest.mark.skipif(
+    Version(np.__version__) < Version('1.25'),
+    reason="Older NumPy throws a few extra warnings here"
+)
 @pytest.mark.parametrize(
     "in_range,out_range", [("image", "dtype"),
                            ("dtype", "image")]
@@ -362,22 +367,11 @@ def test_rescale_nan_warning(in_range, out_range):
     image = np.arange(12, dtype=float).reshape(3, 4)
     image[1, 1] = np.nan
 
-    msg = (
-        r"One or more intensity levels are NaN\."
-        r" Rescaling will broadcast NaN to the full image\."
-    )
-
-    # 2019/11/10 Passing NaN to np.clip raises a DeprecationWarning for
-    # versions above 1.17, "|\A\Z" marks as optional warning
-    # TODO: Remove once NumPy 1.25.0 is minimal dependency
-    numpy_warning_1_17_plus = (
-        "|\\A\\ZPassing `np.nan` to mean no clipping in np.clip"
-    )
-
-    with expected_warnings([msg, numpy_warning_1_17_plus]):
-        result = exposure.rescale_intensity(image, in_range, out_range)
-
-    assert np.all(np.isnan(result))
+    with expected_warnings([
+            r"One or more intensity levels are NaN\."
+            r" Rescaling will broadcast NaN to the full image\."
+    ]):
+        exposure.rescale_intensity(image, in_range, out_range)
 
 
 @pytest.mark.parametrize(
diff --git a/skimage/feature/peak.py b/skimage/feature/peak.py
index 4097d8245b1..5dca21d8dbb 100644
--- a/skimage/feature/peak.py
+++ b/skimage/feature/peak.py
@@ -15,7 +15,7 @@ def _get_high_intensity_peaks(image, mask, num_peaks, 
min_distance, p_norm):
     coord = np.nonzero(mask)
     intensities = image[coord]
     # Highest peak first
-    idx_maxsort = np.argsort(-intensities)
+    idx_maxsort = np.argsort(-intensities, kind="stable")
     coord = np.transpose(coord)[idx_maxsort]
 
     if np.isfinite(num_peaks):
diff --git a/skimage/measure/fit.py b/skimage/measure/fit.py
index dd0135290a2..0a21f8000fc 100644
--- a/skimage/measure/fit.py
+++ b/skimage/measure/fit.py
@@ -576,8 +576,8 @@ def residuals(self, data):
         N = data.shape[0]
 
         def fun(t, xi, yi):
-            ct = math.cos(t)
-            st = math.sin(t)
+            ct = math.cos(np.squeeze(t))
+            st = math.sin(np.squeeze(t))
             xt = xc + a * ctheta * ct - b * stheta * st
             yt = yc + a * stheta * ct + b * ctheta * st
             return (xi - xt) ** 2 + (yi - yt) ** 2
diff --git a/skimage/morphology/_util.py b/skimage/morphology/_util.py
index c04cd13d6f4..d19fd6263e8 100644
--- a/skimage/morphology/_util.py
+++ b/skimage/morphology/_util.py
@@ -148,16 +148,17 @@ def _raveled_offsets_and_distances(
         spacing = np.ones(ndim)
     weighted_offsets = offsets * spacing
     distances = np.sqrt(np.sum(weighted_offsets**2, axis=1))
-    sorted_raveled_offsets = raveled_offsets[np.argsort(distances)]
-    sorted_distances = np.sort(distances)
+    sorted_raveled_offsets = raveled_offsets[np.argsort(distances, 
kind="stable")]
+    sorted_distances = np.sort(distances, kind="stable")
 
     # If any dimension in image_shape is smaller than footprint.shape
     # duplicates might occur, remove them
     if any(x < y for x, y in zip(image_shape, footprint.shape)):
         # np.unique reorders, which we don't want
         _, indices = np.unique(sorted_raveled_offsets, return_index=True)
-        sorted_raveled_offsets = sorted_raveled_offsets[np.sort(indices)]
-        sorted_distances = sorted_distances[np.sort(indices)]
+        indices = np.sort(indices, kind="stable")
+        sorted_raveled_offsets = sorted_raveled_offsets[indices]
+        sorted_distances = sorted_distances[indices]
 
     # Remove "offset to center"
     sorted_raveled_offsets = sorted_raveled_offsets[1:]
@@ -198,7 +199,7 @@ def _offsets_to_raveled_neighbors(image_shape, footprint, 
center, order='C'):
     >>> _offsets_to_raveled_neighbors((4, 5), np.ones((4, 3)), (1, 1))
     array([-5, -1,  1,  5, -6, -4,  4,  6, 10,  9, 11])
     >>> _offsets_to_raveled_neighbors((2, 3, 2), np.ones((3, 3, 3)), (1, 1, 1))
-    array([ 2, -6,  1, -1,  6, -2,  3,  8, -3, -4,  7, -5, -7, -8,  5,  4, -9,
+    array([-6, -2, -1,  1,  2,  6, -8, -7, -5, -4, -3,  3,  4,  5,  7,  8, -9,
             9])
     """
     raveled_offsets = _raveled_offsets_and_distances(
diff --git a/skimage/morphology/max_tree.py b/skimage/morphology/max_tree.py
index 49832e1c2b2..0f7c2bd29e4 100644
--- a/skimage/morphology/max_tree.py
+++ b/skimage/morphology/max_tree.py
@@ -131,7 +131,7 @@ def max_tree(image, connectivity=1):
                                                       offset).astype(np.int32)
 
     # pixels need to be sorted according to their gray level.
-    tree_traverser = np.argsort(image.ravel()).astype(np.int64)
+    tree_traverser = np.argsort(image.ravel(), kind="stable").astype(np.int64)
 
     # call of cython function.
     _max_tree._max_tree(image.ravel(), mask.ravel().astype(np.uint8),
diff --git a/skimage/morphology/tests/test_util.py 
b/skimage/morphology/tests/test_util.py
index bc9a0fcbb6e..43024440224 100644
--- a/skimage/morphology/tests/test_util.py
+++ b/skimage/morphology/tests/test_util.py
@@ -98,9 +98,9 @@ def test_offsets_to_raveled_neighbors_explicit_0():
     )
 
     desired = np.array([
-          3, -600,    1,   -1,  600,   -3,    4,    2,  603,   -2,   -4,
-        -597,  601, -599, -601, -603,  599,  597,  602, -604,  596, -596,
-        -598, -602,  598,  604
+        -600,   -3,   -1,    1,    3,  600, -603, -601, -599, -597,   -4,
+         -2,    2,    4,  597,  599,  601,  603, -604, -602, -598, -596,
+        596,  598,  602,  604
     ])
     assert_array_equal(offsets, desired)
 
@@ -115,12 +115,12 @@ def test_offsets_to_raveled_neighbors_explicit_1():
     )
 
     desired = np.array([
-            216, 24, -24, 3, -216, 1, -1, -3, 215, -27, -25, -23, -21, -2,
-            -192, 192, 2, 4, 21, 23, 25, 27, -4, 217, 213, -219, 219, -217,
-            -213, -215, 240, -240, 193, 239, -237, 241, -239, 218, -220, 22,
-            -241, 243, 189, 26, -243, 191, 20, -218, 195, -193, 220, -191,
-            -212, -189, 214, 28, -195, -214, -28, 212, -22, 237, -20, -26, 236,
-            196, 190, 242, 238, 194, 188, -244, -188, -196, -194, -190, -238,
-            -236, 244, -242, 5, 221, -211, -19, 29, -235, -187, 197, 245
-            ])
+        -216,  -24,   -3,   -1,    1,    3,   24,  216, -240, -219, -217, 
-215, -213,
+        -192,  -27,  -25,  -23,  -21,   -4,   -2,    2,    4,   21,   23,   
25,   27,
+         192,  213,  215,  217,  219,  240, -243, -241, -239, -237, -220, 
-218, -214,
+        -212, -195, -193, -191, -189,  -28,  -26,  -22,  -20,   20,   22,   
26,   28,
+         189,  191,  193,  195,  212,  214,  218,  220,  237,  239,  241,  
243, -244,
+        -242, -238, -236, -196, -194, -190, -188,  188,  190,  194,  196,  
236,  238,
+         242,  244,    5, -211,  -19,   29,  221, -235, -187,  197,  245
+    ])
     assert_array_equal(offsets, desired)

Reply via email to