Skip to content

Commit 367f476

Browse files
Make states stable
1 parent 1e3de72 commit 367f476

File tree

4 files changed

+107
-57
lines changed

4 files changed

+107
-57
lines changed

docs/src/users_guide/QuantumObject/QuantumObject.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ Qobj(M, dims = (2, 2)) # dims as Tuple (recommended)
4545
Qobj(M, dims = SVector(2, 2)) # dims as StaticArrays.SVector (recommended)
4646
```
4747

48-
> [!IMPORTANT]
49-
> Please note that here we put the `dims` as a tuple `(2, 2)`. Although it supports also `Vector` type (`dims = [2, 2]`), it is recommended to use `Tuple` or `SVector` from [`StaticArrays.jl`](https://github.com/JuliaArrays/StaticArrays.jl) to improve performance. For a brief explanation on the impact of the type of `dims`, see the Section [The Importance of Type-Stability](@ref doc:Type-Stability).
48+
!!! warning "Beware of type-stability!"
49+
Please note that here we put the `dims` as a tuple `(2, 2)`. Although it supports also `Vector` type (`dims = [2, 2]`), it is recommended to use `Tuple` or `SVector` from [`StaticArrays.jl`](https://github.com/JuliaArrays/StaticArrays.jl) to improve performance. For a brief explanation on the impact of the type of `dims`, see the Section [The Importance of Type-Stability](@ref doc:Type-Stability).
5050

5151
```@example Qobj
5252
Qobj(rand(4, 4), type = SuperOperator)

src/qobj/states.jl

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,22 +89,22 @@ function rand_ket(dimensions::Union{AbstractVector{Int},Tuple})
8989
end
9090

9191
@doc raw"""
92-
fock_dm(N::Int, pos::Int=0; dims::Union{Int,AbstractVector{Int},Tuple}=N, sparse::Union{Bool,Val}=Val(false))
92+
fock_dm(N::Int, j::Int=0; dims::Union{Int,AbstractVector{Int},Tuple}=N, sparse::Union{Bool,Val}=Val(false))
9393
9494
Density matrix representation of a Fock state.
9595
9696
Constructed via outer product of [`fock`](@ref).
9797
9898
!!! warning "Beware of type-stability!"
99-
If you want to keep type stability, it is recommended to use `fock_dm(N, pos, dims=dims, sparse=Val(sparse))` instead of `fock_dm(N, pos, dims=dims, sparse=sparse)`. Consider also to use `dims` as a `Tuple` or `SVector` instead of `Vector`. See [this link](https://docs.julialang.org/en/v1/manual/performance-tips/#man-performance-value-type) and the [related Section](@ref doc:Type-Stability) about type stability for more details.
99+
If you want to keep type stability, it is recommended to use `fock_dm(N, j, dims=dims, sparse=Val(sparse))` instead of `fock_dm(N, j, dims=dims, sparse=sparse)`. Consider also to use `dims` as a `Tuple` or `SVector` instead of `Vector`. See [this link](https://docs.julialang.org/en/v1/manual/performance-tips/#man-performance-value-type) and the [related Section](@ref doc:Type-Stability) about type stability for more details.
100100
"""
101101
function fock_dm(
102102
N::Int,
103-
pos::Int = 0;
103+
j::Int = 0;
104104
dims::Union{Int,AbstractVector{Int},Tuple} = N,
105105
sparse::Union{Bool,Val} = Val(false),
106106
)
107-
ψ = fock(N, pos; dims = dims, sparse = sparse)
107+
ψ = fock(N, j; dims = dims, sparse = sparse)
108108
return ket2dm(ψ)
109109
end
110110

@@ -243,7 +243,7 @@ function spin_coherent(j::Real, θ::Real, ϕ::Real)
243243
end
244244

245245
@doc raw"""
246-
bell_state(x::Int, z::Int)
246+
bell_state(x::Union{Int}, z::Union{Int})
247247
248248
Return the [Bell state](https://en.wikipedia.org/wiki/Bell_state) depending on the arguments `(x, z)`:
249249
- `(0, 0)`: ``| \Phi^+ \rangle = ( |00\rangle + |11\rangle ) / \sqrt{2}``
@@ -263,7 +263,18 @@ Quantum Object: type=Ket dims=[2, 2] size=(4,)
263263
0.0 + 0.0im
264264
0.0 + 0.0im
265265
0.7071067811865475 + 0.0im
266+
267+
julia> bell_state(Val(1), Val(0))
268+
Quantum Object: type=Ket dims=[2, 2] size=(4,)
269+
4-element Vector{ComplexF64}:
270+
0.0 + 0.0im
271+
0.7071067811865475 + 0.0im
272+
0.7071067811865475 + 0.0im
273+
0.0 + 0.0im
266274
```
275+
276+
!!! warning "Beware of type-stability!"
277+
If you want to keep type stability, it is recommended to use `bell_state(Val(x), Val(z))` instead of `bell_state(x, z)`. See [this link](https://docs.julialang.org/en/v1/manual/performance-tips/#man-performance-value-type) and the [related Section](@ref doc:Type-Stability) for more details.
267278
"""
268279
bell_state(x::Int, z::Int) = bell_state(Val(x), Val(z))
269280
bell_state(::Val{0}, ::Val{0}) = QuantumObject(ComplexF64[1, 0, 0, 1] / sqrt(2), Ket, (2, 2))

test/quantum_objects.jl

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -507,14 +507,12 @@
507507
@test ρ2.data ρ2_ptr.data atol = 1e-10
508508

