Skip to content

Commit 49a389d

Browse files
Make tests and add Val on missing cases
1 parent ee30a2e commit 49a389d

File tree

5 files changed

+40
-16
lines changed

5 files changed

+40
-16
lines changed

benchmarks/eigenvalues.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ function benchmark_eigenvalues!(SUITE)
1717

1818
SUITE["Eigenvalues"]["eigenstates"]["dense"] = @benchmarkable eigenstates($L)
1919
SUITE["Eigenvalues"]["eigenstates"]["sparse"] =
20-
@benchmarkable eigenstates($L, sparse = true, sigma = 0.01, eigvals = 5)
20+
@benchmarkable eigenstates($L, sparse = Val(true), sigma = 0.01, eigvals = 5)
2121

2222
return nothing
2323
end

test/core-test/eigenvalues_and_operators.jl

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
@testitem "Eigenvalues" begin
22
σx = sigmax()
3-
result = eigenstates(σx, sparse = false)
3+
result = eigenstates(σx, sparse = Val(false))
44
λd, ψd, Td = result
55
resstring = sprint((t, s) -> show(t, "text/plain", s), result)
66
valstring = sprint((t, s) -> show(t, "text/plain", s), result.values)
77
vecsstring = sprint((t, s) -> show(t, "text/plain", s), result.vectors)
8-
λs, ψs, Ts = eigenstates(σx, sparse = true, eigvals = 2)
9-
λs1, ψs1, Ts1 = eigenstates(σx, sparse = true, eigvals = 1)
8+
λs, ψs, Ts = eigenstates(σx, sparse = Val(true), eigvals = 2)
9+
λs1, ψs1, Ts1 = eigenstates(σx, sparse = Val(true), eigvals = 1)
1010

1111
@test all([ψ.type isa Ket for ψ in ψd])
1212
@test typeof(Td) <: AbstractMatrix
1313
@test typeof(Ts) <: AbstractMatrix
1414
@test typeof(Ts1) <: AbstractMatrix
15-
@test all(abs.(eigenenergies(σx, sparse = false)) .≈ abs.(λd))
16-
@test all(abs.(eigenenergies(σx, sparse = true, eigvals = 2)) .≈ abs.(λs))
15+
@test all(abs.(eigenenergies(σx, sparse = Val(false))) .≈ abs.(λd))
16+
@test all(abs.(eigenenergies(σx, sparse = Val(true), eigvals = 2)) .≈ abs.(λs))
1717
@test resstring ==
1818
"EigsolveResult: type=$(Operator()) dims=$(result.dims)\nvalues:\n$(valstring)\nvectors:\n$vecsstring"
1919

@@ -33,7 +33,7 @@
3333

3434
vals_d, vecs_d, mat_d = eigenstates(H_d)
3535
vals_c, vecs_c, mat_c = eigenstates(H_c)
36-
vals2, vecs2, mat2 = eigenstates(H_d, sparse = true, sigma = -0.9, eigvals = 10, krylovdim = 30, by = real)
36+
vals2, vecs2, mat2 = eigenstates(H_d, sparse = Val(true), sigma = -0.9, eigvals = 10, krylovdim = 30, by = real)
3737

3838
@test real.(vals_d[1:20]) real.(vals_c[1:20])
3939
@test real.(vals_d[1:10]) real.(vals2[1:10])
@@ -67,7 +67,7 @@
6767
@test vec2mat(vecs[:, 1]) * exp(-1im * angle(vecs[1, 1])) vec2mat(vecs3[:, 1]) atol=1e-5
6868

6969
# eigen solve for QuantumObject
70-
result = eigenstates(L, sparse = true, sigma = 0.01, eigvals = 10, krylovdim = 50)
70+
result = eigenstates(L, sparse = Val(true), sigma = 0.01, eigvals = 10, krylovdim = 50)
7171
vals, vecs = result
7272
resstring = sprint((t, s) -> show(t, "text/plain", s), result)
7373
valstring = sprint((t, s) -> show(t, "text/plain", s), result.values)
@@ -105,7 +105,20 @@
105105
c_ops = [((1 + n_th) * κ) * a, κ * b, (n_th * κ) * a_d]
106106
L = liouvillian(H, c_ops)
107107

