def kernel(self, h1e, eri, norb, nelec, ci0=None, tol=None, lindep=None, max_cycle=None, max_space=None, nroots=None, davidson_only=None, pspace_size=None, orbsym=None, wfnsym=None, **kwargs): if nroots is None: nroots = self.nroots if orbsym is not None: self.orbsym, orbsym_bak = orbsym, self.orbsym if wfnsym is not None: self.wfnsym, wfnsym_bak = wfnsym, self.wfnsym else: wfnsym_bak = None self.check_sanity() wfnsym = self.guess_wfnsym(norb, nelec, ci0, self.wfnsym, **kwargs) e, c = direct_spin0.kernel_ms0(self, h1e, eri, norb, nelec, ci0, None, tol, lindep, max_cycle, max_space, nroots, davidson_only, pspace_size, **kwargs) if self.wfnsym is not None: if self.nroots > 1: c = [addons.symmetrize_wfn(ci, norb, nelec, self.orbsym, wfnsym) for ci in c] else: c = addons.symmetrize_wfn(c, norb, nelec, self.orbsym, wfnsym) if orbsym is not None: self.orbsym = orbsym_bak if wfnsym_bak is not None: self.wfnsym = wfnsym_bak return e, c
def kernel(h1e, eri, norb, nelec, ci0=None, level_shift=.001, tol=1e-10, lindep=1e-14, max_cycle=50, nroots=1, orbsym=[], wfnsym=None, **kwargs): assert(len(orbsym) == norb) cis = FCISolver(None) cis.level_shift = level_shift cis.orbsym = orbsym cis.conv_tol = tol cis.lindep = lindep cis.max_cycle = max_cycle cis.wfnsym = wfnsym cis.nroots = nroots unknown = [] for k, v in kwargs.items(): setattr(cis, k, v) if not hasattr(cis, k): unknown.append(k) if unknown: sys.stderr.write('Unknown keys %s for FCI kernel %s\n' % (str(unknown), __name__)) wfnsym = _id_wfnsym(cis, norb, nelec, cis.wfnsym) if cis.wfnsym is not None and ci0 is None: ci0 = addons.symm_initguess(norb, nelec, orbsym, wfnsym) e, c = direct_spin1.kernel_ms1(cis, h1e, eri, norb, nelec, ci0=ci0) if cis.wfnsym is not None: if cis.nroots > 1: c = [addons.symmetrize_wfn(ci, norb, nelec, orbsym, wfnsym) for ci in c] else: c = addons.symmetrize_wfn(c, norb, nelec, orbsym, wfnsym) return e, c
def kernel(self, h1e, eri, norb, nelec, ci0=None, **kwargs): if self.verbose > logger.QUIET: pyscf.gto.mole.check_sanity(self, self._keys, self.stdout) wfnsym = _id_wfnsym(self, norb, nelec, self.wfnsym) if 'verbose' in kwargs: if isinstance(kwargs['verbose'], logger.Logger): log = kwargs['verbose'] else: log = logger.Logger(self.stdout, kwargs['verbose']) log.debug('total symmetry = %s', symm.irrep_id2name(self.mol.groupname, wfnsym)) else: logger.debug(self, 'total symmetry = %s', symm.irrep_id2name(self.mol.groupname, wfnsym)) e, c = direct_spin1.kernel_ms1(self, h1e, eri, norb, nelec, ci0, **kwargs) if self.wfnsym is not None: # should I remove the non-symmetric contributions in each # call of contract_2e? if self.nroots > 1: c = [addons.symmetrize_wfn(ci, norb, nelec, self.orbsym, wfnsym) for ci in c] else: c = addons.symmetrize_wfn(c, norb, nelec, self.orbsym, wfnsym) return e, c
def kernel(self, h1e, eri, norb, nelec, ci0=None, tol=None, lindep=None, max_cycle=None, max_space=None, nroots=None, davidson_only=None, pspace_size=None, orbsym=None, wfnsym=None, **kwargs): if nroots is None: nroots = self.nroots if orbsym is not None: self.orbsym, orbsym_bak = orbsym, self.orbsym if wfnsym is not None: self.wfnsym, wfnsym_bak = wfnsym, self.wfnsym else: wfnsym_bak = None if self.verbose >= logger.WARN: self.check_sanity() wfnsym = self.guess_wfnsym(norb, nelec, ci0, self.wfnsym, **kwargs) e, c = direct_spin1.kernel_ms1(self, h1e, eri, norb, nelec, ci0, None, tol, lindep, max_cycle, max_space, nroots, davidson_only, pspace_size, **kwargs) if self.wfnsym is not None: # should I remove the non-symmetric contributions in each # call of contract_2e? if nroots > 1: c = [addons.symmetrize_wfn(ci, norb, nelec, self.orbsym, wfnsym) for ci in c] else: c = addons.symmetrize_wfn(c, norb, nelec, self.orbsym, wfnsym) if orbsym is not None: self.orbsym = orbsym_bak if wfnsym_bak is not None: self.wfnsym = wfnsym_bak return e, c
def kernel(self, h1e, eri, norb, nelec, ci0=None, tol=None, lindep=None, max_cycle=None, max_space=None, nroots=None, davidson_only=None, pspace_size=None, orbsym=None, wfnsym=None, **kwargs): if nroots is None: nroots = self.nroots if orbsym is not None: self.orbsym, orbsym_bak = orbsym, self.orbsym if wfnsym is not None: self.wfnsym, wfnsym_bak = wfnsym, self.wfnsym if self.verbose >= logger.WARN: self.check_sanity() wfnsym0 = self.guess_wfnsym(norb, nelec, ci0, self.wfnsym, **kwargs) e, c = direct_spin1.kernel_ms1(self, h1e, eri, norb, nelec, ci0, None, tol, lindep, max_cycle, max_space, nroots, davidson_only, pspace_size, **kwargs) if self.wfnsym is not None: # should I remove the non-symmetric contributions in each # call of contract_2e? if nroots > 1: c = [addons.symmetrize_wfn(ci, norb, nelec, self.orbsym, wfnsym0) for ci in c] else: c = addons.symmetrize_wfn(c, norb, nelec, self.orbsym, wfnsym0) if orbsym is not None: self.orbsym = orbsym_bak if wfnsym is not None: self.wfnsym = wfnsym_bak return e, c
def kernel(h1e, eri, norb, nelec, ci0=None, level_shift=1e-3, tol=1e-10, lindep=1e-14, max_cycle=50, max_space=12, nroots=1, davidson_only=False, pspace_size=400, orbsym=[], wfnsym=None, **kwargs): assert (len(orbsym) == norb) cis = FCISolver(None) cis.level_shift = level_shift cis.conv_tol = tol cis.lindep = lindep cis.max_cycle = max_cycle cis.max_space = max_space cis.nroots = nroots cis.davidson_only = davidson_only cis.pspace_size = pspace_size cis.orbsym = orbsym cis.wfnsym = wfnsym unknown = {} for k, v in kwargs.items(): setattr(cis, k, v) if not hasattr(cis, k): unknown[k] = v if unknown: sys.stderr.write('Unknown keys %s for FCI kernel %s\n' % (str(unknown.keys()), __name__)) wfnsym = _id_wfnsym(cis, norb, nelec, cis.wfnsym) if cis.wfnsym is not None and ci0 is None: ci0 = addons.symm_initguess(norb, nelec, orbsym, wfnsym) e, c = cis.kernel(h1e, eri, norb, nelec, ci0, **unknown) if cis.wfnsym is not None: if cis.nroots > 1: c = [ addons.symmetrize_wfn(ci, norb, nelec, orbsym, wfnsym) for ci in c ] else: c = addons.symmetrize_wfn(c, norb, nelec, orbsym, wfnsym) return e, c
def kernel(self, h1e, eri, norb, nelec, ci0=None, tol=None, lindep=None, max_cycle=None, max_space=None, nroots=None, davidson_only=None, pspace_size=None, orbsym=None, wfnsym=None, **kwargs): if nroots is None: nroots = self.nroots if orbsym is not None: self.orbsym, orbsym_bak = orbsym, self.orbsym if wfnsym is not None: self.wfnsym, wfnsym_bak = wfnsym, self.wfnsym else: wfnsym_bak = None if self.verbose > logger.QUIET: pyscf.gto.mole.check_sanity(self, self._keys, self.stdout) wfnsym = _id_wfnsym(self, norb, nelec, self.wfnsym) if 'verbose' in kwargs: if isinstance(kwargs['verbose'], logger.Logger): log = kwargs['verbose'] else: log = logger.Logger(self.stdout, kwargs['verbose']) log.debug('total symmetry = %s', wfnsym) else: logger.debug(self, 'total symmetry = %s', wfnsym) e, c = direct_spin1.kernel_ms1(self, h1e, eri, norb, nelec, ci0, tol, lindep, max_cycle, max_space, nroots, davidson_only, pspace_size, **kwargs) if self.wfnsym is not None: # should I remove the non-symmetric contributions in each # call of contract_2e? if nroots > 1: c = [addons.symmetrize_wfn(ci, norb, nelec, self.orbsym, wfnsym) for ci in c] else: c = addons.symmetrize_wfn(c, norb, nelec, self.orbsym, wfnsym) if orbsym is not None: self.orbsym = orbsym_bak if wfnsym_bak is not None: self.wfnsym = wfnsym_bak return e, c
def kernel(h1e, eri, norb, nelec, ci0=None, level_shift=1e-3, tol=1e-10, lindep=1e-14, max_cycle=50, max_space=12, nroots=1, davidson_only=False, pspace_size=400, orbsym=[], wfnsym=None, **kwargs): assert(len(orbsym) == norb) cis = FCISolver(None) cis.level_shift = level_shift cis.conv_tol = tol cis.lindep = lindep cis.max_cycle = max_cycle cis.max_space = max_space cis.nroots = nroots cis.davidson_only = davidson_only cis.pspace_size = pspace_size cis.orbsym = orbsym cis.wfnsym = wfnsym unknown = {} for k, v in kwargs.items(): setattr(cis, k, v) if not hasattr(cis, k): unknown[k] = v if unknown: sys.stderr.write('Unknown keys %s for FCI kernel %s\n' % (str(unknown.keys()), __name__)) wfnsym = direct_spin1_symm._id_wfnsym(cis, norb, nelec, cis.wfnsym) if cis.wfnsym is not None and ci0 is None: ci0 = addons.symm_initguess(norb, nelec, orbsym, wfnsym) e, c = cis.kernel(h1e, eri, norb, nelec, ci0, **unknown) if cis.wfnsym is not None: if cis.nroots > 1: c = [addons.symmetrize_wfn(ci, norb, nelec, orbsym, wfnsym) for ci in c] else: c = addons.symmetrize_wfn(c, norb, nelec, orbsym, wfnsym) return e, c
norb, nelec = 7, (4, 4) strs = cistring.gen_strings4orblist(range(norb), nelec[0]) numpy.random.seed(11) mask = numpy.random.random(len(strs)) > .3 strsa = strs[mask] mask = numpy.random.random(len(strs)) > .2 strsb = strs[mask] ci_strs = (strsa, strsb) civec_strs = selected_ci._as_SCIvector( numpy.random.random((len(strsa), len(strsb))), ci_strs) orbsym = (numpy.random.random(norb) * 4).astype(int) nn = norb * (norb + 1) // 2 eri = (numpy.random.random(nn * (nn + 1) // 2) - .2)**3 ci0 = selected_ci.to_fci(civec_strs, norb, nelec) ci0 = addons.symmetrize_wfn(ci0, norb, nelec, orbsym) civec_strs = selected_ci.from_fci(ci0, civec_strs._strs, norb, nelec) e1 = numpy.dot( civec_strs.ravel(), contract_2e(eri, civec_strs, norb, nelec, orbsym=orbsym).ravel()) e2 = numpy.dot( ci0.ravel(), direct_spin1_symm.contract_2e(eri, ci0, norb, nelec, orbsym=orbsym).ravel()) print(e1 - e2) mol = gto.Mole() mol.verbose = 0 mol.output = None mol.atom = [ ['O', (0., 0., 0.)],
m = scf.RHF(mol) ehf = m.scf() norb = m.mo_coeff.shape[1] nelec = mol.nelectron - 1 h1e = reduce(numpy.dot, (m.mo_coeff.T, scf.hf.get_hcore(mol), m.mo_coeff)) eri = ao2mo.incore.full(m._eri, m.mo_coeff) numpy.random.seed(1) na = cistring.num_strings(norb, nelec // 2 + 1) nb = cistring.num_strings(norb, nelec // 2) fcivec = numpy.random.random((na, nb)) orbsym = symm.label_orb_symm(mol, mol.irrep_id, mol.symm_orb, m.mo_coeff) cis = FCISolver(mol) cis.orbsym = orbsym fcivec = addons.symmetrize_wfn(fcivec, norb, nelec, cis.orbsym, wfnsym=0) ci1 = cis.contract_2e(eri, fcivec, norb, nelec, orbsym=cis.orbsym, wfnsym=0) ci1ref = direct_spin1.contract_2e(eri, fcivec, norb, nelec) print(numpy.allclose(ci1ref, ci1)) ci1 = contract_2e(eri, fcivec, norb, nelec, orbsym=orbsym) ci1ref = direct_spin1.contract_2e(eri, fcivec, norb, nelec) print(numpy.allclose(ci1ref, ci1)) cis.wfnsym = 3 e = cis.kernel(h1e,
m = scf.RHF(mol) ehf = m.scf() norb = m.mo_coeff.shape[1] nelec = mol.nelectron-1 h1e = reduce(numpy.dot, (m.mo_coeff.T, scf.hf.get_hcore(mol), m.mo_coeff)) eri = ao2mo.incore.full(m._eri, m.mo_coeff) numpy.random.seed(1) na = cistring.num_strings(norb, nelec//2+1) nb = cistring.num_strings(norb, nelec//2) fcivec = numpy.random.random((na,nb)) orbsym = symm.label_orb_symm(mol, mol.irrep_id, mol.symm_orb, m.mo_coeff) cis = FCISolver(mol) cis.orbsym = orbsym fcivec = addons.symmetrize_wfn(fcivec, norb, nelec, cis.orbsym, wfnsym=0) ci1 = cis.contract_2e(eri, fcivec, norb, nelec, orbsym=cis.orbsym, wfnsym=0) ci1ref = direct_spin1.contract_2e(eri, fcivec, norb, nelec) print(numpy.allclose(ci1ref, ci1)) ci1 = contract_2e(eri, fcivec, norb, nelec, orbsym=orbsym) ci1ref = direct_spin1.contract_2e(eri, fcivec, norb, nelec) print(numpy.allclose(ci1ref, ci1)) cis.wfnsym = 3 e = cis.kernel(h1e, eri, norb, nelec, ecore=m.energy_nuc(), davidson_only=True)[0] print(e, e - -74.695029029452357) mol.atom = [['H', (0, 0, i)] for i in range(8)] mol.basis = {'H': 'sto-3g'} mol.symmetry = True
norb, nelec = 7, (4,4) strs = cistring.gen_strings4orblist(range(norb), nelec[0]) numpy.random.seed(11) mask = numpy.random.random(len(strs)) > .3 strsa = strs[mask] mask = numpy.random.random(len(strs)) > .2 strsb = strs[mask] ci_strs = (strsa, strsb) civec_strs = selected_ci._as_SCIvector(numpy.random.random((len(strsa),len(strsb))), ci_strs) orbsym = (numpy.random.random(norb) * 4).astype(int) nn = norb*(norb+1)//2 eri = (numpy.random.random(nn*(nn+1)//2)-.2)**3 ci0 = selected_ci.to_fci(civec_strs, norb, nelec) ci0 = addons.symmetrize_wfn(ci0, norb, nelec, orbsym) civec_strs = selected_ci.from_fci(ci0, civec_strs._strs, norb, nelec) e1 = numpy.dot(civec_strs.ravel(), contract_2e(eri, civec_strs, norb, nelec, orbsym=orbsym).ravel()) e2 = numpy.dot(ci0.ravel(), direct_spin1_symm.contract_2e(eri, ci0, norb, nelec, orbsym=orbsym).ravel()) print(e1-e2) mol = gto.Mole() mol.verbose = 0 mol.output = None mol.atom = [ ['O', ( 0., 0. , 0. )], ['H', ( 0., -0.757, 0.587)], ['H', ( 0., 0.757 , 0.587)],] mol.basis = 'sto-3g' mol.symmetry = 1 mol.build()