/* * File: MapBasedDataHistogramTest.java * Authors: Justin Basilico * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright November 13, 2007, Sandia Corporation. Under the terms of Contract * DE-AC04-94AL85000, there is a non-exclusive license for use of this work by * or on behalf of the U.S. Government. Export of this program may require a * license from the United States Government. See CopyrightHistory.txt for * complete details. * */ package gov.sandia.cognition.statistics.distribution; import gov.sandia.cognition.statistics.DataDistribution; import java.util.ArrayList; import java.util.Arrays; import junit.framework.TestCase; /** * This class implements JUnit tests for the following classes: * * MapBasedDataHistogramTest * * @author Justin Basilico * @since 2.0 */ public class MapBasedDataHistogramTest extends TestCase { public static double TOLERANCE = 1e-5; public MapBasedDataHistogramTest( String testName) { super(testName); } public DefaultDataDistribution<String> createInstanceEmpty() { return new DefaultDataDistribution.PMF<String>(); } public DefaultDataDistribution<String> createInstancePopulated() { DefaultDataDistribution<String> instance = this.createInstanceEmpty(); instance.increment("a"); instance.increment("a"); instance.increment("b"); instance.increment("c"); instance.increment("c", 4); instance.increment("d", 1); return instance; } public void testConstructors() { DefaultDataDistribution<String> instance = new DefaultDataDistribution<String>(); assertEquals(0.0, instance.getTotal()); assertTrue(instance.getDomain().isEmpty()); instance = new DefaultDataDistribution<String>(2); assertEquals(0.0, instance.getTotal()); assertTrue(instance.getDomain().isEmpty()); instance = new DefaultDataDistribution<String>( Arrays.asList(new String[] { "a", "b"})); instance.increment("a", 4); instance.increment("c", 7); instance = new DefaultDataDistribution<String>(instance); assertEquals(13.0, instance.getTotal()); assertEquals(5.0, instance.get("a")); assertEquals(1.0, instance.get("b")); assertEquals(7.0, instance.get("c")); } public void testClone() { DefaultDataDistribution<String> instance = this.createInstanceEmpty(); DefaultDataDistribution<String> clone = instance.clone(); assertNotSame(instance, clone); assertNotSame(clone, instance.clone()); assertNotSame(instance.asMap(), clone.asMap()); assertEquals(0.0, clone.getTotal()); assertTrue(clone.getDomain().isEmpty()); assertEquals(0.0, instance.getTotal()); assertTrue(instance.getDomain().isEmpty()); instance.increment("a", 4); instance.increment("b", 7); clone = instance.clone(); assertNotSame(instance, clone); assertNotSame(clone, instance.clone()); assertNotSame(instance.asMap(), clone.asMap()); assertEquals(11.0, clone.getTotal()); assertEquals(4.0, clone.get("a")); assertEquals(7.0, clone.get("b")); assertEquals(11.0, instance.getTotal()); assertEquals(4.0, instance.get("a")); assertEquals(7.0, instance.get("b")); } /** * Test of add method, of class gov.sandia.cognition.statistics.distribution.MapBasedDataHistogramTest. */ public void testAdd() { DefaultDataDistribution<String> instance = this.createInstanceEmpty(); assertEquals(0.0, instance.getTotal()); assertEquals(0.0, instance.get("a")); assertEquals(0.0, instance.get("b")); assertEquals(0.0, instance.get("c")); assertEquals(0, instance.getDomain().size()); assertFalse(instance.getDomain().contains("a")); instance.increment("a"); assertEquals(1.0, instance.getTotal()); assertEquals(1.0, instance.get("a")); assertEquals(0.0, instance.get("b")); assertEquals(0.0, instance.get("c")); assertEquals(1, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); instance.increment("a"); assertEquals(2.0, instance.getTotal()); assertEquals(2.0, instance.get("a")); assertEquals(0.0, instance.get("b")); assertEquals(0.0, instance.get("c")); assertEquals(1, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); instance.increment("b"); assertEquals(3.0, instance.getTotal()); assertEquals(2.0, instance.get("a")); assertEquals(1.0, instance.get("b")); assertEquals(0.0, instance.get("c")); assertEquals(2, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); assertTrue(instance.getDomain().contains("b")); instance.increment("a"); assertEquals(4.0, instance.getTotal()); assertEquals(3.0, instance.get("a")); assertEquals(1.0, instance.get("b")); assertEquals(0.0, instance.get("c")); assertEquals(2, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); assertTrue(instance.getDomain().contains("b")); instance.increment("c", 7); assertEquals(11.0, instance.getTotal()); assertEquals(3.0, instance.get("a")); assertEquals(1.0, instance.get("b")); assertEquals(7.0, instance.get("c")); assertEquals(3, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); assertTrue(instance.getDomain().contains("b")); assertTrue(instance.getDomain().contains("c")); instance.increment("d",-1.0); assertEquals( 0.0, instance.get("d" ) ); } /** * Test of remove method, of class gov.sandia.cognition.statistics.distribution.MapBasedDataHistogramTest. */ public void testRemove() { DefaultDataDistribution<String> instance = this.createInstanceEmpty(); assertEquals(0.0, instance.getTotal()); assertEquals(0.0, instance.get("a")); assertEquals(0.0, instance.get("b")); assertEquals(0.0, instance.get("c")); assertEquals(0, instance.getDomain().size()); instance.decrement("a"); instance.decrement("d", 7); assertEquals(0.0, instance.getTotal()); assertEquals(0.0, instance.get("a")); assertEquals(0.0, instance.get("b")); assertEquals(0.0, instance.get("c")); assertEquals(0, instance.getDomain().size()); instance.increment("a"); instance.increment("a"); instance.increment("b"); instance.increment("a"); instance.increment("c", 7); instance.increment("b"); assertEquals(12.0, instance.getTotal()); assertEquals(3.0, instance.get("a")); assertEquals(2.0, instance.get("b")); assertEquals(7.0, instance.get("c")); assertEquals(3, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); assertTrue(instance.getDomain().contains("b")); assertTrue(instance.getDomain().contains("c")); instance.decrement("b"); assertEquals(11.0, instance.getTotal()); assertEquals(3.0, instance.get("a")); assertEquals(1.0, instance.get("b")); assertEquals(7.0, instance.get("c")); assertEquals(3, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); assertTrue(instance.getDomain().contains("b")); assertTrue(instance.getDomain().contains("c")); instance.decrement("b"); assertEquals(10.0, instance.getTotal()); assertEquals(3.0, instance.get("a")); assertEquals(0.0, instance.get("b")); assertEquals(7.0, instance.get("c")); assertEquals(3, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); assertTrue(instance.getDomain().contains("b")); assertTrue(instance.getDomain().contains("c")); instance.decrement("b"); assertEquals(10.0, instance.getTotal()); assertEquals(3.0, instance.get("a")); assertEquals(0.0, instance.get("b")); assertEquals(7.0, instance.get("c")); assertEquals(3, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); assertTrue(instance.getDomain().contains("b")); assertTrue(instance.getDomain().contains("c")); instance.decrement("c", 4); assertEquals(6.0, instance.getTotal()); assertEquals(3.0, instance.get("a")); assertEquals(0.0, instance.get("b")); assertEquals(3.0, instance.get("c")); assertEquals(3, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); assertTrue(instance.getDomain().contains("b")); assertTrue(instance.getDomain().contains("c")); instance.decrement("a", 100); assertEquals(3.0, instance.getTotal()); assertEquals(0.0, instance.get("a")); assertEquals(0.0, instance.get("b")); assertEquals(3.0, instance.get("c")); assertEquals(3, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); assertTrue(instance.getDomain().contains("b")); assertTrue(instance.getDomain().contains("c")); instance.compact(); assertEquals(1, instance.getDomain().size()); assertFalse(instance.getDomain().contains("a")); assertFalse(instance.getDomain().contains("b")); assertTrue(instance.getDomain().contains("c")); instance.decrement("d",-1.0); assertEquals( 1.0, instance.get("d") ); } /** * Test of getDomain method, of class gov.sandia.cognition.statistics.distribution.MapBasedDataHistogramTest. */ public void testGetDomain() { DefaultDataDistribution<String> instance = this.createInstanceEmpty(); assertTrue(instance.getDomain().isEmpty()); assertFalse(instance.getDomain().contains("a")); assertFalse(instance.getDomain().contains("b")); assertFalse(instance.getDomain().contains("c")); instance.increment("a"); assertEquals(1, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); assertFalse(instance.getDomain().contains("b")); assertFalse(instance.getDomain().contains("c")); instance.increment("a"); assertEquals(1, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); assertFalse(instance.getDomain().contains("b")); assertFalse(instance.getDomain().contains("c")); instance.increment("b"); assertEquals(2, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); assertTrue(instance.getDomain().contains("b")); assertFalse(instance.getDomain().contains("c")); instance.increment("c", 4); assertEquals(3, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); assertTrue(instance.getDomain().contains("b")); assertTrue(instance.getDomain().contains("c")); instance.decrement("a", 2); assertEquals(3, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); assertTrue(instance.getDomain().contains("b")); assertTrue(instance.getDomain().contains("c")); instance.decrement("c", 4); assertEquals(3, instance.getDomain().size()); instance.compact(); assertFalse(instance.getDomain().contains("a")); assertTrue(instance.getDomain().contains("b")); assertFalse(instance.getDomain().contains("c")); instance.decrement("b", 1); assertEquals(1, instance.getDomain().size()); assertFalse(instance.getDomain().contains("a")); assertTrue(instance.getDomain().contains("b")); assertFalse(instance.getDomain().contains("c")); instance.compact(); assertFalse(instance.getDomain().contains("a")); assertFalse(instance.getDomain().contains("b")); assertFalse(instance.getDomain().contains("c")); } /** * Test of get method, of class gov.sandia.cognition.statistics.distribution.MapBasedDataHistogramTest. */ public void testget() { DefaultDataDistribution<String> instance = this.createInstanceEmpty(); assertEquals(0.0, instance.get("a")); assertEquals(0.0, instance.get("b")); assertEquals(0.0, instance.get("c")); assertEquals(0.0, instance.get("d")); instance.increment("a"); assertEquals(1.0, instance.get("a")); instance.increment("a"); assertEquals(2.0, instance.get("a")); instance.increment("b"); assertEquals(2.0, instance.get("a")); assertEquals(1.0, instance.get("b")); instance.increment("c", 4); assertEquals(2.0, instance.get("a")); assertEquals(1.0, instance.get("b")); assertEquals(4.0, instance.get("c")); instance.increment("a", 2); assertEquals(4.0, instance.get("a")); assertEquals(1.0, instance.get("b")); assertEquals(4.0, instance.get("c")); instance.decrement("a"); assertEquals(3.0, instance.get("a")); assertEquals(1.0, instance.get("b")); assertEquals(4.0, instance.get("c")); instance.decrement("c", 3); assertEquals(3.0, instance.get("a")); assertEquals(1.0, instance.get("b")); assertEquals(1.0, instance.get("c")); instance.decrement("b", 1); assertEquals(3.0, instance.get("a")); assertEquals(0.0, instance.get("b")); assertEquals(1.0, instance.get("c")); instance.increment("d"); assertEquals(3.0, instance.get("a")); assertEquals(0.0, instance.get("b")); assertEquals(1.0, instance.get("c")); assertEquals(1.0, instance.get("d")); } /** * Test of getFraction method, of class gov.sandia.cognition.statistics.distribution.MapBasedDataHistogramTest. */ public void testGetFraction() { DefaultDataDistribution<String> instance = this.createInstanceEmpty(); assertEquals(0.0, instance.getFraction("a")); assertEquals(0.0, instance.getFraction("b")); assertEquals(0.0, instance.getFraction("c")); assertEquals(0.0, instance.getFraction("d")); instance.increment("a"); assertEquals(1 / 1.0, instance.getFraction("a")); instance.increment("a"); assertEquals(2 / 2.0, instance.getFraction("a")); instance.increment("b"); assertEquals(2 / 3.0, instance.getFraction("a")); assertEquals(1 / 3.0, instance.getFraction("b")); instance.increment("c", 4); assertEquals(2 / 7.0, instance.getFraction("a")); assertEquals(1 / 7.0, instance.getFraction("b")); assertEquals(4 / 7.0, instance.getFraction("c")); instance.increment("a", 2); assertEquals(4 / 9.0, instance.getFraction("a")); assertEquals(1 / 9.0, instance.getFraction("b")); assertEquals(4 / 9.0, instance.getFraction("c")); instance.decrement("a"); assertEquals(3 / 8.0, instance.getFraction("a")); assertEquals(1 / 8.0, instance.getFraction("b")); assertEquals(4 / 8.0, instance.getFraction("c")); instance.decrement("c", 3); assertEquals(3 / 5.0, instance.getFraction("a")); assertEquals(1 / 5.0, instance.getFraction("b")); assertEquals(1 / 5.0, instance.getFraction("c")); instance.decrement("b", 1); assertEquals(3 / 4.0, instance.getFraction("a")); assertEquals(0 / 4.0, instance.getFraction("b")); assertEquals(1 / 4.0, instance.getFraction("c")); instance.increment("d"); assertEquals(3 / 5.0, instance.getFraction("a")); assertEquals(0 / 5.0, instance.getFraction("b")); assertEquals(1 / 5.0, instance.getFraction("c")); assertEquals(1 / 5.0, instance.getFraction("d")); } /** * Test of getEntropy method, of class gov.sandia.cognition.statistics.distribution.MapBasedDataHistogramTest. */ public void testGetEntropy() { DataDistribution.PMF<String> instance = (DataDistribution.PMF<String>) this.createInstanceEmpty(); assertEquals(0.0, instance.getEntropy()); instance.increment("a"); assertEquals(0.0, instance.getEntropy()); instance.increment("a"); assertEquals(0.0, instance.getEntropy()); instance.increment("b"); assertEquals(0.9183, instance.getEntropy(), 0.0001); instance.increment("c"); assertEquals(1.5000, instance.getEntropy(), 0.0001); instance.increment("c", 4); assertEquals(1.2988, instance.getEntropy(), 0.0001); instance.increment("d", 1); assertEquals(1.6577, instance.getEntropy(), 0.0001); } /** * Test of evaluate method, of class gov.sandia.cognition.statistics.distribution.MapBasedDataHistogramTest. */ public void testEvaluate() { DataDistribution.PMF<String> instance = (DataDistribution.PMF<String>) this.createInstanceEmpty(); assertEquals(0.0, instance.evaluate("a")); assertEquals(0.0, instance.evaluate("b")); assertEquals(0.0, instance.evaluate("c")); assertEquals(0.0, instance.evaluate("d")); instance.increment("a"); assertEquals(1 / 1.0, instance.evaluate("a")); instance.increment("a"); assertEquals(2 / 2.0, instance.evaluate("a")); instance.increment("b"); assertEquals(2 / 3.0, instance.evaluate("a")); assertEquals(1 / 3.0, instance.evaluate("b")); instance.increment("c", 4); assertEquals(2 / 7.0, instance.evaluate("a")); assertEquals(1 / 7.0, instance.evaluate("b")); assertEquals(4 / 7.0, instance.evaluate("c")); instance.increment("a", 2); assertEquals(4 / 9.0, instance.evaluate("a")); assertEquals(1 / 9.0, instance.evaluate("b")); assertEquals(4 / 9.0, instance.evaluate("c")); instance.decrement("a"); assertEquals(3 / 8.0, instance.evaluate("a")); assertEquals(1 / 8.0, instance.evaluate("b")); assertEquals(4 / 8.0, instance.evaluate("c")); instance.decrement("c", 3); assertEquals(3 / 5.0, instance.evaluate("a")); assertEquals(1 / 5.0, instance.evaluate("b")); assertEquals(1 / 5.0, instance.evaluate("c")); instance.decrement("b", 1); assertEquals(3 / 4.0, instance.evaluate("a")); assertEquals(0 / 4.0, instance.evaluate("b")); assertEquals(1 / 4.0, instance.evaluate("c")); instance.increment("d"); assertEquals(3 / 5.0, instance.evaluate("a")); assertEquals(0 / 5.0, instance.evaluate("b")); assertEquals(1 / 5.0, instance.evaluate("c")); assertEquals(1 / 5.0, instance.evaluate("d")); } /** * Test of getMaximumCount method, of class gov.sandia.cognition.statistics.distribution.MapBasedDataHistogramTest. */ public void testGetMaximumCount() { DefaultDataDistribution<String> instance = this.createInstanceEmpty(); assertEquals(0.0, instance.getMaxValue()); instance.increment("a"); assertEquals(1.0, instance.getMaxValue()); instance.increment("b"); assertEquals(1.0, instance.getMaxValue()); instance.increment("b"); assertEquals(2.0, instance.getMaxValue()); instance.increment("c", 7); assertEquals(7.0, instance.getMaxValue()); } /** * Test of getMaximumValue method, of class gov.sandia.cognition.statistics.distribution.MapBasedDataHistogramTest. */ public void testGetMaximumValue() { DefaultDataDistribution<String> instance = this.createInstanceEmpty(); assertNull(instance.getMaxValueKey()); instance.increment("a"); assertEquals("a", instance.getMaxValueKey()); instance.increment("b"); assertTrue("a".equals(instance.getMaxValueKey())); // a should be the first value encountered. instance.increment("b"); assertEquals("b", instance.getMaxValueKey()); instance.increment("c", 7); assertEquals("c", instance.getMaxValueKey()); } /** * Test of getMaximumValues method, of class gov.sandia.cognition.statistics.distribution.MapBasedDataHistogramTest. */ public void testGetMaximumValues() { DefaultDataDistribution<String> instance = this.createInstanceEmpty(); assertTrue(instance.getMaxValueKeys().isEmpty()); instance.increment("a"); assertEquals(1, instance.getMaxValueKeys().size()); assertTrue(instance.getMaxValueKeys().contains("a")); instance.increment("b"); assertEquals(2, instance.getMaxValueKeys().size()); assertTrue(instance.getMaxValueKeys().contains("a")); assertTrue(instance.getMaxValueKeys().contains("b")); instance.increment("b"); assertEquals(1, instance.getMaxValueKeys().size()); assertTrue(instance.getMaxValueKeys().contains("b")); instance.increment("c", 7); assertEquals(1, instance.getMaxValueKeys().size()); assertTrue(instance.getMaxValueKeys().contains("c")); } /** * Test of getTotal method, of class gov.sandia.cognition.statistics.distribution.MapBasedDataHistogramTest. */ public void testgetTotal() { DefaultDataDistribution<String> instance = this.createInstanceEmpty(); assertEquals(0.0, instance.getTotal()); instance.increment("a"); assertEquals(1.0, instance.getTotal()); instance.increment("a"); assertEquals(2.0, instance.getTotal()); instance.increment("b"); assertEquals(3.0, instance.getTotal()); instance.increment("c", 4); assertEquals(7.0, instance.getTotal()); instance.increment("a", 2); assertEquals(9.0, instance.getTotal()); instance.decrement("a"); assertEquals(8.0, instance.getTotal()); instance.decrement("c", 3); assertEquals(5.0, instance.getTotal()); instance.decrement("b", 1); assertEquals(4.0, instance.getTotal()); instance.increment("d"); assertEquals(5.0, instance.getTotal()); } /** * Test of getMeanValue method, of class DefaultDataDistribution. */ public void testgetMeanValue() { DefaultDataDistribution<String> instance = this.createInstanceEmpty(); assertEquals(0.0, instance.getMeanValue(), TOLERANCE); instance.increment("a"); assertEquals(1.0, instance.getMeanValue(), TOLERANCE); instance.increment("a"); assertEquals(2.0, instance.getMeanValue(), TOLERANCE); instance.increment("b"); assertEquals(3.0 / 2.0, instance.getMeanValue(), TOLERANCE); instance.increment("c", 4); assertEquals(7.0 / 3.0, instance.getMeanValue(), TOLERANCE); instance.increment("a", 2); assertEquals(9.0 / 3.0, instance.getMeanValue(), TOLERANCE); instance.decrement("a"); assertEquals(8.0 / 3.0, instance.getMeanValue(), TOLERANCE); instance.decrement("c", 3); assertEquals(5.0 / 3.0, instance.getMeanValue(), TOLERANCE); instance.decrement("b", 1); assertEquals(4.0 / 3.0, instance.getMeanValue(), TOLERANCE); instance.compact(); assertEquals(4.0 / 2.0, instance.getMeanValue(), TOLERANCE); instance.increment("d"); assertEquals(5.0 / 3.0, instance.getMeanValue(), TOLERANCE); } /** * Test of toString method, of class DefaultDataDistribution. */ public void testToString() { DefaultDataDistribution<String> instance = this.createInstanceEmpty(); assertNotNull(instance.toString()); instance.increment("a"); instance.increment("a"); instance.increment("b"); instance.increment("c"); assertNotNull(instance.toString()); } /** * logEvaluate */ public void testLogEvaluate() { System.out.println( "logEvaluate" ); DataDistribution.PMF<String> pmf = (DataDistribution.PMF<String>) this.createInstancePopulated(); for( String s : pmf.getDomain() ) { double plog = pmf.logEvaluate(s); double p = pmf.evaluate(s); double phat = Math.exp(plog); assertEquals( p, phat, 1e-5 ); } } /** * Test of learn method, of class DefaultDataDistribution. */ public void testLearn() { DefaultDataDistribution.Estimator<String> learner = new DefaultDataDistribution.Estimator<String>(); ArrayList<String> data = new ArrayList<String>(); DefaultDataDistribution<String> instance = learner.learn(data); assertEquals(0.0, instance.getTotal()); assertEquals(0.0, instance.get("a")); assertEquals(0.0, instance.get("b")); assertEquals(0.0, instance.get("c")); assertEquals(0, instance.getDomain().size()); assertFalse(instance.getDomain().contains("a")); data.add("a"); instance = learner.learn(data); assertEquals(1.0, instance.getTotal()); assertEquals(1.0, instance.get("a")); assertEquals(0.0, instance.get("b")); assertEquals(0.0, instance.get("c")); assertEquals(1, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); data.add("a"); instance = learner.learn(data); assertEquals(2.0, instance.getTotal()); assertEquals(2.0, instance.get("a")); assertEquals(0.0, instance.get("b")); assertEquals(0.0, instance.get("c")); assertEquals(1, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); data.add("b"); instance = learner.learn(data); assertEquals(3.0, instance.getTotal()); assertEquals(2.0, instance.get("a")); assertEquals(1.0, instance.get("b")); assertEquals(0.0, instance.get("c")); assertEquals(2, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); assertTrue(instance.getDomain().contains("b")); data.add("a"); instance = learner.learn(data); assertEquals(4.0, instance.getTotal()); assertEquals(3.0, instance.get("a")); assertEquals(1.0, instance.get("b")); assertEquals(0.0, instance.get("c")); assertEquals(2, instance.getDomain().size()); assertTrue(instance.getDomain().contains("a")); assertTrue(instance.getDomain().contains("b")); } }