Skip to content

Commit 9129c80

Browse files
committed
rebase to ScaledOperator in time-independent mcsolve
1 parent 35f39c1 commit 9129c80

File tree

2 files changed

+12
-13
lines changed

2 files changed

+12
-13
lines changed

src/time_evolution/mcsolve.jl

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -119,16 +119,15 @@ 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_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
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)
126125
end
127-
function _mcsolve_make_H_eff(H::Tuple, c_ops)
126+
function _mcsolve_make_Heff_QobjEvo(H::Tuple, c_ops)
128127
c_ops isa Nothing && return QobjEvo(H)
129128
return QobjEvo((H..., -1im * mapreduce(op -> op' * op, +, c_ops) / 2))
130129
end
131-
function _mcsolve_make_H_eff(H::QuantumObjectEvolution, c_ops)
130+
function _mcsolve_make_Heff_QobjEvo(H::QuantumObjectEvolution, c_ops)
132131
c_ops isa Nothing && return H
133132
return H + QobjEvo(mapreduce(op -> op' * op, +, c_ops), -1im / 2)
134133
end
@@ -222,7 +221,7 @@ function mcsolveProblem(
222221

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

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

227226
if e_ops isa Nothing
228227
expvals = Array{ComplexF64}(undef, 0, length(tlist))
@@ -268,11 +267,11 @@ function mcsolveProblem(
268267
params...,
269268
)
270269

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

274273
function mcsolveProblem(
275-
H_eff::AbstractQuantumObject{DT1,OperatorQuantumObject},
274+
H_eff_evo::QuantumObjectEvolution{DT1,OperatorQuantumObject},
276275
ψ0::QuantumObject{DT2,KetQuantumObject},
277276
tlist::AbstractVector,
278277
params::NamedTuple,
@@ -286,11 +285,11 @@ function mcsolveProblem(
286285
haskey(kwargs2, :callback) ? merge(kwargs2, (callback = CallbackSet(cb1, cb2, kwargs2.callback),)) :
287286
merge(kwargs2, (callback = CallbackSet(cb1, cb2),))
288287

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

292291
function mcsolveProblem(
293-
H_eff::AbstractQuantumObject{DT1,OperatorQuantumObject},
292+
H_eff_evo::QuantumObjectEvolution{DT1,OperatorQuantumObject},
294293
ψ0::QuantumObject{DT2,KetQuantumObject},
295294
tlist::AbstractVector,
296295
params::NamedTuple,
@@ -310,7 +309,7 @@ function mcsolveProblem(
310309
haskey(kwargs2, :callback) ? merge(kwargs2, (callback = CallbackSet(cb1, cb2, kwargs2.callback),)) :
311310
merge(kwargs2, (callback = CallbackSet(cb1, cb2),))
312311

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

316315
@doc raw"""

test/core-test/time_evolution.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@
9898
sol_mc_string = sprint((t, s) -> show(t, "text/plain", s), sol_mc)
9999
sol_sse_string = sprint((t, s) -> show(t, "text/plain", s), sol_sse)
100100
@test prob_me.f.f isa MatrixOperator
101-
@test prob_mc.f.f isa MatrixOperator
101+
@test prob_mc.f.f isa ScaledOperator # TODO: can be optimized as MatrixOperator
102102
@test sum(abs.(sol_mc.expect .- sol_me.expect)) / length(t_l) < 0.1
103103
@test sum(abs.(sol_mc2.expect .- sol_me.expect)) / length(t_l) < 0.1
104104
@test sum(abs.(vec(expect_mc_states_mean) .- vec(sol_me.expect))) / length(t_l) < 0.1

0 commit comments

Comments
 (0)