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 2022/09/05 12:29:00 UTC

[jira] [Resolved] (RNG-180) New SplittableUniformRandomProvider interface

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

Alex Herbert resolved RNG-180.
------------------------------
    Resolution: Implemented

Added in commit:

d8cef06abf90e2effbb967899101d2b4fe090290

> New SplittableUniformRandomProvider interface
> ---------------------------------------------
>
>                 Key: RNG-180
>                 URL: https://issues.apache.org/jira/browse/RNG-180
>             Project: Commons RNG
>          Issue Type: New Feature
>          Components: client-api, core
>    Affects Versions: 1.5
>            Reporter: Alex Herbert
>            Assignee: Alex Herbert
>            Priority: Major
>             Fix For: 1.5
>
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> The minimum java version for RNG is now 1.8. Stream support has been added for the UniformRandomProvider and Sampler interfaces. These all operate using a sequential stream. To use a parallel stream requires the concept of splitting the source of randomness.
> I propose to add a Splittable interface. This can be modelled on the interface in the JDK 17 random package [SplittableGenerator (javadoc)|https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/random/RandomGenerator.SplittableGenerator.html]:
> {code:java}
> public interface SplittableUniformRandomProvider 
>     extends UniformRandomProvider {
>     SplittableUniformRandomProvider split();
>     SplittableUniformRandomProvider split(SplittableUniformRandomProvider source);
>     Stream<SplittableUniformRandomProvider> splits();
>     Stream<SplittableUniformRandomProvider> splits(SplittableUniformRandomProvider source);
>     Stream<SplittableUniformRandomProvider> splits(long streamSize);
>     Stream<SplittableUniformRandomProvider> splits(long streamSize,
>         SplittableUniformRandomProvider source);
> {code}
> The JDK interface has both a split and split(source) method, and similar for the stream created by repeat splitting. The source is to provide the random bits to initialise the new instances. In most cases this will just be the current instance. However it provides a means to provide a small state splittable generator for the random source of bits and use a larger state generator to provide new instances from those bits, or vice versa. This allows more flexibility to control the source of random bits, and the instance type of the new split generators.
> Note: It is possible to implement the entire interface using default methods except:
> {code:java}
>     SplittableUniformRandomProvider split(SplittableUniformRandomProvider source);
> {code}
> The stream can be created by recursively splitting the current instance via a custom Spliterator<SplittableUniformRandomProvider>.
> Also note that the stream methods in UniformRandomProvider can be overridden to support parallel streams. This requires for example a custom Spliterator.OfInt to split the generator for parallel generation.
>  



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