Class ZigguratSampler.NormalizedGaussian

java.lang.Object
org.apache.commons.rng.sampling.distribution.ZigguratSampler
org.apache.commons.rng.sampling.distribution.ZigguratSampler.NormalizedGaussian
All Implemented Interfaces:
ContinuousSampler, NormalizedGaussianSampler, SharedStateContinuousSampler, SharedStateSampler<SharedStateContinuousSampler>
Enclosing class:
ZigguratSampler

public static final class ZigguratSampler.NormalizedGaussian extends ZigguratSampler implements NormalizedGaussianSampler, SharedStateContinuousSampler
Modified ziggurat method for sampling from a Gaussian distribution with mean 0 and standard deviation 1.

Note: The algorithm is a modification of the Marsaglia and Tsang "Ziggurat" method. The modification improves performance of the rejection method used to generate samples at the edge of the ziggurat.

See Also:
  • Field Details

    • I_MAX

      private static final int I_MAX
      The number of layers in the ziggurat. Maximum i value for early exit.
      See Also:
    • J_INFLECTION

      private static final int J_INFLECTION
      The point where the Gaussian switches from convex to concave. This is the largest value of X[j] below 1.
      See Also:
    • CONVEX_E_MAX

      private static final long CONVEX_E_MAX
      Maximum epsilon distance of convex pdf(x) above the hypotenuse value for early rejection. Equal to approximately 0.2460 scaled by 2^63. This is negated on purpose as the distance for a point (x,y) above the hypotenuse is negative: (|d| < max) == (d >= -max).
      See Also:
    • CONCAVE_E_MAX

      private static final long CONCAVE_E_MAX
      Maximum distance of concave pdf(x) below the hypotenuse value for early exit. Equal to approximately 0.08244 scaled by 2^63.
      See Also:
    • X_0

      private static final double X_0
      Beginning of tail. Equal to X[0] * 2^63.
      See Also:
    • ONE_OVER_X_0

      private static final double ONE_OVER_X_0
      1/X_0. Used for tail sampling.
      See Also:
    • MAP

      private static final byte[] MAP
      The alias map. An integer in [0, 255] stored as a byte to save space. Contains the alias j for each index. j=0 is the tail; j in [1, N] is the overhang for each layer.
    • IPMF

      private static final long[] IPMF
      The alias inverse PMF. This is the probability threshold to use the alias for j in-place of j. This has been scaled by 2^64 and offset by -2^63. It represents the numerator of a fraction with denominator 2^64 and can be compared directly to a uniform long deviate. The value probability 0.0 is Long.MIN_VALUE and is used when j > I_MAX.
    • X

      private static final double[] X
      The precomputed ziggurat lengths, denoted X_i in the main text.
      • X_i = length of ziggurat layer i.
      • X_j is the upper-left X coordinate of overhang j (starting from 1).
      • X_(j-1) is the lower-right X coordinate of overhang j.

      Values have been scaled by 2^-63. Contains I_MAX + 1 entries as the final value is 0.

    • Y

      private static final double[] Y
      The precomputed ziggurat heights, denoted Y_i in the main text.
      • Y_i = height of ziggurat layer i.
      • Y_j is the upper-left Y coordinate of overhang j (starting from 1).
      • Y_(j-1) is the lower-right Y coordinate of overhang j.

      Values have been scaled by 2^-63. Contains I_MAX + 1 entries as the final value is pdf(x=0).

    • exponential

      private final SharedStateContinuousSampler exponential
      Exponential sampler used for the long tail.
  • Constructor Details

    • NormalizedGaussian

      private NormalizedGaussian(UniformRandomProvider rng)
      Parameters:
      rng - Generator of uniformly distributed random numbers.
  • Method Details

    • toString

      public String toString()
      Overrides:
      toString in class Object
    • sample

      public double sample()
      Creates a double sample.
      Specified by:
      sample in interface ContinuousSampler
      Returns:
      a sample.
    • edgeSample

      private double edgeSample(long xx)
      Create the sample from the edge of the ziggurat.

      This method has been extracted to fit the main sample method within 35 bytes (the default size for a JVM to inline a method).

      Parameters:
      xx - Initial random deviate
      Returns:
      a sample
    • selectRegion

      private int selectRegion()
      Select the overhang region or the tail using alias sampling.
      Returns:
      the region
    • withUniformRandomProvider

      public ZigguratSampler.NormalizedGaussian withUniformRandomProvider(UniformRandomProvider rng)
      Create a new instance of the sampler with the same underlying state using the given uniform random provider as the source of randomness.
      Specified by:
      withUniformRandomProvider in interface SharedStateSampler<SharedStateContinuousSampler>
      Parameters:
      rng - Generator of uniformly distributed random numbers.
      Returns:
      the sampler
    • of

      Create a new normalised Gaussian sampler.
      Parameters:
      rng - Generator of uniformly distributed random numbers.
      Returns:
      the sampler