예제 #1
0
 def restore_LCF(self, use_QR=True, update_r=True, diag_r=True):
     """Use a gauge-transformation to restore left canonical form.
     
     See restore_RCF.
     """
     if use_QR:
         tm.restore_LCF_l_seq(self.A, self.l, sanity_checks=self.sanity_checks,
                                  sc_data="restore_LCF_l")
     else:
         G = sp.eye(self.D[0], dtype=self.typ) #This is actually just the number 1
         for n in xrange(1, self.N + 1):
             self.l[n], G, Gi = tm.restore_LCF_l(self.A[n], self.l[n - 1], G,
                                                 zero_tol=self.zero_tol,
                                                 sanity_checks=self.sanity_checks)
     
     if self.sanity_checks:
         lN = tm.eps_l_noop(self.l[self.N - 1], self.A[self.N], self.A[self.N])
         if not sp.allclose(lN, 1, atol=1E-12, rtol=1E-12):
             log.warning("Sanity Fail in restore_LCF!: l_N is bad / norm failure")
     
     if diag_r:
         tm.restore_LCF_r_seq(self.A, self.r, sanity_checks=self.sanity_checks,
                                              sc_data="restore_LCF_r")
 
         if self.sanity_checks:
             if not sp.allclose(self.r[0].A, 1, atol=1E-12, rtol=1E-12):
                 log.warning("Sanity Fail in restore_LCF!: r_0 is bad / norm failure")
                 log.warning("r_0 = %s", self.r[0].squeeze().real)
             
             for n in xrange(1, self.N + 1):
                 l = tm.eps_l_noop(self.l[n - 1], self.A[n], self.A[n])
                 if not sp.allclose(l, self.l[n], atol=1E-11, rtol=1E-11):
                     log.warning("Sanity Fail in restore_LCF!: l_%u is bad (off by %g)", n, la.norm(l - self.l[n]))
     elif update_r:
         self.calc_r()
예제 #2
0
 def restore_LCF(self, use_QR=True, update_r=True, diag_r=True):
     """Use a gauge-transformation to restore left canonical form.
     
     See restore_RCF.
     """
     if use_QR:
         tm.restore_LCF_l_seq(self.A, self.l, sanity_checks=self.sanity_checks,
                                  sc_data="restore_LCF_l")
     else:
         G = sp.eye(self.D[0], dtype=self.typ) #This is actually just the number 1
         for n in xrange(1, self.N + 1):
             self.l[n], G, Gi = tm.restore_LCF_l(self.A[n], self.l[n - 1], G,
                                                 zero_tol=self.zero_tol,
                                                 sanity_checks=self.sanity_checks)
     
     if self.sanity_checks:
         lN = tm.eps_l_noop(self.l[self.N - 1], self.A[self.N], self.A[self.N])
         if not sp.allclose(lN, 1, atol=1E-12, rtol=1E-12):
             log.warning("Sanity Fail in restore_LCF!: l_N is bad / norm failure")
     
     if diag_r:
         tm.restore_LCF_r_seq(self.A, self.r, sanity_checks=self.sanity_checks,
                                              sc_data="restore_LCF_r")
 
         if self.sanity_checks:
             if not sp.allclose(self.r[0].A, 1, atol=1E-12, rtol=1E-12):
                 log.warning("Sanity Fail in restore_LCF!: r_0 is bad / norm failure")
                 log.warning("r_0 = %s", self.r[0].squeeze().real)
             
             for n in xrange(1, self.N + 1):
                 l = tm.eps_l_noop(self.l[n - 1], self.A[n], self.A[n])
                 if not sp.allclose(l, self.l[n], atol=1E-11, rtol=1E-11):
                     log.warning("Sanity Fail in restore_LCF!: l_%u is bad (off by %g)", n, la.norm(l - self.l[n]))
     elif update_r:
         self.calc_r()
