예제 #1
0
def test_right_envs_two_non_consecutive_sites(backend_dtype_values):
    dtype = backend_dtype_values[1]
    backend = backend_factory.get_backend(backend_dtype_values[0])

    D, d, N = 3, 2, 5
    tensors = [np.ones((1, d, D), dtype=dtype)
               ] + [np.ones((D, d, D), dtype=dtype)
                    for _ in range(N - 2)] + [np.ones((D, d, 1), dtype=dtype)]
    mps = FiniteMPS(tensors,
                    center_position=None,
                    backend=backend_dtype_values[0],
                    canonicalize=False)
    r = backend.convert_to_tensor(np.ones((1, 1), dtype=dtype))
    exp = {}
    for n in reversed(range(N)):
        t = mps.tensors[n]
        if n in [1, 3]:
            exp[n] = r
        r = ncon([t, r, t], [[-1, 2, 1], [1, 3], [-2, 2, 3]], backend=backend)
    envs = mps.right_envs(sites=[1, 3])
    assert set(envs.keys()) == {3, 1}
    for n in [1, 3]:
        expected = exp[n]
        actual = envs[n]
        np.testing.assert_array_almost_equal(expected, actual)
예제 #2
0
def test_save_not_implemented(backend_dtype_values):
    backend = backend_dtype_values[0]
    dtype = backend_dtype_values[1]

    D, d, N = 1, 2, 10
    tensors = [np.ones((1, d, D), dtype=dtype)
               ] + [np.ones((D, d, D), dtype=dtype)
                    for _ in range(N - 2)] + [np.ones((D, d, 1), dtype=dtype)]
    mps = FiniteMPS(tensors, center_position=0, backend=backend)
    with pytest.raises(NotImplementedError):
        mps.save('tmp')
예제 #3
0
def test_random_mps_invalid_dimensions_raises_error(backend_dtype_values):
    with pytest.raises(ValueError):
        FiniteMPS.random(d=[3, 4],
                         D=[2, 3],
                         dtype=backend_dtype_values[1],
                         backend=backend_dtype_values[0])
    with pytest.raises(ValueError):
        FiniteMPS.random(d=[3, 4, 4, 2],
                         D=[2, 3],
                         dtype=backend_dtype_values[1],
                         backend=backend_dtype_values[0])
예제 #4
0
def test_check_canonical_raises(backend):
    N, D, d = 10, 10, 2
    tensors = [np.random.randn(1, d, D)
               ] + [np.random.randn(D, d, D)
                    for _ in range(N - 2)] + [np.random.randn(D, d, 1)]
    mps = FiniteMPS(tensors,
                    center_position=None,
                    canonicalize=False,
                    backend=backend)
    with pytest.raises(ValueError,
                       match="FiniteMPS.center_positions is `None`. "
                       "Cannot check canonical form."):
        mps.check_canonical()
예제 #5
0
def test_right_envs_one_site(backend_dtype_values):
    dtype = backend_dtype_values[1]

    D, d, N = 3, 2, 5
    tensors = [np.ones((1, d, D), dtype=dtype)
               ] + [np.ones((D, d, D), dtype=dtype)
                    for _ in range(N - 2)] + [np.ones((D, d, 1), dtype=dtype)]
    mps = FiniteMPS(tensors,
                    center_position=0,
                    backend=backend_dtype_values[0])
    envs = mps.right_envs(sites=[2])
    assert list(envs.keys()) == [2]
    np.testing.assert_array_almost_equal(envs[2].tensor, np.eye(3))
예제 #6
0
def test_right_envs_empty_seq(backend_dtype_values):
    backend = backend_dtype_values[0]
    dtype = backend_dtype_values[1]

    D, d, N = 1, 2, 10
    tensors = [np.ones((1, d, D), dtype=dtype)
               ] + [np.ones((D, d, D), dtype=dtype)
                    for _ in range(N - 2)] + [np.ones((D, d, 1), dtype=dtype)]
    mps = FiniteMPS(tensors, center_position=0, backend=backend)

    assert mps.right_envs(()) == {}
    assert mps.right_envs([]) == {}
    assert mps.right_envs(range(0)) == {}
