/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.math.linearalgebra;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals;
import org.testng.annotations.Test;
import cern.colt.matrix.DoubleFactory2D;
import cern.colt.matrix.DoubleMatrix2D;
import cern.colt.matrix.linalg.SingularValueDecomposition;
import com.opengamma.analytics.math.matrix.DoubleMatrix1D;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class SVDecompositionColtResultTest {
static final double CONDITION = 3.9;
static final double NORM = 2.4;
static final int RANK = 4;
static final DoubleMatrix2D S = DoubleFactory2D.dense.make(new double[][] {new double[] {1, 2, 3}, new double[] {4, 5, 6}, new double[] {7, 8, 9}});
static final DoubleMatrix2D U = DoubleFactory2D.dense.make(new double[][] {new double[] {11, 12, 13}, new double[] {14, 15, 16}, new double[] {17, 18, 19}});
static final DoubleMatrix2D V = DoubleFactory2D.dense.make(new double[][] {new double[] {21, 22, 23}, new double[] {24, 25, 26}, new double[] {27, 28, 29}});
static final DoubleMatrix2D U_T = DoubleFactory2D.dense.make(new double[][] {new double[] {11, 14, 17}, new double[] {12, 15, 18}, new double[] {13, 16, 19}});
static final DoubleMatrix2D V_T = DoubleFactory2D.dense.make(new double[][] {new double[] {21, 24, 27}, new double[] {22, 25, 28}, new double[] {23, 26, 29}});
static final double[] SINGULAR_VALUES = new double[] {1, 2, 3};
static final SingularValueDecomposition SVD = new MySingularValueDecomposition();
private static final SVDecompositionColtResult RESULT = new SVDecompositionColtResult(SVD);
private static final double EPS = 1e-15;
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullSVD() {
new SVDecompositionColtResult(null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullArray() {
RESULT.solve((double[]) null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullVector() {
RESULT.solve((DoubleMatrix1D) null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullMatrix() {
RESULT.solve((com.opengamma.analytics.math.matrix.DoubleMatrix2D) null);
}
@Test
public void testGetters() {
assertEquals(CONDITION, RESULT.getConditionNumber(), 0);
assertEquals(RANK, RESULT.getRank());
assertEquals(NORM, RESULT.getNorm(), 0);
assertColtMatrixEquals(S, RESULT.getS());
assertColtMatrixEquals(U, RESULT.getU());
assertColtMatrixEquals(U_T, RESULT.getUT());
assertColtMatrixEquals(V, RESULT.getV());
assertColtMatrixEquals(V_T, RESULT.getVT());
assertArrayEquals(SINGULAR_VALUES, RESULT.getSingularValues(), 1e-12);
}
private void assertColtMatrixEquals(final DoubleMatrix2D m1, final com.opengamma.analytics.math.matrix.DoubleMatrix2D m2) {
final int m = m1.rows();
final int n = m1.columns();
assertEquals(m, m2.getNumberOfRows());
assertEquals(n, m2.getNumberOfColumns());
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
assertEquals(m1.get(i, j), m2.getEntry(i, j), EPS);
}
}
}
private static class MySingularValueDecomposition extends SingularValueDecomposition {
private static final long serialVersionUID = 1L;
public MySingularValueDecomposition() {
super(DoubleFactory2D.dense.make(new double[][] {new double[] {1}, new double[] {1}}));
}
@Override
public double cond() {
return CONDITION;
}
@Override
public double norm2() {
return NORM;
}
@Override
public int rank() {
return RANK;
}
@Override
public cern.colt.matrix.DoubleMatrix2D getS() {
return S;
}
@Override
public cern.colt.matrix.DoubleMatrix2D getU() {
return U;
}
@Override
public cern.colt.matrix.DoubleMatrix2D getV() {
return V;
}
@Override
public double[] getSingularValues() {
return SINGULAR_VALUES;
}
}
}