Skip to content

Commit 56ce44a

Browse files
committed
Update tests
1 parent b9ffb02 commit 56ce44a

File tree

2 files changed

+289
-6
lines changed

2 files changed

+289
-6
lines changed

test/test_blocksparsearrays.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ using BlockSparseArrays:
99
blocktype,
1010
eachblockaxis
1111
# using FillArrays: Eye, SquareEye
12-
using DiagonalArrays: Delta, δ
12+
using DiagonalArrays: DeltaMatrix, δ
1313
using JLArrays: JLArray
1414
using KroneckerArrays: KroneckerArray, , ×, arg1, arg2, cartesianrange
1515
using LinearAlgebra: norm
@@ -178,7 +178,7 @@ end
178178
@test @constinferred(iszero(a[Block(2, 1)]))
179179
@test a[Block(2, 1)] == dev(δ(3, 2) zeros(elt, 3, 2))
180180
@test a[Block(2, 1)] isa valtype(d)
181-
@test iszero(a[Block(1, 2)])
181+
@test @constinferred(iszero(a[Block(1, 2)]))
182182
@test a[Block(1, 2)] == dev(δ(2, 3) zeros(elt, 2, 3))
183183
@test a[Block(1, 2)] isa valtype(d)
184184

@@ -201,13 +201,13 @@ end
201201
I = [I1, I2]
202202
b = a[I, I]
203203
@test b[Block(1, 1)] == a[Block(1, 1)[(1:2) × [1], (1:2) × [1]]]
204-
@test arg1(b[Block(1, 1)]) isa Delta
204+
@test arg1(b[Block(1, 1)]) isa DeltaMatrix
205205
@test iszero(b[Block(2, 1)])
206-
@test arg1(b[Block(2, 1)]) isa Delta
206+
@test arg1(b[Block(2, 1)]) isa DeltaMatrix
207207
@test iszero(b[Block(1, 2)])
208-
@test arg1(b[Block(1, 2)]) isa Delta
208+
@test arg1(b[Block(1, 2)]) isa DeltaMatrix
209209
@test b[Block(2, 2)] == a[Block(2, 2)[(1:3) × [1, 3], (1:3) × [1, 3]]]
210-
@test arg1(b[Block(2, 2)]) isa Delta
210+
@test arg1(b[Block(2, 2)]) isa DeltaMatrix
211211

