示例#1
0
def test_position_shift_right(backend):
  D, d, N = 4, 2, 6
  tensors = [np.ones((1, d, D))] + [np.ones((D, d, D)) for _ in range(N - 2)
                                   ] + [np.ones((D, d, 1))]
  mps = BaseMPS(tensors, center_position=int(N / 2), backend=backend)
  Z = mps.position(N - 1, normalize=True)
  np.testing.assert_allclose(Z, 2.828427)
示例#2
0
def test_position_no_shift_no_normalization(backend):
  D, d, N = 4, 2, 6
  tensors = [np.ones((1, d, D))] + [np.ones((D, d, D)) for _ in range(N - 2)
                                   ] + [np.ones((D, d, 1))]
  mps = BaseMPS(tensors, center_position=int(N / 2), backend=backend)
  Z = mps.position(int(N / 2), normalize=False)
  np.testing.assert_allclose(Z, 5.656854)
示例#3
0
def test_position_no_normalization(backend):
  D, d, N = 4, 2, 6
  tensors = [np.ones((1, d, D))] + [np.ones((D, d, D)) for _ in range(N - 2)
                                   ] + [np.ones((D, d, 1))]
  mps = BaseMPS(tensors, center_position=0, backend=backend)
  Z = mps.position(len(mps) - 1, normalize=False)
  np.testing.assert_allclose(Z, 8192.0)
def test_check_normality_raises_value_error(backend):
    backend = backend_factory.get_backend(backend)
    tensor = np.ones((2, 3, 2), dtype=np.float64)
    tensors = [tensor]
    mps = BaseMPS(tensors, backend=backend)
    with pytest.raises(ValueError):
        mps.check_orthonormality(which="keft", site=0)
