The following function evaluation:
function OneDiv(x)
return 1.0 ./ x
end
@code_warntype OneDiv(Flux.param([0.1]))
Compiles to:
Body::Any
1 ─ %1 = (Core.tuple)(1.0, x)::Tuple{Float64,TrackedArray{…,Array{Float64,1}}}
│ %2 = %new(Base.Broadcast.Broadcasted{Flux.Tracker.TrackedStyle,Nothing,typeof(/),Tuple{Float64,TrackedArray{…,Array{Float64,1}}}}, /, %1, nothing)::Base.Broadcast.Broadcasted{Flux.Tracker.TrackedStyle,Nothing,typeof(/),Tuple{Float64,TrackedArray{…,Array{Float64,1}}}}
│ %3 = invoke Base.materialize(%2::Base.Broadcast.Broadcasted{Flux.Tracker.TrackedStyle,Nothing,typeof(/),Tuple{Float64,TrackedArray{…,Array{Float64,1}}}})::Any
└── return %3
Note the Any
there. I was wondering how to make this compile to a concrete type and remove the Any
here? If I change ./
to /
, it fails with: MethodError: no method matching Float64(::Flux.Tracker.TrackedReal{Float64})
.
My param in question is actually a scalar, an in that case the code works fine with /
, but I changed it to a single-element array because it didn’t seem like train!
worked with scalar params. If there is a way for train!
to work with scalar params, however, then that’s another option.