Example #1
0
    def test_F2_F1_christoffel(self):
        '''-1j<d_id_j ψ|H|ψ>=<d_id_j ψ|Ad_j|d_jψ> with no truncation'''
        Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 2)
        Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 2)
        from numpy import nonzero, logical_not as lon, max
        for m, L in enumerate(range(2, 8)):
            H = [Sz1@Sz2+(Sz1+Sz2) for _ in range(L-1)]
            mps = self.fixtures[m].right_canonicalise(1).grow(H, 0.1, 2**L)
            mps.right_canonicalise()
            #mps = fMPS().random(L, 2, 2**L).right_canonicalise()
            dA_dt = mps.dA_dt(H)
            l, r = mps.get_envs()

            def inv_diag(mat):
                return diag(1/diag(mat))
            def ch_diag(mat):
                return diag(sqrt(diag(mat)))
            cr, cl = [ch_diag(r(i)) for i in range(mps.L)], [ch_diag(l(i)) for i in range(mps.L)]
            icr, icl = [inv_diag(cr[i]) for i in range(mps.L)], [inv_diag(cl[i]) for i in range(mps.L)]
            inv_envs= (icr, icl, cr, cl)

            for i, j in product(range(L), range(L)):
                F2 = -1j*mps.F2(i, j, H, inv_envs=inv_envs)
                Γ2 = mps.christoffel(i, j, min(i, j), closed=(None, None, l(min(i, j)-1)@dA_dt[min(i, j)]@r(min(i, j))))
                self.assertTrue(allclose(F2, -Γ2))
Example #2
0
    def test_jac_no_projection(self):
        Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 2)
        Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 2)

        mps = self.mps_0_3.left_canonicalise()
        H = [Sz1@Sz2+Sx1, Sz1@Sz2+Sx1+Sx2]
        J1, J2, F = mps.jac(H, True, False)
        J2 = J2+F
        self.assertTrue(allclose(J1+J1.conj().T, 0))
        from numpy import nonzero
        for L in range(2, 7):
            mps = fMPS().random(L, 2, 2**L).left_canonicalise()
            N = 10
            for _ in range(N):
                H = [randn(4, 4)+1j*randn(4, 4) for _ in range(L-1)]
                H = [h+h.conj().T for h in H]
                J1, J2, F = mps.jac(H, True, False)
                J2 = J2+F
                self.assertTrue(allclose(J1,-J1.conj().T))
                J2[abs(J2)<1e-10]=0
                if not allclose(J2, 0):
                    print(J2[nonzero(J2)])
                self.assertTrue(allclose(J2, 0))

                #J = mps.jac(H)
                #self.assertTrue(allclose(J+J.T, 0))

                mps = (mps+mps.dA_dt(H)*0.1).left_canonicalise()
Example #3
0
    def test_local_hamiltonians_2(self):
        Sx12, Sy12, Sz12 = N_body_spins(0.5, 1, 2)
        Sx22, Sy22, Sz22 = N_body_spins(0.5, 2, 2)

        mps = self.mps_0_2
        listH = [Sz12@Sz22+Sx12+Sx22]
        fullH = listH[0]
        self.assertTrue(mps.dA_dt(listH, fullH=False)==mps.dA_dt(fullH, fullH=True))
Example #4
0
 def test_lyapunov_no_truncate_3(self):
     """zero lyapunov exponents with no truncation"""
     Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 2)
     Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 2)
     mps = self.mps_0_3
     H = [Sz1 @ Sz2 + Sx1 + Sx2, Sz1 @ Sz2 + Sx2]
     T = linspace(0, 0.1, 100)
     exps, lys, _ = Trajectory(mps, H).lyapunov(T, D=None)
     self.assertTrue(allclose(exps[-1], 0))
Example #5
0
 def test_lyapunov_local_hamiltonian_3(self):
     """zero lyapunov exponents with local hamiltonian"""
     Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 2)
     Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 2)
     mps = self.mps_0_3
     H = [Sx1 + Sx2, Sx2]
     T = linspace(0, 1, 100)
     exps, lys, _ = Trajectory(mps, H).lyapunov(T, D=1)
     self.assertTrue(allclose(exps[-1], 0))
Example #6
0
    def test_import_extract_tangent_vector(self):
        Sx12, Sy12, Sz12 = N_body_spins(0.5, 1, 2)
        Sx22, Sy22, Sz22 = N_body_spins(0.5, 2, 2)

        mps = self.mps_0_4
        H = [Sz12@Sz22+Sx12, Sz12@Sz22+Sx12+Sx22, Sz12@Sz22+Sx22]
        dA = mps.dA_dt(H)
        dA_ = mps.import_tangent_vector(mps.extract_tangent_vector(dA))
        self.assertTrue(dA==dA_)
Example #7
0
 def test_grow(self):
     Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 2)
     Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 2)
     mps = self.mps_0_4.left_canonicalise(1)
     H = [Sx1@Sx2+Sy1@Sy2+Sz1@Sz2]*3
     for D in [1, 2, 3, 4]:
         A = mps.copy().grow(H, 0.1, D)
         self.assertTrue(A.D == D)
     A = mps.copy().grow(H, 0.1, 5)
     self.assertTrue(A.D == 4)