예제 #7
0
def test_right_envs_all_sites_non_0_center_position(backend_dtype_values):
    dtype = backend_dtype_values[1]

    D, d, N = 3, 2, 5
    tensors = [np.ones((1, d, D), dtype=dtype)
               ] + [np.ones((D, d, D), dtype=dtype)
                    for _ in range(N - 2)] + [np.ones((D, d, 1), dtype=dtype)]
    mps = FiniteMPS(tensors,
                    center_position=2,
                    backend=backend_dtype_values[0])
    envs = mps.right_envs(sites=[-1, 0, 1, 2, 3, 4])
    assert set(envs.keys()) == {-1, 0, 1, 2, 3, 4}
    np.testing.assert_array_almost_equal(envs[-1].tensor, 1.)
    np.testing.assert_array_almost_equal(envs[2].tensor, np.eye(3))
예제 #8
0
def test_left_envs_two_non_consecutive_sites_2(backend_dtype_values):
    dtype = backend_dtype_values[1]

    D, d, N = 3, 2, 5
    tensors = [np.ones((1, d, D), dtype=dtype)
               ] + [np.ones((D, d, D), dtype=dtype)
                    for _ in range(N - 2)] + [np.ones((D, d, 1), dtype=dtype)]
    mps = FiniteMPS(tensors,
                    center_position=4,
                    backend=backend_dtype_values[0])
    envs = mps.left_envs(sites=[1, 3])
    assert list(envs.keys()) == [1, 3]
    np.testing.assert_array_almost_equal(envs[1].tensor, np.eye(2))
    np.testing.assert_array_almost_equal(envs[3].tensor, np.eye(3))
예제 #9
0
def test_left_envs_last_site(backend_dtype_values):
    dtype = backend_dtype_values[1]

    D, d, N = 3, 2, 5
    tensors = [np.ones((1, d, D), dtype=dtype)
               ] + [np.ones((D, d, D), dtype=dtype)
                    for _ in range(N - 2)] + [np.ones((D, d, 1), dtype=dtype)]
    mps = FiniteMPS(tensors,
                    center_position=0,
                    backend=backend_dtype_values[0])
    envs = mps.left_envs(sites=[5])
    assert list(envs.keys()) == [5]
    expected = 1.
    np.testing.assert_array_almost_equal(envs[5].tensor, expected)
예제 #10
0
def test_finite_mps_init(backend, N, pos):
    D, d = 10, 2
    tensors = [np.random.randn(1, d, D)
               ] + [np.random.randn(D, d, D)
                    for _ in range(N - 2)] + [np.random.randn(D, d, 1)]
    mps = FiniteMPS(tensors, center_position=pos, backend=backend)
    assert mps.center_position == pos
예제 #11
0
def test_right_envs_one_site_center_position_to_right(backend_dtype_values):
    backend = backend_factory.get_backend(backend_dtype_values[0])
    dtype = backend_dtype_values[1]

    D, d, N = 3, 2, 5
    tensors = [np.ones((1, d, D), dtype=dtype)
               ] + [np.ones((D, d, D), dtype=dtype)
                    for _ in range(N - 2)] + [np.ones((D, d, 1), dtype=dtype)]
    mps = FiniteMPS(tensors,
                    center_position=4,
                    backend=backend_dtype_values[0])
    envs = mps.right_envs(sites=[2])
    assert list(envs.keys()) == [2]
    expected = backend.convert_to_tensor(
        np.array([[1, 0, 0], [0, 0, 0], [0, 0, 0]]))
    np.testing.assert_array_almost_equal(envs[2].tensor, expected)
예제 #12
0
def test_finite_mps_init(backend, N, pos):
    D, d = 10, 2
    tensors = [np.random.randn(1, d, D)
               ] + [np.random.randn(D, d, D)
                    for _ in range(N - 2)] + [np.random.randn(D, d, 1)]
    with pytest.raises(ValueError):
        FiniteMPS(tensors, center_position=pos, backend=backend)
예제 #13
0
def test_random_mps(backend_dtype_values):
    mps = FiniteMPS.random(d=[3, 4, 5],
                           D=[2, 3],
                           dtype=backend_dtype_values[1],
                           backend=backend_dtype_values[0])
    assert len(mps) == 3
    assert mps.physical_dimensions == [3, 4, 5]
    assert mps.bond_dimensions == [1, 2, 3, 1]
