Skip to content

Commit b963b13

Browse files
authored
More general printing (#119)
* More general printing, col/rowsupport * block(::AdjOrTrans) * col/rowsupport with ranges * Add support for blocked-FillArray * Special *, \, / overloads * Remove redundant blocks * Blocks dispatch like scalar * Fix block printing for block-vector views * only tests stringmime on 1.2+ * Increase coverage * Increase coverage
1 parent 42ae241 commit b963b13

15 files changed

+344
-222
lines changed

Project.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ version = "0.12.7"
55
[deps]
66
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
77
Compat = "34da2185-b29b-5c13-b0c7-acf172513d20"
8+
FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b"
89
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
910

1011
[compat]
11-
ArrayLayouts = "0.3"
12+
ArrayLayouts = "0.3.2"
1213
Compat = "2.2, 3"
1314
julia = "1.1"
1415

src/BlockArrays.jl

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,24 @@ export blockappend!, blockpush!, blockpushfirst!, blockpop!, blockpopfirst!
2121
import Base: @propagate_inbounds, Array, to_indices, to_index,
2222
unsafe_indices, first, last, size, length, unsafe_length,
2323
unsafe_convert,
24-
getindex, show,
24+
getindex, ndims, show,
2525
step,
2626
broadcast, eltype, convert, similar,
2727
@_inline_meta, _maybetail, tail, @_propagate_inbounds_meta, reindex,
2828
RangeIndex, Int, Integer, Number,
29-
+, -, min, max, *, isless, in, copy, copyto!, axes, @deprecate,
29+
+, -, *, /, \, min, max, isless, in, copy, copyto!, axes, @deprecate,
3030
BroadcastStyle, checkbounds, throw_boundserror
3131
using Base: ReshapedArray, dataids
3232

3333

34-
import Base: (:), IteratorSize, iterate, axes1, strides
35-
import Base.Broadcast: broadcasted, DefaultArrayStyle, AbstractArrayStyle, Broadcasted
34+
import Base: (:), IteratorSize, iterate, axes1, strides, isempty
35+
import Base.Broadcast: broadcasted, DefaultArrayStyle, AbstractArrayStyle, Broadcasted, broadcastable
3636
import LinearAlgebra: lmul!, rmul!, AbstractTriangular, HermOrSym, AdjOrTrans,
3737
StructuredMatrixStyle
3838
import ArrayLayouts: _fill_lmul!, MatMulVecAdd, MatMulMatAdd, MatLmulVec, MatLdivVec,
3939
materialize!, MemoryLayout, sublayout, transposelayout, conjlayout,
40-
triangularlayout, triangulardata, _inv
40+
triangularlayout, triangulardata, _inv, _copyto!, axes_print_matrix_row,
41+
colsupport, rowsupport
4142

4243
if !@isdefined(only)
4344
using Compat: only
@@ -49,12 +50,12 @@ include("abstractblockarray.jl")
4950
include("blockarray.jl")
5051
include("pseudo_blockarray.jl")
5152
include("views.jl")
52-
include("show.jl")
5353
include("blocks.jl")
5454
include("blockarrayinterface.jl")
5555
include("blockbroadcast.jl")
5656
include("blocklinalg.jl")
5757
include("blockproduct.jl")
58+
include("show.jl")
5859
include("blockreduce.jl")
5960
include("blockdeque.jl")
6061

src/blockarray.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,12 @@ struct BlockArray{T, N, R <: AbstractArray{<:AbstractArray{T,N},N}, BS<:NTuple{N
6262
blocks::R
6363
axes::BS
6464

65-
global _BlockArray(blocks::R, block_sizes::BS) where {T, N, R<:AbstractArray{<:AbstractArray{T,N},N}, BS<:NTuple{N,AbstractUnitRange{Int}}} =
65+
global @inline _BlockArray(blocks::R, block_sizes::BS) where {T, N, R<:AbstractArray{<:AbstractArray{T,N},N}, BS<:NTuple{N,AbstractUnitRange{Int}}} =
6666
new{T, N, R, BS}(blocks, block_sizes)
6767
end
6868

6969
# Auxilary outer constructors
70-
_BlockArray(blocks::R, block_sizes::Vararg{AbstractVector{Int}, N}) where {T, N, R<:AbstractArray{<:AbstractArray{T,N},N}} =
70+
@inline _BlockArray(blocks::R, block_sizes::Vararg{AbstractVector{Int}, N}) where {T, N, R<:AbstractArray{<:AbstractArray{T,N},N}} =
7171
_BlockArray(blocks, map(blockedrange, block_sizes))
7272

7373
# support non-concrete eltypes in blocks

src/blockarrayinterface.jl

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,3 @@ getindex(a::Number, ::Block{0}) = a
33

44
axes(A::AbstractTriangular{<:Any,<:AbstractBlockMatrix}) = axes(parent(A))
55
axes(A::HermOrSym{<:Any,<:AbstractBlockMatrix}) = axes(parent(A))
6-
7-
Base.print_matrix_row(io::IO,
8-
X::Union{AbstractTriangular{<:Any,<:AbstractBlockMatrix},
9-
Symmetric{<:Any,<:AbstractBlockMatrix},
10-
Hermitian{<:Any,<:AbstractBlockMatrix},
11-
Adjoint{<:Any,<:AbstractBlockMatrix},
12-
Transpose{<:Any,<:AbstractBlockMatrix}}, A::Vector,
13-
i::Integer, cols::AbstractVector, sep::AbstractString) =
14-
_blockarray_print_matrix_row(io, X, A, i, cols, sep)

src/blockbroadcast.jl

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,8 @@ end
147147
return copyto!(dest, Base.Broadcast.instantiate(Base.Broadcast.Broadcasted{BS}(bc.f, bc.args, combine_blockaxes.(axes(dest),axes(bc)))))
148148
end
149149

150-
@generated function copyto!(
151-
dest::AbstractArray,
152-
bc::Broadcasted{<:AbstractBlockStyle{NDims}, <:Any, <:Any, Args},
153-
) where {NDims, Args <: Tuple}
150+
@generated function copyto!(dest::AbstractArray,
151+
bc::Broadcasted{<:AbstractBlockStyle{NDims}, <:Any, <:Any, Args}) where {NDims, Args <: Tuple}
154152

155153
NArgs = length(Args.parameters)
156154

@@ -190,29 +188,47 @@ end
190188
end
191189
end
192190

193-
@inline function Broadcast.instantiate(
194-
bc::Broadcasted{Style}) where {Style <:AbstractBlockStyle}
195-
bcf = Broadcast.flatten(Broadcasted{Nothing}(bc.f, bc.args, bc.axes))
191+
@inline function Broadcast.instantiate(bc::Broadcasted{Style}) where {Style <:AbstractBlockStyle}
192+
bcf = Broadcast.instantiate(Broadcast.flatten(Broadcasted{Nothing}(bc.f, bc.args, bc.axes)))
196193
return Broadcasted{Style}(bcf.f, bcf.args, bcf.axes)
197194
end
198195

199196

200197
for op in (:+, :-, :*)
201-
@eval function copy(bc::Broadcasted{BlockStyle{N},<:Any,typeof($op),<:Tuple{<:BlockArray{<:Number,N}}}) where N
198+
@eval function copy(bc::Broadcasted{BlockStyle{N},<:Any,typeof($op),<:Tuple{<:AbstractArray{<:Number,N}}}) where N
202199
(A,) = bc.args
203-
_BlockArray(broadcast(a -> broadcast($op, a), A.blocks), axes(A))
200+
_BlockArray(broadcast(a -> broadcast($op, a), blocks(A)), axes(A))
204201
end
205202
end
206203

207204
for op in (:+, :-, :*, :/, :\)
208205
@eval begin
209-
function copy(bc::Broadcasted{BlockStyle{N},<:Any,typeof($op),<:Tuple{<:Number,<:BlockArray{<:Number,N}}}) where N
206+
function copy(bc::Broadcasted{BlockStyle{N},<:Any,typeof($op),<:Tuple{<:Number,<:AbstractArray{<:Number,N}}}) where N
210207
x,A = bc.args
211-
_BlockArray(broadcast((x,a) -> broadcast($op, x, a), x, A.blocks), axes(A))
208+
_BlockArray(broadcast((x,a) -> broadcast($op, x, a), x, blocks(A)), axes(A))
212209
end
213-
function copy(bc::Broadcasted{BlockStyle{N},<:Any,typeof($op),<:Tuple{<:BlockArray{<:Number,N},<:Number}}) where N
210+
function copy(bc::Broadcasted{BlockStyle{N},<:Any,typeof($op),<:Tuple{<:AbstractArray{<:Number,N},<:Number}}) where N
214211
A,x = bc.args
215-
_BlockArray(broadcast((a,x) -> broadcast($op, a, x), A.blocks,x), axes(A))
212+
_BlockArray(broadcast((a,x) -> broadcast($op, a, x), blocks(A),x), axes(A))
216213
end
217214
end
218215
end
216+
217+
# exploit special cases for *, for example, *(::Number, ::Diagonal)
218+
for op in (:*, :/)
219+
@eval @inline $op(A::BlockArray, x::Number) = _BlockArray($op(blocks(A),x), axes(A))
220+
end
221+
for op in (:*, :\)
222+
@eval @inline $op(x::Number, A::BlockArray) = _BlockArray($op(x,blocks(A)), axes(A))
223+
end
224+
225+
###
226+
# SubViews
227+
###
228+
229+
_blocktype(::Type{<:BlockArray{<:Any,N,<:AbstractArray{R,N}}}) where {N,R} = R
230+
231+
BroadcastStyle(::Type{<:SubArray{T,N,Arr,<:NTuple{N,BlockSlice1},false}}) where {T,N,Arr<:BlockArray} =
232+
BroadcastStyle(_blocktype(Arr))
233+
BroadcastStyle(::Type{<:SubArray{T,N,Arr,<:NTuple{N,BlockSlice{BlockRange{1,Tuple{II}}}},false}}) where {T,N,Arr<:BlockArray,II} =
234+
BroadcastStyle(Arr)

src/blockindices.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,17 @@ Block(n::NTuple{N, T}) where {N,T} = Block{N, T}(n)
3535
Block{N, T}(ntuple(i -> blocks[i].n[1], Val(N)))
3636
end
3737

38+
# iterate and broadcast like Number
39+
length(b::Block) = 1
40+
size(b::Block) = ()
41+
iterate(x::Block) = (x, nothing)
42+
iterate(x::Block, ::Any) = nothing
43+
isempty(x::Block) = false
44+
broadcastable(x::Block) = x
45+
ndims(::Type{<:Block}) = 0
46+
ndims(::Block) = 0
47+
eltype(::Type{B}) where B<:Block = B
48+
getindex(B::Block, ::CartesianIndex{0}) = B
3849

3950
# The following code is taken from CartesianIndex
4051
@inline (+)(index::Block{N}) where {N} = Block{N}(map(+, index.n))
@@ -295,6 +306,7 @@ BlockRange(inds::Vararg{AbstractUnitRange{Int},N}) where {N} =
295306
Base.BroadcastStyle(::Type{<:BlockRange{1}}) = DefaultArrayStyle{1}()
296307
broadcasted(::DefaultArrayStyle{1}, ::Type{Block}, r::AbstractUnitRange) = Block(first(r)):Block(last(r))
297308
broadcasted(::DefaultArrayStyle{1}, ::Type{Int}, block_range::BlockRange{1}) = first(block_range.indices)
309+
broadcasted(::DefaultArrayStyle{0}, ::Type{Int}, block::Block{1}) = Int(block)
298310

299311

300312
# AbstractArray implementation

src/blocklinalg.jl

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ gives an iterator containing the possible non-zero blocks in the k-th block-row
77
blockrowsupport(A, k) = blockrowsupport(MemoryLayout(A), A, k)
88
blockrowsupport(A) = blockrowsupport(A, blockaxes(A,1))
99

10-
blockcolsupport(_, A, j) = blockaxes(A,1)
10+
blockcolsupport(_, A, j) = Block.(colsupport(blocks(A), Int.(j)))
1111

1212
""""
1313
blockcolsupport(A, j)
@@ -28,24 +28,41 @@ end
2828

2929

3030
abstract type AbstractBlockLayout <: MemoryLayout end
31-
struct BlockLayout{LAY} <: AbstractBlockLayout end
31+
struct BlockLayout{ArrLay,BlockLay} <: AbstractBlockLayout end
3232

33+
function colsupport(::BlockLayout, A, j)
34+
JR = Int(findblock(axes(A,2), minimum(j))):Int(findblock(axes(A,2), maximum(j)))
35+
KR = colsupport(blocks(A), JR)
36+
axes(A,1)[Block.(KR)]
37+
end
38+
39+
function rowsupport(::BlockLayout, A, k)
40+
KR = Int(findblock(axes(A,1), minimum(k))):Int(findblock(axes(A,1), maximum(k)))
41+
JR = rowsupport(blocks(A), KR)
42+
axes(A,2)[Block.(JR)]
43+
end
3344

34-
similar(M::MulAdd{<:AbstractBlockLayout,<:AbstractBlockLayout}, ::Type{T}, axes) where {T,N} =
45+
similar(M::MulAdd{<:AbstractBlockLayout,<:AbstractBlockLayout}, ::Type{T}, axes) where {T,N} =
3546
similar(BlockArray{T}, axes)
3647

3748
MemoryLayout(::Type{<:PseudoBlockArray{T,N,R}}) where {T,N,R} = MemoryLayout(R)
38-
MemoryLayout(::Type{<:BlockArray{T,N,R}}) where {T,N,R} = BlockLayout{typeof(MemoryLayout(R))}()
49+
MemoryLayout(::Type{<:BlockArray{T,N,R}}) where {T,N,D,R<:AbstractArray{D,N}} =
50+
BlockLayout{typeof(MemoryLayout(R)),typeof(MemoryLayout(D))}()
3951

40-
sublayout(::BlockLayout{LAY}, ::Type{NTuple{N,BlockSlice1}}) where {LAY,N} = LAY()
41-
sublayout(BL::BlockLayout, ::Type{<:NTuple{N,BlockSlice}}) where N = BL
52+
sublayout(::BlockLayout{MLAY,BLAY}, ::Type{NTuple{N,BlockSlice1}}) where {MLAY,BLAY,N} = BLAY()
53+
sublayout(BL::BlockLayout{MLAY,BLAY}, ::Type{<:NTuple{N,<:BlockSlice{BlockRange{1,Tuple{II}}}}}) where {N,MLAY,BLAY,II} =
54+
BlockLayout{typeof(sublayout(MLAY(),NTuple{N,II})), BLAY}()
55+
sublayout(BL::BlockLayout{MLAY,BLAY}, ::Type{<:Tuple{BlockSlice1,<:BlockSlice{BlockRange{1,Tuple{II}}}}}) where {MLAY,BLAY,II} =
56+
BlockLayout{typeof(sublayout(MLAY(),Tuple{Int,II})), BLAY}()
57+
sublayout(BL::BlockLayout{MLAY,BLAY}, ::Type{<:Tuple{<:BlockSlice{BlockRange{1,Tuple{II}}},BlockSlice1}}) where {MLAY,BLAY,II} =
58+
BlockLayout{typeof(sublayout(MLAY(),Tuple{II,Int})), BLAY}()
4259

43-
conjlayout(::Type{T}, ::BlockLayout{LAY}) where {T<:Complex,LAY} = BlockLayout{typeof(conjlayout(T,LAY()))}()
44-
conjlayout(::Type{T}, ::BlockLayout{LAY}) where {T<:Real,LAY} = BlockLayout{LAY}()
45-
46-
transposelayout(::BlockLayout{LAY}) where LAY = BlockLayout{typeof(transposelayout(LAY()))}()
4760

61+
conjlayout(::Type{T}, ::BlockLayout{MLAY,BLAY}) where {T<:Complex,MLAY,BLAY} = BlockLayout{MLAY,typeof(conjlayout(T,BLAY()))}()
62+
conjlayout(::Type{T}, ::BlockLayout{MLAY,BLAY}) where {T<:Real,MLAY,BLAY} = BlockLayout{MLAY,BLAY}()
4863

64+
transposelayout(::BlockLayout{MLAY,BLAY}) where {MLAY,BLAY} =
65+
BlockLayout{typeof(transposelayout(MLAY())),typeof(transposelayout(BLAY()))}()
4966

5067
#############
5168
# BLAS overrides
@@ -78,10 +95,10 @@ function _block_muladd!(α, A, X, β, Y)
7895
muladd!(α, view(A,K,N), view(X,N,J), one(α), view(Y,K,J))
7996
end
8097
Y
81-
end
98+
end
8299

83-
mul_blockscompatible(A, B, C) = blockisequal(axes(A,2), axes(B,1)) &&
84-
blockisequal(axes(A,1), axes(C,1)) &&
100+
mul_blockscompatible(A, B, C) = blockisequal(axes(A,2), axes(B,1)) &&
101+
blockisequal(axes(A,1), axes(C,1)) &&
85102
blockisequal(axes(B,2), axes(C,2))
86103

87104
function materialize!(M::MatMulMatAdd{<:AbstractBlockLayout,<:AbstractBlockLayout,<:AbstractBlockLayout})
@@ -193,7 +210,7 @@ for UNIT in ('U', 'N')
193210

194211
A = triangulardata(U)
195212
if !hasmatchingblocks(A) # Use default for now
196-
return materialize!(Ldiv{TriangularLayout{'U',$UNIT,UnknownLayout},
213+
return materialize!(Ldiv{TriangularLayout{'U',$UNIT,UnknownLayout},
197214
typeof(MemoryLayout(dest))}(U, dest))
198215
end
199216

@@ -226,7 +243,7 @@ for UNIT in ('U', 'N')
226243
T = eltype(dest)
227244
A = triangulardata(L)
228245
if !hasmatchingblocks(A) # Use default for now
229-
return materialize!(Ldiv{TriangularLayout{'L',$UNIT,UnknownLayout},
246+
return materialize!(Ldiv{TriangularLayout{'L',$UNIT,UnknownLayout},
230247
typeof(MemoryLayout(dest))}(L, dest))
231248
end
232249

src/blocks.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,10 @@ blocks(A::Adjoint) = adjoint(blocks(parent(A)))
5252
blocks(A::Transpose) = transpose(blocks(parent(A)))
5353

5454
# convert a tuple of BlockRange to a tuple of `AbstractUnitRange{Int}`
55+
_block2int(B::Block{1}) = Int(B):Int(B)
56+
_block2int(B::BlockRange{1}) = Int.(B)
5557
_blockrange2int() = ()
56-
_blockrange2int(A, B...) = tuple(Int.(A.block), _blockrange2int(B...)...)
58+
_blockrange2int(A, B...) = tuple(_block2int(A.block), _blockrange2int(B...)...)
5759

5860
blocks(A::SubArray{<:Any,N,<:Any,<:NTuple{N,BlockSlice}}) where N =
5961
view(blocks(parent(A)), _blockrange2int(parentindices(A)...)...)

src/pseudo_blockarray.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,3 +321,11 @@ end
321321
Base.strides(A::PseudoBlockArray) = strides(A.blocks)
322322
Base.stride(A::PseudoBlockArray, i::Integer) = stride(A.blocks, i)
323323
Base.unsafe_convert(::Type{Ptr{T}}, A::PseudoBlockArray) where T = Base.unsafe_convert(Ptr{T}, A.blocks)
324+
325+
326+
###
327+
# col/rowsupport
328+
###
329+
330+
colsupport(A::PseudoBlockArray, j) = colsupport(A.blocks, j)
331+
rowsupport(A::PseudoBlockArray, j) = rowsupport(A.blocks, j)

src/show.jl

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,6 @@ function _blockarray_print_matrix_row(io::IO,
8888
end
8989
end
9090

91-
92-
Base.print_matrix_row(io::IO,
93-
X::AbstractBlockVecOrMat, A::Vector,
94-
i::Integer, cols::AbstractVector, sep::AbstractString) =
95-
_blockarray_print_matrix_row(io, X, A, i, cols, sep)
96-
9791
function _show_typeof(io::IO, a::BlockArray{T,N,Array{Array{T,N},N},NTuple{N,DefaultBlockAxis}}) where {T,N}
9892
Base.show_type_name(io, typeof(a).name)
9993
print(io, '{')
@@ -103,6 +97,20 @@ function _show_typeof(io::IO, a::BlockArray{T,N,Array{Array{T,N},N},NTuple{N,Def
10397
print(io, '}')
10498
end
10599

100+
# LayoutArray with blocked axes will dispatch to here
101+
axes_print_matrix_row(::Tuple{BlockedUnitRange}, io, X, A, i, cols, sep) =
102+
_blockarray_print_matrix_row(io, X, A, i, cols, sep)
103+
axes_print_matrix_row(::NTuple{2,BlockedUnitRange}, io, X, A, i, cols, sep) =
104+
_blockarray_print_matrix_row(io, X, A, i, cols, sep)
105+
axes_print_matrix_row(::Tuple{AbstractUnitRange,BlockedUnitRange}, io, X, A, i, cols, sep) =
106+
_blockarray_print_matrix_row(io, X, A, i, cols, sep)
107+
axes_print_matrix_row(::Tuple{BlockedUnitRange,AbstractUnitRange}, io, X, A, i, cols, sep) =
108+
_blockarray_print_matrix_row(io, X, A, i, cols, sep)
109+
110+
# Need to handled BlockedUnitRange, which is not a LayoutVector
111+
Base.print_matrix_row(io::IO, X::BlockedUnitRange, A::Vector, i::Integer, cols::AbstractVector, sep::AbstractString) =
112+
_blockarray_print_matrix_row(io, X, A, i, cols, sep)
113+
106114
function _show_typeof(io::IO, a::PseudoBlockArray{T,N,Array{T,N},NTuple{N,DefaultBlockAxis}}) where {T,N}
107115
Base.show_type_name(io, typeof(a).name)
108116
print(io, '{')
@@ -112,13 +120,7 @@ function _show_typeof(io::IO, a::PseudoBlockArray{T,N,Array{T,N},NTuple{N,Defaul
112120
print(io, '}')
113121
end
114122

115-
116123
## Cumsum
117124

118-
Base.print_matrix_row(io::IO,
119-
X::BlockedUnitRange, A::Vector,
120-
i::Integer, cols::AbstractVector, sep::AbstractString) =
121-
_blockarray_print_matrix_row(io, X, A, i, cols, sep)
122-
123125
Base.show(io::IO, mimetype::MIME"text/plain", a::BlockedUnitRange) =
124126
Base.invoke(show, Tuple{typeof(io),MIME"text/plain",AbstractArray},io, mimetype, a)

test/test_blockarrayinterface.jl

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using BlockArrays, LinearAlgebra, Base64
1+
using BlockArrays, LinearAlgebra, FillArrays, Base64
22

33
struct PartiallyImplementedBlockVector <: AbstractBlockArray{Float64,1} end
44

@@ -79,3 +79,26 @@ end
7979
@test A isa BlockMatrix{Int,Matrix{Matrix{Int}},Tuple{BlockedUnitRange{StepRange{Int64,Int64}},BlockedUnitRange{Vector{Int}}}}
8080
end
8181

82+
@testset "block Fill" begin
83+
A = Fill(2,(blockedrange([1,2,2]),))
84+
@test A[Block(1)] == [2]
85+
@test A[Block.(1:2)] == [2,2,2]
86+
@test_broken A[Block(1)] isa Fill
87+
@test_broken A[Block.(1:2)] isa Fill
88+
@test_broken 2A
89+
90+
91+
B = Eye((blockedrange([1,2]),))
92+
@test B[Block(2,2)] == Matrix(I,2,2)
93+
94+
C = Eye((blockedrange([1,2,2]),blockedrange([2,2])))
95+
@test C[Block(2,2)] == [0 0; 1.0 0]
96+
97+
U = UpperTriangular(Ones((blockedrange([1,2]),blockedrange([2,1]))))
98+
99+
if VERSION  v"1.2"
100+
@test stringmime("text/plain", A) == "5-element Fill{Int64,1,Tuple{BlockedUnitRange{Array{Int64,1}}}} with indices 1:1:5:\n 2\n\n 2\n 2\n\n 2\n 2"
101+
@test stringmime("text/plain", B) == "3×3 Diagonal{Float64,Ones{Float64,1,Tuple{BlockedUnitRange{Array{Int64,1}}}}} with indices 1:1:3×1:1:3:\n 1.0 │ ⋅ ⋅ \n ─────┼──────────\n ⋅ │ 1.0 ⋅ \n ⋅ │ ⋅ 1.0"
102+
@test stringmime("text/plain", U) == "3×3 UpperTriangular{Float64,Ones{Float64,2,Tuple{BlockedUnitRange{Array{Int64,1}},BlockedUnitRange{Array{Int64,1}}}}} with indices 1:1:3×1:1:3:\n 1.0 1.0 │ 1.0\n ──────────┼─────\n ⋅ 1.0 │ 1.0\n ⋅ ⋅ │ 1.0"
103+
end
104+
end

test/test_blockbroadcast.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,4 +119,16 @@ using BlockArrays, FillArrays, Test
119119
C = BlockArray(randn(6), (BlockArrays._BlockedUnitRange(1,2:6),))
120120
@test axes(A+C,1) === BlockArrays._BlockedUnitRange(1,1:6)
121121
end
122+
123+
@testset "Views" begin
124+
A = BlockArray(randn(6), 1:3)
125+
@test Base.BroadcastStyle(typeof(view(A, Block(2)))) isa Base.Broadcast.DefaultArrayStyle{1}
126+
V = view(A, Block.(2:3))
127+
@test Base.BroadcastStyle(typeof(V)) isa BlockArrays.BlockStyle{1}
128+
@test V .+ 1 isa BlockArray
129+
@test 1 .+ V isa BlockArray
130+
@test V .+ 1 == 1 .+ V == A[Block.(2:3)] .+ 1
131+
@test -V isa BlockArray
132+
@test -V == -A[Block.(2:3)]
133+
end
122134
end

0 commit comments

Comments
 (0)