Optimisers.jl icon indicating copy to clipboard operation
Optimisers.jl copied to clipboard

`trainables` doesn't like non-trainable undef fields

Open mcabbott opened this issue 10 months ago • 0 comments

julia> using Optimisers

julia> mutable struct Two{T}; x::T; y::T; Two(x::T) where T = new{T}(x) end

julia> Optimisers.trainable(z::Two) = (; z.x)

julia> t = Two([1,2,3.])
Two{Vector{Float64}}([1.0, 2.0, 3.0], #undef)

julia> t.y = [4,5,6.];

julia> t
Two{Vector{Float64}}([1.0, 2.0, 3.0], [4.0, 5.0, 6.0])

julia> Optimisers.trainables(t)  # this is fine! Only needs to look at t.x
1-element Vector{AbstractArray}:
 [1.0, 2.0, 3.0]

julia> t1 = Two([7,8,9.])
Two{Vector{Float64}}([7.0, 8.0, 9.0], #undef)

julia> Optimisers.trainables(t1)  # Still only needs to look at t1.x
ERROR: UndefRefError: access to undefined reference
Stacktrace:
  [1] #2
    @ ~/.julia/packages/Functors/LbNAu/src/functor.jl:21 [inlined]
  [2] ntuple
    @ ./ntuple.jl:19 [inlined]
  [3] functor
    @ ~/.julia/packages/Functors/LbNAu/src/functor.jl:21 [inlined]
  [4] functor
    @ ~/.julia/packages/Functors/LbNAu/src/functor.jl:25 [inlined]
  [5] children
    @ ~/.julia/packages/Functors/LbNAu/src/functor.jl:58 [inlined]
  [6] isleaf
    @ ~/.julia/packages/Functors/LbNAu/src/functor.jl:56 [inlined]
  [7] usecache
    @ ~/.julia/packages/Functors/LbNAu/src/walks.jl:141 [inlined]
  [8] (::Functors.CachedWalk{…})(::Function, ::Two{…})
    @ Functors ~/.julia/packages/Functors/LbNAu/src/walks.jl:173
  [9] execute
    @ ~/.julia/packages/Functors/LbNAu/src/walks.jl:55 [inlined]
 [10] #fmap#41
    @ ~/.julia/packages/Functors/LbNAu/src/maps.jl:11 [inlined]
 [11] fmap
    @ ~/.julia/packages/Functors/LbNAu/src/maps.jl:3 [inlined]
 [12] _trainables
    @ ~/.julia/packages/Optimisers/FES4P/src/trainables.jl:70 [inlined]
 [13] trainables(x::Two{Vector{Float64}}; path::Bool)
    @ Optimisers ~/.julia/packages/Optimisers/FES4P/src/trainables.jl:63
 [14] trainables(x::Two{Vector{Float64}})
    @ Optimisers ~/.julia/packages/Optimisers/FES4P/src/trainables.jl:59
 [15] top-level scope
    @ REPL[37]:1
Some type information was truncated. Use `show(err)` to see complete types.

mcabbott avatar Dec 09 '24 01:12 mcabbott