import pytest
import numpy as np
import scirs2
class TestNormalDistribution:
def test_norm_creation(self):
dist = scirs2.norm()
assert dist is not None
dist_custom = scirs2.norm(loc=5.0, scale=2.0)
assert dist_custom is not None
def test_norm_pdf(self):
dist = scirs2.norm()
pdf_at_zero = dist.pdf(0.0)
assert abs(pdf_at_zero - 0.3989423) < 1e-5
assert abs(dist.pdf(1.0) - dist.pdf(-1.0)) < 1e-10
def test_norm_cdf(self):
dist = scirs2.norm()
cdf_at_zero = dist.cdf(0.0)
assert abs(cdf_at_zero - 0.5) < 1e-10
assert dist.cdf(10.0) > 0.999
def test_norm_ppf(self):
dist = scirs2.norm()
median = dist.ppf(0.5)
assert abs(median) < 1e-5
val = dist.ppf(0.9772)
assert abs(val - 2.0) < 0.05
def test_norm_rvs(self):
dist = scirs2.norm()
samples = dist.rvs(1000)
assert len(samples) == 1000
mean = np.mean(samples)
assert abs(mean) < 0.15
std = np.std(samples, ddof=1)
assert abs(std - 1.0) < 0.15
class TestBinomialDistribution:
def test_binom_creation(self):
dist = scirs2.binom(10, 0.5)
assert dist is not None
def test_binom_pmf(self):
dist = scirs2.binom(10, 0.5)
pmf_5 = dist.pmf(5.0)
pmf_0 = dist.pmf(0.0)
pmf_10 = dist.pmf(10.0)
assert pmf_5 > pmf_0
assert pmf_5 > pmf_10
def test_binom_cdf(self):
dist = scirs2.binom(10, 0.5)
cdf_0 = dist.cdf(0.0)
cdf_5 = dist.cdf(5.0)
cdf_10 = dist.cdf(10.0)
assert cdf_0 < cdf_5 < cdf_10
assert abs(cdf_10 - 1.0) < 1e-10
def test_binom_ppf(self):
dist = scirs2.binom(10, 0.5)
median = dist.ppf(0.5)
assert 4.0 <= median <= 6.0
def test_binom_rvs(self):
dist = scirs2.binom(10, 0.5)
samples = dist.rvs(1000)
assert len(samples) == 1000
assert all(0 <= s <= 10 for s in samples)
mean = np.mean(samples)
assert abs(mean - 5.0) < 0.5
class TestPoissonDistribution:
def test_poisson_creation(self):
dist = scirs2.poisson(3.0)
assert dist is not None
def test_poisson_pmf(self):
dist = scirs2.poisson(3.0)
pmf_3 = dist.pmf(3.0)
assert pmf_3 > 0
pmf_0 = dist.pmf(0.0)
assert pmf_3 > pmf_0
def test_poisson_cdf(self):
dist = scirs2.poisson(3.0)
assert dist.cdf(0.0) < dist.cdf(3.0) < dist.cdf(10.0)
assert dist.cdf(20.0) > 0.999
@pytest.mark.skip(reason="Poisson PPF not implemented yet in scirs2-stats")
def test_poisson_ppf(self):
dist = scirs2.poisson(3.0)
median = dist.ppf(0.5)
assert 1.0 <= median <= 5.0
def test_poisson_rvs(self):
dist = scirs2.poisson(3.0)
samples = dist.rvs(1000)
assert len(samples) == 1000
assert all(s >= 0 for s in samples)
mean = np.mean(samples)
assert abs(mean - 3.0) < 0.5
class TestExponentialDistribution:
def test_expon_creation(self):
dist = scirs2.expon()
assert dist is not None
dist_custom = scirs2.expon(scale=2.0)
assert dist_custom is not None
def test_expon_pdf(self):
dist = scirs2.expon()
pdf_at_zero = dist.pdf(0.0)
assert abs(pdf_at_zero - 1.0) < 1e-10
assert dist.pdf(0.0) > dist.pdf(1.0) > dist.pdf(2.0)
def test_expon_cdf(self):
dist = scirs2.expon()
assert abs(dist.cdf(0.0)) < 1e-10
assert dist.cdf(0.0) < dist.cdf(1.0) < dist.cdf(2.0)
def test_expon_ppf(self):
dist = scirs2.expon()
assert abs(dist.ppf(0.0)) < 1e-10
assert dist.ppf(0.1) < dist.ppf(0.5) < dist.ppf(0.9)
def test_expon_rvs(self):
dist = scirs2.expon()
samples = dist.rvs(1000)
assert len(samples) == 1000
assert all(s >= 0 for s in samples)
mean = np.mean(samples)
assert abs(mean - 1.0) < 0.2
class TestUniformDistribution:
def test_uniform_creation(self):
dist = scirs2.uniform()
assert dist is not None
dist_custom = scirs2.uniform(loc=1.0, scale=3.0)
assert dist_custom is not None
def test_uniform_pdf(self):
dist = scirs2.uniform()
assert abs(dist.pdf(0.0) - 1.0) < 1e-10
assert abs(dist.pdf(0.5) - 1.0) < 1e-10
assert dist.pdf(0.99) > 0
def test_uniform_cdf(self):
dist = scirs2.uniform()
assert abs(dist.cdf(0.0)) < 1e-10
assert abs(dist.cdf(0.5) - 0.5) < 1e-10
assert abs(dist.cdf(1.0) - 1.0) < 1e-10
def test_uniform_ppf(self):
dist = scirs2.uniform()
assert abs(dist.ppf(0.0)) < 1e-10
assert abs(dist.ppf(0.5) - 0.5) < 1e-10
assert abs(dist.ppf(1.0) - 1.0) < 1e-10
def test_uniform_rvs(self):
dist = scirs2.uniform()
samples = dist.rvs(1000)
assert len(samples) == 1000
assert all(0 <= s <= 1 for s in samples)
mean = np.mean(samples)
assert abs(mean - 0.5) < 0.1
class TestDistributionConsistency:
def test_cdf_ppf_inverse(self):
dist = scirs2.norm()
x = 1.5
cdf_val = dist.cdf(x)
ppf_val = dist.ppf(cdf_val)
assert abs(ppf_val - x) < 1e-3
def test_pdf_cdf_relationship(self):
dist = scirs2.norm()
x_vals = [-2.0, -1.0, 0.0, 1.0, 2.0]
cdf_vals = [dist.cdf(x) for x in x_vals]
for i in range(len(cdf_vals) - 1):
assert cdf_vals[i] < cdf_vals[i+1]