|
| 1 | +using LinearAlgebra |
1 | 2 | using SparseMatrixColorings:
|
2 |
| - check_structurally_orthogonal_columns, check_symmetrically_orthogonal_columns |
| 3 | + structurally_orthogonal_columns, |
| 4 | + symmetrically_orthogonal_columns, |
| 5 | + directly_recoverable_columns |
3 | 6 | using Test
|
4 | 7 |
|
5 | 8 | @testset "Structurally orthogonal columns" begin
|
6 | 9 | A = [
|
7 | 10 | 1 0 0
|
8 |
| - 0 1 0 |
9 |
| - 0 1 1 |
| 11 | + 0 2 0 |
| 12 | + 0 3 4 |
10 | 13 | ]
|
11 | 14 |
|
12 | 15 | # success
|
13 | 16 |
|
14 |
| - @test check_structurally_orthogonal_columns(A, [1, 2, 3]) |
15 |
| - @test check_structurally_orthogonal_columns(A, [1, 2, 1]) |
16 |
| - @test check_structurally_orthogonal_columns(A, [1, 1, 2]) |
| 17 | + @test structurally_orthogonal_columns(A, [1, 2, 3]) |
| 18 | + @test structurally_orthogonal_columns(A, [1, 2, 1]) |
| 19 | + @test structurally_orthogonal_columns(A, [1, 1, 2]) |
| 20 | + |
| 21 | + @test directly_recoverable_columns(A, [1, 2, 3]) |
| 22 | + @test directly_recoverable_columns(A, [1, 2, 1]) |
| 23 | + @test directly_recoverable_columns(A, [1, 1, 2]) |
17 | 24 |
|
18 | 25 | # failure
|
19 | 26 |
|
20 |
| - @test !check_structurally_orthogonal_columns(A, [1, 2]) |
21 |
| - @test_logs (:warn, "2 colors provided for 3 columns") check_structurally_orthogonal_columns( |
22 |
| - A, [1, 2]; verbose=true |
23 |
| - ) |
| 27 | + @test !structurally_orthogonal_columns(A, [1, 2]) |
| 28 | + log = (:warn, "2 colors provided for 3 columns.") |
| 29 | + @test_logs log structurally_orthogonal_columns(A, [1, 2]; verbose=true) |
24 | 30 |
|
25 |
| - @test !check_structurally_orthogonal_columns(A, [1, 2, 2]) |
26 |
| - @test_logs (:warn, "In color 2, columns [2, 3] all have nonzeros in row 3") check_structurally_orthogonal_columns( |
27 |
| - A, [1, 2, 2]; verbose=true |
28 |
| - ) |
| 31 | + @test !directly_recoverable_columns(A, [1, 2]) |
| 32 | + log = (:warn, "2 colors provided for 3 columns.") |
| 33 | + @test_logs log !directly_recoverable_columns(A, [1, 2]; verbose=true) |
| 34 | + |
| 35 | + @test !structurally_orthogonal_columns(A, [1, 2, 2]) |
| 36 | + log = (:warn, "In color 2, columns [2, 3] all have nonzeros in row 3.") |
| 37 | + @test_logs log structurally_orthogonal_columns(A, [1, 2, 2]; verbose=true) |
| 38 | + |
| 39 | + @test !directly_recoverable_columns(A, [1, 2, 2]) |
| 40 | + log = (:warn, "Coefficients [3, 4] are not directly recoverable.") |
29 | 41 | end
|
30 | 42 |
|
31 | 43 | @testset "Structurally orthogonal rows" begin
|
32 | 44 | A = [
|
33 | 45 | 1 0 0
|
34 |
| - 0 1 0 |
35 |
| - 0 1 1 |
| 46 | + 0 2 0 |
| 47 | + 0 3 4 |
36 | 48 | ]
|
37 | 49 |
|
38 | 50 | # success
|
39 | 51 |
|
40 |
| - @test check_structurally_orthogonal_columns(transpose(A), [1, 2, 3]) |
41 |
| - @test check_structurally_orthogonal_columns(transpose(A), [1, 2, 1]) |
42 |
| - @test check_structurally_orthogonal_columns(transpose(A), [1, 1, 2]) |
| 52 | + @test structurally_orthogonal_columns(transpose(A), [1, 2, 3]) |
| 53 | + @test structurally_orthogonal_columns(transpose(A), [1, 2, 1]) |
| 54 | + @test structurally_orthogonal_columns(transpose(A), [1, 1, 2]) |
| 55 | + |
| 56 | + @test directly_recoverable_columns(transpose(A), [1, 2, 3]) |
| 57 | + @test directly_recoverable_columns(transpose(A), [1, 2, 1]) |
| 58 | + @test directly_recoverable_columns(transpose(A), [1, 1, 2]) |
43 | 59 |
|
44 | 60 | # failure
|
45 | 61 |
|
46 |
| - @test !check_structurally_orthogonal_columns(transpose(A), [1, 2, 2, 3]) |
47 |
| - @test_logs (:warn, "4 colors provided for 3 columns") check_structurally_orthogonal_columns( |
48 |
| - transpose(A), [1, 2, 2, 3]; verbose=true |
49 |
| - ) |
| 62 | + @test !structurally_orthogonal_columns(transpose(A), [1, 2, 2, 3]) |
| 63 | + log = (:warn, "4 colors provided for 3 columns.") |
| 64 | + @test_logs log structurally_orthogonal_columns(transpose(A), [1, 2, 2, 3]; verbose=true) |
50 | 65 |
|
51 |
| - @test !check_structurally_orthogonal_columns(transpose(A), [1, 2, 2]) |
52 |
| - @test_logs (:warn, "In color 2, columns [2, 3] all have nonzeros in row 2") !check_structurally_orthogonal_columns( |
53 |
| - transpose(A), [1, 2, 2]; verbose=true |
54 |
| - ) |
| 66 | + @test !directly_recoverable_columns(transpose(A), [1, 2, 2, 3]) |
| 67 | + log = (:warn, "4 colors provided for 3 columns.") |
| 68 | + @test_logs log directly_recoverable_columns(transpose(A), [1, 2, 2, 3]; verbose=true) |
| 69 | + |
| 70 | + @test !structurally_orthogonal_columns(transpose(A), [1, 2, 2]) |
| 71 | + log = (:warn, "In color 2, columns [2, 3] all have nonzeros in row 2.") |
| 72 | + @test_logs log !structurally_orthogonal_columns(transpose(A), [1, 2, 2]; verbose=true) |
| 73 | + |
| 74 | + @test !directly_recoverable_columns(transpose(A), [1, 2, 2]) |
| 75 | + log = (:warn, "Coefficients [2, 3] are not directly recoverable.") |
| 76 | + @test_logs log directly_recoverable_columns(transpose(A), [1, 2, 2]; verbose=true) |
55 | 77 | end
|
56 | 78 |
|
57 | 79 | @testset "Symmetrically orthogonal" begin
|
58 |
| - # Fig 4.1 of "What color is your Jacobian?" |
59 |
| - |
60 |
| - A = [ |
61 |
| - 1 1 0 0 0 0 |
62 |
| - 1 1 1 0 1 1 |
63 |
| - 0 1 1 1 0 0 |
64 |
| - 0 0 1 1 0 1 |
65 |
| - 0 1 0 0 1 0 |
66 |
| - 0 1 0 1 0 1 |
67 |
| - ] |
| 80 | + A = what_fig_41() |
68 | 81 | @test issymmetric(A)
|
69 | 82 |
|
70 | 83 | # success
|
71 | 84 |
|
72 |
| - @test check_symmetrically_orthogonal_columns(A, [1, 2, 1, 3, 1, 1]) |
| 85 | + @test symmetrically_orthogonal_columns(A, [1, 2, 1, 3, 1, 1]) |
| 86 | + |
| 87 | + @test directly_recoverable_columns(A, [1, 2, 1, 3, 1, 1]) |
73 | 88 |
|
74 | 89 | # failure
|
75 | 90 |
|
76 |
| - @test !check_symmetrically_orthogonal_columns(A, [1, 2, 1, 3, 1]) |
77 |
| - @test_logs (:warn, "5 colors provided for 6 columns") check_symmetrically_orthogonal_columns( |
| 91 | + @test !symmetrically_orthogonal_columns(A, [1, 2, 1, 3, 1]) |
| 92 | + @test_logs (:warn, "5 colors provided for 6 columns.") symmetrically_orthogonal_columns( |
78 | 93 | A, [1, 2, 1, 3, 1]; verbose=true
|
79 | 94 | )
|
80 | 95 |
|
81 |
| - @test !check_symmetrically_orthogonal_columns(A, [1, 3, 1, 3, 1, 1]) |
| 96 | + @test !symmetrically_orthogonal_columns(A, [1, 3, 1, 3, 1, 1]) |
82 | 97 | @test_logs (
|
83 | 98 | :warn,
|
84 | 99 | """
|
85 | 100 | For coefficient (i=2, j=3) with column colors (ci=3, cj=1):
|
86 |
| -- in color ci=3, columns [2, 4] all have nonzeros in row j=3 |
87 |
| -- in color cj=1, columns [1, 3, 5, 6] all have nonzeros in row i=2 |
| 101 | +- In color ci=3, columns [2, 4] all have nonzeros in row j=3. |
| 102 | +- In color cj=1, columns [1, 3, 5, 6] all have nonzeros in row i=2. |
88 | 103 | """,
|
89 |
| - ) check_symmetrically_orthogonal_columns(A, [1, 3, 1, 3, 1, 1]; verbose=true) |
| 104 | + ) symmetrically_orthogonal_columns(A, [1, 3, 1, 3, 1, 1]; verbose=true) |
90 | 105 |
|
91 |
| - # Fig 1 of "Efficient computation of sparse hessians using coloring and AD" |
92 |
| - |
93 |
| - A = [ |
94 |
| - 1 1 0 0 0 0 1 0 0 0 |
95 |
| - 1 1 1 0 1 0 0 0 0 0 |
96 |
| - 0 1 1 1 0 1 0 0 0 0 |
97 |
| - 0 0 1 1 0 0 0 0 0 1 |
98 |
| - 0 1 0 0 1 1 0 1 0 0 |
99 |
| - 0 0 1 0 1 1 0 0 1 0 |
100 |
| - 1 0 0 0 0 0 1 1 0 0 |
101 |
| - 0 0 0 0 1 0 1 1 1 0 |
102 |
| - 0 0 0 0 0 1 0 1 1 1 |
103 |
| - 0 0 0 1 0 0 0 0 1 1 |
104 |
| - ] |
| 106 | + A = efficient_fig_1() |
105 | 107 | @test issymmetric(A)
|
106 | 108 |
|
107 | 109 | # success
|
108 | 110 |
|
109 |
| - @test check_symmetrically_orthogonal_columns(A, [1, 2, 1, 3, 1, 4, 3, 5, 1, 2]) |
| 111 | + @test symmetrically_orthogonal_columns(A, [1, 2, 1, 3, 1, 4, 3, 5, 1, 2]) |
110 | 112 |
|
111 | 113 | # failure
|
112 | 114 |
|
113 |
| - @test !check_symmetrically_orthogonal_columns(A, [1, 2, 1, 3, 1, 4, 3, 4, 1, 2]) |
114 |
| - @test !check_symmetrically_orthogonal_columns(A, [1, 2, 1, 3, 1, 4, 2, 5, 1, 2]) |
115 |
| - @test !check_symmetrically_orthogonal_columns(A, [1, 2, 1, 4, 1, 4, 3, 5, 1, 2]) |
| 115 | + @test !symmetrically_orthogonal_columns(A, [1, 2, 1, 3, 1, 4, 3, 4, 1, 2]) |
| 116 | + @test !symmetrically_orthogonal_columns(A, [1, 2, 1, 3, 1, 4, 2, 5, 1, 2]) |
| 117 | + @test !symmetrically_orthogonal_columns(A, [1, 2, 1, 4, 1, 4, 3, 5, 1, 2]) |
| 118 | + |
| 119 | + @test !directly_recoverable_columns(A, [1, 2, 1, 3, 1, 4, 3, 4, 1, 2]) |
| 120 | + @test !directly_recoverable_columns(A, [1, 2, 1, 3, 1, 4, 2, 5, 1, 2]) |
| 121 | + @test !directly_recoverable_columns(A, [1, 2, 1, 4, 1, 4, 3, 5, 1, 2]) |
116 | 122 | end
|
0 commit comments