def test_ProductPSpace(): X = Normal('X', 0, 1) Y = Normal('Y', 0, 1) px = X.pspace py = Y.pspace assert pspace(X + Y) == ProductPSpace(px, py) assert pspace(X + Y) == ProductPSpace(py, px)
def test_given(): X = Normal('X', 0, 1) Y = Normal('Y', 0, 1) A = given(X, True) B = given(X, Y > 2) assert X == A == B
def test_pspace(): X, Y = Normal('X', 0, 1), Normal('Y', 0, 1) pytest.raises(ValueError, lambda: pspace(5 + 3)) pytest.raises(ValueError, lambda: pspace(x < 1)) assert pspace(X) == X.pspace assert pspace(2*X + 1) == X.pspace assert pspace(2*X + Y) == ProductPSpace(Y.pspace, X.pspace)
def test_random_symbols(): X, Y = Normal('X', 0, 1), Normal('Y', 0, 1) assert set(random_symbols(2*X + 1)) == {X} assert set(random_symbols(2*X + Y)) == {X, Y} assert set(random_symbols(2*X + Y.symbol)) == {X} assert set(random_symbols(2)) == set() assert X.is_commutative
def test_rs_swap(): X = Normal('x', 0, 1) Y = Exponential('y', 1) XX = Normal('x', 0, 2) YY = Normal('y', 0, 3) expr = 2*X + Y assert expr.subs(rs_swap((X, Y), (YY, XX))) == 2*XX + YY
def test_Density(): X = Die('X', 6) d = Density(X) assert d.doit() == density(X) r = Rational(1, 6) assert density(2*X).dict == {2: r, 4: r, 6: r, 8: r, 10: r, 12: r} X = Normal('X', 0, 1) Y = Normal('Y', 0, 1) assert str(density(X - Y, Y)(z)) == 'sqrt(2)*E**(-(Y + z)**2/2)/(2*sqrt(pi))'
def test_RandomSymbol(): X = Normal('x', 0, 1) Y = Normal('x', 0, 2) assert X.symbol == Y.symbol assert X != Y assert X.name == X.symbol.name X = Normal('lambda', 0, 1) # make sure we can use protected terms X = Normal('Lambda', 0, 1) # make sure we can use Diofant terms
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_input_value_assertions(): a, b = symbols('a b') p, q = symbols('p q', positive=True) pytest.raises(ValueError, lambda: Normal('x', 3, 0)) pytest.raises(ValueError, lambda: Normal('x', a, b)) Normal('X', a, p) # No error raised pytest.raises(ValueError, lambda: Exponential('x', a)) Exponential('Ex', p) # No error raised for fn in [Pareto, Weibull, Beta, Gamma]: pytest.raises(ValueError, lambda: fn('x', a, p)) pytest.raises(ValueError, lambda: fn('x', p, a)) fn('x', p, q) # No error raised
def test_RandomSymbol(): pytest.raises(TypeError, lambda: RandomSymbol(0, 1)) pytest.raises(TypeError, lambda: RandomSymbol(0, Symbol('x'))) X = Normal('x', 0, 1) Y = Normal('x', 0, 2) assert X.symbol == Y.symbol assert X != Y assert X.name == X.symbol.name X = Normal('lambda', 0, 1) # make sure we can use protected terms X = Normal('Lambda', 0, 1) # make sure we can use Diofant terms pytest.raises(TypeError, lambda: Normal(1, 0, 1))
def test_unevaluated(): X = Normal('x', 0, 1) assert E(X, evaluate=False) == ( Integral(sqrt(2)*x*exp(-x**2/2)/(2*sqrt(pi)), (x, -oo, oo))) assert E(X + 1, evaluate=False) == ( Integral(sqrt(2)*x*exp(-x**2/2)/(2*sqrt(pi)), (x, -oo, oo)) + 1)
def test_sample_iter(): X = Normal('X', 0, 1) expr = X*X + 3 assert all(_ > 3 for _ in sample_iter(expr, numsamples=3)) assert all(_ > 5 for _ in sample_iter(expr, numsamples=3, condition=X > 2)) pytest.raises(ValueError, lambda: tuple(sample_iter(expr, numsamples=3, condition=X)))
def test_cdf(): X = Normal('x', 0, 1) d = cdf(X) assert P(X < 1) == d(1) assert d(0) == Rational(1, 2) d = cdf(X, X > 0) # given X>0 assert d(0) == 0 Y = Exponential('y', 10) d = cdf(Y) assert d(-5) == 0 assert P(Y > 3) == 1 - d(3) pytest.raises(ValueError, lambda: cdf(X + Y)) Z = Exponential('z', 1) f = cdf(Z) z = Symbol('z') assert f(z) == Piecewise((1 - exp(-z), z >= 0), (0, True)) U = Uniform('x', 3, 5) u = cdf(U) assert u(z) == z/2 - Rational(3, 2)
def test_difficult_univariate(): """ Since using solve in place of deltaintegrate we're able to perform substantially more complex density computations on single continuous random variables """ x = Normal('x', 0, 1) assert density(x**3) assert density(exp(x**2)) assert density(log(x))
def test_ContinuousRV(): x = Symbol('x') pdf = sqrt(2)*exp(-x**2/2)/(2*sqrt(pi)) # Normal distribution # X and Y should be equivalent X = ContinuousRV(x, pdf) Y = Normal('y', 0, 1) assert variance(X) == variance(Y) assert P(X > 0) == P(Y > 0)
def test_symbolic(): mu1, mu2 = symbols('mu1 mu2', real=True) s1, s2 = symbols('sigma1 sigma2', real=True, positive=True) rate = Symbol('lambda', real=True, positive=True) X = Normal('x', mu1, s1) Y = Normal('y', mu2, s2) Z = Exponential('z', rate) a, b, c = symbols('a b c', real=True) assert E(X) == mu1 assert E(X + Y) == mu1 + mu2 assert E(a*X + b) == a*E(X) + b assert variance(X) == s1**2 assert simplify(variance(X + a*Y + b)) == variance(X) + a**2*variance(Y) assert E(Z) == 1/rate assert E(a*Z + b) == a*E(Z) + b assert E(X + a*Z + b) == mu1 + a/rate + b
def test_unevaluated_fail(): X = Normal('x', 0, 1) assert P(X > 0, evaluate=False) == ( Integral(sqrt(2)*exp(-x**2/2)/(2*sqrt(pi)), (x, 0, oo))) assert P(X > 0, X**2 < 1, evaluate=False) == ( Integral(sqrt(2)*exp(-x**2/2)/(2*sqrt(pi) * Integral(sqrt(2)*exp(-x**2/2)/(2*sqrt(pi)), (x, -1, 1))), (x, 0, 1)))
def test_conditional_1d(): X = Normal('x', 0, 1) Y = given(X, X >= 0) assert density(Y)(x) == 2 * density(X)(x) assert Y.pspace.domain.set == Interval(0, oo, right_open=True) assert E(Y) == sqrt(2/pi) assert E(X**2) == E(Y**2)
def test_conditional_1d(): X = Normal('x', 0, 1) Y = given(X, X >= 0) assert density(Y) == 2 * density(X) assert Y.pspace.domain.set == Interval(0, oo) assert E(Y) == sqrt(2) / sqrt(pi) assert E(X**2) == E(Y**2)
def test_RandomDomain(): 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_ContinuousDomain(): X = Normal('x', 0, 1) assert where(X**2 <= 1).set == Interval(-1, 1) assert where(X**2 <= 1).symbol == X.symbol where(And(X**2 <= 1, X >= 0)).set == Interval(0, 1) pytest.raises(ValueError, lambda: where(sin(X) > 1)) Y = given(X, X >= 0) assert Y.pspace.domain.set == Interval(0, oo, False, True)
def test_multiple_normal(): X, Y = Normal('x', 0, 1), Normal('y', 0, 1) assert E(X + Y) == 0 assert variance(X + Y) == 2 assert variance(X + X) == 4 assert covariance(X, Y) == 0 assert covariance(2*X + Y, -X) == -2*variance(X) assert skewness(X) == 0 assert skewness(X + Y) == 0 assert correlation(X, Y) == 0 assert correlation(X, X + Y) == correlation(X, X - Y) assert moment(X, 2) == 1 assert cmoment(X, 3) == 0 assert moment(X + Y, 4) == 12 assert cmoment(X, 2) == variance(X) assert smoment(X*X, 2) == 1 assert smoment(X + Y, 3) == skewness(X + Y) assert E(X, Eq(X + Y, 0)) == 0 assert variance(X, Eq(X + Y, 0)) == Rational(1, 2)
def test_RandomDomain(): 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('X'), Die('Y') Z = Normal('Z', 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('X', 0, 1), Normal('Y', 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, -oo < X.symbol, X.symbol < oo) with pytest.raises(TypeError): XX = given(X, X + 3)
def test_ProductPSpace(): X = Normal('X', 0, 1) Y = Normal('Y', 0, 1) px = X.pspace py = Y.pspace assert pspace(X + Y) == ProductPSpace(px, py) assert pspace(X + Y) == ProductPSpace(py, px) X = Die('X', 2) Y = Die('Y', 2) assert (pspace(X + Y).density == Dict((frozenset({('X', 1), ('Y', 2)}), Rational(1, 4)), (frozenset({('X', 1), ('Y', 1)}), Rational(1, 4)), (frozenset({('X', 2), ('Y', 1)}), Rational(1, 4)), (frozenset({('X', 2), ('Y', 2)}), Rational(1, 4)))) d = pspace(X + Y).domain assert ((X.symbol, 1), (Y.symbol, 2)) in d assert ((X.symbol, 0), (Y.symbol, 2)) not in d Z = Die('Z', 2) d1 = pspace(X + Y).domain assert ProductDomain(d1, Z.pspace.domain) == pspace(X + Y + Z).domain
def test_Sample(): X = Die('X', 6) Y = Normal('Y', 0, 1) assert sample(X) in [1, 2, 3, 4, 5, 6] assert sample(X + Y).is_Float assert P(X + Y > 0, Y < 0, numsamples=10).is_number assert P(X > 10, numsamples=10).is_number assert E(X + Y, numsamples=10).is_number assert variance(X + Y, numsamples=10).is_number pytest.raises(TypeError, lambda: P(Y > z, numsamples=5)) assert P(sin(Y) <= 1, numsamples=10, modules=['math']) == 1 assert P(sin(Y) <= 1, cos(Y) < 1, numsamples=10, modules=['math']) == 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)) # Make sure this doesn't raise an error Y = Normal('Y', 0, 1) E(Sum(1/z**Y, (z, 1, oo)), Y > 2, numsamples=3, modules='mpmath')
def test_prefab_sampling(): N = Normal('X', 0, 1) L = LogNormal('L', 0, 1) E = Exponential('Ex', 1) P = Pareto('P', 1, 3) W = Weibull('W', 1, 1) U = Uniform('U', 0, 1) B = Beta('B', 2, 5) G = Gamma('G', 1, 3) variables = [N, L, E, P, W, U, B, G] niter = 10 for var in variables: for i in range(niter): assert sample(var) in var.pspace.domain.set
def test_single_normal(): mu = Symbol('mu', real=True) sigma = Symbol('sigma', real=True, positive=True) X = Normal('x', 0, 1) Y = X*sigma + mu assert simplify(E(Y)) == mu assert simplify(variance(Y)) == sigma**2 pdf = density(Y) x = Symbol('x') assert (pdf(x) == sqrt(2)*exp(-(x - mu)**2/(2*sigma**2))/(2*sqrt(pi)*sigma)) assert P(X**2 < 1) == erf(sqrt(2)/2) assert E(X, Eq(X, mu)) == mu
def test_overlap(): X = Normal('x', 0, 1) Y = Normal('x', 0, 2) pytest.raises(ValueError, lambda: P(X > Y))
def test_RandomSymbol_diff(): X = Normal('x', 0, 1) assert (2*X).diff(X)