Example #8
0
 def test_time_evolution(self):
     """test_time_evolution"""
     Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 2)
     Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 2)
     H = [Sz1@Sz2+Sx1+Sx2]
     T = linspace(0, 0.1, 2)
     A = self.tfd_0_2
     evs = []
     for _ in range(400):
         evs.append(A.Es([Sx, Sy, Sz], 1))
         A = (A+A.dA_dt(H)*0.1).left_canonicalise()
Example #9
0
    def test_ddA_dt(self):
        Sx12, Sy12, Sz12 = N_body_spins(0.5, 1, 2)
        Sx22, Sy22, Sz22 = N_body_spins(0.5, 2, 2)

        mps = self.mps_0_2
        eyeH = [eye(4)]
        dt = 0.1
        Z = [randn(3)+1j*randn(3) for _ in range(10)]

        for z in Z:
            self.assertTrue(allclose(mps.ddA_dt(z, eyeH), -1j*z))
Example #10
0
    def test_local_hamiltonians_3(self):
        Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 3)
        Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 3)
        Sx3, Sy3, Sz3 = N_body_spins(0.5, 3, 3)

        Sx12, Sy12, Sz12 = N_body_spins(0.5, 1, 2)
        Sx22, Sy22, Sz22 = N_body_spins(0.5, 2, 2)

        mps = self.mps_0_3
        listH = [Sz12@Sz22+Sx12, Sz12@Sz22+Sx12+Sx22]
        fullH = sum([n_body(a, i, len(listH), d=2) for i, a in enumerate(listH)], axis=0)
        self.assertTrue(mps.dA_dt(listH, fullH=False)==mps.dA_dt(fullH, fullH=True))
Example #11
0
    def test_F2_F1(self):
        '''<d_id_j ψ|H|ψ>, <d_iψ|H|d_jψ>'''
        Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 6)
        Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 6)
        Sx3, Sy3, Sz3 = N_body_spins(0.5, 3, 6)
        Sx4, Sy4, Sz4 = N_body_spins(0.5, 4, 6)
        Sx5, Sy5, Sz5 = N_body_spins(0.5, 5, 6)
        Sx6, Sy6, Sz6 = N_body_spins(0.5, 6, 6)

        Sx12, Sy12, Sz12 = N_body_spins(0.5, 1, 2)
        Sx22, Sy22, Sz22 = N_body_spins(0.5, 2, 2)
        mps = self.mps_0_6.left_canonicalise()
        listH = [Sz12@Sz22+Sx12, Sz12@Sz22+Sx12+Sx22, Sz12@Sz22+Sx22+Sx12+Sx22, Sz12@Sz22+Sz12+Sx22, Sz12@Sz22+Sx22]
        eyeH = [(1/(mps.L-1))*eye(4) for _ in range(5)]
        fullH = Sz1@Sz2+Sz2@Sz3+Sz3@Sz4+Sz4@Sz5+Sz5@Sz6+Sx1+Sx2+Sx3+Sx4+Sx5+Sx6

        for i, j in product(range(mps.L), range(mps.L)):
            ## F2 = <d_id_j ψ|H|ψ>
            # zero for H = I
            self.assertTrue(allclose(mps.F2(i, j, eyeH, testing=True), 0))

            # Test gauge projectors are in the right place
            mps.right_canonicalise()
            l, r = mps.get_envs()
            z1 = ncon([mps.F2(i, j, listH, testing=True), l(i-1)@c(mps[i])], [[1, 2, 3, -1, -2, -3], [1, 2, 3]])
            z2 = ncon([mps.F2(i, j, listH, testing=True), l(j-1)@c(mps[j])], [[-1, -2, -3, 1, 2, 3], [1, 2, 3]])
            self.assertTrue(allclose(z1, 0))
            self.assertTrue(allclose(z2, 0))

            mps.left_canonicalise()
            l, r = mps.get_envs()
            z1 = ncon([mps.F2(i, j, listH, testing=True), l(i-1)@c(mps[i])], [[1, 2, 3, -1, -2, -3], [1, 2, 3]])
            z2 = ncon([mps.F2(i, j, listH, testing=True), l(j-1)@c(mps[j])], [[-1, -2, -3, 1, 2, 3], [1, 2, 3]])
            self.assertTrue(allclose(z1, 0))
            self.assertTrue(allclose(z2, 0))

            ## F1 = <d_iψ|H|d_jψ>
            # For H = I: should be equal to δ_{ij} pr(i)
            if i!=j:
                self.assertTrue(allclose(mps.F1(i, j, eyeH, testing=True), 0))
            if i==j:
                b = mps.F1(i, j, eyeH, testing=True)
                a = ncon([mps.left_null_projector(i), inv(r(i))], [[-1, -2, -4, -5], [-3, -6]])
                self.assertTrue(allclose(a, b))

            # Test gauge projectors are in the right place
            mps.left_canonicalise()
            l, r = mps.get_envs()
            z1 = td(mps.F1(i, j, listH, testing=True), l(i-1)@c(mps[i]), [[0, 1, 2], [0, 1, 2]])
            z1 = td(mps.F1(i, j, listH, testing=True), l(j-1)@mps[j], [[3, 4, 5], [0, 1, 2]])
            self.assertTrue(allclose(z1, 0))
            self.assertTrue(allclose(z2, 0))

            mps.right_canonicalise()
            l, r = mps.get_envs()
            z1 = td(mps.F1(i, j, listH, testing=True), l(i-1)@c(mps[i]), [[0, 1, 2], [0, 1, 2]])
            z1 = td(mps.F1(i, j, listH, testing=True), l(j-1)@mps[j], [[3, 4, 5], [0, 1, 2]])
            self.assertTrue(allclose(z1, 0))
            self.assertTrue(allclose(z2, 0))
