Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/macros.jl
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ The `@grad` macro provides a way for the users to define custom adjoints for sin
macro grad(expr)
d = MacroTools.splitdef(expr)
f = d[:name]
closure = gensym(f)
closure = gensym(:grad)
d[:name] = closure
closure_ex = MacroTools.combinedef(d)

Expand Down
44 changes: 43 additions & 1 deletion test/MacrosTests.jl
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using ReverseDiff, ForwardDiff, Test, StaticArrays
using ReverseDiff, ForwardDiff, Test, StaticArrays, DiffResults
using ForwardDiff: Dual, Partials, partials

include(joinpath(dirname(@__FILE__), "utils.jl"))
Expand Down Expand Up @@ -342,3 +342,45 @@ using ReverseDiff: @grad, TrackedReal, TrackedVector, TrackedMatrix, TrackedArra
@test g1 == g2
@test custom_grad_called
end

module GradFunctionNames
using ReverseDiff

qualified(x) = sum(abs2, x)
qualified(x::ReverseDiff.TrackedArray) = ReverseDiff.track(qualified, x)

unqualified(x) = sum(abs2, x)
unqualified(x::ReverseDiff.TrackedArray) = ReverseDiff.track(unqualified, x)
ReverseDiff.@grad function unqualified(x)
xv = ReverseDiff.value(x)
return unqualified(xv), Δ -> (2 .* Δ .* xv,)
end
end

ReverseDiff.@grad function GradFunctionNames.qualified(x)
xv = ReverseDiff.value(x)
return GradFunctionNames.qualified(xv), Δ -> (2 .* Δ .* xv,)
end

@testset "@grad function names" begin
for f in (GradFunctionNames.qualified, GradFunctionNames.unqualified)
x = [1.0, 2.0, 3.0]
y = [-2.0, 0.5, 4.0]
@test ReverseDiff.gradient(f, x) == [2.0, 4.0, 6.0]
@test ReverseDiff.gradient(f, y) == [-4.0, 1.0, 8.0]

tape = ReverseDiff.GradientTape(f, x)
for t in (tape, ReverseDiff.compile(tape))
for (input, value, gradient) in (
(x, 14.0, [2.0, 4.0, 6.0]),
(y, 20.25, [-4.0, 1.0, 8.0]),
(x, 14.0, [2.0, 4.0, 6.0]),
)
result = DiffResults.GradientResult(copy(input))
ReverseDiff.gradient!(result, t, input)
@test DiffResults.value(result) == value
@test DiffResults.gradient(result) == gradient
end
end
end
end
Loading