Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

StackOverflowError: infinite call loop between LazyArrays and ArrayLayouts

未关闭
#55 2 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
3-5 天
新手友好度
35/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
停滞
技术栈
julia
领域
data

调研方向

重现该示例,并检查 LazyArrays/src/linalg/mul.jl 以及 ArrayLayouts/src/mul.jl 和 ArrayLayouts/src/ArrayLayouts.jl,此处 stack trace 进入了递归 materialization 路径。确定为什么这个嵌套乘法会持续在两个 package 之间进行 dispatch;对于所报告的表达式,当 Matrix(A) materialize 且不出现 StackOverflowError 时,即视为完成。

由索引模型根据 Issue 内容生成。

描述

julia> A = zeros(1,1) * BandedMatrix(0=>Zeros(∞))[1:1,1:1] * zeros(1,1)
(1×1 Array{Float64,2}) * (1×1 BandedMatrix{Float64} with bandwidths (0, 0) with data (1×0 view(::Array{Float64,2}, 1:1, 1:0) with eltype Float64) * (0×1 view(::LazyArrays.ApplyArray{Float64,2,typeof(vcat),Tuple{Zeros{Float64,2,Tuple{Base.OneTo{Int64},InfiniteArrays.OneToInf{Int64}}}}}, 1:0, 1:1) with eltype Float64)) * (1×1 Array{Float64,2}):
 0.0