Example #12
0
    def test_match_gauge_to(self):
        Sx12, Sy12, Sz12 = N_body_spins(0.5, 1, 2)
        Sx22, Sy22, Sz22 = N_body_spins(0.5, 2, 2)

        mps_1 = self.right_cases[0]
        # doesn't change expectation values
        for case in self.right_cases:
            a = mps_1.E(Sx, 0)
            mps_1.right_canonicalise().match_gauge_to(case)
            b = mps_1.E(Sx, 0)
            self.assertTrue(allclose(a, b))

        mps_1 = self.left_cases[0]
        for case in self.left_cases:
            a = mps_1.E(Sx, 0)
            mps_1.left_canonicalise().match_gauge_to(case)
            b = mps_1.E(Sx, 0)
            self.assertTrue(allclose(a, b))

        mps_1 = self.left_cases[0]
        for case in self.right_cases:
            a = mps_1.E(Sx, 0)
            mps_1.left_canonicalise().match_gauge_to(case)
            b = mps_1.E(Sx, 0)
            self.assertTrue(allclose(a, b))

        evs = []
        evs_ = []
        mps_0 = fMPS().random(6, 2, 5)
        H = [
            Sz12 @ Sz22 + Sx12 + Sx22, Sz12 @ Sz22 + Sx22,
            Sz12 @ Sz22 + Sx22 + Sx22, Sz12 @ Sz22 + Sx22, Sz12 @ Sz22 + Sx22
        ]

        mps = mps_0.copy()
        for _ in range(30):
            evs.append(mps.E_(Sx, 0))
            old_mps = mps.copy()
            mps = (mps + mps.dA_dt(H) * 0.1).left_canonicalise()
            mps = mps.match_gauge_to(old_mps).copy()

        mps = mps_0.copy()
        for _ in range(30):
            evs_.append(mps.E_(Sx, 0))
            mps = (mps + mps.dA_dt(H) * 0.1).left_canonicalise()

        self.assertTrue(allclose(array(evs), array(evs_)))
Example #13
0
    def test_local_hamiltonians_7(self):
        Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 7)
        Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 7)
        Sx3, Sy3, Sz3 = N_body_spins(0.5, 3, 7)
        Sx4, Sy4, Sz4 = N_body_spins(0.5, 4, 7)
        Sx5, Sy5, Sz5 = N_body_spins(0.5, 5, 7)
        Sx6, Sy6, Sz6 = N_body_spins(0.5, 6, 7)
        Sx7, Sy7, Sz7 = N_body_spins(0.5, 7, 7)

        Sx12, Sy12, Sz12 = N_body_spins(0.5, 1, 2)
        Sx22, Sy22, Sz22 = N_body_spins(0.5, 2, 2)

        mps = self.mps_0_7
        listH = [Sz12@Sz22+Sx12, Sz12@Sz22+Sx12+Sx22, Sz12@Sz22+Sx12+Sx22, Sz12@Sz22+Sx12+Sx22, Sz12@Sz22+Sx12+Sx22, Sz12@Sz22+Sx22]
        fullH = sum([n_body(a, i, len(listH), d=2) for i, a in enumerate(listH)], axis=0)
        self.assertTrue(mps.dA_dt(listH, fullH=False)==mps.dA_dt(fullH, fullH=True))
Example #14
0
    def test_random_with_energy(self):
        Sx12, Sy12, Sz12 = N_body_spins(0.5, 1, 2)
        Sx22, Sy22, Sz22 = N_body_spins(0.5, 2, 2)

        L = 6
        d = 2
        D = 1

        h = 4*Sz12@Sz22+2*Sx22+2*Sz22
        h = (h+h.conj().T)/2
        H = [h for _ in range(L-1)]
        H[0] = H[0]+2*Sx12+2*Sz12

        comH = sum([n_body(a, i, len(H), d=2) for i, a in enumerate(H)], axis=0)
        v = eigvalsh(comH)
        E = (max(v)-min(v))/2.5

        tol = 1e-10
        mps = fMPS().random_with_energy_E(E, H, L, d, D, 1e-10)
        self.assertTrue(abs(mps.energy(H)-E)<tol)
