/* * JASA Java Auction Simulator API * Copyright (C) 2013 Steve Phelps * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. */ package net.sourceforge.jabm.test.util; import org.apache.commons.math3.stat.Frequency; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import net.sourceforge.jabm.prng.DiscreteProbabilityDistribution; import net.sourceforge.jabm.test.PRNGTestSeeds; import net.sourceforge.jabm.util.SummaryStats; import cern.jet.random.engine.MersenneTwister64; import cern.jet.random.engine.RandomEngine; /** * @author Steve Phelps * @version $Revision: 1.2 $ */ public class DiscreteProbabilityDistributionTest extends TestCase { protected DiscreteProbabilityDistribution p[]; protected RandomEngine prng; static final int NUM_TRIALS = 10000000; static final double probs[][] = { { 0.1, 0.2, 0.4, 0.2, 0.1 }, { 0.2, 0.2, 0.2, 0.2, 0.2 }, { 0.25, 0.2, 0.1, 0.2, 0.25 }, { 0, 1, 0, 0, 0 }, { 1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1 } }; public DiscreteProbabilityDistributionTest(String name) { super(name); } public void setUp() { prng = new MersenneTwister64(PRNGTestSeeds.UNIT_TEST_SEED); p = new DiscreteProbabilityDistribution[probs.length]; for (int i = 0; i < probs.length; i++) { p[i] = new DiscreteProbabilityDistribution(prng, probs[i].length); for (int j = 0; j < probs[i].length; j++) { p[i].setProbability(j, probs[i][j]); } } } public void compareDistributions(DiscreteProbabilityDistribution subject, double[] probs) { System.out .println("Testing with subject: " + subject); Frequency frequency = new Frequency(); SummaryStats eventData = new SummaryStats( "Event_Data"); for (int trial = 0; trial < NUM_TRIALS; trial++) { int event = subject.generateRandomEvent(); eventData.newData(event); frequency.addValue(event); } System.out.println(frequency); System.out.println(eventData); double mean = subject.computeMean(); System.out.println("target mean = " + mean); for(int j=0; j<probs.length; j++) { assertTrue(approxEqual(probs[j], frequency.getPct(j))); } assertTrue(approxEqual(eventData.getMean(), mean)); } public void testDynamicBehaviour() { double[] probs = { 0.1, 0.8, 0.1 }; DiscreteProbabilityDistribution subject = new DiscreteProbabilityDistribution(prng, probs); subject.setProbability(0, 0.1); subject.setProbability(1, 0.8); subject.setProbability(2, 0.1); compareDistributions(subject, probs); subject.setProbability(0, 0.8); subject.setProbability(1, 0.1); probs[0] = 0.8; probs[1] = 0.1; compareDistributions(subject, probs); } public void testStats() { for (int test = 0; test < p.length; test++) { DiscreteProbabilityDistribution subject = p[test]; compareDistributions(subject, probs[test]); } } public boolean approxEqual(double x, double y) { return Math.abs(x - y) < 0.005; } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public static Test suite() { return new TestSuite(DiscreteProbabilityDistributionTest.class); } }