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/07/31 21:49:00 UTC
[jira] [Resolved] (RNG-110) Factory methods for Discrete and
Continuous distribution samplers
[ https://issues.apache.org/jira/browse/RNG-110?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Alex D Herbert resolved RNG-110.
--------------------------------
Resolution: Implemented
In master.
> Factory methods for Discrete and Continuous distribution samplers
> -----------------------------------------------------------------
>
> Key: RNG-110
> URL: https://issues.apache.org/jira/browse/RNG-110
> Project: Commons RNG
> Issue Type: Improvement
> Components: sampling
> Affects Versions: 1.3
> Reporter: Alex D Herbert
> Assignee: Alex D Herbert
> Priority: Major
> Fix For: 1.3
>
> Time Spent: 40m
> Remaining Estimate: 0h
>
> Many of the Discrete and Continuous samplers use internal classes to select the best algorithm. The outer class is then a simple wrapper for the inner class implementation. All samplers have a very simple public API with a sample method and the ability to create a new instance (SharedStateSampler<R> interface):
> {code:java}
> String toString();
> int/double sample();
> SharedStateSampler<R> withUniformRandomProvider(UniformRandomProvider);
> {code}
> This can be encapsulated in a new pair of interfaces:
> {code:java}
> public interface SharedStateDiscreteSampler
> extends DiscreteSampler,
> SharedStateSampler<SharedStateDiscreteSampler> {
> // Marker interface
> }
> public interface SharedStateContinuousSampler
> extends ContinuousSampler,
> SharedStateSampler<SharedStateContinuousSampler> {
> // Marker interface
> }
> {code}
> All distribution samplers should implement one of these new interfaces. This simplifies the implementation of the SharedStateSampler<R> interface and allows to move to a factory constructor code model. Each sampler would have a factory method to create a sampler. The factory method is free to choose the optimal implementation.
> All current released classes must maintain their public constructors. All unreleased classes should remove public constructors and have factory methods to create a sampler. The suggested factory method is {{of}}. E.g.
> {code:java}
> UniformRandomProvider rng = ...;
> double probabilityOfSuccess = ...;
> SharedStateDiscreteSampler sampler =
> GeometricSampler.of(rng, probabilityOfSuccess);
> {code}
> In the case of classes with existing factory methods these can be moved to inner classes allowing:
> {code:java}
> SharedStateDiscreteSampler sampler =
> MarsagliaTsangWangDiscreteSampler.Binomial.of(...)
> SharedStateDiscreteSampler sampler =
> MarsagliaTsangWangDiscreteSampler.Poisson.of(...)
> SharedStateDiscreteSampler sampler =
> MarsagliaTsangWangDiscreteSampler.Enumerated.of(...)
> {code}
> Overall the proposal is to:
> - Create SharedStateDiscreteSampler and SharedStateContinuousSampler
> - Simplify the implementation of SharedStateSampler<R> for Discrete and Continuous samplers
> - Move to factory constructors for unreleased samplers
> - Add factory constructors to existing samplers to return optimised
> implementations
> Note: Removal of existing public constructors cannot be done until the next major release. Addition of factory constructors for these classes will allow optimal samplers to be constructed.
> *TBD - Documentation/Deprecated of public constructors*
> A note should be added to the public constructor when the factory method will create a more optimal sampler, for example in the case of the {{PoissonSampler}} which wraps a specialised Small/LargeMeanPoissonSampler.
> {code:java}
> /**
> * This instance delegates sampling. Use the factory method
> * {@link #of(UniformRandomProvider, double)} to create an optimal sampler.
> *
> * @param rng Generator of uniformly distributed random numbers.
> * @param mean Mean.
> * @throws IllegalArgumentException if {@code mean <= 0} or
> * {@code mean >} {@link Integer#MAX_VALUE}.
> */
> public PoissonSampler(UniformRandomProvider rng,
> double mean) {
> {code}
>
> An alternative would be the same message within a deprecated tag.
>
--
This message was sent by Atlassian JIRA
(v7.6.14#76016)