Example #15
0
    def test_stop_resume(self):
        """test_stop_resume"""
        Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 2)
        Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 2)

        dt, t_fin = 2e-2, 5
        T = linspace(0, t_fin, int(t_fin // dt) + 1)

        mps_0 = self.mps_0_4.right_canonicalise(3)
        H = [Sz1 @ Sz2 + Sx1 + Sx2] + [Sz1 @ Sz2 + Sx2] + [Sz1 @ Sz2 + Sx2]
        W = mps_0.L * [MPO_TFI(0, 0.25, 0.5, 0)]
        F = Trajectory(mps_0, H=H, W=W)
        F.run_name = 'test'

        F.lyapunov(T, t_burn=0)
        F.stop()
        F_ = Trajectory().resume('test')
        self.assertTrue(F_.mps_0 == F.mps_0)
        self.assertTrue(F_.mps == F.mps)
        self.assertTrue(allclose(F_.Q, F.Q))
        self.assertTrue(allclose(F_.lys, F.lys))
        self.assertTrue(
            all([
                allclose(F.vL[i], F_.mps.old_vL[i]) for i in range(len(F.vL))
            ]))
        F_.lyapunov(T)
        self.assertTrue(len(F_.lys) == 2 * len(T) - 1)

        plt.plot(F.vs + F_.vs)
        plt.show()

        plt.plot(F_.lys)
        plt.show()

        plt.plot(F.mps_history + F_.mps_history)
        plt.show()

        shutil.rmtree(F_.run_dir)
Example #16
0
    def test_OTOCs_eye(self):
        """OTOC zero for W=eye"""
        Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 5)
        Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 5)
        Sx3, Sy3, Sz3 = N_body_spins(0.5, 3, 5)
        Sx4, Sy4, Sz4 = N_body_spins(0.5, 4, 5)
        Sx5, Sy5, Sz5 = N_body_spins(0.5, 5, 5)

        mps = fMPS().random(5, 2, None).left_canonicalise()
        W = mps.L * [MPO_TFI(0, 0.25, 0.5, 0.5)]
        H = Sz1@Sz2+Sz2@Sz3+Sz3@Sz4+Sz4@Sz5+\
                Sx1+Sx2+Sx3+Sx4+Sx5+\
                Sz1+Sz2+Sz3+Sz4+Sz5
        ops = eye(2**5), eye(2**5)
        ops_ = ((eye(2), 0), (eye(2), 0))
        T = linspace(0, 1, 3)
        F = Trajectory(mps, H=H, W=W)
        ed_evs = F.ed_OTOC(T, ops)
        mps_evs = F.mps_OTOC(T, ops_)
        plt.plot(mps_evs)
        plt.show()
        self.assertTrue(allclose(ed_evs, 0))
        self.assertTrue(allclose(mps_evs, 0))
Example #17
0
    def test_dynamical_expand(self):
        Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 2)
        Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 2)

        # need to expand with 2 site heisenberg hamiltonian
        from xmps.mps_examples import comp_z
        H = [Sx1@Sx2+Sy1@Sy2+Sz1@Sz2]

        # up down: must project
        mps = comp_z(2).left_canonicalise()
        self.assertTrue(not allclose(mps.projection_error(H, 0.1), 0))

        # up up: no projection
        mps = comp_z(1).left_canonicalise()
        self.assertTrue(allclose(mps.projection_error(H, 0.1), 0))

        # no need to expand with local hamiltonian
        for D in [1, 2, 3]:
            H = [Sx1+Sx2+Sy1+Sy2+Sz1+Sz2]*3
            mps = self.mps_0_4.left_canonicalise(D)

            self.assertTrue(allclose(mps.projection_error(H, 0.1), 0))
            pre_struc = mps.structure()
            mps.dynamical_expand(H, 0.1, 2*D)
            post_struc = mps.structure()
            self.assertTrue(pre_struc==post_struc)

        # need to expand with 4 site heisenberg hamiltonian
        H = [Sx1@Sx2+Sy1@Sy2+Sz1@Sz2]*3
        D = 1
        mps = self.mps_0_4.left_canonicalise(D)

        pre_struc = mps.structure()
        mps.dynamical_expand(H, 0.1, 2*D)
        post_struc = mps.structure()
        self.assertTrue(pre_struc!=post_struc)
