Пример #1
0
def test_BaseDMRG_raises():
  numpy_backend = backend_factory.get_backend('numpy')
  pytorch_backend = backend_factory.get_backend('pytorch')
  dtype = np.float64
  N = 10
  D = 10
  Jz = np.ones(N - 1)
  Jxy = np.ones(N - 1)
  Bz = np.zeros(N)
  mpo = FiniteXXZ(Jz, Jxy, Bz, dtype=dtype, backend=numpy_backend)
  mps = FiniteMPS.random(
      [2] * (N - 1), [D] * (N - 2), dtype=dtype, backend=numpy_backend)
  with pytest.raises(ValueError):
    BaseDMRG(mps, mpo, numpy_backend.ones((1, 1, 1), dtype=dtype),
             numpy_backend.ones((1, 1, 1), dtype=dtype), 'name')

  mpo = FiniteXXZ(Jz, Jxy, Bz, dtype=np.float64, backend=numpy_backend)
  mps = FiniteMPS.random(
      [2] * N, [D] * (N - 1), dtype=np.float32, backend=numpy_backend)
  with pytest.raises(
      TypeError,
      match="mps.dtype = {} is different from "
      "mpo.dtype = {}".format(mps.dtype, mpo.dtype)):
    BaseDMRG(mps, mpo, numpy_backend.ones((1, 1, 1), dtype=dtype),
             numpy_backend.ones((1, 1, 1), dtype=dtype), 'name')

  mpo = FiniteXXZ(Jz, Jxy, Bz, dtype=np.float64, backend=numpy_backend)
  mps = FiniteMPS.random(
      [2] * N, [D] * (N - 1), dtype=np.float64, backend=pytorch_backend)
  with pytest.raises(TypeError, match="mps and mpo use different backends."):
    BaseDMRG(mps, mpo, numpy_backend.ones((1, 1, 1), dtype=dtype),
             numpy_backend.ones((1, 1, 1), dtype=dtype), 'name')
Пример #2
0
def test_finite_DMRG_outstream(backend_dtype_values, capsys):
  np.random.seed(16)
  N = 6
  backend = backend_dtype_values[0]
  dtype = backend_dtype_values[1]
  mpo = FiniteXXZ(
      Jz=np.ones(N - 1),
      Jxy=np.ones(N - 1),
      Bz=np.zeros(N),
      dtype=dtype,
      backend=backend)
  D = 32
  mps = FiniteMPS.random([2] * N, [D] * (N - 1), dtype=dtype, backend=backend)
  dmrg = FiniteDMRG(mps, mpo)
  num_sweeps = 2
  dmrg.run_one_site(
      num_sweeps=num_sweeps, num_krylov_vecs=10, verbose=2, precision=1E-100)
  out, _ = capsys.readouterr()
  out = out.split('\n')
  act = [o[:28] + '\n' for o in out]
  act = ''.join(act[0:num_sweeps * (2 * N - 2)])

  exp = ''.join([
      f"SS-DMRG sweep={n}/{num_sweeps}, site={m}/{N}:\n"
      for n in range(1, num_sweeps + 1)
      for m in [0, 1, 2, 3, 4, 5, 4, 3, 2, 1]
  ])
  assert act == exp
Пример #3
0
def test_BaseDMRG_position(backend_dtype_values):
  backend = backend_factory.get_backend(backend_dtype_values[0])
  dtype = backend_dtype_values[1]

  N = 10
  D = 10
  Jz = np.ones(N - 1)
  Jxy = np.ones(N - 1)
  Bz = np.zeros(N)
  mpo = FiniteXXZ(Jz, Jxy, Bz, dtype=dtype, backend=backend)
  mps = FiniteMPS.random([2] * N, [D] * (N - 1), dtype=dtype, backend=backend)
  dmrg = BaseDMRG(mps, mpo, np.ones((1, 1, 1), dtype=dtype),
                  np.ones((1, 1, 1), dtype=dtype), 'name')
  dmrg.position(N - 1)
  np.testing.assert_allclose(np.arange(N), sorted(list(dmrg.left_envs.keys())))
  np.testing.assert_allclose([N - 1], list(dmrg.right_envs.keys()))
  assert dmrg.mps.center_position == N - 1
  dmrg.position(0)
  np.testing.assert_allclose([0], list(dmrg.left_envs.keys()))
  np.testing.assert_allclose(np.arange(N), sorted(list(dmrg.right_envs.keys())))
  assert dmrg.mps.center_position == 0

  with pytest.raises(IndexError, match="site > length of mps"):
    dmrg.position(N)
  with pytest.raises(IndexError, match="site < 0"):
    dmrg.position(-1)
