#481 possibly broke `ishermitian`
まだ誰も着手していません。
評価
調査の方向性
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 にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
JuliaDiff/ForwardDiff.jl のほかの issue
-
missing floatmin, floatmax, and issubnormal for Dual対応中かも @devmotion が 17 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
JuliaDiff/ForwardDiff.jl#852 · コメント 6 件 ·
-
`fma` and `muladd` ignore NaN-safe mode対応中かも @devmotion が 3 日前に担当しました。 オープン
難易度 3/5 1〜2日 初心者へのやさしさ 55/100
JuliaDiff/ForwardDiff.jl#860 ·
-
Enable NaN-safe mode by default対応中かも @devmotion が 5 日前に担当しました。 オープン
難易度 5/5 1週間以上 初心者へのやさしさ 25/100
JuliaDiff/ForwardDiff.jl#857 · リアクション 1 件 ·
-
難易度 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
-
R_to_gamma and R_to_v are wrong for |Z| != 1 (e.g. heavy ions)対応中かも @DavidSagan が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
bmad-sim/BeamTracking.jl#366 ·
メンテナーはふだん 1 日以内に返信
-
TSDAE's docstring implies a theta argument it does not take対応中かも @singhharsh1708 が今日担当しました。 オープンdocumentation
難易度 1/5 1時間未満 初心者へのやさしさ 74/100
SciML/PETScDiffEq.jl#282 ·
メンテナーはふだん 1 日以内に返信
-
enhancement good first issue help wanted
難易度 2/5 半日 初心者へのやさしさ 82/100
-
SavedSubsystem with an integer save_idxs maps the index the wrong way round対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
SciML/SciMLBase.jl#1643 ·
メンテナーはふだん 2 日以内に返信
-
authority-vechtstromen ready-for-agent
難易度 1/5 1時間未満 初心者へのやさしさ 75/100
Deltares/Ribasim-NL#890 ·
メンテナーはふだん 1 日以内に返信