/*
* File: AbstractSingularValueDecompositionTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright May 17, 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.math.matrix.decomposition;
import gov.sandia.cognition.math.matrix.mtj.DenseMatrix;
import gov.sandia.cognition.math.matrix.mtj.DenseMatrixFactoryMTJ;
import gov.sandia.cognition.math.matrix.mtj.decomposition.SingularValueDecompositionMTJ;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
* This class implements JUnit tests for the following classes:
*
* AbstractSingularValueDecomposition
*
* @author Kevin R. Dixon
* @since 1.0
*/
public class AbstractSingularValueDecompositionTest extends TestCase
{
/**
*
* @param testName
*/
public AbstractSingularValueDecompositionTest(
String testName)
{
super(testName);
}
/**
* Returns the test.
* @return
*/
public static Test suite()
{
TestSuite suite = new TestSuite(AbstractSingularValueDecompositionTest.class);
return suite;
}
/**
* Test of norm2 method, of class
* gov.sandia.isrc.math.matrix.AbstractSingularValueDecomposition.
*/
public void testNorm2()
{
System.out.println("norm2");
DenseMatrix m2 = DenseMatrixFactoryMTJ.INSTANCE.createMatrix(3, 4);
m2.setElement(0, 0, 1.0);
m2.setElement(0, 1, 2.0);
m2.setElement(0, 2, 3.0);
m2.setElement(0, 3, 4.0);
m2.setElement(1, 0, 5.0);
m2.setElement(1, 1, 6.0);
m2.setElement(1, 2, -1.0);
m2.setElement(1, 3, -2.0);
m2.setElement(2, 0, -3.0);
m2.setElement(2, 1, -4.0);
m2.setElement(2, 2, -5.0);
m2.setElement(2, 3, -6.0);
AbstractSingularValueDecomposition instance =
SingularValueDecompositionMTJ.create(m2);
double e1 = 11.124;
assertEquals(e1, instance.norm2(), 0.001);
}
/**
* Test of conditionNumber method, of class
* gov.sandia.isrc.math.matrix.AbstractSingularValueDecomposition.
*/
public void testConditionNumber()
{
System.out.println("conditionNumber");
DenseMatrix m2 = DenseMatrixFactoryMTJ.INSTANCE.createMatrix(3, 4);
m2.setElement(0, 0, 1.0);
m2.setElement(0, 1, 2.0);
m2.setElement(0, 2, 3.0);
m2.setElement(0, 3, 4.0);
m2.setElement(1, 0, 5.0);
m2.setElement(1, 1, 6.0);
m2.setElement(1, 2, -1.0);
m2.setElement(1, 3, -2.0);
m2.setElement(2, 0, -3.0);
m2.setElement(2, 1, -4.0);
m2.setElement(2, 2, -5.0);
m2.setElement(2, 3, -6.0);
AbstractSingularValueDecomposition instance =
SingularValueDecompositionMTJ.create(m2);
double e1 = 32.099;
assertEquals(e1, instance.conditionNumber(), 0.001);
}
/**
* Test of rank method, of class
* gov.sandia.isrc.math.matrix.AbstractSingularValueDecomposition.
*/
public void testRank()
{
System.out.println("rank");
DenseMatrix m2 = DenseMatrixFactoryMTJ.INSTANCE.createMatrix(3, 4);
m2.setElement(0, 0, 1.0);
m2.setElement(0, 1, 2.0);
m2.setElement(0, 2, 3.0);
m2.setElement(0, 3, 4.0);
m2.setElement(1, 0, 5.0);
m2.setElement(1, 1, 6.0);
m2.setElement(1, 2, -1.0);
m2.setElement(1, 3, -2.0);
m2.setElement(2, 0, -3.0);
m2.setElement(2, 1, -4.0);
m2.setElement(2, 2, -5.0);
m2.setElement(2, 3, -6.0);
AbstractSingularValueDecomposition instance =
SingularValueDecompositionMTJ.create(m2);
assertEquals(3, instance.rank());
instance = SingularValueDecompositionMTJ.create(
DenseMatrixFactoryMTJ.INSTANCE.createMatrix(4, 6));
assertEquals(0, instance.rank());
}
/**
* Test of effectiveRank method, of class
* gov.sandia.isrc.math.matrix.AbstractSingularValueDecomposition.
*/
public void testEffectiveRank()
{
System.out.println("effectiveRank");
DenseMatrix m2 = DenseMatrixFactoryMTJ.INSTANCE.createMatrix(3, 4);
m2.setElement(0, 0, 1.0);
m2.setElement(0, 1, 2.0);
m2.setElement(0, 2, 3.0);
m2.setElement(0, 3, 4.0);
m2.setElement(1, 0, 5.0);
m2.setElement(1, 1, 6.0);
m2.setElement(1, 2, -1.0);
m2.setElement(1, 3, -2.0);
m2.setElement(2, 0, -3.0);
m2.setElement(2, 1, -4.0);
m2.setElement(2, 2, -5.0);
m2.setElement(2, 3, -6.0);
AbstractSingularValueDecomposition instance =
SingularValueDecompositionMTJ.create(m2);
assertEquals(3, instance.effectiveRank(0.0));
assertEquals(2, instance.effectiveRank(0.5));
assertEquals(2, instance.effectiveRank(1.0));
assertEquals(1, instance.effectiveRank(10.0));
assertEquals(0, instance.effectiveRank(100.0));
}
/**
* Test of pseudoInverse method, of class
* gov.sandia.isrc.math.matrix.AbstractSingularValueDecomposition.
*/
public void testPseudoInverse()
{
System.out.println("pseudoInverse");
DenseMatrix m2 = DenseMatrixFactoryMTJ.INSTANCE.createMatrix(3, 4);
m2.setElement(0, 0, 1.0);
m2.setElement(0, 1, 2.0);
m2.setElement(0, 2, 3.0);
m2.setElement(0, 3, 4.0);
m2.setElement(1, 0, 5.0);
m2.setElement(1, 1, 6.0);
m2.setElement(1, 2, -1.0);
m2.setElement(1, 3, -2.0);
m2.setElement(2, 0, -3.0);
m2.setElement(2, 1, -4.0);
m2.setElement(2, 2, -5.0);
m2.setElement(2, 3, -6.0);
AbstractSingularValueDecomposition instance =
SingularValueDecompositionMTJ.create(m2);
DenseMatrix e1 = DenseMatrixFactoryMTJ.INSTANCE.createMatrix(4, 3);
e1.setElement(0, 0, -1.611111);
e1.setElement(0, 1, -0.111111);
e1.setElement(0, 2, -1.000000);
e1.setElement(1, 0, 1.407407);
e1.setElement(1, 1, 0.240741);
e1.setElement(1, 2, 0.833333);
e1.setElement(2, 0, -0.981481);
e1.setElement(2, 1, -0.148148);
e1.setElement(2, 2, -0.666667);
e1.setElement(3, 0, 0.685185);
e1.setElement(3, 1, 0.018519);
e1.setElement(3, 2, 0.333333);
assertTrue(e1.equals(instance.pseudoInverse(0.0), 0.00001));
DenseMatrix e2 = DenseMatrixFactoryMTJ.INSTANCE.createMatrix(4, 3);
e2.setElement(0, 0, 9.8276e-04);
e2.setElement(0, 1, 7.1082e-02);
e2.setElement(0, 2, -1.4753e-02);
e2.setElement(1, 0, 5.1640e-03);
e2.setElement(1, 1, 8.2264e-02);
e2.setElement(1, 2, -2.3662e-02);
e2.setElement(2, 0, 3.2495e-02);
e2.setElement(2, 1, -3.3552e-02);
e2.setElement(2, 2, -4.6965e-02);
e2.setElement(3, 0, 4.2464e-02);
e2.setElement(3, 1, -5.4120e-02);
e2.setElement(3, 2, -5.9472e-02);
assertTrue(e2.equals(instance.pseudoInverse(0.5), 0.0001));
}
}