def test_apply_two_site_gate(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 = BaseMPS(tensors, center_position=0, backend=backend)
    gate = get_random_np((2, 2, 2, 2), dtype)
    tensor1 = mps.tensors[5]
    tensor2 = mps.tensors[6]

    mps.apply_two_site_gate(gate, 5, 6)
    tmp = np.tensordot(tensor1, tensor2, ([2], [0]))
    actual = np.transpose(np.tensordot(tmp, gate, ([1, 2], [2, 3])),
                          (0, 2, 3, 1))
    node1 = tn.Node(mps.tensors[5], backend=backend)
    node2 = tn.Node(mps.tensors[6], backend=backend)

    node1[2] ^ node2[0]
    order = [node1[0], node1[1], node2[1], node2[2]]
    res = tn.contract_between(node1, node2)
    res.reorder_edges(order)
    np.testing.assert_allclose(res.tensor, actual)
示例#6
0
def test_different_backends_raises_error():
  D, d = 4, 2
  tensors = [np.ones((1, d, D))]
  mps1 = BaseMPS(tensors, backend='numpy')
  mps2 = BaseMPS(tensors, backend='tensorflow')
  mps1.nodes = mps1.nodes + mps2.nodes
  with pytest.raises(ValueError):
    mps1.backend
示例#7
0
def test_mps_switch_backend(backend):
    D, d, N = 10, 2, 10
    tensors = [get_random_np((1, d, D), np.float64)] + [
        get_random_np((D, d, D), np.float64) for _ in range(N - 2)
    ] + [get_random_np((D, d, 1), np.float64)]
    mps = BaseMPS(tensors, center_position=0, backend="numpy")
    mps.switch_backend(backend)
    assert mps.backend.name == backend
def test_get_tensor(backend):
    backend = backend_factory.get_backend(backend)
    tensor1 = np.ones((2, 3, 2), dtype=np.float64)
    tensor2 = 2 * np.ones((2, 3, 2), dtype=np.float64)
    tensors = [tensor1, tensor2]
    mps = BaseMPS(tensors, backend=backend)
    np.testing.assert_allclose(mps.get_tensor(0), tensor1)
    np.testing.assert_allclose(mps.get_tensor(1), tensor2)
示例#9
0
def test_check_canonical(backend):
  backend = backend_factory.get_backend(backend)
  tensor = np.array([[[1., 2., 1.], [1., -2., 1.]],
                     [[-1., 1., -1.], [-1., 1., -1.]], [[1., 2, 3], [3, 2, 1]]],
                    dtype=np.float64)
  tensors = 6 * [backend.convert_to_tensor(tensor)]
  mps = BaseMPS(tensors, backend=backend, center_position=2)
  np.testing.assert_allclose(mps.check_canonical(), 71.714713)
def test_get_tensor_connector_matrix(backend):
    backend = backend_factory.get_backend(backend)
    tensor1 = np.ones((2, 3, 2), dtype=np.float64)
    tensor2 = 2 * np.ones((2, 3, 2), dtype=np.float64)
    connector = backend.convert_to_tensor(np.ones((2, 2), dtype=np.float64))
    tensors = [tensor1, tensor2]
    mps = BaseMPS(tensors, backend=backend, connector_matrix=connector)
    np.testing.assert_allclose(mps.get_tensor(0), tensor1)
    np.testing.assert_allclose(mps.get_tensor(1), 2 * tensor2)
def test_normalization(backend):
    D, d, N = 10, 2, 10
    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 = BaseMPS(tensors, center_position=0, backend=backend)
    mps.position(len(mps) - 1)
    Z = mps.position(0, normalize=True)
    np.testing.assert_allclose(Z, 1.0)
示例#12
0
def test_apply_one_site_gate_2(backend):
  backend = backend_factory.get_backend(backend)
  tensor = np.array([[[1., 2., 1.], [1., -2., 1.]],
                     [[-1., 1., -1.], [-1., 1., -1.]], [[1., 2, 3], [3, 2, 1]]],
                    dtype=np.float64)
  tensors = 6 * [backend.convert_to_tensor(tensor)]
  mps = BaseMPS(tensors, backend=backend, center_position=2)
  gate = backend.convert_to_tensor(np.array([[0, 1], [1, 0]], dtype=np.float64))
  mps.apply_one_site_gate(gate=gate, site=1)
  expected = np.array([[1., -2., 1.], [1., 2., 1.]])
  np.testing.assert_allclose(mps.tensors[1][0], expected)
def test_not_implemented():
    D, d = 4, 2
    tensors = [np.ones((1, d, D)), np.ones((D, d, D))]
    mps = BaseMPS(tensors, backend='numpy')
    with pytest.raises(NotImplementedError):
        mps.save('tmp')
    with pytest.raises(NotImplementedError):
        mps.right_envs([0])
    with pytest.raises(NotImplementedError):
        mps.left_envs([0])
    with pytest.raises(NotImplementedError):
        mps.canonicalize()
示例#14
0
def test_measure_local_operator_value_error(backend):
  backend = backend_factory.get_backend(backend)
  tensor = np.array([[[1., 2., 1.], [1., -2., 1.]],
                     [[-1., 1., -1.], [-1., 1., -1.]], [[1., 2, 3], [3, 2, 1]]],
                    dtype=np.float64)

  tensors = 6 * [backend.convert_to_tensor(tensor)]
  operator = backend.convert_to_tensor(
      np.array([[1, -1], [-1, 1]], dtype=np.float64))
  mps = BaseMPS(tensors, backend=backend)
  with pytest.raises(ValueError):
    mps.measure_local_operator(ops=2 * [operator], sites=[1, 2, 3])
示例#15
0
def test_measure_two_body_correlator_value_error(backend):
  backend = backend_factory.get_backend(backend)
  tensor = np.array([[[1., 2., 1.], [1., -2., 1.]],
                     [[-1., 1., -1.], [-1., 1., -1.]], [[1., 2, 3], [3, 2, 1]]],
                    dtype=np.float64)

  tensors = 6 * [backend.convert_to_tensor(tensor)]
  operator = backend.convert_to_tensor(
      np.array([[1, -1], [-1, 1]], dtype=np.float64))
  mps = BaseMPS(tensors, backend=backend)
  with pytest.raises(ValueError):
    mps.measure_two_body_correlator(
        op1=operator, op2=operator, site1=-1, sites2=[2])
示例#16
0
def test_apply_one_site_gate(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 = BaseMPS(tensors, center_position=0, backend=backend)
    tensor = mps.nodes[5].tensor
    gate = get_random_np((2, 2), dtype)
    mps.apply_one_site_gate(gate, 5)
    actual = np.transpose(np.tensordot(tensor, gate, ([1], [1])), (0, 2, 1))
    np.testing.assert_allclose(mps.nodes[5].tensor, actual)
def test_backend_initialization_raises(backend):
    be = backend_factory.get_backend(backend)
    D, d, N = 10, 2, 10
    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,
            match="`center_position = 10` is different from `None` and "
            "not between 0 <= center_position < 10"):
        BaseMPS(tensors, center_position=N, backend=be)
    with pytest.raises(
            ValueError,
            match="`center_position = -1` is different from `None` and "
            "not between 0 <= center_position < 10"):
        BaseMPS(tensors, center_position=-1, backend=be)
示例#18
0
def test_apply_transfer_operator_right(backend):
  backend = backend_factory.get_backend(backend)
  tensor = np.array([[[1., 2., 1.], [1., -2., 1.]],
                     [[-1., 1., -1.], [-1., 1., -1.]], [[1., 2, 3], [3, 2, 1]]],
                    dtype=np.float64)

  tensors = 6 * [backend.convert_to_tensor(tensor)]
  mat = backend.convert_to_tensor(
      np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=np.float64))
  mps = BaseMPS(tensors, backend=backend)
  expected = np.array([[80., -20., 128.], [-20., 10., -60.], [144., -60.,
                                                              360.]])
  actual = mps.apply_transfer_operator(site=3, direction=-1, matrix=mat)
  np.testing.assert_allclose(actual, expected)
  actual = mps.apply_transfer_operator(site=3, direction="r", matrix=mat)
  np.testing.assert_allclose(actual, expected)
  actual = mps.apply_transfer_operator(site=3, direction="right", matrix=mat)
  np.testing.assert_allclose(actual, expected)
