Skip to content

Commit 7ebbea7

Browse files
authored
Support 3-tensors in similar (JuliaArrays#489)
I could also do 4-tensors, 5-tensors, etc. Though it's not currently possible to do arbitrary tensors. There might be an angle via `to_shape`. But I think that has a similar problem.
1 parent d0a8d7a commit 7ebbea7

File tree

4 files changed

+35
-11
lines changed

4 files changed

+35
-11
lines changed

Project.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ name = "BlockArrays"
22
uuid = "8e7c35d0-a365-5155-bbbb-fb81a777f24e"
33
version = "1.8"
44

5+
56
[deps]
67
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
78
BandedMatrices = "aae01518-5342-5314-be14-df237901396f"

src/blockarray.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,13 +443,19 @@ end
443443
BlockArray{T}(undef, map(to_axes,axes))
444444
@inline Base.similar(block_array::AbstractArray, ::Type{T}, axes::Tuple{Union{AbstractUnitRange{<:Integer},Integer},AbstractBlockedUnitRange,Vararg{Union{AbstractUnitRange{<:Integer},Integer}}}) where T =
445445
BlockArray{T}(undef, map(to_axes,axes))
446+
@inline Base.similar(block_array::AbstractArray, ::Type{T}, axes::Tuple{AbstractBlockedUnitRange,AbstractBlockedUnitRange,AbstractBlockedUnitRange,Vararg{Union{AbstractUnitRange{<:Integer},Integer}}}) where T =
447+
BlockArray{T}(undef, map(to_axes,axes))
448+
@inline Base.similar(block_array::AbstractArray, ::Type{T}, axes::Tuple{Union{AbstractUnitRange{<:Integer},Integer},Union{AbstractUnitRange{<:Integer},Integer},AbstractBlockedUnitRange,Vararg{Union{AbstractUnitRange{<:Integer},Integer}}}) where T =
449+
BlockArray{T}(undef, map(to_axes,axes))
446450

447451
@inline Base.similar(block_array::Type{<:AbstractArray{T}}, axes::Tuple{AbstractBlockedUnitRange,Vararg{Union{AbstractUnitRange{<:Integer},Integer}}}) where T =
448452
BlockArray{T}(undef, map(to_axes,axes))
449453
@inline Base.similar(block_array::Type{<:AbstractArray{T}}, axes::Tuple{AbstractBlockedUnitRange,AbstractBlockedUnitRange,Vararg{Union{AbstractUnitRange{<:Integer},Integer}}}) where T =
450454
BlockArray{T}(undef, map(to_axes,axes))
451455
@inline Base.similar(block_array::Type{<:AbstractArray{T}}, axes::Tuple{Union{AbstractUnitRange{<:Integer},Integer},AbstractBlockedUnitRange,Vararg{Union{AbstractUnitRange{<:Integer},Integer}}}) where T =
452456
BlockArray{T}(undef, map(to_axes,axes))
457+
@inline Base.similar(block_array::Type{<:AbstractArray{T}}, axes::Tuple{Union{AbstractUnitRange{<:Integer},Integer},Union{AbstractUnitRange{<:Integer},Integer},AbstractBlockedUnitRange,Vararg{Union{AbstractUnitRange{<:Integer},Integer}}}) where T =
458+
BlockArray{T}(undef, map(to_axes,axes))
453459

454460
@inline Base.similar(B::BlockArray, ::Type{T}) where {T} = _BlockArray(similar.(blocks(B), T), axes(B))
455461

src/blockedarray.jl

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -213,25 +213,33 @@ Base.similar(::BlockedArray, ::Type{T}, ::Tuple{}) where {T} = BlockedArray{T}(u
213213
to_axes(r::AbstractUnitRange) = r
214214
to_axes(n::Integer) = Base.oneto(n)
215215

216-
@inline Base.similar(block_array::Type{<:StridedArray{T}}, axes::Tuple{AbstractBlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{<:Integer}}}}) where T =
216+
const IntegerOrUnitRange = Union{Integer,AbstractUnitRange{<:Integer}}
217+
218+
@inline Base.similar(block_array::Type{<:StridedArray{T}}, axes::Tuple{AbstractBlockedUnitRange,Vararg{IntegerOrUnitRange}}) where T =
217219
BlockedArray{T}(undef, map(to_axes,axes))
218-
@inline Base.similar(block_array::Type{<:StridedArray{T}}, axes::Tuple{AbstractBlockedUnitRange,AbstractBlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{<:Integer}}}}) where T =
220+
@inline Base.similar(block_array::Type{<:StridedArray{T}}, axes::Tuple{AbstractBlockedUnitRange,AbstractBlockedUnitRange,Vararg{IntegerOrUnitRange}}) where T =
219221
BlockedArray{T}(undef, map(to_axes,axes))
220-
@inline Base.similar(block_array::Type{<:StridedArray{T}}, axes::Tuple{Union{Integer,AbstractUnitRange{<:Integer}},AbstractBlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{<:Integer}}}}) where T =
222+
@inline Base.similar(block_array::Type{<:StridedArray{T}}, axes::Tuple{IntegerOrUnitRange,AbstractBlockedUnitRange,Vararg{IntegerOrUnitRange}}) where T =
221223
BlockedArray{T}(undef, map(to_axes,axes))
222224

