001    //Licensed to the Apache Software Foundation (ASF) under one
002    //or more contributor license agreements.  See the NOTICE file
003    //distributed with this work for additional information
004    //regarding copyright ownership.  The ASF licenses this file
005    //to you under the Apache License, Version 2.0 (the
006    //"License"); you may not use this file except in compliance
007    //with the License.  You may obtain a copy of the License at
008    
009    //http://www.apache.org/licenses/LICENSE-2.0
010    
011    //Unless required by applicable law or agreed to in writing,
012    //software distributed under the License is distributed on an
013    //"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
014    //KIND, either express or implied.  See the License for the
015    //specific language governing permissions and limitations
016    //under the License.
017    
018    package org.apache.commons.math.random;
019    
020    import org.apache.commons.math.DimensionMismatchException;
021    import org.apache.commons.math.linear.RealMatrix;
022    import org.apache.commons.math.stat.descriptive.moment.VectorialCovariance;
023    import org.apache.commons.math.stat.descriptive.moment.VectorialMean;
024    
025    import junit.framework.*;
026    
027    public class UncorrelatedRandomVectorGeneratorTest
028    extends TestCase {
029    
030        public UncorrelatedRandomVectorGeneratorTest(String name) {
031            super(name);
032            mean = null;
033            standardDeviation = null;
034            generator = null;
035        }
036    
037        public void testMeanAndCorrelation() throws DimensionMismatchException {
038    
039            VectorialMean meanStat = new VectorialMean(mean.length);
040            VectorialCovariance covStat = new VectorialCovariance(mean.length, true);
041            for (int i = 0; i < 10000; ++i) {
042                double[] v = generator.nextVector();
043                meanStat.increment(v);
044                covStat.increment(v);
045            }
046    
047            double[] estimatedMean = meanStat.getResult();
048            double scale;
049            RealMatrix estimatedCorrelation = covStat.getResult();
050            for (int i = 0; i < estimatedMean.length; ++i) {
051                assertEquals(mean[i], estimatedMean[i], 0.07);
052                for (int j = 0; j < i; ++j) {
053                    scale = standardDeviation[i] * standardDeviation[j];
054                    assertEquals(0, estimatedCorrelation.getEntry(i, j) / scale, 0.03);
055                }
056                scale = standardDeviation[i] * standardDeviation[i];
057                assertEquals(1, estimatedCorrelation.getEntry(i, i) / scale, 0.025);
058            }
059    
060        }
061    
062        @Override
063        public void setUp() {
064            mean              = new double[] {0.0, 1.0, -3.0, 2.3};
065            standardDeviation = new double[] {1.0, 2.0, 10.0, 0.1};
066            RandomGenerator rg = new JDKRandomGenerator();
067            rg.setSeed(17399225432l);
068            generator =
069                new UncorrelatedRandomVectorGenerator(mean, standardDeviation,
070                        new GaussianRandomGenerator(rg));
071        }
072    
073        @Override
074        public void tearDown() {
075            mean = null;
076            standardDeviation = null;
077            generator = null;
078        }
079    
080        public static Test suite() {
081            return new TestSuite(UncorrelatedRandomVectorGeneratorTest.class);
082        }
083    
084        private double[] mean;
085        private double[] standardDeviation;
086        private UncorrelatedRandomVectorGenerator generator;
087    
088    }