$36 GRAYBYTE WORDPRESS FILE MANAGER $22

SERVER : vnpttt-amd7f72-h1.vietnix.vn #1 SMP Fri May 24 12:42:50 UTC 2024
SERVER IP : 103.200.23.149 | ADMIN IP 216.73.216.22
OPTIONS : CRL = ON | WGT = ON | SDO = OFF | PKEX = OFF
DEACTIVATED : NONE

/opt/cloudlinux/venv/lib/python3.11/site-packages/numpy/core/tests/

HOME
Current File : /opt/cloudlinux/venv/lib/python3.11/site-packages/numpy/core/tests//test_nep50_promotions.py
"""
This file adds basic tests to test the NEP 50 style promotion compatibility
mode.  Most of these test are likely to be simply deleted again once NEP 50
is adopted in the main test suite.  A few may be moved elsewhere.
"""

import operator

import numpy as np

import pytest
from numpy.testing import IS_WASM


@pytest.fixture(scope="module", autouse=True)
def _weak_promotion_enabled():
    state = np._get_promotion_state()
    np._set_promotion_state("weak_and_warn")
    yield
    np._set_promotion_state(state)


@pytest.mark.skipif(IS_WASM, reason="wasm doesn't have support for fp errors")
def test_nep50_examples():
    with pytest.warns(UserWarning, match="result dtype changed"):
        res = np.uint8(1) + 2
    assert res.dtype == np.uint8

    with pytest.warns(UserWarning, match="result dtype changed"):
        res = np.array([1], np.uint8) + np.int64(1)
    assert res.dtype == np.int64

    with pytest.warns(UserWarning, match="result dtype changed"):
        res = np.array([1], np.uint8) + np.array(1, dtype=np.int64)
    assert res.dtype == np.int64

    with pytest.warns(UserWarning, match="result dtype changed"):
        # Note: For "weak_and_warn" promotion state the overflow warning is
        #       unfortunately not given (because we use the full array path).
        with np.errstate(over="raise"):
            res = np.uint8(100) + 200
    assert res.dtype == np.uint8

    with pytest.warns(Warning) as recwarn:
        res = np.float32(1) + 3e100

    # Check that both warnings were given in the one call:
    warning = str(recwarn.pop(UserWarning).message)
    assert warning.startswith("result dtype changed")
    warning = str(recwarn.pop(RuntimeWarning).message)
    assert warning.startswith("overflow")
    assert len(recwarn) == 0  # no further warnings
    assert np.isinf(res)
    assert res.dtype == np.float32

    # Changes, but we don't warn for it (too noisy)
    res = np.array([0.1], np.float32) == np.float64(0.1)
    assert res[0] == False

    # Additional test, since the above silences the warning:
    with pytest.warns(UserWarning, match="result dtype changed"):
        res = np.array([0.1], np.float32) + np.float64(0.1)
    assert res.dtype == np.float64

    with pytest.warns(UserWarning, match="result dtype changed"):
        res = np.array([1.], np.float32) + np.int64(3)
    assert res.dtype == np.float64


@pytest.mark.parametrize("dtype", np.typecodes["AllInteger"])
def test_nep50_weak_integers(dtype):
    # Avoids warning (different code path for scalars)
    np._set_promotion_state("weak")
    scalar_type = np.dtype(dtype).type

    maxint = int(np.iinfo(dtype).max)

    with np.errstate(over="warn"):
        with pytest.warns(RuntimeWarning):
            res = scalar_type(100) + maxint
    assert res.dtype == dtype

    # Array operations are not expected to warn, but should give the same
    # result dtype.
    res = np.array(100, dtype=dtype) + maxint
    assert res.dtype == dtype


