Example #1
0
    def test_z4_z2_u1_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)
        z4arrs = [Z4(n) for n in na]
        z4out = Z4._compute(pattern, z4arrs)
        z2arrs = [Z2(n) for n in na]
        z2out = Z2._compute(pattern, z2arrs)
        u1arrs = [U1(n) for n in na]
        u1out = U1._compute(pattern, u1arrs)

        z4outn = 0
        z2outn = 0
        u1outn = 0

        for p, n in zip(sign_array, na):
            if p == 0:
                z4outn += n
                z2outn += n
                u1outn += n
            else:
                z4outn -= n
                z2outn -= n
                u1outn -= n
        assert z4out.n == z4outn % 4
        assert z2out.n == z2outn % 2
        assert u1out.n == u1outn
Example #2
0
 def setUp(self):
     bond = BondInfo({Z2(0):5, Z2(1):7})
     self.bond = bond
     self.T = rand((bond,)*4, pattern="++--", dq=Z2(1))
     self.symmetry = Z2
     self.skeleton_test_dq = Z2(1)
     self.contract_test_dq = (Z2(0),Z2(1))
     self.svd_dq_iterator = [Z2(0), Z2(1)]
     self.shift = Z2(0)
     self.T1 = rand((bond,)*4, pattern="++--", dq=Z2(0))
Example #3
0
 def test_z4_z2_u1_flat(self):
     for z in range(-10, 10):
         z4a = Z4(z)
         z4b = Z4.from_flat(z4a.to_flat())
         assert z4a == z4b
         z2a = Z2(z)
         z2b = Z2.from_flat(z2a.to_flat())
         assert z2a == z2b
         u1a = U1(z)
         u1b = U1.from_flat(u1a.to_flat())
         assert u1a == u1b
Example #4
0
 def test_z4_z2_u1_numerics(self):
     for za in range(-10, 10):
         z4a = Z4(za)
         z2a = Z2(za)
         u1a = U1(za)
         for zb in range(-5, 5):
             z4b = Z4(zb)
             z2b = Z2(zb)
             u1b = U1(zb)
             z4_add = z4a + z4b
             z2_add = z2a + z2b
             u1_add = u1a + u1b
             assert z4_add.n == (za + zb) % 4
             assert z2_add.n == (za + zb) % 2
             assert u1_add.n == (za + zb)
             z4_sub = z4a - z4b
             z2_sub = z2a - z2b
             u1_sub = u1a - u1b
             assert z4_sub.n == (za - zb) % 4
             assert z2_sub.n == (za - zb) % 2
             assert u1_sub.n == (za - zb)
Example #5
0
    def test_z4_z2_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)

        z4lsts = [[Z4(na[nb, nd]) for nd in range(ndim)]
                  for nb in range(nblks)]
        z4arrs = [[z4lsts[nb][nd].to_flat() for nd in range(ndim)]
                  for nb in range(nblks)]
        z4arrs = np.asarray(z4arrs, dtype=int)
        z4out = Z4._compute(pattern, z4arrs)
        z4neg = Z4._compute(pattern, z4arrs, offset=("+", Z4(3)), neg=True)

        z2lsts = [[Z2(na[nb, nd]) for nd in range(ndim)]
                  for nb in range(nblks)]
        z2arrs = [[z2lsts[nb][nd].to_flat() for nd in range(ndim)]
                  for nb in range(nblks)]
        z2arrs = np.asarray(z2arrs, dtype=int)
        z2out = Z2._compute(pattern, z2arrs)
        z2neg = Z2._compute(pattern, z2arrs, offset=("-", Z2(1)), neg=True)

        u1lsts = [[U1(na[nb, nd]) for nd in range(ndim)]
                  for nb in range(nblks)]
        u1arrs = [[u1lsts[nb][nd].to_flat() for nd in range(ndim)]
                  for nb in range(nblks)]
        u1arrs = np.asarray(u1arrs, dtype=int)
        u1out = U1._compute(pattern, u1arrs)
        u1neg = U1._compute(pattern, u1arrs, offset=("-", U1(1)), neg=True)

        for i in range(nblks):
            z4outa = Z4._compute(pattern, z4lsts[i])
            z4outb = Z4.from_flat(z4out[i])
            assert z4outa == z4outb
            assert -(z4outa + Z4(3)) == Z4.from_flat(z4neg[i])

            z2outa = Z2._compute(pattern, z2lsts[i])
            z2outb = Z2.from_flat(z2out[i])
            assert z2outa == z2outb
            assert -(z2outa - Z2(1)) == Z2.from_flat(z2neg[i])

            u1outa = U1._compute(pattern, u1lsts[i])
            u1outb = U1.from_flat(u1out[i])
            assert u1outa == u1outb
            assert -(u1outa - U1(1)) == U1.from_flat(u1neg[i])
Example #6
0
    def setUp(self):
        self.t = 2
        self.U = 4
        self.tau = 0.1
        self.mu = 0.2
        self.symmetry = Z2
        states = np.zeros([2, 2])
        states[0, 0] = .5 ** .5
        blocks = [SubTensor(reduced=states, q_labels=(Z2(0), Z2(1))),  # 0+
                  SubTensor(reduced=states, q_labels=(Z2(1), Z2(0)))]  # +0, eigenstate of hopping
        self.hop_psi = SparseFermionTensor(blocks=blocks, pattern="++")

        blocks = []
        states = np.zeros([2, 2])
        states[1, 0] = .5
        blocks = [SubTensor(reduced=states, q_labels=(Z2(0), Z2(0))),
                  SubTensor(reduced=states.T, q_labels=(Z2(0), Z2(0))),
                  SubTensor(reduced=-states.T, q_labels=(Z2(1), Z2(1))),
                  SubTensor(reduced=states, q_labels=(Z2(1), Z2(1)))]

        self.hop_exp_psi = SparseFermionTensor(blocks=blocks, pattern="++")

        psi0 = SparseFermionTensor(blocks=[SubTensor(reduced=np.asarray([1,0]), q_labels=(Z2(0),))], pattern="+")
        psi1 = SparseFermionTensor(blocks=[SubTensor(reduced=np.asarray([1,0]), q_labels=(Z2(1),))], pattern="+")
        psi2 = SparseFermionTensor(blocks=[SubTensor(reduced=np.asarray([0,1]), q_labels=(Z2(1),))], pattern="+")
        psi3 = SparseFermionTensor(blocks=[SubTensor(reduced=np.asarray([0,1]), q_labels=(Z2(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({Z2(0):2, Z2(1):2})
        self.psi = SparseFermionTensor.random((bond,)*2, pattern="++", dq=Z2(0))
        self.fac = (0.5, 0.3)