[ 
https://issues.apache.org/jira/browse/RNG-196?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Alex Herbert resolved RNG-196.
------------------------------
    Fix Version/s: 1.8
       Resolution: Fixed

Added a default alpha of 53 in commit:

8abfa51735d6d4371e6c65f63a568cfa63f1b6d5

 

> FastLoadedDiceRoller defaults can result in performance degradation for 
> categories unlikely to be sampled
> ---------------------------------------------------------------------------------------------------------
>
>                 Key: RNG-196
>                 URL: https://issues.apache.org/jira/browse/RNG-196
>             Project: Commons RNG
>          Issue Type: Improvement
>          Components: sampling
>    Affects Versions: 1.3
>            Reporter: Alex Herbert
>            Priority: Trivial
>             Fix For: 1.8
>
>
> The FastLoadedDiceRollerSampler (FLDR) uses an alpha parameter to exclude 
> weights that are smaller than the largest weight. The alpha parameter 
> controls the threshold for ignoring weights relative to the largest weight 
> using a log2 scale.
> The default behaviour when the alpha parameter is not provided is to use 
> alpha=0 and include all weights. This can result in large memory allocation 
> relative to the number of categories when constructing the internal discrete 
> distribution generating (DDG) tree, and a change to using BigInteger 
> arithmetic for an increased construction time. The probability of observing 
> the smallest weight in the resulting DDG tree is impractically small and thus 
> performance is impacted for accuracy over efficiency.
> Example:
> {code:java}
> double[] weights = {1, 1, 2, Double.MIN_VALUE};
> var s1 = FastLoadedDiceRollerDiscreteSampler.of(rng, weights);  // alpha=0
> var s2 = FastLoadedDiceRollerDiscreteSampler.of(rng, weights, 60); {code}
> During construction the weights are scaled to remove common trailing zero 
> bits, summed exactly and the full bit length of the sum (k) used to allocate 
> the DDG tree. The DDG tree is sized using bit length k multiplied by the 
> number of categories + 1: k * (n+1).
> The default sampler s1 will require look-up tables of length 1076*(4+1). 
> Sampler s2 will require look-up tables of length 2*(3+1). The probability of 
> observing the smallest weight is w / sum(w) or approximately Double.MIN_VALUE 
> / 4 = 1.2e-324.
> An improvement is to introduce a default non-zero value for alpha. A default 
> of 53 would ignore any weight 2^53 smaller than the largest weight. This 
> would have a sampling probability of 2^-53 (1e-16) relative to the largest 
> weight. In practice it would require 2^53 samples from the FLDR to observe 
> this category once. Note that use of this threshold will enable the faster 
> non-BigInteger construction pathway when the number of categories is less 
> than 2^10, and may use this pathway for larger numbers of categories 
> depending on the number of significant bits in the weights.
> Issue identified using a security scan.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to