@@ -8,6 +8,7 @@ using SparseArrays, LinearAlgebra
88b = GenericBasis (3 )
99@test_throws DimensionMismatch DenseSuperOperator ((b, b), (b, b), zeros (ComplexF64, 3 , 3 ))
1010@test_throws DimensionMismatch SparseSuperOperator ((b, b), (b, b), spzeros (ComplexF64, 3 , 3 ))
11+ @test_throws DimensionMismatch ChoiState ((b, b), (b, b), zeros (ComplexF64, 3 , 3 ))
1112
1213# Test copy, sparse and dense
1314b1 = GenericBasis (2 )
@@ -153,29 +154,45 @@ J = [Ja, Jc]
153154ρ₀ = dm (Ψ₀)
154155
155156@test identitysuperoperator (spinbasis)* sx == sx
157+ @test ChoiState (identitysuperoperator (spinbasis))* sx == sx
156158@test identitysuperoperator (sparse (spre (sx)))* sx == sparse (sx)
159+ @test ChoiState (identitysuperoperator (sparse (spre (sx))))* sx == sparse (sx)
160+ @test sparse (ChoiState (identitysuperoperator (spre (sx))))* sx == sparse (sx)
157161@test identitysuperoperator (dense (spre (sx)))* sx == dense (sx)
162+ @test ChoiState (identitysuperoperator (dense (spre (sx))))* sx == dense (sx)
163+ @test dense (ChoiState (identitysuperoperator (spre (sx))))* sx == dense (sx)
158164
159165op1 = DenseOperator (spinbasis, [1.2 + 0.3im 0.7 + 1.2im ;0.3 + 0.1im 0.8 + 3.2im ])
160166op2 = DenseOperator (spinbasis, [0.2 + 0.1im 0.1 + 2.3im ; 0.8 + 4.0im 0.3 + 1.4im ])
161167@test tracedistance (spre (op1)* op2, op1* op2) < 1e-12
168+ @test tracedistance (ChoiState (spre (op1))* op2, op1* op2) < 1e-12
162169@test tracedistance (spost (op1)* op2, op2* op1) < 1e-12
170+ @test tracedistance (ChoiState (spost (op1))* op2, op2* op1) < 1e-12
163171
164172@test spre (sparse (op1))* op2 == op1* op2
173+ @test ChoiState (spre (sparse (op1)))* op2 == op1* op2
165174@test spost (sparse (op1))* op2 == op2* op1
175+ @test ChoiState (spost (sparse (op1)))* op2 == op2* op1
166176@test spre (sparse (dagger (op1)))* op2 == dagger (op1)* op2
177+ @test ChoiState (spre (sparse (dagger (op1))))* op2 == dagger (op1)* op2
167178@test spre (dense (dagger (op1)))* op2 ≈ dagger (op1)* op2
179+ @test ChoiState (spre (dense (dagger (op1))))* op2 ≈ dagger (op1)* op2
168180@test sprepost (sparse (op1), op1)* op2 ≈ op1* op2* op1
181+ @test ChoiState (sprepost (sparse (op1), op1))* op2 ≈ op1* op2* op1
169182
170183@test spre (sparse (op1))* sparse (op2) == sparse (op1* op2)
184+ @test ChoiState (spre (sparse (op1)))* sparse (op2) == sparse (op1* op2)
171185@test spost (sparse (op1))* sparse (op2) == sparse (op2* op1)
186+ @test ChoiState (spost (sparse (op1)))* sparse (op2) == sparse (op2* op1)
172187@test sprepost (sparse (op1), sparse (op1))* sparse (op2) ≈ sparse (op1* op2* op1)
188+ @test ChoiState (sprepost (sparse (op1), sparse (op1)))* sparse (op2) ≈ sparse (op1* op2* op1)
173189
174190@test sprepost (op1, op2) ≈ spre (op1)* spost (op2)
175191b1 = FockBasis (1 )
176192b2 = FockBasis (5 )
177193op = fockstate (b1, 0 ) ⊗ dagger (fockstate (b2, 0 ))
178194@test sprepost (dagger (op), op)* dm (fockstate (b1, 0 )) == dm (fockstate (b2, 0 ))
195+ @test ChoiState (sprepost (dagger (op), op))* dm (fockstate (b1, 0 )) == dm (fockstate (b2, 0 ))
179196@test_throws ArgumentError spre (op)
180197@test_throws ArgumentError spost (op)
181198
@@ -185,12 +202,14 @@ for j=J
185202 ρ .+ = j* ρ₀* dagger (j) - 0.5 * dagger (j)* j* ρ₀ - 0.5 * ρ₀* dagger (j)* j
186203end
187204@test tracedistance (L* ρ₀, ρ) < 1e-10
205+ @test tracedistance (ChoiState (L)* ρ₀, ρ) < 1e-10
188206
189207# tout, ρt = timeevolution.master([0.,1.], ρ₀, H, J; reltol=1e-7)
190208# @test tracedistance(exp(dense(L))*ρ₀, ρt[end]) < 1e-6
191209# @test tracedistance(exp(sparse(L))*ρ₀, ρt[end]) < 1e-6
192210
193211@test dense (spre (op1)) == spre (op1)
212+ @test dense (ChoiState (spre (op1))) == ChoiState (spre (op1))
194213
195214@test L/ 2.0 == 0.5 * L == L* 0.5
196215@test - L == SparseSuperOperator (L. basis_l, L. basis_r, - L. data)
@@ -228,4 +247,20 @@ N = exp(log(2) * sparse(L)) # 50% loss channel
228247@test (0.5 - real (tr (ρ^ 2 ))) < 1e-10 # one photon state becomes maximally mixed
229248@test tracedistance (ρ, normalize (dm (fockstate (b, 0 )) + dm (fockstate (b, 1 )))) < 1e-10
230249
250+ # Testing 0-2-4 binomial code encoder
251+ b_logical = SpinBasis (1 // 2 )
252+ b_fock = FockBasis (5 )
253+ z_l = normalize (fockstate (b_fock, 0 ) + fockstate (b_fock, 4 ))
254+ o_l = fockstate (b_fock, 2 )
255+ encoder_kraus = z_l ⊗ dagger (spinup (b_logical)) + o_l ⊗ dagger (spindown (b_logical))
256+ encoder_sup = sprepost (encoder_kraus, dagger (encoder_kraus))
257+ decoder_sup = sprepost (dagger (encoder_kraus), encoder_kraus)
258+ @test SuperOperator (ChoiState (encoder_sup)). data == encoder_sup. data
259+ @test decoder_sup == dagger (encoder_sup)
260+ @test ChoiState (decoder_sup) == dagger (ChoiState (encoder_sup))
261+ @test decoder_sup* encoder_sup ≈ dense (identitysuperoperator (b_logical))
262+ @test decoder_sup* ChoiState (encoder_sup) ≈ dense (identitysuperoperator (b_logical))
263+ @test ChoiState (decoder_sup)* encoder_sup ≈ dense (identitysuperoperator (b_logical))
264+ @test SuperOperator (ChoiState (decoder_sup)* ChoiState (encoder_sup)) ≈ dense (identitysuperoperator (b_logical))
265+
231266end # testset
0 commit comments