MATH-1593: Remove duplicate functionality (provided in "Commons RNG").

This commit is contained in:
Gilles Sadowski 2021-05-30 14:58:49 +02:00
parent 8a756d763d
commit c93520a02f
4 changed files with 0 additions and 248 deletions

View File

@ -1,51 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.math4.legacy.random;
import org.apache.commons.rng.UniformRandomProvider;
import org.apache.commons.rng.sampling.distribution.NormalizedGaussianSampler;
import org.apache.commons.rng.sampling.distribution.MarsagliaNormalizedGaussianSampler;
/**
* Random generator that generates normally distributed samples.
*
* @since 1.2
*/
public class GaussianRandomGenerator implements NormalizedRandomGenerator {
/** Gaussian distribution sampler. */
private final NormalizedGaussianSampler sampler;
/**
* Creates a new generator.
*
* @param generator Underlying random generator.
*/
public GaussianRandomGenerator(final UniformRandomProvider generator) {
sampler = new MarsagliaNormalizedGaussianSampler(generator);
}
/**
* Generates a random scalar with zero mean and unit standard deviation.
*
* @return a random value sampled from a normal distribution.
*/
@Override
public double nextNormalizedDouble() {
return sampler.sample();
}
}

View File

@ -1,92 +0,0 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.math4.legacy.random;
import java.util.Arrays;
import org.apache.commons.math4.legacy.exception.DimensionMismatchException;
/**
* A {@link RandomVectorGenerator} that generates vectors with uncorrelated
* components. Components of generated vectors follow (independent) Gaussian
* distributions, with parameters supplied in the constructor.
*
* @since 1.2
*/
public class UncorrelatedRandomVectorGenerator
implements RandomVectorGenerator {
/** Underlying scalar generator. */
private final NormalizedRandomGenerator generator;
/** Mean vector. */
private final double[] mean;
/** Standard deviation vector. */
private final double[] standardDeviation;
/** Simple constructor.
* <p>Build an uncorrelated random vector generator from
* its mean and standard deviation vectors.</p>
* @param mean expected mean values for each component
* @param standardDeviation standard deviation for each component
* @param generator underlying generator for uncorrelated normalized
* components
*/
public UncorrelatedRandomVectorGenerator(double[] mean,
double[] standardDeviation,
NormalizedRandomGenerator generator) {
if (mean.length != standardDeviation.length) {
throw new DimensionMismatchException(mean.length, standardDeviation.length);
}
this.mean = mean.clone();
this.standardDeviation = standardDeviation.clone();
this.generator = generator;
}
/** Simple constructor.
* <p>Build a null mean random and unit standard deviation
* uncorrelated vector generator</p>
* @param dimension dimension of the vectors to generate
* @param generator underlying generator for uncorrelated normalized
* components
*/
public UncorrelatedRandomVectorGenerator(int dimension,
NormalizedRandomGenerator generator) {
mean = new double[dimension];
standardDeviation = new double[dimension];
Arrays.fill(standardDeviation, 1.0);
this.generator = generator;
}
/** Generate an uncorrelated random vector.
* @return a random vector as a newly built array of double
*/
@Override
public double[] nextVector() {
double[] random = new double[mean.length];
for (int i = 0; i < random.length; ++i) {
random[i] = mean[i] + standardDeviation[i] * generator.nextNormalizedDouble();
}
return random;
}
}

View File

@ -1,40 +0,0 @@
//Licensed to the Apache Software Foundation (ASF) under one
//or more contributor license agreements. See the NOTICE file
//distributed with this work for additional information
//regarding copyright ownership. The ASF licenses this file
//to you under the Apache License, Version 2.0 (the
//"License"); you may not use this file except in compliance
//with the License. You may obtain a copy of the License at
//http://www.apache.org/licenses/LICENSE-2.0
//Unless required by applicable law or agreed to in writing,
//software distributed under the License is distributed on an
//"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//KIND, either express or implied. See the License for the
//specific language governing permissions and limitations
//under the License.
package org.apache.commons.math4.legacy.random;
import org.apache.commons.rng.simple.RandomSource;
import org.apache.commons.math4.legacy.stat.StatUtils;
import org.junit.Assert;
import org.junit.Test;
public class GaussianRandomGeneratorTest {
@Test
public void testMeanAndStandardDeviation() {
final GaussianRandomGenerator generator = new GaussianRandomGenerator(RandomSource.create(RandomSource.MT));
final double[] sample = new double[10000];
for (int i = 0; i < sample.length; ++i) {
sample[i] = generator.nextNormalizedDouble();
}
final double mean = StatUtils.mean(sample);
Assert.assertEquals("mean=" + mean, 0, mean, 1e-2);
final double variance = StatUtils.variance(sample);
Assert.assertEquals("variance=" + variance, 1, variance, 1e-2);
}
}

View File

@ -1,65 +0,0 @@
//Licensed to the Apache Software Foundation (ASF) under one
//or more contributor license agreements. See the NOTICE file
//distributed with this work for additional information
//regarding copyright ownership. The ASF licenses this file
//to you under the Apache License, Version 2.0 (the
//"License"); you may not use this file except in compliance
//with the License. You may obtain a copy of the License at
//http://www.apache.org/licenses/LICENSE-2.0
//Unless required by applicable law or agreed to in writing,
//software distributed under the License is distributed on an
//"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//KIND, either express or implied. See the License for the
//specific language governing permissions and limitations
//under the License.
package org.apache.commons.math4.legacy.random;
import org.apache.commons.math4.legacy.linear.RealMatrix;
import org.apache.commons.rng.simple.RandomSource;
import org.apache.commons.math4.legacy.stat.descriptive.moment.VectorialCovariance;
import org.apache.commons.math4.legacy.stat.descriptive.moment.VectorialMean;
import org.junit.Test;
import org.junit.Assert;
public class UncorrelatedRandomVectorGeneratorTest {
private double[] mean;
private double[] standardDeviation;
private UncorrelatedRandomVectorGenerator generator;
public UncorrelatedRandomVectorGeneratorTest() {
mean = new double[] {0.0, 1.0, -3.0, 2.3};
standardDeviation = new double[] {1.0, 2.0, 10.0, 0.1};
generator =
new UncorrelatedRandomVectorGenerator(mean, standardDeviation,
new GaussianRandomGenerator(RandomSource.create(RandomSource.MT,
17399225433L)));
}
@Test
public void testMeanAndCorrelation() {
// The test is extremely sensitive to the seed (cf. constructor).
VectorialMean meanStat = new VectorialMean(mean.length);
VectorialCovariance covStat = new VectorialCovariance(mean.length, true);
for (int i = 0; i < 10000; ++i) {
double[] v = generator.nextVector();
meanStat.increment(v);
covStat.increment(v);
}
double[] estimatedMean = meanStat.getResult();
double scale;
RealMatrix estimatedCorrelation = covStat.getResult();
for (int i = 0; i < estimatedMean.length; ++i) {
Assert.assertEquals(mean[i], estimatedMean[i], 0.07);
for (int j = 0; j < i; ++j) {
scale = standardDeviation[i] * standardDeviation[j];
Assert.assertEquals(0, estimatedCorrelation.getEntry(i, j) / scale, 0.03);
}
scale = standardDeviation[i] * standardDeviation[i];
Assert.assertEquals(1, estimatedCorrelation.getEntry(i, i) / scale, 0.025);
}
}
}