108-
UnionType = Union{QuantumToolbox.EigsolveResult{Vector{ComplexF64}, Matrix{ComplexF64}, QuantumToolbox.Operator, QuantumToolbox.Dimensions{2, Tuple{QuantumToolbox.Space, QuantumToolbox.Space}}}, QuantumToolbox.EigsolveResult{Vector{Float64}, Matrix{ComplexF64}, QuantumToolbox.Operator, QuantumToolbox.Dimensions{2, Tuple{QuantumToolbox.Space, QuantumToolbox.Space}}}}
108+
UnionType = Union{
109+
QuantumToolbox.EigsolveResult{
110+
Vector{ComplexF64},
111+
Matrix{ComplexF64},
112+
QuantumToolbox.Operator,
113+
QuantumToolbox.Dimensions{2,Tuple{QuantumToolbox.Space,QuantumToolbox.Space}},
114+
},
115+
QuantumToolbox.EigsolveResult{
116+
Vector{Float64},
117+
Matrix{ComplexF64},
118+
QuantumToolbox.Operator,
119+
QuantumToolbox.Dimensions{2,Tuple{QuantumToolbox.Space,QuantumToolbox.Space}},
120+
},
121+
}
109122

110123
@inferred UnionType eigenstates(H, sparse = Val(false))
111124
@inferred eigenstates(H, sparse = Val(true))

test/core-test/states_and_operators.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
@testset "fock state" begin
2020
# fock, basis, and fock_dm
21-
@test fock_dm(4; dims = (2, 2), sparse = true) ket2dm(basis(4; dims = (2, 2)))
21+
@test fock_dm(4; dims = (2, 2), sparse = Val(true)) ket2dm(basis(4; dims = (2, 2)))
2222
@test_throws DimensionMismatch fock(4; dims = 2)
2323
@test_throws ArgumentError fock(4, 4)
2424
end
@@ -37,7 +37,7 @@
3737

3838
@testset "thermal state" begin
3939
ρTd = thermal_dm(5, 0.123)
40-
ρTs = thermal_dm(5, 0.123; sparse = true)
40+
ρTs = thermal_dm(5, 0.123; sparse = Val(true))
4141
@test isoper(ρTd)
4242
@test ρTd.dims == [5]
4343
@test tr(ρTd) 1.0
@@ -180,7 +180,7 @@
180180
end
181181

182182
@testset "tunneling" begin
183-
@test tunneling(10, 2) == tunneling(10, 2; sparse = true)
183+
@test tunneling(10, 2) == tunneling(10, 2; sparse = Val(true))
184184
@test_throws ArgumentError tunneling(10, 0)
185185
end
186186

test/ext-test/cpu/arbitrary_precision/arbitrary_precision.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@
4343
L = liouvillian(H, c_ops)
4444
L_big = liouvillian(H_big, c_ops_big)
4545

46-
vals, vecs = eigenstates(L; sparse = true, sigma = 0.01, eigvals = 7, krylovdim = 30)
47-
vals_big, vecs_big = eigenstates(L_big; sparse = true, sigma = 0.01, eigvals = 7, krylovdim = 30)
46+
vals, vecs = eigenstates(L; sparse = Val(true), sigma = 0.01, eigvals = 7, krylovdim = 30)
47+
vals_big, vecs_big = eigenstates(L_big; sparse = Val(true), sigma = 0.01, eigvals = 7, krylovdim = 30)
4848

4949
# Align eigenvalues
5050
idxs = [findmin(abs.(vals_big .- val))[2] for val in vals]

test/ext-test/gpu/cuda_ext.jl

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,16 +274,27 @@ end
274274

275275
a = destroy(N)
276276
H = Δ * a' * a + U / 2 * a' * a' * a * a + F * (a + a')
277+
H_gpu = cu(H)
277278

278279
c_ops = [sqrt(κ) * a]
279280

280281
L = liouvillian(H, c_ops)
281282
L_gpu = CuSparseMatrixCSR(L)
282283

283-
vals_cpu, vecs_cpu = eigenstates(L; sparse = true, sigma = 0.01, eigvals = 4, krylovdim = 30)
284+
# Dense eigen solver for Hamiltonian
285+
vals_H_cpu, vecs_H_cpu = eigenstates(H)
286+
vals_H_gpu, vecs_H_gpu = eigenstates(H_gpu)
287+
288+
@test vals_H_cpu Array(vals_H_gpu) atol = 1e-8
289+
@test all(zip(vecs_H_cpu, vecs_H_gpu)) do (v_cpu, v_gpu)
290+
return isapprox(abs(dot(v_cpu.data, Array(v_gpu.data))), 1; atol = 1e-8)
291+
end
292+
293+
# Sparse eigen solver for Liouvillian
294+
vals_cpu, vecs_cpu = eigenstates(L; sparse = Val(true), sigma = 0.01, eigvals = 4, krylovdim = 30)
284295
vals_gpu, vecs_gpu = eigenstates(
285296
L_gpu;
286-
sparse = true,
297+
sparse = Val(true),
287298
sigma = 0.01,
288299
eigvals = 4,
289300
krylovdim = 30,

0 commit comments

Comments
 (0)