Skip to content

Latest release broke DistributionsAD #252

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
devmotion opened this issue May 18, 2023 · 8 comments · Fixed by #273
Closed

Latest release broke DistributionsAD #252

devmotion opened this issue May 18, 2023 · 8 comments · Fixed by #273

Comments

@devmotion
Copy link
Contributor

Hej!

The latest release of FillArrays broke DistributionsAD. More precisely, some tests of ReverseDiff and Tracker started to fail. Due to the large number of changes it's not immediately clear to me what change exactly is the problem and hence I was wondering if maybe for some of the contributors in this repo it might be more obvious.

Two days ago tests passed without problems: https://github.com/TuringLang/DistributionsAD.jl/actions/runs/4992157009/jobs/8939577198 (the single failing test is unrelated, this specific job has been terminated in all recent runs)
Whereas since yesterday many tests fail: https://github.com/TuringLang/DistributionsAD.jl/actions/runs/4992157009

I compared the installed packages in https://github.com/TuringLang/DistributionsAD.jl/actions/runs/4992157009/jobs/8988760248 (fails) and https://github.com/TuringLang/DistributionsAD.jl/actions/runs/4992157009/jobs/8939577198 (succeeds). It turns out the diff is simple, namely

19c19
<   [31c24e10] Distributions v0.25.92
---
>   [31c24e10] Distributions v0.25.93
23c23
<   [1a297f60] FillArrays v1.0.0
---
>   [1a297f60] FillArrays v1.0.1

The changes in Distributions are completely unrelated: JuliaStats/Distributions.jl@v0.25.92...v0.25.93 only fixed some type inference issues of Truncated{<:Normal} but the failing tests are caused by MvNormal (no truncated distributions).
Thus FillArrays 1.0.1 must have broken it.

@jishnub
Copy link
Member

jishnub commented May 19, 2023

Hi, I looked at the error in https://github.com/TuringLang/DistributionsAD.jl/actions/runs/4992157009/jobs/8988760248

