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

Alex Herbert updated RNG-180:
-----------------------------
    Component/s:     (was: core)

> 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
>    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)

Reply via email to