diff --git a/src/algorithm/GRAPE.jl b/src/AsymptoticBound/CramerRao.jl similarity index 100% rename from src/algorithm/GRAPE.jl rename to src/AsymptoticBound/CramerRao.jl diff --git a/src/AsymptoticBound/Holevo.jl b/src/AsymptoticBound/Holevo.jl new file mode 100644 index 0000000..e69de29 diff --git a/src/BayesianBound/BayesEstimation.jl b/src/BayesianBound/BayesEstimation.jl new file mode 100644 index 0000000..e69de29 diff --git a/src/BayesianBound/ZivZakaiBound.jl b/src/BayesianBound/ZivZakaiBound.jl new file mode 100644 index 0000000..e69de29 diff --git a/src/OptAlgorithm/DDPG.jl b/src/OptAlgorithm/DDPG.jl new file mode 100644 index 0000000..e69de29 diff --git a/src/OptAlgorithm/DE.jl b/src/OptAlgorithm/DE.jl new file mode 100644 index 0000000..e69de29 diff --git a/src/OptAlgorithm/GRAPE.jl b/src/OptAlgorithm/GRAPE.jl new file mode 100644 index 0000000..e69de29 diff --git a/src/OptAlgorithm/NM.jl b/src/OptAlgorithm/NM.jl new file mode 100644 index 0000000..e69de29 diff --git a/src/OptAlgorithm/PSO.jl b/src/OptAlgorithm/PSO.jl new file mode 100644 index 0000000..e69de29 diff --git a/src/algorithm/algorithm.jl b/src/algorithm.jl similarity index 97% rename from src/algorithm/algorithm.jl rename to src/algorithm.jl index dec83c8..c2049e7 100644 --- a/src/algorithm/algorithm.jl +++ b/src/algorithm.jl @@ -1 +1,2 @@ abstract type AbstractAlgorithm end + diff --git a/src/dynamics/dynamics.jl b/src/dynamics.jl similarity index 79% rename from src/dynamics/dynamics.jl rename to src/dynamics.jl index b1d300a..d4f1151 100644 --- a/src/dynamics/dynamics.jl +++ b/src/dynamics.jl @@ -12,6 +12,7 @@ abstract type noisy <: AbstractNoise end abstract type AbstractCtrl end abstract type free <: AbstractCtrl end abstract type controlled <: AbstractCtrl end +abstract type timedepend <: AbstractCtrl end # check if the dynamics are with noise isNoisy(::noiseless) = false @@ -21,5 +22,7 @@ isNoisy(dynamics::AbstractDynamics) = dynamics.noise_type|>eval|>isNoisy # check if the dynamics are in control isCtrl(::free) = false isCtrl(::controlled) = true -isCtrl(dynamics::AbstractDynamics) = dynamcs.ctrl_type|>eval|>isCtrl +isCtrl(dynamics::AbstractDynamics) = dynamics.ctrl_type|>eval|>isCtrl +include("dynamics/Lindblad.jl") +include("dynamics/Kraus.jl") diff --git a/src/dynamics/Kraus.jl b/src/dynamics/Kraus.jl index f5da4c8..1e7b680 100644 --- a/src/dynamics/Kraus.jl +++ b/src/dynamics/Kraus.jl @@ -21,3 +21,22 @@ end # Constructor for Kraus dynamics Kraus(K::AbstractVector, dK::AbstractVector, ρ::AbstractMatrix) = Kraus{dm}(Kraus_data(K,dK,ρ), :noiseless, :free, :dm) Kraus(K::AbstractVector, dK::AbstractVector, ψ::AbstractVector) = Kraus{ket}(Kraus_data(K,dK,ψ), :noiseless, :free, :ket) + +#### evolution of pure states under time-independent Hamiltonian without noise and controls #### +function evolve(dynamics::Kraus{noiseless, free, ket}) + (K, dK, ψ₀) = dynamics + ρ₀ = ψ₀*ψ₀' + ρ = [K*ρ₀*K' for K in K]|>sum + dρ = [[dK*ρ₀*K' + K*ρ₀*dK']|>sum for dK in dK] + + ρ, dρ +end + +#### evolution of density matrix under time-independent Hamiltonian without noise and controls #### +function evolve(dynamics::Kraus{noiseless, free, dm}) + (K, dK, ρ₀) = dynamics + ρ = [K*ρ₀*K' for K in K]|>sum + dρ = [[dK*ρ₀*K' + K*ρ₀*dK']|>sum for dK in dK] + + ρ, dρ +end diff --git a/src/dynamics/Lindblad.jl b/src/dynamics/Lindblad.jl index 31840a4..07dfb7b 100644 --- a/src/dynamics/Lindblad.jl +++ b/src/dynamics/Lindblad.jl @@ -7,12 +7,13 @@ struct Lindblad{N, C, R} <: AbstractDynamics state_rep::Symbol end -Lindblad{n,c}(data::AbstractDynamicsData,N::Symbol,C::Symbol) where {n,c} =Lindblad{n,c,dm}(data,N,C,:dm) +Lindblad(data,N,C,R) = Lindblad{((N,C,R).|>eval)...}(data,N,C,R) +Lindblad(data,N,C)=Lindblad(data,N,C,:dm) struct Lindblad_noiseless_free <: AbstractDynamicsData freeHamiltonian::AbstractMatrix Hamiltonian_derivative::AbstractVector - ρ0::AbstractMatrix +ρ0::AbstractMatrix tspan::AbstractVector end @@ -25,18 +26,34 @@ struct Lindblad_noisy_free <: AbstractDynamicsData γ::AbstractVector end + +struct Lindblad_noiseless_timedepend <: AbstractDynamicsData + freeHamiltonian::AbstractVector + Hamiltonian_derivative::AbstractVector + ρ0::AbstractMatrix + tspan::AbstractVector +end + +struct Lindblad_noisy_timedepend <: AbstractDynamicsData + freeHamiltonian::AbstractVector + Hamiltonian_derivative::AbstractVector + ρ0::AbstractMatrix + tspan::AbstractVector + decay_opt::AbstractVector + γ::AbstractVector +end + struct Lindblad_noiseless_controlled <: AbstractDynamicsData - freeHamiltonian::AbstractMatrix + freeHamiltonian::AbstractVecOrMat Hamiltonian_derivative::AbstractVector ρ0::AbstractMatrix tspan::AbstractVector control_Hamiltonian::AbstractVector control_coefficients::AbstractVector - ctrl_bound::AbstractVector end struct Lindblad_noisy_controlled <: AbstractDynamicsData - freeHamiltonian::AbstractMatrix + freeHamiltonian::AbstractVecOrMat Hamiltonian_derivative::AbstractVector ρ0::AbstractMatrix tspan::AbstractVector @@ -44,9 +61,9 @@ struct Lindblad_noisy_controlled <: AbstractDynamicsData γ::AbstractVector control_Hamiltonian::AbstractVector control_coefficients::AbstractVector - ctrl_bound::AbstractVector end + struct Lindblad_noiseless_free_pure <: AbstractDynamicsData freeHamiltonian::AbstractMatrix Hamiltonian_derivative::AbstractVector @@ -63,18 +80,32 @@ struct Lindblad_noisy_free_pure <: AbstractDynamicsData γ::AbstractVector end +struct Lindblad_noiseless_timedepend_pure <: AbstractDynamicsData + freeHamiltonian::AbstractVector + Hamiltonian_derivative::AbstractVector + ψ0::AbstractVector + tspan::AbstractVector +end + +struct Lindblad_noisy_timedepend_pure <: AbstractDynamicsData + freeHamiltonian::AbstractVector + Hamiltonian_derivative::AbstractVector + ψ0::AbstractVector + tspan::AbstractVector + decay_opt::AbstractVector + γ::AbstractVector +end struct Lindblad_noiseless_controlled_pure <: AbstractDynamicsData - freeHamiltonian::AbstractMatrix + freeHamiltonian::AbstractVecOrMat Hamiltonian_derivative::AbstractVector ψ0::AbstractVector tspan::AbstractVector control_Hamiltonian::AbstractVector control_coefficients::AbstractVector - ctrl_bound::AbstractVector end struct Lindblad_noisy_controlled_pure <: AbstractDynamicsData - freeHamiltonian::AbstractMatrix + freeHamiltonian::AbstractVecOrMat Hamiltonian_derivative::AbstractVector ψ0::AbstractVector tspan::AbstractVector @@ -82,29 +113,35 @@ struct Lindblad_noisy_controlled_pure <: AbstractDynamicsData γ::AbstractVector control_Hamiltonian::AbstractVector control_coefficients::AbstractVector - ctrl_bound::AbstractVector end # Constructor of Lindblad dynamics -Lindblad(H0::AbstractMatrix,dH::AbstractVector, ρ0::AbstractMatrix, tspan::AbstractVector) = Lindblad{noiseless, free}(Lindblad_noiseless_free(H0, dH, ρ0, tspan), :noiseless, :free) +Lindblad(H0::AbstractMatrix, dH::AbstractVector, ρ0::AbstractMatrix, tspan::AbstractVector) = Lindblad(Lindblad_noiseless_free(H0, dH, ρ0, tspan), :noiseless, :free) + +Lindblad(H0::AbstractMatrix, dH::AbstractVector, ρ0::AbstractMatrix, tspan::AbstractVector, decay_opt::AbstractVector,γ::AbstractVector) = Lindblad(Lindblad_noisy_free(H0, dH, ρ0, tspan, decay_opt, γ), :noisy, :free) + +Lindblad(H0::AbstractVector, dH::AbstractVector, ρ0::AbstractMatrix, tspan::AbstractVector) = Lindblad(Lindblad_noiseless_timedepend(H0, dH, ρ0, tspan,), :noiseless, :timedepend) + +Lindblad(H0::AbstractVector, dH::AbstractVector, ρ0::AbstractMatrix, tspan::AbstractVector, decay_opt::AbstractVector,γ::AbstractVector) = Lindblad(Lindblad_noisy_timedepend(H0, dH, ρ0, tspan, decay_opt, γ), :noisy, :timedepend) -Lindblad(H0::AbstractMatrix,dH::AbstractVector, ρ0::AbstractMatrix, tspan::AbstractVector, decay_opt::AbstractVector,γ::AbstractVector) = Lindblad{noisy,free}(Lindblad_noisy_free(H0, dH, ρ0, tspan, decay_opt, γ), :noisy, :free) +Lindblad(H0::AbstractVecOrMat, dH::AbstractVector, Hc::AbstractVector, cc::AbstractVector, ρ0::AbstractMatrix, tspan::AbstractVector) = Lindblad(Lindblad_noiseless_controlled(H0, dH, ρ0, tspan, Hc, cc), :noiseless, :controlled) -Lindblad(H0::AbstractMatrix,dH::AbstractVector, ρ0::AbstractMatrix, tspan::AbstractVector, Hc::AbstractVector, cc::AbstractVector, cb::AbstractVector ) = Lindblad{noiseless,controlled}(Lindblad_noiseless_controlled(H0, dH, ρ0, tspan, Hc, cc, cb), :noiseless, :controlled) +Lindblad(H0::AbstractVecOrMat, dH::AbstractVector,Hc::AbstractVector, cc::AbstractVector, ρ0::AbstractMatrix, tspan::AbstractVector, decay_opt::AbstractVector,γ::AbstractVector) = Lindblad(Lindblad_noisy_controlled(H0, dH, ρ0, tspan, decay_opt, γ, Hc, cc), :noisy, :controlled) -Lindblad(H0::AbstractMatrix,dH::AbstractVector, ρ0::AbstractMatrix, tspan::AbstractVector, decay_opt::AbstractVector,γ::AbstractVector,Hc::AbstractVector, cc::AbstractVector, cb::AbstractVector ) = Lindblad{noisy, controlled}(Lindblad_noisy_controlled(H0, dH, ρ0, tspan, decay_opt, γ, Hc, cc, cb), :noisy, :controlled) +Lindblad(H0::AbstractMatrix, dH::AbstractVector, ψ0::AbstractVector, tspan::AbstractVector) = Lindblad(Lindblad_noiseless_free(H0, dH, ψ0, tspan), :noiseless, :free, :ket) -Lindblad(H0::AbstractMatrix,dH::AbstractVector, ψ0::AbstractVector, tspan::AbstractVector) = Lindblad{noiseless, free, ket}(Lindblad_noiseless_free(H0, dH, ψ0, tspan), noiseless, free) +Lindblad(H0::AbstractMatrix, dH::AbstractVector, ψ0::AbstractVector, tspan::AbstractVector, decay_opt::AbstractVector,γ::AbstractVector) = Lindblad(Lindblad_noisy_free(H0, dH, ψ0, tspan, decay_opt, γ), :noisy, :free, :ket) -Lindblad(H0::AbstractMatrix,dH::AbstractVector, ψ0::AbstractVector, tspan::AbstractVector, decay_opt::AbstractVector,γ::AbstractVector) = Lindblad{noisy,free,ket}(Lindblad_noisy_free(H0, dH, ψ0, tspan, decay_opt, γ), noisy, free) +Lindblad(H0::AbstractVector, dH::AbstractVector, ψ0::AbstractVector, tspan::AbstractVector) = Lindblad(Lindblad_noiseless_timedepend(H0, dH, ψ0, tspan,), :noiseless, :timedepend, :ket) -Lindblad(H0::AbstractMatrix,dH::AbstractVector, ψ0::AbstractVector, tspan::AbstractVector, Hc::AbstractVector, cc::AbstractVector, cb::AbstractVector ) = Lindblad{noiseless,controlled, ket}(Lindblad_noiseless_controlled(H0, dH, ψ0, tspan, Hc, cc, cb), noiseless, controlled) +Lindblad(H0::AbstractVector, dH::AbstractVector, ψ0::AbstractVector, tspan::AbstractVector, decay_opt::AbstractVector,γ::AbstractVector) = Lindblad(Lindblad_noisy_timedepend(H0, dH, ψ0, tspan, decay_opt, γ), :noisy, :timedepend, :ket) -Lindblad(H0::AbstractMatrix,dH::AbstractVector, ψ0::AbstractVector, tspan::AbstractVector, decay_opt::AbstractVector,γ::AbstractVector,Hc::AbstractVector, cc::AbstractVector, cb::AbstractVector ) = Lindblad{noisy, controlled, ket}(Lindblad_noisy_controlled(H0, dH, ψ0, tspan, decay_opt, γ, Hc, cc, cb), noisy, controlled) +Lindblad(H0::AbstractVecOrMat, dH::AbstractVector, Hc::AbstractVector, cc::AbstractVector, ψ0::AbstractVector, tspan::AbstractVector) = Lindblad(Lindblad_noiseless_controlled(H0, dH, ψ0, tspan, Hc, cc), :noiseless, :controlled, :ket) +Lindblad(H0::AbstractVecOrMat, dH::AbstractVector, Hc::AbstractVector, cc::AbstractVector, ψ0::AbstractVector, tspan::AbstractVector, decay_opt::AbstractVector, γ::AbstractVector) = Lindblad(Lindblad_noisy_controlled(H0, dH, ψ0, tspan, decay_opt, γ, Hc, cc), :noisy, :controlled, :ket) -# functions for evolute dynamics in Lindblad form +# functions for evolve dynamics in Lindblad form function liouville_commu(H) kron(one(H), H) - kron(H |> transpose, one(H)) end @@ -184,12 +221,12 @@ function Htot(H0::Vector{Matrix{T}}, control_Hamiltonian::Vector{Matrix{T}}, con Htot = H0 + ([control_coefficients[i] .* [control_Hamiltonian[i]] for i in 1:length(control_coefficients)] |> sum ) end -function evolute(H, decay_opt, γ, dt, tj) +function evolve(H, decay_opt, γ, dt, tj) Ld = dt * liouvillian(H, decay_opt, γ, tj) exp(Ld) end -function evolute(H, dt) +function evolve(H, dt) freepart = liouville_commu(H) Ld = -1.0im * dt * freepart exp(Ld) @@ -212,7 +249,7 @@ function expm(H0::Matrix{T}, ∂H_∂x::Matrix{T}, ρ0::Matrix{T}, decay_opt::Ve ∂ρt_∂x_all[1] = ρt_all[1] |> zero for t in 2:length(tspan) - expL = evolute(H[t-1], decay_opt, γ, Δt, t) + expL = evolve(H[t-1], decay_opt, γ, Δt, t) ρt_all[t] = expL * ρt_all[t-1] ∂ρt_∂x_all[t] = -im * Δt * ∂H_L * ρt_all[t] + expL * ∂ρt_∂x_all[t-1] end @@ -232,14 +269,14 @@ function expm(H0::Matrix{T}, ∂H_∂x::Vector{Matrix{T}}, ρ0::Matrix{T}, decay Δt = tspan[2] - tspan[1] ρt_all = [Vector{ComplexF64}(undef, (length(H0))^2) for i in 1:length(tspan)] - ∂ρt_∂x_all = [[Vector{ComplexF64}(undef, (length(H0))^2) for j in 1:para_num] for i in 1:length(tspan)] + ∂ρt_∂x_all = [[Vector{ComplexF64}(undef, (length(H0))^2) for j in 1:para_num] for i in 1:length(tspan)] ρt_all[1] = ρ0 |> vec for pj in 1:para_num ∂ρt_∂x_all[1][pj] = ρt_all[1] |> zero end for t in 2:length(tspan) - expL = evolute(H[t-1], decay_opt, γ, Δt, t) + expL = evolve(H[t-1], decay_opt, γ, Δt, t) ρt_all[t] = expL * ρt_all[t-1] for pj in 1:para_num ∂ρt_∂x_all[t][pj] = -im * Δt * ∂H_L[pj] * ρt_all[t] + expL* ∂ρt_∂x_all[t-1][pj] @@ -248,23 +285,218 @@ function expm(H0::Matrix{T}, ∂H_∂x::Vector{Matrix{T}}, ρ0::Matrix{T}, decay ρt_all |> vec2mat, ∂ρt_∂x_all |> vec2mat end -######## evolute dynamics in Lindblad form####### -function evolute(dynamics::Lindblad{noiseless, free, dm}) +function secondorder_derivative(H0, ∂H_∂x::Vector{Matrix{T}}, ∂2H_∂x::Vector{Matrix{T}}, ρ0::Matrix{T}, decay_opt::Vector{Matrix{T}}, γ, Hc::Vector{Matrix{T}}, ctrl::Vector{Vector{R}}, tspan) where {T<:Complex,R<:Real} + + para_num = length(∂H_∂x) + ctrl_num = length(Hc) + ctrl_interval = ((length(tspan)-1)/length(ctrl[1])) |> Int + ctrl = [repeat(ctrl[i], 1, ctrl_interval) |>transpose |>vec for i in 1:ctrl_num] + + H = Htot(H0, Hc, ctrl) + ∂H_L = [liouville_commu(∂H_∂x[i]) for i in 1:para_num] + ∂2H_L = [liouville_commu(∂2H_∂x[i]) for i in 1:para_num] + + ρt = ρ0 |> vec + ∂ρt_∂x = [ρt |> zero for i in 1:para_num] + ∂2ρt_∂x = [ρt |> zero for i in 1:para_num] + for t in 2:length(tspan) + Δt = tspan[t] - tspan[t-1] # tspan may not be equally spaced + expL = evolve(H[t-1], decay_opt, γ, Δt, t) + ρt = expL * ρt + ∂ρt_∂x = [-im * Δt * ∂H_L[i] * ρt for i in 1:para_num] + [expL] .* ∂ρt_∂x + ∂2ρt_∂x = [(-im*Δt*∂2H_L[i] + Δt*Δt*∂H_L[i]*∂H_L[i])*ρt - 2*im*Δt*∂H_L[i]*∂ρt_∂x[i] for i in 1:para_num] + [expL] .* ∂2ρt_∂x + end + ρt = exp(vec(H[end])' * zero(ρt)) * ρt + ρt |> vec2mat, ∂ρt_∂x |> vec2mat, ∂2ρt_∂x |> vec2mat +end + +#### evolution of pure states under time-independent Hamiltonian without noise and controls #### +function evolve(dynamics::Lindblad{noiseless, free, ket}) + (H0, ∂H_∂x, psi0, tspan) = dynamics + + para_num = length(∂H_∂x) + Δt = tspan[2] - tspan[1] + U = exp(-im * H0 * Δt) + psi_t = psi0 + ∂psi_∂x = [psi0 |> zero for i in 1:para_num] + for t in 2:length(tspan) + psi_t = U * psi_t + ∂psi_∂x = [-im * Δt * ∂H_∂x[i] * psi_t for i in 1:para_num] + [U] .* ∂psi_∂x + end + ρt = psi_t * psi_t' + ∂ρt_∂x = [(∂psi_∂x[i] * psi_t' + psi_t * ∂psi_∂x[i]') for i in 1:para_num] + ρt, ∂ρt_∂x +end + +#### evolution of pure states under time-dependent Hamiltonian without noise and controls #### +function evolve(dynamics::Lindblad{noiseless, timedepend, ket}) + (H0, ∂H_∂x, psi0, tspan) = dynamics + + para_num = length(∂H_∂x) + ∂H_L = [liouville_commu(∂H_∂x[i]) for i in 1:para_num] + ρt = (psi0*psi0') |> vec + ∂ρt_∂x = [ρt |> zero for i in 1:para_num] + for t in 2:length(tspan) + Δt = tspan[t] - tspan[t-1] # tspan may not be equally spaced + expL = evolve(H0[t-1], Δt) + ρt = expL * ρt + ∂ρt_∂x = [-im * Δt * ∂H_L[i] * ρt for i in 1:para_num] + [expL] .* ∂ρt_∂x + end + ρt = exp( vec(H0[end])' * zero(ρt) ) * ρt + ρt |> vec2mat, ∂ρt_∂x |> vec2mat +end + +#### evolution of density matrix under time-independent Hamiltonian without noise and controls #### +function evolve(dynamics::Lindblad{noiseless, free, dm}) + (H0, ∂H_∂x, ρ0, tspan) = dynamics + + para_num = length(∂H_∂x) + Δt = tspan[2] - tspan[1] + expL = evolve(H0, Δt) + ∂H_L = [liouville_commu(∂H_∂x[i]) for i in 1:para_num] + ρt = ρ0 |> vec + ∂ρt_∂x = [ρt |> zero for i in 1:para_num] + for t in 2:length(tspan) + ρt = expL * ρt + ∂ρt_∂x = [-im * Δt * ∂H_L[i] * ρt for i in 1:para_num] + [expL] .* ∂ρt_∂x + end + ρt = exp(vec(H[end])' * zero(ρt)) * ρt + ρt |> vec2mat, ∂ρt_∂x |> vec2mat +end + +#### evolution of density matrix under time-dependent Hamiltonian without noise and controls #### +function evolve(dynamics::Lindblad{noiseless, timedepend, dm}) (H0, ∂H_∂x, ρ0, tspan) = dynamics + + para_num = length(∂H_∂x) + ∂H_L = [liouville_commu(∂H_∂x[i]) for i in 1:para_num] + ρt = ρ0 |> vec + ∂ρt_∂x = [ρt |> zero for i in 1:para_num] + for t in 2:length(tspan) + Δt = tspan[t] - tspan[t-1] # tspan may not be equally spaced + expL = evolve(H0[t-1], Δt) + ρt = expL * ρt + ∂ρt_∂x = [-im * Δt * ∂H_L[i] * ρt for i in 1:para_num] + [expL] .* ∂ρt_∂x + end + ρt = exp( vec(H0[end])' * zero(ρt) ) * ρt + ρt |> vec2mat, ∂ρt_∂x |> vec2mat +end + +#### evolution of pure states under time-independent Hamiltonian +#### with noise but without controls +function evolve(dynamics::Lindblad{noisy, free, ket}) + (H0, ∂H_∂x, psi0, tspan, decay_opt, γ) = dynamics + + para_num = length(∂H_∂x) + ρt = (psi0*psi0') |> vec + ∂ρt_∂x = [ρt |> zero for i in 1:para_num] + Δt = tspan[2] - tspan[1] + expL = evolve(H0, decay_opt, γ, Δt, 1) + ∂H_L = [liouville_commu(∂H_∂x[i]) for i in 1:para_num] + for t in 2:length(tspan) + ρt = expL * ρt + ∂ρt_∂x = [-im * Δt * ∂H_L[i] * ρt for i in 1:para_num] + [expL] .* ∂ρt_∂x + end + ρt |> vec2mat, ∂ρt_∂x |> vec2mat +end + +#### evolution of density matrix under time-independent Hamiltonian +#### with noise but without controls +function evolve(dynamics::Lindblad{noisy, free, dm}) + (H0, ∂H_∂x, ρ0, tspan, decay_opt, γ) = dynamics + + para_num = length(∂H_∂x) + ρt = ρ0 |> vec + ∂ρt_∂x = [ρt |> zero for i in 1:para_num] + Δt = tspan[2] - tspan[1] + expL = evolve(H0, decay_opt, γ, Δt, 1) + ∂H_L = [liouville_commu(∂H_∂x[i]) for i in 1:para_num] + for t in 2:length(tspan) + ρt = expL * ρt + ∂ρt_∂x = [-im * Δt * ∂H_L[i] * ρt for i in 1:para_num] + [expL] .* ∂ρt_∂x + end + ρt |> vec2mat, ∂ρt_∂x |> vec2mat +end + +#### evolution of pure states under time-dependent Hamiltonian +#### with noise but without controls +function evolve(dynamics::Lindblad{noisy, timedepend, ket}) + (H0, ∂H_∂x, psi0, tspan, decay_opt, γ) = dynamics + + para_num = length(∂H_∂x) + ∂H_L = [liouville_commu(∂H_∂x[i]) for i in 1:para_num] + ρt = (psi*psi') |> vec + ∂ρt_∂x = [ρt |> zero for i in 1:para_num] + for t in 2:length(tspan) + Δt = tspan[t] - tspan[t-1] # tspan may not be equally spaced + expL = evolve(H0[t-1], decay_opt, γ, Δt, t) + ρt = expL * ρt + ∂ρt_∂x = [-im * Δt * ∂H_L[i] * ρt for i in 1:para_num] + [expL] .* ∂ρt_∂x + end + ρt = exp(vec(H0[end])' * zero(ρt) ) * ρt + ρt |> vec2mat, ∂ρt_∂x |> vec2mat +end + +#### evolution of density matrix under time-dependent Hamiltonian +#### with noise but without controls +function evolve(dynamics::Lindblad{noisy, timedepend, dm}) + (H0, ∂H_∂x, ρ0, tspan, decay_opt, γ) = dynamics + para_num = length(∂H_∂x) - tnum = length(tspan) + ∂H_L = [liouville_commu(∂H_∂x[i]) for i in 1:para_num] + ρt = ρ0 |> vec + ∂ρt_∂x = [ρt |> zero for i in 1:para_num] + for t in 2:length(tspan) + Δt = tspan[t] - tspan[t-1] # tspan may not be equally spaced + expL = evolve(H0[t-1], decay_opt, γ, Δt, t) + ρt = expL * ρt + ∂ρt_∂x = [-im * Δt * ∂H_L[i] * ρt for i in 1:para_num] + [expL] .* ∂ρt_∂x + end + ρt = exp(vec(H0[end])' * zero(ρt) ) * ρt + ρt |> vec2mat, ∂ρt_∂x |> vec2mat +end - H = [H0 for i in 1:tnum] +#### evolution of density matrix under time-independent Hamiltonian +#### with controls but without noise #### +function evolve(dynamics::Lindblad{noiseless, controlled, dm}) + (H0, ∂H_∂x, ρ0, tspan, Hc, ctrl) = dynamics + + para_num = length(∂H_∂x) + ctrl_num = length(Hc) + ctrl_interval = ((length(tspan)-1)/length(ctrl[1])) |> Int + ctrl = [repeat(ctrl[i], 1, ctrl_interval) |>transpose |>vec for i in 1:ctrl_num] + H = Htot(H0, Hc, ctrl) ∂H_L = [liouville_commu(∂H_∂x[i]) for i in 1:para_num] + ρt = ρ0 |> vec + ∂ρt_∂x = [ρt |> zero for i in 1:para_num] + for t in 2:length(tspan) + Δt = tspan[t] - tspan[t-1] # tspan may not be equally spaced + expL = evolve(H[t-1], Δt) + ρt = expL * ρt + ∂ρt_∂x = [-im * Δt * ∂H_L[i] * ρt for i in 1:para_num] + [expL] .* ∂ρt_∂x + end + ρt = exp(vec(H[end])' * zero(ρt)) * ρt + ρt |> vec2mat, ∂ρt_∂x |> vec2mat +end +#### evolution of density matrix under time-independent Hamiltonian with noise and controls #### +function evolve(dynamics::Lindblad{noisy, controlled, dm}) + (H0, ∂H_∂x, ρ0, tspan, decay_opt, γ, Hc, ctrl) = dynamics + + para_num = length(∂H_∂x) + ctrl_num = length(Hc) + ctrl_interval = ((length(tspan)-1)/length(ctrl[1])) |> Int + ctrl = [repeat(ctrl[i], 1, ctrl_interval) |>transpose |>vec for i in 1:ctrl_num] + H = Htot(H0, Hc, ctrl) + ∂H_L = [liouville_commu(∂H_∂x[i]) for i in 1:para_num] ρt = ρ0 |> vec ∂ρt_∂x = [ρt |> zero for i in 1:para_num] for t in 2:length(tspan) - Δt = tspan[t] - tspan[t-1] - expL = evolute(H[t-1], Δt) + Δt = tspan[t] - tspan[t-1] # tspan may not be equally spaced + expL = evolve(H[t-1], decay_opt, γ, Δt, t) ρt = expL * ρt ∂ρt_∂x = [-im * Δt * ∂H_L[i] * ρt for i in 1:para_num] + [expL] .* ∂ρt_∂x end ρt = exp(vec(H[end])' * zero(ρt)) * ρt ρt |> vec2mat, ∂ρt_∂x |> vec2mat -end \ No newline at end of file +end diff --git a/src/objective.jl b/src/objective.jl index e69de29..3635cce 100644 --- a/src/objective.jl +++ b/src/objective.jl @@ -0,0 +1,6 @@ +abstract type AbstractObj end +abstract type AbstractObjData end + + +include("AsymptoticBound/CramerRao.jl") +include("AsymptoticBound/Holevo")