def test_contract_with_sequence():
    # 3 contract to complex number using a sequence
    # ==========================
    v = npc.Array.from_ndarray_trivial([[1. + .2j, .5], [0 + .1j, -1.6]], dtype=complex)
    v.iset_leg_labels(['L1', 'L2'])
    w = npc.Array.from_ndarray_trivial([[1.2 + .3j, .6], [0.1 + .2j, -1.2]], dtype=complex)
    w.iset_leg_labels(['U1', 'U2'])
    h2 = two_site_hamiltonian()
    h = two_site_hamiltonian(coupling=.3)
    S = Sy
    S.iset_leg_labels(['U', 'L'])

    # the supplied sequence should generate three suboptimal warnings
    with warnings.catch_warnings(record=True) as cw:
        # Cause all warnings to always be triggered.
        warnings.simplefilter("always")

        res = contract(tensor_list=[v, h2, S, h, w],
                       tensor_names=['v', 'h2', 'S', 'h', 'w'],
                       leg_contractions=[['v', 'L1', 'h2', 'p1*'], ['v', 'L2', 'h2', 'p2*'],
                                         ['h2', 'p1', 'h', 'p1*'], ['h2', 'p2', 'S', 'U'],
                                         ['S', 'L', 'h', 'p2*'], ['h', 'p1', 'w', 'U1'],
                                         ['h', 'p2', 'w', 'U2']],
                       sequence=[1, 3, 5, 6, 4, 2, 0])

        assert len(cw) == 3
        assert "Suboptimal contraction sequence" in str(cw[0].message)
        assert "Suboptimal contraction sequence" in str(cw[1].message)
        assert "Suboptimal contraction sequence" in str(cw[2].message)

    expected_result = -0.1735 - 0.5015j  # from MatLab

    assert np.abs(res - expected_result) < 1.e-10
Esempio n. 2
0
def test_contract_to_complex_number():
    # 2 contract to complex number
    # ==========================
    v = npc.Array.from_ndarray_trivial([[1. + .2j, .5], [0 + .1j, -1.6]],
                                       dtype=complex)
    v.iset_leg_labels(['L1', 'L2'])
    w = npc.Array.from_ndarray_trivial([[1.2 + .3j, .6], [0.1 + .2j, -1.2]],
                                       dtype=complex)
    w.iset_leg_labels(['U1', 'U2'])
    h2 = two_site_hamiltonian()
    h = two_site_hamiltonian(coupling=.3)
    S = Sy
    S.iset_leg_labels(['U', 'L'])

    res = contract(tensor_list=[v, h2, S, h, w],
                   tensor_names=['v', 'h2', 'S', 'h', 'w'],
                   leg_contractions=[['v', 'L1', 'h2', 'p1*'],
                                     ['v', 'L2', 'h2', 'p2*'],
                                     ['h2', 'p1', 'h', 'p1*'],
                                     ['h2', 'p2', 'S', 'U'],
                                     ['S', 'L', 'h', 'p2*'],
                                     ['h', 'p1', 'w', 'U1'],
                                     ['h', 'p2', 'w', 'U2']])
    expected_result = -0.1735 - 0.5015j  # from MatLab

    assert np.abs(res - expected_result) < 1.e-10
Esempio n. 3
0
def test_contract_to_real_number():
    # 1 contract to real number
    # ==========================
    v = npc.Array.from_ndarray_trivial([[1., .5], [0, -1.6]])
    v.iset_leg_labels(['L1', 'L2'])
    w = npc.Array.from_ndarray_trivial([[1.2, .6], [0.1, -1.2]])
    w.iset_leg_labels(['U1', 'U2'])
    h2 = two_site_hamiltonian()
    h = two_site_hamiltonian(coupling=.3)
    S = Sz
    S.iset_leg_labels(['U', 'L'])

    res = contract(tensor_list=[v, h2, S, h, w],
                   leg_contractions=[['v', 'L1', 'h2', 'p1*'],
                                     ['v', 'L2', 'h2', 'p2*'],
                                     ['h2', 'p1', 'h', 'p1*'],
                                     ['h2', 'p2', 'S', 'U'],
                                     ['S', 'L', 'h', 'p2*'],
                                     ['h', 'p1', 'w', 'U1'],
                                     ['h', 'p2', 'w', 'U2']],
                   open_legs=None,
                   tensor_names=['v', 'h2', 'S', 'h', 'w'])
    expected_result = -0.2970000000000002  # from MatLab

    assert np.abs(res - expected_result) < 1.e-10
def test_outer_product():
    S = Sy
    S.iset_leg_labels(['U', 'L'])
    S2 = Sz
    S2.iset_leg_labels(['U', 'L'])

    res = contract(tensor_list=[S, S2],
                   tensor_names=['Sy', 'Sz'],
                   open_legs=[['Sy', 'U', 'U2'], ['Sy', 'L', 'L2'], ['Sz', 'U', 'U1'],
                              ['Sz', 'L', 'L1']])
    expected_result = np.kron(np.array([[1., 0.], [0., -1.]]), np.array([[0., -1.j], [1.j, 0.]]))
    expected_result = expected_result.reshape([2, 2, 2, 2])
    expected_result = expected_result.transpose([1, 3, 0, 2])

    assert np.linalg.norm(res.to_ndarray() - expected_result) < 1.e-10
def test_contract_to_tensor():
    h2 = two_site_hamiltonian()
    h = two_site_hamiltonian(coupling=.3)
    S = Sy
    S.iset_leg_labels(['U', 'L'])

    res = contract(tensor_list=[h2, S, h],
                   tensor_names=['h2', 'S', 'h'],
                   leg_contractions=[['h2', 'p1', 'h', 'p1*'], ['h2', 'p2', 'S', 'U'],
                                     ['S', 'L', 'h', 'p2*']],
                   open_legs=[['h2', 'p1*', 'U1'], ['h2', 'p2*', 'U2'], ['h', 'p1', 'L1'],
                              ['h', 'p2', 'L2']])

    expected_result = np.ones([2, 2, 2, 2], dtype=complex)
    expected_result[:, :, 0, 0] = [[.35j, -1j], [0, .65j]]
    expected_result[:, :, 1, 0] = [[0, -.65j], [-.35j, -1j]]
    expected_result[:, :, 0, 1] = [[1j, +.35j], [.65j, 0]]
    expected_result[:, :, 1, 1] = [[-.65j, 0], [1j, -.35j]]

    assert np.linalg.norm(res.to_ndarray() - expected_result) < 1.e-10