noise/lindblad.py
lindblad_kraus
No Definition provided
py
def lindblad_kraus(H: pt.Tensor | None, T1: float, T2: float, t_gate: float, d: int) -> pt.TensorImplementation
python
def lindblad_kraus(H: pt.Tensor | None, T1: float, T2: float, t_gate: float, d: int) -> pt.Tensor:
assert T2 <= 2 * T1, 'T2 must be <= 2*T1'
d_sq = d * d
I = pt.eye(d, dtype=C128)
L = pt.zeros((d_sq, d_sq), dtype=C128)
gamma1 = 1.0 / T1
gamma_phi = 1.0 / T2 - 1.0 / (2.0 * T1)
for k in range(1, d):
Lk = pt.zeros((d, d), dtype=C128)
Lk[k - 1, k] = 1.0
L = L + _lindblad_term(Lk, gamma1, d_sq)
for k in range(1, d):
Lk = pt.zeros((d, d), dtype=C128)
Lk[k, k] = 1.0
L = L + _lindblad_term(Lk, gamma_phi, d_sq)
if H is not None:
H = H.to(C128)
L = L - 1j * (pt.kron(I, H) - pt.kron(H.T.contiguous(), I))
S = pt.linalg.matrix_exp(L * t_gate)
choi = S.reshape(d, d, d, d).permute(0, 2, 1, 3).reshape(d_sq, d_sq)
evals, evecs = pt.linalg.eigh(choi)
tol = 1e-10
mask = evals.real > tol
lam = evals[mask]
vecs = evecs[:, mask]
kraus = (lam.real.sqrt().unsqueeze(0) * vecs).T.reshape(-1, d, d)
return kraus.to(C128)