@pytest.mark.parametrize("dtype", np.typecodes["AllFloat"])
def test_nep50_weak_integers_with_inexact(dtype):
    # Avoids warning (different code path for scalars)
    np._set_promotion_state("weak")
    scalar_type = np.dtype(dtype).type

    too_big_int = int(np.finfo(dtype).max) * 2

    if dtype in "dDG":
        # These dtypes currently convert to Python float internally, which
        # raises an OverflowError, while the other dtypes overflow to inf.
        # NOTE: It may make sense to normalize the behavior!
        with pytest.raises(OverflowError):
            scalar_type(1) + too_big_int

        with pytest.raises(OverflowError):
            np.array(1, dtype=dtype) + too_big_int
    else:
        # NumPy uses (or used) `int -> string -> longdouble` for the
        # conversion.  But Python may refuse `str(int)` for huge ints.
        # In that case, RuntimeWarning would be correct, but conversion
        # fails earlier (seems to happen on 32bit linux, possibly only debug).
        if dtype in "gG":
            try:
                str(too_big_int)
            except ValueError:
                pytest.skip("`huge_int -> string -> longdouble` failed")

        # Otherwise, we overflow to infinity:
        with pytest.warns(RuntimeWarning):
            res = scalar_type(1) + too_big_int
        assert res.dtype == dtype
        assert res == np.inf

        with pytest.warns(RuntimeWarning):
            # We force the dtype here, since windows may otherwise pick the
            # double instead of the longdouble loop.  That leads to slightly
            # different results (conversion of the int fails as above).
            res = np.add(np.array(1, dtype=dtype), too_big_int, dtype=dtype)
        assert res.dtype == dtype
        assert res == np.inf


@pytest.mark.parametrize("op", [operator.add, operator.pow, operator.eq])
def test_weak_promotion_scalar_path(op):
    # Some additional paths exercising the weak scalars.
    np._set_promotion_state("weak")

    # Integer path:
    res = op(np.uint8(3), 5)
    assert res == op(3, 5)
    assert res.dtype == np.uint8 or res.dtype == bool

    with pytest.raises(OverflowError):
        op(np.uint8(3), 1000)

    # Float path:
    res = op(np.float32(3), 5.)
    assert res == op(3., 5.)
    assert res.dtype == np.float32 or res.dtype == bool


def test_nep50_complex_promotion():
    np._set_promotion_state("weak")

    with pytest.warns(RuntimeWarning, match=".*overflow"):
        res = np.complex64(3) + complex(2**300)

    assert type(res) == np.complex64


def test_nep50_integer_conversion_errors():
    # Do not worry about warnings here (auto-fixture will reset).
    np._set_promotion_state("weak")
    # Implementation for error paths is mostly missing (as of writing)
    with pytest.raises(OverflowError, match=".*uint8"):
        np.array([1], np.uint8) + 300

    with pytest.raises(OverflowError, match=".*uint8"):
        np.uint8(1) + 300

    # Error message depends on platform (maybe unsigned int or unsigned long)
    with pytest.raises(OverflowError,
            match="Python integer -1 out of bounds for uint8"):
        np.uint8(1) + -1


def test_nep50_integer_regression():
    # Test the old integer promotion rules.  When the integer is too large,
    # we need to keep using the old-style promotion.
    np._set_promotion_state("legacy")
    arr = np.array(1)
    assert (arr + 2**63).dtype == np.float64
    assert (arr[()] + 2**63).dtype == np.float64


def test_nep50_with_axisconcatenator():
    # I promised that this will be an error in the future in the 1.25
    # release notes;  test this (NEP 50 opt-in makes the deprecation an error).
    np._set_promotion_state("weak")

    with pytest.raises(OverflowError):
        np.r_[np.arange(5, dtype=np.int8), 255]