212212
# Slicing
213213
r = blockrange([2 × 2, 3 × 3])
Lines changed: 283 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,283 @@
1+
using FillArrays: Ones
2+
using DiagonalArrays: δ, DeltaMatrix
3+
using KroneckerArrays: , arguments
4+
using LinearAlgebra: Hermitian, I, diag, hermitianpart, norm
5+
using MatrixAlgebraKit:
6+
eig_full,
7+
eig_trunc,
8+
eig_vals,
9+
eigh_full,
10+
eigh_trunc,
11+
eigh_vals,
12+
left_null,
13+
left_orth,
14+
left_polar,
15+
lq_compact,
16+
lq_full,
17+
qr_compact,
18+
qr_full,
19+
right_null,
20+
right_orth,
21+
right_polar,
22+
svd_compact,
23+
svd_full,
24+
svd_trunc,
25+
svd_vals
26+
using Test: @test, @test_broken, @test_throws, @testset
27+
using TestExtras: @constinferred
28+
29+
herm(a) = parent(hermitianpart(a))
30+
31+
@testset "MatrixAlgebraKit + DeltaMatrix" begin
32+
for elt in (Float32, ComplexF32)
33+
a = δ(elt, 3, 3) randn(elt, 3, 3)
34+
d, v = @constinferred eig_full(a)
35+
@test a * v v * d
36+
@test arguments(d, 1) isa DeltaMatrix{complex(elt)}
37+
@test arguments(v, 1) isa DeltaMatrix{complex(elt)}
38+
39+
a = parent(hermitianpart(randn(elt, 3, 3))) δ(elt, 3, 3)
40+
d, v = @constinferred eig_full(a)
41+
@test a * v v * d
42+
@test arguments(d, 2) isa DeltaMatrix{complex(elt)}
43+
@test arguments(v, 2) isa DeltaMatrix{complex(elt)}
44+
45+
a = δ(elt, 3, 3) δ(elt, 3, 3)
46+
d, v = @constinferred eig_full(a)
47+
@test a * v v * d
48+
@test arguments(d, 1) isa DeltaMatrix{complex(elt)}
49+
@test arguments(d, 2) isa DeltaMatrix{complex(elt)}
50+
@test arguments(v, 1) isa DeltaMatrix{complex(elt)}
51+
@test arguments(v, 2) isa DeltaMatrix{complex(elt)}
52+
end
53+
54+
for elt in (Float32, ComplexF32)
55+
a = δ(elt, 3, 3) parent(hermitianpart(randn(elt, 3, 3)))
56+
d, v = @constinferred eigh_full($a)
57+
@test a * v v * d
58+
@test arguments(d, 1) isa DeltaMatrix{real(elt)}
59+
@test arguments(v, 1) isa DeltaMatrix{elt}
60+
61+
a = parent(hermitianpart(randn(elt, 3, 3))) δ(elt, 3, 3)
62+
d, v = @constinferred eigh_full($a)
63+
@test a * v v * d
64+
@test arguments(d, 2) isa DeltaMatrix{real(elt)}
65+
@test arguments(v, 2) isa DeltaMatrix{elt}
66+
67+
a = δ(elt, 3, 3) δ(elt, 3, 3)
68+
d, v = @constinferred eigh_full($a)
69+
@test a * v v * d
70+
@test arguments(d, 1) isa DeltaMatrix{real(elt)}
71+
@test arguments(d, 2) isa DeltaMatrix{real(elt)}
72+
@test arguments(v, 1) isa DeltaMatrix{elt}
73+
@test arguments(v, 2) isa DeltaMatrix{elt}
74+
end
75+
76+
## TODO: Broken, need to fix truncation.
77+
## for f in (eig_trunc, eigh_trunc)
78+
## a = δ(3, 3) ⊗ parent(hermitianpart(randn(3, 3)))
79+
## d, v = f(a; trunc=(; maxrank=7))
80+
## @test a * v ≈ v * d
81+
## @test arguments(d, 1) isa DeltaMatrix
82+
## @test arguments(v, 1) isa DeltaMatrix
83+
## @test size(d) == (6, 6)
84+
## @test size(v) == (9, 6)
85+
86+
## a = parent(hermitianpart(randn(3, 3))) ⊗ δ(3, 3)
87+
## d, v = f(a; trunc=(; maxrank=7))
88+
## @test a * v ≈ v * d
89+
## @test arguments(d, 2) isa DeltaMatrix
90+
## @test arguments(v, 2) isa DeltaMatrix
91+
## @test size(d) == (6, 6)
92+
## @test size(v) == (9, 6)
93+
94+
## a = δ(3, 3) ⊗ δ(3, 3)
95+
## @test_throws ArgumentError f(a)
96+
## end
97+
98+
for f in (eig_vals, eigh_vals)
99+
a = δ(3, 3) parent(hermitianpart(randn(3, 3)))
100+
d = @constinferred f(a)
101+
d′ = f(Matrix(a))
102+
@test sort(Vector(d); by=abs) sort(d′; by=abs)
103+
@test arguments(d, 1) isa Ones
104+
@test arguments(d, 2) f(arguments(a, 2))
105+
106+
a = parent(hermitianpart(randn(3, 3))) δ(3, 3)
107+
d = @constinferred f(a)
108+
d′ = f(Matrix(a))
109+
@test sort(Vector(d); by=abs) sort(d′; by=abs)
110+
@test arguments(d, 2) isa Ones
111+
@test arguments(d, 1) f(arguments(a, 1))
112+
113+
a = δ(3, 3) δ(3, 3)
114+
d = @constinferred f(a)
115+
@test d == Ones(3) Ones(3)
116+
@test arguments(d, 1) isa Ones
117+
@test arguments(d, 2) isa Ones
118+
end
119+
120+
for f in (
121+
left_orth, right_orth, left_polar, right_polar, qr_compact, lq_compact, qr_full, lq_full
122+
)
123+
a = δ(3, 3) randn(3, 3)
124+
x, y = @constinferred f($a)
125+
@test x * y a
126+
@test arguments(x, 1) isa DeltaMatrix
127+
@test arguments(y, 1) isa DeltaMatrix
128+
129+
a = randn(3, 3) δ(3, 3)
130+
x, y = @constinferred f($a)
131+
@test x * y a
132+
@test arguments(x, 2) isa DeltaMatrix
133+
@test arguments(y, 2) isa DeltaMatrix
134+
135+
a = δ(3, 3) δ(3, 3)
136+
x, y = @constinferred f($a)
137+
@test x * y a
138+
@test arguments(x, 1) isa DeltaMatrix
139+
@test arguments(y, 1) isa DeltaMatrix
140+
@test arguments(x, 2) isa DeltaMatrix
141+
@test arguments(y, 2) isa DeltaMatrix
142+
end
143+
144+
for f in (svd_compact, svd_full)
145+
for elt in (Float32, ComplexF32)
146+
a = δ(elt, 3, 3) randn(elt, 3, 3)
147+
u, s, v = @constinferred f($a)
148+
@test u * s * v a
149+
@test eltype(u) === elt
150+
@test eltype(s) === real(elt)
151+
@test eltype(v) === elt
152+
@test arguments(u, 1) isa DeltaMatrix{elt}
153+
@test arguments(s, 1) isa DeltaMatrix{real(elt)}
154+
@test arguments(v, 1) isa DeltaMatrix{elt}
155+
156+
a = randn(elt, 3, 3) δ(elt, 3, 3)
157+
u, s, v = @constinferred f($a)
158+
@test u * s * v a
159+
@test eltype(u) === elt
160+
@test eltype(s) === real(elt)
161+
@test eltype(v) === elt
162+
@test arguments(u, 2) isa DeltaMatrix{elt}
163+
@test arguments(s, 2) isa DeltaMatrix{real(elt)}
164+
@test arguments(v, 2) isa DeltaMatrix{elt}
165+
166+
a = δ(elt, 3, 3) δ(elt, 3, 3)
167+
u, s, v = @constinferred f($a)
168+
@test u * s * v a
169+
@test eltype(u) === elt
170+
@test eltype(s) === real(elt)
171+
@test eltype(v) === elt
172+
@test arguments(u, 1) isa DeltaMatrix{elt}
173+
@test arguments(s, 1) isa DeltaMatrix{real(elt)}
174+
@test arguments(v, 1) isa DeltaMatrix{elt}
175+
@test arguments(u, 2) isa DeltaMatrix{elt}
176+
@test arguments(s, 2) isa DeltaMatrix{real(elt)}
177+
@test arguments(v, 2) isa DeltaMatrix{elt}
178+
end
179+
end
180+
181+
## TODO: Need to implement truncation.
182+
## # svd_trunc
183+
## for elt in (Float32, ComplexF32)
184+
## a = δ(elt, 3, 3) ⊗ randn(elt, 3, 3)
185+
## # TODO: Type inference is broken for `svd_trunc`,
186+
## # look into fixing it.
187+
## # u, s, v = @constinferred svd_trunc(a; trunc=(; maxrank=7))
188+
## u, s, v = svd_trunc(a; trunc=(; maxrank=7))
189+
## @test eltype(u) === elt
190+
## @test eltype(s) === real(elt)
191+
## @test eltype(v) === elt
192+
## u′, s′, v′ = svd_trunc(Matrix(a); trunc=(; maxrank=6))
193+
## @test Matrix(u * s * v) ≈ u′ * s′ * v′
194+
## @test arguments(u, 1) isa DeltaMatrix{elt}
195+
## @test arguments(s, 1) isa DeltaMatrix{real(elt)}
196+
## @test arguments(v, 1) isa DeltaMatrix{elt}
197+
## @test size(u) == (9, 6)
198+
## @test size(s) == (6, 6)
199+
## @test size(v) == (6, 9)
200+
## end
201+
202+
## TODO: Need to implement truncation.
203+
## for elt in (Float32, ComplexF32)
204+
## a = randn(elt, 3, 3) ⊗ δ(elt, 3, 3)
205+
## # TODO: Type inference is broken for `svd_trunc`,
206+
## # look into fixing it.
207+
## # u, s, v = @constinferred svd_trunc(a; trunc=(; maxrank=7))
208+
## u, s, v = svd_trunc(a; trunc=(; maxrank=7))
209+
## @test eltype(u) === elt
210+
## @test eltype(s) === real(elt)
211+
## @test eltype(v) === elt
212+
## u′, s′, v′ = svd_trunc(Matrix(a); trunc=(; maxrank=6))
213+
## @test Matrix(u * s * v) ≈ u′ * s′ * v′
214+
## @test arguments(u, 2) isa DeltaMatrix{elt}
215+
## @test arguments(s, 2) isa DeltaMatrix{real(elt)}
216+
## @test arguments(v, 2) isa DeltaMatrix{elt}
217+
## @test size(u) == (9, 6)
218+
## @test size(s) == (6, 6)
219+
## @test size(v) == (6, 9)
220+
## end
221+
222+
a = δ(3, 3) δ(3, 3)
223+
@test_broken svd_trunc(a)
224+
225+
# svd_vals
226+
for elt in (Float32, ComplexF32)
227+
a = δ(elt, 3, 3) randn(elt, 3, 3)
228+
d = @constinferred svd_vals(a)
229+
d′ = svd_vals(Matrix(a))
230+
@test sort(Vector(d); by=abs) sort(d′; by=abs)
231+
@test arguments(d, 1) isa Ones{real(elt)}
232+
@test arguments(d, 2) svd_vals(arguments(a, 2))
233+
end
234+
235+
for elt in (Float32, ComplexF32)
236+
a = randn(elt, 3, 3) δ(elt, 3, 3)
237+
d = @constinferred svd_vals(a)
238+
d′ = svd_vals(Matrix(a))
239+
@test sort(Vector(d); by=abs) sort(d′; by=abs)
240+
@test arguments(d, 2) isa Ones{real(elt)}
241+
@test arguments(d, 1) svd_vals(arguments(a, 1))
242+
end
243+
244+
for elt in (Float32, ComplexF32)
245+
a = δ(elt, 3, 3) δ(elt, 3, 3)
246+
d = @constinferred svd_vals(a)
247+
@test d Ones{real(elt)}(3) Ones{real(elt)}(3)
248+
@test arguments(d, 1) isa Ones{real(elt)}
249+
@test arguments(d, 2) isa Ones{real(elt)}
250+
end
251+
252+
# left_null
253+
a = δ(3, 3) randn(3, 3)
254+
@test_broken left_null(a)
255+
## n = @constinferred left_null(a)
256+
## @test norm(n' * a) ≈ 0
257+
## @test arguments(n, 1) isa DeltaMatrix
258+
259+
a = randn(3, 3) δ(3, 3)
260+
@test_broken left_null(a)
261+
## n = @constinferred left_null(a)
262+
## @test norm(n' * a) ≈ 0
263+
## @test arguments(n, 2) isa DeltaMatrix
264+
265+
a = δ(3, 3) δ(3, 3)
266+
@test_broken left_null(a)
267+
268+
# right_null
269+
a = δ(3, 3) randn(3, 3)
270+
@test_broken right_null(a)
271+
## n = @constinferred right_null(a)
272+
## @test norm(a * n') ≈ 0
273+
## @test arguments(n, 1) isa DeltaMatrix
274+
275+
a = randn(3, 3) δ(3, 3)
276+
@test_broken right_null(a)
277+
## n = @constinferred right_null(a)
278+
## @test norm(a * n') ≈ 0
279+
## @test arguments(n, 2) isa DeltaMatrix
280+
281+
a = δ(3, 3) δ(3, 3)
282+
@test_broken right_null(a)
283+
end

0 commit comments

Comments
 (0)