Skip to content

Commit e2bacc9

Browse files
committed
improved test coverage
1 parent b9b7a20 commit e2bacc9

File tree

1 file changed

+90
-1
lines changed

1 file changed

+90
-1
lines changed

tests/org/cicirello/math/la/LinearAlgebraTests.java

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,7 @@ public void testProductDouble() {
575575

576576
@Test
577577
public void testJacobi() {
578-
for (int n = 1; n <= 100; n++) {
578+
for (int n = 1; n <= 10; n++) {
579579
double[][] A = getDiagonal(n);
580580
JacobiDiagonalization jd = new JacobiDiagonalization(A);
581581
assertNull(jd.eigenvectors());
@@ -615,6 +615,60 @@ public void testJacobi() {
615615
}
616616
}
617617
}
618+
IllegalArgumentException thrown = assertThrows(
619+
IllegalArgumentException.class,
620+
() -> new JacobiDiagonalization(new double[2][3])
621+
);
622+
}
623+
624+
@Test
625+
public void testJacobiInt() {
626+
for (int n = 1; n <= 5; n++) {
627+
int[][] Aint = getDiagonalInt(n);
628+
double[][] A = toDoubleMatrix(Aint, true);
629+
JacobiDiagonalization jd = new JacobiDiagonalization(Aint);
630+
assertNull(jd.eigenvectors());
631+
assertNull(jd.eigenvalues());
632+
assertTrue(jd.compute(JacobiDiagonalization.EPSILON));
633+
double[][] P = jd.eigenvectors();
634+
double[] eig = jd.eigenvalues();
635+
double[][] lambda = new double[eig.length][eig.length];
636+
for (int i = 0; i < lambda.length; i++) {
637+
lambda[i][i] = eig[i];
638+
}
639+
double[][] left = MatrixOps.product(A, P);
640+
double[][] right = MatrixOps.product(P, lambda);
641+
assertEquals(left.length, right.length);
642+
assertEquals(left[0].length, right[0].length);
643+
for (int i = 0; i < left.length; i++) {
644+
assertArrayEquals("diagonal already", left[i], right[i], JacobiDiagonalization.EPSILON);
645+
}
646+
if (n <= 5) {
647+
Aint = getSymmetricInt(n);
648+
A = toDoubleMatrix(Aint, false);
649+
jd = new JacobiDiagonalization(A);
650+
assertNull("eigvectors should be null", jd.eigenvectors());
651+
assertNull("eigvalues should be null", jd.eigenvalues());
652+
assertTrue("should converge", jd.compute(JacobiDiagonalization.MAX_ITERATIONS/10));
653+
P = jd.eigenvectors();
654+
eig = jd.eigenvalues();
655+
lambda = new double[eig.length][eig.length];
656+
for (int i = 0; i < lambda.length; i++) {
657+
lambda[i][i] = eig[i];
658+
}
659+
left = MatrixOps.product(A, P);
660+
right = MatrixOps.product(P, lambda);
661+
assertEquals(left.length, right.length);
662+
assertEquals(left[0].length, right[0].length);
663+
for (int i = 0; i < left.length; i++) {
664+
assertArrayEquals("symmetric: " + n, left[i], right[i], 10*n*JacobiDiagonalization.EPSILON);
665+
}
666+
}
667+
}
668+
IllegalArgumentException thrown = assertThrows(
669+
IllegalArgumentException.class,
670+
() -> new JacobiDiagonalization(new int[2][3])
671+
);
618672
}
619673

620674
private double[][] getSymmetric(int n) {
@@ -629,6 +683,18 @@ private double[][] getSymmetric(int n) {
629683
return A;
630684
}
631685

686+
private int[][] getSymmetricInt(int n) {
687+
int[][] A = new int[n][n];
688+
Random gen = new Random(42);
689+
for (int i = 0; i < n; i++) {
690+
A[i][i] = gen.nextInt(2)+1;
691+
for (int j = i+1; j < n; j++) {
692+
A[i][j] = A[j][i] = gen.nextInt(2)+1;
693+
}
694+
}
695+
return A;
696+
}
697+
632698
private double[][] getDiagonal(int n) {
633699
double[][] A = new double[n][n];
634700
Random gen = new Random(42);
@@ -638,6 +704,29 @@ private double[][] getDiagonal(int n) {
638704
return A;
639705
}
640706

707+
private int[][] getDiagonalInt(int n) {
708+
int[][] A = new int[n][n];
709+
Random gen = new Random(42);
710+
for (int i = 0; i < n; i++) {
711+
A[i][i] = gen.nextInt(99) + 1;
712+
}
713+
return A;
714+
}
715+
716+
private double[][] toDoubleMatrix(int[][] M, boolean diag) {
717+
double[][] A = new double[M.length][M[0].length];
718+
for (int i = 0; i < A.length; i++) {
719+
if (diag) {
720+
A[i][i] = M[i][i];
721+
} else {
722+
for (int j = 0; j < A[i].length; j++) {
723+
A[i][j] = M[i][j];
724+
}
725+
}
726+
}
727+
return A;
728+
}
729+
641730
private double[][] getMultA_d(int n, int m) {
642731
double[][] A = new double[n][m];
643732
for (int i = 0; i < n; i++) {

0 commit comments

Comments
 (0)