def swap(N=None, control=None, target=None, mask=None): """Quantum object representing the SWAP gate. Returns ------- swap_gate : qobj Quantum object representation of SWAP gate Examples -------- >>> swap() Quantum object: dims = [[2, 2], [2, 2]], \ shape = [4, 4], type = oper, isHerm = True Qobj data = [[ 1.+0.j 0.+0.j 0.+0.j 0.+0.j] [ 0.+0.j 0.+0.j 1.+0.j 0.+0.j] [ 0.+0.j 1.+0.j 0.+0.j 0.+0.j] [ 0.+0.j 0.+0.j 0.+0.j 1.+0.j]] """ if mask: warnings.warn("The mask argument to iswap is deprecated. " + "Use the N, control and target arguments instead.") if sum(mask) != 2: raise ValueError("mask must only have two ones, rest zeros") dims = [2] * len(mask) idx, = where(mask) N = prod(dims) data = sp.lil_matrix((N, N)) for s1 in state_number_enumerate(dims): i1 = state_number_index(dims, s1) if s1[idx[0]] == s1[idx[1]]: i2 = i1 else: s2 = array(s1).copy() s2[idx[0]], s2[idx[1]] = s2[idx[1]], s2[idx[0]] i2 = state_number_index(dims, s2) data[i1, i2] = 1 return Qobj(data, dims=[dims, dims], shape=[N, N]) elif not N is None and not control is None and not target is None: return gate_expand_2toN(swap(), N, control, target) else: uu = qstate('uu') ud = qstate('ud') du = qstate('du') dd = qstate('dd') Q = uu * uu.dag() + ud * du.dag() + du * ud.dag() + dd * dd.dag() return Q
def iswap(N=None, control=None, target=None, mask=None): """Quantum object representing the iSWAP gate. Returns ------- iswap_gate : qobj Quantum object representation of iSWAP gate Examples -------- >>> iswap() Quantum object: dims = [[2, 2], [2, 2]], \ shape = [4, 4], type = oper, isHerm = False Qobj data = [[ 1.+0.j 0.+0.j 0.+0.j 0.+0.j] [ 0.+0.j 0.+0.j 0.+1.j 0.+0.j] [ 0.+0.j 0.+1.j 0.+0.j 0.+0.j] [ 0.+0.j 0.+0.j 0.+0.j 1.+0.j]] """ if mask: warnings.warn("The mask argument to iswap is deprecated. " + "Use the N, control and target arguments instead.") if sum(mask) != 2: raise ValueError("mask must only have two ones, rest zeros") dims = [2] * len(mask) idx, = where(mask) N = prod(dims) data = sp.lil_matrix((N, N), dtype=complex) for s1 in state_number_enumerate(dims): i1 = state_number_index(dims, s1) if s1[idx[0]] == s1[idx[1]]: i2 = i1 val = 1.0 else: s2 = s1.copy() s2[idx[0]], s2[idx[1]] = s2[idx[1]], s2[idx[0]] i2 = state_number_index(dims, s2) val = 1.0j data[i1, i2] = val return Qobj(data, dims=[dims, dims], shape=[N, N]) elif not N is None and not control is None and not target is None: return gate_expand_2toN(iswap(), N, control, target) else: return Qobj(array([[1, 0, 0, 0], [0, 0, 1j, 0], [0, 1j, 0, 0], [0, 0, 0, 1]]), dims=[[2, 2], [2, 2]])
def _partial_transpose_reference(rho, mask): """ This is a reference implementation that explicitly loops over all states and performs the transpose. It's slow but easy to understand and useful for testing. """ A_pt = np.zeros(rho.shape, dtype=complex) for psi_A in state_number_enumerate(rho.dims[0]): m = state_number_index(rho.dims[0], psi_A) for psi_B in state_number_enumerate(rho.dims[1]): n = state_number_index(rho.dims[1], psi_B) m_pt = state_number_index( rho.dims[1], np.choose(mask, [psi_A, psi_B])) n_pt = state_number_index( rho.dims[0], np.choose(mask, [psi_B, psi_A])) A_pt[m_pt, n_pt] = rho.data[m, n] return Qobj(A_pt, dims=rho.dims)
def swap(mask=None): """Quantum object representing the SWAP gate. Returns ------- swap_gate : qobj Quantum object representation of SWAP gate Examples -------- >>> swap() Quantum object: dims = [[2, 2], [2, 2]], \ shape = [4, 4], type = oper, isHerm = True Qobj data = [[ 1.+0.j 0.+0.j 0.+0.j 0.+0.j] [ 0.+0.j 0.+0.j 1.+0.j 0.+0.j] [ 0.+0.j 1.+0.j 0.+0.j 0.+0.j] [ 0.+0.j 0.+0.j 0.+0.j 1.+0.j]] """ if mask is None: uu = qstate('uu') ud = qstate('ud') du = qstate('du') dd = qstate('dd') Q = uu * uu.dag() + ud * du.dag() + du * ud.dag() + dd * dd.dag() return Qobj(Q) else: if sum(mask) != 2: raise ValueError("mask must only have two ones, rest zeros") dims = [2] * len(mask) idx, = where(mask) N = prod(dims) data = sp.lil_matrix((N, N)) for s1 in state_number_enumerate(dims): i1 = state_number_index(dims, s1) if s1[idx[0]] == s1[idx[1]]: i2 = i1 else: s2 = array(s1).copy() s2[idx[0]], s2[idx[1]] = s2[idx[1]], s2[idx[0]] i2 = state_number_index(dims, s2) data[i1, i2] = 1 return Qobj(data, dims=[dims, dims], shape=[N, N])
def iswap(mask=None): """Quantum object representing the iSWAP gate. Returns ------- iswap_gate : qobj Quantum object representation of iSWAP gate Examples -------- >>> iswap() Quantum object: dims = [[2, 2], [2, 2]], \ shape = [4, 4], type = oper, isHerm = False Qobj data = [[ 1.+0.j 0.+0.j 0.+0.j 0.+0.j] [ 0.+0.j 0.+0.j 0.+1.j 0.+0.j] [ 0.+0.j 0.+1.j 0.+0.j 0.+0.j] [ 0.+0.j 0.+0.j 0.+0.j 1.+0.j]] """ if mask is None: return Qobj(array([[1, 0, 0, 0], [0, 0, 1j, 0], [0, 1j, 0, 0], [0, 0, 0, 1]]), dims=[[2, 2], [2, 2]]) else: if sum(mask) != 2: raise ValueError("mask must only have two ones, rest zeros") dims = [2] * len(mask) idx, = where(mask) N = prod(dims) data = sp.lil_matrix((N, N), dtype=complex) for s1 in state_number_enumerate(dims): i1 = state_number_index(dims, s1) if s1[idx[0]] == s1[idx[1]]: i2 = i1 val = 1.0 else: s2 = s1.copy() s2[idx[0]], s2[idx[1]] = s2[idx[1]], s2[idx[0]] i2 = state_number_index(dims, s2) val = 1.0j data[i1, i2] = val return Qobj(data, dims=[dims, dims], shape=[N, N])