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)
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)
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)
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)
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)
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)