Skip to content

Instantly share code, notes, and snippets.

@amitjamadagni
Last active August 29, 2015 14:23
Show Gist options
  • Save amitjamadagni/62a78dd13b7be1d86b84 to your computer and use it in GitHub Desktop.
Save amitjamadagni/62a78dd13b7be1d86b84 to your computer and use it in GitHub Desktop.
SE, LVN, LME types and integration
using QuBase
import Base: start, next, done
abstract QuPropagatorMethod
abstract QuantumEquation
immutable SE{H<:QuBase.AbstractQuMatrix, V<:QuBase.AbstractQuVector} <: QuantumEquation
hamiltonian::H
initial_state::V
SE(hamiltonian, initial_state) = new(hamiltonian, initial_state)
end
SE{H<:QuBase.AbstractQuMatrix, V<:QuBase.AbstractQuVector}(hamiltonian::H, initial_state::V) = SE{H,V}(hamiltonian, initial_state)
immutable LVN{H<:QuBase.AbstractQuMatrix} <: QuantumEquation
hamiltonian::H
initial_density_matrix::H
LVN(hamiltonian, initial_density_matrix) = new(hamiltonian, initial_density_matrix)
end
LVN{H<:QuBase.AbstractQuMatrix}(hamiltonian::H, initial_density_matrix::H) = LVN{H}(hamiltonian, initial_density_matrix)
immutable QuPropagator{QPM<:QuPropagatorMethod, QE<:QuantumEquation}
qu_equation::QE
tlist
method::QPM
QuPropagator(qu_equation, tlist, method) = new(qu_equation, tlist, method)
end
QuPropagator{QPM<:QuPropagatorMethod, QE<:QuantumEquation}(qu_equation::QE, tlist, method::QPM) = QuPropagator{QPM, QE}(qu_equation, tlist, method)
immutable QuPropagatorState
psi
t
t_state
end
function start_state(qu_eq::LVN)
return qu_eq.initial_density_matrix
end
function start_state(qu_eq::SE)
return qu_eq.initial_state
end
function Base.start(prob::QuPropagator)
init_state = start_state(prob.qu_equation)
t_state = start(prob.tlist)
t,t_state = next(prob.tlist,t_state)
return QuPropagatorState(init_state,t,t_state)
end
function op(qu_eq::LVN)
return qu_eq.hamiltonian
end
function op(qu_eq::SE)
return qu_eq.hamiltonian
end
function Base.next{QPM<:QuPropagatorMethod}(prob::QuPropagator{QPM}, qustate::QuPropagatorState)
current_qustate = qustate.psi
current_t = qustate.t
t,t_state = next(prob.tlist, qustate.t_state)
next_qustate = propagate(prob.method, t, current_t, current_qustate, prob.qu_equation)
return (t, next_qustate), QuPropagatorState(next_qustate, t, t_state)
end
Base.done(prob::QuPropagator, qustate::QuPropagatorState) = done(prob.tlist, qustate.t_state)
immutable QuEuler <: QuPropagatorMethod
end
function propagate(prob::QuEuler, t, current_t, current_qustate, qu_eq::SE)
dt = t - current_t
return (eye(op(qu_eq))-im*op(qu_eq)*dt)*current_qustate
end
qv = normalize!(QuArray([0.5+0.1im, 0.2+0.2im]))
t = 0.:0.1:2*pi
se = SE(sigmax, qv)
println(se)
lvn = LVN(sigmax, sigmax)
println(lvn)
qe = QuPropagator(se, t, QuEuler())
println(qe)
start_qe = start(qe)
println(start_qe)
next_start_qe = next(qe, start_qe)
println(next_start_qe)
# Results in
SE{QuArray{FiniteBasis{Orthonormal},Float64,2,Array{Float64,2}},QuArray{FiniteBasis{Orthonormal},Complex{Float64},1,Array{Complex{Float64},1}}}(2x2 QuMatrix in FiniteBasis{Orthonormal}:
...coefficients: Array{Float64,2}
[0.0 1.0
1.0 0.0],2-element QuVector in FiniteBasis{Orthonormal}:
...coefficients: Array{Complex{Float64},1}
Complex{Float64}[0.8574929257125441 + 0.17149858514250882im,0.34299717028501764 + 0.34299717028501764im])
LVN{QuArray{FiniteBasis{Orthonormal},Float64,2,Array{Float64,2}}}(2x2 QuMatrix in FiniteBasis{Orthonormal}:
...coefficients: Array{Float64,2}
[0.0 1.0
1.0 0.0],2x2 QuMatrix in FiniteBasis{Orthonormal}:
...coefficients: Array{Float64,2}
[0.0 1.0
1.0 0.0])
QuPropagator{QuEuler,SE{QuArray{FiniteBasis{Orthonormal},Float64,2,Array{Float64,2}},QuArray{FiniteBasis{Orthonormal},Complex{Float64},1,Array{Complex{Float64},1}}}}(SE{QuArray{FiniteBasis{Orthonormal},Float64,2,Array{Float64,2}},QuArray{FiniteBasis{Orthonormal},Complex{Float64},1,Array{Complex{Float64},1}}}(2x2 QuMatrix in FiniteBasis{Orthonormal}:
...coefficients: Array{Float64,2}
[0.0 1.0
1.0 0.0],2-element QuVector in FiniteBasis{Orthonormal}:
...coefficients: Array{Complex{Float64},1}
Complex{Float64}[0.8574929257125441 + 0.17149858514250882im,0.34299717028501764 + 0.34299717028501764im]),0.0:0.1:6.2,QuEuler())
QuPropagatorState(2-element QuVector in FiniteBasis{Orthonormal}:
...coefficients: Array{Complex{Float64},1}
Complex{Float64}[0.8574929257125441 + 0.17149858514250882im,0.34299717028501764 + 0.34299717028501764im],0.0,1)
((0.1,2-element QuVector in FiniteBasis{Orthonormal}:
...coefficients: Array{Complex{Float64},1}
Complex{Float64}[0.8917926427410459 + 0.13719886811400706im,0.3601470287992685 + 0.25724787771376323im]),QuPropagatorState(2-element QuVector in FiniteBasis{Orthonormal}:
...coefficients: Array{Complex{Float64},1}
Complex{Float64}[0.8917926427410459 + 0.13719886811400706im,0.3601470287992685 + 0.25724787771376323im],0.1,2))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment