def cepa(self): b = self.cepa_b() b = at.collapse_tensor(b, self) b = at.concatenate_amps(b, self) Aop = scipy.sparse.linalg.LinearOperator((len(b), len(b)), matvec = self.cepa_A, rmatvec = self.cepa_A) if self.run_svd == True: #print(scipy.sparse.linalg.eigsh(Aop, k = 3)[0]) print('Getting SVD of H_N:') print(scipy.sparse.linalg.svds(Aop, k = 3, which = 'SM')[1]) print(scipy.sparse.linalg.svds(Aop, k = 3, which = 'LM')[1]) #A = self.build_hessian() #x, y = np.linalg.eig(A) #s, v, d = np.linalg.svd(A) #print(sorted(x)) #print(sorted(v)) x, info = scipy.sparse.linalg.cg(Aop, -b, tol = self.tol) if self.reference == 'rhf': Ax = at.rhf_to_uhf(self.cepa_A(x), self) b = at.rhf_to_uhf(b, self) x = at.rhf_to_uhf(x, self) energy = self.hf_energy + 2*x.T.dot(b) + x.T.dot(Ax) else: energy = self.hf_energy + 2*x.T.dot(b) + x.T.dot(self.cepa_A(x)) return energy
def lagrangian(self, x): self.lam = .5*x.T.dot(x) self.lam = 0 b = self.cepa_b() b = at.collapse_tensor(b, self) b = at.concatenate_amps(b, self) if self.reference == 'rhf': Ax = at.rhf_to_uhf(self.cepa_A(x), self) b = at.rhf_to_uhf(b, self) x = at.rhf_to_uhf(x, self) return abs(np.linalg.norm(Ax+b)) else: return abs(np.linalg.norm(self.cepa_A(x)+b))
def c3epa_energy(self, x): b = self.cepa_b() b = at.collapse_tensor(b, self) b = at.concatenate_amps(b, self) if self.reference == 'rhf': Ax = at.rhf_to_uhf(self.c3epa_A(x), self) b = at.rhf_to_uhf(b, self) x = at.rhf_to_uhf(x, self) energy = self.hf_energy + 2*x.T.dot(b) + x.T.dot(Ax) else: energy = self.hf_energy + 2*x.T.dot(b) + x.T.dot(self.c3epa_A(x)) return energy
def c3epa(self, **kwargs): b = self.cepa_b() b = at.collapse_tensor(b, self) b = at.concatenate_amps(b, self) Aop = scipy.sparse.linalg.LinearOperator((len(b), len(b)), matvec = self.c3epa_A, rmatvec = self.c3epa_A) x, info = np.array(scipy.sparse.linalg.cg(Aop, -b, tol = self.tol )) if self.reference == 'rhf': Ax = at.rhf_to_uhf(self.c3epa_A(x), self) b = at.rhf_to_uhf(b, self) x = at.rhf_to_uhf(x, self) energy = self.hf_energy + 2*x.T.dot(b) + x.T.dot(Ax) else: energy = self.hf_energy + 2*x.T.dot(b) + x.T.dot(self.c3epa_A(x)) return energy
def shifted_A(self, x): x0 = copy.copy(x) if self.reference == 'rhf': selfx2 = at.rhf_to_uhf(self.x, self) if self.reference == 'rhf': x = at.rhf_to_uhf(x, self) N = self.noa + self.nob if self.shift == 'acpf': shift = 2*self.Ec/N shift = x*shift elif self.shift == 'aqcc': shift = (1-(N-3)*(N-2)/(N*(N-1)))*self.Ec shift = x*shift elif self.shift == 'ucc3': shift = [] if self.reference == 'rhf': b2 = at.rhf_to_uhf(self.b, self) for i in range(0, len(x)): shift.append(b2[i]*selfx2[i]*x[i]) Ax0 = self.c3epa_A(x0) return Ax0 - at.uhf_to_rhf(np.array(shift), self) else: for i in range(0, len(x)): shift.append(self.b[i]*self.x[i]*x0[i]) Ax0 = self.c3epa_A(x0) return Ax0 - shift if self.s2_term == True: self.lam = 1 Ax0 = self.c3epa_A(x0) if self.reference == 'rhf': #print(np.linalg.norm(at.uhf_to_rhf(at.rhf_to_uhf(Ax0, self), self) - Ax0)) return Ax0 - at.uhf_to_rhf(shift, self) else: return Ax0-shift elif self.s2_term == False: Ax0 = self.cepa_A(x0) if self.reference == 'rhf': return Ax0 - at.uhf_to_rhf(shift, self) else: return Ax0-shift
def ucc3_energy(self, x): b = copy.copy(self.b) t3 = 0 if self.reference == 'rhf': Ax = at.rhf_to_uhf(self.c3epa_A(x), self) b = at.rhf_to_uhf(b, self) x = at.rhf_to_uhf(x, self) for i in range(0, len(x)): t3 -= 2/3*b[i]*((x[i])**3) energy = self.hf_energy + 2*x.T.dot(b) + x.T.dot(Ax) + t3 else: for i in range(0, len(b)): t3 -= 2/3*b[i]*((x[i])**3) energy = self.hf_energy + 2*x.T.dot(b) + x.T.dot(self.c3epa_A(x)) + t3 return energy
def ic3epa_A(self, x): term1 = self.cepa_A(x) term3 = self.x.T.dot(self.A2(self.x))*x if self.reference == 'rhf': x = at.rhf_to_uhf(x, self) x = at.decatenate_amps(x, self, reference = 'uhf') x = at.expand_vector(x, self, reference = 'uhf') #Initialize Hessian Shapes Ax = {} Ax['a'] = np.zeros((self.noa, self.nva)) Ax['b'] = np.zeros((self.nob, self.nvb)) Ax['aa'] = np.zeros((self.noa, self.noa, self.nva, self.nva)) Ax['ab'] = np.zeros((self.noa, self.nob, self.nva, self.nvb)) Ax['bb'] = np.zeros((self.nob, self.nob, self.nvb, self.nvb)) if self.reference != 'rhf': Ax['a'] += contract('ijab,jb->ia', self.l_aaaa[:self.noa, :self.noa, self.noa:, self.noa:], x['a']) Ax['a'] += contract('ijab,jb->ia', self.j_abab[:self.noa, :self.nob, self.noa:, self.nob:], x['b']) Ax['b'] += contract('ijab,jb->ia', self.l_bbbb[:self.nob, :self.nob, self.nob:, self.nob:], x['b']) Ax['b'] += contract('jiba,jb->ia', self.j_abab[:self.noa, :self.nob, self.noa:, self.nob:], x['a']) else: Ax['a'] += .5*contract('ijab,jb->ia', self.l_aaaa[:self.noa, :self.noa, self.noa:, self.noa:], x['a']) Ax['a'] += .5*contract('ijab,jb->ia', self.j_abab[:self.noa, :self.nob, self.noa:, self.nob:], x['b']) Ax['a'] += .5*contract('ijab,jb->ia', self.l_bbbb[:self.nob, :self.nob, self.nob:, self.nob:], x['b']) Ax['a'] += .5*contract('jiba,jb->ia', self.j_abab[:self.noa, :self.nob, self.noa:, self.nob:], x['a']) Ax = at.collapse_tensor(Ax, self) Ax = at.concatenate_amps(Ax, self) return term1+term3+self.x.dot(self.x)*Ax
def ucc3_gradient(self, x): b = copy.copy(self.b) t3 = [] if self.reference == 'rhf': Ax = at.rhf_to_uhf(self.c3epa_A(x), self) b = at.rhf_to_uhf(b, self) x = at.rhf_to_uhf(x, self) for i in range(0, len(b)): t3.append(-4*b[i]*((x[i])**2)) t3 = np.array(t3) gradient = b + Ax + t3 gradient = at.uhf_to_rhf(gradient, self) else: for i in range(0, len(b)): t3.append(-4*b[i]*((x[i])**2)) t3 = np.array(t3) gradient = b + self.c3epa_A(x) + t3 return gradient
def shifted_cepa(self): b = self.cepa_b() b = at.collapse_tensor(b, self) b = at.concatenate_amps(b, self) norm = 1 old = b*0 self.Ec = 0 x = 0*b self.x = copy.copy(x) while abs(norm)>1e-18: Aop = scipy.sparse.linalg.LinearOperator((len(b), len(b)), matvec = self.shifted_A, rmatvec = self.shifted_A) x, info = scipy.sparse.linalg.cg(Aop, -b, tol = self.tol, x0 = x) if self.reference == 'rhf': norm = at.rhf_to_uhf(old-x, self).dot(at.rhf_to_uhf(old-x, self)) else: norm = (old-x).dot(old-x) old = copy.copy(x) x0 = copy.copy(x) if self.reference == 'rhf': #print(x2) if self.shift == 'ucc3': Ax2 = self.shifted_A(x) #print(Ax2) #energy = self.hf_energy + 2*x2.T.dot(b2) + x2.T.dot(Ax2)-(4/3)*x2.T.dot(xdiag).dot(xdiag).dot(b2) energy = self.ucc3_energy(x) #print(at.rhf_to_uhf(self.shifted_A(x), self)) else: b2 = at.rhf_to_uhf(b, self) x2 = at.rhf_to_uhf(x, self) Ax2 = at.rhf_to_uhf(self.shifted_A(x), self) energy = self.hf_energy + 2*x2.T.dot(b2) + x2.T.dot(Ax2) else: if self.shift == 'ucc3': #print(self.shifted_A(x)) energy = self.ucc3_energy(x) else: energy = self.hf_energy + 2*x.T.dot(b) + x.T.dot(self.shifted_A(x)) self.x = copy.copy(x) self.Ec = energy-self.hf_energy return energy
def cepa_A(self, x): if self.reference == 'rhf': x = at.rhf_to_uhf(x, self) x = at.decatenate_amps(x, self, reference = 'uhf') x = at.expand_vector(x, self, reference = 'uhf') #Initialize Hessian Shapes Ax = {} Ax['a'] = np.zeros((self.noa, self.nva)) Ax['b'] = np.zeros((self.nob, self.nvb)) Ax['aa'] = np.zeros((self.noa, self.noa, self.nva, self.nva)) Ax['ab'] = np.zeros((self.noa, self.nob, self.nva, self.nvb)) Ax['bb'] = np.zeros((self.nob, self.nob, self.nvb, self.nvb)) #S->S F (Particle Interaction) Ax['a'] += contract('ab,ib->ia', self.fa[self.noa:, self.noa:], x['a']) if self.reference != 'rhf': Ax['b'] += contract('ab,ib->ia', self.fb[self.nob:, self.nob:], x['b']) #S->S F (Hole Interaction) Ax['a'] -= contract('ji,ja->ia', self.fa[:self.noa, :self.noa], x['a']) if self.reference != 'rhf': Ax['b'] -= contract('ji,ja->ia', self.fb[:self.nob, :self.nob], x['b']) #S->S V Ax['a'] += contract('jabi,jb->ia', self.l_aaaa[:self.noa, self.noa:, self.noa:, :self.noa], x['a']) Ax['a'] += contract('ajib,jb->ia', self.j_abab[self.noa:, :self.nob, :self.noa, self.nob:], x['b']) if self.reference != 'rhf': Ax['b'] += contract('jabi,jb->ia', self.j_abab[:self.noa, self.nob:, self.noa:, :self.nob], x['a']) Ax['b'] += contract('jabi,jb->ia', self.l_bbbb[:self.nob, self.nob:, self.nob:, :self.nob], x['b']) #S->D V (Hole Interaction) Ax['aa'] -= contract('kbij,ka->ijab', self.l_aaaa[:self.noa, self.noa:, :self.noa, :self.noa], x['a']) Ax['aa'] += contract('kaij,kb->ijab', self.l_aaaa[:self.noa, self.noa:, :self.noa, :self.noa], x['a']) Ax['ab'] -= contract('kbij,ka->ijab', self.j_abab[:self.noa, self.nob:, :self.noa, :self.nob], x['a']) Ax['ab'] -= contract('akij,kb->ijab', self.j_abab[self.noa:, :self.nob, :self.noa, :self.nob], x['b']) if self.reference != 'rhf': Ax['bb'] -= contract('kbij,ka->ijab', self.l_bbbb[:self.nob, self.nob:, :self.nob, :self.nob], x['b']) Ax['bb'] += contract('kaij,kb->ijab', self.l_bbbb[:self.nob, self.nob:, :self.nob, :self.nob], x['b']) #S->D V (Particle Interaction) Ax['aa'] += contract('abcj,ic->ijab', self.l_aaaa[self.noa:, self.noa:, self.noa:, :self.noa], x['a']) Ax['aa'] -= contract('abci,jc->ijab', self.l_aaaa[self.noa:, self.noa:, self.noa:, :self.noa], x['a']) Ax['ab'] += contract('abcj,ic->ijab', self.j_abab[self.noa:, self.nob:, self.noa:, :self.nob], x['a']) Ax['ab'] += contract('abic,jc->ijab', self.j_abab[self.noa:, self.nob:, :self.noa, self.nob:], x['b']) if self.reference != 'rhf': Ax['bb'] += contract('abcj,ic->ijab', self.l_bbbb[self.nob:, self.nob:, self.nob:, :self.nob], x['b']) Ax['bb'] -= contract('abci,jc->ijab', self.l_bbbb[self.nob:, self.nob:, self.nob:, :self.nob], x['b']) #D->S V (Hole Interaction) rt2 = np.sqrt(2) ''' Ax['a'] -= .5*contract('kjib,kjab->ia', self.l_aaaa[:self.noa, :self.noa, :self.noa, self.noa:], x['aa']) Ax['a'] -= contract('kjib,kjab->ia', self.j_abab[:self.noa, :self.nob, :self.noa, self.nob:], x['ab']) if self.reference != 'rhf': Ax['b'] -= .5*contract('kjib,kjab->ia', self.l_bbbb[:self.nob, :self.nob, :self.nob, self.nob:], x['bb']) Ax['b'] -= contract('jkbi,jkba->ia', self.j_abab[:self.noa, :self.nob, self.noa:, :self.nob], x['ab']) ''' if self.reference != 'rhf': Ax['a'] -= .5*contract('kjib,kjab->ia', self.l_aaaa[:self.noa, :self.noa, :self.noa, self.noa:], x['aa']) Ax['a'] -= contract('kjib,kjab->ia', self.j_abab[:self.noa, :self.nob, :self.noa, self.nob:], x['ab']) Ax['b'] -= .5*contract('kjib,kjab->ia', self.l_bbbb[:self.nob, :self.nob, :self.nob, self.nob:], x['bb']) Ax['b'] -= contract('jkbi,jkba->ia', self.j_abab[:self.noa, :self.nob, self.noa:, :self.nob], x['ab']) else: Ax['a'] -= 1/2 * .5*contract('kjib,kjab->ia', self.l_aaaa[:self.noa, :self.noa, :self.noa, self.noa:], x['aa']) Ax['a'] -= 1/2 * contract('kjib,kjab->ia', self.j_abab[:self.noa, :self.nob, :self.noa, self.nob:], x['ab']) Ax['a'] -= 1/2 * .5*contract('kjib,kjab->ia', self.l_bbbb[:self.nob, :self.nob, :self.nob, self.nob:], x['bb']) Ax['a'] -= 1/2 * contract('jkbi,jkba->ia', self.j_abab[:self.noa, :self.nob, self.noa:, :self.nob], x['ab']) #D->S V (Particle Interaction) ''' Ax['a'] += .5*contract('ajcb,ijcb->ia', self.l_aaaa[self.noa:, :self.noa, self.noa:, self.noa:], x['aa']) Ax['a'] += contract('ajcb,ijcb->ia', self.j_abab[self.noa:, :self.nob, self.noa:, self.nob:], x['ab']) if self.reference != 'rhf': Ax['b'] += .5*contract('ajcb,ijcb->ia', self.l_bbbb[self.nob:, :self.nob, self.nob:, self.nob:], x['bb']) Ax['b'] += contract('jabc,jibc->ia', self.j_abab[:self.noa, self.nob:, self.noa:, self.nob:], x['ab']) ''' if self.reference != 'rhf': Ax['a'] += .5*contract('ajcb,ijcb->ia', self.l_aaaa[self.noa:, :self.noa, self.noa:, self.noa:], x['aa']) Ax['a'] += contract('ajcb,ijcb->ia', self.j_abab[self.noa:, :self.nob, self.noa:, self.nob:], x['ab']) Ax['b'] += .5*contract('ajcb,ijcb->ia', self.l_bbbb[self.nob:, :self.nob, self.nob:, self.nob:], x['bb']) Ax['b'] += contract('jabc,jibc->ia', self.j_abab[:self.noa, self.nob:, self.noa:, self.nob:], x['ab']) else: Ax['a'] += 1/2 * .5*contract('ajcb,ijcb->ia', self.l_aaaa[self.noa:, :self.noa, self.noa:, self.noa:], x['aa']) Ax['a'] += 1/2 * contract('ajcb,ijcb->ia', self.j_abab[self.noa:, :self.nob, self.noa:, self.nob:], x['ab']) Ax['a'] += 1/2 * .5*contract('ajcb,ijcb->ia', self.l_bbbb[self.nob:, :self.nob, self.nob:, self.nob:], x['bb']) Ax['a'] += 1/2 * contract('jabc,jibc->ia', self.j_abab[:self.noa, self.nob:, self.noa:, self.nob:], x['ab']) #D->D F (Hole Interaction) ''' Ax['aa'] -= (contract('kj,ikab->ijab', self.fa[:self.noa, :self.noa], x['aa'])) Ax['aa'] += (contract('ki,jkab->ijab', self.fa[:self.noa, :self.noa], x['aa'])) Ax['ab'] -= contract('kj,ikab->ijab', self.fb[:self.nob, :self.nob], x['ab']) Ax['ab'] -= contract('ki,kjab->ijab', self.fa[:self.noa, :self.noa], x['ab']) if self.reference != 'rhf': Ax['bb'] -= (contract('kj,ikab->ijab', self.fb[:self.nob, :self.nob], x['bb'])) Ax['bb'] += (contract('ki,jkab->ijab', self.fb[:self.nob, :self.nob], x['bb'])) ''' Ax['ab'] -= contract('kj,ikab->ijab', self.fb[:self.nob, :self.nob], x['ab']) Ax['ab'] -= contract('ki,kjab->ijab', self.fa[:self.noa, :self.noa], x['ab']) if self.reference != 'rhf': Ax['aa'] -= (contract('kj,ikab->ijab', self.fa[:self.noa, :self.noa], x['aa'])) Ax['aa'] += (contract('ki,jkab->ijab', self.fa[:self.noa, :self.noa], x['aa'])) Ax['bb'] -= (contract('kj,ikab->ijab', self.fb[:self.nob, :self.nob], x['bb'])) Ax['bb'] += (contract('ki,jkab->ijab', self.fb[:self.nob, :self.nob], x['bb'])) else: Ax['aa'] -= .5*(contract('kj,ikab->ijab', self.fa[:self.noa, :self.noa], x['aa'])) Ax['aa'] += .5*(contract('ki,jkab->ijab', self.fa[:self.noa, :self.noa], x['aa'])) Ax['aa'] -= .5*(contract('kj,ikab->ijab', self.fb[:self.nob, :self.nob], x['bb'])) Ax['aa'] += .5*(contract('ki,jkab->ijab', self.fb[:self.nob, :self.nob], x['bb'])) #D->D F (Particle Interaction) ''' Ax['aa'] += contract('bc,ijac->ijab', self.fa[self.noa:, self.noa:], x['aa']) Ax['aa'] -= contract('ac,ijbc->ijab', self.fa[self.noa:, self.noa:], x['aa']) Ax['ab'] += contract('bc,ijac->ijab', self.fb[self.nob:, self.nob:], x['ab']) Ax['ab'] += contract('ac,ijcb->ijab', self.fa[self.noa:, self.noa:], x['ab']) if self.reference != 'rhf': Ax['bb'] += contract('bc,ijac->ijab', self.fb[self.nob:, self.nob:], x['bb']) Ax['bb'] -= contract('ac,ijbc->ijab', self.fb[self.nob:, self.nob:], x['bb']) ''' Ax['ab'] += contract('bc,ijac->ijab', self.fb[self.nob:, self.nob:], x['ab']) Ax['ab'] += contract('ac,ijcb->ijab', self.fa[self.noa:, self.noa:], x['ab']) if self.reference != 'rhf': Ax['aa'] += contract('bc,ijac->ijab', self.fa[self.noa:, self.noa:], x['aa']) Ax['aa'] -= contract('ac,ijbc->ijab', self.fa[self.noa:, self.noa:], x['aa']) Ax['bb'] += contract('bc,ijac->ijab', self.fb[self.nob:, self.nob:], x['bb']) Ax['bb'] -= contract('ac,ijbc->ijab', self.fb[self.nob:, self.nob:], x['bb']) else: Ax['aa'] += .5*contract('bc,ijac->ijab', self.fa[self.noa:, self.noa:], x['aa']) Ax['aa'] -= .5*contract('ac,ijbc->ijab', self.fa[self.noa:, self.noa:], x['aa']) Ax['aa'] += .5*contract('bc,ijac->ijab', self.fb[self.nob:, self.nob:], x['bb']) Ax['aa'] -= .5*contract('ac,ijbc->ijab', self.fb[self.nob:, self.nob:], x['bb']) #D->D V (Particle, Particle Interaction) Ax['aa'] += .5*contract('abcd,ijcd->ijab', self.l_aaaa[self.noa:, self.noa:, self.noa:, self.noa:], x['aa']) Ax['ab'] += .5*contract('abcd,ijcd->ijab', self.j_abab[self.noa:, self.nob:, self.noa:, self.nob:], x['ab']) Ax['ab'] += .5*contract('abdc,ijdc->ijab', self.j_abab[self.noa:, self.nob:, self.noa:, self.nob:], x['ab']) if self.reference != 'rhf': Ax['bb'] += .5*contract('abcd,ijcd->ijab', self.l_bbbb[self.nob:, self.nob:, self.nob:, self.nob:], x['bb']) ''' Ax['ab'] += .5*contract('abcd,ijcd->ijab', self.j_abab[self.noa:, self.nob:, self.noa:, self.nob:], x['ab']) Ax['ab'] += .5*contract('abdc,ijdc->ijab', self.j_abab[self.noa:, self.nob:, self.noa:, self.nob:], x['ab']) if self.reference != 'rhf': Ax['aa'] += .5*contract('abcd,ijcd->ijab', self.l_aaaa[self.noa:, self.noa:, self.noa:, self.noa:], x['aa']) Ax['bb'] += .5*contract('abcd,ijcd->ijab', self.l_bbbb[self.nob:, self.nob:, self.nob:, self.nob:], x['bb']) else: Ax['aa'] += .5*.5*contract('abcd,ijcd->ijab', self.l_aaaa[self.noa:, self.noa:, self.noa:, self.noa:], x['aa']) Ax['aa'] += .5*.5*contract('abcd,ijcd->ijab', self.l_bbbb[self.nob:, self.nob:, self.nob:, self.nob:], x['bb']) ''' #D->D V (Hole, Hole Interaction) Ax['aa'] += .5*contract('ijkl,klab->ijab', self.l_aaaa[:self.noa, :self.noa, :self.noa, :self.noa], x['aa']) Ax['ab'] += .5*contract('ijkl,klab->ijab', self.j_abab[:self.noa, :self.nob, :self.noa, :self.nob], x['ab']) Ax['ab'] += .5*contract('ijlk,lkab->ijab', self.j_abab[:self.noa, :self.nob, :self.noa, :self.nob], x['ab']) if self.reference != 'rhf': Ax['bb'] += .5*contract('ijkl,klab->ijab', self.l_bbbb[:self.nob, :self.nob, :self.nob, :self.nob], x['bb']) ''' Ax['ab'] += .5*contract('ijkl,klab->ijab', self.j_abab[:self.noa, :self.nob, :self.noa, :self.nob], x['ab']) Ax['ab'] += .5*contract('ijlk,lkab->ijab', self.j_abab[:self.noa, :self.nob, :self.noa, :self.nob], x['ab']) if self.reference != 'rhf': Ax['aa'] += .5*contract('ijkl,klab->ijab', self.l_aaaa[:self.noa, :self.noa, :self.noa, :self.noa], x['aa']) Ax['bb'] += .5*contract('ijkl,klab->ijab', self.l_bbbb[:self.nob, :self.nob, :self.nob, :self.nob], x['bb']) else: Ax['aa'] += .5*.5*contract('ijkl,klab->ijab', self.l_aaaa[:self.noa, :self.noa, :self.noa, :self.noa], x['aa']) Ax['aa'] += .5*.5*contract('ijkl,klab->ijab', self.l_bbbb[:self.nob, :self.nob, :self.nob, :self.nob], x['bb']) ''' #D->D V (Hole, Particle Interaction) ''' Ax['aa'] -= contract('akcj,ikcb->ijab', self.l_aaaa[self.noa:, :self.noa, self.noa:, :self.noa], x['aa']) Ax['aa'] += contract('bkcj,ikca->ijab', self.l_aaaa[self.noa:, :self.noa, self.noa:, :self.noa], x['aa']) Ax['aa'] += contract('akci,jkcb->ijab', self.l_aaaa[self.noa:, :self.noa, self.noa:, :self.noa], x['aa']) Ax['aa'] -= contract('bkci,jkca->ijab', self.l_aaaa[self.noa:, :self.noa, self.noa:, :self.noa], x['aa']) Ax['aa'] -= contract('akjc,ikbc->ijab', self.j_abab[self.noa:, :self.nob, :self.noa, self.nob:], x['ab']) Ax['aa'] += contract('bkjc,ikac->ijab', self.j_abab[self.noa:, :self.nob, :self.noa, self.nob:], x['ab']) Ax['aa'] += contract('akic,jkbc->ijab', self.j_abab[self.noa:, :self.nob, :self.noa, self.nob:], x['ab']) Ax['aa'] -= contract('bkic,jkac->ijab', self.j_abab[self.noa:, :self.nob, :self.noa, self.nob:], x['ab']) Ax['ab'] -= contract('akcj,ikcb->ijab', self.j_abab[self.noa:, :self.nob, self.noa:, :self.nob], x['ab']) Ax['ab'] -= contract('kbcj,ikca->ijab', self.j_abab[:self.noa, self.nob:, self.noa:, :self.nob], x['aa']) Ax['ab'] += contract('akic,kjcb->ijab', self.j_abab[self.noa:, :self.nob, :self.noa, self.nob:], x['bb']) Ax['ab'] -= contract('kbic,kjac->ijab', self.j_abab[:self.noa, self.nob:, :self.noa, self.nob:], x['ab']) Ax['ab'] += contract('kbcj,ikac->ijab', self.l_bbbb[:self.nob, self.nob:, self.nob:, :self.nob], x['ab']) Ax['ab'] -= contract('akci,kjcb->ijab', self.l_aaaa[self.noa:, :self.noa, self.noa:, :self.noa], x['ab']) if self.reference != 'rhf': Ax['bb'] -= contract('akcj,ikcb->ijab', self.l_bbbb[self.nob:, :self.nob, self.nob:, :self.nob], x['bb']) Ax['bb'] += contract('bkcj,ikca->ijab', self.l_bbbb[self.nob:, :self.nob, self.nob:, :self.nob], x['bb']) Ax['bb'] += contract('akci,jkcb->ijab', self.l_bbbb[self.nob:, :self.nob, self.nob:, :self.nob], x['bb']) Ax['bb'] -= contract('bkci,jkca->ijab', self.l_bbbb[self.nob:, :self.nob, self.nob:, :self.nob], x['bb']) Ax['bb'] -= contract('kacj,kicb->ijab', self.j_abab[:self.noa, self.nob:, self.noa:, :self.nob], x['ab']) Ax['bb'] += contract('kbcj,kica->ijab', self.j_abab[:self.noa, self.nob:, self.noa:, :self.nob], x['ab']) Ax['bb'] += contract('kaci,kjcb->ijab', self.j_abab[:self.noa, self.nob:, self.noa:, :self.nob], x['ab']) Ax['bb'] -= contract('kbci,kjca->ijab', self.j_abab[:self.noa, self.nob:, self.noa:, :self.nob], x['ab']) ''' Ax['ab'] -= contract('akcj,ikcb->ijab', self.j_abab[self.noa:, :self.nob, self.noa:, :self.nob], x['ab']) Ax['ab'] -= contract('kbcj,ikca->ijab', self.j_abab[:self.noa, self.nob:, self.noa:, :self.nob], x['aa']) Ax['ab'] += contract('akic,kjcb->ijab', self.j_abab[self.noa:, :self.nob, :self.noa, self.nob:], x['bb']) Ax['ab'] -= contract('kbic,kjac->ijab', self.j_abab[:self.noa, self.nob:, :self.noa, self.nob:], x['ab']) Ax['ab'] += contract('kbcj,ikac->ijab', self.l_bbbb[:self.nob, self.nob:, self.nob:, :self.nob], x['ab']) Ax['ab'] -= contract('akci,kjcb->ijab', self.l_aaaa[self.noa:, :self.noa, self.noa:, :self.noa], x['ab']) if self.reference != 'rhf': Ax['aa'] -= contract('akcj,ikcb->ijab', self.l_aaaa[self.noa:, :self.noa, self.noa:, :self.noa], x['aa']) Ax['aa'] += contract('bkcj,ikca->ijab', self.l_aaaa[self.noa:, :self.noa, self.noa:, :self.noa], x['aa']) Ax['aa'] += contract('akci,jkcb->ijab', self.l_aaaa[self.noa:, :self.noa, self.noa:, :self.noa], x['aa']) Ax['aa'] -= contract('bkci,jkca->ijab', self.l_aaaa[self.noa:, :self.noa, self.noa:, :self.noa], x['aa']) Ax['aa'] -= contract('akjc,ikbc->ijab', self.j_abab[self.noa:, :self.nob, :self.noa, self.nob:], x['ab']) Ax['aa'] += contract('bkjc,ikac->ijab', self.j_abab[self.noa:, :self.nob, :self.noa, self.nob:], x['ab']) Ax['aa'] += contract('akic,jkbc->ijab', self.j_abab[self.noa:, :self.nob, :self.noa, self.nob:], x['ab']) Ax['aa'] -= contract('bkic,jkac->ijab', self.j_abab[self.noa:, :self.nob, :self.noa, self.nob:], x['ab']) Ax['bb'] -= contract('akcj,ikcb->ijab', self.l_bbbb[self.nob:, :self.nob, self.nob:, :self.nob], x['bb']) Ax['bb'] += contract('bkcj,ikca->ijab', self.l_bbbb[self.nob:, :self.nob, self.nob:, :self.nob], x['bb']) Ax['bb'] += contract('akci,jkcb->ijab', self.l_bbbb[self.nob:, :self.nob, self.nob:, :self.nob], x['bb']) Ax['bb'] -= contract('bkci,jkca->ijab', self.l_bbbb[self.nob:, :self.nob, self.nob:, :self.nob], x['bb']) Ax['bb'] -= contract('kacj,kicb->ijab', self.j_abab[:self.noa, self.nob:, self.noa:, :self.nob], x['ab']) Ax['bb'] += contract('kbcj,kica->ijab', self.j_abab[:self.noa, self.nob:, self.noa:, :self.nob], x['ab']) Ax['bb'] += contract('kaci,kjcb->ijab', self.j_abab[:self.noa, self.nob:, self.noa:, :self.nob], x['ab']) Ax['bb'] -= contract('kbci,kjca->ijab', self.j_abab[:self.noa, self.nob:, self.noa:, :self.nob], x['ab']) else: Ax['aa'] -= .5*contract('akcj,ikcb->ijab', self.l_aaaa[self.noa:, :self.noa, self.noa:, :self.noa], x['aa']) Ax['aa'] += .5*contract('bkcj,ikca->ijab', self.l_aaaa[self.noa:, :self.noa, self.noa:, :self.noa], x['aa']) Ax['aa'] += .5*contract('akci,jkcb->ijab', self.l_aaaa[self.noa:, :self.noa, self.noa:, :self.noa], x['aa']) Ax['aa'] -= .5*contract('bkci,jkca->ijab', self.l_aaaa[self.noa:, :self.noa, self.noa:, :self.noa], x['aa']) Ax['aa'] -= .5*contract('akjc,ikbc->ijab', self.j_abab[self.noa:, :self.nob, :self.noa, self.nob:], x['ab']) Ax['aa'] += .5*contract('bkjc,ikac->ijab', self.j_abab[self.noa:, :self.nob, :self.noa, self.nob:], x['ab']) Ax['aa'] += .5*contract('akic,jkbc->ijab', self.j_abab[self.noa:, :self.nob, :self.noa, self.nob:], x['ab']) Ax['aa'] -= .5*contract('bkic,jkac->ijab', self.j_abab[self.noa:, :self.nob, :self.noa, self.nob:], x['ab']) Ax['aa'] -= .5*contract('akcj,ikcb->ijab', self.l_bbbb[self.nob:, :self.nob, self.nob:, :self.nob], x['bb']) Ax['aa'] += .5*contract('bkcj,ikca->ijab', self.l_bbbb[self.nob:, :self.nob, self.nob:, :self.nob], x['bb']) Ax['aa'] += .5*contract('akci,jkcb->ijab', self.l_bbbb[self.nob:, :self.nob, self.nob:, :self.nob], x['bb']) Ax['aa'] -= .5*contract('bkci,jkca->ijab', self.l_bbbb[self.nob:, :self.nob, self.nob:, :self.nob], x['bb']) Ax['aa'] -= .5*contract('kacj,kicb->ijab', self.j_abab[:self.noa, self.nob:, self.noa:, :self.nob], x['ab']) Ax['aa'] += .5*contract('kbcj,kica->ijab', self.j_abab[:self.noa, self.nob:, self.noa:, :self.nob], x['ab']) Ax['aa'] += .5*contract('kaci,kjcb->ijab', self.j_abab[:self.noa, self.nob:, self.noa:, :self.nob], x['ab']) Ax['aa'] -= .5*contract('kbci,kjca->ijab', self.j_abab[:self.noa, self.nob:, self.noa:, :self.nob], x['ab']) Ax = at.collapse_tensor(Ax, self) Ax = at.concatenate_amps(Ax, self) return Ax