7272
7373function seed! (duals:: AbstractArray{Dual{T,V,N}} , x,
7474 seed:: Partials{N,V} = zero (Partials{N,V})) where {T,V,N}
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)
75+ if supports_fast_scalar_indexing (duals)
76+ if isbitstype (V)
77+ for idx in structural_eachindex (duals, x)
8278 duals[idx] = Dual {T,V,N} (x[idx], seed)
83- else
84- Base. _unsetindex! (duals, idx)
79+ end
80+ else
81+ for idx in structural_eachindex (duals, x)
82+ if isassigned (x, idx)
83+ duals[idx] = Dual {T,V,N} (x[idx], seed)
84+ else
85+ Base. _unsetindex! (duals, idx)
86+ end
8587 end
8688 end
89+ else
90+ idxs = collect (structural_eachindex (duals, x))
91+ duals[idxs] .= Dual {T,V,N} .(view (x, idxs), Ref (seed))
8792 end
8893 return duals
8994end
9095
9196function seed! (duals:: AbstractArray{Dual{T,V,N}} , x,
9297 seeds:: NTuple{N,Partials{N,V}} ) where {T,V,N}
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)
98+ if supports_fast_scalar_indexing (duals)
99+ if isbitstype (V)
100+ for (i, idx) in zip (1 : N, structural_eachindex (duals, x))
100101 duals[idx] = Dual {T,V,N} (x[idx], seeds[i])
101- else
102- Base. _unsetindex! (duals, idx)
102+ end
103+ else
104+ for (i, idx) in zip (1 : N, structural_eachindex (duals, x))
105+ if isassigned (x, idx)
106+ duals[idx] = Dual {T,V,N} (x[idx], seeds[i])
107+ else
108+ Base. _unsetindex! (duals, idx)
109+ end
103110 end
104111 end
112+ else
113+ idxs = collect (Iterators. take (structural_eachindex (duals, x), N))
114+ duals[idxs] .= Dual {T,V,N} .(view (x, idxs), getindex .(Ref (seeds), 1 : length (idxs)))
105115 end
106116 return duals
107117end
@@ -110,18 +120,23 @@ function seed!(duals::AbstractArray{Dual{T,V,N}}, x, index,
110120 seed:: Partials{N,V} = zero (Partials{N,V})) where {T,V,N}
111121 offset = index - 1
112122 idxs = Iterators. drop (structural_eachindex (duals, x), offset)
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)
123+ if supports_fast_scalar_indexing (duals)
124+ if isbitstype (V)
125+ for idx in idxs
120126 duals[idx] = Dual {T,V,N} (x[idx], seed)
121- else
122- Base. _unsetindex! (duals, idx)
127+ end
128+ else
129+ for idx in idxs
130+ if isassigned (x, idx)
131+ duals[idx] = Dual {T,V,N} (x[idx], seed)
132+ else
133+ Base. _unsetindex! (duals, idx)
134+ end
123135 end
124136 end
137+ else
138+ idxs = collect (idxs)
139+ duals[idxs] .= Dual {T,V,N} .(view (x, idxs), Ref (seed))
125140 end
126141 return duals
127142end
@@ -130,18 +145,23 @@ function seed!(duals::AbstractArray{Dual{T,V,N}}, x, index,
130145 seeds:: NTuple{N,Partials{N,V}} , chunksize = N) where {T,V,N}
131146 offset = index - 1
132147 idxs = Iterators. drop (structural_eachindex (duals, x), offset)
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)
148+ if supports_fast_scalar_indexing (duals)
149+ if isbitstype (V)
150+ for (i, idx) in zip (1 : chunksize, idxs)
140151 duals[idx] = Dual {T,V,N} (x[idx], seeds[i])
141- else
142- Base. _unsetindex! (duals, idx)
152+ end
153+ else
154+ for (i, idx) in zip (1 : chunksize, idxs)
155+ if isassigned (x, idx)
156+ duals[idx] = Dual {T,V,N} (x[idx], seeds[i])
157+ else
158+ Base. _unsetindex! (duals, idx)
159+ end
143160 end
144161 end
162+ else
163+ idxs = collect (Iterators. take (idxs, chunksize))
164+ duals[idxs] .= Dual {T,V,N} .(view (x, idxs), getindex .(Ref (seeds), 1 : length (idxs)))
145165 end
146166 return duals
147167end
0 commit comments