MATH-1158.
Method "createSampler" overridden in "ExponentialDistribution".
This commit is contained in:
parent
228b49fe2a
commit
adfa016f3e
|
@ -21,6 +21,7 @@ import org.apache.commons.math4.exception.OutOfRangeException;
|
||||||
import org.apache.commons.math4.exception.util.LocalizedFormats;
|
import org.apache.commons.math4.exception.util.LocalizedFormats;
|
||||||
import org.apache.commons.math4.random.RandomGenerator;
|
import org.apache.commons.math4.random.RandomGenerator;
|
||||||
import org.apache.commons.math4.random.Well19937c;
|
import org.apache.commons.math4.random.Well19937c;
|
||||||
|
import org.apache.commons.math4.rng.UniformRandomProvider;
|
||||||
import org.apache.commons.math4.util.CombinatoricsUtils;
|
import org.apache.commons.math4.util.CombinatoricsUtils;
|
||||||
import org.apache.commons.math4.util.FastMath;
|
import org.apache.commons.math4.util.FastMath;
|
||||||
import org.apache.commons.math4.util.ResizableDoubleArray;
|
import org.apache.commons.math4.util.ResizableDoubleArray;
|
||||||
|
@ -134,6 +135,7 @@ public class ExponentialDistribution extends AbstractRealDistribution {
|
||||||
* @throws NotStrictlyPositiveException if {@code mean <= 0}.
|
* @throws NotStrictlyPositiveException if {@code mean <= 0}.
|
||||||
* @since 3.3
|
* @since 3.3
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public ExponentialDistribution(RandomGenerator rng, double mean)
|
public ExponentialDistribution(RandomGenerator rng, double mean)
|
||||||
throws NotStrictlyPositiveException {
|
throws NotStrictlyPositiveException {
|
||||||
this(rng, mean, DEFAULT_INVERSE_ABSOLUTE_ACCURACY);
|
this(rng, mean, DEFAULT_INVERSE_ABSOLUTE_ACCURACY);
|
||||||
|
@ -150,6 +152,7 @@ public class ExponentialDistribution extends AbstractRealDistribution {
|
||||||
* @throws NotStrictlyPositiveException if {@code mean <= 0}.
|
* @throws NotStrictlyPositiveException if {@code mean <= 0}.
|
||||||
* @since 3.1
|
* @since 3.1
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public ExponentialDistribution(RandomGenerator rng,
|
public ExponentialDistribution(RandomGenerator rng,
|
||||||
double mean,
|
double mean,
|
||||||
double inverseCumAccuracy)
|
double inverseCumAccuracy)
|
||||||
|
@ -243,6 +246,7 @@ public class ExponentialDistribution extends AbstractRealDistribution {
|
||||||
* @since 2.2
|
* @since 2.2
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@Deprecated
|
||||||
public double sample() {
|
public double sample() {
|
||||||
// Step 1:
|
// Step 1:
|
||||||
double a = 0;
|
double a = 0;
|
||||||
|
@ -345,4 +349,59 @@ public class ExponentialDistribution extends AbstractRealDistribution {
|
||||||
public boolean isSupportConnected() {
|
public boolean isSupportConnected() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*
|
||||||
|
* <p>Sampling algorithm uses the
|
||||||
|
* <a href="http://www.jesus.ox.ac.uk/~clifford/a5/chap1/node5.html">
|
||||||
|
* inversion method</a> to generate exponentially distributed
|
||||||
|
* random values from uniform deviates.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public RealDistribution.Sampler createSampler(final UniformRandomProvider rng) {
|
||||||
|
return new RealDistribution.Sampler() {
|
||||||
|
/** {@inheritDoc} */
|
||||||
|
@Override
|
||||||
|
public double sample() {
|
||||||
|
// Step 1:
|
||||||
|
double a = 0;
|
||||||
|
double u = rng.nextDouble();
|
||||||
|
|
||||||
|
// Step 2 and 3:
|
||||||
|
while (u < 0.5) {
|
||||||
|
a += EXPONENTIAL_SA_QI[0];
|
||||||
|
u *= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 4 (now u >= 0.5):
|
||||||
|
u += u - 1;
|
||||||
|
|
||||||
|
// Step 5:
|
||||||
|
if (u <= EXPONENTIAL_SA_QI[0]) {
|
||||||
|
return mean * (a + u);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 6:
|
||||||
|
int i = 0; // Should be 1, be we iterate before it in while using 0
|
||||||
|
double u2 = rng.nextDouble();
|
||||||
|
double umin = u2;
|
||||||
|
|
||||||
|
// Step 7 and 8:
|
||||||
|
do {
|
||||||
|
++i;
|
||||||
|
u2 = rng.nextDouble();
|
||||||
|
|
||||||
|
if (u2 < umin) {
|
||||||
|
umin = u2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 8:
|
||||||
|
} while (u > EXPONENTIAL_SA_QI[i]); // Ensured to exit since EXPONENTIAL_SA_QI[MAX] = 1
|
||||||
|
|
||||||
|
return mean * (a + umin * EXPONENTIAL_SA_QI[0]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue