Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ Arpack = "0.5.1 - 0.5.3"
DiffEqBase = "6.162"
DiffEqCallbacks = "2, 3, 4"
DiffEqNoiseProcess = "5.23.0"
DifferentiationInterface = "0.6.39"
FFTW = "1"
FiniteDiff = "2.27.0"
ForwardDiff = "0.10, 1"
Expand All @@ -52,6 +53,7 @@ julia = "1.10"

[extras]
Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595"
DifferentiationInterface = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63"
FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41"
JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b"
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
Expand All @@ -61,4 +63,4 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
TestItemRunner = "f8b46487-2199-4994-9208-9a1283c18c0a"

[targets]
test = ["Aqua", "FiniteDiff", "JET", "LinearAlgebra", "SparseArrays", "Random", "Test", "TestItemRunner"]
test = ["Aqua", "DifferentiationInterface", "FiniteDiff", "JET", "LinearAlgebra", "SparseArrays", "Random", "Test", "TestItemRunner"]
50 changes: 43 additions & 7 deletions src/master.jl
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ function master_h(tspan, rho0::Operator, H::AbstractOperator, J;
_check_const.(J)
_check_const.(Jdagger)
check_master(rho0, H, J, Jdagger, rates)
tspan, rho0 = _promote_time_and_state(rho0, H, J, tspan)
tspan, rho0 = _promote_time_and_state(rho0, H, J, rates, tspan)
tmp = copy(rho0)
dmaster_(t, rho, drho) = dmaster_h!(drho, H, J, Jdagger, rates, rho, tmp)
integrate_master(tspan, dmaster_, rho0, fout; kwargs...)
Expand Down Expand Up @@ -42,7 +42,7 @@ function master_nh(tspan, rho0::Operator, Hnh::AbstractOperator, J;
_check_const.(J)
_check_const.(Jdagger)
check_master(rho0, Hnh, J, Jdagger, rates)
tspan, rho0 = _promote_time_and_state(rho0, Hnh, J, tspan)
tspan, rho0 = _promote_time_and_state(rho0, Hnh, J, rates, tspan)
tmp = copy(rho0)
dmaster_(t, rho, drho) = dmaster_nh!(drho, Hnh, Hnhdagger, J, Jdagger, rates, rho, tmp)
integrate_master(tspan, dmaster_, rho0, fout; kwargs...)
Expand Down Expand Up @@ -88,7 +88,7 @@ function master(tspan, rho0::Operator, H::AbstractOperator, J;
_check_const(H)
_check_const.(J)
_check_const.(Jdagger)
tspan, rho0 = _promote_time_and_state(rho0, H, J, tspan)
tspan, rho0 = _promote_time_and_state(rho0, H, J, rates, tspan)
isreducible = check_master(rho0, H, J, Jdagger, rates)
if !isreducible
tmp = copy(rho0)
Expand Down Expand Up @@ -172,14 +172,32 @@ function master_nh_dynamic(tspan, rho0::Operator, f;
rates=nothing,
fout=nothing,
kwargs...)
tspan, rho0 = _promote_time_and_state(rho0, f, tspan)
tmp = copy(rho0)
dmaster_(t, rho, drho) = dmaster_nh_dynamic!(drho, f, rates, rho, tmp, t)
integrate_master(tspan, dmaster_, rho0, fout; kwargs...)
end

function master_nh_dynamic(tspan, rho0::Operator, Hnh::AbstractTimeDependentOperator, J::Vector{<:AbstractTimeDependentOperator};
kwargs...)
promoted_tspan, rho0 = _promote_time_and_state(rho0, Hnh, J, tspan)
if promoted_tspan !== tspan # promote H
promoted_Hnh = TimeDependentSum(Hnh.coefficients, Hnh.static_op.operators; init_time=first(promoted_tspan))
promoted_J = [TimeDependentSum(Ji.coefficients, Ji.static_op.operators; init_time=first(promoted_tspan)) for Ji in J]
f = master_nh_dynamic_function(promoted_Hnh, promoted_J)
else
f = master_nh_dynamic_function(Hnh, J)
end
master_nh_dynamic(tspan, rho0, f; kwargs...)
end
function master_nh_dynamic(tspan, rho0::Operator, Hnh::AbstractTimeDependentOperator, J;
kwargs...)
f = master_nh_dynamic_function(Hnh, J)
promoted_tspan, rho0 = _promote_time_and_state(rho0, Hnh, J, tspan)
if promoted_tspan !== tspan # promote H
promoted_Hnh = TimeDependentSum(Hnh.coefficients, Hnh.static_op.operators; init_time=first(promoted_tspan))
f = master_nh_dynamic_function(promoted_Hnh, J)
else
f = master_nh_dynamic_function(Hnh, J)
end
master_nh_dynamic(tspan, rho0, f; kwargs...)
end

Expand Down Expand Up @@ -218,17 +236,35 @@ function master_dynamic(tspan, rho0::Operator, f;
rates=nothing,
fout=nothing,
kwargs...)
tspan, rho0 = _promote_time_and_state(rho0, f, tspan)
tmp = copy(rho0)
dmaster_ = let f = f, tmp = tmp
dmaster_(t, rho, drho) = dmaster_h_dynamic!(drho, f, rates, rho, tmp, t)
end
integrate_master(tspan, dmaster_, rho0, fout; kwargs...)
end

function master_dynamic(tspan, rho0::Operator, H::AbstractTimeDependentOperator, J::Vector{<:AbstractTimeDependentOperator};
kwargs...)
promoted_tspan, rho0 = _promote_time_and_state(rho0, H, J, tspan)
if promoted_tspan !== tspan # promote H
promoted_H = TimeDependentSum(H.coefficients, H.static_op.operators; init_time=first(promoted_tspan))
promoted_J = [TimeDependentSum(Ji.coefficients, Ji.static_op.operators; init_time=first(promoted_tspan)) for Ji in J]
f = master_h_dynamic_function(promoted_H, promoted_J)
else
f = master_h_dynamic_function(H, J)
end
return master_dynamic(promoted_tspan, rho0, f; kwargs...)
end
function master_dynamic(tspan, rho0::Operator, H::AbstractTimeDependentOperator, J;
kwargs...)
f = master_h_dynamic_function(H, J)
master_dynamic(tspan, rho0, f; kwargs...)
promoted_tspan, rho0 = _promote_time_and_state(rho0, H, J, tspan)
if promoted_tspan !== tspan # promote H
promoted_H = TimeDependentSum(H.coefficients, H.static_op.operators; init_time=first(promoted_tspan))
return master_dynamic(promoted_tspan, rho0, master_h_dynamic_function(promoted_H, J); kwargs...)
else
return master_dynamic(promoted_tspan, rho0, master_h_dynamic_function(H, J); kwargs...)
end
end

# Automatically convert Ket states to density operators
Expand Down
25 changes: 23 additions & 2 deletions src/timeevolution_base.jl
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,29 @@ function _promote_time_and_state(u0, H::AbstractOperator, J, tspan)
tspan_promote = DiffEqBase.promote_tspan(u0_promote.data, p, tspan, nothing, Dict{Symbol, Any}())
return tspan_promote, u0_promote
end

_promote_time_and_state(u0, f, tspan) = _promote_time_and_state(u0, f(first(tspan)..., u0), tspan)
function _promote_time_and_state(u0, H::AbstractOperator, J, rates, tspan)
# TODO: Find an alternative to promote_dual, which was moved to
# an extension in DiffEqBase 6.162.0
ext = Base.get_extension(DiffEqBase, :DiffEqBaseForwardDiffExt)
Ts = reduce(ext.promote_dual, (eltype(H), DiffEqBase.anyeltypedual(J), DiffEqBase.anyeltypedual(rates)))
Tt = real(Ts)
p = Vector{Tt}(undef,0)
u0_promote = DiffEqBase.promote_u0(u0, p, tspan[1])
tspan_promote = DiffEqBase.promote_tspan(u0_promote.data, p, tspan, nothing, Dict{Symbol, Any}())
return tspan_promote, u0_promote
end
_promote_time_and_state(u0, f::Function, tspan) = _promote_time_and_state(u0, f(first(tspan)..., u0), tspan)
function _promote_time_and_state(u0, f::Union{Tuple, Vector}, tspan)
# TODO: Find an alternative to promote_dual, which was moved to
# an extension in DiffEqBase 6.162.0
ext = Base.get_extension(DiffEqBase, :DiffEqBaseForwardDiffExt)
Ts = reduce(ext.promote_dual, (eltype(f[1]), DiffEqBase.anyeltypedual.(f[2:end])...))
Tt = real(Ts)
p = Vector{Tt}(undef,0)
u0_promote = DiffEqBase.promote_u0(u0, p, tspan[1])
tspan_promote = DiffEqBase.promote_tspan(u0_promote.data, p, tspan, nothing, Dict{Symbol, Any}())
return tspan_promote, u0_promote
end

@inline function DiffEqBase.promote_u0(u0::Ket, p, t0)
u0data_promote = DiffEqBase.promote_u0(u0.data, p, t0)
Expand Down
Loading
Loading