/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.math.impl.linearalgebra;
import static com.opengamma.strata.math.impl.matrix.MatrixAlgebraFactory.OG_ALGEBRA;
import static org.testng.AssertJUnit.assertEquals;
import org.testng.annotations.Test;
import com.opengamma.strata.collect.array.DoubleMatrix;
/**
* Test.
*/
@Test
public class InverseTridiagonalMatrixCalculatorTest {
private static final InverseTridiagonalMatrixCalculator CALCULATOR = new InverseTridiagonalMatrixCalculator();
private static final double[] A = new double[] {1.0, 2.4, -0.4, -0.8, 1.5, 7.8, -5.0, 1.0, 2.4, -0.4, 3.14 };
private static final double[] B = new double[] {1.56, 0.33, 0.42, -0.23, 0.276, 4.76, 1.0, 2.4, -0.4, 0.2355 };
private static final double[] C = new double[] {0.56, 0.63, -0.42, -0.23, 0.76, 1.76, 1.0, 2.4, -0.4, 2.4234 };
private static final TridiagonalMatrix MATRIX = new TridiagonalMatrix(A, B, C);
private static final DoubleMatrix TRI = MATRIX.toDoubleMatrix();
private static final double EPS = 1e-15;
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullArray() {
CALCULATOR.apply((TridiagonalMatrix) null);
}
@Test
public void testInvertIdentity() {
final int n = 11;
final double[] a = new double[n];
final double[] b = new double[n - 1];
final double[] c = new double[n - 1];
int i, j;
for (i = 0; i < n; i++) {
a[i] = 1.0;
}
final DoubleMatrix res = CALCULATOR.apply(new TridiagonalMatrix(a, b, c));
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
assertEquals((i == j ? 1.0 : 0.0), res.get(i, j), EPS);
}
}
}
@Test
public void testInvert() {
final DoubleMatrix res = CALCULATOR.apply(MATRIX);
final DoubleMatrix idet = (DoubleMatrix) OG_ALGEBRA.multiply(TRI, res);
final int n = idet.rowCount();
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
assertEquals((i == j ? 1.0 : 0.0), idet.get(i, j), EPS);
}
}
}
}