Exemple #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')
Exemple #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
Exemple #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)
Exemple #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
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
    # test one-site DMRG
    mps = FiniteMPS.random([2] * N, [D] * (N - 1),
                           dtype=dtype,
                           backend=backend)
    dmrg = FiniteDMRG(mps, mpo)
    one_site_energy = dmrg.run_one_site(num_sweeps=4, num_krylov_vecs=10)
    np.testing.assert_allclose(one_site_energy, eta[0])
    one_site_energy_no_sweeps = dmrg.run_one_site(num_sweeps=0,
                                                  num_krylov_vecs=10)
    np.testing.assert_allclose(one_site_energy_no_sweeps, one_site_energy)
    # test two-site DMRG
    mps = FiniteMPS.random([2] * N, [D] * (N - 1),
                           dtype=dtype,
                           backend=backend)
    dmrg = FiniteDMRG(mps, mpo)
    two_site_energy = dmrg.run_two_site(max_bond_dim=D,
                                        num_sweeps=4,
                                        num_krylov_vecs=10)
    np.testing.assert_allclose(two_site_energy, eta[0])
    two_site_energy_no_sweeps = dmrg.run_two_site(max_bond_dim=D,
                                                  num_sweeps=0,
                                                  num_krylov_vecs=10)
    np.testing.assert_allclose(two_site_energy_no_sweeps, two_site_energy)
Exemple #6
0
def test_finite_DMRG_init(backend_dtype_values, N):
    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])
Exemple #7
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())))
Exemple #8
0
def test_finite_DMRG_init(N, config, D):

    backend = 'jax'
    dtype = 'float64'

    a = buildMPO()
    mpo = FiniteMPO(a, backend=backend)

    mps = FiniteMPS.random([4] * N, config, dtype=dtype, backend=backend)

    ans1 = 500
    ans2 = 100
    sumtime = 0
    while abs(2 * (ans1 - ans2) / (ans1 + ans2)) > 0.1 / 100:

        print("Bond dim = {D}, Configuration = {c}".format(D=D, c=config))
        bondarray.append(D)
        start_time = time.time()
        dmrg = FiniteDMRG(mps, mpo)
        [mps, energy] = run_one_site(dmrg,
                                     num_sweeps=1000,
                                     num_krylov_vecs=15,
                                     precision=prec,
                                     delta=prec,
                                     tol=prec,
                                     verbose=0,
                                     ndiag=1)
        timearray.append(
            jnp.around(float(time.time() - start_time) / 60, decimals=2))
        print("{x} minutes".format(x=timearray[-1]))
        sumtime += timearray[-1]
        energy += 2
        minarray.append(energy)
        print("Minimum: {x}".format(x=minarray[-1]))
        ans1 = ans2
        ans2 = energy
        precisionarray.append(
            jnp.around(2 * (ans1 - ans2) / (ans1 + ans2) * 100, decimals=2))
        print("Precision (%): {x}".format(x=precisionarray[-1]))
        print("Number of iterations: {x}\n".format(x=numofitarray[-1]))

        D *= 2
        for i in range(N - 1):
            config[i] *= 2

        A = mps.tensors
        B = jnp.zeros((1, 4, config[0]), dtype='float64')
        B = jax.ops.index_update(B, jax.ops.index[:, :, :A[0].shape[2]], A[0])
        A[0] = B
        for i in range(1, N - 1):
            B = jnp.zeros((config[i - 1], 4, config[i]), dtype='float64')
            B = jax.ops.index_update(
                B, jax.ops.index[:A[i].shape[0], :, :A[i].shape[2]], A[i])
            A[i] = B
        B = jnp.zeros((config[N - 2], 4, 1), dtype='float64')
        B = jax.ops.index_update(B, jax.ops.index[:A[N - 1].shape[0], :, :],
                                 A[N - 1])
        A[N - 1] = B
        mps.tensors = A

    print("")