Пример #4
0
def test_BaseDMRG_init(backend_dtype_values):
  backend = backend_factory.get_backend(backend_dtype_values[0])
  dtype = backend_dtype_values[1]

  N = 10
  D = 10
  Jz = np.ones(N - 1)
  Jxy = np.ones(N - 1)
  Bz = np.zeros(N)
  mpo = FiniteXXZ(Jz, Jxy, Bz, dtype=dtype, backend=backend)
  mps = FiniteMPS.random([2] * N, [D] * (N - 1), dtype=dtype, backend=backend)
  dmrg = BaseDMRG(mps, mpo, np.ones((1, 1, 1), dtype=dtype),
                  np.ones((1, 1, 1), dtype=dtype), 'name')
  assert dmrg.name == 'name'
  assert dmrg.backend is backend
Пример #5
0
def test_finite_DMRG_init(backend_dtype_values, N):
  np.random.seed(16)
  backend = backend_dtype_values[0]
  dtype = backend_dtype_values[1]
  H = get_XXZ_Hamiltonian(N, 1, 1, 1)
  eta, _ = np.linalg.eigh(H)

  mpo = FiniteXXZ(
      Jz=np.ones(N - 1),
      Jxy=np.ones(N - 1),
      Bz=np.zeros(N),
      dtype=dtype,
      backend=backend)
  D = 32
  mps = FiniteMPS.random([2] * N, [D] * (N - 1), dtype=dtype, backend=backend)
  dmrg = FiniteDMRG(mps, mpo)
  energy = dmrg.run_one_site(num_sweeps=4, num_krylov_vecs=10)
  np.testing.assert_allclose(energy, eta[0])
Пример #6
0
def test_compute_envs(backend_dtype_values):
  backend = backend_factory.get_backend(backend_dtype_values[0])
  dtype = backend_dtype_values[1]

  N = 10
  D = 10
  Jz = np.ones(N - 1)
  Jxy = np.ones(N - 1)
  Bz = np.zeros(N)
  mpo = FiniteXXZ(Jz, Jxy, Bz, dtype=dtype, backend=backend)
  mps = FiniteMPS.random([2] * N, [D] * (N - 1), dtype=dtype, backend=backend)
  dmrg = BaseDMRG(mps, mpo, np.ones((1, 1, 1), dtype=dtype),
                  np.ones((1, 1, 1), dtype=dtype), 'name')
  dmrg.position(5)
  dmrg.compute_left_envs()
  dmrg.compute_right_envs()
  np.testing.assert_allclose([0, 1, 2, 3, 4, 5],
                             sorted(list(dmrg.left_envs.keys())))
  np.testing.assert_allclose([5, 6, 7, 8, 9],
                             sorted(list(dmrg.right_envs.keys())))
Пример #7
0
def test_BaseDMRG_raises_2():
  backend = 'numpy'
  backend_obj = backend_factory.get_backend(backend)
  dtype = np.float64

  N = 10
  D = 10
  Jz = np.ones(N - 1)
  Jxy = np.ones(N - 1)
  Bz = np.zeros(N)
  mpo = FiniteXXZ(Jz, Jxy, Bz, dtype=dtype, backend=backend)
  tensors = [np.random.randn(1, 2, D)] + [
      np.random.randn(D, 2, D) for _ in range(N - 2)
  ] + [np.random.randn(D, 2, 1)]
  mps = FiniteMPS(
      tensors, center_position=None, canonicalize=False, backend=backend)
  with pytest.raises(
      ValueError,
      match="Found mps in non-canonical form. Please canonicalize mps."):
    BaseDMRG(mps, mpo, backend_obj.ones((1, 1, 1), dtype=dtype),
             backend_obj.ones((1, 1, 1), dtype=dtype), 'name')