1
- # Wigner semicircle distribution
2
-
3
- import Distributions
4
- import Distributions: ContinuousUnivariateDistribution
5
-
6
1
export Semicircle
7
2
8
- immutable Semicircle <: ContinuousUnivariateDistribution
9
- mean:: Float64
10
- radius:: Float64
11
- Semicircle (mu, r) = r > 0 ? new (float64 (mu), float64 (r)) :
12
- error (" radius r must be positive" ) # Constructor
13
- end
3
+ """
4
+ Wigner semicircle distribution
14
5
15
- # Standardized distribution - mean 0, variance 1
16
- Semicircle (mu) = Semicircle (mu, 2.0 )
17
- Semicircle () = Semicircle (0.0 , 2.0 )
6
+ By default, creates a standardized distribution
7
+ with mean 0 and variance 1 (radius 2)
8
+ """
9
+ immutable Semicircle{T<: Real } <: ContinuousUnivariateDistribution
10
+ mean:: T
11
+ radius:: T
12
+ end
13
+ Semicircle {T<:Real} (μ:: T = 0.0 , r:: T = 2.0 ) = r > 0 ? Semicircle {T} (μ, r) :
14
+ throw (ArgumentError (" radius r must be positive, got $r " ))
18
15
19
16
# Distribution function methods
20
17
# ##############################
21
18
22
19
# cumulative distribution function
23
- function cdf (X:: Semicircle , x:: Real )
24
- r, a = X. mean, X. radius
25
- insupport (x) ? 0.5 + (x- a)/ (pi * r^ 2 ) * sqrt (r^ 2 - (x- a)^ 2 ) + 1 / pi * asin ((x- a)/ r) : (x> a ? 1.0 : 0.0 )
20
+ function cdf {T<:Real} (d:: Semicircle{T} , x:: T )
21
+ r, a = d. mean, d. radius
22
+ if insupport (d, x)
23
+ return 0.5 + (x- a)/ (π* r^ 2 ) * √ (r^ 2 - (x- a)^ 2 ) + asin ((x- a)/ r)/ π
24
+ elseif x ≥ a
25
+ return one (T)
26
+ else
27
+ return zero (T)
28
+ end
26
29
end
27
30
28
31
# probability density function
29
- function pdf (X:: Semicircle , x:: Real )
30
- r, a = X. mean, X. radius
31
- insupport (x) ? 2 / (pi * r^ 2 ) * sqrt (r^ 2 - (x- a)^ 2 ) : 0.0
32
+ function pdf {T<:Real} (d:: Semicircle{T} , x:: T )
33
+ r, a = d. mean, d. radius
34
+ if insupport (d, x)
35
+ return 2 / (π* r^ 2 ) * √ (r^ 2 - (x- a)^ 2 )
36
+ else
37
+ return zero (T)
38
+ end
32
39
end
33
40
34
41
# predicate is x in the support of the distribution?
35
- insupport (X:: Semicircle , x:: Real )= abs (x)<= X. radius
36
-
42
+ insupport {T<:Real} (d:: Semicircle{T} , x:: T )= abs (x)< d. radius
37
43
38
44
# Entropy methods
39
45
# ###############
40
46
41
47
# entropy of distribution in nats
42
- entropy (X:: Semicircle )= log (pi * X. radius) - 0.5
48
+ entropy (X:: Semicircle )= log (π * X. radius) - 0.5
43
49
44
50
# Measures of central tendency methods
45
51
# ####################################
@@ -51,13 +57,13 @@ mean(X::Semicircle)=X.mean
51
57
median (X:: Semicircle )= X. mean
52
58
53
59
# mode(s) of distribution as vector
54
- modes (X:: Semicircle ) = [X. mean]
60
+ modes {T} (X:: Semicircle{T} ) = T [X. mean]
55
61
56
62
# kurtosis of the distribution
57
- kurtosis (X:: Semicircle ) = 2
63
+ kurtosis {T} (X:: Semicircle{T} ) = T ( 2 )
58
64
59
65
# skewness of the distribution
60
- skewness (X:: Semicircle ) = 0
66
+ skewness {T} (X:: Semicircle{T} ) = T ( 0 )
61
67
62
68
# standard deviation of distribution
63
69
std (X:: Semicircle )= X. radius/ 2
@@ -66,51 +72,57 @@ std(X::Semicircle)=X.radius/2
66
72
var (X:: Semicircle )= std (X)^ 2
67
73
68
74
# moment of distribution
69
- function moment (X:: Semicircle , order:: Integer )
75
+ function moment {T<:Real} (X:: Semicircle{T} , order:: Integer )
70
76
a, r = X. mean, X. radius
71
77
if X. mean != 0
72
- a^ n* hypergeom ([(1 - n)/ 2 , - n/ 2 ], 2 , (r/ a)^ 2 )
78
+ return a^ n* hypergeom ([(1 - n)/ 2 , - n/ 2 ], 2 , (r/ a)^ 2 )
79
+ elseif iseven (order)
80
+ return (0.5 * r)^ (2 order) * T (catalannum (order÷ 2 ))
73
81
else
74
- order % 2 ? ( 0.5 * r) ^ ( 2 n) * catalan ( div (order, 2 )) : 0
82
+ return zero (T)
75
83
end
76
84
end
77
85
78
86
# cumulant of distribution
79
- function cumulant (X:: Semicircle , order:: Integer )
80
- if X. mean != 0 error (" not supported" ) end
81
- if order% 2
82
- order== 0 ? 1 : (0.5 * r)^ (2 n) * lassalle (order/ 2 )
83
- else
84
- 0
85
- end
87
+ function cumulant {T<:Real} (d:: Semicircle{T} , order:: Integer )
88
+ if d. mean != 0
89
+ throw (ArgumentError (" Non-central Semicircle not supported" ))
90
+ end
91
+
92
+ if order== 0
93
+ return one (T)
94
+ elseif iseven (order)
95
+ return (0.5 * d. radius)^ (2 order) * T (lassallenum (order÷ 2 ))
96
+ else
97
+ return zero (T)
98
+ end
86
99
end
87
100
88
101
# free cumulant of distribution
89
- function freecumulant (X :: Semicircle , order:: Integer )
90
- if order == 0
91
- return 1
92
- elseif order == 1
93
- return mean (X)
94
- elseif order == 2
95
- return var (X)
96
- else
97
- return 0
98
- end
102
+ function freecumulant {T<:Real} (d :: Semicircle{T} , order:: Int )
103
+ if order == 0
104
+ return one (T)
105
+ elseif order == 1
106
+ return mean (X)
107
+ elseif order == 2
108
+ return var (X)
109
+ else
110
+ return zero (T)
111
+ end
99
112
end
100
113
101
-
102
114
# Generating function methods
103
115
# ###########################
104
116
105
117
# characteristic function
106
- function cf (X :: Semicircle , t:: Real )
107
- r = t * X . mean
118
+ function cf (d :: Semicircle , t:: Real )
119
+ r = t / d . mean
108
120
2 * besselj (1 , r)/ r
109
121
end
110
122
111
123
# moment generating function
112
- function mgf (X :: Semicircle , t:: Real )
113
- r = t * X . mean
124
+ function mgf (d :: Semicircle , t:: Real )
125
+ r = t * d . mean
114
126
2 * besseli (1 , r)/ r
115
127
end
116
128
120
132
# random sampler
121
133
# Use relationship with beta distribution
122
134
function rand (X:: Semicircle )
123
- Y = rand (Beta (1.5 , 1.5 ))
124
- X. mean + 2 * X. radius * Y - X. radius
135
+ Y = rand (Beta (1.5 , 1.5 ))
136
+ X. mean + 2 * X. radius * Y - X. radius
125
137
end
0 commit comments