using Mooncake: build_rrule, value_and_gradient!!
using Core.Intrinsics: pointerset, atomic_pointerset
f_pointerset = x -> begin
c_1 = [x]
c_2 = [x * 2.0]
p = [pointer(c_1)]
pointerset(pointer(p), pointer(c_2), 1, 1)
unsafe_load(p[1])
end
f_atomic_pointerset = x -> begin
c_1 = [x]
c_2 = [x * 2.0]
p = [pointer(c_1)]
atomic_pointerset(pointer(p), pointer(c_2), :monotonic)
unsafe_load(p[1])
end
value_and_gradient!!(build_rrule(f_pointerset, 3.0), f_pointerset, 3.0)
value_and_gradient!!(build_rrule(f_atomic_pointerset, 3.0), f_atomic_pointerset, 3.0)
see #471 (comment)
Will add more details as #471 progresses.