예제 #14
0
def test_left_envs_all_sites_non_0_center_position(backend_dtype_values):
    backend = backend_factory.get_backend(backend_dtype_values[0])
    dtype = backend_dtype_values[1]

    D, d, N = 3, 2, 5
    tensors = [np.ones((1, d, D), dtype=dtype)
               ] + [np.ones((D, d, D), dtype=dtype)
                    for _ in range(N - 2)] + [np.ones((D, d, 1), dtype=dtype)]
    mps = FiniteMPS(tensors,
                    center_position=2,
                    backend=backend_dtype_values[0])
    envs = mps.left_envs(sites=[0, 1, 2, 3, 4, 5])
    assert list(envs.keys()) == [0, 1, 2, 3, 4, 5]
    expected = backend.convert_to_tensor(
        np.array([[1, 0, 0], [0, 0, 0], [0, 0, 0]]))
    np.testing.assert_array_almost_equal(envs[0], 1.)
    np.testing.assert_array_almost_equal(envs[3], expected)
예제 #15
0
def test_right_envs_two_non_consecutive_sites_2(backend_dtype_values):
    backend = backend_factory.get_backend(backend_dtype_values[0])
    dtype = backend_dtype_values[1]

    D, d, N = 3, 2, 5
    tensors = [np.ones((1, d, D), dtype=dtype)
               ] + [np.ones((D, d, D), dtype=dtype)
                    for _ in range(N - 2)] + [np.ones((D, d, 1), dtype=dtype)]
    mps = FiniteMPS(tensors,
                    center_position=1,
                    backend=backend_dtype_values[0])
    envs = mps.right_envs(sites=[1, 3])
    assert set(envs.keys()) == {1, 3}
    exp1 = backend.convert_to_tensor(
        np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]))
    exp3 = backend.convert_to_tensor(np.array([[1, 0], [0, 1]]))

    np.testing.assert_array_almost_equal(envs[1], exp1)
    np.testing.assert_array_almost_equal(envs[3], exp3)
예제 #16
0
def test_left_envs_all_sites(backend_dtype_values):
    backend = backend_factory.get_backend(backend_dtype_values[0])
    dtype = backend_dtype_values[1]

    D, d, N = 3, 2, 5
    tensors = [np.ones((1, d, D), dtype=dtype)
               ] + [np.ones((D, d, D), dtype=dtype)
                    for _ in range(N - 2)] + [np.ones((D, d, 1), dtype=dtype)]
    mps = FiniteMPS(tensors,
                    center_position=N // 2,
                    backend=backend_dtype_values[0],
                    canonicalize=True)
    l = backend.convert_to_tensor(np.ones((1, 1), dtype=dtype))
    exp = {}
    for n, t in enumerate(mps.tensors):
        exp[n] = l
        l = ncon([t, l, t], [[1, 2, -1], [1, 3], [3, 2, -2]], backend=backend)
    envs = mps.left_envs(sites=range(N))
    assert list(envs.keys()) == list(range(N))
    for n in range(N):
        expected = exp[n]
        actual = envs[n]
        np.testing.assert_array_almost_equal(expected, actual)
예제 #17
0
def test_identity_mpo():
    N = 10
    psi = FiniteMPS.random([2 for i in range(10)], [4 for i in range(9)],
                           dtype=np.float64)
    Id = identity_mpo(N)
    lh = LocalHam(Id, psi, "numpy")
    # test shifting right
    for b in range(len(psi) - 1):
        lh.position(b)
        assert np.isclose(lh.energy(), 1, atol=1e-10)

    # test shifting back left
    for b in range(len(psi) - 2, -1, -1):
        lh.position(b)
        assert np.isclose(lh.energy(), 1, atol=1e-10)
예제 #18
0
def test_right_envs_invalid_sites_raises_error(backend_dtype_values):
    backend = backend_dtype_values[0]
    dtype = backend_dtype_values[1]

    D, d, N = 1, 2, 10
    tensors = [np.ones((1, d, D), dtype=dtype)
               ] + [np.ones((D, d, D), dtype=dtype)
                    for _ in range(N - 2)] + [np.ones((D, d, 1), dtype=dtype)]
    mps = FiniteMPS(tensors, center_position=0, backend=backend)
    with pytest.raises(ValueError):
        mps.right_envs(sites=[-1, N])
    with pytest.raises(ValueError):
        mps.right_envs(sites=[-2, N - 1])
예제 #19
0
def test_canonical_finite_mps(backend_dtype_values):
    backend = backend_dtype_values[0]
    dtype = backend_dtype_values[1]
    D, d, N = 10, 2, 10
    tensors = [get_random_np((1, d, D), dtype)
               ] + [get_random_np((D, d, D), dtype)
                    for _ in range(N - 2)] + [get_random_np((D, d, 1), dtype)]
    mps = FiniteMPS(tensors,
                    center_position=N // 2,
                    backend=backend,
                    canonicalize=False)
    assert mps.check_canonical() > 1E-12
    mps.canonicalize()
    assert mps.check_canonical() < 1E-12