def test_different_dtypes_raises_error():
    D, d = 4, 2
    tensors = [
        np.ones((1, d, D), dtype=np.float64),
        np.ones((D, d, D), dtype=np.complex64)
    ]
    with pytest.raises(TypeError):
        BaseMPS(tensors, backend='numpy')

    _tensors = [
        np.ones((1, d, D), dtype=np.float64),
        np.ones((D, d, D), dtype=np.float64)
    ]

    mps = BaseMPS(_tensors, backend='numpy')
    mps.tensors = tensors
    with pytest.raises(TypeError):
        mps.dtype
示例#20
0
def test_apply_transfer_operator_left(backend):
  backend = backend_factory.get_backend(backend)
  tensor = np.array([[[1., 2., 1.], [1., -2., 1.]],
                     [[-1., 1., -1.], [-1., 1., -1.]], [[1., 2, 3], [3, 2, 1]]],
                    dtype=np.float64)

  tensors = 6 * [backend.convert_to_tensor(tensor)]
  mat = backend.convert_to_tensor(
      np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=np.float64))
  mps = BaseMPS(tensors, backend=backend)

  expected = np.array([[74., 58., 38.], [78., 146., 102.], [38., 114., 74.]])
  actual = mps.apply_transfer_operator(site=3, direction=1, matrix=mat)
  np.testing.assert_allclose(actual, expected)
  actual = mps.apply_transfer_operator(site=3, direction="l", matrix=mat)
  np.testing.assert_allclose(actual, expected)
  actual = mps.apply_transfer_operator(site=3, direction="left", matrix=mat)
  np.testing.assert_allclose(actual, expected)
示例#21
0
def test_apply_two_site_gate_2(backend):
  backend = backend_factory.get_backend(backend)
  tensor = np.array([[[1., 2., 1.], [1., -2., 1.]],
                     [[-1., 1., -1.], [-1., 1., -1.]], [[1., 2, 3], [3, 2, 1]]],
                    dtype=np.float64)
  tensors = 6 * [backend.convert_to_tensor(tensor)]
  mps = BaseMPS(tensors, backend=backend, center_position=2)
  gate = backend.convert_to_tensor(
      np.array([[[[0., 1.], [0., 0.]], [[1., 0.], [0., 0.]]],
                [[[0., 0.], [0., 1.]], [[0., 0.], [1., 0.]]]],
               dtype=np.float64))
  actual = mps.apply_two_site_gate(
      gate=gate, site1=1, site2=2, max_singular_values=1)
  np.testing.assert_allclose(actual[0], 9.133530)
  expected = np.array([[5.817886], [9.039142]])
  np.testing.assert_allclose(np.abs(mps.tensors[1][0]), expected, rtol=1e-04)
  expected = np.array([[0.516264, 0.080136, 0.225841],
                       [0.225841, 0.59876, 0.516264]])
  np.testing.assert_allclose(np.abs(mps.tensors[2][0]), expected, rtol=1e-04)
def test_position_raises_error(backend):
    D, d, N = 10, 2, 10
    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 = BaseMPS(tensors, center_position=0, backend=backend)
    with pytest.raises(ValueError,
                       match="site = -1 not between values"
                       " 0 < site < N = 10"):
        mps.position(-1)
    with pytest.raises(ValueError,
                       match="site = 11 not between values"
                       " 0 < site < N = 10"):
        mps.position(11)
    mps = BaseMPS(tensors, center_position=None, backend=backend)
    with pytest.raises(
            ValueError,
            match="BaseMPS.center_position is"
            " `None`, cannot shift `center_position`."
            "Reset `center_position` manually or use `canonicalize`"):
        mps.position(1)
