You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.0 KiB
100 lines
3.0 KiB
import numpy as np
|
|
from numpy.testing import assert_allclose, assert_equal
|
|
import pytest
|
|
from scipy.special._ufuncs import _gen_harmonic, _normalized_gen_harmonic
|
|
|
|
|
|
#
|
|
# In the following tests, reference values were computed with mpmath.
|
|
#
|
|
|
|
@pytest.mark.parametrize('typ', [np.int32, np.int64, np.float64])
|
|
@pytest.mark.parametrize(
|
|
'n, a, ref',
|
|
[(8, 9.0, 1.0020083884212339),
|
|
(1000, 2.5, 1.3414661912046497),
|
|
(10, 1.5, 1.9953364933456017),
|
|
(10000, 1.25, 4.1951168257387765),
|
|
(10000,1.00001, 9.787182620770265),
|
|
(80, 1.000002, 4.965460167788836),
|
|
(75, 1 + 1e-12, 4.901355630543771),
|
|
(100, 1 + 1e-14, 5.187377517639515),
|
|
(100, 1 + 8e-16, 5.187377517639611),
|
|
(100, 1.0, 5.187377517639621),
|
|
(7, 1.0, 2.592857142857143),
|
|
(8000, 1.0, 9.564474984261423),
|
|
(5, 1 - 1e-12, 2.2833333333347143),
|
|
(25000, 1 - 1e-12, 10.703866768669737),
|
|
(1000, 0.995, 7.6058022857089975),
|
|
(1000, 0.75, 19.055178975831392),
|
|
(10000, 0.25, 1332.5700547197382),
|
|
(5, 1e-8, 4.999999952125083),
|
|
(15, 1e-16, 14.999999999999996),
|
|
(100, 0.0, 100.0),
|
|
(4, -1.0, 10.0),
|
|
(75, -1.5, 19811.38815892374)]
|
|
)
|
|
def test_gen_harmonic(typ, n, a, ref):
|
|
h = _gen_harmonic(typ(n), a)
|
|
assert_allclose(h, ref, rtol=5e-15)
|
|
|
|
|
|
@pytest.mark.parametrize('typ', [np.int32, np.int64, np.float64])
|
|
@pytest.mark.parametrize(
|
|
'n, a, ref',
|
|
[(10, np.inf, 1.0),
|
|
(1, np.nan, 1.0),
|
|
(1, -np.inf, 1.0),
|
|
(3, np.nan, np.nan),
|
|
(-3, 1.0, np.nan)]
|
|
)
|
|
def test_gen_harmonic_exact_cases(typ, n, a, ref):
|
|
h = _gen_harmonic(typ(n), a)
|
|
assert_equal(h, ref)
|
|
|
|
|
|
def test_gen_harmonic_n_nan():
|
|
h = _gen_harmonic(np.nan, 0.75)
|
|
assert_equal(h, np.nan)
|
|
|
|
|
|
@pytest.mark.parametrize('typ', [np.int32, np.int64, np.float64])
|
|
@pytest.mark.parametrize(
|
|
'j, k, n, a, ref',
|
|
[(400, 5000, 5000, 10.0, 4.2821759663214485e-25),
|
|
(400, 5000, 5000, 3.5, 1.11086549102426e-07),
|
|
(1, 2, 3, 1.5, 0.8755176866163012),
|
|
(300, 500, 500, 1 + 1e-14, 0.07559343891632035),
|
|
(1500, 2500, 3000, 1 - 1e-12, 0.05957291246371843),
|
|
(10, 12, 16, 0.5, 0.13601665344521513),
|
|
(16, 16, 20, 0.125, 0.04583107002260924),
|
|
(10, 12, 16, -0.5, 0.22359306724308234),
|
|
(1, 8000, 10000, -1.5, 0.5724512895513029)]
|
|
)
|
|
def test_normalized_gen_harmonic(typ, j, k, n, a, ref):
|
|
h = _normalized_gen_harmonic(typ(j), typ(k), typ(n), a)
|
|
assert_allclose(h, ref, 5e-15)
|
|
|
|
|
|
@pytest.mark.parametrize('typ', [np.int32, np.int64, np.float64])
|
|
@pytest.mark.parametrize(
|
|
'j, k, n, a, ref',
|
|
[(1, 1, 1, 0.5, 1.0),
|
|
(1, 1, 1, np.nan, 1.0),
|
|
(1, 2, 5, np.nan, np.nan),
|
|
(1, 2, 1, 1.25, np.nan),
|
|
(1, 2, 3, np.inf, 1.0),
|
|
(2, 3, 4, np.inf, 0.0),
|
|
(1, 1, 10, -np.inf, 0.0),
|
|
(2, 3, 4, -np.inf, np.nan),
|
|
(3, 6, 8, 0.0, 0.5)]
|
|
)
|
|
def test_normalized_gen_harmonic_exact_cases(typ, j, k, n, a, ref):
|
|
h = _normalized_gen_harmonic(typ(j), typ(k), typ(n), a)
|
|
assert_equal(h, ref)
|
|
|
|
|
|
def test_normalized_gen_harmonic_input_nan():
|
|
h = _normalized_gen_harmonic(1.0, np.nan, 10.0, 1.05)
|
|
assert_equal(h, np.nan)
|