package edu.stanford.nlp.util; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import edu.stanford.nlp.stats.Counter; /** This class can be used to help assess results of benchmark tests. * * @author Christopher Manning */ public class BenchmarkingHelper { private BenchmarkingHelper() {} // static methods public static void setLowHighExpected(Counter<String> lowRes, Counter<String> highRes, Counter<String> expRes, String key, double lowVal, double highVal, double expVal) { lowRes.setCount(key, lowVal); highRes.setCount(key, highVal); expRes.setCount(key, expVal); } public static void benchmarkResults(Counter<String> results, Counter<String> lowResults, Counter<String> highResults, Counter<String> expectedResults) { if (results.keySet().isEmpty()) { fail("There are no results to benchmark!"); } for (String key : results.keySet()) { if ( ! (highResults.containsKey(key) && lowResults.containsKey(key))) { fail("Missing performance bounds for " + key); } double val = results.getCount(key); double high = highResults.getCount(key); double low = lowResults.getCount(key); assertTrue("Value for " + key + " = " + val + " is lower than expected minimum " + low, val >= low); assertTrue("Value for " + key + " = " + val + " is higher than expected maximum " + high + " [not a bug, but a breakthrough!]", val <= high); if (expectedResults == null) { System.err.printf("Value for %s = %.4f is within the expected range [%.4f, %.4f]%n", key, val, low, high); } else { double expected = expectedResults.getCount(key); if (val < (expected - 1e-4)) { System.err.printf("Value for %s = %.4f is slightly lower than expected %.4f%n", key, val, expected); } else if (val > (expected + 1e-4)) { System.err.printf("Value for %s = %.4f is slightly higher than expected %.4f%n", key, val, expected); } else { System.err.printf("Value for %s = %.4f is as expected%n", key, val); } } } } }