You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Thomas Neidhart (JIRA)" <ji...@apache.org> on 2013/03/10 13:43:13 UTC
[jira] [Comment Edited] (MATH-942) DiscreteDistribution.sample(int)
may throw an exception if first element of singletons of sub-class type
[ https://issues.apache.org/jira/browse/MATH-942?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13598225#comment-13598225 ]
Thomas Neidhart edited comment on MATH-942 at 3/10/13 12:42 PM:
----------------------------------------------------------------
What do you think about the following extension:
{noformat}
/**
* Generate a random sample from the distribution.
* <p>
* If the requested samples fit in the specified array, it is returned
* therein. Otherwise, a new array is allocated with the runtime type of
* the specified array and the size of this collection.
*
* @param sampleSize the number of random values to generate.
* @param array the array to populate.
* @return an array representing the random sample.
* @throws NotStrictlyPositiveException if {@code sampleSize} is not
* positive.
*/
public T[] sample(int sampleSize, final T[] array) throws NotStrictlyPositiveException {
if (sampleSize <= 0) {
throw new NotStrictlyPositiveException(LocalizedFormats.NUMBER_OF_SAMPLES,
sampleSize);
}
T[] out;
final int arraySize = array != null ? array.length : -1;
if (arraySize < sampleSize) {
@SuppressWarnings("unchecked") // safe as both are of type T
final T[] unchecked = (T[]) Array.newInstance(array.getClass().getComponentType(), sampleSize);
out = unchecked;
} else {
out = array;
}
for (int i = 0; i < sampleSize; i++) {
out[i] = sample();
}
return out;
}
{noformat}
Similar to the toArray(T[]) methods of Collections, a user could already provide an array which is used if the sample size fits into it, otherwise it is created in a type-safe way, and the return-type is of T[] so that a user does not have to do a cast.
was (Author: tn):
What do you think about the following extension:
{noformat}
/**
* Generate a random sample from the distribution.
* <p>
* If the requested samples fit in the specified array, it is returned
* therein, with any trailing elements set to null. Otherwise, a new array
* is allocated with the runtime type of the specified array
* and the size of this collection.
*
* @param sampleSize the number of random values to generate.
* @param array the array to populate.
* @return an array representing the random sample.
* @throws NotStrictlyPositiveException if {@code sampleSize} is not
* positive.
*/
public T[] sample(int sampleSize, final T[] array) throws NotStrictlyPositiveException {
if (sampleSize <= 0) {
throw new NotStrictlyPositiveException(LocalizedFormats.NUMBER_OF_SAMPLES,
sampleSize);
}
T[] out;
final int arraySize = array != null ? array.length : -1;
if (arraySize < sampleSize) {
@SuppressWarnings("unchecked") // safe as both are of type T
final T[] unchecked = (T[]) Array.newInstance(array.getClass().getComponentType(), sampleSize);
out = unchecked;
} else {
out = array;
}
for (int i = 0; i < sampleSize; i++) {
out[i] = sample();
}
return out;
}
{noformat}
Similar to the toArray(T[]) methods of Collections, a user could already provide an array which is used if the sample size fits into it, otherwise it is created in a type-safe way, and the return-type is of T[] so that a user does not have to do a cast.
> DiscreteDistribution.sample(int) may throw an exception if first element of singletons of sub-class type
> --------------------------------------------------------------------------------------------------------
>
> Key: MATH-942
> URL: https://issues.apache.org/jira/browse/MATH-942
> Project: Commons Math
> Issue Type: Bug
> Reporter: Piotr Wydrych
> Fix For: 3.2
>
> Attachments: DiscreteDistribution.java.patch
>
>
> Creating an array with {{Array.newInstance(singletons.get(0).getClass(), sampleSize)}} in DiscreteDistribution.sample(int) is risky. An exception will be thrown if:
> * {{singleons.get(0)}} is of type T1, an sub-class of T, and
> * {{DiscreteDistribution.sample()}} returns an object which is of type T, but not of type T1.
> To reproduce:
> {code}
> List<Pair<Object,Double>> list = new ArrayList<Pair<Object, Double>>();
> list.add(new Pair<Object, Double>(new Object() {}, new Double(0)));
> list.add(new Pair<Object, Double>(new Object() {}, new Double(1)));
> new DiscreteDistribution<Object>(list).sample(1);
> {code}
> Attaching a patch.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira