import numpy as np
import pytest
import scirs2
class TestSkewnessSIMD:
def test_skewness_simd_symmetric(self):
data = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
result = scirs2.skewness_simd_py(data, bias=True)
assert abs(result) < 1e-10
def test_skewness_simd_positive(self):
data = np.array([1.0, 2.0, 2.0, 3.0, 10.0])
result = scirs2.skewness_simd_py(data, bias=True)
assert result > 0
def test_skewness_simd_negative(self):
data = np.array([1.0, 8.0, 8.0, 9.0, 10.0])
result = scirs2.skewness_simd_py(data, bias=True)
assert result < 0
def test_skewness_simd_bias_correction(self):
data = np.array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0])
biased = scirs2.skewness_simd_py(data, bias=True)
unbiased = scirs2.skewness_simd_py(data, bias=False)
assert abs(biased) < 1e-10
assert abs(unbiased) < 1e-10
def test_skewness_simd_vs_regular(self):
data = np.array([2.0, 8.0, 0.0, 4.0, 1.0, 9.0, 9.0, 0.0])
simd_result = scirs2.skewness_simd_py(data, bias=True)
regular_result = scirs2.skew_py(data)
assert simd_result == pytest.approx(regular_result, abs=1e-10)
def test_skewness_simd_large_array(self):
np.random.seed(42)
data = np.random.normal(0, 1, 10000)
result = scirs2.skewness_simd_py(data, bias=True)
assert abs(result) < 0.1
class TestKurtosisSIMD:
def test_kurtosis_simd_fisher_biased(self):
data = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
result = scirs2.skewness_simd_py(data, bias=True)
result = scirs2.kurtosis_simd_py(data, fisher=True, bias=True)
assert result < 0
def test_kurtosis_simd_pearson_biased(self):
data = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
result = scirs2.kurtosis_simd_py(data, fisher=False, bias=True)
fisher_result = scirs2.kurtosis_simd_py(data, fisher=True, bias=True)
assert result == pytest.approx(fisher_result + 3.0, abs=1e-10)
def test_kurtosis_simd_fisher_unbiased(self):
data = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
result = scirs2.kurtosis_simd_py(data, fisher=True, bias=False)
biased = scirs2.kurtosis_simd_py(data, fisher=True, bias=True)
assert abs(result - biased) > 0.01
def test_kurtosis_simd_peaked_distribution(self):
data = np.array([5.0, 5.0, 5.0, 5.0, 5.0, 10.0, 15.0, 5.0, 5.0])
result = scirs2.kurtosis_simd_py(data, fisher=True, bias=True)
assert result > 0
def test_kurtosis_simd_vs_regular(self):
data = np.array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0])
simd_result = scirs2.kurtosis_simd_py(data, fisher=True, bias=True)
regular_result = scirs2.kurtosis_py(data)
assert simd_result == pytest.approx(regular_result, abs=1e-10)
def test_kurtosis_simd_large_array(self):
np.random.seed(42)
data = np.random.normal(0, 1, 10000)
result = scirs2.kurtosis_simd_py(data, fisher=True, bias=True)
assert abs(result) < 0.2
class TestPearsonRSIMD:
def test_pearson_r_simd_perfect_positive(self):
x = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
y = np.array([2.0, 4.0, 6.0, 8.0, 10.0])
result = scirs2.pearson_r_simd_py(x, y)
assert result == pytest.approx(1.0, abs=1e-10)
def test_pearson_r_simd_perfect_negative(self):
x = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
y = np.array([5.0, 4.0, 3.0, 2.0, 1.0])
result = scirs2.pearson_r_simd_py(x, y)
assert result == pytest.approx(-1.0, abs=1e-10)
def test_pearson_r_simd_no_correlation(self):
np.random.seed(42)
x = np.random.normal(0, 1, 1000)
y = np.random.normal(0, 1, 1000)
result = scirs2.pearson_r_simd_py(x, y)
assert abs(result) < 0.1
def test_pearson_r_simd_moderate_positive(self):
np.random.seed(42)
x = np.random.normal(0, 1, 100)
y = 0.5 * x + np.random.normal(0, 0.5, 100)
result = scirs2.pearson_r_simd_py(x, y)
assert 0.5 < result < 0.9
def test_pearson_r_simd_vs_regular(self):
x = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
y = np.array([2.1, 3.9, 6.1, 8.0, 9.9])
simd_result = scirs2.pearson_r_simd_py(x, y)
regular_dict = scirs2.pearsonr_py(x, y)
regular_result = regular_dict['correlation'] assert simd_result == pytest.approx(regular_result, abs=1e-10)
def test_pearson_r_simd_large_array(self):
np.random.seed(42)
x = np.random.normal(0, 1, 10000)
y = 0.7 * x + np.random.normal(0, 0.5, 10000)
result = scirs2.pearson_r_simd_py(x, y)
assert 0.6 < result < 0.85
def test_pearson_r_simd_length_mismatch(self):
x = np.array([1.0, 2.0, 3.0])
y = np.array([1.0, 2.0])
with pytest.raises(RuntimeError, match="(?i)dimension mismatch"):
scirs2.pearson_r_simd_py(x, y)
class TestCovarianceSIMD:
def test_covariance_simd_perfect_positive(self):
x = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
y = np.array([2.0, 4.0, 6.0, 8.0, 10.0])
result = scirs2.covariance_simd_py(x, y, ddof=1)
assert result > 0
def test_covariance_simd_perfect_negative(self):
x = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
y = np.array([5.0, 4.0, 3.0, 2.0, 1.0])
result = scirs2.covariance_simd_py(x, y, ddof=1)
assert result < 0
def test_covariance_simd_zero(self):
x = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
y = np.array([5.0, 5.0, 5.0, 5.0, 5.0])
result = scirs2.covariance_simd_py(x, y, ddof=1)
assert abs(result) < 1e-10
def test_covariance_simd_ddof_0(self):
x = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
y = np.array([2.0, 4.0, 6.0, 8.0, 10.0])
result_ddof0 = scirs2.covariance_simd_py(x, y, ddof=0)
result_ddof1 = scirs2.covariance_simd_py(x, y, ddof=1)
assert result_ddof0 < result_ddof1
def test_covariance_simd_vs_regular(self):
x = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
y = np.array([2.1, 3.9, 6.1, 8.0, 9.9])
simd_result = scirs2.covariance_simd_py(x, y, ddof=1)
regular_result = scirs2.covariance_py(x, y, ddof=1)
assert simd_result == pytest.approx(regular_result, abs=1e-10)
def test_covariance_simd_formula_verification(self):
x = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
y = np.array([2.0, 4.0, 6.0, 8.0, 10.0])
mean_x = np.mean(x)
mean_y = np.mean(y)
manual_cov = np.sum((x - mean_x) * (y - mean_y)) / (len(x) - 1)
result = scirs2.covariance_simd_py(x, y, ddof=1)
assert result == pytest.approx(manual_cov, abs=1e-10)
def test_covariance_simd_large_array(self):
np.random.seed(42)
x = np.random.normal(0, 1, 10000)
y = 0.7 * x + np.random.normal(0, 0.5, 10000)
result = scirs2.covariance_simd_py(x, y, ddof=1)
assert result > 0
def test_covariance_simd_length_mismatch(self):
x = np.array([1.0, 2.0, 3.0])
y = np.array([1.0, 2.0])
with pytest.raises(RuntimeError, match="(?i)dimension mismatch"):
scirs2.covariance_simd_py(x, y, ddof=1)
class TestRealWorldScenarios:
def test_financial_returns_analysis(self):
np.random.seed(42)
stock_a = np.random.normal(0.001, 0.02, 252) stock_b = 0.6 * stock_a + np.random.normal(0.0005, 0.015, 252)
corr = scirs2.pearson_r_simd_py(stock_a, stock_b)
assert 0.4 < corr < 0.8
cov = scirs2.covariance_simd_py(stock_a, stock_b, ddof=1)
assert cov > 0
skew_a = scirs2.skewness_simd_py(stock_a, bias=False)
assert not np.isnan(skew_a)
kurt_a = scirs2.kurtosis_simd_py(stock_a, fisher=True, bias=False)
assert not np.isnan(kurt_a)
def test_sensor_data_correlation(self):
np.random.seed(42)
temperature = np.random.normal(20, 5, 1000)
humidity = -0.4 * temperature + np.random.normal(60, 10, 1000)
corr = scirs2.pearson_r_simd_py(temperature, humidity)
assert -0.6 < corr < -0.2
cov = scirs2.covariance_simd_py(temperature, humidity, ddof=1)
assert cov < 0
def test_quality_control_distribution(self):
np.random.seed(42)
measurements = np.concatenate([
np.random.normal(100, 2, 950),
np.random.normal(105, 3, 50) ])
skew = scirs2.skewness_simd_py(measurements, bias=False)
assert skew > 0
kurt = scirs2.kurtosis_simd_py(measurements, fisher=True, bias=False)
assert kurt > 0
class TestEdgeCases:
def test_skewness_simd_minimum_size(self):
data = np.array([1.0, 2.0, 3.0])
result = scirs2.skewness_simd_py(data, bias=False)
assert isinstance(result, float)
def test_kurtosis_simd_minimum_size(self):
data = np.array([1.0, 2.0, 3.0, 4.0])
result = scirs2.kurtosis_simd_py(data, fisher=True, bias=False)
assert isinstance(result, float)
def test_pearson_r_simd_minimum_size(self):
x = np.array([1.0, 2.0])
y = np.array([3.0, 4.0])
result = scirs2.pearson_r_simd_py(x, y)
assert isinstance(result, float)
def test_covariance_simd_minimum_size(self):
x = np.array([1.0, 2.0])
y = np.array([3.0, 4.0])
result = scirs2.covariance_simd_py(x, y, ddof=1)
assert isinstance(result, float)
def test_all_functions_identical_values(self):
data = np.array([5.0, 5.0, 5.0, 5.0, 5.0])
skew = scirs2.skewness_simd_py(data, bias=True)
assert abs(skew) < 1e-10
with pytest.raises(RuntimeError, match="Standard deviation is zero"):
scirs2.kurtosis_simd_py(data, fisher=True, bias=True)
other = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
with pytest.raises(RuntimeError, match="zero variance"):
scirs2.pearson_r_simd_py(data, other)
cov = scirs2.covariance_simd_py(data, other, ddof=1)
assert abs(cov) < 1e-10
class TestNumericalStability:
def test_large_magnitude_values(self):
x = np.array([1e10, 2e10, 3e10, 4e10, 5e10])
y = np.array([2e10, 4e10, 6e10, 8e10, 10e10])
corr = scirs2.pearson_r_simd_py(x, y)
assert corr == pytest.approx(1.0, abs=1e-6)
cov = scirs2.covariance_simd_py(x, y, ddof=1)
assert cov > 0
def test_small_magnitude_values(self):
x = np.array([1e-6, 2e-6, 3e-6, 4e-6, 5e-6])
y = np.array([5e-6, 4e-6, 3e-6, 2e-6, 1e-6])
corr = scirs2.pearson_r_simd_py(x, y)
assert corr == pytest.approx(-1.0, abs=1e-6)
def test_mixed_magnitude_values(self):
data = np.array([1e-5, 1e-3, 1e-1, 1e1, 1e3, 1e5])
skew = scirs2.skewness_simd_py(data, bias=True)
assert isinstance(skew, float)
assert not np.isnan(skew)
if __name__ == "__main__":
pytest.main([__file__, "-v"])