Skip to content

Commit 35f39c1

Browse files
committed
fix extra ScalarOperator in mcsolve
1 parent 672c9d1 commit 35f39c1

File tree

2 files changed

+12
-13
lines changed

2 files changed

+12
-13
lines changed

src/time_evolution/mcsolve.jl

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -119,15 +119,16 @@ function _mcsolve_generate_statistics(sol, i, states, expvals_all, jump_times, j
119119
return jump_which[i] = sol_i.prob.p.jump_which
120120
end
121121

122-
function _mcsolve_make_Heff_QobjEvo(H::QuantumObject, c_ops)
123-
c_ops isa Nothing && return QobjEvo(H)
124-
return QobjEvo(H - 1im * mapreduce(op -> op' * op, +, c_ops) / 2)
122+
function _mcsolve_make_H_eff(H::QuantumObject, c_ops)
123+
# this will be convert to QobjEvo in sesolveProblem (avoid extra ScalarOperator)
124+
c_ops isa Nothing && return H
125+
return H - 1im * mapreduce(op -> op' * op, +, c_ops) / 2
125126
end
126-
function _mcsolve_make_Heff_QobjEvo(H::Tuple, c_ops)
127+
function _mcsolve_make_H_eff(H::Tuple, c_ops)
127128
c_ops isa Nothing && return QobjEvo(H)
128129
return QobjEvo((H..., -1im * mapreduce(op -> op' * op, +, c_ops) / 2))
129130
end
130-
function _mcsolve_make_Heff_QobjEvo(H::QuantumObjectEvolution, c_ops)
131+
function _mcsolve_make_H_eff(H::QuantumObjectEvolution, c_ops)
131132
c_ops isa Nothing && return H
132133
return H + QobjEvo(mapreduce(op -> op' * op, +, c_ops), -1im / 2)
133134
end
@@ -221,7 +222,7 @@ function mcsolveProblem(
221222

222223
tlist = convert(Vector{_FType(ψ0)}, tlist) # Convert it to support GPUs and avoid type instabilities for OrdinaryDiffEq.jl
223224

224-
H_eff_evo = _mcsolve_make_Heff_QobjEvo(H, c_ops)
225+
H_eff = _mcsolve_make_H_eff(H, c_ops)
225226

226227
if e_ops isa Nothing
227228
expvals = Array{ComplexF64}(undef, 0, length(tlist))
@@ -267,11 +268,11 @@ function mcsolveProblem(
267268
params...,
268269
)
269270

270-
return mcsolveProblem(H_eff_evo, ψ0, tlist, params2, jump_callback; kwargs2...)
271+
return mcsolveProblem(H_eff, ψ0, tlist, params2, jump_callback; kwargs2...)
271272
end
272273

273274
function mcsolveProblem(
274-
H_eff_evo::QuantumObjectEvolution{DT1,OperatorQuantumObject},
275+
H_eff::AbstractQuantumObject{DT1,OperatorQuantumObject},
275276
ψ0::QuantumObject{DT2,KetQuantumObject},
276277
tlist::AbstractVector,
277278
params::NamedTuple,
@@ -285,11 +286,11 @@ function mcsolveProblem(
285286
haskey(kwargs2, :callback) ? merge(kwargs2, (callback = CallbackSet(cb1, cb2, kwargs2.callback),)) :
286287
merge(kwargs2, (callback = CallbackSet(cb1, cb2),))
287288

288-
return sesolveProblem(H_eff_evo, ψ0, tlist; params = params, kwargs2...)
289+
return sesolveProblem(H_eff, ψ0, tlist; params = params, kwargs2...)
289290
end
290291

291292
function mcsolveProblem(
292-
H_eff_evo::QuantumObjectEvolution{DT1,OperatorQuantumObject},
293+
H_eff::AbstractQuantumObject{DT1,OperatorQuantumObject},
293294
ψ0::QuantumObject{DT2,KetQuantumObject},
294295
tlist::AbstractVector,
295296
params::NamedTuple,
@@ -309,7 +310,7 @@ function mcsolveProblem(
309310
haskey(kwargs2, :callback) ? merge(kwargs2, (callback = CallbackSet(cb1, cb2, kwargs2.callback),)) :
310311
merge(kwargs2, (callback = CallbackSet(cb1, cb2),))
311312

312-
return sesolveProblem(H_eff_evo, ψ0, tlist; params = params, kwargs2...)
313+
return sesolveProblem(H_eff, ψ0, tlist; params = params, kwargs2...)
313314
end
314315

315316
@doc raw"""

test/core-test/time_evolution.jl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@
8484
progress_bar = Val(false),
8585
jump_callback = DiscreteLindbladJumpCallback(),
8686
)
87-
prob_sse = ssesolveProblem(H, psi0, t_l, c_ops, e_ops = e_ops, progress_bar = Val(false))
8887
sol_sse = ssesolve(H, psi0, t_l, c_ops, ntraj = 500, e_ops = e_ops, progress_bar = Val(false))
8988

9089
ρt_mc = [ket2dm.(normalize.(states)) for states in sol_mc_states.states]
@@ -100,7 +99,6 @@
10099
sol_sse_string = sprint((t, s) -> show(t, "text/plain", s), sol_sse)
101100
@test prob_me.f.f isa MatrixOperator
102101
@test prob_mc.f.f isa MatrixOperator
103-
@test prob_sse.f.f isa MatrixOperator
104102
@test sum(abs.(sol_mc.expect .- sol_me.expect)) / length(t_l) < 0.1
105103
@test sum(abs.(sol_mc2.expect .- sol_me.expect)) / length(t_l) < 0.1
106104
@test sum(abs.(vec(expect_mc_states_mean) .- vec(sol_me.expect))) / length(t_l) < 0.1

0 commit comments

Comments
 (0)