1 |
|
|
####################
|
2 |
|
|
# value extraction #
|
3 |
|
|
####################
|
4 |
|
|
|
5 |
|
|
@inline extract_value!(::Type{T}, out::DiffResult, ydual) where {T} =
|
6 |
|
|
DiffResults.value!(d -> value(T,d), out, ydual)
|
7 |
|
|
@inline extract_value!(::Type{T}, out, ydual) where {T} = out # ???
|
8 |
|
|
|
9 |
|
|
@inline function extract_value!(::Type{T}, out, y, ydual) where {T}
|
10 |
|
|
map!(d -> value(T,d), y, ydual)
|
11 |
|
|
copy_value!(out, y)
|
12 |
|
|
end
|
13 |
|
|
|
14 |
|
|
@inline copy_value!(out::DiffResult, y) = DiffResults.value!(out, y)
|
15 |
|
|
@inline copy_value!(out, y) = out
|
16 |
|
|
|
17 |
|
|
###################################
|
18 |
|
|
# vector mode function evaluation #
|
19 |
|
|
###################################
|
20 |
|
|
|
21 |
|
|
function vector_mode_dual_eval!(f::F, cfg::Union{JacobianConfig,GradientConfig}, x) where {F}
|
22 |
|
|
xdual = cfg.duals
|
23 |
|
|
seed!(xdual, x, cfg.seeds)
|
24 |
|
|
return f(xdual)
|
25 |
|
|
end
|
26 |
|
|
|
27 |
|
|
function vector_mode_dual_eval!(f!::F, cfg::JacobianConfig, y, x) where {F}
|
28 |
|
|
ydual, xdual = cfg.duals
|
29 |
|
|
seed!(xdual, x, cfg.seeds)
|
30 |
|
|
seed!(ydual, y)
|
31 |
|
|
f!(ydual, xdual)
|
32 |
|
|
return ydual
|
33 |
|
|
end
|
34 |
|
|
|
35 |
|
|
##################################
|
36 |
|
|
# seed construction/manipulation #
|
37 |
|
|
##################################
|
38 |
|
|
|
39 |
|
|
@generated function construct_seeds(::Type{Partials{N,V}}) where {N,V}
|
40 |
|
|
return Expr(:tuple, [:(single_seed(Partials{N,V}, Val{$i}())) for i in 1:N]...)
|
41 |
|
|
end
|
42 |
|
|
|
43 |
|
|
1 (0 %)
samples spent in seed!
1 (100 %) (incl.)
when called from seed!
line 45
function seed!(duals::AbstractArray{Dual{T,V,N}}, x,
|
44 |
|
|
seed::Partials{N,V} = zero(Partials{N,V})) where {T,V,N}
|
45 |
|
2 (1 %) |
1 (0 %)
samples spent in seed!
1 (100 %) (incl.)
when called from chunk_mode_jacobian!
line 194
duals .= Dual{T,V,N}.(x, Ref(seed))
|
46 |
|
|
return duals
|
47 |
|
|
end
|
48 |
|
|
|
49 |
|
|
function seed!(duals::AbstractArray{Dual{T,V,N}}, x,
|
50 |
|
|
seeds::NTuple{N,Partials{N,V}}) where {T,V,N}
|
51 |
|
|
dual_inds = 1:N
|
52 |
|
|
duals[dual_inds] .= Dual{T,V,N}.(view(x,dual_inds), seeds)
|
53 |
|
|
return duals
|
54 |
|
|
end
|
55 |
|
|
|
56 |
|
|
function seed!(duals::AbstractArray{Dual{T,V,N}}, x, index,
|
57 |
|
|
seed::Partials{N,V} = zero(Partials{N,V})) where {T,V,N}
|
58 |
|
|
offset = index - 1
|
59 |
|
|
dual_inds = (1:N) .+ offset
|
60 |
|
|
duals[dual_inds] .= Dual{T,V,N}.(view(x, dual_inds), Ref(seed))
|
61 |
|
|
return duals
|
62 |
|
|
end
|
63 |
|
|
|
64 |
|
|
function seed!(duals::AbstractArray{Dual{T,V,N}}, x, index,
|
65 |
|
|
seeds::NTuple{N,Partials{N,V}}, chunksize = N) where {T,V,N}
|
66 |
|
|
offset = index - 1
|
67 |
|
|
seed_inds = 1:chunksize
|
68 |
|
|
dual_inds = seed_inds .+ offset
|
69 |
|
|
duals[dual_inds] .= Dual{T,V,N}.(view(x, dual_inds), getindex.(Ref(seeds), seed_inds))
|
70 |
|
|
return duals
|
71 |
|
|
end
|