/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.math.matrix; import static org.testng.AssertJUnit.assertEquals; import org.testng.annotations.Test; import com.opengamma.analytics.math.linearalgebra.TridiagonalMatrix; import com.opengamma.analytics.math.statistics.distribution.NormalDistribution; import com.opengamma.analytics.math.statistics.distribution.ProbabilityDistribution; import com.opengamma.analytics.util.AssertMatrix; import com.opengamma.util.test.TestGroup; /** * Test. */ @Test(groups = TestGroup.UNIT) public class OGMatrixAlgebraTest { private static ProbabilityDistribution<Double> RANDOM = new NormalDistribution(0, 1); private static final MatrixAlgebra ALGEBRA = MatrixAlgebraFactory.getMatrixAlgebra("OG"); private static final DoubleMatrix2D A = new DoubleMatrix2D(new double[][] { {1., 2., 3. }, {-1., 1., 0. }, {-2., 1., -2. } }); private static final DoubleMatrix2D B = new DoubleMatrix2D(new double[][] { {1, 1 }, {2, -2 }, {3, 1 } }); private static final DoubleMatrix2D C = new DoubleMatrix2D(new double[][] { {14, 0 }, {1, -3 }, {-6, -6 } }); private static final DoubleMatrix1D D = new DoubleMatrix1D(new double[] {1, 1, 1 }); private static final DoubleMatrix1D E = new DoubleMatrix1D(new double[] {-1, 2, 3 }); private static final DoubleMatrix1D F = new DoubleMatrix1D(new double[] {2, -2, 1 }); @Test(expectedExceptions = IllegalArgumentException.class) public void testMatrixSizeMismatch() { ALGEBRA.multiply(B, A); } @Test public void testDotProduct() { double res = ALGEBRA.getInnerProduct(E, F); assertEquals(-3.0, res, 1e-15); res = ALGEBRA.getNorm2(E); assertEquals(Math.sqrt(14.0), res, 1e-15); } @Test public void testOuterProduct() { final DoubleMatrix2D res = ALGEBRA.getOuterProduct(E, F); final int rows = res.getNumberOfRows(); final int cols = res.getNumberOfColumns(); int i, j; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { assertEquals(res.getEntry(i, j), E.getEntry(i) * F.getEntry(j), 1e-15); } } } @Test public void testMultiply() { final DoubleMatrix2D c = (DoubleMatrix2D) ALGEBRA.multiply(A, B); final int rows = c.getNumberOfRows(); final int cols = c.getNumberOfColumns(); int i, j; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { assertEquals(c.getEntry(i, j), C.getEntry(i, j), 1e-15); } } final DoubleMatrix1D d = (DoubleMatrix1D) ALGEBRA.multiply(A, D); assertEquals(6, d.getEntry(0), 1e-15); assertEquals(0, d.getEntry(1), 1e-15); assertEquals(-3, d.getEntry(2), 1e-15); } @Test public void testTridiagonalMultiply() { final int n = 37; double[] l = new double[n - 1]; double[] c = new double[n]; double[] u = new double[n - 1]; double[] x = new double[n]; for (int ii = 0; ii < n; ii++) { c[ii] = RANDOM.nextRandom(); x[ii] = RANDOM.nextRandom(); if (ii < n - 1) { l[ii] = RANDOM.nextRandom(); u[ii] = RANDOM.nextRandom(); } } final TridiagonalMatrix m = new TridiagonalMatrix(c, u, l); final DoubleMatrix1D xVec = new DoubleMatrix1D(x); DoubleMatrix1D y1 = (DoubleMatrix1D) ALGEBRA.multiply(m, xVec); DoubleMatrix2D full = m.toDoubleMatrix2D(); DoubleMatrix1D y2 = (DoubleMatrix1D) ALGEBRA.multiply(full, xVec); for (int i = 0; i < n; i++) { assertEquals(y1.getEntry(i), y2.getEntry(i), 1e-12); } } @Test public void testTranspose() { final DoubleMatrix2D a = new DoubleMatrix2D(new double[][] { {1, 2 }, {3, 4 }, {5, 6 } }); assertEquals(3, a.getNumberOfRows()); assertEquals(2, a.getNumberOfColumns()); DoubleMatrix2D aT = ALGEBRA.getTranspose(a); assertEquals(2, aT.getNumberOfRows()); assertEquals(3, aT.getNumberOfColumns()); } @Test public void matrixTransposeMultipleMatrixTest() { DoubleMatrix2D a = new DoubleMatrix2D(new double[][] { {1.0, 2.0, 3.0 }, {-3.0, 1.3, 7.0 } }); DoubleMatrix2D aTa = ALGEBRA.matrixTransposeMultiplyMatrix(a); DoubleMatrix2D aTaRef = (DoubleMatrix2D) ALGEBRA.multiply(ALGEBRA.getTranspose(a), a); AssertMatrix.assertEqualsMatrix(aTaRef, aTa, 1e-15); } }