@@ -2,48 +2,68 @@ using LinearAlgebra
22using Test
33
44using QuantumOpticsBase
5- import QuantumOpticsBase: comp_pauli_kb
65
76@testset " pauli" begin
87
9- b = SpinBasis (1 // 2 )
10- Isop = sprepost (identityoperator (b), dagger (identityoperator (b)))
11- Xsop = sprepost (sigmax (b), dagger (sigmax (b)))
12- Ysop = sprepost (sigmay (b), dagger (sigmay (b)))
13- Zsop = sprepost (sigmaz (b), dagger (sigmaz (b)))
14- Xsk = vec (sigmax (b))
15- V = comp_pauli_kb (1 )
16-
8+ bs = SpinBasis (1 // 2 )
9+ bp = PauliBasis (1 )
10+
11+ # Test Pauli basis vectors are in I, X, Y, Z order
12+ @test pauli (identityoperator (bs)/ sqrt (2 )). data ≈ [1. , 0 , 0 , 0 ]
13+ @test pauli (sigmax (bs)/ sqrt (2 )). data ≈ [0 , 1. , 0 , 0 ]
14+ @test pauli (sigmay (bs)/ sqrt (2 )). data ≈ [0 , 0 , 1. , 0 ]
15+ @test pauli (sigmaz (bs)/ sqrt (2 )). data ≈ [0 , 0 , 0 , 1. ]
16+
17+ # Test that single qubit unitary Pauli channels are diagonal
18+ Isop = sprepost (identityoperator (bs), dagger (identityoperator (bs)))
19+ Xsop = sprepost (sigmax (bs), dagger (sigmax (bs)))
20+ Ysop = sprepost (sigmay (bs), dagger (sigmay (bs)))
21+ Zsop = sprepost (sigmaz (bs), dagger (sigmaz (bs)))
22+ @test pauli (Isop). data ≈ diagm ([1 , 1 , 1 , 1 ])
23+ @test pauli (Xsop). data ≈ diagm ([1 , 1 , - 1 , - 1 ])
24+ @test pauli (Ysop). data ≈ diagm ([1 , - 1 , 1 , - 1 ])
25+ @test pauli (Zsop). data ≈ diagm ([1 , - 1 , - 1 , 1 ])
26+
27+ # Test bit flip encoder isometry
28+ encoder_kraus = (tensor_pow (spinup (bs), 3 ) ⊗ dagger (spinup (bs)) +
29+ tensor_pow (spindown (bs), 3 ) ⊗ dagger (spindown (bs)))
30+ encoder_sup = sprepost (encoder_kraus, dagger (encoder_kraus))
31+ decoder_sup = sprepost (dagger (encoder_kraus), encoder_kraus)
32+ @test super (choi (encoder_sup)). data == encoder_sup. data
33+ @test decoder_sup == dagger (encoder_sup)
34+ @test choi (decoder_sup) == dagger (choi (encoder_sup))
35+ @test decoder_sup* encoder_sup ≈ dense (identitysuperoperator (bs))
36+ @test decoder_sup* choi (encoder_sup) ≈ dense (identitysuperoperator (bs))
37+ @test choi (decoder_sup)* encoder_sup ≈ dense (identitysuperoperator (bs))
38+ @test super (choi (decoder_sup)* choi (encoder_sup)) ≈ dense (identitysuperoperator (bs))
1739
1840# Test conversion of unitary matrices to superoperators.
19- CZ = dm (spinup (b ))⊗ identityoperator (b ) + dm (spindown (b ))⊗ sigmaz (b )
41+ CZ = dm (spinup (bs ))⊗ identityoperator (bs ) + dm (spindown (bs ))⊗ sigmaz (bs )
2042CZ_sop = sprepost (CZ,dagger (CZ))
2143
22- # Test conversion of unitary matrices to superoperators.
23- @test diag (CZ_sop. data) == ComplexF64[1 ,1 ,1 ,- 1 ,1 ,1 ,1 ,- 1 ,1 ,1 ,1 ,- 1 ,- 1 ,- 1 ,- 1 ,1 ]
24- @test basis_l (CZ_sop) == basis_r (CZ_sop) == KetBraBasis (b^ 2 , b^ 2 )
44+ @test CZ_sop. data ≈ diagm ([1 ,1 ,1 ,- 1 ,1 ,1 ,1 ,- 1 ,1 ,1 ,1 ,- 1 ,- 1 ,- 1 ,- 1 ,1 ])
45+ @test basis_l (CZ_sop) == basis_r (CZ_sop) == KetBraBasis (bs^ 2 , bs^ 2 )
2546
2647# Test conversion of superoperator to Pauli transfer matrix.
2748CZ_ptm = pauli (CZ_sop)
2849
29- # Test DensePauliTransferMatrix constructor.
50+ # Test construction of dense Pauli transfer matrix
3051@test_throws DimensionMismatch Operator (PauliBasis (2 ), PauliBasis (3 ), CZ_ptm. data)
3152@test Operator (PauliBasis (2 ), PauliBasis (2 ), CZ_ptm. data) == CZ_ptm
3253
33- @test all (isapprox .(CZ_ptm. data[[1 ,30 ,47 ,52 ,72 ,91 ,117 ,140 ,166 ,185 ,205 ,210 ,227 ,256 ]], 4 ))
34- @test all (isapprox .(CZ_ptm. data[[106 ,151 ]], - 4 ))
54+ @test all (isapprox .(CZ_ptm. data[[1 ,30 ,47 ,52 ,72 ,91 ,117 ,140 ,166 ,185 ,205 ,210 ,227 ,256 ]], 1 ))
55+ @test all (isapprox .(CZ_ptm. data[[106 ,151 ]], - 1 ))
3556
36- @test CZ_ptm == PauliTransferMatrix ( ChiMatrix (CZ ))
57+ @test CZ_ptm == pauli ( chi (CZ_sop ))
3758
38- # Test construction of non-symmetric unitary.
39- CNOT = DenseOperator (b^ 2 , b^ 2 , diagm (0 => [1 ,1 ,0 ,0 ], 1 => [0 ,0 ,1 ], - 1 => [0 ,0 ,1 ]))
40- CNOT_sop = SuperOperator (CNOT)
41- CNOT_chi = ChiMatrix (CNOT)
42- CNOT_ptm = PauliTransferMatrix (CNOT)
59+ CNOT = dm (spinup (bs))⊗ identityoperator (bs) + dm (spindown (bs))⊗ sigmax (bs)
60+ CNOT_sop = sprepost (CZ,dagger (CZ))
61+ CNOT_chi = chi (CNOT_sop)
62+ CNOT_ptm = pauli (CNOT_sop)
4363
44- @test CNOT_sop . basis_l == CNOT_sop . basis_r == (b ^ 2 , b ^ 2 )
45- @test CNOT_chi . basis_l == CNOT_chi . basis_r == (b ^ 2 , b ^ 2 )
46- @test CNOT_ptm . basis_l == CNOT_ptm . basis_r == (b ^ 2 , b ^ 2 )
64+ @test basis_l (CNOT_sop) == basis_r (CNOT_sop) == KetBraBasis (bs ^ 2 , bs ^ 2 )
65+ @test basis_l (CNOT_chi) == basis_r (CNOT_chi) == ChoiBasis (bp ^ 2 , bp ^ 2 )
66+ @test basis_l (CNOT_ptm) == basis_r (CNOT_ptm) == ChoiBasis (bp ^ 2 , bp ^ 2 )
4767
4868@test all (isapprox .(imag .(CNOT_sop. data), 0 ))
4969@test all (isapprox .(imag .(CNOT_chi. data), 0 ))
@@ -55,25 +75,25 @@ CNOT_ptm = PauliTransferMatrix(CNOT)
5575@test all (isapprox .(CNOT_ptm. data[[1 ,18 ,47 ,64 ,70 ,85 ,108 ,138 ,153 ,183 ,205 ,222 ,227 ,244 ,]], 1 ))
5676@test all (isapprox .(CNOT_ptm. data[[123 ,168 ]], - 1 ))
5777
58- # Test DenseChiMatrix constructor.
59- @test_throws DimensionMismatch Operator (ChoiBasis (PauliBasis ( 2 ), PauliBasis ( 2 )) , ChoiBasis (PauliBasis ( 3 ), PauliBasis ( 3 ) ), CNOT_chi. data)
60- @test Operator (ChoiBasis (PauliBasis ( 2 ), PauliBasis ( 2 ) ), CNOT_chi. data) == CNOT_chi
78+ # Test construction of chi matrix
79+ @test_throws DimensionMismatch Operator (ChoiBasis (bp ^ 2 , bp ^ 2 ) , ChoiBasis (bp ^ 3 , bp ^ 3 ), CNOT_chi. data)
80+ @test Operator (ChoiBasis (bp ^ 2 , bp ^ 2 ), CNOT_chi. data) == CNOT_chi
6181
62- # Test equality and conversion among all three bases.
82+ # Test equality and conversion of identity among all three bases.
6383ident = Complex{Float64}[1 0 0 0 ; 0 1 0 0 ; 0 0 1 0 ; 0 0 0 1 ]
6484
65- IDENT = DenseOperator (b ^ 2 , ident)
85+ IDENT = DenseOperator (bs ^ 2 , ident)
6686
6787IDENT_sop = SuperOperator (IDENT)
6888IDENT_chi = ChiMatrix (IDENT)
6989IDENT_ptm = PauliTransferMatrix (IDENT)
7090
71- @test ChiMatrix (IDENT_sop) == IDENT_chi
72- @test ChiMatrix (IDENT_ptm) == IDENT_chi
73- @test SuperOperator (IDENT_chi) == IDENT_sop
74- @test SuperOperator (IDENT_ptm) == IDENT_sop
75- @test PauliTransferMatrix (IDENT_sop) == IDENT_ptm
76- @test PauliTransferMatrix (IDENT_chi) == IDENT_ptm
91+ @test chi (IDENT_sop) == IDENT_chi
92+ @test chi (IDENT_ptm) == IDENT_chi
93+ @test super (IDENT_chi) == IDENT_sop
94+ @test super (IDENT_ptm) == IDENT_sop
95+ @test pauli (IDENT_sop) == IDENT_ptm
96+ @test pauli (IDENT_chi) == IDENT_ptm
7797
7898# Test approximate equality and conversion among all three bases.
7999cphase = Complex{Float64}[1 0 0 0 ; 0 1 0 0 ; 0 0 1 0 ; 0 0 0 exp (1im * .6 )]
0 commit comments