def applyHToM(HL, HR, H, M, k): k1 = k k2 = k + 1 # Add HL.opSum x h.identity(k1) x h.identity(k2) x I(Right) # and I(Left) x h.identity(k1) x h.identity(k2) x HR.opSum Hv = bops.multiContraction(HL.opSum, M, '0', '0') Hv = bops.addNodes(Hv, bops.multiContraction(M, HR.opSum, '3', '0')) # Add I(Left) x h.single(k1) x h.identity(k2) x I(Right) # And I(Left) x h.identity(k1) x h.single(k2) x I(Right) Hv = bops.addNodes(Hv, \ tn.transpose(bops.multiContraction(M, H.singles[k1], '1', '0'), [0, 3, 1, 2])) Hv = bops.addNodes(Hv, \ tn.transpose(bops.multiContraction(M, H.singles[k2], '2', '0'), [0, 1, 3, 2])) # Add HL.openOp x h.r2l(k1) x h.identity(k2) x I(Right) # And I(Left) x h.identity(k1) x h.l2r(k2) x HR.openOp HK1R2L = bops.permute(bops.multiContraction(M, H.r2l[k1], '1', '0'), [0, 4, 3, 1, 2]) Hv = bops.addNodes(Hv, \ bops.multiContraction(HL.openOp, HK1R2L, '02', '01')) HK2L2R = bops.permute(bops.multiContraction(M, H.l2r[k2], '2', '0'), [0, 1, 3, 4, 2]) Hv = bops.addNodes(Hv, \ bops.multiContraction(HK2L2R, HR.openOp, '43', '02')) # Add I(Left) x h.l2r(k1) x h.r2l(k2) x I(Right) HK1K2 = bops.multiContraction(M, H.l2r[k1], '1', '0') HK1K2 = bops.multiContraction(HK1K2, H.r2l[k2], '14', '02') HK1K2 = bops.permute(HK1K2, [0, 2, 3, 1]) Hv = bops.addNodes(Hv, HK1K2) return Hv
def test_transpose(dtype, num_charges): np.random.seed(10) a = tn.Node(get_random((6, 7, 8, 9, 10), num_charges=num_charges, dtype=dtype), backend='symmetric') order = [a[n] for n in reversed(range(5))] transpa = tn.transpose(a, [4, 3, 2, 1, 0]) a.reorder_edges(order) np.testing.assert_allclose(a.tensor.data, transpa.tensor.data)
def permute(node: tn.Node, permutation): if node is None: return None axisNames = [] for i in range(len(permutation)): axisNames.append(node.edges[permutation[i]].name) result = tn.transpose(node, permutation, axis_names=axisNames) result.add_axis_names(axisNames) for i in range(len(axisNames)): result.get_edge(i).set_name(axisNames[i]) result.set_name(node.name) return result
def test_transpose_vs_backend(backend, dtype): """ Tests that transpose yields the same result as the backend equivalent. """ shape = (3, 2, 4) permutation = (1, 2, 0) tensor, array = testing_utils.safe_randn(shape, backend, dtype) if tensor is not None: backend_obj = backends.backend_factory.get_backend(backend) test = backend_obj.convert_to_tensor(array) test = backend_obj.transpose(test, perm=permutation) tensor_test = tensornetwork.transpose(tensor, perm=permutation) np.testing.assert_allclose(test, tensor_test.array)
def test_transpose_of_node_without_backend_raises_error(): node = np.random.rand(3, 3, 3) with pytest.raises(AttributeError): tn.transpose(node, permutation=[])
def test_transpose(backend): a = tn.Node(np.random.rand(1, 2, 3, 4, 5), backend=backend) order = [a[n] for n in reversed(range(5))] transpa = tn.transpose(a, [4, 3, 2, 1, 0]) a.reorder_edges(order) np.testing.assert_allclose(a.tensor, transpa.tensor)