def test_dice(): # TODO: Make iid method! X, Y, Z = Die('X', 6), Die('Y', 6), Die('Z', 6) a, b, t = symbols('a b t') 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, 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 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
def test_dependence(): X, Y = Die('X'), Die('Y') assert independent(X, 2 * Y) assert not dependent(X, 2 * Y) X, Y = Normal('X', 0, 1), Normal('Y', 0, 1) assert independent(X, Y) assert dependent(X, 2 * X) # Create a dependency XX, YY = given(Tuple(X, Y), Eq(X + Y, 3)) assert dependent(XX, YY)
def test_sample_numpy(): distribs_numpy = [Binomial("B", 5, 0.4), Hypergeometric("H", 2, 1, 1)] size = 3 numpy = import_module('numpy') if not numpy: skip('Numpy is not installed. Abort tests for _sample_numpy.') else: for X in distribs_numpy: samps = sample(X, size=size, library='numpy') for sam in samps: assert sam in X.pspace.domain.set raises(NotImplementedError, lambda: sample(Die("D"), library='numpy')) raises(NotImplementedError, lambda: Die("D").pspace.sample(library='tensorflow'))
def test_sample_scipy(): distribs_scipy = [ FiniteRV('F', { 1: S.Half, 2: Rational(1, 4), 3: Rational(1, 4) }), DiscreteUniform("Y", list(range(5))), Die("D"), Bernoulli("Be", 0.3), Binomial("Bi", 5, 0.4), BetaBinomial("Bb", 2, 1, 1), Hypergeometric("H", 1, 1, 1), Rademacher("R") ] size = 3 scipy = import_module('scipy') if not scipy: skip('Scipy not installed. Abort tests for _sample_scipy.') else: for X in distribs_scipy: samps = sample(X, size=size) samps2 = sample(X, size=(2, 2)) for sam in samps: assert sam in X.pspace.domain.set for i in range(2): for j in range(2): assert samps2[i][j] in X.pspace.domain.set
def test_H(): X = Normal('X', 0, 1) D = Die('D', sides=4) G = Geometric('G', 0.5) assert H(X, X > 0) == -log(2) / 2 + S(1) / 2 + log(pi) / 2 assert H(D, D > 2) == log(2) assert comp(H(G).evalf().round(2), 1.39)
def test_Sample(): X = Die('X', 6) Y = Normal('Y', 0, 1) z = Symbol('z', integer=True) scipy = import_module('scipy') if not scipy: skip('Scipy is not installed. Abort tests') with ignore_warnings( UserWarning): ### TODO: Restore tests once warnings are removed assert next(sample(X)) in [1, 2, 3, 4, 5, 6] assert isinstance(next(sample(X + Y)), float) assert P(X + Y > 0, Y < 0, numsamples=10).is_number assert E(X + Y, numsamples=10).is_number assert E(X**2 + Y, numsamples=10).is_number assert E((X + Y)**2, numsamples=10).is_number assert variance(X + Y, numsamples=10).is_number raises(TypeError, lambda: P(Y > z, numsamples=5)) assert P(sin(Y) <= 1, numsamples=10) == 1 assert P(sin(Y) <= 1, cos(Y) < 1, numsamples=10) == 1 assert all(i in range(1, 7) for i in density(X, numsamples=10)) assert all(i in range(4, 7) for i in density(X, X > 3, numsamples=10))
def test_discreteuniform(): # Symbolic a, b, c, t = symbols("a b c t") X = DiscreteUniform("X", [a, b, c]) assert E(X) == (a + b + c) / 3 assert (simplify( variance(X) - ((a**2 + b**2 + c**2) / 3 - (a / 3 + b / 3 + c / 3)**2)) == 0) assert P(Eq(X, a)) == P(Eq(X, b)) == P(Eq(X, c)) == S("1/3") Y = DiscreteUniform("Y", range(-5, 5)) # Numeric assert E(Y) == S("-1/2") assert variance(Y) == S("33/4") for x in range(-5, 5): assert P(Eq(Y, x)) == S("1/10") assert P(Y <= x) == S(x + 6) / 10 assert P(Y >= x) == S(5 - x) / 10 assert dict(density(Die("D", 6)).items()) == dict( density(DiscreteUniform("U", range(1, 7))).items()) assert (characteristic_function(X)(t) == exp(I * a * t) / 3 + exp(I * b * t) / 3 + exp(I * c * t) / 3) assert (moment_generating_function(X)(t) == exp(a * t) / 3 + exp(b * t) / 3 + exp(c * t) / 3)
def test_discreteuniform(): # Symbolic a, b, c, t = symbols('a b c t') X = DiscreteUniform('X', [a, b, c]) assert E(X) == (a + b + c) / 3 assert simplify( variance(X) - ((a**2 + b**2 + c**2) / 3 - (a / 3 + b / 3 + c / 3)**2)) == 0 assert P(Eq(X, a)) == P(Eq(X, b)) == P(Eq(X, c)) == S('1/3') Y = DiscreteUniform('Y', range(-5, 5)) # Numeric assert E(Y) == S('-1/2') assert variance(Y) == S('33/4') for x in range(-5, 5): assert P(Eq(Y, x)) == S('1/10') assert P(Y <= x) == S(x + 6) / 10 assert P(Y >= x) == S(5 - x) / 10 assert dict(density(Die('D', 6)).items()) == \ dict(density(DiscreteUniform('U', range(1, 7))).items()) assert characteristic_function(X)( t) == exp(I * a * t) / 3 + exp(I * b * t) / 3 + exp(I * c * t) / 3 assert moment_generating_function(X)( t) == exp(a * t) / 3 + exp(b * t) / 3 + exp(c * t) / 3
def test_H(): X = Normal("X", 0, 1) D = Die("D", sides=4) G = Geometric("G", 0.5) assert H(X, X > 0) == -log(2) / 2 + S.Half + log(pi) / 2 assert H(D, D > 2) == log(2) assert comp(H(G).evalf().round(2), 1.39)
def test_sample_scipy(): distribs_scipy = [ FiniteRV('F', {1: S.Half, 2: Rational(1, 4), 3: Rational(1, 4)}), DiscreteUniform("Y", list(range(5))), Die("D"), Bernoulli("Be", 0.3), Binomial("Bi", 5, 0.4), BetaBinomial("Bb", 2, 1, 1), Hypergeometric("H", 1, 1, 1), Rademacher("R") ] size = 3 numsamples = 5 scipy = import_module('scipy') if not scipy: skip('Scipy not installed. Abort tests for _sample_scipy.') else: with ignore_warnings(UserWarning): ### TODO: Restore tests once warnings are removed h_sample = list(sample(Hypergeometric("H", 1, 1, 1), size=size, numsamples=numsamples)) assert len(h_sample) == numsamples for X in distribs_scipy: samps = next(sample(X, size=size)) samps2 = next(sample(X, size=(2, 2))) for sam in samps: assert sam in X.pspace.domain.set for i in range(2): for j in range(2): assert samps2[i][j] in X.pspace.domain.set
def test_issue_6810(): X = Die('X', 6) Y = Normal('Y', 0, 1) assert P(Eq(X, 2)) == S(1) / 6 assert P(Eq(Y, 0)) == 0 assert P(Or(X > 2, X < 3)) == 1 assert P(And(X > 3, X > 2)) == S(1) / 2
def test_Sample(): X = Die('X', 6) Y = Normal('Y', 0, 1) z = Symbol('z', integer=True) scipy = import_module('scipy') if not scipy: skip('Scipy is not installed. Abort tests') assert sample(X) in [1, 2, 3, 4, 5, 6] assert isinstance(sample(X + Y), float) assert P(X + Y > 0, Y < 0, numsamples=10).is_number assert E(X + Y, numsamples=10).is_number assert E(X**2 + Y, numsamples=10).is_number assert E((X + Y)**2, numsamples=10).is_number assert variance(X + Y, numsamples=10).is_number raises(TypeError, lambda: P(Y > z, numsamples=5)) assert P(sin(Y) <= 1, numsamples=10) == 1 assert P(sin(Y) <= 1, cos(Y) < 1, numsamples=10) == 1 assert all(i in range(1, 7) for i in density(X, numsamples=10)) assert all(i in range(4, 7) for i in density(X, X > 3, numsamples=10)) numpy = import_module('numpy') if not numpy: skip('Numpy is not installed. Abort tests') #Test Issue #21563: Output of sample must be a float or array assert isinstance(sample(X), (numpy.int32, numpy.int64)) assert isinstance(sample(Y), numpy.float64) assert isinstance(sample(X, size=2), numpy.ndarray)
def test_given_sample(): X = Die('X', 6) scipy = import_module('scipy') if not scipy: skip('Scipy is not installed. Abort tests') with ignore_warnings( UserWarning): ### TODO: Restore tests once warnings are removed assert next(sample(X, X > 5)) == 6
def test_sample_numpy(): distribs_numpy = [ Binomial("B", 5, 0.4), ] size = 3 numpy = import_module('numpy') if not numpy: skip('Numpy is not installed. Abort tests for _sample_numpy.') else: with ignore_warnings(UserWarning): for X in distribs_numpy: samps = next(sample(X, size=size, library='numpy')) for sam in samps: assert sam in X.pspace.domain.set raises(NotImplementedError, lambda: next(sample(Die("D"), library='numpy'))) raises(NotImplementedError, lambda: Die("D").pspace.sample(library='tensorflow'))
def test_given(): X = Die('X', 6) assert density(X, X > 5) == {S(6): S.One} assert where(X > 2, X > 5).as_boolean() == Eq(X.symbol, 6) scipy = import_module('scipy') if not scipy: skip('Scipy is not installed. Abort tests') with ignore_warnings(UserWarning): assert next(sample(X, X > 5)) == 6
def test_RandomDomain(): from sympy.stats import Normal, Die, Exponential, pspace, where X = Normal('x1', 0, 1) assert str(where(X > 0)) == "Domain: And(0 < x1, x1 < oo)" D = Die('d1', 6) assert str(where(D > 4)) == "Domain: Or(Eq(d1, 5), Eq(d1, 6))" A = Exponential('a', 1) B = Exponential('b', 1) assert str(pspace(Tuple(A, B)).domain) == "Domain: And(0 <= a, 0 <= b, a < oo, b < oo)"
def test_where(): X, Y = Die(), Die() Z = Normal(0, 1) assert where(Z**2<=1).set == Interval(-1, 1) assert where(Z**2<=1).as_boolean() == Interval(-1,1).as_relational(Z.symbol) assert where(And(X>Y, Y>4)).as_boolean() == And( Eq(X.symbol, 6), Eq(Y.symbol, 5)) assert len(where(X<3).set) == 2 assert 1 in where(X<3).set X, Y = Normal(0, 1), Normal(0, 1) assert where(And(X**2 <= 1, X >= 0)).set == Interval(0, 1) XX = given(X, And(X**2 <= 1, X >= 0)) assert XX.pspace.domain.set == Interval(0, 1) assert XX.pspace.domain.as_boolean() == And(0 <= X.symbol, X.symbol**2 <= 1) with raises(TypeError): XX = given(X, X+3)
def test_RandomDomain(): from sympy.stats import Normal, Die, Exponential, pspace, where X = Normal('x1', 0, 1) assert str(where(X > 0)) == "Domain: x1 > 0" D = Die('d1', 6) assert str(where(D > 4)) == "Domain: Or(d1 == 5, d1 == 6)" A = Exponential('a', 1) B = Exponential('b', 1) assert str(pspace(Tuple(A, B)).domain) == "Domain: And(a >= 0, b >= 0)"
def test_RandomDomain(): from sympy.stats import Normal, Die, Exponential, pspace, where X = Normal('x1', 0, 1) assert str(where(X > 0)) == "Domain: (0 < x1) & (x1 < oo)" D = Die('d1', 6) assert str(where(D > 4)) == "Domain: Eq(d1, 5) | Eq(d1, 6)" A = Exponential('a', 1) B = Exponential('b', 1) assert str(pspace(Tuple(A, B)).domain) == "Domain: (0 <= a) & (0 <= b) & (a < oo) & (b < oo)"
def test_RandomDomain(): from sympy.stats import Normal, Die, Exponential, pspace, Where X = Normal(0, 1, symbol=Symbol('x1')) assert str(Where(X > 0)) == "Domain: 0 < x1" D = Die(6, symbol=Symbol('d1')) assert str(Where(D > 4)) == "Domain: Or(d1 == 5, d1 == 6)" A = Exponential(1, symbol=Symbol('a')) B = Exponential(1, symbol=Symbol('b')) assert str(pspace(Tuple(A, B)).domain) == "Domain: And(0 <= a, 0 <= b)"
def test_latex_RandomDomain(): from sympy.stats import Normal, Die, Exponential, pspace, where X = Normal('x1', 0, 1) assert latex(where(X > 0)) == "Domain: 0 < x_{1}" D = Die('d1', 6) assert latex(where(D > 4)) == r"Domain: d_{1} = 5 \vee d_{1} = 6" A = Exponential('a', 1) B = Exponential('b', 1) assert latex(pspace(Tuple(A, B)).domain) == "Domain: 0 \leq a \wedge 0 \leq b"
def test_symbolic_conditions(): B = Bernoulli('B', S(1) / 4) D = Die('D', 4) b, n = symbols('b, n') Y = P(Eq(B, b)) Z = E(D > n) assert Y == \ Piecewise((S(1)/4, Eq(b, 1)), (0, True)) + \ Piecewise((S(3)/4, Eq(b, 0)), (0, True)) assert Z == \ Piecewise((S(1)/4, n < 1), (0, True)) + Piecewise((S(1)/2, n < 2), (0, True)) + \ Piecewise((S(3)/4, n < 3), (0, True)) + Piecewise((S(1), n < 4), (0, True))
def test_cdf(): D = Die('D', 6) o = S.One assert cdf(D) == sympify({ 1: o / 6, 2: o / 3, 3: o / 2, 4: 2 * o / 3, 5: 5 * o / 6, 6: o })
def test_CDF(): D = Die(6) o = S.One assert CDF(D) == sympify({ 1: o / 6, 2: o / 3, 3: o / 2, 4: 2 * o / 3, 5: 5 * o / 6, 6: o })
def test_symbolic_conditions(): B = Bernoulli('B', Rational(1, 4)) D = Die('D', 4) b, n = symbols('b, n') Y = P(Eq(B, b)) Z = E(D > n) assert Y == \ Piecewise((Rational(1, 4), Eq(b, 1)), (0, True)) + \ Piecewise((Rational(3, 4), Eq(b, 0)), (0, True)) assert Z == \ Piecewise((Rational(1, 4), n < 1), (0, True)) + Piecewise((S.Half, n < 2), (0, True)) + \ Piecewise((Rational(3, 4), n < 3), (0, True)) + Piecewise((S.One, n < 4), (0, True))
def test_dice(): # TODO: Make iid method! X, Y, Z = Die('X', 6), Die('Y', 6), Die('Z', 6) a, b = symbols('a b') 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) assert variance(X + X) == 4 * variance(X) 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 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 assert E(X, Y > 3) == E(X) assert E(X + Y, Eq(X, Y)) == E(2 * X) assert E(X + Y - Z, 2 * X > Y + 1) == S(49) / 12 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)
def test_sample_pymc3(): distribs_pymc3 = [Bernoulli('B', 0.2), Binomial('N', 5, 0.4)] size = 3 pymc3 = import_module('pymc3') if not pymc3: skip('PyMC3 is not installed. Abort tests for _sample_pymc3.') else: for X in distribs_pymc3: samps = sample(X, size=size, library='pymc3') for sam in samps: assert sam in X.pspace.domain.set raises(NotImplementedError, lambda: (sample(Die("D"), library='pymc3')))
def test_sample_pymc3(): distribs_pymc3 = [Bernoulli('B', 0.2), Binomial('N', 5, 0.4)] size = 3 pymc3 = import_module('pymc3') if not pymc3: skip('PyMC3 is not installed. Abort tests for _sample_pymc3.') else: with ignore_warnings( UserWarning ): ### TODO: Restore tests once warnings are removed for X in distribs_pymc3: samps = next(sample(X, size=size, library='pymc3')) for sam in samps: assert sam in X.pspace.domain.set raises(NotImplementedError, lambda: next(sample(Die("D"), library='pymc3')))
def test_Sample(): X = Die(6) Y = Normal(0,1) z = Symbol('z') assert sample(X) in [1,2,3,4,5,6] assert sample(X+Y).is_Float P(X+Y>0, Y<0, numsamples=10).is_number assert E(X+Y, numsamples=10).is_number assert variance(X+Y, numsamples=10).is_number raises(ValueError, lambda: P(Y>z, numsamples=5)) assert P(sin(Y)<=1, numsamples=10) == 1 assert P(sin(Y)<=1, cos(Y)<1, numsamples=10) == 1 # Make sure this doesn't raise an error E(Sum(1/z**Y, (z,1,oo)), Y>2, numsamples=3)
def test_discreteuniform(): # Symbolic a, b, c = symbols('a b c') X = DiscreteUniform('X', [a, b, c]) assert E(X) == (a + b + c) / 3 assert variance(X) == (a**2 + b**2 + c**2) / 3 - (a / 3 + b / 3 + c / 3)**2 assert P(Eq(X, a)) == P(Eq(X, b)) == P(Eq(X, c)) == S('1/3') Y = DiscreteUniform('Y', range(-5, 5)) # Numeric assert E(Y) == S('-1/2') assert variance(Y) == S('33/4') assert skewness(Y) == 0 for x in range(-5, 5): assert P(Eq(Y, x)) == S('1/10') assert P(Y <= x) == S(x + 6) / 10 assert P(Y >= x) == S(5 - x) / 10 assert density(Die('D', 6)) == density(DiscreteUniform('U', range(1, 7)))