def test_ground_state_matches(self, dense, MPO_ham, cyclic): n = 10 tol = 3e-2 if cyclic else 1e-4 h = MPO_ham(n, cyclic=cyclic) dmrg = DMRG1(h, bond_dims=[4, 8, 12]) dmrg.opts['local_eig_ham_dense'] = dense dmrg.opts['periodic_segment_size'] = 1.0 dmrg.opts['periodic_nullspace_fudge_factor'] = 1e-6 assert dmrg.solve(tol=tol / 10, verbosity=1) assert dmrg.state.cyclic == cyclic eff_e, mps_gs = dmrg.energy, dmrg.state mps_gs_dense = mps_gs.to_dense() assert_allclose(mps_gs_dense.H @ mps_gs_dense, 1.0, rtol=tol) h_dense = h.to_dense() # check against dense form actual_e, gs = eigh(h_dense, k=1) assert_allclose(actual_e, eff_e, rtol=tol) assert_allclose(abs(expec(mps_gs_dense, gs)), 1.0, rtol=tol) # check against actual MPO_ham if MPO_ham is MPO_ham_XY: ham_dense = ham_heis(n, cyclic=cyclic, j=(1.0, 1.0, 0.0), sparse=True) elif MPO_ham is MPO_ham_heis: ham_dense = ham_heis(n, cyclic=cyclic, sparse=True) actual_e, gs = eigh(ham_dense, k=1) assert_allclose(actual_e, eff_e, rtol=tol) assert_allclose(abs(expec(mps_gs_dense, gs)), 1.0, rtol=tol)
def test_ground_state_matches(self, dense, MPO_ham): h = MPO_ham(6) dmrg = DMRG1(h, bond_dims=8) dmrg.opts['eff_eig_dense'] = dense assert dmrg.solve() eff_e, mps_gs = dmrg.energy, dmrg.state mps_gs_dense = mps_gs.to_dense() assert_allclose(mps_gs_dense.H @ mps_gs_dense, 1.0) h_dense = h.to_dense() # check against dense form actual_e, gs = seigsys(h_dense, k=1) assert_allclose(actual_e, eff_e) assert_allclose(abs(expec(mps_gs_dense, gs)), 1.0) # check against actual MPO_ham if MPO_ham is MPO_ham_XY: ham_dense = ham_heis(6, cyclic=False, j=(1.0, 1.0, 0.0)) elif MPO_ham is MPO_ham_heis: ham_dense = ham_heis(6, cyclic=False) actual_e, gs = seigsys(ham_dense, k=1) assert_allclose(actual_e, eff_e) assert_allclose(abs(expec(mps_gs_dense, gs)), 1.0)
def test_ising_and_MPS_product_state(self): h = MPO_ham_ising(6, bx=2.0, j=0.1) dmrg = DMRG1(h, bond_dims=8) assert dmrg.solve(verbosity=1) eff_e, mps_gs = dmrg.energy, dmrg.state mps_gs_dense = mps_gs.to_dense() assert_allclose(mps_gs_dense.H @ mps_gs_dense, 1.0) # check against dense h_dense = h.to_dense() actual_e, gs = eigh(h_dense, k=1) assert_allclose(actual_e, eff_e) assert_allclose(abs(expec(mps_gs_dense, gs)), 1.0) exp_gs = MPS_product_state([plus()] * 6) assert_allclose(abs(exp_gs.H @ mps_gs), 1.0, rtol=1e-3)
def test_single_explicit_sweep(self): h = MPO_ham_heis(5) dmrg = DMRG1(h, bond_dims=3) assert dmrg._k[0].dtype == float energy_tn = (dmrg._b | dmrg.ham | dmrg._k) e0 = energy_tn ^ ... assert abs(e0.imag) < 1e-13 de1 = dmrg.sweep_right() e1 = energy_tn ^ ... assert_allclose(de1, e1) assert abs(e1.imag) < 1e-13 de2 = dmrg.sweep_right() e2 = energy_tn ^ ... assert_allclose(de2, e2) assert abs(e2.imag) < 1e-13 # state is already left canonized after right sweep de3 = dmrg.sweep_left(canonize=False) e3 = energy_tn ^ ... assert_allclose(de3, e3) assert abs(e2.imag) < 1e-13 de4 = dmrg.sweep_left() e4 = energy_tn ^ ... assert_allclose(de4, e4) assert abs(e2.imag) < 1e-13 # test still normalized assert dmrg._k[0].dtype == float align_TN_1D(dmrg._k, dmrg._b, inplace=True) assert_allclose(abs(dmrg._b @ dmrg._k), 1) assert e1.real < e0.real assert e2.real < e1.real assert e3.real < e2.real assert e4.real < e3.real