@pytest.mark.parametrize("ufunc", [np.add, np.power])
@pytest.mark.parametrize("state", ["weak", "weak_and_warn"])
def test_nep50_huge_integers(ufunc, state):
    # Very large integers are complicated, because they go to uint64 or
    # object dtype.  This tests covers a few possible paths (some of which
    # cannot give the NEP 50 warnings).
    np._set_promotion_state(state)

    with pytest.raises(OverflowError):
        ufunc(np.int64(0), 2**63)  # 2**63 too large for int64

    if state == "weak_and_warn":
        with pytest.warns(UserWarning,
                match="result dtype changed.*float64.*uint64"):
            with pytest.raises(OverflowError):
                ufunc(np.uint64(0), 2**64)
    else:
        with pytest.raises(OverflowError):
            ufunc(np.uint64(0), 2**64)  # 2**64 cannot be represented by uint64

    # However, 2**63 can be represented by the uint64 (and that is used):
    if state == "weak_and_warn":
        with pytest.warns(UserWarning,
                match="result dtype changed.*float64.*uint64"):
            res = ufunc(np.uint64(1), 2**63)
    else:
        res = ufunc(np.uint64(1), 2**63)

    assert res.dtype == np.uint64
    assert res == ufunc(1, 2**63, dtype=object)

    # The following paths fail to warn correctly about the change:
    with pytest.raises(OverflowError):
        ufunc(np.int64(1), 2**63)  # np.array(2**63) would go to uint

    with pytest.raises(OverflowError):
        ufunc(np.int64(1), 2**100)  # np.array(2**100) would go to object

    # This would go to object and thus a Python float, not a NumPy one:
    res = ufunc(1.0, 2**100)
    assert isinstance(res, np.float64)


def test_nep50_in_concat_and_choose():
    np._set_promotion_state("weak_and_warn")

    with pytest.warns(UserWarning, match="result dtype changed"):
        res = np.concatenate([np.float32(1), 1.], axis=None)
    assert res.dtype == "float32"

    with pytest.warns(UserWarning, match="result dtype changed"):
        res = np.choose(1, [np.float32(1), 1.])
    assert res.dtype == "float32"

Current_dir [ NOT WRITEABLE ] Document_root [ WRITEABLE ]