Example #18
0
    def test_OTOCs_ed(self):
        """test mps otocs against ed"""
        Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 5)
        Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 5)
        Sx3, Sy3, Sz3 = N_body_spins(0.5, 3, 5)
        Sx4, Sy4, Sz4 = N_body_spins(0.5, 4, 5)
        Sx5, Sy5, Sz5 = N_body_spins(0.5, 5, 5)

        mps = fMPS().random(5, 2, None).left_canonicalise()
        W = mps.L * [MPO_TFI(0, 0.25, 0.5, 0.5)]
        H = Sz1@Sz2+Sz2@Sz3+Sz3@Sz4+Sz4@Sz5+\
                Sx1+Sx2+Sx3+Sx4+Sx5+\
                Sz1+Sz2+Sz3+Sz4+Sz5
        ops = Sz2, Sz5
        ops_ = ((Sz, 1), (Sz, 4))
        T = linspace(0, 1, 3)
        F = Trajectory(mps, H=H, W=W, fullH=True)
        ed_evs = F.ed_OTOC(T, ops)
        mps_evs = F.mps_OTOC(T, ops_)
        plt.plot(mps_evs)
        plt.plot(ed_evs)
        plt.show()
        self.assertTrue(allclose(ed_evs, 0))
        self.assertTrue(allclose(mps_evs, 0))
Example #19
0
    def test_local_energy(self):
        Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 4)
        Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 4)
        Sx3, Sy3, Sz3 = N_body_spins(0.5, 3, 4)
        Sx4, Sy4, Sz4 = N_body_spins(0.5, 4, 4)

        Sx12, Sy12, Sz12 = N_body_spins(0.5, 1, 2)
        Sx22, Sy22, Sz22 = N_body_spins(0.5, 2, 2)

        mps = self.mps_0_4
        listH = [Sz12@Sz22+Sx12, Sz12@Sz22+Sx12+Sx22, Sz12@Sz22+Sx22]
        fullH = Sz1@Sz2+Sz2@Sz3+Sz3@Sz4+Sx1+Sx2+Sx3+Sx4
        self.assertTrue(isclose(mps.energy(listH, fullH=False), mps.energy(fullH, fullH=True)))
Example #20
0
    def test_local_recombine(self):
        Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 4)
        Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 4)
        Sx3, Sy3, Sz3 = N_body_spins(0.5, 3, 4)
        Sx4, Sy4, Sz4 = N_body_spins(0.5, 4, 4)

        Sx12, Sy12, Sz12 = N_body_spins(0.5, 1, 2)
        Sx22, Sy22, Sz22 = N_body_spins(0.5, 2, 2)

        listH4 = [Sz12@Sz22+Sx12, Sz12@Sz22+Sx12+Sx22, Sz12@Sz22+Sx22]
        comH4 = sum([n_body(a, i, len(listH4), d=2) for i, a in enumerate(listH4)], axis=0)
        fullH4 = Sz1@Sz2+Sz2@Sz3+Sz3@Sz4+Sx1+Sx2+Sx3+Sx4
        self.assertTrue(allclose(fullH4, comH4))
import numpy as np
from xmps.iMPS import iMPS
from xmps.spin import paulis, N_body_spins
import matplotlib as mpl
import matplotlib.pyplot as plt
from tqdm import tqdm

#mpl.style.use('pub_fast')
X, Y, Z = paulis(0.5)
XI, YI, ZI = N_body_spins(0.5, 1, 2)
IX, IY, IZ = N_body_spins(0.5, 2, 2)

T = np.linspace(0, 1, 100)
dt = T[1] - T[0]
D = 10
mps = iMPS().random(2, D).left_canonicalise()
evs = []

H = -(XI @ IX + YI @ IY + ZI @ IZ)

for _ in tqdm(T):
    k1 = mps.dA_dt([H]) * dt
    k2 = (mps + k1 / 2).dA_dt([H]) * dt
    k3 = (mps + k2 / 2).dA_dt([H]) * dt
    k4 = (mps + k3).dA_dt([H]) * dt
    mps = (mps + (k1 + 2 * k2 + 2 * k3 + k4) / 6).left_canonicalise()
    evs.append(mps.Es(paulis(0.5)))
plt.plot(T, evs)
plt.scatter(T, evs, marker='x')
plt.savefig('evo.jpg')
#plt.show()
Example #22
0
from xmps.spin import N_body_spins

from copy import copy

from itertools import product
import matplotlib as mp
import matplotlib.pyplot as plt

from xmps.tensor import H, C, r_eigenmatrix, l_eigenmatrix, get_null_space, p
from xmps.tensor import C as c, H as cT
from xmps.tensor import basis_iterator, T, rotate_to_hermitian, eye_like
from xmps.iMPS import iMPS, ivMPS, TransferMatrix, Map
from xmps.spin import spins

Sx, Sy, Sz = spins(0.5)
Sx12, Sy12, Sz12 = N_body_spins(0.5, 1, 2)
Sx22, Sy22, Sz22 = N_body_spins(0.5, 2, 2)


class TestMap(unittest.TestCase):
    """TestTransferMatrix"""
    def setUp(self):
        N = 10
        D_min, D_max = 10, 11
        d_min, d_max = 2, 3
        p_min, p_max = 1, 2  # always 1 for now
        self.rand_cases1 = [
            iMPS().random(randint(d_min, d_max),
                          randint(D_min, D_max),
                          period=randint(p_min, p_max)) for _ in range(N)
        ]