Matrixvariate distributions: Error During Test at /home/runner/work/DistributionsAD.jl/DistributionsAD.jl/test/ad/utils.jl:357
  Test threw exception
  Expression: (Tracker.data((Tracker.gradient(f, x))[1]), finitediff, rtol = rtol, atol = atol)
  MethodError: no method matching Float64(::ForwardDiff.Dual{Nothing, Float64, 1})
  Closest candidates are:
    (::Type{T})(::Real, ::RoundingMode) where T<:AbstractFloat at rounding.jl:200
    (::Type{T})(::T) where T<:Number at boot.jl:760
    (::Type{T})(::AbstractChar) where T<:Union{AbstractChar, Number} at char.jl:50
    ...
  Stacktrace:
    [1] (::ComposedFunction{Type{Float64}, typeof(-)})(x::ForwardDiff.Dual{Nothing, Float64, 1})
      @ Base ./operators.jl:938
    [2] #8
      @ ./broadcast.jl:368 [inlined]
    [3] #8
      @ ./broadcast.jl:366 [inlined]
    [4] #2
      @ ./broadcast.jl:314 [inlined]
    [5] partial(::Base.Broadcast.var"#2#4"{Base.Broadcast.var"#8#10"{Base.Broadcast.var"#1#3", Base.Broadcast.var"#8#10"{Base.Broadcast.var"#5#6"{Base.Broadcast.var"#7#9"}, Base.Broadcast.var"#5#6"{Base.Broadcast.var"#7#9"}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#18"}, Base.Broadcast.var"#11#12"{Base.Broadcast.var"#13#14"}, ComposedFunction{Type{Float64}, typeof(-)}}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#18"}}, Base.Broadcast.var"#11#12"{Base.Broadcast.var"#11#12"{Base.Broadcast.var"#13#14"}}, typeof(/)}, typeof(abs2)}, ::Float64, ::Int64, ::Float64, ::Float64)
      @ Tracker ~/.julia/packages/Tracker/xe6h6/src/lib/array.jl:596
    [6] _broadcast_getindex_evalf
      @ ./broadcast.jl:648 [inlined]
    [7] _broadcast_getindex
      @ ./broadcast.jl:621 [inlined]
    [8] getindex
      @ ./broadcast.jl:575 [inlined]
    [9] copy
      @ ./broadcast.jl:922 [inlined]
   [10] materialize(bc::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(Tracker.partial), Tuple{Base.RefValue{Base.Broadcast.var"#2#4"{Base.Broadcast.var"#8#10"{Base.Broadcast.var"#1#3", Base.Broadcast.var"#8#10"{Base.Broadcast.var"#5#6"{Base.Broadcast.var"#7#9"}, Base.Broadcast.var"#5#6"{Base.Broadcast.var"#7#9"}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#18"}, Base.Broadcast.var"#11#12"{Base.Broadcast.var"#13#14"}, ComposedFunction{Type{Float64}, typeof(-)}}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#18"}}, Base.Broadcast.var"#11#12"{Base.Broadcast.var"#11#12"{Base.Broadcast.var"#13#14"}}, typeof(/)}, typeof(abs2)}}, Vector{Float64}, Int64, SubArray{Float64, 1, Matrix{Float64}, Tuple{Base.Slice{Base.OneTo{Int64}}, Int64}, true}, Vector{Float64}}})
      @ Base.Broadcast ./broadcast.jl:883
   [11] broadcast(::typeof(Tracker.partial), ::Base.RefValue{Base.Broadcast.var"#2#4"{Base.Broadcast.var"#8#10"{Base.Broadcast.var"#1#3", Base.Broadcast.var"#8#10"{Base.Broadcast.var"#5#6"{Base.Broadcast.var"#7#9"}, Base.Broadcast.var"#5#6"{Base.Broadcast.var"#7#9"}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#18"}, Base.Broadcast.var"#11#12"{Base.Broadcast.var"#13#14"}, ComposedFunction{Type{Float64}, typeof(-)}}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#18"}}, Base.Broadcast.var"#11#12"{Base.Broadcast.var"#11#12"{Base.Broadcast.var"#13#14"}}, typeof(/)}, typeof(abs2)}}, ::Vector{Float64}, ::Int64, ::Vararg{Any, N} where N)
      @ Base.Broadcast ./broadcast.jl:821
   [12] ∇broadcast
      @ ~/.julia/packages/Tracker/xe6h6/src/lib/array.jl:600 [inlined]
   [13] copy(bc::Base.Broadcast.Broadcasted{Tracker.TrackedStyle, Tuple{Base.OneTo{Int64}}, typeof(Tracker.partial), Tuple{Base.RefValue{Base.Broadcast.var"#2#4"{Base.Broadcast.var"#8#10"{Base.Broadcast.var"#1#3", Base.Broadcast.var"#8#10"{Base.Broadcast.var"#5#6"{Base.Broadcast.var"#7#9"}, Base.Broadcast.var"#5#6"{Base.Broadcast.var"#7#9"}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#18"}, Base.Broadcast.var"#11#12"{Base.Broadcast.var"#13#14"}, ComposedFunction{Type{Float64}, typeof(-)}}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#18"}}, Base.Broadcast.var"#11#12"{Base.Broadcast.var"#11#12"{Base.Broadcast.var"#13#14"}}, typeof(/)}, typeof(abs2)}}, Vector{Float64}, Int64, SubArray{Float64, 1, Matrix{Float64}, Tuple{Base.Slice{Base.OneTo{Int64}}, Int64}, true}, TrackedArray{,Vector{Float64}}}})
      @ Tracker ~/.julia/packages/Tracker/xe6h6/src/lib/array.jl:630
   [14] materialize
      @ ./broadcast.jl:883 [inlined]
   [15] (::Tracker.var"#665#667"{Vector{Float64}, Base.Broadcast.var"#2#4"{Base.Broadcast.var"#8#10"{Base.Broadcast.var"#1#3", Base.Broadcast.var"#8#10"{Base.Broadcast.var"#5#6"{Base.Broadcast.var"#7#9"}, Base.Broadcast.var"#5#6"{Base.Broadcast.var"#7#9"}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#18"}, Base.Broadcast.var"#11#12"{Base.Broadcast.var"#13#14"}, ComposedFunction{Type{Float64}, typeof(-)}}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#18"}}, Base.Broadcast.var"#11#12"{Base.Broadcast.var"#11#12"{Base.Broadcast.var"#13#14"}}, typeof(/)}, typeof(abs2)}, Tuple{SubArray{Float64, 1, Matrix{Float64}, Tuple{Base.Slice{Base.OneTo{Int64}}, Int64}, true}, TrackedArray{,Vector{Float64}}}})(i::Int64)
      @ Tracker ~/.julia/packages/Tracker/xe6h6/src/lib/array.jl:603
   [16] ntuple
      @ ./ntuple.jl:49 [inlined]
   [17] (::Tracker.var"#back#666"{2, Base.Broadcast.var"#2#4"{Base.Broadcast.var"#8#10"{Base.Broadcast.var"#1#3", Base.Broadcast.var"#8#10"{Base.Broadcast.var"#5#6"{Base.Broadcast.var"#7#9"}, Base.Broadcast.var"#5#6"{Base.Broadcast.var"#7#9"}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#18"}, Base.Broadcast.var"#11#12"{Base.Broadcast.var"#13#14"}, ComposedFunction{Type{Float64}, typeof(-)}}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#18"}}, Base.Broadcast.var"#11#12"{Base.Broadcast.var"#11#12"{Base.Broadcast.var"#13#14"}}, typeof(/)}, typeof(abs2)}, Tuple{SubArray{Float64, 1, Matrix{Float64}, Tuple{Base.Slice{Base.OneTo{Int64}}, Int64}, true}, TrackedArray{,Vector{Float64}}}})(Δ::Vector{Float64})
      @ Tracker ~/.julia/packages/Tracker/xe6h6/src/lib/array.jl:603
   [18] back_(c::Tracker.Call{Tracker.var"#back#666"{2, Base.Broadcast.var"#2#4"{Base.Broadcast.var"#8#10"{Base.Broadcast.var"#1#3", Base.Broadcast.var"#8#10"{Base.Broadcast.var"#5#6"{Base.Broadcast.var"#7#9"}, Base.Broadcast.var"#5#6"{Base.Broadcast.var"#7#9"}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#18"}, Base.Broadcast.var"#11#12"{Base.Broadcast.var"#13#14"}, ComposedFunction{Type{Float64}, typeof(-)}}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#18"}}, Base.Broadcast.var"#11#12"{Base.Broadcast.var"#11#12"{Base.Broadcast.var"#13#14"}}, typeof(/)}, typeof(abs2)}, Tuple{SubArray{Float64, 1, Matrix{Float64}, Tuple{Base.Slice{Base.OneTo{Int64}}, Int64}, true}, TrackedArray{,Vector{Float64}}}}, Tuple{Nothing, Tracker.Tracked{Vector{Float64}}}}, Δ::Vector{Float64}, once::Bool)
      @ Tracker ~/.julia/packages/Tracker/xe6h6/src/back.jl:35
   [19] back(x::Tracker.Tracked{Vector{Float64}}, Δ::Vector{Float64}, once::Bool)
      @ Tracker ~/.julia/packages/Tracker/xe6h6/src/back.jl:58
   [20] #670
      @ ~/.julia/packages/Tracker/xe6h6/src/back.jl:38 [inlined]
   [21] foreach
      @ ./abstractarray.jl:2142 [inlined]
   [22] back_(c::Tracker.Call{Tracker.var"#591#592"{TrackedArray{,Vector{Float64}}}, Tuple{Tracker.Tracked{Vector{Float64}}}}, Δ::Float64, once::Bool)
      @ Tracker ~/.julia/packages/Tracker/xe6h6/src/back.jl:38
  --- the last 4 lines are repeated 4 more times ---
   [39] back(x::Tracker.Tracked{Float64}, Δ::Int64, once::Bool)
      @ Tracker ~/.julia/packages/Tracker/xe6h6/src/back.jl:58
   [40] #back!#672
      @ ~/.julia/packages/Tracker/xe6h6/src/back.jl:77 [inlined]
   [41] #back!#13
      @ ~/.julia/packages/Tracker/xe6h6/src/lib/real.jl:18 [inlined]
   [42] back!(x::Tracker.TrackedReal{Float64})
      @ Tracker ~/.julia/packages/Tracker/xe6h6/src/lib/real.jl:16
   [43] gradient_(f::Function, xs::Vector{Float64})
      @ Tracker ~/.julia/packages/Tracker/xe6h6/src/back.jl:4
   [44] #gradient#681
      @ ~/.julia/packages/Tracker/xe6h6/src/back.jl:164 [inlined]
   [45] gradient
      @ ~/.julia/packages/Tracker/xe6h6/src/back.jl:164 [inlined]
   [46] test_ad(f::Function, x::Vector{Float64}, broken::Tuple{}; rtol::Float64, atol::Float64)
      @ Main ~/work/DistributionsAD.jl/DistributionsAD.jl/test/ad/utils.jl:357
   [47] test_ad(f::Function, x::Vector{Float64}, broken::Tuple{})
      @ Main ~/work/DistributionsAD.jl/DistributionsAD.jl/test/ad/utils.jl:351
   [48] test_ad(dist::DistSpec{DistributionsAD.VectorOfMultivariate{Continuous, ZeroMeanDiagNormal{Tuple{Base.OneTo{Int64}}}, Vector{ZeroMeanDiagNormal{Tuple{Base.OneTo{Int64}}}}}, var"#143#239"{var"#69#165"}, Tuple{Vector{Float64}}, Matrix{Float64}, Nothing, Tuple{}}; kwargs::Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
      @ Main ~/work/DistributionsAD.jl/DistributionsAD.jl/test/ad/utils.jl:343
   [49] test_ad(dist::DistSpec{DistributionsAD.VectorOfMultivariate{Continuous, ZeroMeanDiagNormal{Tuple{Base.OneTo{Int64}}}, Vector{ZeroMeanDiagNormal{Tuple{Base.OneTo{Int64}}}}}, var"#143#239"{var"#69#165"}, Tuple{Vector{Float64}}, Matrix{Float64}, Nothing, Tuple{}})
      @ Main ~/work/DistributionsAD.jl/DistributionsAD.jl/test/ad/utils.jl:284
   [50] macro expansion
      @ ~/work/DistributionsAD.jl/DistributionsAD.jl/test/ad/distributions.jl:591 [inlined]
   [51] macro expansion
      @ /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/Test/src/Test.jl:1151 [inlined]
   [52] macro expansion
      @ ~/work/DistributionsAD.jl/DistributionsAD.jl/test/ad/distributions.jl:472 [inlined]
   [53] macro expansion
      @ /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/Test/src/Test.jl:1151 [inlined]

I don't really understand the FillArrays issue from the stacktrace. Could you perhaps narrow it down to a MWE?

Some of the other runs were simply cancelled, perhaps after this run failed. In any case, perhaps we may test FillArrays PRs against certain dependent packages to avoid downstream breakages, so if you could suggest appropriate packages, that would be great.

@jishnub
Copy link
Member

jishnub commented Jun 5, 2023

Hi, would you mind verifying if this is fixed with FillArrays v1.1.1?

@devmotion
Copy link
Contributor Author

Unfortunately the issues persist even with FillArrays 1.1.1: https://github.com/TuringLang/DistributionsAD.jl/actions/runs/4992157009/jobs/9325223758 Unfortunately, I haven't had time to debug this further. Maybe there's another, similar issue still present in FillArrays?

@torfjelde
Copy link
Contributor

From the trace above it seems like

for op in (:+, :-)
, i.e. adding proper suppport for -, is a likel candidate?

@jishnub
Copy link
Member

jishnub commented Jun 17, 2023

You're likely right, the latest failure seems to point at the fixed line.

Matrixvariate distributions: Error During Test at /home/runner/work/DistributionsAD.jl/DistributionsAD.jl/test/ad/utils.jl:357
  Test threw exception
  Expression: (Tracker.data((Tracker.gradient(f, x))[1]), finitediff, rtol = rtol, atol = atol)
  MethodError: no method matching Float64(::ForwardDiff.Dual{Nothing, Float64, 1})
  Closest candidates are:
    (::Type{T})(::Real, ::RoundingMode) where T<:AbstractFloat at rounding.jl:200
    (::Type{T})(::T) where T<:Number at boot.jl:760
    (::Type{T})(::AbstractChar) where T<:Union{AbstractChar, Number} at char.jl:50
    ...
  Stacktrace:
    [1] #8
      @ ./broadcast.jl:368 [inlined]
    [2] #8
      @ ./broadcast.jl:366 [inlined]
    [3] #2
      @ ./broadcast.jl:314 [inlined]
    [4] partial(::Base.Broadcast.var"#2#4"{Base.Broadcast.var"#8#10"{Base.Broadcast.var"#1#3", Base.Broadcast.var"#8#10"{Base.Broadcast.var"#5#6"{Base.Broadcast.var"#7#9"}, Base.Broadcast.var"#5#6"{Base.Broadcast.var"#7#9"}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#18"}, Base.Broadcast.var"#11#12"{Base.Broadcast.var"#13#14"}, DataType}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#18"}}, Base.Broadcast.var"#11#12"{Base.Broadcast.var"#11#12"{Base.Broadcast.var"#13#14"}}, typeof(/)}, typeof(abs2)}, ::Float64, ::Int64, ::Float64, ::Float64)
      @ Tracker ~/.julia/packages/Tracker/xe6h6/src/lib/array.jl:596
    [5] _broadcast_getindex_evalf
      @ ./broadcast.jl:648 [inlined]
    [6] _broadcast_getindex
      @ ./broadcast.jl:621 [inlined]
    [7] getindex
      @ ./broadcast.jl:575 [inlined]
    [8] copy
      @ ./broadcast.jl:922 [inlined]
    [9] materialize(bc::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(Tracker.partial), Tuple{Base.RefValue{Base.Broadcast.var"#2#4"{Base.Broadcast.var"#8#10"{Base.Broadcast.var"#1#3", Base.Broadcast.var"#8#10"{Base.Broadcast.var"#5#6"{Base.Broadcast.var"#7#9"}, Base.Broadcast.var"#5#6"{Base.Broadcast.var"#7#9"}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#18"}, Base.Broadcast.var"#11#12"{Base.Broadcast.var"#13#14"}, DataType}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#18"}}, Base.Broadcast.var"#11#12"{Base.Broadcast.var"#11#12"{Base.Broadcast.var"#13#14"}}, typeof(/)}, typeof(abs2)}}, Vector{Float64}, Int64, Vector{Float64}, Vector{Float64}}})
      @ Base.Broadcast ./broadcast.jl:883
[...]

@devmotion
Copy link
Contributor Author

I finally managed to condense the remaining (or, as you'll see, actually new) issues to a MWE 🎉

The following example works as expected in FillArrays 1.0.0, 1.0.1, 1.0.2, and 1.1.0 (so it was not a problem when opening this issue):

julia> using FillArrays, ReverseDiff

julia> ReverseDiff.gradient(x -> sum(abs2.((Zeros(5) .- zeros(5)) ./ x)), rand(5))
5-element Vector{Float64}:
 0.0
 0.0
 0.0
 0.0
 0.0

julia> ReverseDiff.gradient(x -> sum(abs2.((zeros(5) .- Zeros(5)) ./ x)), rand(5))
5-element Vector{Float64}:
 0.0
 0.0
 0.0
 0.0
 0.0

However, with FillArrays >= 1.1.1:

julia> using FillArrays, ReverseDiff

julia> ReverseDiff.gradient(x -> sum(abs2.((Zeros(5) .- zeros(5)) ./ x)), rand(5))
5-element Vector{Float64}:
 0.0
 0.0
 0.0
 0.0
 0.0

julia> ReverseDiff.gradient(x -> sum(abs2.((zeros(5) .- Zeros(5)) ./ x)), rand(5))
ERROR: MethodError: no method matching Float64(::ForwardDiff.Dual{ForwardDiff.Tag{ReverseDiff.var"#109#111"{Base.Broadcast.var"#12#14"{Base.Broadcast.var"#18#20"{Base.Broadcast.var"#11#13", Base.Broadcast.var"#18#20"{Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#19"}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#19"}, Base.Broadcast.var"#25#26"{Base.Broadcast.var"#27#28"}, Base.Broadcast.var"#21#22"{Base.Broadcast.var"#23#24"}, DataType}, Base.Broadcast.var"#25#26"{Base.Broadcast.var"#25#26"{Base.Broadcast.var"#27#28"}}, Base.Broadcast.var"#21#22"{Base.Broadcast.var"#21#22"{Base.Broadcast.var"#23#24"}}, typeof(/)}, typeof(abs2)}, Tuple{}, Val{(1, 2)}}, Float64}, Float64, 2})

Closest candidates are:
  (::Type{T})(::Real, ::RoundingMode) where T<:AbstractFloat
   @ Base rounding.jl:207
  (::Type{T})(::T) where T<:Number
   @ Core boot.jl:792
  (::Type{T})(::AbstractChar) where T<:Union{AbstractChar, Number}
   @ Base char.jl:50
  ...

Stacktrace:
  [1] #18
    @ ./broadcast.jl:396 [inlined]
  [2] #18
    @ ./broadcast.jl:394 [inlined]
  [3] #12
    @ ./broadcast.jl:342 [inlined]
  [4] macro expansion
    @ ~/.julia/packages/ReverseDiff/wIfrd/src/derivatives/broadcast.jl:126 [inlined]
  [5] splatcall
    @ ~/.julia/packages/ReverseDiff/wIfrd/src/derivatives/broadcast.jl:111 [inlined]
  [6] (::ReverseDiff.var"#109#111"{Base.Broadcast.var"#12#14"{Base.Broadcast.var"#18#20"{Base.Broadcast.var"#11#13", Base.Broadcast.var"#18#20"{Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#19"}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#19"}, Base.Broadcast.var"#25#26"{Base.Broadcast.var"#27#28"}, Base.Broadcast.var"#21#22"{Base.Broadcast.var"#23#24"}, DataType}, Base.Broadcast.var"#25#26"{Base.Broadcast.var"#25#26"{Base.Broadcast.var"#27#28"}}, Base.Broadcast.var"#21#22"{Base.Broadcast.var"#21#22"{Base.Broadcast.var"#23#24"}}, typeof(/)}, typeof(abs2)}, Tuple{}, Val{(1, 2)}})(s::StaticArraysCore.SVector{2, ForwardDiff.Dual{ForwardDiff.Tag{ReverseDiff.var"#109#111"{Base.Broadcast.var"#12#14"{Base.Broadcast.var"#18#20"{Base.Broadcast.var"#11#13", Base.Broadcast.var"#18#20"{Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#19"}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#19"}, Base.Broadcast.var"#25#26"{Base.Broadcast.var"#27#28"}, Base.Broadcast.var"#21#22"{Base.Broadcast.var"#23#24"}, DataType}, Base.Broadcast.var"#25#26"{Base.Broadcast.var"#25#26"{Base.Broadcast.var"#27#28"}}, Base.Broadcast.var"#21#22"{Base.Broadcast.var"#21#22"{Base.Broadcast.var"#23#24"}}, typeof(/)}, typeof(abs2)}, Tuple{}, Val{(1, 2)}}, Float64}, Float64, 2}})
    @ ReverseDiff ~/.julia/packages/ReverseDiff/wIfrd/src/derivatives/broadcast.jl:150
  [7] static_dual_eval
    @ ~/.julia/packages/ForwardDiff/vXysl/ext/ForwardDiffStaticArraysExt.jl:24 [inlined]
  [8] vector_mode_gradient!(result::DiffResults.ImmutableDiffResult{1, Float64, Tuple{StaticArraysCore.SVector{2, Float64}}}, f::Function, x::StaticArraysCore.SVector{2, Float64})
    @ ForwardDiffStaticArraysExt ~/.julia/packages/ForwardDiff/vXysl/ext/ForwardDiffStaticArraysExt.jl:64
  [9] gradient!(result::DiffResults.ImmutableDiffResult{1, Float64, Tuple{StaticArraysCore.SVector{2, Float64}}}, f::Function, x::StaticArraysCore.SVector{2, Float64})
    @ ForwardDiffStaticArraysExt ~/.julia/packages/ForwardDiff/vXysl/ext/ForwardDiffStaticArraysExt.jl:44
 [10] (::ReverseDiff.var"#df#110"{Base.Broadcast.var"#12#14"{Base.Broadcast.var"#18#20"{Base.Broadcast.var"#11#13", Base.Broadcast.var"#18#20"{Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#19"}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#19"}, Base.Broadcast.var"#25#26"{Base.Broadcast.var"#27#28"}, Base.Broadcast.var"#21#22"{Base.Broadcast.var"#23#24"}, DataType}, Base.Broadcast.var"#25#26"{Base.Broadcast.var"#25#26"{Base.Broadcast.var"#27#28"}}, Base.Broadcast.var"#21#22"{Base.Broadcast.var"#21#22"{Base.Broadcast.var"#23#24"}}, typeof(/)}, typeof(abs2)}, DiffResults.ImmutableDiffResult{1, Float64, Tuple{StaticArraysCore.SVector{2, Float64}}}, Tuple{}, Val{(1, 2)}})(::Float64, ::Vararg{Float64})
    @ ReverseDiff ~/.julia/packages/ReverseDiff/wIfrd/src/derivatives/broadcast.jl:148
 [11] _broadcast_getindex_evalf
    @ ./broadcast.jl:683 [inlined]
 [12] _broadcast_getindex
    @ ./broadcast.jl:656 [inlined]
 [13] getindex
    @ ./broadcast.jl:610 [inlined]
 [14] copy
    @ ./broadcast.jl:912 [inlined]
 [15] materialize
    @ ./broadcast.jl:873 [inlined]
 [16] broadcast(::ReverseDiff.var"#df#110"{Base.Broadcast.var"#12#14"{Base.Broadcast.var"#18#20"{Base.Broadcast.var"#11#13", Base.Broadcast.var"#18#20"{Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#19"}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#19"}, Base.Broadcast.var"#25#26"{Base.Broadcast.var"#27#28"}, Base.Broadcast.var"#21#22"{Base.Broadcast.var"#23#24"}, DataType}, Base.Broadcast.var"#25#26"{Base.Broadcast.var"#25#26"{Base.Broadcast.var"#27#28"}}, Base.Broadcast.var"#21#22"{Base.Broadcast.var"#21#22"{Base.Broadcast.var"#23#24"}}, typeof(/)}, typeof(abs2)}, DiffResults.ImmutableDiffResult{1, Float64, Tuple{StaticArraysCore.SVector{2, Float64}}}, Tuple{}, Val{(1, 2)}}, ::Vector{Float64}, ::Vector{Float64})
    @ Base.Broadcast ./broadcast.jl:811
 [17] ∇broadcast(::Base.Broadcast.var"#12#14"{Base.Broadcast.var"#18#20"{Base.Broadcast.var"#11#13", Base.Broadcast.var"#18#20"{Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#19"}, Base.Broadcast.var"#15#16"{Base.Broadcast.var"#17#19"}, Base.Broadcast.var"#25#26"{Base.Broadcast.var"#27#28"}, Base.Broadcast.var"#21#22"{Base.Broadcast.var"#23#24"}, DataType}, Base.Broadcast.var"#25#26"{Base.Broadcast.var"#25#26"{Base.Broadcast.var"#27#28"}}, Base.Broadcast.var"#21#22"{Base.Broadcast.var"#21#22"{Base.Broadcast.var"#23#24"}}, typeof(/)}, typeof(abs2)}, ::Vector{Float64}, ::Vararg{Any})
    @ ReverseDiff ~/.julia/packages/ReverseDiff/wIfrd/src/derivatives/broadcast.jl:154
 [18] copy(_bc::Base.Broadcast.Broadcasted{ReverseDiff.TrackedStyle, Tuple{Base.OneTo{Int64}}, typeof(abs2), Tuple{Base.Broadcast.Broadcasted{ReverseDiff.TrackedStyle, Nothing, typeof(/), Tuple{Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, Type{Float64}, Tuple{Vector{Float64}}}, ReverseDiff.TrackedArray{Float64, Float64, 1, Vector{Float64}, Vector{Float64}}}}}})
    @ ReverseDiff ~/.julia/packages/ReverseDiff/wIfrd/src/derivatives/broadcast.jl:94
 [19] materialize
    @ ./broadcast.jl:873 [inlined]
 [20] (::var"#7#8")(x::ReverseDiff.TrackedArray{Float64, Float64, 1, Vector{Float64}, Vector{Float64}})
    @ Main ./REPL[4]:1
 [21] ReverseDiff.GradientTape(f::var"#7#8", input::Vector{Float64}, cfg::ReverseDiff.GradientConfig{ReverseDiff.TrackedArray{Float64, Float64, 1, Vector{Float64}, Vector{Float64}}})
    @ ReverseDiff ~/.julia/packages/ReverseDiff/wIfrd/src/api/tape.jl:199
 [22] gradient(f::Function, input::Vector{Float64}, cfg::ReverseDiff.GradientConfig{ReverseDiff.TrackedArray{Float64, Float64, 1, Vector{Float64}, Vector{Float64}}})
    @ ReverseDiff ~/.julia/packages/ReverseDiff/wIfrd/src/api/gradients.jl:22
 [23] gradient(f::Function, input::Vector{Float64})
    @ ReverseDiff ~/.julia/packages/ReverseDiff/wIfrd/src/api/gradients.jl:22
 [24] top-level scope
    @ REPL[4]:1

So it seems this bug was introduced in FillArrays 1.1.1 (presumably #264) and therefore tests still failed when I checked with FillArrays 1.1.1 even though the initial issues were (seemingly) fixed (#252 (comment)).

@devmotion
Copy link
Contributor Author

Hmm, seems these broadcasting specializations are a bit tricky for AD (and Tracker + ReverseDiff in particular). Changing

broadcasted(TT, a)
to _copy_oftype(a, TT) would fix the MWE but I'm not sure if it could be problematic in other cases.

@devmotion
Copy link
Contributor Author

Oh, actually the problem might be promote_type. Using

TT = typeof($op(zero(T), zero(V)))

seems to fix it (and seems more correct if e.g. T = V = Bool).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants