Returns True if the collection of (weighted) Kraus operators are
    complete. (Which is necessary for a CPTP map to preserve trace)

def kraus_iscomplete(kraus: Kraus) -> bool:
    """Returns True if the collection of (weighted) Kraus operators are
    complete. (Which is necessary for a CPTP map to preserve trace)
    """
    qubits = kraus.qubits
    N = kraus.qubit_nb

    ident = Gate(np.eye(2**N), qubits)  # FIXME

    tensors = [(op.H @ op @ ident).asoperator() for op in kraus.operators]
    tensors = [t*w for t, w in zip(tensors, kraus.weights)]

    tensor = reduce(np.add, tensors)
    res = Gate(tensor, qubits)

    return almost_identity(res)