@@ -20,25 +20,28 @@ package org.apache.spark.mllib.random
20
20
import org .apache .commons .math3 .distribution .{ExponentialDistribution ,
21
21
GammaDistribution , LogNormalDistribution , PoissonDistribution }
22
22
23
- import org .apache .spark .annotation .DeveloperApi
23
+ import org .apache .spark .annotation .{ Since , DeveloperApi }
24
24
import org .apache .spark .util .random .{XORShiftRandom , Pseudorandom }
25
25
26
26
/**
27
27
* :: DeveloperApi ::
28
28
* Trait for random data generators that generate i.i.d. data.
29
29
*/
30
30
@ DeveloperApi
31
+ @ Since (" 1.1.0" )
31
32
trait RandomDataGenerator [T ] extends Pseudorandom with Serializable {
32
33
33
34
/**
34
35
* Returns an i.i.d. sample as a generic type from an underlying distribution.
35
36
*/
37
+ @ Since (" 1.1.0" )
36
38
def nextValue (): T
37
39
38
40
/**
39
41
* Returns a copy of the RandomDataGenerator with a new instance of the rng object used in the
40
42
* class when applicable for non-locking concurrent usage.
41
43
*/
44
+ @ Since (" 1.1.0" )
42
45
def copy (): RandomDataGenerator [T ]
43
46
}
44
47
@@ -47,17 +50,21 @@ trait RandomDataGenerator[T] extends Pseudorandom with Serializable {
47
50
* Generates i.i.d. samples from U[0.0, 1.0]
48
51
*/
49
52
@ DeveloperApi
53
+ @ Since (" 1.1.0" )
50
54
class UniformGenerator extends RandomDataGenerator [Double ] {
51
55
52
56
// XORShiftRandom for better performance. Thread safety isn't necessary here.
53
57
private val random = new XORShiftRandom ()
54
58
59
+ @ Since (" 1.1.0" )
55
60
override def nextValue (): Double = {
56
61
random.nextDouble()
57
62
}
58
63
64
+ @ Since (" 1.1.0" )
59
65
override def setSeed (seed : Long ): Unit = random.setSeed(seed)
60
66
67
+ @ Since (" 1.1.0" )
61
68
override def copy (): UniformGenerator = new UniformGenerator ()
62
69
}
63
70
@@ -66,17 +73,21 @@ class UniformGenerator extends RandomDataGenerator[Double] {
66
73
* Generates i.i.d. samples from the standard normal distribution.
67
74
*/
68
75
@ DeveloperApi
76
+ @ Since (" 1.1.0" )
69
77
class StandardNormalGenerator extends RandomDataGenerator [Double ] {
70
78
71
79
// XORShiftRandom for better performance. Thread safety isn't necessary here.
72
80
private val random = new XORShiftRandom ()
73
81
82
+ @ Since (" 1.1.0" )
74
83
override def nextValue (): Double = {
75
84
random.nextGaussian()
76
85
}
77
86
87
+ @ Since (" 1.1.0" )
78
88
override def setSeed (seed : Long ): Unit = random.setSeed(seed)
79
89
90
+ @ Since (" 1.1.0" )
80
91
override def copy (): StandardNormalGenerator = new StandardNormalGenerator ()
81
92
}
82
93
@@ -87,16 +98,20 @@ class StandardNormalGenerator extends RandomDataGenerator[Double] {
87
98
* @param mean mean for the Poisson distribution.
88
99
*/
89
100
@ DeveloperApi
101
+ @ Since (" 1.1.0" )
90
102
class PoissonGenerator (val mean : Double ) extends RandomDataGenerator [Double ] {
91
103
92
104
private val rng = new PoissonDistribution (mean)
93
105
106
+ @ Since (" 1.1.0" )
94
107
override def nextValue (): Double = rng.sample()
95
108
109
+ @ Since (" 1.1.0" )
96
110
override def setSeed (seed : Long ) {
97
111
rng.reseedRandomGenerator(seed)
98
112
}
99
113
114
+ @ Since (" 1.1.0" )
100
115
override def copy (): PoissonGenerator = new PoissonGenerator (mean)
101
116
}
102
117
@@ -107,16 +122,20 @@ class PoissonGenerator(val mean: Double) extends RandomDataGenerator[Double] {
107
122
* @param mean mean for the exponential distribution.
108
123
*/
109
124
@ DeveloperApi
125
+ @ Since (" 1.3.0" )
110
126
class ExponentialGenerator (val mean : Double ) extends RandomDataGenerator [Double ] {
111
127
112
128
private val rng = new ExponentialDistribution (mean)
113
129
130
+ @ Since (" 1.3.0" )
114
131
override def nextValue (): Double = rng.sample()
115
132
133
+ @ Since (" 1.3.0" )
116
134
override def setSeed (seed : Long ) {
117
135
rng.reseedRandomGenerator(seed)
118
136
}
119
137
138
+ @ Since (" 1.3.0" )
120
139
override def copy (): ExponentialGenerator = new ExponentialGenerator (mean)
121
140
}
122
141
@@ -128,16 +147,20 @@ class ExponentialGenerator(val mean: Double) extends RandomDataGenerator[Double]
128
147
* @param scale scale for the gamma distribution
129
148
*/
130
149
@ DeveloperApi
150
+ @ Since (" 1.3.0" )
131
151
class GammaGenerator (val shape : Double , val scale : Double ) extends RandomDataGenerator [Double ] {
132
152
133
153
private val rng = new GammaDistribution (shape, scale)
134
154
155
+ @ Since (" 1.3.0" )
135
156
override def nextValue (): Double = rng.sample()
136
157
158
+ @ Since (" 1.3.0" )
137
159
override def setSeed (seed : Long ) {
138
160
rng.reseedRandomGenerator(seed)
139
161
}
140
162
163
+ @ Since (" 1.3.0" )
141
164
override def copy (): GammaGenerator = new GammaGenerator (shape, scale)
142
165
}
143
166
@@ -150,15 +173,19 @@ class GammaGenerator(val shape: Double, val scale: Double) extends RandomDataGen
150
173
* @param std standard deviation for the log normal distribution
151
174
*/
152
175
@ DeveloperApi
176
+ @ Since (" 1.3.0" )
153
177
class LogNormalGenerator (val mean : Double , val std : Double ) extends RandomDataGenerator [Double ] {
154
178
155
179
private val rng = new LogNormalDistribution (mean, std)
156
180
181
+ @ Since (" 1.3.0" )
157
182
override def nextValue (): Double = rng.sample()
158
183
184
+ @ Since (" 1.3.0" )
159
185
override def setSeed (seed : Long ) {
160
186
rng.reseedRandomGenerator(seed)
161
187
}
162
188
189
+ @ Since (" 1.3.0" )
163
190
override def copy (): LogNormalGenerator = new LogNormalGenerator (mean, std)
164
191
}
0 commit comments