Channels#
John Watrous: https://youtu.be/cMl-xIDSmXI
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
from qiskit.quantum_info import Kraus, SuperOp, random_quantum_channel, PTM, Choi, Chi
from qiskit.visualization import plot_histogram
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
# Import from Qiskit Aer noise module
from qiskit_aer.noise import (
NoiseModel,
QuantumError,
ReadoutError,
depolarizing_error,
pauli_error,
thermal_relaxation_error,
)
Representation#
Stinespring#
## random quantum channel in Stinespring form
from qiskit.quantum_info import random_quantum_channel
random_quantum_channel(2, 2)
Stinespring([[ 0.03849769+0.02036647j, -0.698461 -0.09797363j],
[-0.0819251 +0.11373122j, -0.05175353+0.46665556j],
[-0.15717588+0.11410124j, 0.07142001+0.09756838j],
[ 0.00692667+0.03544208j, 0.00834859+0.31888786j],
[ 0.14203522-0.13634234j, -0.09643058+0.12861438j],
[-0.09117948-0.34925634j, 0.02034073+0.10721822j],
[-0.56400128+0.6295895j , -0.09551063-0.09133277j],
[-0.0836914 -0.22110541j, -0.33102433-0.030609j ]],
input_dims=(2,), output_dims=(2,))
Pauli Transfer Matrix (PTM)#
https://docs.quantum.ibm.com/api/qiskit/qiskit.quantum_info.PTM
Pauli Transfer Matrix (PTM) representation of a Quantum Channel.
rqc = PTM(random_quantum_channel(2, 2))
print('num_qubits: ', rqc.num_qubits)
rqc
num_qubits: 1
PTM([[ 1.00000000e+00-9.52787305e-18j, -2.08166817e-17+0.00000000e+00j,
2.77555756e-17+0.00000000e+00j, -3.33066907e-16-6.88837700e-18j],
[-9.09489194e-02+0.00000000e+00j, -3.72195758e-01+0.00000000e+00j,
2.01356134e-02+0.00000000e+00j, -1.88193128e-01+0.00000000e+00j],
[ 1.07371749e-01+0.00000000e+00j, 3.69139869e-01+0.00000000e+00j,
-1.20645755e-01+0.00000000e+00j, -4.81331497e-01+0.00000000e+00j],
[-1.56748013e-01+8.54415943e-18j, 1.14009043e-01+0.00000000e+00j,
-4.85784633e-01+0.00000000e+00j, -1.72685021e-01+4.62303219e-19j]],
input_dims=(2,), output_dims=(2,))
rqc.compose(rqc)
PTM([[ 1.00000000e+00-2.40259894e-18j, -3.65286159e-17+1.06400890e-17j,
-3.25381917e-17-3.48337848e-19j, 8.10475729e-17-2.95275781e-18j],
[-5.03863959e-01-3.97212202e-18j, 8.72077238e-02+7.41407448e-18j,
-4.36095725e-02-9.82187287e-18j, -2.73736239e-02+4.42821287e-18j],
[ 3.66501244e-01+1.11459993e-17j, -5.33738689e-02-5.89698216e-18j,
8.10998407e-02-1.25503009e-17j, -9.32187871e-02+2.08189613e-18j],
[-2.18558871e-01-7.45593673e-18j, 5.86923694e-02-9.37442687e-18j,
2.00888015e-01-1.19893761e-17j, -7.11955275e-03-7.38513938e-19j]],
input_dims=(2,), output_dims=(2,))
rqc.power(4)
rqc.adjoint()
rqc.is_unitary()
rqc.is_cptp() # cp, tp, unitary
True
Kraus#
from qiskit.quantum_info import Kraus
rqc_kraus = Kraus(random_quantum_channel(2, 2))
rqc_kraus
Kraus([[[ 0.40797192-0.21907435j, -0.04302789-0.46760563j],
[-0.02762658-0.30734793j, -0.02968974+0.05646335j]],
[[-0.31594324-0.24582982j, 0.22465833-0.25842112j],
[-0.29698492+0.15016866j, 0.33448024-0.03782379j]],
[[ 0.29609313-0.1089395j , 0.17119268-0.49213072j],
[-0.19383795-0.15392175j, 0.30024441-0.14315255j]],
[[ 0.15164906-0.06327016j, 0.22433035+0.00823283j],
[ 0.47619079-0.06909437j, -0.07334134+0.32703776j]]],
input_dims=(2,), output_dims=(2,))
SuperOp#
from qiskit.quantum_info import SuperOp
rqc_superop = SuperOp(random_quantum_channel(2, 2))
rqc_superop
SuperOp([[ 0.35072481-2.86610956e-18j, -0.14007719-7.01581293e-02j,
-0.14007719+7.01581293e-02j, 0.31865109-3.53173471e-18j],
[ 0.30439855+2.40310794e-01j, -0.10928561+8.78976417e-03j,
-0.03296743-5.41481067e-03j, 0.20376672+2.19722547e-01j],
[ 0.30439855-2.40310794e-01j, -0.03296743+5.41481067e-03j,
-0.10928561-8.78976417e-03j, 0.20376672-2.19722547e-01j],
[ 0.64927519+1.59760684e-19j, 0.14007719+7.01581293e-02j,
0.14007719-7.01581293e-02j, 0.68134891-2.87830609e-18j]],
input_dims=(2,), output_dims=(2,))
Choi#
from qiskit.quantum_info import Choi
rqc_choi = Choi(random_quantum_channel(2, 2))
rqc_choi
Choi([[ 5.79887972e-01-1.35042435e-17j, -3.83764342e-01+8.14399434e-02j,
-3.70265417e-04+8.17702963e-02j, 2.46990613e-01+4.54470675e-02j],
[-3.83764342e-01-8.14399434e-02j, 4.20112028e-01+1.10093054e-17j,
-9.87365214e-02-2.68883634e-01j, 3.70265417e-04-8.17702963e-02j],
[-3.70265417e-04-8.17702963e-02j, -9.87365214e-02+2.68883634e-01j,
4.72549646e-01+1.03334622e-18j, -1.67075303e-01+1.19816900e-01j],
[ 2.46990613e-01-4.54470675e-02j, 3.70265417e-04+8.17702963e-02j,
-1.67075303e-01-1.19816900e-01j, 5.27450354e-01-4.91109101e-18j]],
input_dims=(2,), output_dims=(2,))
Chi#
from qiskit.quantum_info import Chi
rqc_chi = Chi(random_quantum_channel(2, 2))
rqc_chi
Chi([[ 0.11737619-3.46944695e-18j, -0.06467212+2.71818885e-02j,
-0.00854459+2.51498699e-01j, -0.02205206+4.17213701e-02j],
[-0.06467212-2.71818885e-02j, 0.39124272+6.93889390e-18j,
0.09044332+2.20520604e-02j, 0.05584356-8.54458617e-03j],
[-0.00854459-2.51498699e-01j, 0.09044332-2.20520604e-02j,
1.3812895 +6.93889390e-18j, 0.13840778+6.46721240e-02j],
[-0.02205206-4.17213701e-02j, 0.05584356+8.54458617e-03j,
0.13840778-6.46721240e-02j, 0.11009159-3.46944695e-18j]],
input_dims=(2,), output_dims=(2,))
Measures#
from qiskit.quantum_info import average_gate_fidelity
average_gate_fidelity(random_quantum_channel(2, 2))
0.5734653416497364
from qiskit.quantum_info import process_fidelity
process_fidelity(random_quantum_channel(2, 2), random_quantum_channel(2, 2))
0.5232190682672958
from qiskit.quantum_info import gate_error
gate_error(random_quantum_channel(2, 2))
0.4836283339885725
from qiskit.quantum_info import diamond_norm, random_quantum_channel
diamond_norm(random_quantum_channel(2, 2)-random_quantum_channel(2, 2))
from qiskit.quantum_info import diamond_norm, random_quantum_channel
from qiskit.quantum_info import Kraus, SuperOp, PTM
# diamond_norm(random_quantum_channel(2, 2)-random_quantum_channel(2, 2))
## single qubit depolarizing channel
from qiskit_aer.noise import (pauli_error)
# error = depolarizing_error(0.05, 1)
# error
p_error = 0.03
ic = pauli_error([('I', 1)])
dep_err = pauli_error([('X', p_error/3), ('Y', p_error/3), ('Z', p_error/3), ('I', 1 - p_error)])
print(dep_err)
dep_ptm = PTM(dep_err)
dep_ptm
print(f'diamond distance: {diamond_norm(dep_ptm - ic)} with noise rate {p_error}')
QuantumError on 1 qubits. Noise circuits:
P(0) = 0.01, Circuit =
┌───┐
q: ┤ X ├
└───┘
P(1) = 0.01, Circuit =
┌───┐
q: ┤ Y ├
└───┘
P(2) = 0.01, Circuit =
┌───┐
q: ┤ Z ├
└───┘
P(3) = 0.97, Circuit =
┌───┐
q: ┤ I ├
└───┘
diamond distance: 0.06000010519101877 with noise rate 0.03