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)
Beispiel #3
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)
Beispiel #4
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)
Beispiel #5
0
 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)