Example #1
0
    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)
Example #2
0
    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)
Example #3
0
    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)
Example #4
0
    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)
Example #5
0
    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))