def test_mps_swap(): L = 6 # starting from ordered pairs with infinite bc (the latter shouldn't make a difference). pairs = [(0, 1), (2, 3), (4, 5)] perm = rand_permutation(L) pairs_perm = [(perm[i], perm[j]) for i, j in pairs] psi = mps.MPS.from_singlets(spin_half, L, pairs, bc='infinite') psi.permute_sites(perm) psi_perm = mps.MPS.from_singlets(spin_half, L, pairs_perm, bc='finite') print(psi.overlap(psi_perm), psi.norm_test()) assert abs(abs(psi.overlap(psi_perm)) - 1.) < 1.e-10 # now start from random pairs pairs = [(0, 3), (1, 5), (2, 4)] pairs_swap = [(0, 2), (1, 5), (3, 4)] print("singlet pairs: ", pairs) psi = mps.MPS.from_singlets(spin_half, L, pairs, bc='finite') psi_swap = mps.MPS.from_singlets(spin_half, L, pairs_swap, bc='finite') psi.swap_sites(2) assert abs(psi.overlap(psi_swap) - 1.) < 1.e-15 # now test permutation # recover original psi psi = mps.MPS.from_singlets(spin_half, L, pairs, bc='finite') perm = rand_permutation(L) pairs_perm = [(perm[i], perm[j]) for i, j in pairs] psi_perm = mps.MPS.from_singlets(spin_half, L, pairs_perm, bc='finite') psi.permute_sites(perm) print(psi.overlap(psi_perm), psi.norm_test()) assert abs(abs(psi.overlap(psi_perm)) - 1.) < 1.e-10
def setup_npc(mod_q=[1], n_qsectors=3, size=20, leg_a_out=2, leg_b_out=2, leg_contract=2, select_frac=1., dtype=np.float, seed=123): """Returns ``a, b, axes`` for timing of ``npc.tensordot(a, b, axes)`` Constructed such that leg_contract legs are contracted, with a.rank = leg_a_out + leg_contract b.rank = leg_b_out + leg_contract If `select_frac` < 1, select only the given fraction of blocks compared to what is possible by charge requirements. """ chinfo = npc.ChargeInfo(mod_q) np.random.seed(seed) legs_contr = [ gen_random_legcharge_nq(chinfo, size, n_qsectors) for i in range(leg_contract) ] legs_a = legs_contr + \ [gen_random_legcharge_nq(chinfo, size, n_qsectors) for i in range(leg_a_out)] legs_b = [l.conj() for l in legs_contr] + \ [gen_random_legcharge_nq(chinfo, size, n_qsectors) for i in range(leg_b_out)] a = npc.Array.from_func(np.random.random, legs_a, dtype, shape_kw='size') b = npc.Array.from_func(np.random.random, legs_b, dtype, shape_kw='size') a.ipurge_zeros() b.ipurge_zeros() if chinfo.qnumber > 0 and select_frac < 1.: a_bl = a.stored_blocks if a_bl > 0: a_subset = rand_distinct_int(0, a_bl - 1, max(int(a_bl * select_frac), 1)) a._qdata = a._qdata[a_subset, :] a._data = [a._data[i] for i in a_subset] b_bl = a.stored_blocks if b_bl > 0: b_subset = rand_distinct_int(0, b_bl - 1, max(int(b_bl * select_frac), 1)) b._qdata = b._qdata[b_subset, :] b._data = [b._data[i] for i in b_subset] labs = [ "l{i:d}".format(i=i) for i in range(max(leg_a_out, leg_b_out) + leg_contract) ] a.iset_leg_labels(labs[:a.rank]) b.iset_leg_labels(labs[:b.rank]) a.itranspose(rand_permutation(a.rank)) b.itranspose(rand_permutation(b.rank)) axes = [labs[:leg_contract]] * 2 return a, b, axes
def test_mps_swap(): L = 6 pairs = [(0, 3), (1, 5), (2, 4)] pairs_swap = [(0, 2), (1, 5), (3, 4)] print("singlet pairs: ", pairs) psi = mps.MPS.from_singlets(spin_half, L, pairs, bc='finite') psi_swap = mps.MPS.from_singlets(spin_half, L, pairs_swap, bc='finite') psi.swap_sites(2) assert abs(psi.overlap(psi_swap) - 1.) < 1.e-15 # now test permutation # recover original psi psi = mps.MPS.from_singlets(spin_half, L, pairs, bc='finite') perm = rand_permutation(L) pairs_perm = [(perm[i], perm[j]) for i, j in pairs] psi_perm = mps.MPS.from_singlets(spin_half, L, pairs_perm, bc='finite') psi.permute_sites(perm, verbose=2) print(psi.overlap(psi_perm), psi.norm_test()) assert abs(abs(psi.overlap(psi_perm)) - 1.) < 1.e-10