Skip to content

TrackedStyle is broken for non-numeric tracked types #65

Description

@mohdibntarek

It seems that the implementation of ∇broadcast assumes that the arguments are not non-numeric tracked types. For example this fails:

julia> using Tracker

julia> f(x, y) = x.s * y; Tracker.gradient(x -> sum(f.([(s = x[1],)], x)), [1.0])
ERROR: MethodError: *(::Tracker.TrackedReal{Float64}, ::ForwardDiff.Dual{Nothing,Float64,1}) is ambiguous. Candidates:
  *(x::Real, y::ForwardDiff.Dual{Ty,V,N} where N where V) where Ty in ForwardDiff at C:\Users\user\.julia\packages\ForwardDiff\vt5F1\src\dual.jl:140
  *(a::Tracker.TrackedReal, b::Real) in Tracker at C:\Users\user\.julia\dev\Tracker\src\lib\real.jl:94
Possible fix, define
  *(::Tracker.TrackedReal, ::ForwardDiff.Dual{Ty,V,N} where N where V)
Stacktrace:
 [1] f(::NamedTuple{(:s,),Tuple{Tracker.TrackedReal{Float64}}}, ::ForwardDiff.Dual{Nothing,Float64,1}) at .\REPL[4]:1
 [2] partial(::typeof(f), ::Tracker.TrackedReal{Float64}, ::Int64, ::NamedTuple{(:s,),Tuple{Tracker.TrackedReal{Float64}}}, ::Float64) at C:\Users\user\.julia\dev\Tracker\src\lib\array.jl:505
 [3] _broadcast_getindex_evalf at .\broadcast.jl:630 [inlined]
 [4] _broadcast_getindex at .\broadcast.jl:603 [inlined]
 [5] getindex at .\broadcast.jl:563 [inlined]
 [6] copy at .\broadcast.jl:853 [inlined]
 [7] materialize(::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Nothing,typeof(Tracker.partial),Tuple{Base.RefValue{typeof(f)},Array{Tracker.TrackedReal{Float64},1},Int64,Array{NamedTuple{(:s,),Tuple{Tracker.TrackedReal{Float64}}},1},Array{Float64,1}}}) at .\broadcast.jl:819
 [8] broadcast(::typeof(Tracker.partial), ::Base.RefValue{typeof(f)}, ::Array{Tracker.TrackedReal{Float64},1}, ::Int64, ::Vararg{Any,N} where N) at .\broadcast.jl:757
 [9] ∇broadcast at C:\Users\user\.julia\dev\Tracker\src\lib\array.jl:509 [inlined]
 [10] copy at C:\Users\user\.julia\dev\Tracker\src\lib\array.jl:540 [inlined]
 [11] materialize at .\broadcast.jl:819 [inlined]
 [12] #549 at C:\Users\user\.julia\dev\Tracker\src\lib\array.jl:513 [inlined]
 [13] ntuple at .\ntuple.jl:42 [inlined]
 [14] back at C:\Users\user\.julia\dev\Tracker\src\lib\array.jl:513 [inlined]
 [15] back_(::Tracker.Call{Tracker.var"#back#550"{2,typeof(f),Tuple{Array{NamedTuple{(:s,),Tuple{Tracker.TrackedReal{Float64}}},1},TrackedArray{,Array{Float64,1}}}},Tuple{Nothing,Tracker.Tracked{Array{Float64,1}}}}, ::Array{Tracker.TrackedReal{Float64},1}, ::Bool) at C:\Users\user\.julia\dev\Tracker\src\back.jl:35
 [16] back(::Tracker.Tracked{Array{Tracker.TrackedReal{Float64},1}}, ::Array{Tracker.TrackedReal{Float64},1}, ::Bool) at C:\Users\user\.julia\dev\Tracker\src\back.jl:58
 [17] foreach at C:\Users\user\.julia\dev\Tracker\src\back.jl:38 [inlined]
 [18] back_(::Tracker.Call{Tracker.var"#484#485"{TrackedArray{,Array{Tracker.TrackedReal{Float64},1}}},Tuple{Tracker.Tracked{Array{Tracker.TrackedReal{Float64},1}}}}, ::Tracker.TrackedReal{Float64}, ::Bool) at C:\Users\user\.julia\dev\Tracker\src\back.jl:38
 [19] back(::Tracker.Tracked{Tracker.TrackedReal{Float64}}, ::Int64, ::Bool) at C:\Users\user\.julia\dev\Tracker\src\back.jl:58
 [20] #back!#15 at C:\Users\user\.julia\dev\Tracker\src\back.jl:77 [inlined]
 [21] #back! at .\none:0 [inlined]
 [22] #back!#32 at C:\Users\user\.julia\dev\Tracker\src\lib\real.jl:16 [inlined]
 [23] back!(::Tracker.TrackedReal{Tracker.TrackedReal{Float64}}) at C:\Users\user\.julia\dev\Tracker\src\lib\real.jl:14
 [24] gradient_(::Function, ::Array{Float64,1}) at C:\Users\user\.julia\dev\Tracker\src\back.jl:4
 [25] #gradient#24 at C:\Users\user\.julia\dev\Tracker\src\back.jl:164 [inlined]
 [26] gradient(::Function, ::Array{Float64,1}) at C:\Users\user\.julia\dev\Tracker\src\back.jl:164
 [27] top-level scope at REPL[4]:1

Any tips on how to fix this?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions