@@ -209,32 +209,39 @@ end
209
209
nothing
210
210
end
211
211
212
+ const SymOrHerm = Union{<: Symmetric , <: Hermitian }
213
+ Base. IteratorSize (:: IterateNZ{2, <:SymOrHerm} ) = Base. SizeUnknown ()
212
214
213
- Base. IteratorSize (:: IterateNZ{2, <:Symmetric} ) = Base. SizeUnknown ()
214
-
215
- @inline Base. iterate (x:: IterateNZ{2, <:Symmetric} ) =
215
+ @inline Base. iterate (x:: IterateNZ{2, <:SymOrHerm} ) =
216
216
let iterator = iternz (x. m. data)
217
217
iternzsym (x. m, iterator, iterate (iterator))
218
218
end
219
+ # state is
220
+ # - the iterator to the inner internz
221
+ # - the (v, i, j) Tuple
222
+ # - a boolean that indicates we have to return the transposed
219
223
220
- @inline Base. iterate (x:: IterateNZ{2, <:Symmetric } , state) =
224
+ @inline Base. iterate (x:: IterateNZ{2, <:SymOrHerm } , state) =
221
225
let (iterator, (v, i, j), r, s) = state
222
226
if r
223
- (v , j, i), (iterator, (v, i, j), false , s)
227
+ (isa (x . m, Symmetric) ? transpose (v) : adjoint (v) , j, i), (iterator, (v, i, j), false , s)
224
228
else
225
229
iternzsym (x. m, iterator, iterate (iterator, s))
226
230
end
227
231
end
228
232
229
- @inline iternzsym (m:: Symmetric , iterator, a) = @inbounds begin
233
+ @inline iternzsym (m:: SymOrHerm , iterator, a) = @inbounds begin
230
234
while a != = nothing
231
235
r, state = a
232
- (_, i, j) = r
233
- if m. uplo == ' U'
234
- i <= j && return r, (iterator, r, i != j, state)
236
+ (v, i, j) = r
237
+ if i == j
238
+ v1 = isa (m, Symmetric) ? LinearAlgebra. symmetric (v, LinearAlgebra. sym_uplo (m. uplo)) : LinearAlgebra. hermitian (v, LinearAlgebra. sym_uplo (m. uplo))
239
+ return (v1, i, i), (iterator, r, false , state)
240
+ elseif m. uplo == ' U'
241
+ i <= j && return r, (iterator, r, true , state)
235
242
state = skip_col (iterator, state)
236
243
elseif m. uplo == ' L'
237
- i >= j && return r, (iterator, r, i != j , state)
244
+ i >= j && return r, (iterator, r, true , state)
238
245
state = skip_row_to (iterator, state, j)
239
246
end
240
247
a = iterate (iterator, state)
244
251
245
252
246
253
247
-
0 commit comments