julia> Matrix(A)
ERROR: StackOverflowError:
Stacktrace:
 [1] simplify at C:\Users\pty\.julia\packages\LazyArrays\6zNYO\src\linalg\mul.jl:290 [inlined]
 [2] simplify(::ArrayLayouts.Mul{LazyArrays.ApplyLayout{typeof(*)},ArrayLayouts.DenseColumnMajor,LazyArrays.ApplyArray{Float64,2,typeof(*),Tuple{Array{Float64,2},BandedMatrix{Float64,LazyArrays.ApplyArray{Float64,2,typeof(*),Tuple{SubArray{Float64,2,Array{Float64,2},Tuple{UnitRange{Int64},UnitRange{Int64}},false},SubArray{Float64,2,LazyArrays.ApplyArray{Float64,2,typeof(vcat),Tuple{Zeros{Float64,2,Tuple{Base.OneTo{Int64},InfiniteArrays.OneToInf{Int64}}}}},Tuple{UnitRange{Int64},UnitRange{Int64}},false}}},Base.OneTo{Int64}}}},Array{Float64,2}}) at C:\Users\pty\.julia\packages\LazyArrays\6zNYO\src\linalg\mul.jl:300       
 [3] copy at C:\Users\pty\.julia\packages\LazyArrays\6zNYO\src\linalg\mul.jl:305 [inlined]
 [4] materialize at C:\Users\pty\.julia\packages\ArrayLayouts\ATRic\src\mul.jl:105 [inlined]
 [5] mul at C:\Users\pty\.julia\packages\ArrayLayouts\ATRic\src\mul.jl:106 [inlined]
 [6] * at C:\Users\pty\.julia\packages\ArrayLayouts\ATRic\src\mul.jl:170 [inlined]
 [7] * at .\operators.jl:538 [inlined]
 [8] _default_materialize at C:\Users\pty\.julia\packages\LazyArrays\6zNYO\src\lazyapplying.jl:86 [inlined]
 [9] copy at C:\Users\pty\.julia\packages\LazyArrays\6zNYO\src\lazyapplying.jl:89 [inlined]
 [10] materialize at C:\Users\pty\.julia\packages\LazyArrays\6zNYO\src\lazyapplying.jl:81 [inlined]
 [11] copyto! at C:\Users\pty\.julia\packages\LazyArrays\6zNYO\src\lazyapplying.jl:92 [inlined]
 [12] _copyto! at C:\Users\pty\.julia\packages\LazyArrays\6zNYO\src\lazyapplying.jl:334 [inlined]
 [13] _copyto!(::Array{Float64,2}, ::LazyArrays.ApplyArray{Float64,2,typeof(*),Tuple{Array{Float64,2},BandedMatrix{Float64,LazyArrays.ApplyArray{Float64,2,typeof(*),Tuple{SubArray{Float64,2,Array{Float64,2},Tuple{UnitRange{Int64},UnitRange{Int64}},false},SubArray{Float64,2,LazyArrays.ApplyArray{Float64,2,typeof(vcat),Tuple{Zeros{Float64,2,Tuple{Base.OneTo{Int64},InfiniteArrays.OneToInf{Int64}}}}},Tuple{UnitRange{Int64},UnitRange{Int64}},false}}},Base.OneTo{Int64}},Array{Float64,2}}}) at C:\Users\pty\.julia\packages\ArrayLayouts\ATRic\src\ArrayLayouts.jl:169
 [14] copyto!(::Array{Float64,2}, ::LazyArrays.ApplyArray{Float64,2,typeof(*),Tuple{Array{Float64,2},BandedMatrix{Float64,LazyArrays.ApplyArray{Float64,2,typeof(*),Tuple{SubArray{Float64,2,Array{Float64,2},Tuple{UnitRange{Int64},UnitRange{Int64}},false},SubArray{Float64,2,LazyArrays.ApplyArray{Float64,2,typeof(vcat),Tuple{Zeros{Float64,2,Tuple{Base.OneTo{Int64},InfiniteArrays.OneToInf{Int64}}}}},Tuple{UnitRange{Int64},UnitRange{Int64}},false}}},Base.OneTo{Int64}},Array{Float64,2}}}) at C:\Users\pty\.julia\packages\ArrayLayouts\ATRic\src\ArrayLayouts.jl:171
 ... (the last 4 lines are repeated 21758 more times)
 [87047] copyto! at C:\Users\pty\.julia\packages\LazyArrays\6zNYO\src\lazyapplying.jl:92 [inlined]
 [87048] _copyto! at C:\Users\pty\.julia\packages\LazyArrays\6zNYO\src\lazyapplying.jl:334 [inlined]
 [87049] _copyto!(::Array{Float64,2}, ::LazyArrays.ApplyArray{Float64,2,typeof(*),Tuple{Array{Float64,2},BandedMatrix{Float64,LazyArrays.ApplyArray{Float64,2,typeof(*),Tuple{SubArray{Float64,2,Array{Float64,2},Tuple{UnitRange{Int64},UnitRange{Int64}},false},SubArray{Float64,2,LazyArrays.ApplyArray{Float64,2,typeof(vcat),Tuple{Zeros{Float64,2,Tuple{Base.OneTo{Int64},InfiniteArrays.OneToInf{Int64}}}}},Tuple{UnitRange{Int64},UnitRange{Int64}},false}}},Base.OneTo{Int64}},Array{Float64,2}}}) at C:\Users\pty\.julia\packages\ArrayLayouts\ATRic\src\ArrayLayouts.jl:169
 [87050] copyto! at C:\Users\pty\.julia\packages\ArrayLayouts\ATRic\src\ArrayLayouts.jl:171 [inlined]
 [87051] copyto_axcheck! at .\abstractarray.jl:946 [inlined]
 [87052] Array{Float64,2}(::LazyArrays.ApplyArray{Float64,2,typeof(*),Tuple{Array{Float64,2},BandedMatrix{Float64,LazyArrays.ApplyArray{Float64,2,typeof(*),Tuple{SubArray{Float64,2,Array{Float64,2},Tuple{UnitRange{Int64},UnitRange{Int64}},false},SubArray{Float64,2,LazyArrays.ApplyArray{Float64,2,typeof(vcat),Tuple{Zeros{Float64,2,Tuple{Base.OneTo{Int64},InfiniteArrays.OneToInf{Int64}}}}},Tuple{UnitRange{Int64},UnitRange{Int64}},false}}},Base.OneTo{Int64}},Array{Float64,2}}}) at .\array.jl:562
 [87053] Array{T,2} where T(::LazyArrays.ApplyArray{Float64,2,typeof(*),Tuple{Array{Float64,2},BandedMatrix{Float64,LazyArrays.ApplyArray{Float64,2,typeof(*),Tuple{SubArray{Float64,2,Array{Float64,2},Tuple{UnitRange{Int64},UnitRange{Int64}},false},SubArray{Float64,2,LazyArrays.ApplyArray{Float64,2,typeof(vcat),Tuple{Zeros{Float64,2,Tuple{Base.OneTo{Int64},InfiniteArrays.OneToInf{Int64}}}}},Tuple{UnitRange{Int64},UnitRange{Int64}},false}}},Base.OneTo{Int64}},Array{Float64,2}}}) at .\boot.jl:428

In the above example, the error won't happen with one of the following modifications:

  • Delete zeros(1,1), the first or the last or both.
  • Change BandedMatrix(0=>Zeros(∞))[1:1,1:1] to `BandedMatrix(0=>Zeros(∞)[1:1]).
主要语言
Julia
星标
57
派生
10
平均合并
1 天 9 小时
30 天内合并 PR
11

环境准备

这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

JuliaLinearAlgebra/ArrayLayouts.jl 的其他 Issue

查看 JuliaLinearAlgebra/ArrayLayouts.jl 的全部 Issue

相似的 Issue

更多 Julia Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。