@@ -29,7 +29,7 @@ Zsop = sprepost(Z, dagger(Z))
2929@test pauli (Y/ sqrt (2 )). data ≈ [0 , 0 , 1. , 0 ]
3030@test pauli (Z/ sqrt (2 )). data ≈ [0 , 0 , 0 , 1. ]
3131
32- # Test that single qubit unitary Pauli channels are diagonal
32+ # Test that single qubit unitary channels are diagonal in Pauli transfer and chi
3333@test pauli (Isop). data ≈ diagm ([1 , 1 , 1 , 1 ])
3434@test pauli (Xsop). data ≈ diagm ([1 , 1 , - 1 , - 1 ])
3535@test pauli (Ysop). data ≈ diagm ([1 , - 1 , 1 , - 1 ])
@@ -42,23 +42,29 @@ Zsop = sprepost(Z, dagger(Z))
4242# Test Haddamard Clifford rules
4343H = ( (spinup (bs)+ spindown (bs))⊗ dagger (spinup (bs)) +
4444 (spinup (bs)- spindown (bs))⊗ dagger (spindown (bs)) )/ sqrt (2 )
45- Hsop = sprepost (H, dagger (H))
46- @test Hsop* I ≈ I
47- @test Hsop* X ≈ Z
48- @test Hsop* Y ≈ - Y
49- @test Hsop* Z ≈ X
50- @test pauli (Hsop)* I ≈ I
51- @test pauli (Hsop)* X ≈ Z
52- @test pauli (Hsop)* Y ≈ - Y
53- @test pauli (Hsop)* Z ≈ X
54- @test chi (Hsop)* I ≈ I
55- @test chi (Hsop)* X ≈ Z
56- @test chi (Hsop)* Y ≈ - Y
57- @test chi (Hsop)* Z ≈ X
58- @test pauli (Hsop). data ≈ diagm (0 => [1 ,0 ,- 1 ,0 ], 2 => [0 ,1 ], - 2 => [0 ,1 ])
59- @test chi (Hsop). data ≈ diagm (0 => [0 ,1 ,0 ,1 ], 2 => [0 ,1 ], - 2 => [0 ,1 ])
60-
61- """
45+ H_sop = sprepost (H, dagger (H))
46+ @test pauli (H_sop). data ≈ diagm (0 => [1 ,0 ,- 1 ,0 ], 2 => [0 ,1 ], - 2 => [0 ,1 ])
47+ @test chi (H_sop). data ≈ diagm (0 => [0 ,1 ,0 ,1 ], 2 => [0 ,1 ], - 2 => [0 ,1 ])/ 2
48+
49+ for op in (H_sop, choi (H_sop), pauli (H_sop), chi (H_sop))
50+ @test op* I ≈ I
51+ @test op* X ≈ Z
52+ @test op* Y ≈ - Y
53+ @test op* Z ≈ X
54+ end
55+
56+ # Test equality and conversion of identity among all three bases.
57+ IDENT_sop = identitysuperoperator (bs^ 2 )
58+ IDENT_chi = chi (IDENT_sop)
59+ IDENT_ptm = pauli (IDENT_sop)
60+
61+ @test IDENT_sop. data ≈ IDENT_ptm. data
62+ @test chi (IDENT_ptm) ≈ IDENT_chi
63+ @test super (IDENT_chi) ≈ IDENT_sop
64+ @test super (IDENT_ptm) ≈ IDENT_sop
65+ @test pauli (IDENT_sop) ≈ IDENT_ptm
66+ @test pauli (IDENT_chi) ≈ IDENT_ptm
67+
6268# Test bit flip encoder isometry
6369encoder_kraus = (tensor_pow (spinup (bs), 3 ) ⊗ dagger (spinup (bs)) +
6470 tensor_pow (spindown (bs), 3 ) ⊗ dagger (spindown (bs)))
@@ -69,73 +75,45 @@ for f1 in [super, choi, pauli, chi]
6975 @test f1 (decoder_sup) ≈ dagger (f1 (encoder_sup))
7076 for f2 in [super, choi, pauli, chi]
7177 @test super (f2 (f1 (encoder_sup))). data ≈ encoder_sup. data
72- @test f2(decoder_sup)*f1(encoder_sup) ≈ dense(identitysuperoperator(bs))
78+ @test super ( f2 (decoder_sup)* f1 (encoder_sup) ) ≈ dense (identitysuperoperator (bs))
7379 end
7480end
7581
76- # Test conversion of unitary matrices to superoperators.
82+ # Test CZ and CNOT
7783CZ = dm (spinup (bs))⊗ identityoperator (bs) + dm (spindown (bs))⊗ sigmaz (bs)
78- CZ_sop = sprepost(CZ,dagger(CZ))
79-
80- @test basis_l(CZ_sop) == basis_r(CZ_sop) == KetBraBasis(bs^2, bs^2)
81- @test CZ_sop*(I⊗I) ≈ I⊗I
82- @test CZ_sop*(Z⊗I) ≈ X⊗I
83- @test CZ_sop*(I⊗Z) ≈ I⊗Z
84- @test CZ_sop*(I⊗X) ≈ X⊗X
85-
86- # Test conversion of superoperator to Pauli transfer matrix.
87- CZ_ptm = pauli(CZ_sop)
88-
89- # Test construction of dense Pauli transfer matrix
90- @test_throws DimensionMismatch Operator(PauliBasis(2), PauliBasis(3), CZ_ptm.data)
91- @test Operator(PauliBasis(2), PauliBasis(2), CZ_ptm.data) == CZ_ptm
92- @test CZ_ptm*pauli(I⊗I) ≈ pauli(I⊗I)
93- @test CZ_ptm*pauli(Z⊗I) ≈ pauli(X⊗I)
94- @test CZ_ptm*pauli(I⊗Z) ≈ pauli(I⊗Z)
95- @test CZ_ptm*pauli(I⊗X) ≈ pauli(X⊗X)
96-
97- @test CZ_ptm ≈ pauli(chi(CZ_sop))
98- """
99-
10084CNOT = dm (spinup (bs))⊗ identityoperator (bs) + dm (spindown (bs))⊗ sigmax (bs)
101- CNOT_sop = sprepost (CNOT,dagger (CNOT))
102- CNOT_choi = choi (CNOT_sop)
103- CNOT_chi = chi (CNOT_sop)
104- CNOT_ptm = pauli (CNOT_sop)
105-
106- @test basis_l (CNOT_sop) == basis_r (CNOT_sop) == KetBraBasis (bs^ 2 , bs^ 2 )
107- @test basis_l (CNOT_chi) == basis_r (CNOT_chi) == ChiBasis (2 )
108- @test basis_l (CNOT_ptm) == basis_r (CNOT_ptm) == PauliBasis (2 )
109-
110- @test all (isapprox .(imag .(CNOT_sop. data), 0 ))
111- @test all (isapprox .(imag .(CNOT_chi. data), 0 ))
112- @test all (isapprox .(imag .(CNOT_ptm. data), 0 ))
113-
114- for op in (CNOT_sop, CNOT_choi, CNOT_chi, CNOT_ptm)
115- @test op* (I⊗ I) ≈ I⊗ I
116- @test op* (X⊗ I) ≈ X⊗ X
117- @test op* (Z⊗ I) ≈ Z⊗ I
118- @test op* (I⊗ X) ≈ I⊗ X
119- @test op* (I⊗ Z) ≈ Z⊗ Z
85+ CZ_rules = [(I⊗ I, I⊗ I), (X⊗ I, X⊗ Z), (Z⊗ I, Z⊗ I), (I⊗ X, I⊗ Z), (I⊗ Z, X⊗ Z)]
86+ CNOT_rules = [(I⊗ I, I⊗ I), (X⊗ I, X⊗ X), (Z⊗ I, Z⊗ I), (I⊗ X, I⊗ X), (I⊗ Z, Z⊗ Z)]
87+
88+ # for (gate, rules) in [(CZ, CZ_rules), (CNOT, CNOT_rules)]
89+ for (gate, rules) in [(CNOT, CNOT_rules)]
90+ op_sop = sprepost (gate,dagger (gate))
91+ op_choi = choi (op_sop)
92+ op_ptm = pauli (op_sop)
93+ op_chi = chi (op_sop)
94+
95+ @test_throws DimensionMismatch Operator (PauliBasis (2 ), PauliBasis (3 ), op_ptm. data)
96+ @test_throws DimensionMismatch Operator (ChiBasis (bs^ 2 , bs^ 2 ), ChiBasis (bs^ 3 , bs^ 3 ), op_chi. data)
97+ @test Operator (PauliBasis (2 ), PauliBasis (2 ), op_ptm. data) == op_ptm
98+ @test Operator (ChiBasis (bs^ 2 , bs^ 2 ), op_chi. data) == op_chi
99+ @test basis_l (op_sop) == basis_r (op_sop) == KetBraBasis (bs^ 2 , bs^ 2 )
100+ @test basis_l (op_choi) == basis_r (op_choi) == ChoiBasis (bs^ 2 , bs^ 2 )
101+ @test basis_l (op_chi) == basis_r (op_chi) == ChiBasis (2 )
102+ @test basis_l (op_ptm) == basis_r (op_ptm) == PauliBasis (2 )
103+
104+ @test all (isapprox .(imag .(op_sop. data), 0 ))
105+ @test all (isapprox .(imag .(op_choi. data), 0 ))
106+ @test all (isapprox .(imag .(op_ptm. data), 0 ; atol= 1e-26 ))
107+ @test dagger (op_chi) ≈ op_chi
108+
109+ for (lhs, rhs) in rules
110+ @test op_ptm* pauli (lhs) ≈ pauli (rhs)
111+ for op in (op_sop, op_choi, op_chi, op_ptm)
112+ @test op* lhs ≈ rhs
113+ end
114+ end
120115end
121116
122- # Test construction of chi matrix
123- @test_throws DimensionMismatch Operator (ChiBasis (bs^ 2 , bs^ 2 ), ChiBasis (bs^ 3 , bs^ 3 ), CNOT_chi. data)
124- @test Operator (ChiBasis (bs^ 2 , bs^ 2 ), CNOT_chi. data) == CNOT_chi
125-
126- # Test equality and conversion of identity among all three bases.
127- IDENT_sop = identitysuperoperator (bs^ 2 )
128- IDENT_chi = chi (IDENT_sop)
129- IDENT_ptm = pauli (IDENT_sop)
130-
131- @test IDENT_sop. data ≈ IDENT_ptm. data
132- @test chi (IDENT_ptm). data ≈ choi (IDENT_sop). data
133- @test chi (IDENT_ptm) ≈ IDENT_chi
134- @test super (IDENT_chi) ≈ IDENT_sop
135- @test super (IDENT_ptm) ≈ IDENT_sop
136- @test pauli (IDENT_sop) ≈ IDENT_ptm
137- @test pauli (IDENT_chi) ≈ IDENT_ptm
138-
139117# Test approximate equality and conversion among all three bases.
140118cphase (θ) = dm (spinup (bs))⊗ identityoperator (bs) +
141119 dm (spindown (bs))⊗ (spindown (bs)⊗ spindown (bs)' + exp (1im * θ)spindown (bs)⊗ spindown (bs)' )
@@ -152,6 +130,7 @@ CPHASE_ptm = pauli(CPHASE_sop)
152130@test isapprox (pauli (CPHASE_chi), CPHASE_ptm)
153131
154132# Test composition.
133+ CNOT_sop = sprepost (CNOT,dagger (CNOT))
155134@test isapprox (chi (CPHASE_sop) * chi (CNOT_sop), chi (CPHASE_sop * CNOT_sop))
156135@test isapprox (pauli (CPHASE_sop) * pauli (CNOT_sop), pauli (CPHASE_sop * CNOT_sop))
157136
0 commit comments