Beispiel #1
0
 def test_logneg_subsys_pure_should_swap_subsys(self):
     p = qu.rand_ket(2**(5 + 2))
     dims = (2**5, 2**2)
     sysa = 0
     sysb = 1
     # exact 1
     ln0 = qu.logneg(p, dims, 0)
     # exact 2
     ln1 = qu.logneg_subsys(p, dims, sysa, sysb, approx_thresh=1e30)
     assert_allclose(ln0, ln1)
     # approx
     ln2 = qu.logneg_subsys(p, dims, sysa, sysb, approx_thresh=1, tol=0.005)
     assert ln1 != ln2
     assert_allclose(ln1, ln2, rtol=0.2)
Beispiel #2
0
 def test_logneg_subsys_pure(self):
     p = qu.rand_ket(2**(3 + 4))
     dims = (2**3, 2**4)
     sysa = 0
     sysb = 1
     # exact 1
     ln0 = qu.logneg(p, dims, 0)
     # exact 2
     ln1 = qu.logneg_subsys(p, dims, sysa, sysb, approx_thresh=1e30)
     assert_allclose(ln0, ln1)
     # approx
     ln2 = qu.logneg_subsys(p, dims, sysa, sysb, approx_thresh=1, tol=5e-3)
     assert ln1 != ln2
     assert_allclose(ln1, ln2, rtol=1e-1)
Beispiel #3
0
 def test_logneg_subsys(self):
     p = qu.rand_ket(2**(2 + 3 + 1 + 2))
     dims = (2**2, 2**3, 2**1, 2**2)
     sysa = [0, 3]
     sysb = 1
     # exact 1
     ln0 = qu.logneg(qu.ptr(p, dims, [0, 1, 3]), [4, 8, 4], [0, 2])
     # exact 2
     ln1 = qu.logneg_subsys(p, dims, sysa, sysb, approx_thresh=1e30)
     assert_allclose(ln0, ln1)
     # approx
     ln2 = qu.logneg_subsys(p, dims, sysa, sysb, approx_thresh=1)
     assert ln1 != ln2
     assert_allclose(ln1, ln2, rtol=5e-2)
Beispiel #4
0
    def test_heisenberg(self, n, l, gap):

        ham = MPO_ham_heis(n)
        dmrg = DMRG2(ham)
        dmrg.solve()

        gl = gap // 2
        gr = gap // 2 + gap % 2
        m = n // 2

        sysa = range(m - l - gl, m - gl)
        sysb = range(m + gr, m + l + gr)

        assert max(sysa) + gap + 1 == min(sysb)

        ln = dmrg.state.logneg_subsys(sysa,
                                      sysb,
                                      approx_spectral_opts={'bsz': 16},
                                      verbosity=2)

        # exact
        lne = logneg_subsys(groundstate(ham_heis(n, cyclic=False)), [2] * n,
                            sysa, sysb)

        assert_allclose(lne, ln, rtol=0.1, atol=0.1)
Beispiel #5
0
    def test_realistic_ent(self):
        n = 12
        sysa, sysb = range(3, 6), range(6, 8)

        ham = MPO_ham_heis(n)
        dmrg = DMRG2(ham, bond_dims=[2, 4])
        dmrg.solve()
        rho_ab_pt = PTPTLazyMPS(dmrg.state, sysa, sysb)

        psi0 = dmrg.state.to_dense()
        lne = logneg_subsys(psi0, [2] * n, sysa=sysa, sysb=sysb)
        lnx = log2(
            approx_spectral_function(rho_ab_pt, abs, tol=0.1, verbosity=2))
        assert_allclose(lne, lnx, rtol=0.5, atol=0.1)
Beispiel #6
0
    def test_realistic_ent(self):
        n = 12
        sysa, sysb = range(3, 6), range(6, 8)
        sysab = (*sysa, *sysb)

        ham = MPO_ham_heis(n)
        dmrg = DMRG2(ham, bond_dims=[10])
        dmrg.solve()

        psi0 = dmrg.state.to_dense()
        lne = logneg_subsys(psi0, [2] * n, sysa=sysa, sysb=sysb)

        rho_ab = dmrg.state.ptr(sysab, rescale_sites=True)
        rho_ab_pt = rho_ab.partial_transpose(range(3))
        lnx = log2(
            approx_spectral_function(rho_ab_pt, abs, tol=0.1, verbosity=2))
        assert_allclose(lne, lnx, rtol=0.6, atol=0.1)