11using BlockArrays: Block, blocksizes
2- using GradedArrays: U1, dual, flux, gradedrange
2+ using GradedArrays: U1, dual, flux, gradedrange, trivial
33using LinearAlgebra: I, diag, svdvals
4- using MatrixAlgebraKit: svd_compact, svd_full, svd_trunc
4+ using MatrixAlgebraKit: qr_compact, qr_full, svd_compact, svd_full, svd_trunc
55using Test: @test , @testset
66
77const elts = (Float32, Float64, ComplexF32, ComplexF64)
@@ -17,9 +17,9 @@ const elts = (Float32, Float64, ComplexF32, ComplexF64)
1717 @test u * s * vᴴ ≈ a
1818 @test Array (u' u) ≈ I
1919 @test Array (vᴴ * vᴴ' ) ≈ I
20- @test flux (u) == U1 ( 0 )
20+ @test flux (u) == trivial ( flux (a) )
2121 @test flux (s) == flux (a)
22- @test flux (vᴴ) == U1 ( 0 )
22+ @test flux (vᴴ) == trivial ( flux (a) )
2323
2424 r1 = gradedrange ([U1 (0 ) => i, U1 (1 ) => j])
2525 r2 = gradedrange ([U1 (0 ) => k, U1 (1 ) => l])
@@ -31,9 +31,9 @@ const elts = (Float32, Float64, ComplexF32, ComplexF64)
3131 @test u * s * vᴴ ≈ a
3232 @test Array (u' u) ≈ I
3333 @test Array (vᴴ * vᴴ' ) ≈ I
34- @test flux (u) == U1 ( 0 )
34+ @test flux (u) == trivial ( flux (a) )
3535 @test flux (s) == flux (a)
36- @test flux (vᴴ) == U1 ( 0 )
36+ @test flux (vᴴ) == trivial ( flux (a) )
3737 end
3838end
3939
5050 @test Array (u * u' ) ≈ I
5151 @test Array (vᴴ * vᴴ' ) ≈ I
5252 @test Array (vᴴ' vᴴ) ≈ I
53- @test flux (u) == U1 ( 0 )
53+ @test flux (u) == trivial ( flux (a) )
5454 @test flux (s) == flux (a)
55- @test flux (vᴴ) == U1 ( 0 )
55+ @test flux (vᴴ) == trivial ( flux (a) )
5656
5757 r1 = gradedrange ([U1 (0 ) => i, U1 (1 ) => j])
5858 r2 = gradedrange ([U1 (0 ) => k, U1 (1 ) => l])
6565 @test Array (u * u' ) ≈ I
6666 @test Array (vᴴ * vᴴ' ) ≈ I
6767 @test Array (vᴴ' vᴴ) ≈ I
68- @test flux (u) == U1 ( 0 )
68+ @test flux (u) == trivial ( flux (a) )
6969 @test flux (s) == flux (a)
70- @test flux (vᴴ) == U1 ( 0 )
70+ @test flux (vᴴ) == trivial ( flux (a) )
7171 end
7272end
7373
8585 @test size (vᴴ) == (1 , size (a, 2 ))
8686 @test Array (u' u) ≈ I
8787 @test Array (vᴴ * vᴴ' ) ≈ I
88- @test flux (u) == U1 ( 0 )
88+ @test flux (u) == trivial ( flux (a) )
8989 @test flux (s) == flux (a)
90- @test flux (vᴴ) == U1 ( 0 )
90+ @test flux (vᴴ) == trivial ( flux (a) )
9191
9292 r1 = gradedrange ([U1 (0 ) => i, U1 (1 ) => j])
9393 r2 = gradedrange ([U1 (0 ) => k, U1 (1 ) => l])
101101 @test size (vᴴ) == (1 , size (a, 2 ))
102102 @test Array (u' u) ≈ I
103103 @test Array (vᴴ * vᴴ' ) ≈ I
104- @test flux (u) == U1 ( 0 )
104+ @test flux (u) == trivial ( flux (a) )
105105 @test flux (s) == flux (a)
106- @test flux (vᴴ) == U1 (0 )
106+ @test flux (vᴴ) == trivial (flux (a))
107+ end
108+ end
109+
110+ @testset " qr_compact (eltype=$elt )" for elt in elts
111+ for i in [2 , 3 ], j in [2 , 3 ], k in [2 , 3 ], l in [2 , 3 ]
112+ r1 = gradedrange ([U1 (0 ) => i, U1 (1 ) => j])
113+ r2 = gradedrange ([U1 (0 ) => k, U1 (1 ) => l])
114+ a = zeros (elt, r1, dual (r2))
115+ a[Block (2 , 2 )] = randn (elt, blocksizes (a)[2 , 2 ])
116+ @test flux (a) == U1 (0 )
117+ q, r = qr_compact (a)
118+ @test q * r ≈ a
119+ @test Array (q' q) ≈ I
120+ @test flux (q) == trivial (flux (a))
121+ @test flux (r) == flux (a)
122+
123+ r1 = gradedrange ([U1 (0 ) => i, U1 (1 ) => j])
124+ r2 = gradedrange ([U1 (0 ) => k, U1 (1 ) => l])
125+ a = zeros (elt, r1, dual (r2))
126+ a[Block (1 , 2 )] = randn (elt, blocksizes (a)[1 , 2 ])
127+ @test flux (a) == U1 (- 1 )
128+ q, r = qr_compact (a)
129+ @test q * r ≈ a
130+ @test Array (q' q) ≈ I
131+ @test flux (q) == trivial (flux (a))
132+ @test flux (r) == flux (a)
133+ end
134+ end
135+
136+ @testset " qr_full (eltype=$elt )" for elt in elts
137+ for i in [2 , 3 ], j in [2 , 3 ], k in [2 , 3 ], l in [2 , 3 ]
138+ r1 = gradedrange ([U1 (0 ) => i, U1 (1 ) => j])
139+ r2 = gradedrange ([U1 (0 ) => k, U1 (1 ) => l])
140+ a = zeros (elt, r1, dual (r2))
141+ a[Block (2 , 2 )] = randn (elt, blocksizes (a)[2 , 2 ])
142+ @test flux (a) == U1 (0 )
143+ q, r = qr_full (a)
144+ @test q * r ≈ a
145+ @test Array (q' q) ≈ I
146+ @test Array (q * q' ) ≈ I
147+ @test flux (q) == trivial (flux (a))
148+ @test flux (r) == flux (a)
149+
150+ r1 = gradedrange ([U1 (0 ) => i, U1 (1 ) => j])
151+ r2 = gradedrange ([U1 (0 ) => k, U1 (1 ) => l])
152+ a = zeros (elt, r1, dual (r2))
153+ a[Block (1 , 2 )] = randn (elt, blocksizes (a)[1 , 2 ])
154+ @test flux (a) == U1 (- 1 )
155+ q, r = qr_full (a)
156+ @test q * r ≈ a
157+ @test Array (q' q) ≈ I
158+ @test Array (q * q' ) ≈ I
159+ @test flux (q) == trivial (flux (a))
160+ @test flux (r) == flux (a)
107161 end
108162end
0 commit comments