in commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/StableSampler.java [1356:1387]
public static StableSampler of(UniformRandomProvider rng,
double alpha,
double beta,
double gamma,
double delta) {
validateParameters(alpha, beta, gamma, delta);
// Choose the algorithm.
// Reuse the special cases as they have transformation support.
if (alpha == ALPHA_GAUSSIAN) {
// Note: beta has no effect and is ignored.
return new GaussianStableSampler(rng, gamma, delta);
}
// Note: As beta -> 0 the result cannot be computed differently to beta = 0.
if (alpha == ALPHA_CAUCHY && CMSStableSampler.getTau(ALPHA_CAUCHY, beta) == TAU_ZERO) {
return new CauchyStableSampler(rng, gamma, delta);
}
if (alpha == ALPHA_LEVY && Math.abs(beta) == BETA_LEVY) {
// Support mirroring for negative beta by inverting the beta=1 Levy sample
// using a negative gamma. Note: The delta is not mirrored as it is a shift
// applied to the scaled and mirrored distribution.
return new LevyStableSampler(rng, beta * gamma, delta);
}
// Standardized sampler
final StableSampler sampler = create(rng, alpha, beta);
// Transform
return new TransformedStableSampler(sampler, gamma, delta);
}