예제 #3
0
    def restore_LCF(self):
        Gm1 = sp.eye(self.D[0], dtype=self.typ) #This is actually just the number 1
        for n in xrange(1, self.N):
            self.l[n], G, Gi = tm.restore_LCF_l(self.A[n], self.l[n - 1], Gm1,
                                                zero_tol=self.zero_tol,
                                                sanity_checks=self.sanity_checks)
            Gm1 = G
        
        #Now do A[N]...
        #Apply the remaining G[N - 1] from the previous step.
        for s in xrange(self.q[self.N]):                
            self.A[self.N][s] = Gm1.dot(self.A[self.N][s])
                    
        #Now finish off
        tm.eps_l_noop_inplace(self.l[self.N - 1], self.A[self.N], self.A[self.N], out=self.l[self.N])
        
        #normalize
        GNi = 1. / sp.sqrt(self.l[self.N].squeeze().real)
        self.A[self.N] *= GNi
        self.l[self.N][:] = 1
        
        if self.sanity_checks:
            lN = tm.eps_l_noop(self.l[self.N - 1], self.A[self.N], self.A[self.N])
            if not sp.allclose(lN, 1, atol=1E-12, rtol=1E-12):
                log.warning("Sanity Fail in restore_LCF!: l_N is bad / norm failure")

        #diag r
        Gi = sp.eye(self.D[self.N], dtype=self.typ)
        for n in xrange(self.N, 1, -1):
            self.r[n - 1], Gm1, Gm1_i = tm.restore_LCF_r(self.A[n], self.r[n],
                                                         Gi, self.sanity_checks)
            Gi = Gm1_i

        #Apply remaining G1i to A[1]
        for s in xrange(self.q[1]):
            self.A[1][s] = self.A[1][s].dot(Gi)

        #Deal with final, scalar r[0]
        tm.eps_r_noop_inplace(self.r[1], self.A[1], self.A[1], out=self.r[0])

        if self.sanity_checks:
            if not sp.allclose(self.r[0], 1, atol=1E-12, rtol=1E-12):
                log.warning("Sanity Fail in restore_LCF!: r_0 is bad / norm failure")
                log.warning("r_0 = %s", self.r[0].squeeze().real)
            
            for n in xrange(1, self.N + 1):
                l = tm.eps_l_noop(self.l[n - 1], self.A[n], self.A[n])
                if not sp.allclose(l, self.l[n], atol=1E-11, rtol=1E-11):
                    log.warning("Sanity Fail in restore_LCF!: l_%u is bad (off by %g)", n, la.norm(l - self.l[n]))
                    log.warning((l - self.l[n]).diagonal().real)
예제 #4
0
    def _restore_CF_ONR(self):
        nc = self.N_centre

        #Want: r[n >= nc] = eye

        #First do uni_r
        uGs, uG_is = self.uni_r.restore_RCF(
            zero_tol=self.zero_tol, diag_l=False,
            ret_g=True)  #FIXME: Don't always to all!
        Gi = uGs[-1]  #Inverse is on the other side in the uniform code.
        self.r[self.N] = self.uni_r.r[-1]

        for n in xrange(self.N, nc, -1):
            self.r[n - 1], Gm1, Gm1_i = tm.restore_RCF_r(
                self.A[n],
                self.r[n],
                Gi,
                zero_tol=self.zero_tol,
                sanity_checks=self.sanity_checks)

            Gi = Gm1_i

        self.r[self.N + 1] = self.r[self.N]

        #G is now G_nc
        for s in xrange(self.q[nc]):
            self.A[nc][s] = self.A[nc][s].dot(Gi)

        #Now want: l[n < nc] = eye
        uGs, uG_is = self.uni_l.restore_LCF(zero_tol=self.zero_tol,
                                            diag_r=False,
                                            ret_g=True)
        Gm1 = uG_is[-1]
        self.l[0] = self.uni_l.l[-1]
        lm1 = self.l[0]
        for n in xrange(1, nc):
            self.l[n], G, Gi = tm.restore_LCF_l(
                self.A[n],
                lm1,
                Gm1,
                zero_tol=self.zero_tol,
                sanity_checks=self.sanity_checks)

            lm1 = self.l[n]
            Gm1 = G

        #Gm1 is now G_nc-1
        for s in xrange(self.q[nc]):
            self.A[nc][s] = Gm1.dot(self.A[nc][s])
예제 #5
0
    def _restore_CF_ONR(self):
        nc = self.N_centre

        #Want: r[n >= nc] = eye

        #First do uni_r
        uGs, uG_is = self.uni_r.restore_RCF(zero_tol=self.zero_tol, diag_l=False, ret_g=True) #FIXME: Don't always to all!
        Gi = uGs[-1] #Inverse is on the other side in the uniform code.
        self.r[self.N] = self.uni_r.r[-1]
        
        for n in xrange(self.N, nc, -1):
            self.r[n - 1], Gm1, Gm1_i = tm.restore_RCF_r(self.A[n], self.r[n],
                                             Gi, zero_tol=self.zero_tol,
                                             sanity_checks=self.sanity_checks)

            Gi = Gm1_i

        self.r[self.N + 1] = self.r[self.N]

        #G is now G_nc
        for s in xrange(self.q[nc]):
            self.A[nc][s] = self.A[nc][s].dot(Gi)

        #Now want: l[n < nc] = eye
        uGs, uG_is = self.uni_l.restore_LCF(zero_tol=self.zero_tol, diag_r=False, ret_g=True)
        Gm1 = uG_is[-1]
        self.l[0] = self.uni_l.l[-1]
        lm1 = self.l[0]
        for n in xrange(1, nc):
            self.l[n], G, Gi = tm.restore_LCF_l(self.A[n], lm1, Gm1,
                                                zero_tol=self.zero_tol,
                                                sanity_checks=self.sanity_checks)

            lm1 = self.l[n]
            Gm1 = G

        #Gm1 is now G_nc-1
        for s in xrange(self.q[nc]):
            self.A[nc][s] = Gm1.dot(self.A[nc][s])
