/*
* File: MatrixVectorMultiplyFunctionTest.java
* Authors: Justin Basilico
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright October 5, 2006, 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.vector;
import gov.sandia.cognition.annotation.CodeReview;
import gov.sandia.cognition.learning.algorithm.gradient.GradientDescendableTestHarness;
import gov.sandia.cognition.math.matrix.VectorFactory;
import gov.sandia.cognition.math.matrix.Matrix;
import gov.sandia.cognition.math.matrix.MatrixFactory;
import gov.sandia.cognition.math.matrix.Vector;
import java.util.Random;
import junit.framework.TestCase;
/**
* This class implements JUnit tests for the following classes:
*
* MatrixVectorMultiplyFunction
*
* @author Kevin R. Dixon
* @since 1.0
*/
@CodeReview(
reviewer="Justin Basilico",
date="2006-10-06",
changesNeeded=false,
comments="Test class looks fine."
)
public class MultivariateDiscriminantTest
extends TestCase
{
/** The random number generator for the tests. */
public Random random = new Random(1);
/**
* Creates a new instance of MatrixVectorMultiplyFunctionTest.
*
* @param testName The test name.
*/
public MultivariateDiscriminantTest(
String testName)
{
super(testName);
}
public MultivariateDiscriminant createRandom()
{
double A = 1.0;
int M = random.nextInt( 10 ) + 1;
int N = random.nextInt( 10 ) + 1;
Matrix m = MatrixFactory.getDefault().createUniformRandom(M, N, -A, A, random);
return new MultivariateDiscriminant( m );
}
/**
* Tests the constructors of class MultivariateDiscriminantWithBiasTest.
*/
public void testConstructors()
{
System.out.println( "Constructors" );
MultivariateDiscriminant instance =
new MultivariateDiscriminant();
assertEquals( 1, instance.getInputDimensionality() );
assertEquals( 1, instance.getOutputDimensionality() );
assertEquals( 1, instance.getDiscriminant().getNumColumns() );
assertEquals( 1, instance.getDiscriminant().getNumRows() );
assertEquals( 1.0, instance.getDiscriminant().getElement(0,0) );
int M = random.nextInt(10)+1;
int N = random.nextInt(10)+1;
instance = new MultivariateDiscriminant( N, M );
assertEquals( N, instance.getInputDimensionality() );
assertEquals( M, instance.getOutputDimensionality() );
assertEquals( N, instance.getDiscriminant().getNumColumns() );
assertEquals( M, instance.getDiscriminant().getNumRows() );
assertEquals( MatrixFactory.getDefault().createIdentity(M, N),
instance.getDiscriminant() );
}
/**
* Test of clone method, of class MatrixVectorMultiplyFunction.
*/
public void testClone()
{
System.out.println("clone");
MultivariateDiscriminant instance = this.createRandom();
MultivariateDiscriminant clone = instance.clone();
assertNotSame( instance.getDiscriminant(), clone.getDiscriminant() );
assertEquals( instance.convertToVector(), clone.convertToVector() );
clone.getDiscriminant().setElement(0,0, random.nextGaussian() );
assertFalse( instance.convertToVector().equals( clone.convertToVector() ) );
}
/**
* Test of getDiscriminant method, of class MatrixVectorMultiplyFunction.
*/
public void testGetInternalMatrix()
{
System.out.println("getInternalMatrix");
Matrix internalMatrix = MatrixFactory.getDefault().createUniformRandom( 10, 15, -100, 100, random );
MultivariateDiscriminant instance =
new MultivariateDiscriminant( internalMatrix );
assertEquals( instance.getDiscriminant(), internalMatrix );
}
/**
* Test of setDiscriminant method, of class MatrixVectorMultiplyFunction.
*/
public void testSetInternalMatrix()
{
System.out.println("setInternalMatrix");
int M = 10;
int N = 15;
Matrix internalMatrix = MatrixFactory.getDefault().createUniformRandom( M, N, -100, 100, random );
MultivariateDiscriminant instance =
new MultivariateDiscriminant( internalMatrix );
assertEquals( instance.getDiscriminant(), internalMatrix );
Matrix r1 = MatrixFactory.getDefault().createMatrix( M, N );
instance.setDiscriminant( r1 );
assertFalse( instance.getDiscriminant().equals( internalMatrix ) );
}
/**
* Test of convertToVector method, of class MatrixVectorMultiplyFunction.
*/
public void testConvertToVector()
{
System.out.println("convertToVector");
MultivariateDiscriminant instance = this.createRandom();
int M = instance.getOutputDimensionality();
int N = instance.getInputDimensionality();
Vector p = instance.convertToVector();
assertEquals( M*N, p.getDimensionality() );
assertEquals( instance.getDiscriminant().convertToVector(), p );
}
/**
* Test of convertFromVector method, of class MatrixVectorMultiplyFunction.
*/
public void testConvertFromVector()
{
System.out.println("convertFromVector");
MultivariateDiscriminant instance = this.createRandom();
Vector p = instance.convertToVector();
instance.convertFromVector(p);
p.scaleEquals( random.nextGaussian() );
instance.convertFromVector(p);
assertEquals( p, instance.convertToVector() );
}
/**
* Test of evaluate method, of class MatrixVectorMultiplyFunction.
*/
public void testEvaluate()
{
System.out.println("evaluate");
int M = 10;
int N = 15;
MultivariateDiscriminant instance = this.createRandom();
Matrix internalMatrix = instance.getDiscriminant();
Vector input = VectorFactory.getDefault().createUniformRandom(
instance.getInputDimensionality(), -100, 100, random );
Vector expected = internalMatrix.times( input );
assertEquals( expected, instance.evaluate( input ) );
}
/**
* Test of differentiate method, of class MatrixVectorMultiplyFunction.
*/
public void testDifferentiate()
{
System.out.println("differentiate");
MultivariateDiscriminant instance = this.createRandom();
Matrix internalMatrix = instance.getDiscriminant();
Vector input = VectorFactory.getDefault().createUniformRandom(
instance.getInputDimensionality(), -100, 100, random );
assertEquals( internalMatrix, instance.differentiate( input ) );
for( int i = 0; i < 10; i++ )
{
instance = this.createRandom();
input = VectorFactory.getDefault().createUniformRandom(
instance.getInputDimensionality(), -100, 100, random );
GradientDescendableTestHarness.testDifferentiate( instance, input, random );
}
}
/**
* Test of computeParameterGradient method, of class gov.sandia.isrc.learning.util.function.MatrixVectorMultiplyFunction.
*/
public void testComputeParameterGradient()
{
System.out.println("computeParameterGradient");
for( int i = 0; i < 10; i++ )
{
MultivariateDiscriminant i1 = this.createRandom();
Vector x1 = VectorFactory.getDefault().createUniformRandom(
i1.getInputDimensionality(), -100, 100, random );
GradientDescendableTestHarness.testGradient( i1, x1 );
}
}
public void testInputDimensionality()
{
System.out.println( "getInputDimensionality" );
MultivariateDiscriminant f = this.createRandom();
assertEquals( f.getDiscriminant().getNumRows(), f.getOutputDimensionality() );
assertEquals( f.getDiscriminant().getNumColumns(), f.getInputDimensionality() );
final double r = 10.0;
Vector x1 = VectorFactory.getDefault().createUniformRandom(
f.getInputDimensionality(), -r, r, random);
Vector y1 = f.evaluate(x1);
assertEquals( x1.getDimensionality(), f.getInputDimensionality() );
assertEquals( y1.getDimensionality(), f.getOutputDimensionality() );
}
}