def test_binomial_numeric(): nvals = range(5) pvals = [0, Rational(1, 4), S.Half, Rational(3, 4), 1] for n in nvals: for p in pvals: X = Binomial('X', n, p) assert E(X) == n * p assert variance(X) == n * p * (1 - p) if n > 0 and 0 < p < 1: assert skewness(X) == (1 - 2 * p) / sqrt(n * p * (1 - p)) assert kurtosis(X) == 3 + (1 - 6 * p * (1 - p)) / (n * p * (1 - p)) for k in range(n + 1): assert P(Eq(X, k)) == binomial(n, k) * p**k * (1 - p)**(n - k)
def test_weibull(): a, b = symbols('a b', positive=True) # FIXME: simplify(E(X)) seems to hang without extended_positive=True # On a Linux machine this had a rapid memory leak... # a, b = symbols('a b', positive=True) X = Weibull('x', a, b) assert E(X).expand() == a * gamma(1 + 1 / b) assert variance(X).expand() == (a**2 * gamma(1 + 2 / b) - E(X)**2).expand() assert simplify(skewness(X)) == ( 2 * gamma(1 + 1 / b)**3 - 3 * gamma(1 + 1 / b) * gamma(1 + 2 / b) + gamma(1 + 3 / b)) / (-gamma(1 + 1 / b)**2 + gamma(1 + 2 / b))**Rational(3, 2) assert simplify(kurtosis(X)) == (-3*gamma(1 + 1/b)**4 +\ 6*gamma(1 + 1/b)**2*gamma(1 + 2/b) - 4*gamma(1 + 1/b)*gamma(1 + 3/b) + gamma(1 + 4/b))/(gamma(1 + 1/b)**2 - gamma(1 + 2/b))**2
def test_binomial_symbolic(): n = 2 p = symbols("p", positive=True) X = Binomial("X", n, p) t = Symbol("t") assert simplify(E(X)) == n * p == simplify(moment(X, 1)) assert simplify(variance(X)) == n * p * (1 - p) == simplify(cmoment(X, 2)) assert cancel((skewness(X) - (1 - 2 * p) / sqrt(n * p * (1 - p)))) == 0 assert cancel((kurtosis(X)) - (3 + (1 - 6 * p * (1 - p)) / (n * p * (1 - p)))) == 0 assert (characteristic_function(X)(t) == p**2 * exp(2 * I * t) + 2 * p * (-p + 1) * exp(I * t) + (-p + 1)**2) assert (moment_generating_function(X)(t) == p**2 * exp(2 * t) + 2 * p * (-p + 1) * exp(t) + (-p + 1)**2) # Test ability to change success/failure winnings H, T = symbols("H T") Y = Binomial("Y", n, p, succ=H, fail=T) assert simplify(E(Y) - (n * (H * p + T * (1 - p)))) == 0 # test symbolic dimensions n = symbols("n") B = Binomial("B", n, p) raises(NotImplementedError, lambda: P(B > 2)) assert density(B).dict == Density(BinomialDistribution(n, p, 1, 0)) assert set(density(B).dict.subs(n, 4).doit().keys()) == set( [S.Zero, S.One, S(2), S(3), S(4)]) assert set(density(B).dict.subs(n, 4).doit().values()) == set([ (1 - p)**4, 4 * p * (1 - p)**3, 6 * p**2 * (1 - p)**2, 4 * p**3 * (1 - p), p**4, ]) k = Dummy("k", integer=True) assert E(B > 2).dummy_eq( Sum( Piecewise( ( k * p**k * (1 - p)**(-k + n) * binomial(n, k), (k >= 0) & (k <= n) & (k > 2), ), (0, True), ), (k, 0, n), ))
def test_binomial_symbolic(): n = 2 # Because we're using for loops, can't do symbolic n p = symbols('p', positive=True) X = Binomial('X', n, p) t = Symbol('t') assert simplify(E(X)) == n*p == simplify(moment(X, 1)) assert simplify(variance(X)) == n*p*(1 - p) == simplify(cmoment(X, 2)) assert cancel((skewness(X) - (1 - 2*p)/sqrt(n*p*(1 - p)))) == 0 assert cancel((kurtosis(X)) - (3 + (1 - 6*p*(1 - p))/(n*p*(1 - p)))) == 0 assert characteristic_function(X)(t) == p ** 2 * exp(2 * I * t) + 2 * p * (-p + 1) * exp(I * t) + (-p + 1) ** 2 assert moment_generating_function(X)(t) == p ** 2 * exp(2 * t) + 2 * p * (-p + 1) * exp(t) + (-p + 1) ** 2 # Test ability to change success/failure winnings H, T = symbols('H T') Y = Binomial('Y', n, p, succ=H, fail=T) assert simplify(E(Y) - (n*(H*p + T*(1 - p)))) == 0
def test_gamma(): k = Symbol("k", positive=True) theta = Symbol("theta", positive=True) X = Gamma('x', k, theta) assert density(X)(x) == x**(k - 1) * theta**(-k) * exp( -x / theta) / gamma(k) assert cdf(X, meijerg=True)(z) == Piecewise( (-k * lowergamma(k, 0) / gamma(k + 1) + k * lowergamma(k, z / theta) / gamma(k + 1), z >= 0), (0, True)) # assert simplify(variance(X)) == k*theta**2 # handled numerically below assert E(X) == moment(X, 1) k, theta = symbols('k theta', positive=True) X = Gamma('x', k, theta) assert E(X) == k * theta assert variance(X) == k * theta**2 assert skewness(X).expand() == 2 / sqrt(k) assert kurtosis(X).expand() == 3 + 6 / k
def test_Hermite(): a1 = Symbol("a1", positive=True) a2 = Symbol("a2", negative=True) raises(ValueError, lambda: Hermite("H", a1, a2)) a1 = Symbol("a1", negative=True) a2 = Symbol("a2", positive=True) raises(ValueError, lambda: Hermite("H", a1, a2)) a1 = Symbol("a1", positive=True) x = Symbol("x") H = Hermite("H", a1, a2) assert moment_generating_function(H)(x) == exp(a1 * (exp(x) - 1) + a2 * (exp(2 * x) - 1)) assert characteristic_function(H)(x) == exp(a1 * (exp(I * x) - 1) + a2 * (exp(2 * I * x) - 1)) assert E(H) == a1 + 2 * a2 H = Hermite("H", a1=5, a2=4) assert density(H)(2) == 33 * exp(-9) / 2 assert E(H) == 13 assert variance(H) == 21 assert kurtosis(H) == Rational(464, 147) assert skewness(H) == 37 * sqrt(21) / 441
def test_robust_soliton(): raises(ValueError, lambda : RobustSoliton('robSol', -12, 0.1, 0.02)) raises(ValueError, lambda : RobustSoliton('robSol', 13, 1.89, 0.1)) raises(ValueError, lambda : RobustSoliton('robSol', 15, 0.6, -2.31)) f = Function('f') raises(ValueError, lambda : density(RobustSoliton('robSol', 15, 0.6, 0.1)).pmf(f)) k = Symbol('k', integer=True, positive=True) delta = Symbol('delta', positive=True) c = Symbol('c', positive=True) robSol = RobustSoliton('robSol', k, delta, c) assert density(robSol).low == 1 assert density(robSol).high == k k_vals = [10, 20, 50] delta_vals = [0.2, 0.4, 0.6] c_vals = [0.01, 0.03, 0.05] for x in k_vals: for y in delta_vals: for z in c_vals: assert E(robSol.subs({k: x, delta: y, c: z})) == moment(robSol.subs({k: x, delta: y, c: z}), 1) assert variance(robSol.subs({k: x, delta: y, c: z})) == cmoment(robSol.subs({k: x, delta: y, c: z}), 2) assert skewness(robSol.subs({k: x, delta: y, c: z})) == smoment(robSol.subs({k: x, delta: y, c: z}), 3) assert kurtosis(robSol.subs({k: x, delta: y, c: z})) == smoment(robSol.subs({k: x, delta: y, c: z}), 4)
def test_dice(): # TODO: Make iid method! X, Y, Z = Die('X', 6), Die('Y', 6), Die('Z', 6) a, b, t, p = symbols('a b t p') assert E(X) == 3 + S.Half assert variance(X) == S(35) / 12 assert E(X + Y) == 7 assert E(X + X) == 7 assert E(a * X + b) == a * E(X) + b assert variance(X + Y) == variance(X) + variance(Y) == cmoment(X + Y, 2) assert variance(X + X) == 4 * variance(X) == cmoment(X + X, 2) assert cmoment(X, 0) == 1 assert cmoment(4 * X, 3) == 64 * cmoment(X, 3) assert covariance(X, Y) == S.Zero assert covariance(X, X + Y) == variance(X) assert density(Eq(cos(X * S.Pi), 1))[True] == S.Half assert correlation(X, Y) == 0 assert correlation(X, Y) == correlation(Y, X) assert smoment(X + Y, 3) == skewness(X + Y) assert smoment(X + Y, 4) == kurtosis(X + Y) assert smoment(X, 0) == 1 assert P(X > 3) == S.Half assert P(2 * X > 6) == S.Half assert P(X > Y) == S(5) / 12 assert P(Eq(X, Y)) == P(Eq(X, 1)) assert E(X, X > 3) == 5 == moment(X, 1, 0, X > 3) assert E(X, Y > 3) == E(X) == moment(X, 1, 0, Y > 3) assert E(X + Y, Eq(X, Y)) == E(2 * X) assert moment(X, 0) == 1 assert moment(5 * X, 2) == 25 * moment(X, 2) assert quantile(X)(p) == Piecewise((nan, (p > S.One) | (p < S(0))),\ (S.One, p <= S(1)/6), (S(2), p <= S(1)/3), (S(3), p <= S.Half),\ (S(4), p <= S(2)/3), (S(5), p <= S(5)/6), (S(6), p <= S.One)) assert P(X > 3, X > 3) == S.One assert P(X > Y, Eq(Y, 6)) == S.Zero assert P(Eq(X + Y, 12)) == S.One / 36 assert P(Eq(X + Y, 12), Eq(X, 6)) == S.One / 6 assert density(X + Y) == density(Y + Z) != density(X + X) d = density(2 * X + Y**Z) assert d[S(22)] == S.One / 108 and d[S(4100)] == S.One / 216 and S( 3130) not in d assert pspace(X).domain.as_boolean() == Or( *[Eq(X.symbol, i) for i in [1, 2, 3, 4, 5, 6]]) assert where(X > 3).set == FiniteSet(4, 5, 6) assert characteristic_function(X)(t) == exp(6 * I * t) / 6 + exp( 5 * I * t) / 6 + exp(4 * I * t) / 6 + exp(3 * I * t) / 6 + exp( 2 * I * t) / 6 + exp(I * t) / 6 assert moment_generating_function(X)( t) == exp(6 * t) / 6 + exp(5 * t) / 6 + exp(4 * t) / 6 + exp( 3 * t) / 6 + exp(2 * t) / 6 + exp(t) / 6 # Bayes test for die BayesTest(X > 3, X + Y < 5) BayesTest(Eq(X - Y, Z), Z > Y) BayesTest(X > 3, X > 2) # arg test for die raises(ValueError, lambda: Die('X', -1)) # issue 8105: negative sides. raises(ValueError, lambda: Die('X', 0)) raises(ValueError, lambda: Die('X', 1.5)) # issue 8103: non integer sides. # symbolic test for die n, k = symbols('n, k', positive=True) D = Die('D', n) dens = density(D).dict assert dens == Density(DieDistribution(n)) assert set(dens.subs(n, 4).doit().keys()) == set([1, 2, 3, 4]) assert set(dens.subs(n, 4).doit().values()) == set([S(1) / 4]) k = Dummy('k', integer=True) assert E(D).dummy_eq(Sum(Piecewise((k / n, k <= n), (0, True)), (k, 1, n))) assert variance(D).subs(n, 6).doit() == S(35) / 12 ki = Dummy('ki') cumuf = cdf(D)(k) assert cumuf.dummy_eq( Sum(Piecewise((1 / n, (ki >= 1) & (ki <= n)), (0, True)), (ki, 1, k))) assert cumuf.subs({n: 6, k: 2}).doit() == S(1) / 3 t = Dummy('t') cf = characteristic_function(D)(t) assert cf.dummy_eq( Sum(Piecewise((exp(ki * I * t) / n, (ki >= 1) & (ki <= n)), (0, True)), (ki, 1, n))) assert cf.subs( n, 3).doit() == exp(3 * I * t) / 3 + exp(2 * I * t) / 3 + exp(I * t) / 3 mgf = moment_generating_function(D)(t) assert mgf.dummy_eq( Sum(Piecewise((exp(ki * t) / n, (ki >= 1) & (ki <= n)), (0, True)), (ki, 1, n))) assert mgf.subs(n, 3).doit() == exp(3 * t) / 3 + exp(2 * t) / 3 + exp(t) / 3