Prev Tutorial: Kraus
Next Tutorial: SuperOp
Introduction
Choi-matrix representation of a Quantum Channel.
The Choi-matrix representation of a quantum channel \(\mathcal{E}\) is a matrix
\[
\Lambda=\sum_{i, j}|i\rangle\langle j| \otimes \mathcal{E}(|i\rangle\langle j|)
\]
Evolution of a DensityMatrix \(\rho\) with respect to the Choi-matrix is given by
\[
\mathcal{E}(\rho)=\operatorname{Tr}_{1}\left[\Lambda\left(\rho^{T} \otimes \mathbb{I}\right)\right]
\]
Please refer: C.J. Wood, J.D. Biamonte, D.G. Cory, Tensor networks and graphical calculus for open quantum systems, Quant. Inf. Comp. 15, 0579-0811 (2015).arXiv:1111.6950 [quant-ph]
In QPanda3 Quantum Information
Constructing a Choi object
Here is API doc
From Choi
Generate another Choi object from a Choi object
Python
import numpy as np
def test_construct_from_choi():
K0 = np.array([[0, 1], [1+0.j, 0]])
K1 = np.array([[1, 0], [0+0.j, -1]])
K2 = np.array([[0+0.j, -1.j], [1.j, 0]])
Ks1 = [K0, K1, K2]
Ks2 = [K1]
Kra3 = Kraus(Ks1, Ks2)
choi = Choi(Kra3)
choi2 = Choi(choi)
print("choi2:",choi2)
if __name__ == "__main__":
test_construct_from_choi()
choi2: {
{
{(1,0)},{(0,0)},{(0,0)},{(-1,0)},
}
{
{(0,0)},{(2,0)},{(0,0)},{(0,0)},
}
{
{(0,0)},{(0,0)},{(2,0)},{(0,0)},
}
{
{(-1,0)},{(0,0)},{(0,0)},{(1,0)},
}
}
From Chi
Generate another Choi object from a Chi object
Please refer to Chi
Python
import numpy as np
def test_construct_from_chi():
K0 = np.array([[0, 1], [1 + 0.j, 0]])
K1 = np.array([[1, 0], [0 + 0.j, -1]])
K2 = np.array([[0 + 0.j, -1.j], [1.j, 0]])
Ks1 = [K0, K1, K2]
Ks2 = [K1]
Kra3 = Kraus(Ks1, Ks2)
chi = Chi(Kra3)
choi = Choi(chi)
print("choi:", choi)
if __name__ == "__main__":
test_construct_from_chi()
Output
choi: {
{
{(1,0)},{(0,0)},{(0,0)},{(-1,0)},
}
{
{(0,0)},{(2,0)},{(0,0)},{(0,0)},
}
{
{(0,0)},{(0,0)},{(2,0)},{(0,0)},
}
{
{(-1,0)},{(0,0)},{(0,0)},{(1,0)},
}
}
From SuperOp
Generate another Choi object from a SuperOp object Please refer to SuperOp
Python
import numpy as np
def test_construct_from_superop():
K0 = np.array([[0, 1], [1 + 0.j, 0]])
K1 = np.array([[1, 0], [0 + 0.j, -1]])
K2 = np.array([[0 + 0.j, -1.j], [1.j, 0]])
Ks1 = [K0, K1, K2]
Ks2 = [K1]
Kra3 = Kraus(Ks1, Ks2)
sop = SuperOp(Kra3)
choi = Choi(sop)
print("choi:", choi)
if __name__ == "__main__":
test_construct_from_superop()
Output
choi: {
{
{(1,0)},{(0,0)},{(0,0)},{(-1,0)},
}
{
{(0,0)},{(2,0)},{(0,0)},{(0,0)},
}
{
{(0,0)},{(0,0)},{(2,0)},{(0,0)},
}
{
{(-1,0)},{(0,0)},{(0,0)},{(1,0)},
}
}
From Kraus
Generate another Choi object from a Kraus object
Please refer to Kraus
Python
import numpy as np
def test_construct_from_kraus():
K0 = np.array([[0, 1], [1+0.j, 0]])
K1 = np.array([[1, 0], [0+0.j, -1]])
K2 = np.array([[0+0.j, -1.j], [1.j, 0]])
Ks1 = [K0, K1, K2]
Ks2 = [K1]
Kra3 = Kraus(Ks1, Ks2)
choi = Choi(Kra3)
print("choi:",choi)
if __name__ == "__main__":
test_construct_from_kraus()
Output
choi: {
{
{(1,0)},{(0,0)},{(0,0)},{(-1,0)},
}
{
{(0,0)},{(2,0)},{(0,0)},{(0,0)},
}
{
{(0,0)},{(0,0)},{(2,0)},{(0,0)},
}
{
{(-1,0)},{(0,0)},{(0,0)},{(1,0)},
}
}
From PTM
Generate another Choi object from a PTM object
Please refer to PTM
Python
import numpy as np
def test_construct_from_ptm():
K0 = np.array([[0, 1], [1 + 0.j, 0]])
K1 = np.array([[1, 0], [0 + 0.j, -1]])
K2 = np.array([[0 + 0.j, -1.j], [1.j, 0]])
Ks1 = [K0, K1, K2]
Ks2 = [K1]
Kra3 = Kraus(Ks1, Ks2)
ptm = PTM(Kra3)
choi = Choi(ptm)
print("choi:", choi)
if __name__ == "__main__":
test_construct_from_ptm()
Output
choi: {
{
{(1,0)},{(0,0)},{(0,0)},{(-1,0)},
}
{
{(0,0)},{(2,0)},{(0,0)},{(0,0)},
}
{
{(0,0)},{(0,0)},{(2,0)},{(0,0)},
}
{
{(-1,0)},{(0,0)},{(0,0)},{(1,0)},
}
}
Obtain internal data
Input and output dim
Obtain the input dimension input_dim and output dimension output_dim of the quantum channel
The shape of the Choi matrix is(input_dim * output_dim,input_dim * output_dim)
Here is API doc for Choi.get_input_dim
Here is API doc for Choi.get_output_dim
Python
import numpy as np
def test_dim():
K0 = np.array([[0, 1], [1+0.j, 0]])
K1 = np.array([[1, 0], [0+0.j, -1]])
K2 = np.array([[0+0.j, -1.j], [1.j, 0]])
Ks1 = [K0, K1, K2]
Ks2 = [K1]
Kra3 = Kraus(Ks1, Ks2)
choi = Choi(Kra3)
input_dim = choi.get_input_dim()
output_dim = choi.get_output_dim()
print("input_dim:",input_dim)
print("output_dim:",output_dim)
if __name__ == "__main__":
test_dim()
Output
input_dim: 2
output_dim: 2
Evolution of quantum states
Here is API doc for Choi.evolve
DensityMatrix
Evolution of a DensityMatrix object, and the evolution result is returned as a DensityMatrix object
The dimension of the density matrix is obtained by the member method dim() and should be equal to the input dimension of the Choi object
Please refer to DensityMatrix.
Python
import numpy as np
def test_evolve():
data = np.array(
[[0.69272168 + 0.j, 0.38338527 - 0.17772383j],
[0.38338527 + 0.17772383j, 0.30727832 + 0.j]]
)
dm = DensityMatrix(data)
K0 = np.array([[0, 1], [1 + 0.j, 0]])
K1 = np.array([[1, 0], [0 + 0.j, -1]])
K2 = np.array([[0 + 0.j, -1.j], [1.j, 0]])
Ks1 = [K0, K1, K2]
Ks2 = [K1]
Kra3 = Kraus(Ks1, Ks2)
choi = Choi(Kra3)
res = choi.evolve(dm)
print("res:", res)
if __name__ == "__main__":
test_evolve()
Output
res: {
{
{(1.30728,0)},{(-0.383385,0.177724)},
}
{
{(-0.383385,-0.177724)},{(1.69272,0)},
}
}
StateVector
Evolution of the StateVector object is performed, and the result is returned as a DensityMatrix object
The dimension of the StateVector object is obtained by the member method dim() and should be equal to the input dimension of the Choi object
Please refer to DensityMatrix
Please refer to StateVector
Python
import numpy as np
def test_evolve():
stv = StateVector()
K0 = np.array([[0, 1], [1+0.j, 0]])
K1 = np.array([[1, 0], [0+0.j, -1]])
K2 = np.array([[0+0.j, -1.j], [1.j, 0]])
Ks1 = [K0, K1, K2]
Ks2 = [K1]
Kra3 = Kraus(Ks1, Ks2)
choi = Choi(Kra3)
res = choi.evolve(stv)
print("res:",res)
if __name__ == "__main__":
test_evolve()
Output
res: {
{
{(1,0)},{(0,0)},
}
{
{(0,0)},{(2,0)},
}
}
Boolean function
Equal
Determine whether the internal data of two Choi objects are equal
Here is API doc
Python
import numpy as np
def test_equal():
K0 = np.array([[0, 1], [1+0.j, 0]])
K1 = np.array([[1, 0], [0+0.j, -1]])
K2 = np.array([[0+0.j, -1.j], [1.j, 0]])
Ks1 = [K0, K1, K2]
Ks2 = [K1]
Kra3 = Kraus(Ks1, Ks2)
choi = Choi(Kra3)
choi2 = choi
print(choi2 == choi)
if __name__ == "__main__":
test_equal()
Output