`finite_difference_gradient` is mutating arrays
まだ誰も着手していません。
- #159 @ArnoStrouwen による — マージされずにクローズ
評価
調査の方向性
src/gradients.jl の finite_difference_gradient 実装付近と、224-277 行付近のスタックトレースの位置から始めます。Issue の Zygote.gradient の例を再現し、その後、finite_difference_gradient を通して微分しても配列の変更エラーが発生しなくなったことを確認します。
索引モデルが issue の本文から書いたものです。
説明
julia> function f(x,p)
grad = FiniteDiff.finite_difference_gradient(y -> sum(y.^3), x)
return grad .* p
end
f (generic function with 1 method)
julia> x,p = rand(3),rand(3);
julia> Zygote.gradient(p->sum(f(x,p)), p)[1]
ERROR: Mutating arrays is not supported -- called setindex!(Vector{Float64}, ...)
This error occurs when you ask Zygote to differentiate operations that change
the elements of arrays in place (e.g. setting values with x .= ...)
Possible fixes:
- avoid mutating operations (preferred)
- or read the documentation and solutions for this error
https://fluxml.ai/Zygote.jl/dev/limitations.html#Array-mutation-1
Stacktrace:
[1] error(s::String)
@ Base .\error.jl:33
[2] _throw_mutation_error(f::Function, args::Vector{Float64})
@ Zygote C:\Users\Luffy\.julia\packages\Zygote\IoW2g\src\lib\array.jl:70
[3] (::Zygote.var"#444#445"{Vector{Float64}})(#unused#::Nothing)
@ Zygote C:\Users\Luffy\.julia\packages\Zygote\IoW2g\src\lib\array.jl:82
[4] (::Zygote.var"#2496#back#446"{Zygote.var"#444#445"{Vector{Float64}}})(Δ::Nothing)
@ Zygote C:\Users\Luffy\.julia\packages\ZygoteRules\AIbCs\src\adjoint.jl:67
[5] Pullback
@ C:\Users\Luffy\.julia\packages\FiniteDiff\KkXlb\src\gradients.jl:277 [inlined]
[6] (::typeof(∂(#finite_difference_gradient!#16)))(Δ::Vector{Float64})
@ Zygote C:\Users\Luffy\.julia\packages\Zygote\IoW2g\src\compiler\interface2.jl:0
[7] Pullback
@ C:\Users\Luffy\.julia\packages\FiniteDiff\KkXlb\src\gradients.jl:224 [inlined]
[8] (::typeof(∂(finite_difference_gradient!##kw)))(Δ::Vector{Float64})
@ Zygote C:\Users\Luffy\.julia\packages\Zygote\IoW2g\src\compiler\interface2.jl:0
[9] Pullback
@ C:\Users\Luffy\.julia\packages\FiniteDiff\KkXlb\src\gradients.jl:88 [inlined]
[10] (::typeof(∂(#finite_difference_gradient#12)))(Δ::Vector{Float64})
@ Zygote C:\Users\Luffy\.julia\packages\Zygote\IoW2g\src\compiler\interface2.jl:0
[11] Pullback
@ C:\Users\Luffy\.julia\packages\FiniteDiff\KkXlb\src\gradients.jl:70 [inlined]
[12] (::typeof(∂(finite_difference_gradient)))(Δ::Vector{Float64})
@ Zygote C:\Users\Luffy\.julia\packages\Zygote\IoW2g\src\compiler\interface2.jl:0
[13] Pullback
@ C:\Users\Luffy\.julia\packages\FiniteDiff\KkXlb\src\gradients.jl:70 [inlined]
[14] (::typeof(∂(finite_difference_gradient)))(Δ::Vector{Float64})
@ Zygote C:\Users\Luffy\.julia\packages\Zygote\IoW2g\src\compiler\interface2.jl:0
[15] Pullback
@ .\REPL[94]:2 [inlined]
[16] (::typeof(∂(f)))(Δ::FillArrays.Fill{Float64, 1, Tuple{Base.OneTo{Int64}}})
@ Zygote C:\Users\Luffy\.julia\packages\Zygote\IoW2g\src\compiler\interface2.jl:0
[17] Pullback
@ .\REPL[95]:1 [inlined]
[18] (::typeof(∂(#30)))(Δ::Float64)
@ Zygote C:\Users\Luffy\.julia\packages\Zygote\IoW2g\src\compiler\interface2.jl:0
[19] (::Zygote.var"#60#61"{typeof(∂(#30))})(Δ::Float64)
@ Zygote C:\Users\Luffy\.julia\packages\Zygote\IoW2g\src\compiler\interface.jl:41
[20] gradient(f::Function, args::Vector{Float64})
@ Zygote C:\Users\Luffy\.julia\packages\Zygote\IoW2g\src\compiler\interface.jl:76
[21] top-level scope
@ REPL[95]:1
[22] top-level scope
@ C:\Users\Luffy\.julia\packages\CUDA\DfvRa\src\initialization.jl:52
- 主要言語
- Julia
- スター
- 305
- フォーク
- 42
- 平均マージ
- 24分
- マージ済み PR(30日)
- 2
環境構築
このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
JuliaDiff/FiniteDiff.jl のほかの issue
-
tagbot-manual
難易度 2/5 1〜3時間 初心者へのやさしさ 55/100
JuliaDiff/FiniteDiff.jl#218 ·
-
Feature request: vectorized finite difference evaluation対応中かも @ChrisRackauckas-Claude が 191 日前に担当しました。 オープン
難易度 5/5 1週間以上 初心者へのやさしさ 45/100
JuliaDiff/FiniteDiff.jl#210 · コメント 1 件 · リアクション 1 件 ·
-
難易度 3/5 1〜2日 初心者へのやさしさ 45/100
JuliaDiff/FiniteDiff.jl#199 · コメント 3 件 ·
-
StridedArraysオープン
難易度 4/5 3〜5日 初心者へのやさしさ 25/100
JuliaDiff/FiniteDiff.jl#158 · コメント 1 件 ·
-
難易度 5/5 1週間以上 初心者へのやさしさ 25/100
JuliaDiff/FiniteDiff.jl#157 · コメント 1 件 ·
JuliaDiff/FiniteDiff.jl の issue をすべて見る
似ている issue
-
documentation
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
メンテナーはふだん 1 日以内に返信
-
Truncated discrete ccdf and logccdf return incorrect values at the lower atom対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
JuliaStats/Distributions.jl#2095 ·
-
documentation 📜 microphysics💧 ❄️
難易度 2/5 1〜3時間 初心者へのやさしさ 63/100
NumericalEarth/Breeze.jl#1073 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1時間未満 初心者へのやさしさ 78/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
CliMA/ClimaAtmos.jl#4891 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信