예제 #6
0
    def _restore_CF_ONR(self):
        nc = self.N_centre

        #Want: r[n >= nc] = eye
        Gi = None
        for n in xrange(self.N + 1, nc, -1):
            self.r[n - 1], Gm1, Gm1_i = tm.restore_RCF_r(self.A[n], self.r[n],
                                             Gi, zero_tol=self.zero_tol,
                                             sanity_checks=self.sanity_checks)

            if n == self.N + 1:
                self.uni_r.l = Gm1_i.conj().T.dot(self.uni_r.l.dot(Gm1_i))

            Gi = Gm1_i

        self.r[self.N + 1] = self.r[self.N]

        #G is now G_nc
        for s in xrange(self.q[nc]):
            self.A[nc][s] = self.A[nc][s].dot(Gi)

        #Now want: l[n < nc] = eye
        Gm1 = None
        lm1 = self.l[0]
        for n in xrange(nc):
            self.l[n], G, Gi = tm.restore_LCF_l(self.A[n], lm1, Gm1,
                                                zero_tol=self.zero_tol,
                                                sanity_checks=self.sanity_checks)

            if n == 0:
                self.uni_l.r = G.dot(self.uni_l.r.dot(G.conj().T))

            lm1 = self.l[n]
            Gm1 = G

        #Gm1 is now G_nc-1
        for s in xrange(self.q[nc]):
            self.A[nc][s] = Gm1.dot(self.A[nc][s])
예제 #7
0
    def restore_LCF(self):
        Gm1 = sp.eye(self.D[0],
                     dtype=self.typ)  #This is actually just the number 1
        for n in xrange(1, self.N):
            self.l[n], G, Gi = tm.restore_LCF_l(
                self.A[n],
                self.l[n - 1],
                Gm1,
                zero_tol=self.zero_tol,
                sanity_checks=self.sanity_checks)
            Gm1 = G

        #Now do A[N]...
        #Apply the remaining G[N - 1] from the previous step.
        for s in xrange(self.q[self.N]):
            self.A[self.N][s] = Gm1.dot(self.A[self.N][s])

        #Now finish off
        tm.eps_l_noop_inplace(self.l[self.N - 1],
                              self.A[self.N],
                              self.A[self.N],
                              out=self.l[self.N])

        #normalize
        GNi = 1. / sp.sqrt(self.l[self.N].squeeze().real)
        self.A[self.N] *= GNi
        self.l[self.N][:] = 1

        if self.sanity_checks:
            lN = tm.eps_l_noop(self.l[self.N - 1], self.A[self.N],
                               self.A[self.N])
            if not sp.allclose(lN, 1, atol=1E-12, rtol=1E-12):
                log.warning(
                    "Sanity Fail in restore_LCF!: l_N is bad / norm failure")

        #diag r
        Gi = sp.eye(self.D[self.N], dtype=self.typ)
        for n in xrange(self.N, 1, -1):
            self.r[n - 1], Gm1, Gm1_i = tm.restore_LCF_r(
                self.A[n], self.r[n], Gi, self.sanity_checks)
            Gi = Gm1_i

        #Apply remaining G1i to A[1]
        for s in xrange(self.q[1]):
            self.A[1][s] = self.A[1][s].dot(Gi)

        #Deal with final, scalar r[0]
        tm.eps_r_noop_inplace(self.r[1], self.A[1], self.A[1], out=self.r[0])

        if self.sanity_checks:
            if not sp.allclose(self.r[0], 1, atol=1E-12, rtol=1E-12):
                log.warning(
                    "Sanity Fail in restore_LCF!: r_0 is bad / norm failure")
                log.warning("r_0 = %s", self.r[0].squeeze().real)

            for n in xrange(1, self.N + 1):
                l = tm.eps_l_noop(self.l[n - 1], self.A[n], self.A[n])
                if not sp.allclose(l, self.l[n], atol=1E-11, rtol=1E-11):
                    log.warning(
                        "Sanity Fail in restore_LCF!: l_%u is bad (off by %g)",
                        n, la.norm(l - self.l[n]))
                    log.warning((l - self.l[n]).diagonal().real)