[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#863522: unblock: python-numpy/1:1.12.1-3



Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock

Please unblock package python-numpy

This upload fixes a bug when using numpy.abs() on numpy.nan on some
architectures; the bug is minor, but a user noticed nonetheless, the patch comes
directly from upstream and it's just a one-liner with extensive tests.

Source debdiff is attached

unblock python-numpy/1:1.12.1-3

-- System Information:
Debian Release: stretch/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: amd64
 (x86_64)
Foreign Architectures: i386

Kernel: Linux 4.2.0-1-amd64 (SMP w/8 CPU cores)
Locale: LANG=en_US.utf8, LC_CTYPE=en_US.utf8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
diff -Nru python-numpy-1.12.1/debian/changelog python-numpy-1.12.1/debian/changelog
--- python-numpy-1.12.1/debian/changelog	2017-04-05 06:26:43.000000000 -0400
+++ python-numpy-1.12.1/debian/changelog	2017-05-27 19:44:59.000000000 -0400
@@ -1,3 +1,10 @@
+python-numpy (1:1.12.1-3) unstable; urgency=medium
+
+  * debian/patches/0007-BUG-Don-t-signal-FP-exceptions-in-np.absolute.patch
+    - fix RuntimeWarning on numpy.abs(numpy.nan) on some archs; Closes: #863192
+
+ -- Sandro Tosi <morph@debian.org>  Sat, 27 May 2017 19:44:59 -0400
+
 python-numpy (1:1.12.1-2) unstable; urgency=medium
 
   * Team upload
diff -Nru python-numpy-1.12.1/debian/.git-dpm python-numpy-1.12.1/debian/.git-dpm
--- python-numpy-1.12.1/debian/.git-dpm	2017-04-04 12:49:56.000000000 -0400
+++ python-numpy-1.12.1/debian/.git-dpm	2017-05-27 19:44:59.000000000 -0400
@@ -1,6 +1,6 @@
 # see git-dpm(1) from git-dpm package
-4b26915f32eec3afa476d678bc7831ab7b1899c1
-4b26915f32eec3afa476d678bc7831ab7b1899c1
+285b463e037cd9aeaf37ccc90ccf3349cc84b88a
+285b463e037cd9aeaf37ccc90ccf3349cc84b88a
 db9ad0d21c51a5a4983387c232c00bd6f844e406
 db9ad0d21c51a5a4983387c232c00bd6f844e406
 python-numpy_1.12.1.orig.tar.gz
diff -Nru python-numpy-1.12.1/debian/patches/0007-BUG-Don-t-signal-FP-exceptions-in-np.absolute.patch python-numpy-1.12.1/debian/patches/0007-BUG-Don-t-signal-FP-exceptions-in-np.absolute.patch
--- python-numpy-1.12.1/debian/patches/0007-BUG-Don-t-signal-FP-exceptions-in-np.absolute.patch	1969-12-31 19:00:00.000000000 -0500
+++ python-numpy-1.12.1/debian/patches/0007-BUG-Don-t-signal-FP-exceptions-in-np.absolute.patch	2017-05-27 19:44:59.000000000 -0400
@@ -0,0 +1,89 @@
+From 285b463e037cd9aeaf37ccc90ccf3349cc84b88a Mon Sep 17 00:00:00 2001
+From: James Cowgill <james410@cowgill.org.uk>
+Date: Tue, 7 Mar 2017 11:39:01 +0000
+Subject: BUG: Don't signal FP exceptions in np.absolute
+
+Fixes #8686
+
+This PR centers around this piece of code in `numpy/core/src/umath/loops.c.src`:
+```c
+UNARY_LOOP {
+    const @type@ in1 = *(@type@ *)ip1;
+    const @type@ tmp = in1 > 0 ? in1 : -in1;
+    /* add 0 to clear -0.0 */
+    *((@type@ *)op1) = tmp + 0;
+}
+```
+
+If in1 is `NaN`, the C99 standard requires that the comparison `in1 > 0`
+signals `FE_INVALID`, but the usual semantics for the absolute function are
+that no FP exceptions should be generated (eg compare to C `fabs` and Python
+`abs`). This was probably never noticed due to a bug in GCC x86 where all
+floating point comparisons do not signal exceptions, however Clang on x86 and
+GCC on other architectures (including ARM and MIPS) do signal an FP exception
+here.
+
+Fix by clearing the floating point exceptions after the loop has
+finished. The alternative of rewriting the loop to use `npy_fabs`
+instead would also work but has performance issues because that function
+is not inlined. The `test_abs_neg_blocked` is adjusted not to ignore
+`FE_INVALID` errors because now both absolute and negate should never
+produce an FP exceptions.
+---
+ numpy/core/src/umath/loops.c.src |  1 +
+ numpy/core/tests/test_umath.py   | 30 ++++++++++++++----------------
+ 2 files changed, 15 insertions(+), 16 deletions(-)
+
+diff --git a/numpy/core/src/umath/loops.c.src b/numpy/core/src/umath/loops.c.src
+index 3c11908..7e683ab 100644
+--- a/numpy/core/src/umath/loops.c.src
++++ b/numpy/core/src/umath/loops.c.src
+@@ -1840,6 +1840,7 @@ NPY_NO_EXPORT void
+             *((@type@ *)op1) = tmp + 0;
+         }
+     }
++    npy_clear_floatstatus();
+ }
+ 
+ NPY_NO_EXPORT void
+diff --git a/numpy/core/tests/test_umath.py b/numpy/core/tests/test_umath.py
+index 6fea832..fad75cd 100644
+--- a/numpy/core/tests/test_umath.py
++++ b/numpy/core/tests/test_umath.py
+@@ -1226,22 +1226,20 @@ class TestAbsoluteNegative(TestCase):
+                 np.negative(inp, out=out)
+                 assert_equal(out, tgt, err_msg=msg)
+ 
+-                # will throw invalid flag depending on compiler optimizations
+-                with np.errstate(invalid='ignore'):
+-                    for v in [np.nan, -np.inf, np.inf]:
+-                        for i in range(inp.size):
+-                            d = np.arange(inp.size, dtype=dt)
+-                            inp[:] = -d
+-                            inp[i] = v
+-                            d[i] = -v if v == -np.inf else v
+-                            assert_array_equal(np.abs(inp), d, err_msg=msg)
+-                            np.abs(inp, out=out)
+-                            assert_array_equal(out, d, err_msg=msg)
+-
+-                            assert_array_equal(-inp, -1*inp, err_msg=msg)
+-                            d = -1 * inp
+-                            np.negative(inp, out=out)
+-                            assert_array_equal(out, d, err_msg=msg)
++                for v in [np.nan, -np.inf, np.inf]:
++                    for i in range(inp.size):
++                        d = np.arange(inp.size, dtype=dt)
++                        inp[:] = -d
++                        inp[i] = v
++                        d[i] = -v if v == -np.inf else v
++                        assert_array_equal(np.abs(inp), d, err_msg=msg)
++                        np.abs(inp, out=out)
++                        assert_array_equal(out, d, err_msg=msg)
++
++                        assert_array_equal(-inp, -1*inp, err_msg=msg)
++                        d = -1 * inp
++                        np.negative(inp, out=out)
++                        assert_array_equal(out, d, err_msg=msg)
+ 
+     def test_lower_align(self):
+         # check data that is not aligned to element size
diff -Nru python-numpy-1.12.1/debian/patches/series python-numpy-1.12.1/debian/patches/series
--- python-numpy-1.12.1/debian/patches/series	2017-04-04 12:49:56.000000000 -0400
+++ python-numpy-1.12.1/debian/patches/series	2017-05-27 19:44:59.000000000 -0400
@@ -4,3 +4,4 @@
 adapt_swig_docs_to_debian.patch
 0005-Dont-fail-if-we-cant-import-mingw32.patch
 0006-disable-asserts-on-ppc-with-broken-malloc-only-longd.patch
+0007-BUG-Don-t-signal-FP-exceptions-in-np.absolute.patch

Reply to: