package mikera.matrixx.algo; import static org.junit.Assert.*; import mikera.matrixx.AMatrix; import mikera.matrixx.Matrix; import mikera.matrixx.Matrixx; import mikera.matrixx.decompose.Cholesky; import mikera.matrixx.decompose.ICholeskyResult; import mikera.matrixx.impl.IdentityMatrix; import mikera.matrixx.impl.ZeroMatrix; import org.junit.Test; public class TestCholesky { @Test public void testCholeskyRegression() { Matrix original = Matrix.create(new double[][] {{4,12,-16},{12,37,-43},{-16,-43,98}}); Matrix a=Matrix.create(original); ICholeskyResult r=Cholesky.decompose(a); validateCholesky(a,r); assertEquals(original,a); } @Test public void testCholesky() { AMatrix z = Matrixx.createRandomMatrix(3, 3); AMatrix a = z.innerProduct(z.getTranspose()); // should get a symmetric positive definite matrix! ICholeskyResult r=Cholesky.decompose(a); validateCholesky(a,r); } @Test public void testZero() { AMatrix a = ZeroMatrix.create(4, 4); ICholeskyResult r=Cholesky.decompose(a); assertNull(r); } @Test public void testIdentity() { AMatrix a = IdentityMatrix.create(5); ICholeskyResult r=Cholesky.decompose(a); validateCholesky(a,r); } @Test public void testSpecial() { AMatrix a = Matrix.create(new double[][] {{0,1},{0,0}}); ICholeskyResult r=Cholesky.decompose(a); assertNull(r); } @Test public void testNegative() { AMatrix a = Matrix.create(new double[][] {{-1}}); ICholeskyResult r=Cholesky.decompose(a); assertNull(r); } public void validateCholesky(AMatrix a, ICholeskyResult r) { AMatrix l=r.getL(); AMatrix u=r.getU(); assertTrue("l and u and not transposes!",l.epsilonEquals(u.getTranspose())); assertTrue(l.isLowerTriangular()); assertTrue(u.isUpperTriangular()); assertTrue("product not valid",l.innerProduct(u).epsilonEquals(a)); } }