Skip to content

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.Tensor
Implementation
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)