Example #23
0
    def test_AAintegrators(self):
        test_D_1_1 = False
        if test_D_1_1:
            Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 2)
            Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 2)

            mpss = {
                2: self.mps_0_2,
                3: self.mps_0_3,
                4: self.mps_0_4,
                5: self.mps_0_5
            }

            L = 3
            mps_0 = mpss[L].left_canonicalise(1)
            from xmps.Hamiltonians import Hamiltonian
            J1, J2, h1, h2 = 0., 0.25, 0.5, 0.
            Ham = Hamiltonian({'XX': J1, 'ZZ': J2, 'X': h1, 'Z': h2})
            #H = Ham.to_matrices(L)
            #H = [J2*4*Sz1@Sz2+J1*4*Sx1@Sx2+h1*2*(Sx1+Sx2)+h2*2*(Sz1+Sz2)] +\
            #    (L-2)*[J1*4*Sx1@Sx2+J2*4*Sz1@Sz2+h1*2*Sx2+h2*2*Sz2+h2*2*Sz2]

            H = [Sz1 @ Sz2 + Sx1 + 0.5 * Sx2
                 ] + (L - 2) * [Sz1 @ Sz2 + 0.5 * Sx1 + Sx2]
            H_ = Ham.to_matrices(L)
            #raise Exception
            W = mps_0.L * [MPO_TFI(J1, J2, h1, h2)]
            W_ = Ham.to_mpo(L)
            F = Trajectory(mps_0, H=H, W=W)
            F_ = Trajectory(mps_0, H=H_, W=W_)

            dt, t_fin = 1e-2, 5
            T = linspace(0, t_fin, int(t_fin // dt) + 1)
            C = F.invfreeint(T).mps_evs([Sx, Sy, Sz], 0)
            E = F_.invfreeint(T).mps_evs([Sx, Sy, Sz], 0)
            F.clear()
            F_.clear()
            D = F.eulerint(T).mps_evs([Sx, Sy, Sz], 0)
            Q = F_.eulerint(T).mps_evs([Sx, Sy, Sz], 0)
            F.clear()

            plot = True
            if plot:
                plt.plot(T, C)
                plt.plot(T, D)
                plt.plot(T, E, linestyle='--')
                plt.plot(T, Q, linestyle='-.')
                plt.savefig('test_trajs.pdf')

        test_D_1_2 = False
        if test_D_1_2:
            Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 2)
            Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 2)

            mpss = {
                2: self.mps_0_2,
                3: self.mps_0_3,
                4: self.mps_0_4,
                5: self.mps_0_5
            }

            L = 4
            mps_0 = mpss[L].left_canonicalise(1)
            from xmps.Hamiltonians import Hamiltonian
            J1, J2, h1, h2 = 0., 0.25, 0.5, 0.5
            Ham = Hamiltonian({'XX': J1, 'ZZ': J2, 'X': h1, 'Z': h2})

            H_ = Ham.to_matrices(L)
            W = mps_0.L * [MPO_TFI(J1, J2, h1, h2)]
            W_ = Ham.to_mpo(L)

            F = Trajectory(mps_0, H=H_, W=W)
            F_ = Trajectory(mps_0, H=H_, W=W_)

            dt, t_fin = 1e-2, 5
            T = linspace(0, t_fin, int(t_fin // dt) + 1)
            C = F.invfreeint(T).mps_evs([Sx, Sy, Sz], 0)

            E = F_.invfreeint(T).mps_evs([Sx, Sy, Sz], 0)
            F_.clear()
            Q = F_.eulerint(T).mps_evs([Sx, Sy, Sz], 0)

            plot = True
            if plot:
                fig, ax = plt.subplots(2, 1, sharex=True)
                ax[0].plot(T, C)
                ax[0].plot(T, E, linestyle='--')
                ax[0].plot(T, Q, linestyle='-.')
                ax[1].plot(T, F.mps_energies())
                ax[1].plot(T, F_.mps_energies())
                plt.savefig('test_trajs.pdf')

        test_D_2_1 = True
        if test_D_2_1:
            Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 2)
            Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 2)

            mpss = {
                2: self.mps_0_2,
                3: self.mps_0_3,
                4: self.mps_0_4,
                5: self.mps_0_5
            }

            L = 3
            mps_0 = mpss[L].left_canonicalise(2)
            from xmps.Hamiltonians import Hamiltonian
            J1, J2, h1, h2 = 0., 0.25, 0.5, 0.5
            Ham = Hamiltonian({'XX': J1, 'ZZ': J2, 'X': h1, 'Z': h2})

            H_ = Ham.to_matrices(L)
            W = mps_0.L * [MPO_TFI(J1, J2, h1, h2)]
            W_ = Ham.to_mpo(L)

            F = Trajectory(mps_0, H=H_, W=W)
            F_ = Trajectory(mps_0, H=H_, W=W_)

            dt, t_fin = 5e-3, 10
            T = linspace(0, t_fin, int(t_fin // dt) + 1)
            C = F.invfreeint(T).mps_evs([Sx, Sy, Sz], 0)

            E = F_.invfreeint(T).mps_evs([Sx, Sy, Sz], 0)
            F_.clear()
            Q = F_.eulerint(T).mps_evs([Sx, Sy, Sz], 0)

            plot = True
            if plot:
                fig, ax = plt.subplots(2, 1, sharex=True)
                ax[0].plot(T, C)
                ax[0].plot(T, E, linestyle='--')
                ax[0].plot(T, Q, linestyle='-.')
                ax[1].plot(T, F.mps_energies(), label='invfree')
                ax[1].plot(T, F_.mps_energies(), label='euler')
                plt.legend()
                plt.savefig('test_trajs.pdf')

        raise Exception

        test_2 = False
        if test_2:
            Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 2)
            Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 2)

            dt, t_fin = 2e-2, 10
            T = linspace(0, t_fin, int(t_fin // dt) + 1)

            mps_0 = self.mps_0_2.left_canonicalise(1)
            H = [Sz1 @ Sz2 + Sx1 + Sx2]
            W = mps_0.L * [MPO_TFI(0, 0.25, 0.5, 0)]
            F = Trajectory(mps_0, H=H, W=W)

            A = F.edint(T).ed_evs([Sx1, Sy1, Sz1])
            F.clear()
            B = F.eulerint(T).mps_evs([Sx, Sy, Sz], 0)
            F.clear()
            C = F.invfreeint(T).mps_evs([Sx, Sy, Sz], 0)
            F.clear()
            #self.assertTrue(norm(B-A)/prod(A.shape)<dt**2)
            #self.assertTrue(norm(C-A)/prod(A.shape)<dt**2)

            plot = True
            if plot:
                fig, ax = plt.subplots(1, 1, sharex=True, sharey=True)
                ax.set_ylim([-1, 1])
                ax.plot(T, A)
                #ax.plot(T, B)
                ax.plot(T, C)
                plt.show()

        test_3 = False
        if test_3:
            Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 2)
            Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 2)

            dt, t_fin = 2e-2, 10
            T = linspace(0, t_fin, int(t_fin // dt) + 1)

            mps_0 = self.mps_0_3.right_canonicalise()
            H = [Sz1 @ Sz2 + Sx1 + Sx2] + [Sz1 @ Sz2 + Sx2]
            W = mps_0.L * [MPO_TFI(0, 0.25, 0.5, 0)]
            F = Trajectory(mps_0, H=H, W=W)

            Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 3)
            Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 3)
            Sx3, Sy3, Sz3 = N_body_spins(0.5, 3, 3)

            A = F.edint(T).ed_evs([Sx3, Sy3, Sz3])
            F.clear()
            B = F.eulerint(T).mps_evs([Sx, Sy, Sz], 2)
            F.clear()
            C = F.invfreeint(T).mps_evs([Sx, Sy, Sz], 2)
            self.assertTrue(norm(B - A) / prod(A.shape) < dt**2)
            self.assertTrue(norm(C - A) / prod(A.shape) < dt**2)

            plot = False
            if plot:
                fig, ax = plt.subplots(1, 1, sharey=True, sharex=True)
                ax.set_ylim([-1, 1])
                ax.plot(T, A)
                ax.plot(T, B)
                ax.plot(T, C)
                plt.show()

        test_4 = False
        if test_4:
            Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 2)
            Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 2)

            dt, t_fin = 1e-2, 4
            T = linspace(0, t_fin, int(t_fin // dt) + 1)

            mps_0 = self.mps_0_4.left_canonicalise(1)
            H = [Sz1 @ Sz2 + Sx1 + Sx2] + 2 * [Sz1 @ Sz2 + Sx2]
            W = mps_0.L * [MPO_TFI(0, 0.25, 0.5, 0)]
            F = Trajectory(mps_0, H=H, W=W)

            Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 4)
            Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 4)
            Sx3, Sy3, Sz3 = N_body_spins(0.5, 3, 4)
            Sx4, Sy4, Sz4 = N_body_spins(0.5, 4, 4)

            X = F.edint(T)
            A = X.ed_evs([Sx3, Sy3, Sz3])
            A_e = X.ed_energies()
            F.clear()

            X = F.eulerint(T)
            B = X.mps_evs([Sx, Sy, Sz], 2)
            X.ed_history = array(
                [mps.recombine().reshape(-1) for mps in X.mps_list()])
            B_e = X.ed_energies()
            F.clear()

            X = F.invfreeint(T)
            C = X.mps_evs([Sx, Sy, Sz], 2)
            X.ed_history = array(
                [mps.recombine().reshape(-1) for mps in X.mps_list()])
            C_e = X.ed_energies()

            #self.assertTrue(norm(B-A)/prod(A.shape)<dt)
            #self.assertTrue(norm(C-A)/prod(A.shape)<dt**2)

            plot = True
            if plot:
                fig, ax = plt.subplots(1, 1, sharey=True, sharex=True)
                ax.set_ylim([-1, 1])
                ax.plot(T, A)
                ax.plot(T, B)
                ax.plot(T, C)
                plt.show()
                #plt.plot(T, A_e, label='ed')
                #plt.plot(T, B_e, label='euler')
                #plt.plot(T, C_e, label='invfree')
                #plt.legend()
                #plt.show()

        test_5 = False
        if test_5:
            Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 2)
            Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 2)

            dt, t_fin = 2e-2, 10
            T = linspace(0, t_fin, int(t_fin // dt) + 1)

            mps_0 = self.mps_0_5.right_canonicalise()
            H = [Sz1 @ Sz2 + Sx1 + Sx2
                 ] + [Sz1 @ Sz2 + Sx2] + [Sz1 @ Sz2 + Sx2] + [Sz1 @ Sz2 + Sx2]
            W = mps_0.L * [MPO_TFI(0, 0.25, 0.5, 0)]
            F = Trajectory(mps_0, H=H, W=W)

            Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 5)
            Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 5)
            Sx3, Sy3, Sz3 = N_body_spins(0.5, 3, 5)
            Sx4, Sy4, Sz4 = N_body_spins(0.5, 4, 5)
            Sx5, Sy5, Sz5 = N_body_spins(0.5, 5, 5)

            X = F.invfreeint(T, 'low')
            C = X.mps_evs([Sx, Sy, Sz], 1)
            C_e = X.mps_energies()
            X.ed_history = array(
                [mps.recombine().reshape(-1) for mps in X.mps_list()])
            C_e_ = X.ed_energies()
            F.clear()

            X = F.edint(T)
            A = X.ed_evs([Sx2, Sy2, Sz2])
            A_e = X.ed_energies()
            F.clear()

            X = F.eulerint(T)
            B = X.mps_evs([Sx, Sy, Sz], 1)
            B_e = X.mps_energies()
            X.ed_history = [
                mps.recombine().reshape(-1) for mps in X.mps_list()
            ]
            B_e_ = X.ed_energies()
            F.clear()

            self.assertTrue(norm(B - A) / prod(A.shape) < dt)
            self.assertTrue(norm(C - A) / prod(A.shape) < dt**2)

            plot = False
            if plot:
                fig, ax = plt.subplots(1, 1, sharey=True, sharex=True)
                ax.set_ylim([-1, 1])
                ax.plot(T, A)
                #ax.plot(T, B)
                ax.plot(T, C)
                plt.show()
                fig, ax = plt.subplots(1, 1, sharey=True, sharex=True)
                ax.plot(T, A_e, label='ed')
                #ax.plot(T, B_e, label='euler')
                #ax.plot(T, B_e_, label='euler_')
                #ax.plot(T, C_e, label='invfree')
                ax.plot(T, C_e_, label='invfree_')
                plt.legend()
                plt.show()
