7272
7373function seed! (duals:: AbstractArray{Dual{T,V,N}} , x,
7474 seed:: Partials{N,V} = zero (Partials{N,V})) where {T,V,N}
75- for idx in structural_eachindex (duals, x)
76- duals[idx] = Dual {T,V,N} (x[idx], seed)
75+ if isbitstype (V)
76+ for idx in structural_eachindex (duals, x)
77+ duals[idx] = Dual {T,V,N} (x[idx], seed)
78+ end
79+ else
80+ for idx in structural_eachindex (duals, x)
81+ if isassigned (x, idx)
82+ duals[idx] = Dual {T,V,N} (x[idx], seed)
83+ else
84+ Base. _unsetindex! (duals, idx)
85+ end
86+ end
7787 end
7888 return duals
7989end
8090
8191function seed! (duals:: AbstractArray{Dual{T,V,N}} , x,
8292 seeds:: NTuple{N,Partials{N,V}} ) where {T,V,N}
83- for (i, idx) in zip (1 : N, structural_eachindex (duals, x))
84- duals[idx] = Dual {T,V,N} (x[idx], seeds[i])
93+ if isbitstype (V)
94+ for (i, idx) in zip (1 : N, structural_eachindex (duals, x))
95+ duals[idx] = Dual {T,V,N} (x[idx], seeds[i])
96+ end
97+ else
98+ for (i, idx) in zip (1 : N, structural_eachindex (duals, x))
99+ if isassigned (x, idx)
100+ duals[idx] = Dual {T,V,N} (x[idx], seeds[i])
101+ else
102+ Base. _unsetindex! (duals, idx)
103+ end
104+ end
85105 end
86106 return duals
87107end
@@ -90,8 +110,18 @@ function seed!(duals::AbstractArray{Dual{T,V,N}}, x, index,
90110 seed:: Partials{N,V} = zero (Partials{N,V})) where {T,V,N}
91111 offset = index - 1
92112 idxs = Iterators. drop (structural_eachindex (duals, x), offset)
93- for idx in idxs
94- duals[idx] = Dual {T,V,N} (x[idx], seed)
113+ if isbitstype (V)
114+ for idx in idxs
115+ duals[idx] = Dual {T,V,N} (x[idx], seed)
116+ end
117+ else
118+ for idx in idxs
119+ if isassigned (x, idx)
120+ duals[idx] = Dual {T,V,N} (x[idx], seed)
121+ else
122+ Base. _unsetindex! (duals, idx)
123+ end
124+ end
95125 end
96126 return duals
97127end
@@ -100,8 +130,18 @@ function seed!(duals::AbstractArray{Dual{T,V,N}}, x, index,
100130 seeds:: NTuple{N,Partials{N,V}} , chunksize = N) where {T,V,N}
101131 offset = index - 1
102132 idxs = Iterators. drop (structural_eachindex (duals, x), offset)
103- for (i, idx) in zip (1 : chunksize, idxs)
104- duals[idx] = Dual {T,V,N} (x[idx], seeds[i])
133+ if isbitstype (V)
134+ for (i, idx) in zip (1 : chunksize, idxs)
135+ duals[idx] = Dual {T,V,N} (x[idx], seeds[i])
136+ end
137+ else
138+ for (i, idx) in zip (1 : chunksize, idxs)
139+ if isassigned (x, idx)
140+ duals[idx] = Dual {T,V,N} (x[idx], seeds[i])
141+ else
142+ Base. _unsetindex! (duals, idx)
143+ end
144+ end
105145 end
106146 return duals
107147end
0 commit comments