223-
@inline Base.similar(block_array::StridedArray, ::Type{T}, axes::Tuple{AbstractBlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{<:Integer}}}}) where T =
225+
@inline Base.similar(block_array::StridedArray, ::Type{T}, axes::Tuple{AbstractBlockedUnitRange,Vararg{IntegerOrUnitRange}}) where T =
226+
BlockedArray{T}(undef, map(to_axes,axes))
227+
@inline Base.similar(block_array::StridedArray, ::Type{T}, axes::Tuple{AbstractBlockedUnitRange,AbstractBlockedUnitRange,Vararg{IntegerOrUnitRange}}) where T =
224228
BlockedArray{T}(undef, map(to_axes,axes))
225-
@inline Base.similar(block_array::StridedArray, ::Type{T}, axes::Tuple{AbstractBlockedUnitRange,AbstractBlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{<:Integer}}}}) where T =
229+
@inline Base.similar(block_array::StridedArray, ::Type{T}, axes::Tuple{IntegerOrUnitRange,AbstractBlockedUnitRange,Vararg{IntegerOrUnitRange}}) where T =
226230
BlockedArray{T}(undef, map(to_axes,axes))
227-
@inline Base.similar(block_array::StridedArray, ::Type{T}, axes::Tuple{Union{Integer,AbstractUnitRange{<:Integer}},AbstractBlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{<:Integer}}}}) where T =
231+
@inline Base.similar(block_array::StridedArray, ::Type{T}, axes::Tuple{IntegerOrUnitRange,IntegerOrUnitRange,AbstractBlockedUnitRange,Vararg{IntegerOrUnitRange}}) where T =
228232
BlockedArray{T}(undef, map(to_axes,axes))
229233

