/* * File: WeightedEuclideanDistanceMetricTest.java * Authors: Justin Basilico * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright July 22, 2010, 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.learning.function.distance; import gov.sandia.cognition.math.Semimetric; import gov.sandia.cognition.math.matrix.Vector; import gov.sandia.cognition.math.matrix.VectorFactory; import gov.sandia.cognition.math.matrix.Vectorizable; import gov.sandia.cognition.math.matrix.mtj.Vector2; import gov.sandia.cognition.math.matrix.mtj.Vector3; /** * Unit tests for class WeightedEuclideanDistanceMetric. * * @author Justin Basilico * @since 3.1 */ public class WeightedEuclideanDistanceMetricTest extends SemimetricTestHarness<Vectorizable> { /** * Creates a new test. * * @param testName The test name. */ public WeightedEuclideanDistanceMetricTest( String testName) { super(testName); } /** * Test of constructors of class WeightedEuclideanDistanceMetric. */ public void testConstructors() { Vector weights = null; WeightedEuclideanDistanceMetric instance = new WeightedEuclideanDistanceMetric(); assertSame(weights, instance.getWeights()); weights = new Vector2(9.0, -3.2); instance = new WeightedEuclideanDistanceMetric(weights); assertSame(weights, instance.getWeights()); } /** * Test of clone method, of class WeightedEuclideanDistanceMetric. */ @Override public void testClone() { WeightedEuclideanDistanceMetric instance = new WeightedEuclideanDistanceMetric(new Vector2(1.0, -6.0)); WeightedEuclideanDistanceMetric result = instance.clone(); assertNotSame(instance, result); assertNotSame(result, instance.clone()); assertEquals(instance.getWeights(), result.getWeights()); assertNotSame(instance.getWeights(), result.getWeights()); } /** * Test of getInputDimensionality method, of class WeightedEuclideanDistanceMetric. */ public void testGetInputDimensionality() { WeightedEuclideanDistanceMetric instance = new WeightedEuclideanDistanceMetric(); assertEquals(-1, instance.getInputDimensionality()); instance.setWeights(new Vector2(1.0, -6.0)); assertEquals(2, instance.getInputDimensionality()); instance.setWeights(new Vector3(1.0, -6.0, 3.5)); assertEquals(3, instance.getInputDimensionality()); } /** * Test of getWeights method, of class WeightedEuclideanDistanceMetric. */ public void testGetWeights() { this.testSetWeights(); } /** * Test of setWeights method, of class WeightedEuclideanDistanceMetric. */ public void testSetWeights() { Vector weights = null; WeightedEuclideanDistanceMetric instance = new WeightedEuclideanDistanceMetric(); assertSame(weights, instance.getWeights()); weights = new Vector2(9.0, -3.2); instance.setWeights(weights); assertSame(weights, instance.getWeights()); weights = null; instance.setWeights(weights); assertSame(weights, instance.getWeights()); weights = new Vector3(9.0, 0.0, -3.2); instance.setWeights(weights); assertSame(weights, instance.getWeights()); } @Override public Semimetric<Vectorizable> createInstance() { return new WeightedEuclideanDistanceMetric( VectorFactory.getDefault().createUniformRandom( 10, 0.0, 1.0, RANDOM)); } @Override public Vectorizable generateRandomFirstType() { return VectorFactory.getDefault().createUniformRandom( 10, -10.0, 10.0, RANDOM); } @Override public void testKnownValues() { double epsilon = 0.0000001; WeightedEuclideanDistanceMetric metric = new WeightedEuclideanDistanceMetric(new Vector2(2.0, 0.5)); // Create four points to compute the distances between. Vector2 v00 = new Vector2(0.0, 0.0); Vector2 v01 = new Vector2(0.0, 1.0); Vector2 v10 = new Vector2(1.0, 0.0); Vector2 v11 = new Vector2(1.0, 1.0); // Make sure the distance to self is zero. assertEquals(0.0, metric.evaluate(v00, v00), 0.0); assertEquals(0.0, metric.evaluate(v01, v01), 0.0); assertEquals(0.0, metric.evaluate(v10, v10), 0.0); assertEquals(0.0, metric.evaluate(v11, v11), 0.0); // Make sure the distances between points are correct. assertEquals(Math.sqrt(0.5), metric.evaluate(v00, v01), epsilon); assertEquals(Math.sqrt(2.0), metric.evaluate(v00, v10), epsilon); assertEquals(Math.sqrt(0.5), metric.evaluate(v01, v00), epsilon); assertEquals(Math.sqrt(2.0), metric.evaluate(v01, v11), epsilon); assertEquals(Math.sqrt(2.5), metric.evaluate(v00, v11), epsilon); // Make sure that it works with negative points. assertEquals(Math.sqrt(0.5), metric.evaluate(v00, v01.scale(-1.0))); assertEquals(Math.sqrt(2.0), metric.evaluate(v00, v10.scale(-1.0))); assertEquals(Math.sqrt(2.5), metric.evaluate(v00, v11.scale(-1.0))); } }