def test_U11_Z22_flat(self): for n in range(-10, 10): for sz in range(-n, n): sym1 = U11(n, sz) sym2 = U11.from_flat(sym1.to_flat()) assert sym1 == sym2 sym1 = Z22(n, sz) sym2 = Z22.from_flat(sym1.to_flat()) assert sym1 == sym2
def test_U11_compute_flat(self): nblks = 30 ndim = 5 sign_array = np.random.randint(0, 2, ndim) sign_map = {0: "+", 1: "-"} pattern = "".join([sign_map[ix] for ix in sign_array]) na = np.random.randint(0, 10, nblks * ndim).reshape(nblks, ndim) sa = np.random.randint(-5, 5, nblks * ndim).reshape(nblks, ndim) U11lsts = [[U11(na[nb, nd], sa[nb, nd]) for nd in range(ndim)] for nb in range(nblks)] U11arrs = [[U11lsts[nb][nd].to_flat() for nd in range(ndim)] for nb in range(nblks)] U11arrs = np.asarray(U11arrs, dtype=int) out = U11._compute(pattern, U11arrs) outneg = U11._compute(pattern, U11arrs, offset=("-", U11(1, -1)), neg=True) for i in range(nblks): outa = U11._compute(pattern, U11lsts[i]) outb = U11.from_flat(out[i]) assert outa == outb assert -(outa - U11(1, -1)) == U11.from_flat(outneg[i])
def test_U11_compute(self): ndim = 10 sign_array = np.random.randint(0, 2, ndim) sign_map = {0: "+", 1: "-"} pattern = "".join([sign_map[ix] for ix in sign_array]) na = np.random.randint(0, 10, ndim) sa = np.random.randint(-5, 5, ndim) U11arrs = [U11(n, s) for n, s in zip(na, sa)] out = U11._compute(pattern, U11arrs) outn = 0 outs = 0 for p, n, s in zip(sign_array, na, sa): if p == 0: outn += n outs += s else: outn -= n outs -= s assert out.n == outn assert out.sz == outs
def test_U11_Z22_numerics(self): for na in range(-5, 5): for sa in range(-na, na): syma = U11(na, sa) z22a = Z22(na, sa) for nb in range(-5, 5): for sb in range(-nb, nb): symb = U11(nb, sb) z22b = Z22(nb, sb) out_add = syma + symb z22_add = z22a + z22b assert out_add.n == (na + nb) assert out_add.sz == (sa + sb) assert z22_add.n == (na + nb) % 2 assert z22_add.sz == (sa + sb) % 2 out_sub = syma - symb z22_sub = z22a - z22b assert out_sub.n == (na - nb) assert out_sub.sz == (sa - sb) assert z22_sub.n == (na - nb) % 2 assert z22_sub.sz == (sa - sb) % 2
def setUp(self): bond = BondInfo({U11(0):2, U11(1,1):3, U11(1,-1):4, U11(2):5}) self.bond = bond self.T = rand((bond,)*4, pattern="++--", dq=U11(0)) self.symmetry = U11 self.skeleton_test_dq = U11(2) self.contract_test_dq = (U11(1,1),U11(1,-1)) self.svd_dq_iterator = [U11(0), U11(1,1), U11(1,-1),U11(2)] self.shift = U11(1,1) self.T1 = rand((bond,)*4, pattern="++--", dq=U11(2))
def setUp(self): self.t = 2 self.U = 4 self.tau = 0.01 self.mu = 0.2 self.symmetry = U11 states = np.ones([1, 1]) * .5 ** .5 blocks = [SubTensor(reduced=states, q_labels=(U11(0), U11(1, 1))), # 0+ SubTensor(reduced=states, q_labels=(U11(1, 1), U11(0)))] # +0, eigenstate of hopping self.hop_psi = SparseFermionTensor(blocks=blocks, pattern="++") states = np.ones([1, 1]) * .5 blocks = [SubTensor(reduced=states, q_labels=(U11(2), U11(0))), SubTensor(reduced=states, q_labels=(U11(0), U11(2))), SubTensor(reduced=-states, q_labels=(U11(1, 1), U11(1, -1))), SubTensor(reduced=states, q_labels=(U11(1, -1), U11(1, 1)))] self.hop_exp_psi = SparseFermionTensor(blocks=blocks, pattern="++") psi0 = SparseFermionTensor(blocks=[SubTensor(reduced=np.ones([1]), q_labels=(U11(0,0),))], pattern="+") psi1 = SparseFermionTensor(blocks=[SubTensor(reduced=np.ones([1]), q_labels=(U11(1,1),))], pattern="+") psi2 = SparseFermionTensor(blocks=[SubTensor(reduced=np.ones([1]), q_labels=(U11(1,-1),))], pattern="+") psi3 = SparseFermionTensor(blocks=[SubTensor(reduced=np.ones([1]), q_labels=(U11(2,0),))], pattern="+") self.psi_array = [psi0, psi1, psi2, psi3] self.sz_array = [0,1,-1,0] self.pn_array = [0,1,1,2] bond = BondInfo({U11(0):1, U11(1,1):1, U11(1,-1):1, U11(2,0):1}) self.psi = SparseFermionTensor.random((bond,)*2, pattern="++", dq=U11(2,0)) self.fac = (0.5, 0.3)