Skip to content

Commit ed20cae

Browse files
committed
new hamiltonian solvers
1 parent 6c74bae commit ed20cae

File tree

4 files changed

+73
-0
lines changed

4 files changed

+73
-0
lines changed

src/QuAlgorithmZoo.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ include("RotBasis.jl")
2727
include("Grover.jl")
2828
include("PhaseEstimation.jl")
2929
include("HHL.jl")
30+
include("hamiltonian_solvers.jl")
3031

3132

3233
end # module

src/hamiltonian_solvers.jl

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
export heisenberg, iter_groundstate!, itime_groundstate!
2+
3+
"""
4+
heisenberg(nbit::Int; periodic::Bool=true)
5+
6+
heisenberg hamiltonian, for its ground state, refer `PRB 48, 6141`.
7+
"""
8+
function heisenberg(nbit::Int; periodic::Bool=true)
9+
sx = i->put(nbit, i=>X)
10+
sy = i->put(nbit, i=>Y)
11+
sz = i->put(nbit, i=>Z)
12+
mapreduce(i->(j=i%nbit+1; sx(i)*sx(j)+sy(i)*sy(j)+sz(i)*sz(j)), +, 1:(periodic ? nbit : nbit-1))
13+
end
14+
15+
"""
16+
iter_groundstate!({reg::AbstractRegister}, h::MatrixBlock; niter::Int=100) -> AbstractRegister
17+
18+
project wave function to ground state by iteratively apply -h.
19+
"""
20+
iter_groundstate!(h::MatrixBlock; niter::Int=100) = reg -> iter_groundstate!(reg, h, niter=niter)
21+
function iter_groundstate!(reg::AbstractRegister, h::MatrixBlock; niter::Int=100)
22+
for i = 1:niter
23+
reg |> h
24+
i%5 == 0 && reg |> normalize!
25+
end
26+
reg |> normalize!
27+
end
28+
29+
"""
30+
itime_groundstate!({reg::AbstractRegister}, h::MatrixBlock; τ::Int=20, tol=1e-4) -> AbstractRegister
31+
32+
project wave function to ground state by exp(-hτ). `tol` is for `expmv`.
33+
"""
34+
itime_groundstate!(h::MatrixBlock; τ::Real=20, tol=1e-4) = reg -> itime_groundstate!(reg, h; τ=τ, tol=tol)
35+
function itime_groundstate!(reg::AbstractRegister, h::MatrixBlock; τ::Int=20, tol=1e-4)
36+
span = 1
37+
te = timeevolve(h, -im*span)
38+
for i = 1:τ÷span
39+
reg |> te |> normalize!
40+
end
41+
if τ%span != 0
42+
reg |> timeevolve(h, τ%span) |> normalize!
43+
end
44+
reg
45+
end
46+

test/hamiltonian_solvers.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using Yao, Yao.Blocks
2+
using LinearAlgebra
3+
using Test
4+
using QuAlgorithmZoo
5+
6+
@testset "solving hamiltonian" begin
7+
nbit = 8
8+
h = heisenberg(nbit) |> cache
9+
@test ishermitian(h)
10+
reg = rand_state(nqubits(h))
11+
E0 = expect(h, reg)/nbit
12+
reg |> iter_groundstate!(h, niter=1000)
13+
EG = expect(h, reg)/nbit/4
14+
@test isapprox(EG, -0.4564, atol=1e-4)
15+
16+
# using Time Evolution
17+
reg = rand_state(nqubits(h))
18+
reg |> itime_groundstate!(h, τ=20)
19+
EG = expect(h, reg)/nbit/4
20+
@test isapprox(EG, -0.4564, atol=1e-4)
21+
end
22+

test/runtests.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,7 @@ end
3232
@testset "QCOptProblem" begin
3333
include("QCOptProblem.jl")
3434
end
35+
36+
@testset "hamiltonian solvers" begin
37+
include("hamiltonian_solvers.jl")
38+
end

0 commit comments

Comments
 (0)