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 D Herbert (JIRA)" <ji...@apache.org> on 2019/04/11 11:34:00 UTC

[jira] [Resolved] (RNG-68) AhrensDieterMarsagliaTsangGammaSampler constructor can be optimised for the theta parameter

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

Alex D Herbert resolved RNG-68.
-------------------------------
    Resolution: Implemented
      Assignee: Alex D Herbert

In master.

> AhrensDieterMarsagliaTsangGammaSampler constructor can be optimised for the theta parameter
> -------------------------------------------------------------------------------------------
>
>                 Key: RNG-68
>                 URL: https://issues.apache.org/jira/browse/RNG-68
>             Project: Commons RNG
>          Issue Type: Improvement
>          Components: sampling
>    Affects Versions: 1.2
>            Reporter: Alex D Herbert
>            Assignee: Alex D Herbert
>            Priority: Trivial
>          Time Spent: 40m
>  Remaining Estimate: 0h
>
> The AhrensDieterExponentialSampler has two algorithms based on the {{theta}} parameter. The constructor precomputes factors for both algorithms even though only one algorithm will even be called.
> I suggest optimising the constructor using:
> {code:java}
> public AhrensDieterMarsagliaTsangGammaSampler(UniformRandomProvider rng,
>                                               double alpha,
>                                               double theta) {
>     super(null);
>     this.rng = rng;
>     this.alpha = alpha;
>     this.theta = theta;
>     gaussian = new ZigguratNormalizedGaussianSampler(rng);
>     if (theta < 1) {
>         oneOverTheta = 1 / theta;
>         bGSOptim = 1 + theta / Math.E;
>         // Unused
>         dOptim = cOptim = 0;
>     } else {
>         dOptim = theta - ONE_THIRD;
>         cOptim = ONE_THIRD / Math.sqrt(dOptim);
>         // Unused
>         oneOverTheta = bGSOptim = 0;
>     }
> }
> {code}
> An alternative is to split the two algorithms into two classes as was done for the {{PoissonSampler}} for small and large mean.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)