Channels#

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

Measurement#

POVM#

Kraus#