Skip to content

Reconstruction from Tangent fails #426

@mcabbott

Description

@mcabbott
id(x) = x

function ChainRules.rrule(::typeof(id), x)
    y = x
    function back(dy)
        dx = ProjectTo(x)(@show dy)
        (NoTangent(), @show dx)
    end
    y, back
end

test_rrule(id, 3.4)  # fine

test_rrule(id, Ref(3.4))

#=

dy = Tangent{Base.RefValue{Float64}}(x = 4.35,)
test_rrule: id on Base.RefValue{Float64}: Error During Test at /Users/me/.julia/packages/ChainRulesTestUtils/8380y/src/testers.jl:191
  Got exception outside of a @test
  ArgumentError: type does not have a definite number of fields
  Stacktrace:
    [1] fieldcount(t::Any)
      @ Base ./reflection.jl:764
    [2] construct(#unused#::Type{Ref}, fields::NamedTuple{(:x,), Tuple{Float64}})
      @ ChainRulesCore ~/.julia/packages/ChainRulesCore/Voykb/src/differentials/composite.jl:213
    [3] ProjectTo
      @ ~/.julia/packages/ChainRulesCore/Voykb/src/projection.jl:78 [inlined]
    [4] (::var"#back#9"{Base.RefValue{Float64}})(dy::Tangent{Base.RefValue{Float64}, NamedTuple{(:x,), Tuple{Float64}}})

=#

Maybe the short version is something like this:

x = 1:3.0
dx = Tangent{typeof(x)}(ref=NoTangent(),step=0.1,len=NoTangent(),offset=NoTangent())
ProjectTo(x)(dx)
#=
ERROR: ArgumentError: Named tuple names do not match.
Stacktrace:
 [1] map(f::Function, nt::NamedTuple{(:element, :axes), Tuple{ProjectTo{Float64, NamedTuple{(), Tuple{}}}, Tuple{Base.OneTo{Int64}}}}, nts::NamedTuple{(:ref, :step, :len, :offset), Tuple{NoTangent, Float64, NoTangent, NoTangent}})
=#

y = 1.0+im;
dy = Tangent{typeof(y)}(; re=NoTangent(), im=0.1)
ProjectTo(y)(dy)
#=
ERROR: ArgumentError: Named tuple names do not match.
Stacktrace:
 [1] map(f::Function, nt::NamedTuple{(), Tuple{}}, nts::NamedTuple{(:re, :im), Tuple{NoTangent, Float64}})
=#

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions