You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Alex Herbert (Jira)" <ji...@apache.org> on 2021/07/04 08:27:00 UTC

[jira] [Commented] (RNG-150) Update LargeMeanPoissionSampler to use the ZigguratExponentialSampler

    [ https://issues.apache.org/jira/browse/RNG-150?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17374224#comment-17374224 ] 

Alex Herbert commented on RNG-150:
----------------------------------

I added a temporary change to the DiscreteSamplersPerformance class in the JMH package to have a mean for the Poisson sampler. This must be above 40 for the sampler to use the LargeMeanPoissonSampler. It should be fractional to ensure the full functionality is used (a Poisson sample with an integer mean is added to a sample with mean in the range [0, 1)).

Here is a quick output of the speed of the current sampler:
{noformat}
Benchmark                             (mean)   (randomSourceName)            (samplerType)  Mode  Cnt   Score   Error  Units
DiscreteSamplersPerformance.baseline     N/A                  N/A                      N/A  avgt    5   2.043 ± 0.013  ns/op
DiscreteSamplersPerformance.sample      40.5  XO_RO_SHI_RO_128_PP  LargeMeanPoissonSampler  avgt    5  69.775 ± 0.570  ns/op
DiscreteSamplersPerformance.sample      60.5  XO_RO_SHI_RO_128_PP  LargeMeanPoissonSampler  avgt    5  68.625 ± 0.447  ns/op
DiscreteSamplersPerformance.sample     100.5  XO_RO_SHI_RO_128_PP  LargeMeanPoissonSampler  avgt    5  66.874 ± 4.334  ns/op
DiscreteSamplersPerformance.sample     180.5  XO_RO_SHI_RO_128_PP  LargeMeanPoissonSampler  avgt    5  63.866 ± 0.144  ns/op
DiscreteSamplersPerformance.sample     340.5  XO_RO_SHI_RO_128_PP  LargeMeanPoissonSampler  avgt    5  62.073 ± 0.279  ns/op
{noformat}
And after the change to use the ZigguratExponentialSampler:
  
{noformat}
Benchmark                             (mean)   (randomSourceName)            (samplerType)  Mode  Cnt   Score   Error  Units
DiscreteSamplersPerformance.baseline     N/A                  N/A                      N/A  avgt    5   2.093 ± 0.212  ns/op
DiscreteSamplersPerformance.sample      40.5  XO_RO_SHI_RO_128_PP  LargeMeanPoissonSampler  avgt    5  53.798 ± 2.234  ns/op
DiscreteSamplersPerformance.sample      60.5  XO_RO_SHI_RO_128_PP  LargeMeanPoissonSampler  avgt    5  53.035 ± 0.953  ns/op
DiscreteSamplersPerformance.sample     100.5  XO_RO_SHI_RO_128_PP  LargeMeanPoissonSampler  avgt    5  52.646 ± 0.807  ns/op
DiscreteSamplersPerformance.sample     180.5  XO_RO_SHI_RO_128_PP  LargeMeanPoissonSampler  avgt    5  48.005 ± 0.493  ns/op
DiscreteSamplersPerformance.sample     340.5  XO_RO_SHI_RO_128_PP  LargeMeanPoissonSampler  avgt    5  49.246 ± 0.918  ns/op
{noformat}
So the change has made a 20% speed improvement.

Note that the ZigguratExponentialSampler can return infinity for a sample. This is not possible for the AhrensDieterExponentialSampler. Looking at the code in the LargeMeanPoissonSampler the use of the exponential deviate is robust to infinity. This will be used as if it were a very large finite value. No NaN generation can occur due to inf - inf or inf * 0. The sampler would be robust to NaN anyway as any final result as a double is cast to an integer. The sample method loops until conditions are met. So when extreme cases occur due to the random deviates then it will repeat. This change should not effect the samplers functionality.

 

> Update LargeMeanPoissionSampler to use the ZigguratExponentialSampler
> ---------------------------------------------------------------------
>
>                 Key: RNG-150
>                 URL: https://issues.apache.org/jira/browse/RNG-150
>             Project: Commons RNG
>          Issue Type: Improvement
>          Components: sampling
>    Affects Versions: 1.3
>            Reporter: Alex Herbert
>            Priority: Trivial
>
> The LargeMeanPoissionSampler uses a standard exponential deviate. This can be changed from the AhrensDieterExponentialSampler to the ZigguratExponentialSampler which is 4x faster.
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)