Parametric quantum channels¶
Definition¶
In addition to QuantumChannelKraus
, the qat.quops
module contains parametric quantum channels, i.e channels which depend on a parameter $t$. In other words, its Kraus operators are of the form $E_k(t)$.
Predefined parametric quantum channels¶
At the moment, there are two predefined parametric quantum channels : ParametricPureDephasing
and ParametricAmplitudeDamping
, which correspond to the well-known pure-dephasing and amplitude-damping channels (see e.g Nielsen & Chuang).
import numpy as np
from qat.quops import ParametricAmplitudeDamping, ParametricPureDephasing, QuantumChannelKraus
Such objects are instantiated in the following way:
# Amplitude damping channel with exponential decay (Lindblad approximation, characteristic decay time T_1)
AD_parametric = ParametricAmplitudeDamping(T_1=1.0)
# Pure dephasing channel with exponential decay (Lindblad approximation, characteristic decay time T_phi)
PD_parametric = ParametricPureDephasing(T_phi=1.0)
# Pure dephasing channel with 1/f spectral function
PD_1_over_f = ParametricPureDephasing(spectral_function={"type": "1/f",
"intensity": 3e-10,
"w_c" : 1e-1,
"w_ir": 1e-9})
# Pure dephasing channel with ohmic spectral function
PD_ohmic = ParametricPureDephasing(spectral_function={"type": "Ohmic",
"intensity": 3e-10,
"w_c" : 1e-1,
"w_ir" : 0})
Calling the object with a given parameter (the time during which the channel is applied) returns a QuantumChannelKraus
object:
print("type = ",type(AD_parametric(0.5)))
print("type = ",type(PD_parametric(0.5)))
print("type = ",type(PD_1_over_f(0.5)))
print("type = ",type(PD_ohmic(0.5)))
type = <class 'qat.quops.quantum_channels.QuantumChannelKraus'> type = <class 'qat.quops.quantum_channels.QuantumChannelKraus'> type = <class 'qat.quops.quantum_channels.QuantumChannelKraus'> type = <class 'qat.quops.quantum_channels.QuantumChannelKraus'>
To get the value of the Kraus operators, one can write e.g:
print("Kraus operators = ", AD_parametric(0.5).kraus_operators)
Kraus operators = [array([[1. +0.j, 0. +0.j], [0. +0.j, 0.77880078+0.j]]), array([[0. +0.j, 0.62727135+0.j], [0. +0.j, 0. +0.j]])]
Creating one's own parametric quantum channel¶
Creating one's own parametric quantum channel is straightforward, as illustrated in the example below:
class MyCustomParametricQuantumChannel:
def __init__(self, T_custom):
self.T_custom = T_custom
def __call__(self, t):
p = 1 - np.exp(-t/self.T_custom)
return QuantumChannelKraus([np.sqrt(p)*np.identity(2), np.sqrt(1-p)*np.array([[0, -1j],[1j, 0]], np.complex_)])
custom_chan = MyCustomParametricQuantumChannel(T_custom=2)
print(custom_chan(0.5))
: [[0.47031821 0. ] [0. 0.47031821]] [[0.+0.j 0.-0.8824969j] [0.+0.8824969j 0.+0.j ]]