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))
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)
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))
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))
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)