#481 possibly broke `ishermitian`
还没有人认领这个 Issue。
评估
调研方向
复现 issue 中的失败,然后阅读由检查 A[i,j] != adjoint(A[j,i]) 和堆栈帧 LinearAlgebra cholesky.jl 所涉及的 ishermitian 相关逻辑。比较普通值和 ForwardDiff.Dual 值的行为,包括其他受影响的方法是否也能复现该问题。完成的标准是,报告中的 cholesky 路径不再拒绝 Hermitian Dual 矩阵,并且回归测试覆盖能够保护这一行为。
由索引模型根据 Issue 内容生成。
描述
After #481 , ishermitian is now broken (maybe other methods too?) when working with ForwardDiff.Dual.
julia> Pkg.status()
Status `/tmp/jl_gs3tnK/Project.toml`
[f6369f11] ForwardDiff v0.10.33
[37e2e46d] LinearAlgebra
julia> using LinearAlgebra, ForwardDiff
julia> x = [1 0.5; 0.5 1]
2×2 Matrix{Float64}:
1.0 0.5
0.5 1.0
julia> ishermitian(x)
true
julia> f(x) = sum(cholesky(reshape(x, 2, 2)))
f (generic function with 1 method)
julia> ForwardDiff.gradient(vec(x))
ERROR: MethodError: no method matching gradient(::Vector{Float64})
Closest candidates are:
gradient(::Any, ::StaticArraysCore.StaticArray) at ~/.julia/packages/ForwardDiff/eqMFf/src/gradient.jl:44
gradient(::Any, ::StaticArraysCore.StaticArray, ::ForwardDiff.GradientConfig) at ~/.julia/packages/ForwardDiff/eqMFf/src/gradient.jl:45
gradient(::Any, ::StaticArraysCore.StaticArray, ::ForwardDiff.GradientConfig, ::Val) at ~/.julia/packages/ForwardDiff/eqMFf/src/gradient.jl:46
...
Stacktrace:
[1] top-level scope
@ REPL[10]:1
julia> ForwardDiff.gradient(f, vec(x))
ERROR: PosDefException: matrix is not Hermitian; Cholesky factorization failed.
Stacktrace:
[1] checkpositivedefinite(info::Int64)
@ LinearAlgebra /opt/julia-1.8.2/share/julia/stdlib/v1.8/LinearAlgebra/src/factorization.jl:18
[2] cholesky!(A::Matrix{ForwardDiff.Dual{ForwardDiff.Tag{typeof(f), Float64}, Float64, 4}}, ::NoPivot; check::Bool)
@ LinearAlgebra /opt/julia-1.8.2/share/julia/stdlib/v1.8/LinearAlgebra/src/cholesky.jl:299
[3] #cholesky#162
@ /opt/julia-1.8.2/share/julia/stdlib/v1.8/LinearAlgebra/src/cholesky.jl:402 [inlined]
[4] cholesky (repeats 2 times)
@ /opt/julia-1.8.2/share/julia/stdlib/v1.8/LinearAlgebra/src/cholesky.jl:402 [inlined]
[5] f(x::Vector{ForwardDiff.Dual{ForwardDiff.Tag{typeof(f), Float64}, Float64, 4}})
@ Main ./REPL[9]:1
[6] vector_mode_dual_eval!
@ ~/.julia/packages/ForwardDiff/eqMFf/src/apiutils.jl:37 [inlined]
[7] vector_mode_gradient(f::typeof(f), x::Vector{Float64}, cfg::ForwardDiff.GradientConfig{ForwardDiff.Tag{typeof(f), Float64}, Float64, 4, Vector{ForwardDiff.Dual{ForwardDiff.Tag{typeof(f), Float64}, Float64, 4}}})
@ ForwardDiff ~/.julia/packages/ForwardDiff/eqMFf/src/gradient.jl:106
[8] gradient(f::Function, x::Vector{Float64}, cfg::ForwardDiff.GradientConfig{ForwardDiff.Tag{typeof(f), Float64}, Float64, 4, Vector{ForwardDiff.Dual{ForwardDiff.Tag{typeof(f), Float64}, Float64, 4}}}, ::Val{true})
@ ForwardDiff ~/.julia/packages/ForwardDiff/eqMFf/src/gradient.jl:19
[9] gradient(f::Function, x::Vector{Float64}, cfg::ForwardDiff.GradientConfig{ForwardDiff.Tag{typeof(f), Float64}, Float64, 4, Vector{ForwardDiff.Dual{ForwardDiff.Tag{typeof(f), Float64}, Float64, 4}}}) (repeats 2 times)
@ ForwardDiff ~/.julia/packages/ForwardDiff/eqMFf/src/gradient.jl:17
[10] top-level scope
@ REPL[11]:1
This is because now the A[i,j] != adjoint(A[j,i]) check performed in ishermitian returns true.
- 主要语言
- Julia
- 星标
- 1k
- 派生
- 162
- PR 合并指标
- 30 天内没有已合并 PR
环境准备
这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
JuliaDiff/ForwardDiff.jl 的其他 Issue
-
missing floatmin, floatmax, and issubnormal for Dual可能已有人在做 @devmotion 于 18 天前认领。 未关闭
难度 2/5 1-3 小时 新手友好度 68/100
JuliaDiff/ForwardDiff.jl#852 · 6 条评论 ·
-
`fma` and `muladd` ignore NaN-safe mode可能已有人在做 @devmotion 于 4 天前认领。 未关闭
难度 3/5 1-2 天 新手友好度 55/100
JuliaDiff/ForwardDiff.jl#860 ·
-
Enable NaN-safe mode by default可能已有人在做 @devmotion 于 6 天前认领。 未关闭
难度 5/5 一周以上 新手友好度 25/100
JuliaDiff/ForwardDiff.jl#857 · 1 个 reaction ·
-
难度 4/5 3-5 天 新手友好度 52/100
JuliaDiff/ForwardDiff.jl#854 · 1 条评论 ·
-
难度 3/5 1-2 天 新手友好度 75/100
JuliaDiff/ForwardDiff.jl#849 ·
查看 JuliaDiff/ForwardDiff.jl 的全部 Issue
相似的 Issue
-
OptimizationCUTEst jobs fail: gfortran not installed on the runner可能已有人在做 @ChrisRackauckas-Claude 今天认领。 未关闭
难度 2/5 1-3 小时 新手友好度 68/100
SciML/SciMLBenchmarks.jl#1946 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 75/100
JuliaSmoothOptimizers/NCL.jl#101 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 69/100
-
难度 2/5 1-3 小时 新手友好度 66/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 78/100
WaterLily-jl/WaterLily.jl#367 ·
维护者通常 1 天内回复