BlockArrays.jl
BlockArrays.jl copied to clipboard
Stack overflow when copying nested block array
Reproducing example:
eachblockrow(x) = (view(x,b,:) for b in blockaxes(x,1))
f(x) = x # just for illustrating use case
m = mortar([mortar([rand(1,j) for k=1:i, _=1:1]) for i=2:4, j=3:5])
Matrix(m) # fine
m_f = mortar(reduce(vcat, blocks.(f.(eachblockrow(m)))))
Matrix(m_f) # stack overflow
It helps to include stack traces in bug reports. E.g. this would have been better:
julia> using BlockArrays
julia> eachblockrow(x) = (view(x,b,:) for b in blockaxes(x,1))
eachblockrow (generic function with 1 method)
julia> f(x) = x # just for illustrating use case
f (generic function with 1 method)
julia> m = mortar([mortar([rand(1,j) for k=1:i, _=1:1]) for i=2:4, j=3:5])
3×3-blocked 9×12 BlockMatrix{Float64, Matrix{BlockMatrix{Float64, Matrix{Matrix{Float64}}, Tuple{BlockedUnitRange{Vector{Int64}}, BlockedUnitRange{Vector{Int64}}}}}, Tuple{BlockedUnitRange{Vector{Int64}}, BlockedUnitRange{Vector{Int64}}}}:
0.335993 0.46258 0.215764 │ 0.881465 … 0.292249 0.318854 0.348607 │
0.107237 0.907918 0.144592 │ 0.289386
──────────────────────────────┼────────── 0.5469 0.695448 0.652414 │
─────────────────────────────────┼
0.3406 0.273304 0.616601 │ 0.253286 0.292574 0.609904 0.545737 │
0.720938 0.987797 0.825817 │ 0.357351 0.908202 0.512204 0.0345004 │
0.784223 0.740571 0.344034 │ 0.683179
──────────────────────────────┼────────── 0.309444 0.70473 0.835635 │
─────────────────────────────────┼
0.504948 0.567463 0.229454 │ 0.51395 … 0.0756008 0.466699 0.507445 │
0.367456 0.323275 0.652158 │ 0.412241 0.0846436 0.447001 0.708571 │
0.478854 0.346063 0.756038 │ 0.851747 0.384022 0.0983358 0.136107 │
0.486374 0.349513 0.867678 │ 0.773139 0.971551 0.0714312 0.537585 │
julia> Matrix(m) # fine
9×12 Matrix{Float64}:
0.335993 0.46258 0.215764 0.881465 … 0.292249 0.318854 0.348607
0.107237 0.907918 0.144592 0.289386 0.5469 0.695448 0.652414
0.3406 0.273304 0.616601 0.253286 0.292574 0.609904 0.545737
0.720938 0.987797 0.825817 0.357351 0.908202 0.512204 0.0345004
0.784223 0.740571 0.344034 0.683179 0.309444 0.70473 0.835635
0.504948 0.567463 0.229454 0.51395 … 0.0756008 0.466699 0.507445
0.367456 0.323275 0.652158 0.412241 0.0846436 0.447001 0.708571
0.478854 0.346063 0.756038 0.851747 0.384022 0.0983358 0.136107
0.486374 0.349513 0.867678 0.773139 0.971551 0.0714312 0.537585
julia> m_f = mortar(reduce(vcat, blocks.(f.(eachblockrow(m)))))
3×3-blocked 9×12 BlockMatrix{Float64, Matrix{AbstractMatrix{Float64}}, Tuple{BlockedUnitRange{Vector{Int64}}, BlockedUnitRange{Vector{Int64}}}}:
0.335993 0.46258 0.215764 │ 0.881465 … 0.292249 0.318854 0.348607 │
0.107237 0.907918 0.144592 │ 0.289386
──────────────────────────────┼────────── 0.5469 0.695448 0.652414 │
─────────────────────────────────┼
0.3406 0.273304 0.616601 │ 0.253286 0.292574 0.609904 0.545737 │
0.720938 0.987797 0.825817 │ 0.357351 0.908202 0.512204 0.0345004 │
0.784223 0.740571 0.344034 │ 0.683179
──────────────────────────────┼────────── 0.309444 0.70473 0.835635 │
─────────────────────────────────┼
0.504948 0.567463 0.229454 │ 0.51395 … 0.0756008 0.466699 0.507445 │
0.367456 0.323275 0.652158 │ 0.412241 0.0846436 0.447001 0.708571 │
0.478854 0.346063 0.756038 │ 0.851747 0.384022 0.0983358 0.136107 │
0.486374 0.349513 0.867678 │ 0.773139 0.971551 0.0714312 0.537585 │
julia> Matrix(m_f) # stack overflow
ERROR: StackOverflowError:
Stacktrace:
[1] Array
@ ./boot.jl:448 [inlined]
[2] Array
@ ./boot.jl:457 [inlined]
[3] similar
@ ./abstractarray.jl:785 [inlined]
[4] similar
@ ./abstractarray.jl:784 [inlined]
[5] _array_for
@ ./array.jl:670 [inlined]
[6] vect
@ ./array.jl:108 [inlined]
[7] blocklasts
@ ~/.julia/packages/BlockArrays/rGDmR/src/blockaxis.jl:278 [inlined]
[8] blockisequal(a::Base.OneTo{Int64}, b::Base.OneTo{Int64})
@ BlockArrays ~/.julia/packages/BlockArrays/rGDmR/src/blockaxis.jl:72
[9] _broadcast_getindex_evalf
@ ./broadcast.jl:648 [inlined]
[10] _broadcast_getindex
@ ./broadcast.jl:621 [inlined]
[11] #19
@ ./broadcast.jl:1098 [inlined]
[12] ntuple
@ ./ntuple.jl:49 [inlined]
[13] copy
@ ./broadcast.jl:1098 [inlined]
[14] materialize
@ ./broadcast.jl:883 [inlined]
[15] blockisequal
@ ~/.julia/packages/BlockArrays/rGDmR/src/blockaxis.jl:79 [inlined]
[16] _copyto!(#unused#::ArrayLayouts.ColumnMajor, #unused#::BlockArrays.BlockLayout{ArrayLayouts.DenseColumnMajor, ArrayLayouts.DenseColumnMajor}, dest::SubArray{Float64, 2, Matrix{Float64}, Tuple{UnitRange{Int64}, UnitRange{Int64}}, false}, src::SubArray{Float64, 2, BlockMatrix{Float64, Matrix{BlockMatrix{Float64, Matrix{Matrix{Float64}}, Tuple{BlockedUnitRange{Vector{Int64}}, BlockedUnitRange{Vector{Int64}}}}}, Tuple{BlockedUnitRange{Vector{Int64}}, BlockedUnitRange{Vector{Int64}}}}, Tuple{BlockArrays.BlockSlice{Block{1, Int64}, UnitRange{Int64}}, BlockArrays.BlockSlice{Block{1, Int64}, UnitRange{Int64}}}, false})
@ BlockArrays ~/.julia/packages/BlockArrays/rGDmR/src/blocklinalg.jl:128
[17] _copyto!
@ ~/.julia/packages/ArrayLayouts/3lnt1/src/ArrayLayouts.jl:209 [inlined]
[18] copyto!(dest::SubArray{Float64, 2, Matrix{Float64}, Tuple{UnitRange{Int64}, UnitRange{Int64}}, false}, src::SubArray{Float64, 2, BlockMatrix{Float64, Matrix{BlockMatrix{Float64, Matrix{Matrix{Float64}}, Tuple{BlockedUnitRange{Vector{Int64}}, BlockedUnitRange{Vector{Int64}}}}}, Tuple{BlockedUnitRange{Vector{Int64}}, BlockedUnitRange{Vector{Int64}}}}, Tuple{BlockArrays.BlockSlice{Block{1, Int64}, UnitRange{Int64}}, BlockArrays.BlockSlice{Block{1, Int64}, UnitRange{Int64}}}, false})
@ ArrayLayouts ~/.julia/packages/ArrayLayouts/3lnt1/src/ArrayLayouts.jl:218
[19] _copyto!(#unused#::ArrayLayouts.ColumnMajor, #unused#::BlockArrays.BlockLayout{ArrayLayouts.DenseColumnMajor, ArrayLayouts.DenseColumnMajor}, dest::SubArray{Float64, 2, Matrix{Float64}, Tuple{UnitRange{Int64}, UnitRange{Int64}}, false}, src::SubArray{Float64, 2, BlockMatrix{Float64, Matrix{BlockMatrix{Float64, Matrix{Matrix{Float64}}, Tuple{BlockedUnitRange{Vector{Int64}}, BlockedUnitRange{Vector{Int64}}}}}, Tuple{BlockedUnitRange{Vector{Int64}}, BlockedUnitRange{Vector{Int64}}}}, Tuple{BlockArrays.BlockSlice{Block{1, Int64}, UnitRange{Int64}}, BlockArrays.BlockSlice{Block{1, Int64}, UnitRange{Int64}}}, false})
@ BlockArrays ~/.julia/packages/BlockArrays/rGDmR/src/blocklinalg.jl:135
--- the last 3 lines are repeated 11377 more times ---
[34151] _copyto!
@ ~/.julia/packages/ArrayLayouts/3lnt1/src/ArrayLayouts.jl:209 [inlined]
[34152] copyto!(dest::PseudoBlockMatrix{Float64, Matrix{Float64}, Tuple{BlockedUnitRange{Vector{Int64}}, BlockedUnitRange{Vector{Int64}}}}, src::BlockMatrix{Float64, Matrix{AbstractMatrix{Float64}}, Tuple{BlockedUnitRange{Vector{Int64}}, BlockedUnitRange{Vector{Int64}}}})
@ ArrayLayouts ~/.julia/packages/ArrayLayouts/3lnt1/src/ArrayLayouts.jl:210
[34153] _copyto!(#unused#::ArrayLayouts.DenseColumnMajor, #unused#::BlockArrays.BlockLayout{ArrayLayouts.DenseColumnMajor, ArrayLayouts.UnknownLayout}, dest::Matrix{Float64}, src::BlockMatrix{Float64, Matrix{AbstractMatrix{Float64}}, Tuple{BlockedUnitRange{Vector{Int64}}, BlockedUnitRange{Vector{Int64}}}})
@ BlockArrays ~/.julia/packages/BlockArrays/rGDmR/src/blocklinalg.jl:130
[34154] _copyto!
@ ~/.julia/packages/ArrayLayouts/3lnt1/src/ArrayLayouts.jl:209 [inlined]
[34155] copyto!
@ ~/.julia/packages/ArrayLayouts/3lnt1/src/ArrayLayouts.jl:211 [inlined]
[34156] copyto_axcheck!
@ ./abstractarray.jl:1056 [inlined]
[34157] Matrix{Float64}(x::BlockMatrix{Float64, Matrix{AbstractMatrix{Float64}}, Tuple{BlockedUnitRange{Vector{Int64}}, BlockedUnitRange{Vector{Int64}}}})
@ Base ./array.jl:540
[34158] (Matrix{T} where T)(x::BlockMatrix{Float64, Matrix{AbstractMatrix{Float64}}, Tuple{BlockedUnitRange{Vector{Int64}}, BlockedUnitRange{Vector{Int64}}}})
@ Core ./boot.jl:470