Allow some numba errors on non-amd64, warn on non-x86
authorDebian Science Team <debian-science-maintainers@lists.alioth.debian.org>
Tue, 12 Jan 2021 21:06:04 +0000 (21:06 +0000)
committerRebecca N. Palmer <rebecca_palmer@zoho.com>
Tue, 12 Jan 2021 21:06:04 +0000 (21:06 +0000)
Specifying the exception type allows only explicit errors,
not silently wrong answers

Numba has been observed to give wrong answers on mipsel,
and crash on armel (LLVM ERROR) and s390x (segfault).

Author: Rebecca N. Palmer <rebecca_palmer@zoho.com>
Forwarded: no

Gbp-Pq: Name numba_fail_32bit.patch

pandas/core/window/numba_.py
pandas/tests/groupby/transform/test_numba.py
pandas/tests/window/conftest.py
pandas/tests/window/test_numba.py

index 5d35ec7457ab0b82abad8c1ee0f7059d7eef77f7..d75c1d254152e5dc915e64360ea065f45cec27ee 100644 (file)
@@ -4,6 +4,10 @@ import numpy as np
 
 from pandas._typing import Scalar
 from pandas.compat._optional import import_optional_dependency
+import platform
+import re
+import warnings
+warn_numba_platform = "Non-x86 system detected, Numba may give wrong results or crash" if not bool(re.match('i.?86|x86',platform.uname()[4])) else False
 
 from pandas.core.util.numba_ import (
     check_kwargs_and_nopython,
@@ -49,6 +53,8 @@ def generate_numba_apply_func(
     numba_func = jit_user_function(func, nopython, nogil, parallel)
 
     numba = import_optional_dependency("numba")
+    if warn_numba_platform:
+        warnings.warn(warn_numba_platform)
 
     if parallel:
         loop_range = numba.prange
index ee482571e644dc0808c6b21c4b8749d1e370f57a..ae0b086c02306952be3f08d6393bbf110153a56b 100644 (file)
@@ -6,6 +6,7 @@ import pandas.util._test_decorators as td
 from pandas import DataFrame, option_context
 import pandas._testing as tm
 from pandas.core.util.numba_ import NUMBA_FUNC_CACHE
+from pandas.compat import is_platform_little_endian
 
 
 @td.skip_if_no("numba", "0.46.0")
@@ -41,6 +42,7 @@ def test_check_nopython_kwargs():
 
 
 @td.skip_if_no("numba", "0.46.0")
+@pytest.mark.xfail(condition=not is_platform_little_endian(), reason="Numba may crash on s390x", run=False, strict=False)
 @pytest.mark.filterwarnings("ignore:\\nThe keyword argument")
 # Filter warnings when parallel=True and the function can't be parallelized by Numba
 @pytest.mark.parametrize("jit", [True, False])
@@ -70,6 +72,7 @@ def test_numba_vs_cython(jit, pandas_obj, nogil, parallel, nopython):
 
 
 @td.skip_if_no("numba", "0.46.0")
+@pytest.mark.xfail(condition=not is_platform_little_endian(), reason="Numba may crash on s390x", run=False, strict=False)
 @pytest.mark.filterwarnings("ignore:\\nThe keyword argument")
 # Filter warnings when parallel=True and the function can't be parallelized by Numba
 @pytest.mark.parametrize("jit", [True, False])
@@ -115,6 +118,7 @@ def test_cache(jit, pandas_obj, nogil, parallel, nopython):
 
 
 @td.skip_if_no("numba", "0.46.0")
+@pytest.mark.xfail(condition=not is_platform_little_endian(), reason="Numba may crash on s390x", run=False, strict=False)
 def test_use_global_config():
     def func_1(values, index):
         return values + 1
index eb8252d5731bea009b1e3e60dc5919d4293b626d..40150639a350d0e992a34d07157bcfdcc5852158 100644 (file)
@@ -5,6 +5,7 @@ from numpy.random import randn
 import pytest
 
 import pandas.util._test_decorators as td
+from pandas.compat import is_platform_little_endian
 
 from pandas import DataFrame, Series, bdate_range, notna
 
@@ -85,7 +86,7 @@ def engine(request):
 
 @pytest.fixture(
     params=[
-        pytest.param(("numba", True), marks=td.skip_if_no("numba", "0.46.0")),
+        pytest.param(("numba", True), marks=[pytest.mark.xfail(condition=not is_platform_little_endian(), reason="Numba may crash on s390x", run=False, strict=False),td.skip_if_no("numba", "0.46.0")]),
         ("cython", True),
         ("cython", False),
     ]
index 35bdb972a7bc02c89c830544caaacddd66876a88..5cc1f819a0fcbc7219787e2800dab74986be56e5 100644 (file)
@@ -6,9 +6,18 @@ import pandas.util._test_decorators as td
 from pandas import Series, option_context
 import pandas._testing as tm
 from pandas.core.util.numba_ import NUMBA_FUNC_CACHE
+from pandas.compat import is_platform_32bit, is_platform_little_endian
+import platform
+import sys
+try:
+    from numba.core.errors import UnsupportedParforsError
+except ImportError:
+    UnsupportedParforsError = ImportError
 
 
 @td.skip_if_no("numba", "0.46.0")
+@pytest.mark.xfail(condition=is_platform_32bit(), raises=UnsupportedParforsError, reason="some Numba functionality is not available on 32 bit systems", strict=False)
+@pytest.mark.xfail(condition=not is_platform_little_endian(), reason="Numba may crash on s390x", run=False, strict=False)
 @pytest.mark.filterwarnings("ignore:\\nThe keyword argument")
 # Filter warnings when parallel=True and the function can't be parallelized by Numba
 class TestApply:
@@ -37,6 +46,7 @@ class TestApply:
         )
         tm.assert_series_equal(result, expected)
 
+    @pytest.mark.xfail(condition='mips' in platform.uname()[4].lower() and sys.maxsize<2**33, reason="Numba may give wrong answers on mipsel", strict=False)
     @pytest.mark.parametrize("jit", [True, False])
     def test_cache(self, jit, nogil, parallel, nopython):
         # Test that the functions are cached correctly if we switch functions
@@ -78,6 +88,7 @@ class TestApply:
 
 
 @td.skip_if_no("numba", "0.46.0")
+@pytest.mark.xfail(condition=not is_platform_little_endian(), reason="Numba may crash on s390x", run=False, strict=False)
 def test_use_global_config():
     def f(x):
         return np.mean(x) + 2