|
53 | 53 | end |
54 | 54 |
|
55 | 55 |
|
56 | | -@testset "∞-block arrays" begin |
57 | | - @testset "fixed block size" begin |
58 | | - k = Base.OneTo.(oneto(∞)) |
59 | | - n = Fill.(oneto(∞), oneto(∞)) |
60 | | - @test broadcast(length, k) ≡ map(length, k) ≡ OneToInf() |
61 | | - @test broadcast(length, n) ≡ map(length, n) ≡ OneToInf() |
62 | | - |
63 | | - b = mortar(Fill([1, 2], ∞)) |
64 | | - @test blockaxes(b, 1) ≡ Block.(OneToInf()) |
65 | | - @test b[Block(5)] == [1, 2] |
66 | | - @test b[Block.(2:∞)][Block.(2:10)] == b[Block.(3:11)] |
67 | | - @test exp.(b)[Block.(2:∞)][Block.(2:10)] == exp.(b[Block.(3:11)]) |
68 | | - |
69 | | - @test blockedrange(Vcat(2, Fill(3, ∞))) isa BlockedOneTo{<:Any,<:InfiniteArrays.InfStepRange} |
70 | | - |
71 | | - c = BlockedArray(1:∞, Vcat(2, Fill(3, ∞))) |
72 | | - @test c[Block.(2:∞)][Block.(2:10)] == c[Block.(3:11)] |
73 | | - |
74 | | - @test length(axes(b, 1)) ≡ ℵ₀ |
75 | | - @test last(axes(b, 1)) ≡ ℵ₀ |
76 | | - @test Base.BroadcastStyle(typeof(b)) isa LazyArrayStyle{1} |
77 | | - |
78 | | - @test unitblocks(oneto(∞)) ≡ blockedrange(Ones{Int}(∞)) |
79 | | - @test unitblocks(2:∞) == 2:∞ |
80 | | - |
81 | | - @test unitblocks(oneto(∞))[Block.(2:∞)] == 2:∞ |
82 | | - end |
83 | | - |
84 | | - @testset "1:∞ blocks" begin |
85 | | - a = blockedrange(oneto(∞)) |
86 | | - @test axes(a, 1) == a |
87 | | - o = Ones((a,)) |
88 | | - @test Base.BroadcastStyle(typeof(a)) isa LazyArrayStyle{1} |
89 | | - b = exp.(a) |
90 | | - @test axes(b, 1) == a |
91 | | - @test o .* b isa typeof(b) |
92 | | - @test b .* o isa typeof(b) |
93 | | - end |
94 | | - |
95 | | - @testset "padded" begin |
96 | | - c = BlockedArray([1; zeros(∞)], Vcat(2, Fill(3, ∞))) |
97 | | - @test c + c isa BlockedVector |
98 | | - end |
99 | | - |
100 | | - @testset "concat" begin |
101 | | - a = unitblocks(1:∞) |
102 | | - b = exp.(a) |
103 | | - c = BlockBroadcastArray(vcat, a, b) |
104 | | - @test length(c) == ∞ |
105 | | - @test blocksize(c) == (∞,) |
106 | | - @test c[Block(5)] == [a[5], b[5]] |
107 | | - |
108 | | - A = unitblocks(BandedMatrix(0 => 1:∞, 1 => Fill(2.0, ∞), -1 => Fill(3.0, ∞))) |
109 | | - B = BlockBroadcastArray(hvcat, 2, A, Zeros(axes(A)), Zeros(axes(A)), A) |
110 | | - @test B[Block(3, 3)] == [A[3, 3] 0; 0 A[3, 3]] |
111 | | - @test B[Block(3, 4)] == [A[3, 4] 0; 0 A[3, 4]] |
112 | | - @test B[Block(3, 5)] == [A[3, 5] 0; 0 A[3, 5]] |
113 | | - @test blockbandwidths(B) == (1, 1) |
114 | | - @test subblockbandwidths(B) == (0, 0) |
115 | | - @test B[Block.(1:10), Block.(1:10)] isa BlockSkylineMatrix |
116 | | - |
117 | | - C = BlockBroadcastArray(hvcat, 2, A, A, A, A) |
118 | | - @test C[Block(3, 3)] == fill(A[3, 3], 2, 2) |
119 | | - @test C[Block(3, 4)] == fill(A[3, 4], 2, 2) |
120 | | - @test C[Block(3, 5)] == fill(A[3, 5], 2, 2) |
121 | | - @test blockbandwidths(C) == (1, 1) |
122 | | - @test subblockbandwidths(C) == (1, 1) |
123 | | - @test B[Block.(1:10), Block.(1:10)] isa BlockSkylineMatrix |
124 | | - end |
125 | | - |
126 | | - @testset "DiagTrav" begin |
127 | | - C = zeros(∞,∞); |
128 | | - C[1:3,1:4] .= [1 2 3 4; 5 6 7 8; 9 10 11 12] |
129 | | - A = DiagTrav(C) |
130 | | - @test blockcolsupport(A) == Block.(1:6) |
131 | | - @test A[Block.(1:7)] == [1; 5; 2; 9; 6; 3; 0; 10; 7; 4; 0; 0; 11; 8; 0; 0; 0; 0; 12; zeros(9)] |
132 | | - |
133 | | - C = zeros(∞,4); |
134 | | - C[1:3,1:4] .= [1 2 3 4; 5 6 7 8; 9 10 11 12] |
135 | | - A = DiagTrav(C) |
136 | | - @test A[Block.(1:7)] == [1; 5; 2; 9; 6; 3; 0; 10; 7; 4; 0; 0; 11; 8; 0; 0; 0; 12; zeros(4)] |
137 | | - |
138 | | - C = zeros(3,∞); |
139 | | - C[1:3,1:4] .= [1 2 3 4; 5 6 7 8; 9 10 11 12] |
140 | | - A = DiagTrav(C) |
141 | | - @test A[Block.(1:7)] == [1; 5; 2; 9; 6; 3; 10; 7; 4; 11; 8; 0; 12; zeros(5)] |
142 | | - end |
143 | | - |
144 | | - @testset "KronTrav" begin |
145 | | - Δ = BandedMatrix(1 => Ones(∞), -1 => Ones(∞)) / 2 |
146 | | - A = KronTrav(Δ - 2I, Eye(∞)) |
147 | | - @test axes(A, 1) isa InfiniteLinearAlgebra.OneToInfBlocks |
148 | | - V = view(A, Block.(Base.OneTo(3)), Block.(Base.OneTo(3))) |
149 | | - |
150 | | - @test MemoryLayout(A) isa InfiniteLinearAlgebra.InfKronTravBandedBlockBandedLayout |
151 | | - @test MemoryLayout(V) isa LazyBandedMatrices.KronTravBandedBlockBandedLayout |
152 | | - |
153 | | - @test A[Block.(Base.OneTo(3)), Block.(Base.OneTo(3))] isa KronTrav |
154 | | - |
155 | | - u = A * [1; zeros(∞)] |
156 | | - @test u[1:3] == A[1:3, 1] |
157 | | - @test bandwidths(view(A, Block(1, 1))) == (1, 1) |
158 | | - |
159 | | - @test A*A isa KronTrav |
160 | | - @test (A*A)[Block.(Base.OneTo(3)), Block.(Base.OneTo(3))] ≈ A[Block.(1:3), Block.(1:4)]A[Block.(1:4), Block.(1:3)] |
161 | | - end |
162 | | - |
163 | | - @testset "triangle recurrences" begin |
164 | | - @testset "n and k" begin |
165 | | - n = mortar(Fill.(oneto(∞), oneto(∞))) |
166 | | - k = mortar(Base.OneTo.(oneto(∞))) |
167 | | - |
168 | | - @test n[Block(5)] ≡ layout_getindex(n, Block(5)) ≡ view(n, Block(5)) ≡ Fill(5, 5) |
169 | | - @test k[Block(5)] ≡ layout_getindex(k, Block(5)) ≡ view(k, Block(5)) ≡ Base.OneTo(5) |
170 | | - @test Base.BroadcastStyle(typeof(n)) isa LazyArrays.LazyArrayStyle{1} |
171 | | - @test Base.BroadcastStyle(typeof(k)) isa LazyArrays.LazyArrayStyle{1} |
172 | | - |
173 | | - N = 1000 |
174 | | - v = view(n, Block.(Base.OneTo(N))) |
175 | | - @test view(v, Block(2)) ≡ Fill(2, 2) |
176 | | - @test axes(v) isa Tuple{BlockedOneTo{Int,ArrayLayouts.RangeCumsum{Int64,Base.OneTo{Int64}}}} |
177 | | - @test @allocated(axes(v)) ≤ 40 |
178 | | - |
179 | | - dest = BlockedArray{Float64}(undef, axes(v)) |
180 | | - @test copyto!(dest, v) == v |
181 | | - @test @allocated(copyto!(dest, v)) ≤ 40 |
182 | | - |
183 | | - v = view(k, Block.(Base.OneTo(N))) |
184 | | - @test view(v, Block(2)) ≡ Base.OneTo(2) |
185 | | - @test axes(v) isa Tuple{BlockedOneTo{Int,ArrayLayouts.RangeCumsum{Int64,Base.OneTo{Int64}}}} |
186 | | - @test @allocated(axes(v)) ≤ 40 |
187 | | - @test copyto!(dest, v) == v |
188 | | - |
189 | | - @testset "stack overflow" begin |
190 | | - i = Base.to_indices(k, (Block.(2:∞),))[1].indices |
191 | | - last(i) |
192 | | - end |
193 | | - |
194 | | - v = view(k, Block.(2:∞)) |
195 | | - @test Base.BroadcastStyle(typeof(v)) isa LazyArrayStyle{1} |
196 | | - @test v[Block(1)] == 1:2 |
197 | | - @test v[Block(1)] ≡ k[Block(2)] ≡ Base.OneTo(2) |
198 | | - |
199 | | - @test axes(n, 1) isa BlockedOneTo{Int,ArrayLayouts.RangeCumsum{Int64,OneToInf{Int64}}} |
200 | | - end |
201 | | - |
202 | | - @testset "BlockHcat copyto!" begin |
203 | | - n = mortar(Fill.(oneto(∞), oneto(∞))) |
204 | | - k = mortar(Base.OneTo.(oneto(∞))) |
205 | | - |
206 | | - a = b = c = 0.0 |
207 | | - dat = BlockHcat( |
208 | | - BroadcastArray((n, k, b, bc1) -> (k + b - 1) * (n + k + bc1) / (2k + bc1), n, k, b, b + c - 1), |
209 | | - BroadcastArray((n, k, abc, bc, bc1) -> (n + k + abc) * (k + bc) / (2k + bc1), n, k, a + b + c, b + c, b + c - 1) |
210 | | - ) |
211 | | - N = 1000 |
212 | | - KR = Block.(Base.OneTo(N)) |
213 | | - V = view(dat, Block.(Base.OneTo(N)), :) |
214 | | - @test MemoryLayout(V) isa LazyArrays.ApplyLayout{typeof(hcat)} |
215 | | - @test BlockedArray(V)[Block.(1:5), :] == dat[Block.(1:5), :] |
216 | | - V = view(dat', :, Block.(Base.OneTo(N))) |
217 | | - @test MemoryLayout(V) isa LazyArrays.ApplyLayout{typeof(vcat)} |
218 | | - a = dat.arrays[1]' |
219 | | - N = 100 |
220 | | - KR = Block.(Base.OneTo(N)) |
221 | | - v = view(a, :, KR) |
222 | | - @time r = BlockedArray(v) |
223 | | - @test v == r |
224 | | - end |
225 | | - |
226 | | - @testset "BlockBanded" begin |
227 | | - a = b = c = 0.0 |
228 | | - n = mortar(Fill.(oneto(∞), oneto(∞))) |
229 | | - k = mortar(Base.OneTo.(oneto(∞))) |
230 | | - Dy = BlockBandedMatrices._BandedBlockBandedMatrix((k .+ (b + c))', axes(k, 1), (-1, 1), (-1, 1)) |
231 | | - N = 100 |
232 | | - @test Dy[Block.(1:N), Block.(1:N)] == BlockBandedMatrices._BandedBlockBandedMatrix((k.+(b+c))[Block.(1:N)]', axes(k, 1)[Block.(1:N)], (-1, 1), (-1, 1)) |
233 | | - @test colsupport(Dy, axes(Dy,2)) == 1:∞ |
234 | | - @test rowsupport(Dy, axes(Dy,1)) == 2:∞ |
235 | | - end |
236 | | - |
237 | | - @testset "Symmetric" begin |
238 | | - k = mortar(Base.OneTo.(oneto(∞))) |
239 | | - n = mortar(Fill.(oneto(∞), oneto(∞))) |
240 | | - |
241 | | - dat = BlockHcat( |
242 | | - BlockBroadcastArray(hcat, float.(k), Zeros((axes(n, 1),)), float.(n)), |
243 | | - Zeros((axes(n, 1), Base.OneTo(3))), |
244 | | - Zeros((axes(n, 1), Base.OneTo(3)))) |
245 | | - M = BlockBandedMatrices._BandedBlockBandedMatrix(dat', axes(k, 1), (1, 1), (1, 1)) |
246 | | - Ms = Symmetric(M) |
247 | | - @test blockbandwidths(M) == (1, 1) |
248 | | - @test blockbandwidths(Ms) == (1, 1) |
249 | | - @test Ms[Block.(1:5), Block.(1:5)] == Symmetric(M[Block.(1:5), Block.(1:5)]) |
250 | | - @test Ms[Block.(1:5), Block.(1:5)] isa BandedBlockBandedMatrix |
251 | | - |
252 | | - b = [ones(10); zeros(∞)] |
253 | | - @test (Ms * b)[Block.(1:6)] == Ms[Block.(1:6), Block.(1:4)]*ones(10) |
254 | | - @test ((Ms * Ms) * b)[Block.(1:6)] == (Ms * (Ms * b))[Block.(1:6)] |
255 | | - @test ((Ms + Ms) * b)[Block.(1:6)] == (2*(Ms * b))[Block.(1:6)] |
256 | | - |
257 | | - dat = BlockBroadcastArray(hcat, float.(k), Zeros((axes(n, 1),)), float.(n)) |
258 | | - M = BlockBandedMatrices._BandedBlockBandedMatrix(dat', axes(k, 1), (-1, 1), (1, 1)) |
259 | | - Ms = Symmetric(M) |
260 | | - @test Symmetric((M+M)[Block.(1:10), Block.(1:10)]) == (Ms+Ms)[Block.(1:10), Block.(1:10)] |
261 | | - end |
262 | | - end |
263 | | - |
264 | | - @testset "blockdiag" begin |
265 | | - D = Diagonal(mortar(Fill.((-(0:∞) - (0:∞) .^ 2), 1:2:∞))) |
266 | | - x = [randn(5); zeros(∞)] |
267 | | - x̃ = BlockedArray(x, (axes(D, 1),)) |
268 | | - @test (D*x)[1:10] == (D*x̃)[1:10] |
269 | | - end |
270 | | - |
271 | | - @testset "sortedunion" begin |
272 | | - a = cumsum(1:2:∞) |
273 | | - @test BlockArrays.sortedunion(a, a) ≡ a |
274 | | - @test BlockArrays.sortedunion([∞], a) ≡ BlockArrays.sortedunion(a, [∞]) ≡ a |
275 | | - @test BlockArrays.sortedunion([∞], [∞]) == [∞] |
276 | | - |
277 | | - b = Vcat([1, 2], 3:∞) |
278 | | - c = Vcat(1, 3:∞) |
279 | | - @test BlockArrays.sortedunion(b, b) ≡ b |
280 | | - @test BlockArrays.sortedunion(c, c) ≡ c |
281 | | - end |
282 | | -end |
283 | | - |
284 | | - |
285 | | - |
286 | | -@testset "Algebra" begin |
287 | | - @testset "BlockTridiagonal" begin |
288 | | - A = BlockTridiagonal(Vcat([fill(1.0, 2, 1), Matrix(1.0I, 2, 2), Matrix(1.0I, 2, 2), Matrix(1.0I, 2, 2)], Fill(Matrix(1.0I, 2, 2), ∞)), |
289 | | - Vcat([zeros(1, 1)], Fill(zeros(2, 2), ∞)), |
290 | | - Vcat([fill(1.0, 1, 2), Matrix(1.0I, 2, 2)], Fill(Matrix(1.0I, 2, 2), ∞))) |
291 | | - |
292 | | - @test A isa InfiniteLinearAlgebra.BlockTriPertToeplitz |
293 | | - @test isblockbanded(A) |
294 | | - |
295 | | - @test A[Block.(1:2), Block(1)] == A[1:3, 1:1] == reshape([0.0, 1.0, 1.0], 3, 1) |
296 | | - |
297 | | - @test BlockBandedMatrix(A)[1:100, 1:100] == BlockBandedMatrix(A, (2, 1))[1:100, 1:100] == BlockBandedMatrix(A, (1, 1))[1:100, 1:100] == A[1:100, 1:100] |
298 | | - |
299 | | - @test (A-I)[1:100, 1:100] == A[1:100, 1:100] - I |
300 | | - @test (A+I)[1:100, 1:100] == A[1:100, 1:100] + I |
301 | | - @test (I+A)[1:100, 1:100] == I + A[1:100, 1:100] |
302 | | - @test (I-A)[1:100, 1:100] == I - A[1:100, 1:100] |
303 | | - |
304 | | - @test (A-im*I)[1:100, 1:100] == A[1:100, 1:100] - im * I |
305 | | - @test (A+im*I)[1:100, 1:100] == A[1:100, 1:100] + im * I |
306 | | - @test (im*I+A)[1:100, 1:100] == im * I + A[1:100, 1:100] |
307 | | - @test (im*I-A)[1:100, 1:100] == im * I - A[1:100, 1:100] |
308 | | - |
309 | | - T = mortar(LazyBandedMatrices.Tridiagonal(Fill([1 2; 3 4], ∞), Fill([1 2; 3 4], ∞), Fill([1 2; 3 4], ∞))); |
310 | | - #TODO: copy BlockBidiagonal code from BlockBandedMatrices to LazyBandedMatrices |
311 | | - @test T[Block(2, 2)] == [1 2; 3 4] |
312 | | - @test_broken T[Block(1, 3)] == Zeros(2, 2) |
313 | | - end |
314 | | - |
315 | | - @testset "BlockBidiagonal" begin |
316 | | - B = mortar(LazyBandedMatrices.Bidiagonal(Fill([1 2; 3 4], ∞), Fill([1 2; 3 4], ∞), :U)); |
317 | | - #TODO: copy BlockBidiagonal code from BlockBandedMatrices to LazyBandedMatrices |
318 | | - @test B[Block(2, 3)] == [1 2; 3 4] |
319 | | - @test_broken B[Block(1, 3)] == Zeros(2, 2) |
320 | | - end |
321 | | - |
322 | | - @testset "Triangle OP recurrences" begin |
323 | | - k = mortar(Base.OneTo.(1:∞)) |
324 | | - n = mortar(Fill.(1:∞, 1:∞)) |
325 | | - @test k[Block.(2:3)] isa BlockArray |
326 | | - @test n[Block.(2:3)] isa BlockArray |
327 | | - @test k[Block.(2:3)] == [1, 2, 1, 2, 3] |
328 | | - @test n[Block.(2:3)] == [2, 2, 3, 3, 3] |
329 | | - @test blocksize(BroadcastVector(exp, k)) == (ℵ₀,) |
330 | | - @test BroadcastVector(exp, k)[Block.(2:3)] == exp.([1, 2, 1, 2, 3]) |
331 | | - # BroadcastVector(+,k,n) |
332 | | - end |
333 | | - # Multivariate OPs Corollary (3) |
334 | | - # n = 5 |
335 | | - # BlockTridiagonal(Zeros.(1:∞,2:∞), |
336 | | - # (n -> Diagonal(((n+2).+(0:n)))/ (2n + 2)).(0:∞), |
337 | | - # Zeros.(2:∞,1:∞)) |
338 | | - |
339 | | - @testset "KronTrav" begin |
340 | | - Δ = BandedMatrix(1 => Ones(∞) / 2, -1 => Ones(∞)) |
341 | | - A = KronTrav(Δ, Eye(∞)) |
342 | | - @test A[Block(100, 101)] isa BandedMatrix |
343 | | - @test A[Block(100, 100)] isa BandedMatrix |
344 | | - @test A[Block.(1:5), Block.(1:5)] isa BandedBlockBandedMatrix |
345 | | - B = KronTrav(Eye(∞), Δ) |
346 | | - @test B[Block(100, 101)] isa BandedMatrix |
347 | | - @test B[Block(100, 100)] isa BandedMatrix |
348 | | - V = view(A + B, Block.(1:5), Block.(1:5)) |
349 | | - @test MemoryLayout(typeof(V)) isa BroadcastBandedBlockBandedLayout{typeof(+)} |
350 | | - @test arguments(V) == (A[Block.(1:5), Block.(1:5)], B[Block.(1:5), Block.(1:5)]) |
351 | | - @test (A+B)[Block.(1:5), Block.(1:5)] == A[Block.(1:5), Block.(1:5)] + B[Block.(1:5), Block.(1:5)] |
352 | | - |
353 | | - @test blockbandwidths(A + B) == (1, 1) |
354 | | - @test blockbandwidths(2A) == (1, 1) |
355 | | - @test blockbandwidths(2 * (A + B)) == (1, 1) |
356 | | - |
357 | | - @test subblockbandwidths(A + B) == (1, 1) |
358 | | - @test subblockbandwidths(2A) == (1, 1) |
359 | | - @test subblockbandwidths(2 * (A + B)) == (1, 1) |
360 | | - end |
361 | | -end |
362 | | - |
363 | | -@testset "findblock at +∞, HarmonicOrthogonalPolynomials#88" begin |
364 | | - @test findblock(blockedrange(1:2:∞), RealInfinity()) == Block(ℵ₀) |
365 | | -end |
366 | 56 |
|
367 | 57 | include("test_hessenbergq.jl") |
368 | 58 | include("test_infql.jl") |
|
0 commit comments