示例#23
0
def test_position_truncation(backend):
  D, d, N = 10, 2, 10
  tensors = [np.ones((1, d, D))] + [np.ones((D, d, D)) for _ in range(N - 2)
                                   ] + [np.ones((D, d, 1))]
  mps = BaseMPS(tensors, center_position=0, backend=backend)
  mps.position(N-1)
  mps.position(0, D=5)
  assert np.all(np.array(mps.bond_dimensions) <= 5)
示例#24
0
def test_position_raises_error(backend):
    D, d, N = 10, 2, 10
    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 = BaseMPS(tensors, center_position=0, backend=backend)
    with pytest.raises(ValueError):
        mps.position(-1)
    with pytest.raises(ValueError):
        mps.position(11)
def test_get_tensor_raises_error(backend):
    backend = backend_factory.get_backend(backend)
    tensor1 = np.ones((2, 3, 2), dtype=np.float64)
    tensor2 = 2 * np.ones((2, 3, 2), dtype=np.float64)
    tensors = [tensor1, tensor2]
    mps = BaseMPS(tensors, backend=backend)
    with pytest.raises(ValueError):
        mps.get_tensor(site=-1)
    with pytest.raises(IndexError):
        mps.get_tensor(site=3)
def test_left_orthonormalization(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 = BaseMPS(tensors, center_position=N - 1, backend=backend)
    mps.position(0)
    mps.position(len(mps) - 1)
    assert all(
        abs(mps.check_orthonormality('left', site)) < 1E-12
        for site in range(len(mps)))
示例#27
0
def test_apply_two_site_max_singular_value_not_center_raises_error(backend):
  backend = backend_factory.get_backend(backend)
  tensor = np.array([[[1., 2., 1.], [1., -2., 1.]],
                     [[-1., 1., -1.], [-1., 1., -1.]], [[1., 2, 3], [3, 2, 1]]],
                    dtype=np.float64)
  tensors = 6 * [backend.convert_to_tensor(tensor)]
  mps = BaseMPS(tensors, backend=backend, center_position=2)
  gate = backend.convert_to_tensor(np.ones((2, 2, 2, 2), dtype=np.float64))
  with pytest.raises(ValueError):
    mps.apply_two_site_gate(gate=gate, site1=3, site2=4, max_singular_values=1)
  with pytest.raises(ValueError):
    mps.apply_two_site_gate(gate=gate, site1=3, site2=4, max_truncation_err=.1)
示例#28
0
def test_apply_one_site_gate_invalid_site_raises_error(backend):
  backend = backend_factory.get_backend(backend)
  tensor = np.array([[[1., 2., 1.], [1., -2., 1.]],
                     [[-1., 1., -1.], [-1., 1., -1.]], [[1., 2, 3], [3, 2, 1]]],
                    dtype=np.float64)
  tensors = 6 * [backend.convert_to_tensor(tensor)]
  mps = BaseMPS(tensors, backend=backend, center_position=2)
  gate = backend.convert_to_tensor(np.ones((2, 2), dtype=np.float64))
  with pytest.raises(ValueError):
    mps.apply_one_site_gate(gate=gate, site=-1)
  with pytest.raises(ValueError):
    mps.apply_one_site_gate(gate=gate, site=6)
示例#29
0
def test_apply_transfer_operator_invalid_direction_raises_error(backend):
  backend = backend_factory.get_backend(backend)
  tensor = np.array([[[1., 2., 1.], [1., -2., 1.]],
                     [[-1., 1., -1.], [-1., 1., -1.]], [[1., 2, 3], [3, 2, 1]]],
                    dtype=np.float64)

  tensors = 6 * [backend.convert_to_tensor(tensor)]
  mat = backend.convert_to_tensor(
      np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=np.float64))
  mps = BaseMPS(tensors, backend=backend)
  with pytest.raises(ValueError):
    mps.apply_transfer_operator(site=3, direction=0, matrix=mat)
  with pytest.raises(ValueError):
    mps.apply_transfer_operator(site=3, direction="keft", matrix=mat)
def test_physical_dimensions(backend):
    D = 3
    tensors = [np.ones((1, 2, D)), np.ones((D, 3, D)), np.ones((D, 4, 1))]
    mps = BaseMPS(tensors, backend=backend)
    assert mps.physical_dimensions == [2, 3, 4]