예제 #20
0
def test_finiteFreeFermions2d(N1, N2, D):
    def adjacency(N1, N2):
        neighbors = {}
        mat = np.arange(N1 * N2).reshape(N1, N2)
        for n in range(N1 * N2):
            x, y = np.divmod(n, N2)
            if n not in neighbors:
                neighbors[n] = []
            if y < N2 - 1:
                neighbors[n].append(mat[x, y + 1])
            if x > 0:
                neighbors[n].append(mat[x - 1, y])
        return neighbors

    adj = adjacency(N1, N2)
    tij = np.zeros((N1 * N2, N1 * N2))
    t = -1
    v = -1
    for n, d in adj.items():
        for ind in d:
            tij[n, ind] += t
            tij[ind, n] += t
    tij += np.diag(np.ones(N1 * N2) * v)

    eta, _ = np.linalg.eigh(tij)
    expected = min(np.cumsum(eta))

    t1 = t
    t2 = t
    dtype = np.float64
    mpo = FiniteFreeFermion2D(t1, t2, v, N1, N2, dtype)
    mps = FiniteMPS.random([2] * N1 * N2, [D] * (N1 * N2 - 1),
                           dtype=np.float64)
    dmrg = FiniteDMRG(mps, mpo)
    actual = dmrg.run_one_site()
    np.testing.assert_allclose(actual, expected)
예제 #21
0
def test_local_measurement_finite_mps(backend_dtype_values):
    backend = backend_dtype_values[0]
    dtype = backend_dtype_values[1]

    D, d, N = 1, 2, 10
    tensors_1 = [np.ones((1, d, D), dtype=dtype)] + [
        np.ones((D, d, D), dtype=dtype) for _ in range(N - 2)
    ] + [np.ones((D, d, 1), dtype=dtype)]
    mps_1 = FiniteMPS(tensors_1, center_position=0, backend=backend)

    tensors_2 = [np.zeros((1, d, D), dtype=dtype)] + [
        np.zeros((D, d, D), dtype=dtype) for _ in range(N - 2)
    ] + [np.zeros((D, d, 1), dtype=dtype)]
    for t in tensors_2:
        t[0, 0, 0] = 1
    mps_2 = FiniteMPS(tensors_2, center_position=0, backend=backend)

    sz = np.diag([0.5, -0.5]).astype(dtype)
    result_1 = np.array(mps_1.measure_local_operator([sz] * N, range(N)))
    result_2 = np.array(mps_2.measure_local_operator([sz] * N, range(N)))
    np.testing.assert_almost_equal(result_1, np.zeros(N))
    np.testing.assert_allclose(result_2, np.ones(N) * 0.5)
예제 #22
0
def test_correlation_measurement_finite_mps(backend_dtype_values):
    backend = backend_dtype_values[0]
    dtype = backend_dtype_values[1]

    D, d, N = 1, 2, 10
    tensors_1 = [np.ones((1, d, D), dtype=dtype)] + [
        np.ones((D, d, D), dtype=dtype) for _ in range(N - 2)
    ] + [np.ones((D, d, 1), dtype=dtype)]
    mps_1 = FiniteMPS(tensors_1, center_position=0, backend=backend)
    mps_1.position(N - 1)
    mps_1.position(0)
    tensors_2 = [np.zeros((1, d, D), dtype=dtype)] + [
        np.zeros((D, d, D), dtype=dtype) for _ in range(N - 2)
    ] + [np.zeros((D, d, 1), dtype=dtype)]
    for t in tensors_2:
        t[0, 0, 0] = 1
    mps_2 = FiniteMPS(tensors_2, center_position=0, backend=backend)
    mps_2.position(N - 1)
    mps_2.position(0)

    sz = np.diag([0.5, -0.5]).astype(dtype)
    result_1 = np.array(
        mps_1.measure_two_body_correlator(sz, sz, N // 2, range(N)))
    result_2 = np.array(
        mps_2.measure_two_body_correlator(sz, sz, N // 2, range(N)))
    actual = np.zeros(N)
    actual[N // 2] = 0.25
    np.testing.assert_almost_equal(result_1, actual)
    np.testing.assert_allclose(result_2, np.ones(N) * 0.25)