BlockArrays.jl icon indicating copy to clipboard operation
BlockArrays.jl copied to clipboard

Stack overflow when copying nested block array

Open yha opened this issue 4 years ago • 1 comments

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

yha avatar Aug 26 '21 12:08 yha

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

dlfivefifty avatar Aug 30 '21 07:08 dlfivefifty