def _cp_condition(channel): """Return Choi-matrix eigenvalues for checking if channel is CP""" if isinstance(channel, QuantumChannel): if not isinstance(channel, Choi): channel = Choi(channel) return np.linalg.eigvalsh(channel.data) unitary = Operator(channel).data return np.tensordot(unitary, unitary.conj(), axes=([0, 1], [0, 1])).real
def _tp_condition(channel): """Return partial tr Choi-matrix eigenvalues for checking if channel is TP""" if isinstance(channel, QuantumChannel): if not isinstance(channel, Choi): channel = Choi(channel) choi = channel.data dims = tuple(np.sqrt(choi.shape).astype(int)) shape = dims + dims tr_choi = np.trace(np.reshape(choi, shape), axis1=1, axis2=3) else: unitary = Operator(channel).data tr_choi = np.tensordot(unitary, unitary.conj(), axes=(0, 0)) return np.linalg.eigvalsh(tr_choi - np.eye(len(tr_choi)))