2424# # the rest of the SciMLOperators will just use lazy tensor (and prompt a warning)
2525_spre (A:: MatrixOperator , Id:: AbstractMatrix ) = MatrixOperator (_spre (A. A, Id))
2626_spre (A:: ScaledOperator , Id:: AbstractMatrix ) = ScaledOperator (A. λ, _spre (A. L, Id))
27- _spre (A:: AddedOperator , Id:: AbstractMatrix ) = mapreduce ( op -> _spre (op, Id), + , A. ops)
27+ _spre (A:: AddedOperator , Id:: AbstractMatrix ) = AddedOperator ( map ( op -> _spre (op, Id), A. ops) )
2828function _spre (A:: AbstractSciMLOperator , Id:: AbstractMatrix )
2929 _lazy_tensor_warning (" spre" , A)
3030 return kron (Id, A)
3131end
3232
3333_spost (B:: MatrixOperator , Id:: AbstractMatrix ) = MatrixOperator (_spost (B. A, Id))
3434_spost (B:: ScaledOperator , Id:: AbstractMatrix ) = ScaledOperator (B. λ, _spost (B. L, Id))
35- _spost (B:: AddedOperator , Id:: AbstractMatrix ) = mapreduce ( op -> _spost (op, Id), + , B. ops)
35+ _spost (B:: AddedOperator , Id:: AbstractMatrix ) = AddedOperator ( map ( op -> _spost (op, Id), B. ops) )
3636function _spost (B:: AbstractSciMLOperator , Id:: AbstractMatrix )
3737 _lazy_tensor_warning (" spost" , B)
3838 return kron (transpose (B), Id)
@@ -43,7 +43,7 @@ _liouvillian(H::MT, Id::AbstractMatrix) where {MT<:Union{AbstractMatrix,Abstract
4343 - 1im * (_spre (H, Id) - _spost (H, Id))
4444_liouvillian (H:: MatrixOperator , Id:: AbstractMatrix ) = MatrixOperator (_liouvillian (H. A, Id))
4545_liouvillian (H:: ScaledOperator , Id:: AbstractMatrix ) = ScaledOperator (H. λ, _liouvillian (H. L, Id))
46- _liouvillian (H:: AddedOperator , Id:: AbstractMatrix ) = mapreduce ( op -> _liouvillian (op, Id), + , H. ops)
46+ _liouvillian (H:: AddedOperator , Id:: AbstractMatrix ) = AddedOperator ( map ( op -> _liouvillian (op, Id), H. ops) )
4747
4848# intrinsic lindblad_dissipator
4949function _lindblad_dissipator (O:: MT , Id:: AbstractMatrix ) where {MT<: Union{AbstractMatrix,AbstractSciMLOperator} }
@@ -166,16 +166,18 @@ function liouvillian(
166166) where {DT,OpType<: Union{OperatorQuantumObject,SuperOperatorQuantumObject} }
167167 L = liouvillian (H, Id_cache)
168168 if ! (c_ops isa Nothing)
169- # sum all the Qobj first
170- c_ops_ti = filter (op -> isa (op, QuantumObject), c_ops)
169+ c_ops_tuple = Tuple (c_ops) # we must convert it to a tuple, so filter below also return tuple
170+
171+ # sum all the (time-independent) c_ops first
172+ c_ops_ti = filter (op -> isa (op, QuantumObject), c_ops_tuple)
171173 if ! isempty (c_ops_ti)
172174 L += mapreduce (op -> lindblad_dissipator (op, Id_cache), + , c_ops_ti)
173175 end
174176
175177 # sum rest of the QobjEvo together
176- c_ops_td = filter (op -> isa (op, QuantumObjectEvolution), c_ops )
178+ c_ops_td = filter (op -> isa (op, QuantumObjectEvolution), c_ops_tuple )
177179 if ! isempty (c_ops_td)
178- L += mapreduce ( op -> lindblad_dissipator (op, Id_cache), + , c_ops_td)
180+ L += AddedOperator ( map ( op -> lindblad_dissipator (op, Id_cache), c_ops_td)) # it becomes AddedOperator at the end anyway
179181 end
180182 end
181183 return L
0 commit comments