11using Test
22using QuantumOpticsBase
33using SparseArrays, LinearAlgebra
4+ import QuantumOpticsBase: ChoiState # Remove when ChoiState is publicly exported
45
56@testset " superoperators" begin
67
78# Test creation
89b = GenericBasis (3 )
910@test_throws DimensionMismatch DenseSuperOperator ((b, b), (b, b), zeros (ComplexF64, 3 , 3 ))
1011@test_throws DimensionMismatch SparseSuperOperator ((b, b), (b, b), spzeros (ComplexF64, 3 , 3 ))
12+ @test_throws DimensionMismatch ChoiState ((b, b), (b, b), zeros (ComplexF64, 3 , 3 ))
1113
1214# Test copy, sparse and dense
1315b1 = GenericBasis (2 )
@@ -153,29 +155,45 @@ J = [Ja, Jc]
153155ρ₀ = dm (Ψ₀)
154156
155157@test identitysuperoperator (spinbasis)* sx == sx
158+ @test ChoiState (identitysuperoperator (spinbasis))* sx == sx
156159@test identitysuperoperator (sparse (spre (sx)))* sx == sparse (sx)
160+ @test ChoiState (identitysuperoperator (sparse (spre (sx))))* sx == sparse (sx)
161+ @test sparse (ChoiState (identitysuperoperator (spre (sx))))* sx == sparse (sx)
157162@test identitysuperoperator (dense (spre (sx)))* sx == dense (sx)
163+ @test ChoiState (identitysuperoperator (dense (spre (sx))))* sx == dense (sx)
164+ @test dense (ChoiState (identitysuperoperator (spre (sx))))* sx == dense (sx)
158165
159166op1 = DenseOperator (spinbasis, [1.2 + 0.3im 0.7 + 1.2im ;0.3 + 0.1im 0.8 + 3.2im ])
160167op2 = DenseOperator (spinbasis, [0.2 + 0.1im 0.1 + 2.3im ; 0.8 + 4.0im 0.3 + 1.4im ])
161168@test tracedistance (spre (op1)* op2, op1* op2) < 1e-12
169+ @test tracedistance (ChoiState (spre (op1))* op2, op1* op2) < 1e-12
162170@test tracedistance (spost (op1)* op2, op2* op1) < 1e-12
171+ @test tracedistance (ChoiState (spost (op1))* op2, op2* op1) < 1e-12
163172
164173@test spre (sparse (op1))* op2 == op1* op2
174+ @test ChoiState (spre (sparse (op1)))* op2 == op1* op2
165175@test spost (sparse (op1))* op2 == op2* op1
176+ @test ChoiState (spost (sparse (op1)))* op2 == op2* op1
166177@test spre (sparse (dagger (op1)))* op2 == dagger (op1)* op2
178+ @test ChoiState (spre (sparse (dagger (op1))))* op2 == dagger (op1)* op2
167179@test spre (dense (dagger (op1)))* op2 ≈ dagger (op1)* op2
180+ @test ChoiState (spre (dense (dagger (op1))))* op2 ≈ dagger (op1)* op2
168181@test sprepost (sparse (op1), op1)* op2 ≈ op1* op2* op1
182+ @test ChoiState (sprepost (sparse (op1), op1))* op2 ≈ op1* op2* op1
169183
170184@test spre (sparse (op1))* sparse (op2) == sparse (op1* op2)
185+ @test ChoiState (spre (sparse (op1)))* sparse (op2) == sparse (op1* op2)
171186@test spost (sparse (op1))* sparse (op2) == sparse (op2* op1)
187+ @test ChoiState (spost (sparse (op1)))* sparse (op2) == sparse (op2* op1)
172188@test sprepost (sparse (op1), sparse (op1))* sparse (op2) ≈ sparse (op1* op2* op1)
189+ @test ChoiState (sprepost (sparse (op1), sparse (op1)))* sparse (op2) ≈ sparse (op1* op2* op1)
173190
174191@test sprepost (op1, op2) ≈ spre (op1)* spost (op2)
175192b1 = FockBasis (1 )
176193b2 = FockBasis (5 )
177194op = fockstate (b1, 0 ) ⊗ dagger (fockstate (b2, 0 ))
178195@test sprepost (dagger (op), op)* dm (fockstate (b1, 0 )) == dm (fockstate (b2, 0 ))
196+ @test ChoiState (sprepost (dagger (op), op))* dm (fockstate (b1, 0 )) == dm (fockstate (b2, 0 ))
179197@test_throws ArgumentError spre (op)
180198@test_throws ArgumentError spost (op)
181199
@@ -185,12 +203,14 @@ for j=J
185203 ρ .+ = j* ρ₀* dagger (j) - 0.5 * dagger (j)* j* ρ₀ - 0.5 * ρ₀* dagger (j)* j
186204end
187205@test tracedistance (L* ρ₀, ρ) < 1e-10
206+ @test tracedistance (ChoiState (L)* ρ₀, ρ) < 1e-10
188207
189208# tout, ρt = timeevolution.master([0.,1.], ρ₀, H, J; reltol=1e-7)
190209# @test tracedistance(exp(dense(L))*ρ₀, ρt[end]) < 1e-6
191210# @test tracedistance(exp(sparse(L))*ρ₀, ρt[end]) < 1e-6
192211
193212@test dense (spre (op1)) == spre (op1)
213+ @test dense (ChoiState (spre (op1))) == ChoiState (spre (op1))
194214
195215@test L/ 2.0 == 0.5 * L == L* 0.5
196216@test - L == SparseSuperOperator (L. basis_l, L. basis_r, - L. data)
@@ -228,4 +248,20 @@ N = exp(log(2) * sparse(L)) # 50% loss channel
228248@test (0.5 - real (tr (ρ^ 2 ))) < 1e-10 # one photon state becomes maximally mixed
229249@test tracedistance (ρ, normalize (dm (fockstate (b, 0 )) + dm (fockstate (b, 1 )))) < 1e-10
230250
251+ # Testing 0-2-4 binomial code encoder
252+ b_logical = SpinBasis (1 // 2 )
253+ b_fock = FockBasis (5 )
254+ z_l = normalize (fockstate (b_fock, 0 ) + fockstate (b_fock, 4 ))
255+ o_l = fockstate (b_fock, 2 )
256+ encoder_kraus = z_l ⊗ dagger (spinup (b_logical)) + o_l ⊗ dagger (spindown (b_logical))
257+ encoder_sup = sprepost (encoder_kraus, dagger (encoder_kraus))
258+ decoder_sup = sprepost (dagger (encoder_kraus), encoder_kraus)
259+ @test SuperOperator (ChoiState (encoder_sup)). data == encoder_sup. data
260+ @test decoder_sup == dagger (encoder_sup)
261+ @test ChoiState (decoder_sup) == dagger (ChoiState (encoder_sup))
262+ @test decoder_sup* encoder_sup ≈ dense (identitysuperoperator (b_logical))
263+ @test decoder_sup* ChoiState (encoder_sup) ≈ dense (identitysuperoperator (b_logical))
264+ @test ChoiState (decoder_sup)* encoder_sup ≈ dense (identitysuperoperator (b_logical))
265+ @test SuperOperator (ChoiState (decoder_sup)* ChoiState (encoder_sup)) ≈ dense (identitysuperoperator (b_logical))
266+
231267end # testset
0 commit comments