/* * File: DirectionalVectorToScalarFunctionTest.java * Authors: Kevin R. Dixon * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright October 24, 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.learning.algorithm.minimization.line; import gov.sandia.cognition.math.matrix.Vector; import gov.sandia.cognition.evaluator.Evaluator; import gov.sandia.cognition.math.DifferentiableEvaluator; import gov.sandia.cognition.math.matrix.NumericalDifferentiator; import gov.sandia.cognition.math.matrix.mtj.Vector3; import gov.sandia.cognition.util.AbstractCloneableSerializable; import java.util.Random; import junit.framework.TestCase; /** * * @author Kevin R. Dixon */ public class DirectionalVectorToScalarFunctionTest extends TestCase { /** The random number generator for the tests. */ public final Random random = new Random(1); public final double TOLERANCE = 1e-5; public DirectionalVectorToScalarFunctionTest(String testName) { super(testName); } public Vector3 createRandomInput() { return Vector3.createRandom(random); } public class TestVectorScalarFunction extends AbstractCloneableSerializable implements DifferentiableEvaluator<Vector,Double,Vector> { private Vector other = createRandomInput(); public Double evaluate( Vector input) { return input.dotProduct( this.other ); } public Vector differentiate( Vector input) { return other; } } public DirectionalVectorToScalarFunction createInstance() { Vector point = this.createRandomInput(); Vector direction = this.createRandomInput(); return new DirectionalVectorToScalarFunction( new TestVectorScalarFunction(), point, direction ); } public void testConstructors() { System.out.println( "Constructors" ); DirectionalVectorToScalarFunction f = this.createInstance(); assertNotNull( f ); assertNotNull( f.getDirection() ); assertNotNull( f.getVectorOffset() ); assertNotNull( f.getVectorScalarFunction() ); DirectionalVectorToScalarFunction f2 = new DirectionalVectorToScalarFunction( f ); assertNotNull( f2 ); assertNotSame( f, f2 ); assertNotSame( f.getDirection(), f2.getDirection() ); assertEquals( f.getDirection(), f2.getDirection() ); assertNotSame( f.getVectorOffset(), f2.getVectorOffset() ); assertEquals( f.getVectorOffset(), f2.getVectorOffset() ); assertNotSame( f.getVectorScalarFunction(), f2.getVectorScalarFunction() ); } public void testClone() { System.out.println( "Clone" ); DirectionalVectorToScalarFunction f = this.createInstance(); DirectionalVectorToScalarFunction f2 = f.clone(); assertNotNull( f ); assertNotSame( f, f2 ); assertNotSame( f.getDirection(), f2.getDirection() ); assertEquals( f.getDirection(), f2.getDirection() ); assertNotSame( f.getVectorOffset(), f2.getVectorOffset() ); assertEquals( f.getVectorOffset(), f2.getVectorOffset() ); assertNotSame( f.getVectorScalarFunction(), f2.getVectorScalarFunction() ); } /** * Test of getDirection method, of class gov.sandia.cognition.learning.linesearch.DirectionalVectorToScalarFunction. */ public void testGetDirection() { System.out.println("getDirection"); DirectionalVectorToScalarFunction instance = this.createInstance(); assertNotNull( instance.getDirection() ); } /** * Test of setDirection method, of class gov.sandia.cognition.learning.linesearch.DirectionalVectorToScalarFunction. */ public void testSetDirection() { System.out.println("setDirection"); DirectionalVectorToScalarFunction instance = this.createInstance(); Vector d2 = instance.getDirection().scale( random.nextGaussian() ); instance.setDirection( d2 ); assertSame( d2, instance.getDirection() ); } /** * Test of getVectorOffset method, of class gov.sandia.cognition.learning.linesearch.DirectionalVectorToScalarFunction. */ public void testGetVectorOffset() { System.out.println("getVectorOffset"); DirectionalVectorToScalarFunction instance = this.createInstance(); assertNotNull( instance.getVectorOffset() ); } /** * Test of setVectorOffset method, of class gov.sandia.cognition.learning.linesearch.DirectionalVectorToScalarFunction. */ public void testSetVectorOffset() { System.out.println("setVectorOffset"); DirectionalVectorToScalarFunction instance = this.createInstance(); Vector d2 = instance.getVectorOffset().scale( random.nextGaussian() ); instance.setVectorOffset( d2 ); assertSame( d2, instance.getVectorOffset() ); } /** * Test of computeVector method, of class gov.sandia.cognition.learning.linesearch.DirectionalVectorToScalarFunction. */ public void testComputeVector() { System.out.println("computeVector"); double scaleFactor = random.nextGaussian(); DirectionalVectorToScalarFunction instance = this.createInstance(); Vector delta = instance.getVectorOffset().plus( instance.getDirection().scale( scaleFactor ) ); Vector result = instance.computeVector( scaleFactor ); if( !delta.equals( result, TOLERANCE ) ) { assertEquals( delta, result ); } } /** * Test of evaluate method, of class gov.sandia.cognition.learning.linesearch.DirectionalVectorToScalarFunction. */ public void testEvaluate() { System.out.println("evaluate"); Double scaleFactor = random.nextGaussian(); DirectionalVectorToScalarFunction instance = this.createInstance(); Double expResult = instance.getVectorScalarFunction().evaluate( instance.computeVector( scaleFactor ) ); Double result = instance.evaluate(scaleFactor); assertEquals(expResult, result, TOLERANCE ); } /** * Test of getVectorScalarFunction method, of class gov.sandia.cognition.learning.linesearch.DirectionalVectorToScalarFunction. */ public void testGetVectorScalarFunction() { System.out.println("getVectorScalarFunction"); DirectionalVectorToScalarFunction instance = this.createInstance(); assertNotNull( instance.getVectorScalarFunction() ); } /** * Test of setVectorScalarFunction method, of class gov.sandia.cognition.learning.linesearch.DirectionalVectorToScalarFunction. */ public void testSetVectorScalarFunction() { System.out.println("setVectorScalarFunction"); DirectionalVectorToScalarFunction instance = this.createInstance(); Evaluator<? super Vector, ? extends Double> vectorScalarFunction = instance.getVectorScalarFunction(); instance.setVectorScalarFunction( null ); assertNull( instance.getVectorScalarFunction() ); instance.setVectorScalarFunction( vectorScalarFunction ); assertSame( vectorScalarFunction, instance.getVectorScalarFunction() ); } public void testDifferentiate() { System.out.println( "Differentiate" ); DirectionalVectorToScalarFunction instance = this.createInstance(); double input = random.nextGaussian(); double result = instance.differentiate( input ); double estimate = NumericalDifferentiator.DoubleJacobian.differentiate( input, instance, DirectionalVectorToScalarFunction.FORWARD_DIFFERENCE ); assertEquals( result, estimate, TOLERANCE ); } }