/** * Should only be used after calculateDerived() */ private void checkStatsValidState(Stats stats) { assertTrue("Incorrect count in valid state!", stats.count > 0); if (stats.count <= 1) assertTrue("Incorrect stdDev in valid state!", Double.isNaN(stats.stdDev)); if (!Double.isNaN(stats.stdDev)) assertTrue("Incorrect stdDev in valid state!", stats.stdDev >= 0); assertFalse("Incorrect mean in valid state!", Double.isNaN(stats.mean)); assertFalse("Incorrect min in valid state!", Double.isNaN(stats.min)); assertFalse("Incorrect max in valid state!", Double.isNaN(stats.max)); }
/** * Can be used after add/subtract/calculateDerived() */ private void checkStatsInitialized(Stats stats) { assertTrue("Incorrect initialization for count!", 0.0 == stats.count); assertTrue("Incorrect initialization for sum!", 0.0 == stats.sum); assertTrue("Incorrect initialization for sumSq!", 0.0 == stats.sumSq); assertNaN("Incorrect initialization for stdDev!", stats.stdDev); assertNaN("Incorrect initialization for mean!", stats.mean); assertNaN("Incorrect initialization for min!", stats.min); assertNaN("Incorrect initialization for max!", stats.max); }
private void checkAccuracy(long[] weightedValues, long mean, long stdDev) { checkAccuracy(weightedValues, mean, stdDev, TOLERANCE); }
/** * The Stats class should be initialized as follows:<p> * * Stats.count = 0<br /> * Stats.sum = 0<br /> * Stats.sumSq = 0<br /> * Stats.stdDev = Double.NaN<br /> * Stats.mean = Double.NaN<br /> * Stats.min = Double.NaN<br /> * stats.max = Double.NaN<br /> */ public void testInitialization() { checkStatsInitialized(getStats()); }
Stats reference = getStats(); Stats test = getStats(); addWeightedStats(reference, positiveWeights); subtractWeightedStats(test, negativeWeights); checkStats(test, descr, reference, 0.0); addWeightedStats(reference, weightedValues1); addWeightedStats(test, weightedValues1); subtractWeightedStats(reference, positiveWeights); addWeightedStats(test, negativeWeights); checkStats(test, descr, reference, 0.0); addWeightedStats(reference, weightedValues2); addWeightedStats(test, weightedValues2); addWeightedStats(reference, positiveWeights); subtractWeightedStats(test, negativeWeights); checkStats(test, descr, reference, 0.0); subtractWeightedStats(reference, weightedValues1); subtractWeightedStats(test, weightedValues1); checkStats(test, descr, reference, 0.0);
stats = getStats(); addWeightedStats(stats, smallWeightedValues); double max_simple = getWeightedMax(smallWeightedValues); double min_simple = getWeightedMin(smallWeightedValues); assertEquals("Incorrect min!", min_simple, stats.min); assertEquals("Incorrect max!", max_simple, stats.max); assertTrue("Assumption violated in testcase!", max_simple < getWeightedMax(weightedValues1)); assertTrue("Assumption violated in testcase!", min_simple > getWeightedMin(weightedValues1)); addWeightedStats(stats, weightedValues1); max_simple = Math.max(max_simple, getWeightedMax(weightedValues1)); min_simple = Math.min(min_simple, getWeightedMin(weightedValues1)); assertEquals("Incorrect min!", min_simple, stats.min); assertEquals("Incorrect max!", max_simple, stats.max); addWeightedStats(stats, weightedValues1); assertEquals("Incorrect min!", min_simple, stats.min); assertEquals("Incorrect max!", max_simple, stats.max); addWeightedStats(stats, weightedValues2); max_simple = Math.max(max_simple, getWeightedMax(weightedValues2)); min_simple = Math.min(min_simple, getWeightedMin(weightedValues2)); assertEquals("Incorrect min!", min_simple, stats.min); assertEquals("Incorrect max!", max_simple, stats.max);
stats = getStats(); subtractWeightedStats(stats, weightedValues1); checkStatsNegativeCount(stats); stats.calculateDerived(); checkStatsNegativeCount(stats); stats = getStats(); addWeightedStats(stats, weightedValues1); stats.calculateDerived(); checkStatsValidState(stats); subtractWeightedStats(stats, weightedValues1); checkStatsInitialized(stats); stats.calculateDerived(); checkStatsInitialized(stats); subtractWeightedStats(stats, weightedValues2); checkStatsNegativeCount(stats); stats.calculateDerived(); checkStatsNegativeCount(stats); reference = getStats(); stats = getStats(); subtractWeightedStats(stats, weightedValues1); checkStatsNegativeCount(stats); addWeightedStats(stats, weightedValues1); checkStatsInitialized(stats); stats.calculateDerived(); checkStatsInitialized(stats); addWeightedStats(stats, weightedValues1); stats.calculateDerived();
Stats stats = getStats(); addWeightedStats(stats, weightedValues); stats.calculateDerived(); Stats subtracted1 = getStats(); addWeightedStatsWithSubtracts(subtracted1, weightedValues, weightedValues, 3, 3); subtracted1.calculateDerived(); Stats subtracted2 = getStats(); addWeightedStatsWithSubtracts(subtracted2, weightedValues, weightedValues, 2, 4); subtracted2.calculateDerived(); assertEquals("Inaccurate mean calculation!", meanDouble, stats.mean, Math.abs(meanDouble*tolerance)); assertEquals("Inaccurate stdDev calculation!", stdDevDouble, stats.stdDev, Math.abs(stdDevDouble*tolerance)); assertEquals("Inaccurate mean calculation when using subtract!", meanDouble, subtracted1.mean, Math.abs(meanDouble*tolerance)); assertEquals("Inaccurate stdDev calculation when using subtract!", stdDevDouble, subtracted1.stdDev, Math.abs(stdDevDouble*tolerance)); assertEquals("Inaccurate mean calculation when using subtract!", meanDouble, subtracted2.mean, Math.abs(meanDouble*tolerance)); assertEquals("Inaccurate stdDev calculation when using subtract!", stdDevDouble, subtracted2.stdDev, Math.abs(stdDevDouble*tolerance));
stats = getStats(); stats.add(value, weight); checkStatsInvalidState(stats); stats = getStats(); stats.subtract(value, weight); checkStatsInvalidState(stats); stats = getStats(); addWeightedStats(stats, weightedValues2); stats.add(value, weight); checkStatsInvalidState(stats); stats = getStats(); addWeightedStats(stats, weightedValues2); stats.subtract(value, weight); checkStatsInvalidState(stats); stats = getStats(); subtractWeightedStats(stats, weightedValues2); stats.add(value, weight); checkStatsInvalidState(stats); stats = getStats(); subtractWeightedStats(stats, weightedValues2); stats.subtract(value, weight); checkStatsInvalidState(stats);
stats = getStats(); stats.add(1.0, 1.0); stats.calculateDerived(); assertNaN(descr, stats.stdDev); stats = getStats(); stats.add(2.0, 0.5); stats.calculateDerived(); assertNaN(descr, stats.stdDev); stats = getStats(); stats.add(-10.0, 0.10986); stats.calculateDerived(); assertNaN(descr, stats.stdDev); stats = getStats(); addWeightedStats(stats, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0); subtractWeightedStats(stats, 1.0, 1.0, 2.0, 2.0); stats.calculateDerived(); assertNaN(descr, stats.stdDev); stats = getStats(); subtractWeightedStats(stats, 1.0, 1.0, 2.0, 2.0); addWeightedStats(stats, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0); stats.calculateDerived(); assertNaN(descr, stats.stdDev); stats = getStats(); addWeightedStats(stats, 1.0, 0.1, 2.0, 0.2, 3.0, 0.3);
getNaN(), getNaN(), Double.POSITIVE_INFINITY, 1.0, Double.NEGATIVE_INFINITY, 1.0, getNaN(), 0.0, getNaN(), 1.0, 0.0, getNaN(), 1.0, getNaN() }; assertNaN("Incorrect count in invalid state!", stats.count); assertNaN("Incorrect sum in invalid state", stats.sum); assertNaN("Incorrect sumSq in invalid state", stats.sumSq); assertNaN("Incorrect mean in invalid state", stats.mean); assertNaN("Incorrect stdDev in invalid state", stats.stdDev); assertNaN("Incorrect min in invalid state", stats.min); assertNaN("Incorrect max in invalid state", stats.max);
private double getNaN() { NaN_counter = (NaN_counter + 1) % NaNs.length; assertTrue("Assumption violated!", Double.isNaN(NaNs[NaN_counter])); return NaNs[NaN_counter]; }
private void checkStats(Stats stats, String descr, Stats reference, double tolerance) { checkStats(stats, descr, reference.count, reference.sum, reference.sumSq, reference.mean, reference.stdDev, reference.min, reference.max, tolerance); }
private void checkStats(Stats stats, String descr, double count, double sum, double sumSq, double mean, double stdDev, double min, double max, double tolerance) { if (descr == null) descr = ""; else descr = " (" + descr + ")"; assertEquals("Incorrect count" + descr + "!", count, stats.count, Math.abs(count*tolerance)); assertEquals("Incorrect sum" + descr + "!", sum, stats.sum, Math.abs(sum*tolerance)); assertEquals("Incorrect sumSq" + descr + "!", sumSq, stats.sumSq, Math.abs(sumSq*tolerance)); assertEquals("Incorrect mean" + descr + "!", mean, stats.mean, Math.abs(mean*tolerance)); assertEquals("Incorrect stdDev" + descr + "!", stdDev, stats.stdDev, Math.abs(stdDev*tolerance)); assertEquals("Incorrect min" + descr + "!", min, stats.min, Math.abs(min*tolerance)); assertEquals("Incorrect max" + descr + "!", max, stats.max, Math.abs(max*tolerance)); }
Stats reference = getStats(); Stats test = getStats(); addWeightedStats(reference, positiveWeights); subtractWeightedStats(test, negativeWeights); checkStats(test, descr, reference, 0.0); addWeightedStats(reference, weightedValues1); addWeightedStats(test, weightedValues1); subtractWeightedStats(reference, positiveWeights); addWeightedStats(test, negativeWeights); checkStats(test, descr, reference, 0.0); addWeightedStats(reference, weightedValues2); addWeightedStats(test, weightedValues2); addWeightedStats(reference, positiveWeights); subtractWeightedStats(test, negativeWeights); checkStats(test, descr, reference, 0.0); subtractWeightedStats(reference, weightedValues1); subtractWeightedStats(test, weightedValues1); checkStats(test, descr, reference, 0.0);
stats = getStats(); addWeightedStats(stats, smallWeightedValues); double max_simple = getWeightedMax(smallWeightedValues); double min_simple = getWeightedMin(smallWeightedValues); assertEquals("Incorrect min!", min_simple, stats.min); assertEquals("Incorrect max!", max_simple, stats.max); assertTrue("Assumption violated in testcase!", max_simple < getWeightedMax(weightedValues1)); assertTrue("Assumption violated in testcase!", min_simple > getWeightedMin(weightedValues1)); addWeightedStats(stats, weightedValues1); max_simple = Math.max(max_simple, getWeightedMax(weightedValues1)); min_simple = Math.min(min_simple, getWeightedMin(weightedValues1)); assertEquals("Incorrect min!", min_simple, stats.min); assertEquals("Incorrect max!", max_simple, stats.max); addWeightedStats(stats, weightedValues1); assertEquals("Incorrect min!", min_simple, stats.min); assertEquals("Incorrect max!", max_simple, stats.max); addWeightedStats(stats, weightedValues2); max_simple = Math.max(max_simple, getWeightedMax(weightedValues2)); min_simple = Math.min(min_simple, getWeightedMin(weightedValues2)); assertEquals("Incorrect min!", min_simple, stats.min); assertEquals("Incorrect max!", max_simple, stats.max);
stats = getStats(); subtractWeightedStats(stats, weightedValues1); checkStatsNegativeCount(stats); stats.calculateDerived(); checkStatsNegativeCount(stats); stats = getStats(); addWeightedStats(stats, weightedValues1); stats.calculateDerived(); checkStatsValidState(stats); subtractWeightedStats(stats, weightedValues1); checkStatsInitialized(stats); stats.calculateDerived(); checkStatsInitialized(stats); subtractWeightedStats(stats, weightedValues2); checkStatsNegativeCount(stats); stats.calculateDerived(); checkStatsNegativeCount(stats); reference = getStats(); stats = getStats(); subtractWeightedStats(stats, weightedValues1); checkStatsNegativeCount(stats); addWeightedStats(stats, weightedValues1); checkStatsInitialized(stats); stats.calculateDerived(); checkStatsInitialized(stats); addWeightedStats(stats, weightedValues1); stats.calculateDerived();
Stats stats = getStats(); addWeightedStats(stats, weightedValues); stats.calculateDerived(); Stats subtracted1 = getStats(); addWeightedStatsWithSubtracts(subtracted1, weightedValues, weightedValues, 3, 3); subtracted1.calculateDerived(); Stats subtracted2 = getStats(); addWeightedStatsWithSubtracts(subtracted2, weightedValues, weightedValues, 2, 4); subtracted2.calculateDerived(); assertEquals("Inaccurate mean calculation!", meanDouble, stats.mean, Math.abs(meanDouble*tolerance)); assertEquals("Inaccurate stdDev calculation!", stdDevDouble, stats.stdDev, Math.abs(stdDevDouble*tolerance)); assertEquals("Inaccurate mean calculation when using subtract!", meanDouble, subtracted1.mean, Math.abs(meanDouble*tolerance)); assertEquals("Inaccurate stdDev calculation when using subtract!", stdDevDouble, subtracted1.stdDev, Math.abs(stdDevDouble*tolerance)); assertEquals("Inaccurate mean calculation when using subtract!", meanDouble, subtracted2.mean, Math.abs(meanDouble*tolerance)); assertEquals("Inaccurate stdDev calculation when using subtract!", stdDevDouble, subtracted2.stdDev, Math.abs(stdDevDouble*tolerance));
stats = getStats(); stats.add(value, weight); checkStatsInvalidState(stats); stats = getStats(); stats.subtract(value, weight); checkStatsInvalidState(stats); stats = getStats(); addWeightedStats(stats, weightedValues2); stats.add(value, weight); checkStatsInvalidState(stats); stats = getStats(); addWeightedStats(stats, weightedValues2); stats.subtract(value, weight); checkStatsInvalidState(stats); stats = getStats(); subtractWeightedStats(stats, weightedValues2); stats.add(value, weight); checkStatsInvalidState(stats); stats = getStats(); subtractWeightedStats(stats, weightedValues2); stats.subtract(value, weight); checkStatsInvalidState(stats);
stats = getStats(); stats.add(1.0, 1.0); stats.calculateDerived(); assertNaN(descr, stats.stdDev); stats = getStats(); stats.add(2.0, 0.5); stats.calculateDerived(); assertNaN(descr, stats.stdDev); stats = getStats(); stats.add(-10.0, 0.10986); stats.calculateDerived(); assertNaN(descr, stats.stdDev); stats = getStats(); addWeightedStats(stats, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0); subtractWeightedStats(stats, 1.0, 1.0, 2.0, 2.0); stats.calculateDerived(); assertNaN(descr, stats.stdDev); stats = getStats(); subtractWeightedStats(stats, 1.0, 1.0, 2.0, 2.0); addWeightedStats(stats, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0); stats.calculateDerived(); assertNaN(descr, stats.stdDev); stats = getStats(); addWeightedStats(stats, 1.0, 0.1, 2.0, 0.2, 3.0, 0.3);