def test_matches_exact(self, dense, MPO_ham): h = MPO_ham(6) dmrg = DMRG2(h, bond_dims=8) assert dmrg._k.site[0].dtype == float dmrg.opts['eff_eig_dense'] = dense assert dmrg.solve() # XXX: need to dispatch SLEPc seigsys on real input # assert dmrg._k.site[0].dtype == float 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_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_seigsys_slepc_eigvecs(self): h = rand_herm(100, sparse=True, density=0.2) lks, vks = seigsys_slepc(h, k=5) lka, vka = seigsys(h, k=5) assert vks.shape == vka.shape for ls, vs, la, va in zip(lks, vks.T, lka, vka.T): assert_allclose(ls, la) assert_allclose(expec(vs, va), 1.0)
def test_cross_equality(self, mat_herm_sparse, k, which): _, a = mat_herm_sparse sigma = 1 if which in {None, "TR"} else None lks, vks = zip(*(seigsys(a, k=k, which=which, sigma=sigma, backend=b) for b in backends)) lks, vks = tuple(lks), tuple(vks) for i in range(len(lks) - 1): assert_allclose(lks[i], lks[i + 1]) assert_allclose(abs(vks[i].H @ vks[i + 1]), eye(k), atol=1e-14)
def test_seigsys_sparse_wvecs(self, mat_herm_sparse, backend): u, a = mat_herm_sparse assert issparse(a) lk, vk = seigsys(a, k=2, backend=backend) assert_allclose(lk, (-3, -1)) for i, j in zip([3, 0], [0, 1]): o = u[:, i].H @ vk[:, j] assert_allclose(abs(o), 1.) vk = seigvecs(a, k=2, backend=backend) for i, j in zip([3, 0], [0, 1]): o = u[:, i].H @ vk[:, j] assert_allclose(abs(o), 1.)
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() 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 = seigsys(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)