/*
* File: NumericalDifferentiatorMatrixJacobianTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright Jul 1, 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.math.matrix;
import gov.sandia.cognition.math.DifferentiableEvaluator;
import gov.sandia.cognition.math.matrix.mtj.Vector3;
import gov.sandia.cognition.util.AbstractCloneableSerializable;
import java.util.Random;
/**
*
* @author Kevin R. Dixon
* @since 2.1
*/
public class NumericalDifferentiatorMatrixJacobianTest
extends NumericalDifferentiatorTestHarness<Vector,Vector,Matrix>
{
public static class InternalFunction
extends AbstractCloneableSerializable
implements DifferentiableEvaluator<Vector,Vector,Matrix>
{
private static final double scaleFactor = 10.0;
public Matrix differentiate( Vector input )
{
int M = input.getDimensionality();
return MatrixFactory.getDefault().createIdentity( M, M ).scale( scaleFactor );
}
public Vector evaluate( Vector input )
{
return input.scale( scaleFactor );
}
}
public class InternalFunctionMM
extends AbstractCloneableSerializable
implements DifferentiableEvaluator<Vector,Vector,Matrix>
{
Matrix A;
public InternalFunctionMM(
int numInputs,
int numOutputs )
{
this.A = MatrixFactory.getDefault().createUniformRandom(
numOutputs, numInputs, -2.0, 2.0, random );
}
public Matrix differentiate( Vector input )
{
return this.A;
}
public Vector evaluate( Vector input )
{
return this.A.times( input );
}
}
/**
* Creates a new instance of NumericalDifferentiatorVectorJacobianTest
*/
public NumericalDifferentiatorMatrixJacobianTest(
String testName)
{
super(testName);
}
@Override
public void testConstructors()
{
System.out.println( "Constuctors" );
NumericalDifferentiator<?,?,?> f = new NumericalDifferentiator.MatrixJacobian();
assertNotNull( f );
assertNull( f.getInternalFunction() );
assertEquals( NumericalDifferentiator.DEFAULT_DELTA, f.getDelta() );
}
@Override
public NumericalDifferentiator.MatrixJacobian createInstance()
{
return new NumericalDifferentiator.MatrixJacobian(
new InternalFunction() );
}
@Override
public Vector createRandomInput()
{
return Vector3.createRandom(random);
}
@Override
public void assertDerivativeEquals( Matrix target, Matrix estimate )
{
if( !target.equals( estimate, TOLERANCE ) )
{
assertEquals( target, estimate );
}
}
public void testStaticDifferentiate()
{
System.out.println( "Static differentiate" );
NumericalDifferentiator.MatrixJacobian f = this.createInstance();
Vector input = this.createRandomInput();
Matrix sr = NumericalDifferentiator.MatrixJacobian.differentiate(
input, f.getInternalFunction() );
assertEquals( sr, f.differentiate(input) );
}
public void testStaticDifferentiate2()
{
System.out.println( "Static differentiate2" );
InternalFunctionMM f = new InternalFunctionMM(3, 2);
Vector input = this.createRandomInput();
Matrix sr = NumericalDifferentiator.MatrixJacobian.differentiate(
input, f );
Matrix actual = f.differentiate(input);
if( !actual.equals( sr, TOLERANCE ) )
{
assertEquals( actual, sr );
}
}
}