/* * File: ParallelizedCostFunctionContainerTest.java * Authors: Kevin R. Dixon * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright Sep 22, 2008, 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.cost; import gov.sandia.cognition.algorithm.ParallelUtil; import gov.sandia.cognition.learning.data.DefaultInputOutputPair; import gov.sandia.cognition.learning.data.DefaultTargetEstimatePair; import gov.sandia.cognition.learning.data.InputOutputPair; import gov.sandia.cognition.learning.data.TargetEstimatePair; import gov.sandia.cognition.learning.function.vector.LinearVectorFunction; import gov.sandia.cognition.learning.function.vector.MultivariateDiscriminant; import gov.sandia.cognition.math.matrix.MatrixFactory; import gov.sandia.cognition.math.matrix.Vector; import gov.sandia.cognition.math.matrix.VectorFactory; import java.util.ArrayList; import java.util.Random; import junit.framework.TestCase; /** * JUnit tests for class ParallelizedCostFunctionContainerTest * @author Kevin R. Dixon */ public class ParallelizedCostFunctionContainerTest extends TestCase { /** * Entry point for JUnit tests for class ParallelizedCostFunctionContainerTest * @param testName name of this test */ public ParallelizedCostFunctionContainerTest( String testName) { super(testName); } /** * Random */ public Random RANDOM = new Random( 0 ); /** * Test of getCostFunction method, of class ParallelizedCostFunctionContainer. */ public void testGetCostFunction() { System.out.println( "getCostFunction" ); ParallelizedCostFunctionContainer instance = new ParallelizedCostFunctionContainer(); assertNull( instance.getCostFunction() ); SumSquaredErrorCostFunction costFunction = new SumSquaredErrorCostFunction(); instance.setCostFunction( costFunction ); assertSame( costFunction, instance.getCostFunction() ); instance = new ParallelizedCostFunctionContainer( costFunction ); assertSame( costFunction, instance.getCostFunction() ); } /** * Test of setCostFunction method, of class ParallelizedCostFunctionContainer. */ public void testSetCostFunction() { System.out.println( "setCostFunction" ); ParallelizedCostFunctionContainer instance = new ParallelizedCostFunctionContainer(); assertNull( instance.getCostFunction() ); SumSquaredErrorCostFunction costFunction = new SumSquaredErrorCostFunction(); instance.setCostFunction( costFunction ); assertSame( costFunction, instance.getCostFunction() ); } /** * Test of createPartitions method, of class ParallelizedCostFunctionContainer. */ public void testCreatePartitions() { System.out.println( "createPartitions" ); ParallelizedCostFunctionContainer instance = new ParallelizedCostFunctionContainer(); try { instance.createPartitions(); fail( "Should have thrown null-pointer exception since we have not set the cost function!" ); } catch (Exception e) { System.out.println( "Good: " + e ); } } /** * Test of createThreadPool method, of class ParallelizedCostFunctionContainer. */ public void testCreateThreadPool() { System.out.println( "createThreadPool" ); ParallelizedCostFunctionContainer instance = new ParallelizedCostFunctionContainer(); instance.createThreadPool(); } /** * Test of clone method, of class ParallelizedCostFunctionContainer. */ public void testClone() { System.out.println( "clone" ); ParallelizedCostFunctionContainer instance = new ParallelizedCostFunctionContainer(); instance.setCostFunction( new SumSquaredErrorCostFunction() ); ParallelizedCostFunctionContainer clone = instance.clone(); assertNotNull( clone ); assertNotSame( instance, clone ); assertNotSame( instance.getCostFunction(), clone.getCostFunction() ); assertNotSame( instance.getThreadPool(), clone.getThreadPool() ); assertEquals( instance.getNumThreads(), clone.getNumThreads() ); } /** * Test of evaluate method, of class ParallelizedCostFunctionContainer. */ public void testEvaluate() { System.out.println( "evaluate" ); int num = 100; int dim = 3; double r = 1.0; MultivariateDiscriminant f = new MultivariateDiscriminant( MatrixFactory.getDefault().createUniformRandom( dim, dim, -r, r, RANDOM ) ); new LinearVectorFunction( RANDOM.nextDouble() ); ArrayList<InputOutputPair<Vector,Vector>> data = new ArrayList<InputOutputPair<Vector, Vector>>( num ); for( int n = 0; n < num; n++ ) { data.add( new DefaultInputOutputPair<Vector, Vector>( VectorFactory.getDefault().createUniformRandom( dim, -r, r, RANDOM ), VectorFactory.getDefault().createUniformRandom( dim, -r, r, RANDOM ) ) ); } ParallelizedCostFunctionContainer instance = new ParallelizedCostFunctionContainer(); SumSquaredErrorCostFunction costFunction = new SumSquaredErrorCostFunction(); instance.setCostFunction( costFunction ); instance.setThreadPool( ParallelUtil.createThreadPool( 10 ) ); instance.setCostParameters( data ); Double result = instance.evaluate( f ); costFunction.setCostParameters( data ); assertEquals( costFunction.evaluate( f ), result, 1e-5 ); } /** * Test of evaluatePerformance method, of class ParallelizedCostFunctionContainer. */ public void testEvaluatePerformance() { System.out.println( "evaluatePerformance" ); ParallelizedCostFunctionContainer instance = new ParallelizedCostFunctionContainer(); instance.setCostFunction( new SumSquaredErrorCostFunction() ); int dim = 3; double r = 1.0; int num = 10; ArrayList<TargetEstimatePair<Vector,Vector>> data = new ArrayList<TargetEstimatePair<Vector, Vector>>( num ); for( int n = 0; n < num; n++ ) { data.add(new DefaultTargetEstimatePair<Vector, Vector>( VectorFactory.getDefault().createUniformRandom( dim, -r, r, RANDOM ), VectorFactory.getDefault().createUniformRandom( dim, -r, r, RANDOM ) ) ); } Double result = instance.evaluatePerformance( data ); assertEquals( instance.getCostFunction().evaluatePerformance( data ), result ); } /** * Test of computeParameterGradient method, of class ParallelizedCostFunctionContainer. */ public void testComputeParameterGradient() { System.out.println( "computeParameterGradient" ); int num = 100; int dim = 3; double r = 1.0; MultivariateDiscriminant f = new MultivariateDiscriminant( MatrixFactory.getDefault().createUniformRandom( dim, dim, -r, r, RANDOM ) ); new LinearVectorFunction( RANDOM.nextDouble() ); ArrayList<InputOutputPair<Vector,Vector>> data = new ArrayList<InputOutputPair<Vector, Vector>>( num ); for( int n = 0; n < num; n++ ) { data.add( new DefaultInputOutputPair<Vector, Vector>( VectorFactory.getDefault().createUniformRandom( dim, -r, r, RANDOM ), VectorFactory.getDefault().createUniformRandom( dim, -r, r, RANDOM ) ) ); } ParallelizedCostFunctionContainer instance = new ParallelizedCostFunctionContainer(); SumSquaredErrorCostFunction costFunction = new SumSquaredErrorCostFunction(); instance.setCostFunction( costFunction ); instance.setCostParameters( data ); instance.setThreadPool( ParallelUtil.createThreadPool( 1 )); Vector result = instance.computeParameterGradient( f ); instance.getCostFunction().setCostParameters( data ); Vector expected = instance.getCostFunction().computeParameterGradient( f ); if( !result.equals( expected, 1e-5 ) ) { assertEquals( expected, result ); } } }