]> gitweb.michael.orlitzky.com - dunshire.git/blob - test/matrices_test.py
Add a new unit test suite for the dunshire.matrices module.
[dunshire.git] / test / matrices_test.py
1 """
2 Unit tests for the functions in the ``matrices`` module.
3 """
4
5 from unittest import TestCase
6
7 from cvxopt import matrix
8
9 from dunshire.matrices import (append_col, append_row, condition_number,
10 eigenvalues, eigenvalues_re, identity,
11 inner_product, norm)
12 from dunshire.options import ABS_TOL
13 from .randomgen import random_matrix, random_natural, random_scalar
14
15 class AppendColTest(TestCase):
16
17 def test_size_increases(self):
18 """
19 If we append a column to a matrix, the result should be bigger
20 than the original matrix.
21 """
22 dims = random_natural()
23 mat1 = random_matrix(dims)
24 mat2 = random_matrix(dims)
25 bigmat = append_col(mat1, mat2)
26 self.assertTrue(bigmat.size[0] >= mat1.size[0])
27 self.assertTrue(bigmat.size[1] >= mat1.size[1])
28
29
30 class AppendRowTest(TestCase):
31
32 def test_size_increases(self):
33 """
34 If we append a row to a matrix, the result should be bigger
35 than the original matrix.
36 """
37 dims = random_natural()
38 mat1 = random_matrix(dims)
39 mat2 = random_matrix(dims)
40 bigmat = append_row(mat1, mat2)
41 self.assertTrue(bigmat.size[0] >= mat1.size[0])
42 self.assertTrue(bigmat.size[1] >= mat1.size[1])
43
44
45 class EigenvaluesTest(TestCase):
46
47 def test_eigenvalues_input_not_clobbered(self):
48 mat = random_matrix(random_natural())
49 symmat = mat + mat.trans()
50 symmat_copy = matrix(symmat, symmat.size)
51 eigs = eigenvalues(symmat)
52 self.assertTrue(norm(symmat - symmat_copy) < ABS_TOL)
53
54 def test_eigenvalues_re_input_not_clobbered(self):
55 mat = random_matrix(random_natural())
56 mat_copy = matrix(mat, mat.size)
57 eigs = eigenvalues_re(mat)
58 self.assertTrue(norm(mat - mat_copy) < ABS_TOL)
59
60 def test_eigenvalues_of_symmetric_are_real(self):
61 mat = random_matrix(random_natural())
62 symmat = mat + mat.trans()
63 eigs1 = sorted(eigenvalues(symmat))
64 eigs2 = sorted(eigenvalues_re(symmat))
65 diffs = [abs(e1-e2) for (e1,e2) in zip(eigs1,eigs2)]
66 self.assertTrue(all([diff < ABS_TOL for diff in diffs]))
67
68
69 def test_eigenvalues_of_identity(self):
70 mat = identity(random_natural(), typecode='d')
71 eigs1 = eigenvalues(mat)
72 eigs2 = eigenvalues_re(mat)
73 self.assertTrue(all([abs(e1 - 1) < ABS_TOL for e1 in eigs1]))
74 self.assertTrue(all([abs(e2 - 1) < ABS_TOL for e2 in eigs2]))
75
76
77 class InnerProductTest(TestCase):
78
79 def test_norm_is_nonnegative(self):
80 vec = matrix([random_scalar() for _ in range(random_natural())])
81 self.assertTrue(inner_product(vec,vec) >= 0)
82
83
84 def ConditionNumberTest(TestCase):
85
86 def test_condition_number_ge_one(self):
87 mat = random_matrix(random_natural())
88 self.assertTrue(condition_number(mat) >= 1)