package edu.brown.utils; import java.util.ArrayList; import java.util.List; import java.util.Random; import org.junit.Test; import edu.brown.statistics.FastIntHistogram; import edu.brown.statistics.Histogram; import edu.brown.statistics.HistogramUtil; import edu.brown.statistics.ObjectHistogram; import junit.framework.TestCase; public class TestMathUtil extends TestCase { private static final int NUM_VALUES = 10; /** * Just some know values that I already have the known geometric mean for */ private static final double TEST_VALUES[] = { 1.0, 0.01130203601213331, 0.01823143760522339, 0.017141472718601114, 0.002007288849070199, 0.008572316547717063, 0.008176750277889333, 0.011508064996154976, 0.00688530755354444, 0.011432267059707457 }; /** * testFudgeyEquals */ public void testFudgeyEquals() { // So dirty... double val0 = 1.110; double val1 = 1.150; assert(MathUtil.equals(val0, val1, 2, 0.04)); assertFalse(MathUtil.equals(val0, val1, 2, 0.01)); } /** * testGeometricMean */ @Test public void testGeometricMean() { double expected = 0.015d; double mean = MathUtil.geometricMean(TEST_VALUES); assertEquals(expected, MathUtil.roundToDecimals(mean, 3)); mean = MathUtil.geometricMean(TEST_VALUES, MathUtil.GEOMETRIC_MEAN_ZERO); assertEquals(expected, MathUtil.roundToDecimals(mean, 3)); } /** * testGeometricMeanOnes */ @Test public void testGeometricMeanOnes() { double values[] = new double[NUM_VALUES]; for (int i = 0; i < NUM_VALUES; i++) { values[i] = 1.0; } // FOR double mean = MathUtil.geometricMean(values); assertEquals(1.0, mean); } /** * testGeometricMeanZeroes */ @Test public void testGeometricMeanZeroes() { double values[] = new double[NUM_VALUES]; for (int i = 0; i < NUM_VALUES; i++) { values[i] = 0.0d; } // FOR double mean = MathUtil.geometricMean(values, MathUtil.GEOMETRIC_MEAN_ZERO); assertEquals(0.0, MathUtil.roundToDecimals(mean, 2)); } /** * testStandardDeviation1 */ @Test public void testStandardDeviation1() { double expected = 0.3129164048d; double stddev = MathUtil.stdev(TEST_VALUES); assertEquals(expected, stddev, 0.001); } /** * testStandardDeviation2 */ @Test public void testStandardDeviation2() { List<Double> values = new ArrayList<Double>(); for (int i = 0; i < 100; i++) { double v = Double.parseDouble(String.format("%d.%d", i, i)); values.add(v); } // FOR double expected = 29.2410446405d; double stddev = MathUtil.stdev(CollectionUtil.toDoubleArray(values)); assertEquals(expected, stddev, 0.001); } /** * testStandardDeviationHistogram */ @Test public void testStandardDeviationHistogram() { Random rand = new Random(0); List<Integer> values = new ArrayList<Integer>(); FastIntHistogram h0 = new FastIntHistogram(100); Histogram<Integer> h1 = new ObjectHistogram<Integer>(); for (int i = 0; i < 1000; i++) { int val = rand.nextInt(100); values.add(val); h0.put(val); h1.put(val); } // FOR double expected = MathUtil.stdev(CollectionUtil.toDoubleArray(values)); assertEquals(expected, HistogramUtil.stdev(h0), 0.001); assertEquals(expected, HistogramUtil.stdev(h1), 0.001); } }