Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

#481 possibly broke `ishermitian`

オープン
#606 コメント 16 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
35/100
issue の種類
バグ
明瞭さ
おおむね明確
活発さ
停滞
技術スタック
julia
領域
tooling

調査の方向性

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 を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

JuliaDiff/ForwardDiff.jl のほかの issue

JuliaDiff/ForwardDiff.jl の issue をすべて見る

似ている issue

Julia の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。