def test_F_sym(self): noa = 2 nva = 3 nob = 2 nvb = 3 Faa = test_utils.make_random_F(noa, nva) Fbb = test_utils.make_random_F(nob, nvb) F = spin_utils.F_to_spin(Faa, Fbb, noa, nva, nob, nvb) z = F.oo[:noa,noa:] s = numpy.linalg.norm(z) < self.thresh err = "non-zero ab block of Foo" self.assertTrue(s,err) z = F.ov[:noa,nva:] s = numpy.linalg.norm(z) < self.thresh err = "non-zero ab block of Fov" self.assertTrue(s,err) z = F.vo[:nva,noa:] s = numpy.linalg.norm(z) < self.thresh err = "non-zero ab block of Fvo" self.assertTrue(s,err) z = F.vo[:nva,nva:] s = numpy.linalg.norm(z) < self.thresh err = "non-zero ab block of Fvv" self.assertTrue(s,err)
def test_ucc_energy(self): noa = self.no nob = self.no nva = self.nv nvb = self.nv na = noa + nva nb = nob + nvb no = noa + nob nv = nva + nvb Faa = test_utils.make_random_F(noa, nva) Fbb = test_utils.make_random_F(nob, nvb) # Direct integrals over a,b orbitals Ia = test_utils.make_random_I_anti(noa, nva) Ib = test_utils.make_random_I_anti(nob, nvb) Iabab = test_utils.make_random_Ifull_gen(noa, nva, nob, nvb, noa, nva, nob, nvb) # Full antisymmetric spin-orbital tensor I = spin_utils.int_to_spin2(Ia, Ib, Iabab, noa, nva, nob, nvb) F = spin_utils.F_to_spin(Faa, Fbb, noa, nva, nob, nvb) # initial T T1a, T1b = test_utils.make_random_T1_spatial(noa, nva, nob, nvb) T2aa, T2ab, T2bb = test_utils.make_random_T2_spatial( noa, nva, nob, nvb) T1 = spin_utils.T1_to_spin(T1a, T1b, noa, nva, nob, nvb) T2 = spin_utils.T2_to_spin(T2aa, T2ab, T2bb, noa, nva, nob, nvb) E_ref = cc_energy.cc_energy(T1, T2, F.ov, I.oovv) E_out = cc_energy.ucc_energy((T1a, T1b), (T2aa, T2ab, T2bb), Faa.ov, Fbb.ov, Ia.oovv, Ib.oovv, Iabab.oovv) s = abs(E_ref - E_out) < self.thresh err = "Error in ucc_energy" self.assertTrue(s, err)
def test_uccsd_lambda(self): noa = self.no nob = self.no nva = self.nv nvb = self.nv na = noa + nva nb = nob + nvb no = noa + nob nv = nva + nvb Fa = test_utils.make_random_F(noa, nva) Fb = test_utils.make_random_F(nob, nvb) # Direct integrals over a,b orbitals Ia = test_utils.make_random_I_anti(noa, nva) Ib = test_utils.make_random_I_anti(nob, nvb) Iabab = test_utils.make_random_Ifull_gen(noa, nva, nob, nvb, noa, nva, nob, nvb) # Full antisymmetric spin-orbital tensor I = spin_utils.int_to_spin2(Ia, Ib, Iabab, noa, nva, nob, nvb) F = spin_utils.F_to_spin(Fa, Fb, noa, nva, nob, nvb) # initial T T1a, T1b = test_utils.make_random_T1_spatial(noa, nva, nob, nvb) T2aa, T2ab, T2bb = test_utils.make_random_T2_spatial( noa, nva, nob, nvb) T1 = spin_utils.T1_to_spin(T1a, T1b, noa, nva, nob, nvb) T2 = spin_utils.T2_to_spin(T2aa, T2ab, T2bb, noa, nva, nob, nvb) # initial L L1aold, L1bold = test_utils.make_random_T1_spatial(nva, noa, nvb, nob) L2aaold, L2abold, L2bbold = test_utils.make_random_T2_spatial( nva, noa, nvb, nob) L1old = spin_utils.T1_to_spin(L1aold, L1bold, nva, noa, nvb, nob) L2old = spin_utils.T2_to_spin(L2aaold, L2abold, L2bbold, nva, noa, nvb, nob) # Get updated Lambda using spin orbitals L1_ref, L2_ref = cc_equations.ccsd_lambda_opt(F, I, L1old, L2old, T1, T2) # Get updated Lambda using unrestricted code M1, M2 = cc_equations.uccsd_lambda_opt(Fa, Fb, Ia, Ib, Iabab, (L1aold, L1bold), (L2aaold, L2abold, L2bbold), (T1a, T1b), (T2aa, T2ab, T2bb)) L1a, L1b = M1 L2aa, L2ab, L2bb = M2 L1 = spin_utils.T1_to_spin(L1a, L1b, nva, noa, nvb, nob) L2 = spin_utils.T2_to_spin(L2aa, L2ab, L2bb, nva, noa, nvb, nob) z1 = numpy.linalg.norm(L1 - L1_ref) / numpy.sqrt(L1.size) z2 = numpy.linalg.norm(L2 - L2_ref) / numpy.sqrt(L2.size) s1 = z1 < self.thresh s2 = z2 < self.thresh e1 = "Error in UCCSD L1" e2 = "Error in UCCSD L2" self.assertTrue(s1, e1) self.assertTrue(s2, e2)
def test_uccsd(self): noa = self.no nob = self.no nva = self.nv nvb = self.nv na = noa + nva nb = nob + nvb no = noa + nob nv = nva + nvb Faa = test_utils.make_random_F(noa, nva) Fbb = test_utils.make_random_F(nob, nvb) # Direct integrals over a,b orbitals Ia = test_utils.make_random_I_anti(noa, nva) Ib = test_utils.make_random_I_anti(nob, nvb) I_abab = test_utils.make_random_Ifull_gen(noa, nva, nob, nvb, noa, nva, nob, nvb) # Full antisymmetric spin-orbital tensor I = spin_utils.int_to_spin2(Ia, Ib, I_abab, noa, nva, nob, nvb) F = spin_utils.F_to_spin(Faa, Fbb, noa, nva, nob, nvb) # initial T T1a, T1b = test_utils.make_random_T1_spatial(noa, nva, nob, nvb) T2aa, T2ab, T2bb = test_utils.make_random_T2_spatial( noa, nva, nob, nvb) T1 = spin_utils.T1_to_spin(T1a, T1b, noa, nva, nob, nvb) T2 = spin_utils.T2_to_spin(T2aa, T2ab, T2bb, noa, nva, nob, nvb) # Update with spin orbitals S1ref, S2ref = cc_equations.ccsd_stanton(F, I, T1, T2) # Update with UCCSD S1, S2 = cc_equations.uccsd_stanton(Faa, Fbb, Ia, Ib, I_abab, (T1a, T1b), (T2aa, T2ab, T2bb)) S1a, S1b = S1 S2aa, S2ab, S2bb = S2 S1 = spin_utils.T1_to_spin(S1a, S1b, noa, nva, nob, nvb) S2 = spin_utils.T2_to_spin(S2aa, S2ab, S2bb, noa, nva, nob, nvb) z1 = numpy.linalg.norm(S1 - S1ref) / numpy.sqrt(S1.size) z2 = numpy.linalg.norm(S2 - S2ref) / numpy.sqrt(S2.size) s1 = z1 < self.thresh s2 = z2 < self.thresh e1 = "Error in UCCSD T1" e2 = "Error in UCCSD T2" self.assertTrue(s1, e1) self.assertTrue(s2, e2)
def test_u1rdm(self): noa = 3 nva = 5 nob = 2 nvb = 6 thresh = 1e-14 # use unrestricted one-particle property Aa = test_utils.make_random_F(noa, nva) Ab = test_utils.make_random_F(nob, nvb) Atot = spin_utils.F_to_spin(Aa, Ab, noa, nva, nob, nvb) # get unrestricted and general amplitudes T1a, T1b = test_utils.make_random_T1_spatial(noa, nva, nob, nvb) T2aa, T2ab, T2bb \ = test_utils.make_random_T2_spatial(noa, nva, nob, nvb) L1a, L1b = test_utils.make_random_T1_spatial(nva, noa, nvb, nob) L2aa, L2ab, L2bb \ = test_utils.make_random_T2_spatial(nva, noa, nvb, nob) T1 = spin_utils.T1_to_spin(T1a, T1b, noa, nva, nob, nvb) L1 = spin_utils.T1_to_spin(L1a, L1b, nva, noa, nvb, nob) T2 = spin_utils.T2_to_spin(T2aa, T2ab, T2bb, noa, nva, nob, nvb) L2 = spin_utils.T2_to_spin(L2aa, L2ab, L2bb, nva, noa, nvb, nob) # make general pieces of 1-rdm pia = L1.copy() pba = cc_equations.ccsd_1rdm_ba_opt(T1, T2, L1, L2) pji = cc_equations.ccsd_1rdm_ji_opt(T1, T2, L1, L2) pai = cc_equations.ccsd_1rdm_ai_opt(T1, T2, L1, L2) # make unrestricted 1-rdm pia_a = L1a.copy() pia_b = L1b.copy() pba_a, pba_b = cc_equations.uccsd_1rdm_ba( T1a, T1b, T2aa, T2ab, T2bb, L1a, L1b, L2aa, L2ab, L2bb) pji_a, pji_b = cc_equations.uccsd_1rdm_ji( T1a, T1b, T2aa, T2ab, T2bb, L1a, L1b, L2aa, L2ab, L2bb) pai_a, pai_b = cc_equations.uccsd_1rdm_ai( T1a, T1b, T2aa, T2ab, T2bb, L1a, L1b, L2aa, L2ab, L2bb) # ia ref = numpy.einsum('ia,ai->', pia, Atot.vo) out = numpy.einsum('ia,ai->', pia_a, Aa.vo) out += numpy.einsum('ia,ai->', pia_b, Ab.vo) diff = abs(out - ref) / abs(ref) self.assertTrue(diff < thresh, "Error in Pia: {}".format(diff)) # ba ref = numpy.einsum('ba,ab->', pba, Atot.vv) out = numpy.einsum('ba,ab->', pba_a, Aa.vv) out += numpy.einsum('ba,ab->', pba_b, Ab.vv) diff = abs(out - ref) / abs(ref) self.assertTrue(diff < thresh, "Error in Pba: {}".format(diff)) # ji ref = numpy.einsum('ji,ij->', pji, Atot.oo) out = numpy.einsum('ji,ij->', pji_a, Aa.oo) out += numpy.einsum('ji,ij->', pji_b, Ab.oo) diff = abs(out - ref) / abs(ref) self.assertTrue(diff < thresh, "Error in Pji: {}".format(diff)) # ai ref = numpy.einsum('ai,ia->', pai, Atot.ov) out = numpy.einsum('ai,ia->', pai_a, Aa.ov) out += numpy.einsum('ai,ia->', pai_b, Ab.ov) diff = abs(out - ref) / abs(ref) self.assertTrue(diff < thresh, "Error in Pai: {}".format(diff))