/
symmetry.jl
129 lines (121 loc) · 2.52 KB
/
symmetry.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
module TestSymmetry
using LinearAlgebra, SparseArrays, Test
using SumOfSquares
function test_linsolve()
x = [1, 2]
for A in [
[
1 0 2 3
0 1 3 -2
],
[
1 2 0 3
0 3 1 -2
],
]
b = A' * x
@test Certificate.Symmetry._linsolve(
A,
b,
Symmetry._RowEchelonMatrix(),
) ≈ x
B = float.(A)
for i in axes(B, 1)
B[i, :] = normalize(B[i, :])
end
b = B' * x
@test Certificate.Symmetry.__linsolve(
B,
b,
Symmetry._OrthogonalMatrix(),
) ≈ x
@test Certificate.Symmetry.__linsolve(
sparse(B),
b,
Symmetry._OrthogonalMatrix(),
) ≈ x
end
end
function _test_orthogonal_transformation_to(A, B)
U = SumOfSquares.Certificate.Symmetry.orthogonal_transformation_to(A, B)
@test A == U' * B * U
end
function test_orthogonal_transformation_to()
A1 = [
0 -1
1 0
]
A2 = [
0 1
-1 0
]
D = Diagonal([1, -1])
@test A1 == D * A2 * D
_test_orthogonal_transformation_to(A1, A2)
B1 = [
0 1
1 0
]
B2 = [
0 -1
-1 0
]
@test B1 == D * B2 * D
_test_orthogonal_transformation_to(B1, B2)
@test (A1 + B1) == D * (A2 + B2) * D
_test_orthogonal_transformation_to(A1 + B1, A2 + B2)
A1 = [
0 1
-2 0
]
A2 = [
0 -1
2 0
]
_test_orthogonal_transformation_to(A1, A2)
A1 = [
0 -1
-2 0
]
A2 = [
0 1
2 0
]
_test_orthogonal_transformation_to(A1, A2)
return
end
function test_block_diag()
# From `dihedral.jl` example
A = [
[
0 -1 0 0 0 0
1 0 0 0 0 0
0 0 0 0 0 -1
0 0 0 0 1 0
0 0 0 -1 0 0
0 0 1 0 0 0
],
[
0 1 0 0 0 0
1 0 0 0 0 0
0 0 0 0 0 1
0 0 0 0 1 0
0 0 0 1 0 0
0 0 1 0 0 0
],
]
d = 2
U = SumOfSquares.Certificate.Symmetry.ordered_block_diag(A, d)
@test SumOfSquares.Certificate.Symmetry.ordered_block_check(U, A, d)
end
function runtests()
for name in names(@__MODULE__; all = true)
if startswith("$name", "test_")
@testset "$(name)" begin
getfield(@__MODULE__, name)()
end
end
end
end
end
TestSymmetry.runtests()