Esempio n. 1
0
    def _restore_CF_diag(self, dbg=False):
        nc = self.N_centre

        #Want: r[0 <= n < nc] diagonal
        Ui = sp.eye(self.D[nc], dtype=self.typ)
        for n in xrange(nc, 0, -1):
            self.r[n - 1], Um1, Um1_i = tm.restore_LCF_r(self.A[n], self.r[n],
                                                         Ui, sanity_checks=self.sanity_checks)
            Ui = Um1_i

        #Now U is U_0
        U = Um1
        for s in xrange(self.q[0]):
            self.uni_l.A[0][s] = U.dot(self.uni_l.A[0][s])
            self.uni_l.A[-1][s] = self.uni_l.A[-1][s].dot(Ui)
        self.uni_l.r[-1] = U.dot(self.uni_l.r[-1].dot(U.conj().T))

        #And now: l[nc <= n <= N] diagonal
        if dbg:
            Um1 = sp.eye(self.D[nc - 1], dtype=self.typ)
        else:
            Um1 = mm.eyemat(self.D[nc - 1], dtype=self.typ) #FIXME: This only works if l[nc - 1] is a special matrix type        
        for n in xrange(nc, self.N + 1):
            self.l[n], U, Ui = tm.restore_RCF_l(self.A[n], self.l[n - 1], Um1,
                                                sanity_checks=self.sanity_checks)
            Um1 = U

        #Now, Um1 = U_N
        Um1_i = Ui
        for s in xrange(self.q[0]):
            self.uni_r.A[0][s] = Um1.dot(self.uni_r.A[0][s])
            self.uni_r.A[-1][s] = self.uni_r.A[-1][s].dot(Um1_i)
        self.uni_r.l[-1] = Um1_i.conj().T.dot(self.uni_r.l[-1].dot(Um1_i))
Esempio n. 2
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)
Esempio n. 3
0
    def _restore_CF_diag(self, dbg=False):
        nc = self.N_centre

        #Want: r[0 <= n < nc] diagonal
        Ui = sp.eye(self.D[nc], dtype=self.typ)
        for n in xrange(nc, 0, -1):
            self.r[n - 1], Um1, Um1_i = tm.restore_LCF_r(
                self.A[n], self.r[n], Ui, sanity_checks=self.sanity_checks)
            Ui = Um1_i

        #Now U is U_0
        U = Um1
        for s in xrange(self.q[0]):
            self.uni_l.A[0][s] = U.dot(self.uni_l.A[0][s])
            self.uni_l.A[-1][s] = self.uni_l.A[-1][s].dot(Ui)
        self.uni_l.r[-1] = U.dot(self.uni_l.r[-1].dot(U.conj().T))

        #And now: l[nc <= n <= N] diagonal
        if dbg:
            Um1 = sp.eye(self.D[nc - 1], dtype=self.typ)
        else:
            Um1 = mm.eyemat(
                self.D[nc - 1], dtype=self.typ
            )  #FIXME: This only works if l[nc - 1] is a special matrix type
        for n in xrange(nc, self.N + 1):
            self.l[n], U, Ui = tm.restore_RCF_l(
                self.A[n],
                self.l[n - 1],
                Um1,
                sanity_checks=self.sanity_checks)
            Um1 = U

        #Now, Um1 = U_N
        Um1_i = Ui
        for s in xrange(self.q[0]):
            self.uni_r.A[0][s] = Um1.dot(self.uni_r.A[0][s])
            self.uni_r.A[-1][s] = self.uni_r.A[-1][s].dot(Um1_i)
        self.uni_r.l[-1] = Um1_i.conj().T.dot(self.uni_r.l[-1].dot(Um1_i))
Esempio n. 4
0
    def _restore_CF_diag(self):
        nc = self.N_centre

        self.S_hc = sp.zeros((self.N + 1), dtype=sp.complex128)

        #Want: r[0 <= n < nc] diagonal
        Ui = sp.eye(self.D[nc], dtype=self.typ)
        for n in xrange(nc, 0, -1):
            self.r[n - 1], Um1, Um1_i = tm.restore_LCF_r(self.A[n], self.r[n],
                                                         Ui, sanity_checks=self.sanity_checks)

            self.S_hc[n - 1] = -sp.sum(self.r[n - 1].diag * sp.log2(self.r[n - 1].diag))

            Ui = Um1_i

        #Now U is U_0
        U = Um1
        for s in xrange(self.q[0]):
            self.A[0][s] = U.dot(self.A[0][s]).dot(Ui)
        self.uni_l.r = U.dot(self.uni_l.r.dot(U.conj().T))

        #And now: l[nc <= n <= N] diagonal
        Um1 = mm.eyemat(self.D[nc - 1], dtype=self.typ)
        for n in xrange(nc, self.N + 1):
            self.l[n], U, Ui = tm.restore_RCF_l(self.A[n], self.l[n - 1], Um1,
                                                sanity_checks=self.sanity_checks)

            self.S_hc[n] = -sp.sum(self.l[n].diag * sp.log2(self.l[n].diag))

            Um1 = U

        #Now, Um1 = U_N
        Um1_i = Ui
        for s in xrange(self.q[0]):
            self.A[self.N + 1][s] = Um1.dot(self.A[self.N + 1][s]).dot(Um1_i)
        self.uni_r.l = Um1_i.conj().T.dot(self.uni_r.l.dot(Um1_i))
Esempio n. 5
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)