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/08/30 16:43:00 UTC

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

Alex Herbert created RNG-180:
--------------------------------

             Summary: 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
             Fix For: 1.5


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)