Skip to content

Commit 140d240

Browse files
Add tests
1 parent 90f91c8 commit 140d240

File tree

4 files changed

+79
-4
lines changed

4 files changed

+79
-4
lines changed

src/qobj/eigsolve.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ function LinearAlgebra.mul!(y::AbstractVector, A::EigsolveInverseMap, x::Abstrac
129129
return copyto!(y, solve!(A.linsolve).u)
130130
end
131131

132-
function _update_schur_eigs!(Hₘ, Uₘ, Uₘᵥ, f, k, m, β, sorted_vals, sortby, rev)
132+
function _update_schur_eigs!(Hₘ, Uₘ, Uₘᵥ, f, k, β, sorted_vals, sortby, rev)
133133
copyto!(Uₘ, Hₘ)
134134
F = schur!(Uₘ)
135135

@@ -230,7 +230,7 @@ function _eigsolve(
230230

231231
M = typeof(cache0)
232232

233-
_update_schur_eigs!(Hₘ, Uₘ, Uₘᵥ, f, k, m, β, sorted_vals, sortby, rev)
233+
_update_schur_eigs!(Hₘ, Uₘ, Uₘᵥ, f, k, β, sorted_vals, sortby, rev)
234234

235235
numops = m
236236
iter = 0
@@ -256,7 +256,7 @@ function _eigsolve(
256256

257257
# println( A * Vₘ ≈ Vₘ * M(Hₘ) + qₘ * M(transpose(βeₘ)) ) # SHOULD BE TRUE
258258

259-
_update_schur_eigs!(Hₘ, Uₘ, Uₘᵥ, f, k, m, β, sorted_vals, sortby, rev)
259+
_update_schur_eigs!(Hₘ, Uₘ, Uₘᵥ, f, k, β, sorted_vals, sortby, rev)
260260

261261
numops += m - k - 1
262262
iter += 1
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[deps]
2+
GenericSchur = "c145ed77-6b09-5dd9-b285-bf645a82121e"
3+
QuantumToolbox = "6c2fb7c5-b903-41d2-bc5e-5a7c320b9fab"
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
@testset "Arbitrary Precision" verbose=true begin
2+
N = 20
3+
Δ = 1.0
4+
U = 0.1
5+
F = 0.1
6+
κ = 0.1
7+
8+
a = destroy(N)
9+
ψ0 = fock(N, 1)
10+
H = Δ * a' * a + U / 2 * a' * a' * a * a + F * (a + a')
11+
12+
c_ops = [sqrt(κ) * a]
13+
14+
tlist = range(0, 40, 100)
15+
16+
a_big = SparseMatrixCSC{Complex{BigFloat}}(a)
17+
ψ0_big = Vector{Complex{BigFloat}}(ψ0)
18+
H_big = Δ * a_big' * a_big + U / 2 * a_big' * a_big' * a_big * a_big + F * (a_big + a_big')
19+
20+
c_ops_big = [sqrt(BigFloat(κ)) * a_big]
21+
22+
@testset "Arbitrary Precision (sesolve)" begin
23+
sol = sesolve(H, ψ0, tlist; progress_bar = Val(false))
24+
sol_big = sesolve(H_big, ψ0_big, tlist; progress_bar = Val(false))
25+
26+
# Test all fidelities are close to 1
27+
@test all((x) -> isapprox(fidelity(x[1], x[2]), 1; atol = 1e-7), zip(sol.states, sol_big.states))
28+
29+
@inferred sesolve(H_big, ψ0_big, tlist; progress_bar = Val(false))
30+
end
31+
32+
@testset "Arbitrary Precision (mesolve)" begin
33+
sol = mesolve(H, ψ0, tlist, c_ops; progress_bar = Val(false))
34+
sol_big = mesolve(H_big, ψ0_big, tlist, c_ops_big; progress_bar = Val(false))
35+
36+
# Test all fidelities are close to 1
37+
@test all((x) -> isapprox(hilbert_dist(x[1], x[2]), 0; atol = 1e-10), zip(sol.states, sol_big.states))
38+
39+
@inferred mesolve(H_big, ψ0_big, tlist, c_ops_big; progress_bar = Val(false))
40+
end
41+
42+
@testset "Arbitrary Precision (eigenvalues)" begin
43+
L = liouvillian(H, c_ops)
44+
L_big = liouvillian(H_big, c_ops_big)
45+
46+
vals, vecs = eigenstates(L; sparse = true, eigvals = 6, krylovdim = 20)
47+
vals_big, vecs_big = eigenstates(L_big; sparse = true, eigvals = 6, krylovdim = 20)
48+
49+
# Align eigenvalues
50+
idxs = [findmin(abs.(vals_big .- val))[2] for val in vals]
51+
52+
@test vals vals_big[idxs]
53+
@test all(zip(vecs, vecs_big[idxs])) do (v, v_big)
54+
return isapprox(abs(dot(v.data, v_big.data)), 1; atol = 1e-7)
55+
end
56+
end
57+
end

test/runtests.jl

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ using Test
22
using TestItemRunner
33
using Pkg
44

5-
const GROUP_LIST = String["All", "Core", "Code-Quality", "AutoDiff_Ext", "Makie_Ext", "CUDA_Ext"]
5+
const GROUP_LIST =
6+
String["All", "Core", "Code-Quality", "AutoDiff_Ext", "Makie_Ext", "CUDA_Ext", "Arbitrary_Precision_Ext"]
67

78
const GROUP = get(ENV, "GROUP", "All")
89
(GROUP in GROUP_LIST) || throw(ArgumentError("Unknown GROUP = $GROUP\nThe allowed groups are: $GROUP_LIST\n"))
@@ -81,3 +82,17 @@ if (GROUP == "CUDA_Ext")
8182

8283
include(joinpath(testdir, "ext-test", "gpu", "cuda_ext.jl"))
8384
end
85+
86+
if (GROUP == "Arbitrary_Precision_Ext")
87+
Pkg.activate("ext-test/cpu/arbitrary_precision")
88+
Pkg.develop(PackageSpec(path = dirname(@__DIR__)))
89+
Pkg.update()
90+
91+
using QuantumToolbox
92+
using SparseArrays
93+
using GenericSchur
94+
95+
QuantumToolbox.about()
96+
97+
include(joinpath(testdir, "ext-test", "cpu", "arbitrary_precision", "arbitrary_precision.jl"))
98+
end

0 commit comments

Comments
 (0)