230-
@inline Base.similar(block_array::BlockedArray, ::Type{T}, axes::Tuple{AbstractBlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{<:Integer}}}}) where T =
234+
@inline Base.similar(block_array::BlockedArray, ::Type{T}, axes::Tuple{AbstractBlockedUnitRange,Vararg{IntegerOrUnitRange}}) where T =
235+
BlockedArray{T}(undef, map(to_axes,axes))
236+
@inline Base.similar(block_array::BlockedArray, ::Type{T}, axes::Tuple{AbstractBlockedUnitRange,AbstractBlockedUnitRange,Vararg{IntegerOrUnitRange}}) where T =
231237
BlockedArray{T}(undef, map(to_axes,axes))
232-
@inline Base.similar(block_array::BlockedArray, ::Type{T}, axes::Tuple{AbstractBlockedUnitRange,AbstractBlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{<:Integer}}}}) where T =
238+
@inline Base.similar(block_array::BlockedArray, ::Type{T}, axes::Tuple{IntegerOrUnitRange,AbstractBlockedUnitRange,Vararg{IntegerOrUnitRange}}) where T =
233239
BlockedArray{T}(undef, map(to_axes,axes))
234-
@inline Base.similar(block_array::BlockedArray, ::Type{T}, axes::Tuple{Union{Integer,AbstractUnitRange{<:Integer}},AbstractBlockedUnitRange,Vararg{Union{Integer,AbstractUnitRange{<:Integer}}}}) where T =
240+
@inline Base.similar(block_array::BlockedArray, ::Type{T}, axes::Tuple{AbstractBlockedUnitRange,AbstractBlockedUnitRange,AbstractBlockedUnitRange,Vararg{IntegerOrUnitRange}}) where T =
241+
BlockedArray{T}(undef, map(to_axes,axes))
242+
@inline Base.similar(block_array::BlockedArray, ::Type{T}, axes::Tuple{IntegerOrUnitRange,IntegerOrUnitRange,AbstractBlockedUnitRange,Vararg{IntegerOrUnitRange}}) where T =
235243
BlockedArray{T}(undef, map(to_axes,axes))
236244

237245
@propagate_inbounds getindex(block_arr::BlockedArray{T, N}, i::Vararg{Integer, N}) where {T,N} = block_arr.blocks[i...]

test/test_blockarrays.jl

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,10 +236,18 @@ end
236236

237237
ret = BlockedArray{Float64}(undef, 1:3)
238238
@test similar(ret, Float64, (blockedrange(1:3),)) isa BlockedArray
239+
@test similar(ret, Float64, 1, blockedrange(1:3)) isa BlockedArray
240+
@test similar(ret, Float64, 1, 2, blockedrange(1:3)) isa BlockedArray
239241

240242
ret = BlockArray{Float64}(undef, 1:3, 1:3)
241-
@test similar(typeof(ret), axes(ret)) isa BlockArray
242-
@test similar(typeof(ret), (Base.OneTo(6),axes(ret,2))) isa BlockArray
243+
@test similar(typeof(ret), axes(ret)) isa BlockMatrix
244+
@test similar(typeof(ret), (Base.OneTo(6),axes(ret,2))) isa BlockMatrix
245+
@test similar(typeof(ret), (1,axes(ret,2))) isa BlockMatrix
246+
@test similar(typeof(ret), (1,2,axes(ret,2))) isa BlockArray{<:Any,3}
247+
@test similar(ret, axes(ret)) isa BlockMatrix
248+
@test similar(ret, (Base.OneTo(6),axes(ret,2))) isa BlockMatrix
249+
@test similar(ret, (1,axes(ret,2))) isa BlockMatrix
250+
@test similar(ret, (1,2,axes(ret,2))) isa BlockArray{<:Any,3}
243251
@test similar(Array{Float64}, axes(ret)) isa BlockedArray
244252
@test similar(Vector{Float64}, axes(ret)) isa BlockedArray
245253
@test similar(Array{Float64}, (Base.OneTo(5), axes(ret,2))) isa BlockedArray
@@ -248,6 +256,7 @@ end
248256

249257
@test similar(randn(6,5), Float64, (blockedrange(1:3),3)) isa BlockedMatrix
250258
@test similar(randn(6,5), Float64, (3,blockedrange(1:3))) isa BlockedMatrix
259+
@test similar(randn(6,5), Float64, (3,4,blockedrange(1:3))) isa BlockedArray{<:Any,3}
251260
@test similar(typeof(view(randn(5),1:3)), (blockedrange(1:3),)) isa BlockedVector
252261
@test similar(view(randn(5),1:3), Int, (blockedrange(1:3),)) isa BlockedVector{Int}
253262

0 commit comments

Comments
 (0)