Skip to content

Commit 3b2bb08

Browse files
authored
materialize as a block array whenever axes are blocked (#133)
* materialize as a block array whenever axes are blocked * exp,log,sqrt overloads for PseudoBlockMatrix * Update blocklinalg.jl * add tests, support Colon * Increase coverage
1 parent a037ee5 commit 3b2bb08

File tree

4 files changed

+74
-2
lines changed

4 files changed

+74
-2
lines changed

src/blockaxis.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,3 +228,15 @@ blocklengths(a::AbstractUnitRange) = blocklasts(a) .- blockfirsts(a) .+ 1
228228

229229
Base.summary(a::BlockedUnitRange) = _block_summary(a)
230230
Base.summary(io::IO, a::BlockedUnitRange) = _block_summary(io, a)
231+
232+
233+
###
234+
# Slice{<:BlockedUnitRange}
235+
###
236+
237+
Base.axes(S::Base.Slice{<:BlockedUnitRange}) = (S.indices,)
238+
Base.unsafe_indices(S::Base.Slice{<:BlockedUnitRange}) = (S.indices,)
239+
Base.axes1(S::Base.Slice{<:BlockedUnitRange}) = S.indices
240+
blockaxes(S::Base.Slice) = blockaxes(S.indices)
241+
getindex(S::Base.Slice, b::Block{1}) = S.indices[b]
242+
getindex(S::Base.Slice, b::BlockRange{1}) = S.indices[b]

src/blocklinalg.jl

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,13 @@ sublayout(BL::BlockLayout{MLAY,BLAY}, ::Type{<:Tuple{<:BlockSlice{BlockRange{1,T
6161

6262
# materialize views, used for `getindex`
6363
sub_materialize(::AbstractBlockLayout, V, _) = BlockArray(V)
64-
sub_materialize(::AbstractStridedLayout, V, ::Tuple{<:BlockedUnitRange}) = PseudoBlockArray(V)
64+
sub_materialize(::AbstractBlockLayout, V, ::Tuple{<:BlockedUnitRange}) = BlockArray(V)
65+
sub_materialize(::AbstractBlockLayout, V, ::Tuple{<:BlockedUnitRange,<:BlockedUnitRange}) = BlockArray(V)
66+
# if it's not a block layout, best to use PseudoBlockArray
67+
sub_materialize(_, V, ::Tuple{<:BlockedUnitRange}) = PseudoBlockArray(V)
68+
sub_materialize(_, V, ::Tuple{<:BlockedUnitRange,<:BlockedUnitRange}) = PseudoBlockArray(V)
69+
sub_materialize(_, V, ::Tuple{<:AbstractUnitRange,<:BlockedUnitRange}) = PseudoBlockArray(V)
70+
sub_materialize(_, V, ::Tuple{<:BlockedUnitRange,<:AbstractUnitRange}) = PseudoBlockArray(V)
6571

6672
conjlayout(::Type{T}, ::BlockLayout{MLAY,BLAY}) where {T<:Complex,MLAY,BLAY} = BlockLayout{MLAY,typeof(conjlayout(T,BLAY()))}()
6773
conjlayout(::Type{T}, ::BlockLayout{MLAY,BLAY}) where {T<:Real,MLAY,BLAY} = BlockLayout{MLAY,BLAY}()
@@ -279,4 +285,10 @@ for UNIT in ('U', 'N')
279285
end
280286

281287
# For now, use PseudoBlockArray
282-
_inv(::AbstractBlockLayout, axes, A) = BlockArray(inv(PseudoBlockArray(A)))
288+
_inv(::AbstractBlockLayout, axes, A) = BlockArray(inv(PseudoBlockArray(A)))
289+
290+
for op in (:exp, :log, :sqrt)
291+
@eval begin
292+
$op(A::PseudoBlockMatrix) = PseudoBlockMatrix($op(A.blocks), axes(A))
293+
end
294+
end

test/test_blockindices.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,8 @@ end
230230
@test axes(b) == Base.unsafe_indices(b) == (b,)
231231
@test Base.dataids(b) == Base.dataids(blocklasts(b))
232232
@test_throws ArgumentError BlockedUnitRange(b)
233+
234+
@test summary(b) == "3-blocked 6-element BlockedUnitRange{Array{$Int,1}}"
233235
end
234236

235237
@testset "OneTo interface" begin
@@ -261,6 +263,15 @@ end
261263
@test checkindex(Bool, b, Block(3))
262264
@test !checkindex(Bool, b, Block(4))
263265
end
266+
267+
@testset "Slice" begin
268+
b = blockedrange([1,2,3])
269+
S = Base.Slice(b)
270+
@test blockaxes(S) == blockaxes(b)
271+
@test S[Block(2)] == 2:3
272+
@test S[Block.(1:2)] == 1:3
273+
@test axes(S) == axes(b)
274+
end
264275
end
265276

266277
@testset "BlockSlice" begin

test/test_blockviews.jl

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,4 +221,41 @@ using BlockArrays, Test, Base64
221221

222222
@test BlockArrays.hasmatchingblocks(view(B,Block.(3:3),Block.(2:2)))
223223
end
224+
225+
@testset "sub_materialize cases" begin
226+
a = BlockArray(randn(6), 1:3)
227+
b = PseudoBlockArray(randn(6), 1:3)
228+
@test a[Block.(1:2)] isa BlockArray
229+
@test b[Block.(1:2)] isa PseudoBlockArray
230+
@test a[1:3] isa Array
231+
@test b[1:3] isa Array
232+
A = BlockArray(randn(6,6), 1:3, fill(3,2))
233+
B = PseudoBlockArray(randn(6,6), 1:3, fill(3,2))
234+
@test A[Block.(1:2),Block.(1:2)] isa BlockArray
235+
@test B[Block.(1:2),Block.(1:2)] isa PseudoBlockArray
236+
@test A[Block.(1:2),1:3] isa PseudoBlockArray
237+
@test B[Block.(1:2),1:3] isa PseudoBlockArray
238+
@test A[1:3,Block.(1:2)] isa PseudoBlockArray
239+
@test B[1:3,Block.(1:2)] isa PseudoBlockArray
240+
@test A[Block.(1:2),:] isa PseudoBlockArray
241+
@test B[Block.(1:2),:] isa PseudoBlockArray
242+
@test blockisequal(axes(A,2),axes(A[Block.(1:2),:],2))
243+
@test blockisequal(axes(B,2),axes(B[Block.(1:2),:],2))
244+
@test A[:,Block.(1:2)] isa PseudoBlockArray
245+
@test B[:,Block.(1:2)] isa PseudoBlockArray
246+
@test blockisequal(axes(A,1),axes(A[:,Block.(1:2)],1))
247+
@test blockisequal(axes(B,1),axes(B[:,Block.(1:2)],1))
248+
@test A[:,:] isa PseudoBlockArray
249+
@test B[:,:] isa PseudoBlockArray
250+
@test blockisequal(axes(A),axes(A[:,:]))
251+
@test blockisequal(axes(B),axes(B[:,:]))
252+
@test A[1:3,1:3] isa Array
253+
@test B[1:3,1:3] isa Array
254+
A = BlockArray(randn(6,6,6), 1:3, fill(3,2),1:3)
255+
B = PseudoBlockArray(randn(6,6,6), 1:3, fill(3,2),1:3)
256+
@test A[Block.(1:2),Block.(1:2),Block.(1:2)] isa BlockArray
257+
@test B[Block.(1:2),Block.(1:2),Block.(1:2)] isa PseudoBlockArray
258+
@test A[1:3,Block.(1:2),1:3] isa BlockArray
259+
@test B[1:3,Block.(1:2),1:3] isa PseudoBlockArray
260+
end
224261
end

0 commit comments

Comments
 (0)