StatProfilerHTML.jl report
Generated on Thu, 21 Dec 2023 12:59:22
File source code
Line Exclusive Inclusive Code
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
1 (50 %) samples spent calling seed!
1 (50 %) samples spent calling materialize!
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