def test_lazy_ptr_ppt_dot_mat_linear_op(self, psi_abc, psi_ab_mat): rho_ab = psi_abc.ptr(DIMS, [0, 1]) rho_ab_pt = partial_transpose(rho_ab, DIMS[:-1]) psi_out_expected = rho_ab_pt @ psi_ab_mat lo = lazy_ptr_ppt_linop(psi_abc, DIMS, 0, 1) psi_out_got = lo @ psi_ab_mat assert_allclose(psi_out_expected, psi_out_got)
def test_partial_transpose(self): a = bell_state(0, qtype='dop') b = partial_transpose(a) assert isinstance(b, np.matrix) assert_allclose( b, [[0, 0, 0, -0.5], [0, 0.5, 0, 0], [0, 0, 0.5, 0], [-0.5, 0, 0, 0]])
def test_approx_spectral_function_ptr_ppt_lin_op(self, fn_approx_rtol, psi_abc, psi_ab, bsz): fn, approx, rtol = fn_approx_rtol rho_ab_ppt = partial_transpose(psi_abc.ptr(DIMS, [0, 1]), DIMS[:-1], 0) actual_x = sum(fn(eigvalsh(rho_ab_ppt))) lo = lazy_ptr_ppt_linop(psi_abc, DIMS, sysa=0, sysb=1) approx_x = approx_spectral_function(lo, fn, K=20, R=20, bsz=bsz) assert_allclose(actual_x, approx_x, rtol=rtol)
def test_partial_transpose(self): a = qu.bell_state(0, qtype='dop') b = qu.partial_transpose(a) assert isinstance(b, qu.qarray) assert_allclose( b, np.array([[0, 0, 0, -0.5], [0, 0.5, 0, 0], [0, 0, 0.5, 0], [-0.5, 0, 0, 0]]))
def test_lazy_ptr_ppt_dot_mat_manybody(self, psi_mb_abc, psi_mb_ab_mat): sysa = [0, 1, 7, 8] sysb = [2, 3, 9] rho_ab = psi_mb_abc.ptr(DIMS_MB, sysa + sysb) rho_ab = partial_transpose(rho_ab, [2] * 7, sysa=(0, 1, 4, 5)) psi_out_expected = rho_ab @ psi_mb_ab_mat psi_out_got = lazy_ptr_ppt_dot( psi_mb_abc, psi_mb_ab_mat, DIMS_MB, sysa=sysa, sysb=sysb) assert_allclose(psi_out_expected, psi_out_got)
def test_lazy_ptr_ppt_dot_linear_op(self, psi_abc, psi_ab): rho_ab = psi_abc.ptr(DIMS, [0, 1]) rho_ab_pt = partial_transpose(rho_ab, DIMS[:-1]) psi_out_expected = rho_ab_pt @ psi_ab lo = lazy_ptr_ppt_linop(psi_abc, DIMS, 0, 1) assert hasattr(lo, "H") assert lo.dtype == complex assert lo.shape == (DIMS[0] * DIMS[1], DIMS[0] * DIMS[1]) psi_out_got = lo @ psi_ab assert_allclose(psi_out_expected, psi_out_got)
def test_lazy_ptr_ppt_dot_mat_manybody_linear_op(self, psi_mb_abc, psi_mb_ab_mat): sysa = [0, 1, 7, 8] sysb = [2, 3, 9] rho_ab = psi_mb_abc.ptr(DIMS_MB, sysa + sysb) rho_ab = partial_transpose(rho_ab, [2] * 7, sysa=(0, 1, 4, 5)) psi_out_expected = rho_ab @ psi_mb_ab_mat lo = lazy_ptr_ppt_linop(psi_mb_abc, DIMS_MB, sysa, sysb) psi_out_got = lo.dot(psi_mb_ab_mat) assert psi_out_got.shape[1] > 1 assert_allclose(psi_out_expected, psi_out_got)
def test_lazy_ptr_ppt_dot_manybody_linear_op(self, psi_mb_abc, psi_mb_ab): sysa = [0, 1, 7, 8] sysb = [2, 3, 9] rho_ab = psi_mb_abc.ptr(DIMS_MB, sysa + sysb) rho_ab = partial_transpose(rho_ab, [2] * 7, sysa=(0, 1, 4, 5)) psi_out_expected = rho_ab @ psi_mb_ab lo = lazy_ptr_ppt_linop(psi_mb_abc, DIMS_MB, sysa, sysb) assert hasattr(lo, "H") assert lo.dtype == complex assert lo.shape == (128, 128) psi_out_got = lo.dot(psi_mb_ab) assert_allclose(psi_out_expected, psi_out_got)
def test_lazy_ptr_ppt_dot(self, psi_abc, psi_ab): rho_ab = psi_abc.ptr(DIMS, [0, 1]) rho_ab_pt = partial_transpose(rho_ab, DIMS[:-1]) psi_out_expected = rho_ab_pt @ psi_ab psi_out_got = lazy_ptr_ppt_dot(psi_abc, psi_ab, DIMS, 0, 1) assert_allclose(psi_out_expected, psi_out_got)