forked from sympy/sympy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_rv.py
138 lines (104 loc) · 3.75 KB
/
test_rv.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
from sympy import (EmptySet, FiniteSet, S, Symbol, Interval, exp, erf, sqrt,
symbols, simplify, Eq, cos, And, Tuple, integrate, oo, sin, Sum)
from sympy.stats import (Die, Normal, Exponential , P, E, Var, Covar,
Skewness, Density, Given, independent, dependent, Where, pspace,
random_symbols, Sample)
from sympy.stats.rv import ProductPSpace, rs_swap
from sympy.utilities.pytest import raises, XFAIL
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)
raises(TypeError, "XX = Given(X, X+3)")
def test_random_symbols():
X, Y = Normal(0,1), Normal(0,1)
assert set(random_symbols(2*X+1)) == set((X,))
assert set(random_symbols(2*X+Y)) == set((X,Y))
assert set(random_symbols(2*X+Y.symbol)) == set((X,))
assert set(random_symbols(2)) == set()
def test_pspace():
X, Y = Normal(0,1), Normal(0,1)
assert not pspace(5+3)
assert pspace(X) == X.pspace
assert pspace(2*X+1) == X.pspace
assert pspace(2*X+Y) == ProductPSpace(Y.pspace, X.pspace)
def test_rs_swap():
x, y = symbols('x y')
X = Normal(0, 1, symbol=x)
Y = Exponential(1, symbol=y)
XX = Normal(0, 2, symbol=x)
YY = Normal(0, 3, symbol=y)
expr = 2*X+Y
assert expr.subs(rs_swap((X,Y), (YY,XX))) == 2*XX+YY
def test_RandomSymbol():
X = Normal(0, 1, symbol=Symbol('x'))
Y = Normal(0, 2, symbol=Symbol('x'))
assert X.symbol == Y.symbol
assert X!=Y
assert X.name == X.symbol.name
def test_overlap():
X = Normal(0, 1, symbol=Symbol('x'))
Y = Normal(0, 2, symbol=Symbol('x'))
raises(ValueError, "P(X>Y)")
def test_ProductPSpace():
X = Normal(0, 1)
Y = Normal(0, 1)
px = X.pspace
py = Y.pspace
assert pspace(X+Y) == ProductPSpace(px, py)
assert pspace(X+Y) == ProductPSpace(py, px)
def test_E():
assert E(5) == 5
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 Var(X+Y, numsamples=10).is_number
raises(ValueError, "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_Given():
X = Normal(0, 1)
Y = Normal(0, 1)
A = Given(X, True)
B = Given(X, Y>2)
assert X == A == B
def test_dependence():
X, Y = Die(), Die()
assert independent(X, 2*Y)
assert not dependent(X, 2*Y)
X, Y = Normal(0,1), Normal(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)
@XFAIL
def test_dependent_finite():
X, Y = Die(), Die()
# Dependence testing requires symbolic conditions which currently break
# finite random variables
assert dependent(X, Y+X)
XX, YY = Given(Tuple(X, Y), X+Y>5) # Create a dependency
assert dependent(XX, YY)
def test_normality():
X, Y = Normal(0,1), Normal(0,1)
x, z = symbols('x, z', real=True)
density = Density(X-Y, Eq(X+Y, z))
assert integrate(density(x), (x, -oo, oo)) == 1