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

Alex Herbert updated RNG-185:
-----------------------------
    Component/s: sampling
                     (was: sample)

> ArraySampler to have factory methods to sample from arrays
> ----------------------------------------------------------
>
>                 Key: RNG-185
>                 URL: https://issues.apache.org/jira/browse/RNG-185
>             Project: Commons RNG
>          Issue Type: Wish
>          Components: sampling
>    Affects Versions: 1.6
>            Reporter: Alex Herbert
>            Priority: Minor
>
> The ArraySampler currently offers shuffle support for arrays, similar to the 
> ListSampler which shuffles a List.
> It does not offer an equivalent method to sample a subset from a list. The 
> ListSampler API is:
>  
> {code:java}
> // Sample a List of size k from the input list
> public static <T> List<T> sample(UniformRandomProvider rng,
>                                  List<T> collection,
>                                  int k){code}
> The subset is chosen using a permutation from the PermutationSampler. This 
> method is static and each invocation creates a new PermutationSampler. That 
> class maintains an array of indices for all elements of the list. Thus repeat 
> invocation must recreate this list.
>  
> An improvement would be:
>  * Return a Sampler<double[]>
>  * Allow choice between a permutation (the order of the sample does matter) 
> or a combination (the order of the sample does not matter)
> A suggested API would be:
>  
> {code:java}
> public static ObjectSampler<double[]> 
>     permutationSampler(UniformRandomProvider rng,
>                        double[] array,
>                        int k)
> public static ObjectSampler<double[]>
>     combinationSampler(UniformRandomProvider rng,
>                        double[] array,
>                        int k) {code}
> To implement this for all array types is a lot of repeat boiler plate code, 
> and currently does not have a use case to merit its inclusion. Note that 
> sampling of this type for any array can be performed using e.g.:
>  
>  
> {code:java}
> final PermutationSampler s = new PermutationSampler(rng, array.length, k); 
> ObjectSampler<double[]> sampler = () -> {
>     final int[] indices = s.sample();
>     final double[] sample = new double[indices.length];
>     for (int i = 0; i < sample.length; i++) {
>         sample[i] = array[indices[i]];
>     }
>     return sample;
> };{code}
> Note that one advantage of a direct implementation is that the indices array 
> created by the PermutationSampler can be created as a subset of the input 
> array using the same method. This removes generation of an int[] for each 
> sample. This would be effectively extending the package-private method in 
> SubsetSamplerUtils that performs a partial shuffle of an array to all array 
> types:
> {code:java}
> static int[] partialSample(int[] domain,
>                            int steps,
>                            UniformRandomProvider rng,
>                            boolean upper){code}
> That method is used by both the PermutationSampler and CombinationSampler to 
> partially shuffle the indices. The choice to return the upper or lower half 
> of the part-shuffled array is an optimisation for the CombinationSampler.
> This ticket is a placeholder for discussion on this type of functionality and 
> possible use cases.
>  



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

Reply via email to