[ Back ]
NAME
SIZE
LAST TOUCH
USER
CAN-I?
FUNCTIONS
..
--
14 Aug 2025 9.24 PM
root / root
0755
__pycache__
--
14 Aug 2025 9.24 PM
root / root
0755
data
--
14 Aug 2025 9.24 PM
root / root
0755
examples
--
17 Apr 2025 8.10 PM
root / root
0755
__init__.py
0 KB
17 Apr 2025 8.10 PM
root / root
0644
_locales.py
2.154 KB
17 Apr 2025 8.10 PM
root / root
0644
test__exceptions.py
2.779 KB
17 Apr 2025 8.10 PM
root / root
0644
test_abc.py
2.168 KB
17 Apr 2025 8.10 PM
root / root
0644
test_api.py
22.456 KB
17 Apr 2025 8.10 PM
root / root
0644
test_argparse.py
1.923 KB
17 Apr 2025 8.10 PM
root / root
0644
test_array_coercion.py
33.573 KB
17 Apr 2025 8.10 PM
root / root
0644
test_array_interface.py
7.418 KB
17 Apr 2025 8.10 PM
root / root
0644
test_arraymethod.py
3.168 KB
17 Apr 2025 8.10 PM
root / root
0644
test_arrayprint.py
39.514 KB
17 Apr 2025 8.10 PM
root / root
0644
test_casting_floatingpoint_errors.py
4.944 KB
17 Apr 2025 8.10 PM
root / root
0644
test_casting_unittests.py
33.494 KB
17 Apr 2025 8.10 PM
root / root
0644
test_conversion_utils.py
6.405 KB
17 Apr 2025 8.10 PM
root / root
0644
test_cpu_dispatcher.py
1.485 KB
17 Apr 2025 8.10 PM
root / root
0644
test_cpu_features.py
14.51 KB
17 Apr 2025 8.10 PM
root / root
0644
test_custom_dtypes.py
9.181 KB
17 Apr 2025 8.10 PM
root / root
0644
test_cython.py
3.538 KB
17 Apr 2025 8.10 PM
root / root
0644
test_datetime.py
113.487 KB
17 Apr 2025 8.10 PM
root / root
0644
test_defchararray.py
24.411 KB
17 Apr 2025 8.10 PM
root / root
0644
test_deprecations.py
30.348 KB
17 Apr 2025 8.10 PM
root / root
0644
test_dlpack.py
3.439 KB
17 Apr 2025 8.10 PM
root / root
0644
test_dtype.py
73.523 KB
17 Apr 2025 8.10 PM
root / root
0644
test_einsum.py
51.719 KB
17 Apr 2025 8.10 PM
root / root
0644
test_errstate.py
2.167 KB
17 Apr 2025 8.10 PM
root / root
0644
test_extint128.py
5.511 KB
17 Apr 2025 8.10 PM
root / root
0644
test_function_base.py
15.229 KB
17 Apr 2025 8.10 PM
root / root
0644
test_getlimits.py
6.561 KB
17 Apr 2025 8.10 PM
root / root
0644
test_half.py
23.658 KB
17 Apr 2025 8.10 PM
root / root
0644
test_hashtable.py
0.987 KB
17 Apr 2025 8.10 PM
root / root
0644
test_indexerrors.py
5.01 KB
17 Apr 2025 8.10 PM
root / root
0644
test_indexing.py
53.041 KB
17 Apr 2025 8.10 PM
root / root
0644
test_item_selection.py
6.307 KB
17 Apr 2025 8.10 PM
root / root
0644
test_limited_api.py
1.145 KB
17 Apr 2025 8.10 PM
root / root
0644
test_longdouble.py
13.579 KB
17 Apr 2025 8.10 PM
root / root
0644
test_machar.py
1.042 KB
17 Apr 2025 8.10 PM
root / root
0644
test_mem_overlap.py
28.404 KB
17 Apr 2025 8.10 PM
root / root
0644
test_mem_policy.py
15.629 KB
17 Apr 2025 8.10 PM
root / root
0644
test_memmap.py
7.302 KB
17 Apr 2025 8.10 PM
root / root
0644
test_multiarray.py
370.43 KB
17 Apr 2025 8.10 PM
root / root
0644
test_nditer.py
127.752 KB
17 Apr 2025 8.10 PM
root / root
0644
test_nep50_promotions.py
8.633 KB
17 Apr 2025 8.10 PM
root / root
0644
test_numeric.py
133.343 KB
17 Apr 2025 8.10 PM
root / root
0644
test_numerictypes.py
21.179 KB
17 Apr 2025 8.10 PM
root / root
0644
test_overrides.py
25.469 KB
17 Apr 2025 8.10 PM
root / root
0644
test_print.py
6.677 KB
17 Apr 2025 8.10 PM
root / root
0644
test_protocols.py
1.141 KB
17 Apr 2025 8.10 PM
root / root
0644
test_records.py
19.794 KB
17 Apr 2025 8.10 PM
root / root
0644
test_regression.py
89.304 KB
17 Apr 2025 8.10 PM
root / root
0644
test_scalar_ctors.py
5.972 KB
17 Apr 2025 8.10 PM
root / root
0644
test_scalar_methods.py
7.364 KB
17 Apr 2025 8.10 PM
root / root
0644
test_scalarbuffer.py
5.449 KB
17 Apr 2025 8.10 PM
root / root
0644
test_scalarinherit.py
2.313 KB
17 Apr 2025 8.10 PM
root / root
0644
test_scalarmath.py
41.88 KB
17 Apr 2025 8.10 PM
root / root
0644
test_scalarprint.py
18.331 KB
17 Apr 2025 8.10 PM
root / root
0644
test_shape_base.py
29.026 KB
17 Apr 2025 8.10 PM
root / root
0644
test_simd.py
47.555 KB
17 Apr 2025 8.10 PM
root / root
0644
test_simd_module.py
3.716 KB
17 Apr 2025 8.10 PM
root / root
0644
test_strings.py
3.745 KB
17 Apr 2025 8.10 PM
root / root
0644
test_ufunc.py
121.235 KB
17 Apr 2025 8.10 PM
root / root
0644
test_umath.py
180.79 KB
17 Apr 2025 8.10 PM
root / root
0644
test_umath_accuracy.py
3.806 KB
17 Apr 2025 8.10 PM
root / root
0644
test_umath_complex.py
22.698 KB
17 Apr 2025 8.10 PM
root / root
0644
test_unicode.py
12.476 KB
17 Apr 2025 8.10 PM
root / root
0644

GRAYBYTE WORDPRESS FILE MANAGER @ 2026 CONTACT ME
Static GIF