@@ -88,6 +88,20 @@ function iterate(iter::OnSiteInteractionIterator{L, <:AbstractTensorMap}, i::Int
8888 end
8989 return Op_wrap, i + 1
9090end
91+ function iterate (iter:: OnSiteInteractionIterator{L, <:AbstractVector} , i:: Int64 = 1 ) where {L}
92+ i > L && return nothing
93+ if i == iter. Op. si
94+ Op_wrap = iter. Op
95+ elseif (i > iter. Op. si) && ! isnothing (_getZ (iter. Z, i))
96+ Z = _getZ (iter. Z, i)
97+ Op_wrap = LocalOperator (Z, :Z , i, false )
98+ else
99+ # TODO pspace is not correct but it will not be used for id operator
100+ pspace = domain (iter. Op)[1 ]
101+ Op_wrap = IdentityOperator (pspace, trivial (pspace), i)
102+ end
103+ return Op_wrap, i + 1
104+ end
91105
92106"""
93107 struct TwoSiteInteractionIterator{L, T} <: AbstractInteractionIterator{L}
@@ -192,6 +206,25 @@ function iterate(iter::TwoSiteInteractionIterator{L, <:AbstractTensorMap}, st::T
192206
193207 return Op_wrap, (i + 1 , getRightSpace (Op_wrap))
194208end
209+ function iterate (iter:: TwoSiteInteractionIterator{L, <:AbstractVector} , st:: Tuple{Int64, VectorSpace} = (1 , getLeftSpace (iter. O₁))) where {L}
210+ i, aspace = st
211+ i > L && return nothing
212+ if i == iter. O₁. si
213+ Op_wrap = iter. O₁
214+ elseif i == iter. O₂. si
215+ # add Z here
216+ Op_wrap = _addZ! (iter. O₂, _getZ (iter. Z, i))
217+ elseif (iter. O₁. si < i < iter. O₂. si) && ! isnothing (_getZ (iter. Z, i))
218+ Op_wrap = LocalOperator (_getZ (iter. Z, i), :Z , i, false ; aspace = (aspace, aspace))
219+ else
220+ # TODO pspace is not correct but it will not be used for id operator
221+ pspace = domain (iter. O₁)[1 ]
222+ Op_wrap = IdentityOperator (pspace, aspace, i)
223+ end
224+
225+ return Op_wrap, (i + 1 , getRightSpace (Op_wrap))
226+ end
227+
195228
196229"""
197230 ArbitraryInteractionIterator{L} <: AbstractInteractionIterator{L}
0 commit comments