|
| 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