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()
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_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])
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])
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])
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)