def bipartitepurestate_partialtranspose_densitymatrix(bipartite_tensor, pt_subsys): """ Calculate the partial transpose of a density matrix. :param bipartite_tensor: matrix for the bipartite system :param pt_subsys: subsystem to transpose (either 0 or 1) :return: density matrix after partial transpose :type bipartite_tensor: numpy.ndarray :type pt_subsys: int :rtype: numpy.ndarray """ if not (pt_subsys in [0, 1]): raise ValueError('pt_subsys can only be 0 or 1!') ketnode = tn.Node(bipartite_tensor) branode = tn.Node(np.conj(bipartite_tensor)) final_node = tn.outer_product(ketnode, branode) e0, e1, e2, e3 = final_node[0], final_node[1], final_node[2], final_node[3] if pt_subsys == 0: final_node.reorder_edges([e2, e1, e0, e3]) else: final_node.reorder_edges([e0, e3, e2, e1]) return final_node.tensor
def test_outer_product_without_legs(a, b, expected_val, expected_shape, expected_name, backend): node1 = tn.Node(a, name="A", backend=backend) node2 = tn.Node(b, name="B", backend=backend) node3 = tn.outer_product(node1, node2, name=expected_name) np.testing.assert_allclose(node3.tensor, expected_val) assert node3.shape == expected_shape assert node3.name == expected_name
def test_outer_product(backend): a = tn.Node(np.ones((2, 4, 5)), name="A", backend=backend) b = tn.Node(np.ones((4, 3, 6)), name="B", backend=backend) c = tn.Node(np.ones((3, 2)), name="C", backend=backend) tn.connect(a[1], b[0]) tn.connect(a[0], c[1]) tn.connect(b[1], c[0]) # Purposely leave b's 3rd axis undefined. d = tn.outer_product(a, b, name="D") tn.check_correct({c, d}) assert d.shape == (2, 4, 5, 4, 3, 6) np.testing.assert_allclose(d.tensor, np.ones((2, 4, 5, 4, 3, 6))) assert d.name == "D"
def bipartitepurestate_densitymatrix(bipartitepurestate_tensor): """Calculate the whole density matrix of the bipartitite system Given a discrete normalized quantum system, given in terms of 2-D numpy array ``bipartitepurestate_tensor``, each element of ``bipartitepurestate_tensor[i, j]`` is the coefficient of the ket :math:`|ij\\rangle`, calculate the whole density matrix. :param bipartitepurestate_tensor: tensor describing the bi-partitite states, with each elements the coefficients for :math:`|ij\\rangle` :return: density matrix :type bipartitepurestate_tensor: numpy.ndarray :rtype: numpy.ndarray """ ketnode = tn.Node(bipartitepurestate_tensor) branode = tn.Node(np.conj(bipartitepurestate_tensor)) denmat_node = tn.outer_product(ketnode, branode) return denmat_node.tensor