Example #24
0
import unittest

from qmps.ground_state import *
from qmps.tools import unitary_to_tensor, random_circuit, random_full_rank_circuit
from scipy import integrate
import numpy as np
from numpy.random import randn
from xmps.iMPS import iMPS
from xmps.iOptimize import find_ground_state
from xmps.spin import N_body_spins
from scipy.linalg import norm
from tqdm import tqdm
Sx1, Sy1, Sz1 = N_body_spins(1/2, 1, 2)
Sx2, Sy2, Sz2 = N_body_spins(1/2, 2, 2)

import matplotlib.pyplot as plt

class TestGroundState(unittest.TestCase):
    def setUp(self):
        N = 3
        self.xs = [randn(8, 8)+1j*randn(8, 8) for _ in range(N)]
        self.As = [iMPS().random(2, 2).mixed() for _ in range(N)]
        self.verbose=True

    @unittest.skip('x')
    def test_Hamiltonian_to_matrix(self):
        J = -1
        g = 1
        H =  np.array([[J,g/2,g/2,0],
                       [g/2,-J,0,g/2],
                       [g/2,0,-J,g/2],
Example #25
0
from numpy import trace as tr, zeros, printoptions, tensordot, trace, save
from numpy import sign, block, sqrt, max, sort
from numpy.random import randn
from numpy.linalg import inv, svd, eig, eigvalsh
from numpy.linalg import det, qr
import numpy as np

from scipy.linalg import sqrtm, expm, norm, null_space as null, cholesky as ch
from scipy.sparse.linalg import expm_multiply, expm

from matplotlib import pyplot as plt
from functools import reduce
from copy import copy, deepcopy
from tqdm import tqdm
Sx, Sy, Sz = spins(0.5)
Sx1, Sy1, Sz1 = N_body_spins(0.5, 1, 2)
Sx2, Sy2, Sz2 = N_body_spins(0.5, 2, 2)


class TestTrajectory(unittest.TestCase):
    """TestF"""
    def setUp(self):
        """setUp"""
        fix_dir = 'fixtures/'
        self.tens_0_2 = load(fix_dir + 'mat2x2.npy')
        self.tens_0_3 = load(fix_dir + 'mat3x3.npy')
        self.tens_0_4 = load(fix_dir + 'mat4x4.npy')
        self.tens_0_5 = load(fix_dir + 'mat5x5.npy')

        self.mps_0_1 = fMPS().left_from_state(
            self.tens_0_2).right_canonicalise(1)