/**
* 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 org.testng.AssertJUnit.assertTrue;
import java.util.Arrays;
import org.apache.commons.math3.linear.Array2DRowRealMatrix;
import org.apache.commons.math3.linear.LUDecomposition;
import org.apache.commons.math3.linear.RealMatrix;
import org.testng.annotations.Test;
import com.opengamma.strata.collect.array.DoubleArray;
import com.opengamma.strata.collect.array.DoubleMatrix;
import com.opengamma.strata.math.impl.FuzzyEquals;
/**
* Tests the LUDecompositionCommonsResult class with well conditioned data and
* poorly conditioned data.
*/
@Test
public class LUDecompositionCommonsResultTest {
static double[][] rawAok = new double[][] { {100.0000000000000000, 9.0000000000000000, 10.0000000000000000, 1.0000000000000000 },
{9.0000000000000000, 50.0000000000000000, 19.0000000000000000, 15.0000000000000000 }, {10.0000000000000000, 11.0000000000000000, 29.0000000000000000, 21.0000000000000000 },
{8.0000000000000000, 10.0000000000000000, 20.0000000000000000, 28.0000000000000000 } };
static double[][] rawAsingular = new double[][] { {1000000.0000000000000000, 2.0000000000000000, 3.0000000000000000 }, {1000000.0000000000000000, 2.0000000000000000, 3.0000000000000000 },
{4.0000000000000000, 5.0000000000000000, 6.0000000000000000 } };
static double[] rawRHSvect = new double[] {1, 2, 3, 4 };
static double[][] rawRHSmat = new double[][] { {1, 2 }, {3, 4 }, {5, 6 }, {7, 8 } };
RealMatrix condok = new Array2DRowRealMatrix(rawAok);
LUDecomposition decomp = new LUDecomposition(condok);
LUDecompositionCommonsResult result = new LUDecompositionCommonsResult(decomp);
@Test(expectedExceptions = IllegalArgumentException.class)
public void checkThrowOnNull() {
new LUDecompositionCommonsResult(null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void checkThrowOnSingular() {
new LUDecompositionCommonsResult(new LUDecomposition(new Array2DRowRealMatrix(rawAsingular)));
}
public void testGetL() {
double[][] expectedRaw = new double[][] { {1.0000000000000000, 0.0000000000000000, 0.0000000000000000, 0.0000000000000000 },
{0.0900000000000000, 1.0000000000000000, 0.0000000000000000, 0.0000000000000000 }, {0.1000000000000000, 0.2053262858304534, 1.0000000000000000, 0.0000000000000000 },
{0.0800000000000000, 0.1886562309412482, 0.6500406024227509, 1.0000000000000000 } };
assertTrue(FuzzyEquals.ArrayFuzzyEquals(result.getL().toArray(), expectedRaw));
}
public void testGetU() {
double[][] expectedRaw = new double[][] { {100.0000000000000000, 9.0000000000000000, 10.0000000000000000, 1.0000000000000000 },
{0.0000000000000000, 49.1899999999999977, 18.1000000000000014, 14.9100000000000001 }, {0.0000000000000000, 0.0000000000000000, 24.2835942264687930, 17.8385850782679398 },
{0.0000000000000000, 0.0000000000000000, 0.0000000000000000, 13.5113310060192049 } };
assertTrue(FuzzyEquals.ArrayFuzzyEquals(result.getU().toArray(), expectedRaw));
}
public void testGetDeterminant() {
assertTrue(FuzzyEquals.SingleValueFuzzyEquals(result.getDeterminant(), 1613942.00000000));
}
public void testGetP() {
double[][] expectedRaw = new double[][] { {1.0000000000000000, 0.0000000000000000, 0.0000000000000000, 0.0000000000000000 },
{0.0000000000000000, 1.0000000000000000, 0.0000000000000000, 0.0000000000000000 }, {0.0000000000000000, 0.0000000000000000, 1.0000000000000000, 0.0000000000000000 },
{0.0000000000000000, 0.0000000000000000, 0.0000000000000000, 1.0000000000000000 } };
assertTrue(FuzzyEquals.ArrayFuzzyEquals(result.getP().toArray(), expectedRaw));
}
public void testGetPivot() {
int[] expectedRaw = new int[] {0, 1, 2, 3 };
assertTrue(Arrays.equals(result.getPivot(), expectedRaw));
}
public void testSolveForVector() {
double[] expectedRaw = new double[] {0.0090821107573878, -0.0038563963265099, -0.0016307897061976, 0.1428043882617839 };
assertTrue(FuzzyEquals.ArrayFuzzyEquals(result.solve(rawRHSvect), expectedRaw));
assertTrue(FuzzyEquals.ArrayFuzzyEquals(result.solve(DoubleArray.copyOf(rawRHSvect)).toArray(), expectedRaw));
}
public void testSolveForMatrix() {
double[][] expectedRaw = new double[][] { {0.0103938059732010, 0.0181642215147756 }, {-0.0147149030138629, -0.0077127926530197 }, {-0.0171480759531631, -0.0032615794123952 },
{0.2645342893362958, 0.2856087765235678 } };
assertTrue(FuzzyEquals.ArrayFuzzyEquals(result.solve(DoubleMatrix.copyOf(rawRHSmat)).toArray(), expectedRaw));
}
}