509509
@testset "Type Inference (ptrace)" begin
510-
if VERSION >= v"1.10"
511-
@inferred ptrace(ρ, 1)
512-
@inferred ptrace(ρ, 2)
513-
@inferred ptrace(ψ_d, 1)
514-
@inferred ptrace(ψ_d, 2)
515-
@inferred ptrace(ψ, 1)
516-
@inferred ptrace(ψ, 2)
517-
end
510+
@inferred ptrace(ρ, 1)
511+
@inferred ptrace(ρ, 2)
512+
@inferred ptrace(ψ_d, 1)
513+
@inferred ptrace(ψ_d, 2)
514+
@inferred ptrace(ψ, 1)
515+
@inferred ptrace(ψ, 2)
518516
end
519517
end
520518

test/states_and_operators.jl

Lines changed: 83 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -346,48 +346,89 @@
346346
@test_throws DimensionMismatch sprepost(A_wrong1, A_wrong3)
347347
end
348348

349+
@testset "Type Inference (States)" begin
350+
@inferred zero_ket(4)
351+
@inferred zero_ket((2, 2))
352+
353+
@inferred fock(4, 1, dims = (2, 2), sparse = Val(true))
354+
@inferred fock(4, 1, dims = (2, 2), sparse = Val(false))
355+
@inferred basis(4, 1, dims = (2, 2))
356+
357+
@inferred coherent(5, 0.25im)
358+
359+
@inferred rand_ket(10)
360+
@inferred rand_ket((2, 5))
361+
362+
@inferred fock_dm(4; dims = (2, 2), sparse = Val(true))
363+
@inferred fock_dm(4; dims = (2, 2), sparse = Val(false))
364+
365+
@inferred coherent_dm(5, 0.25im)
366+
367+
@inferred thermal_dm(10, 0.123)
368+
@inferred thermal_dm(10, 0.123; sparse = Val(true))
369+
370+
@inferred maximally_mixed_dm(4)
371+
@inferred maximally_mixed_dm((2, 2))
372+
373+
@inferred rand_dm((2, 2))
374+
@inferred rand_dm(10, rank = 5)
375+
376+
@inferred spin_state(3.5, 1.5)
377+
@inferred spin_coherent(0.5, π, 2π)
378+
379+
@inferred bell_state(Val(0), Val(0))
380+
@inferred bell_state(Val(0), Val(1))
381+
@inferred bell_state(Val(1), Val(0))
382+
@inferred bell_state(Val(1), Val(1))
383+
@inferred singlet_state()
384+
@inferred triplet_states()
385+
@inferred w_state(Val(2))
386+
387+
@inferred ghz_state(Val(2))
388+
@inferred ghz_state(Val(3))
389+
@inferred ghz_state(Val(3); d = 3)
390+
end
391+
349392
@testset "Type Inference (Operators)" begin
350-
if VERSION >= v"1.10"
351-
@inferred rand_unitary(10, Val(:haar))
352-
@inferred rand_unitary(10, Val(:exp))
353-
354-
a = destroy(20)
355-
a_d = create(20)
356-
@inferred commutator(a, a_d)
357-
358-
@inferred destroy(20)
359-
@inferred create(20)
360-
@inferred num(20)
361-
@inferred displace(20, 0.5 + 0.5im)
362-
@inferred squeeze(20, 0.5 + 0.5im)
363-
@inferred position(20)
364-
@inferred momentum(20)
365-
366-
@inferred phase(20, 0.5)
367-
368-
@inferred jmat(2.5)
369-
@inferred jmat(2.5, Val(:x))
370-
@inferred jmat(2.5, Val(:y))
371-
@inferred jmat(2.5, Val(:z))
372-
373-
@inferred sigmap()
374-
@inferred sigmam()
375-
@inferred sigmax()
376-
@inferred sigmay()
377-
@inferred sigmaz()
378-
379-
@inferred eye(20)
380-
381-
@inferred fdestroy(Val(10), 4)
382-
@inferred fcreate(Val(10), 4)
383-
384-
@inferred projection(20, 5, 3)
385-
386-
@inferred tunneling(20, 1, sparse=Val(false))
387-
@inferred tunneling(20, 1, sparse=Val(true))
388-
389-
@inferred qft(20)
390-
@inferred qft((2, 10))
391-
end
393+
@inferred rand_unitary(10, Val(:haar))
394+
@inferred rand_unitary(10, Val(:exp))
395+
396+
a = destroy(20)
397+
a_d = create(20)
398+
@inferred commutator(a, a_d)
399+
400+
@inferred destroy(20)
401+
@inferred create(20)
402+
@inferred num(20)
403+
@inferred displace(20, 0.5 + 0.5im)
404+
@inferred squeeze(20, 0.5 + 0.5im)
405+
@inferred position(20)
406+
@inferred momentum(20)
407+
408+
@inferred phase(20, 0.5)
409+
410+
@inferred jmat(2.5)
411+
@inferred jmat(2.5, Val(:x))
412+
@inferred jmat(2.5, Val(:y))
413+
@inferred jmat(2.5, Val(:z))
414+
415+
@inferred sigmap()
416+
@inferred sigmam()
417+
@inferred sigmax()
418+
@inferred sigmay()
419+
@inferred sigmaz()
420+
421+
@inferred eye(20)
422+
423+
@inferred fdestroy(Val(10), 4)
424+
@inferred fcreate(Val(10), 4)
425+
426+
@inferred projection(20, 5, 3)
427+
428+
@inferred tunneling(20, 1, sparse=Val(false))
429+
@inferred tunneling(20, 1, sparse=Val(true))
430+
431+
@inferred qft(20)
432+
@inferred qft((2, 10))
392433
end
393434
end

0 commit comments

Comments
 (0)