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')
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
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)
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)
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])
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())))
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("")