pyscf 2.8.0__py3-none-macosx_11_0_arm64.whl → 2.9.0__py3-none-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. pyscf/__init__.py +1 -1
  2. pyscf/cc/__init__.py +2 -3
  3. pyscf/cc/dfccsd.py +3 -3
  4. pyscf/cc/dfuccsd.py +310 -0
  5. pyscf/cc/rccsd.py +5 -1
  6. pyscf/cc/uccsd.py +30 -21
  7. pyscf/df/addons.py +6 -1
  8. pyscf/df/df_jk.py +29 -0
  9. pyscf/df/hessian/uhf.py +2 -2
  10. pyscf/df/incore.py +1 -1
  11. pyscf/dft/libxc.py +1 -1
  12. pyscf/fci/fci_dhf_slow.py +15 -1
  13. pyscf/grad/sacasscf.py +2 -0
  14. pyscf/gto/basis/__init__.py +24 -3
  15. pyscf/gto/mole.py +7 -7
  16. pyscf/gto/moleintor.py +25 -0
  17. pyscf/gw/urpa.py +6 -2
  18. pyscf/hessian/uks.py +1 -1
  19. pyscf/lib/CMakeLists.txt +2 -2
  20. pyscf/lib/deps/lib/libcint.6.dylib +0 -0
  21. pyscf/lib/dft/libxc_itrf.c +21 -17
  22. pyscf/lib/libagf2.dylib +0 -0
  23. pyscf/lib/libao2mo.dylib +0 -0
  24. pyscf/lib/libcc.dylib +0 -0
  25. pyscf/lib/libcgto.dylib +0 -0
  26. pyscf/lib/libcvhf.dylib +0 -0
  27. pyscf/lib/libdft.dylib +0 -0
  28. pyscf/lib/libfci.dylib +0 -0
  29. pyscf/lib/libmcscf.dylib +0 -0
  30. pyscf/lib/libmp.dylib +0 -0
  31. pyscf/lib/libnp_helper.dylib +0 -0
  32. pyscf/lib/libpbc.dylib +0 -0
  33. pyscf/lib/libri.dylib +0 -0
  34. pyscf/lib/libxc_itrf.dylib +0 -0
  35. pyscf/lib/libxcfun_itrf.dylib +0 -0
  36. pyscf/mcscf/__init__.py +1 -1
  37. pyscf/mcscf/casci.py +2 -2
  38. pyscf/mcscf/mc1step.py +2 -2
  39. pyscf/mcscf/newton_casscf.py +1 -1
  40. pyscf/mp/__init__.py +1 -2
  41. pyscf/mp/dfmp2.py +1 -1
  42. pyscf/mp/dfump2.py +1 -1
  43. pyscf/mrpt/nevpt2.py +11 -0
  44. pyscf/pbc/df/aft.py +3 -0
  45. pyscf/pbc/df/df.py +4 -5
  46. pyscf/pbc/df/df_jk.py +8 -5
  47. pyscf/pbc/df/rsdf.py +1 -0
  48. pyscf/pbc/df/rsdf_builder.py +1 -1
  49. pyscf/pbc/dft/rks.py +4 -2
  50. pyscf/pbc/gto/cell.py +18 -6
  51. pyscf/pbc/mpitools/mpi.py +0 -1
  52. pyscf/pbc/scf/hf.py +13 -2
  53. pyscf/pbc/tools/k2gamma.py +2 -1
  54. pyscf/pbc/x2c/sfx2c1e.py +5 -0
  55. pyscf/scf/addons.py +21 -2
  56. pyscf/solvent/cosmors.py +177 -165
  57. pyscf/solvent/grad/pcm.py +75 -19
  58. pyscf/solvent/hessian/pcm.py +957 -108
  59. pyscf/solvent/hessian/smd.py +7 -43
  60. pyscf/symm/geom.py +57 -8
  61. pyscf/tdscf/_lr_eig.py +14 -7
  62. pyscf/tools/fcidump.py +36 -9
  63. pyscf/tools/finite_diff.py +175 -0
  64. pyscf/x2c/x2c.py +101 -34
  65. {pyscf-2.8.0.dist-info → pyscf-2.9.0.dist-info}/METADATA +5 -4
  66. {pyscf-2.8.0.dist-info → pyscf-2.9.0.dist-info}/RECORD +70 -68
  67. {pyscf-2.8.0.dist-info → pyscf-2.9.0.dist-info}/WHEEL +2 -1
  68. {pyscf-2.8.0.dist-info → pyscf-2.9.0.dist-info/licenses}/NOTICE +2 -0
  69. {pyscf-2.8.0.dist-info → pyscf-2.9.0.dist-info/licenses}/LICENSE +0 -0
  70. {pyscf-2.8.0.dist-info → pyscf-2.9.0.dist-info}/top_level.txt +0 -0
pyscf/__init__.py CHANGED
@@ -35,7 +35,7 @@ to try out the package::
35
35
 
36
36
  '''
37
37
 
38
- __version__ = '2.8.0'
38
+ __version__ = '2.9.0'
39
39
 
40
40
  import os
41
41
  import sys
pyscf/cc/__init__.py CHANGED
@@ -120,15 +120,14 @@ RCCSD.__doc__ = ccsd.CCSD.__doc__
120
120
 
121
121
  def UCCSD(mf, frozen=None, mo_coeff=None, mo_occ=None):
122
122
  from pyscf.df.df_jk import _DFHF
123
+ from pyscf.cc import dfuccsd
123
124
 
124
125
  mf = mf.remove_soscf()
125
126
  if not mf.istype('UHF'):
126
127
  mf = mf.to_uhf()
127
128
 
128
129
  if isinstance(mf, _DFHF) and mf.with_df:
129
- # TODO: DF-UCCSD with memory-efficient particle-particle ladder,
130
- # similar to dfccsd.RCCSD
131
- return uccsd.UCCSD(mf, frozen, mo_coeff, mo_occ)
130
+ return dfuccsd.UCCSD(mf, frozen, mo_coeff, mo_occ)
132
131
  else:
133
132
  return uccsd.UCCSD(mf, frozen, mo_coeff, mo_occ)
134
133
  UCCSD.__doc__ = uccsd.UCCSD.__doc__
pyscf/cc/dfccsd.py CHANGED
@@ -51,7 +51,7 @@ class RCCSD(ccsd.CCSD):
51
51
  to_gpu = lib.to_gpu
52
52
 
53
53
 
54
- def _contract_vvvv_t2(mycc, mol, vvL, t2, out=None, verbose=None):
54
+ def _contract_vvvv_t2(mycc, mol, vvL, VVL, t2, out=None, verbose=None):
55
55
  '''Ht2 = numpy.einsum('ijcd,acdb->ijab', t2, vvvv)
56
56
 
57
57
  Args:
@@ -103,7 +103,7 @@ def _contract_vvvv_t2(mycc, mol, vvL, t2, out=None, verbose=None):
103
103
  ijL = vvL0[tril2sq[i0:i1,j0:j1] - off0].reshape(-1,naux)
104
104
  eri = numpy.ndarray(((i1-i0)*(j1-j0),nvir_pair), buffer=eribuf)
105
105
  for p0, p1 in lib.prange(0, nvir_pair, vvblk):
106
- vvL1 = _cp(vvL[p0:p1])
106
+ vvL1 = _cp(VVL[p0:p1])
107
107
  eri[:,p0:p1] = lib.ddot(ijL, vvL1.T)
108
108
  vvL1 = None
109
109
 
@@ -120,7 +120,7 @@ def _contract_vvvv_t2(mycc, mol, vvL, t2, out=None, verbose=None):
120
120
  class _ChemistsERIs(ccsd._ChemistsERIs):
121
121
  def _contract_vvvv_t2(self, mycc, t2, direct=False, out=None, verbose=None):
122
122
  assert (not direct)
123
- return _contract_vvvv_t2(mycc, self.mol, self.vvL, t2, out, verbose)
123
+ return _contract_vvvv_t2(mycc, self.mol, self.vvL, self.vvL, t2, out, verbose)
124
124
 
125
125
  def _make_df_eris(cc, mo_coeff=None):
126
126
  assert cc._scf.istype('RHF')
pyscf/cc/dfuccsd.py ADDED
@@ -0,0 +1,310 @@
1
+ #!/usr/bin/env python
2
+ # Copyright 2014-2025 The PySCF Developers. All Rights Reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+
17
+ import numpy as np
18
+ from pyscf import lib
19
+ from pyscf.lib import logger
20
+ from pyscf import df
21
+ from pyscf.cc import uccsd
22
+ from pyscf.cc import ccsd
23
+ from pyscf.cc import dfccsd
24
+ from pyscf import __config__
25
+
26
+ MEMORYMIN = getattr(__config__, 'cc_ccsd_memorymin', 2000)
27
+
28
+ class UCCSD(uccsd.UCCSD):
29
+ _keys = {'with_df'}
30
+
31
+ def __init__(self, mf, frozen=None, mo_coeff=None, mo_occ=None):
32
+ uccsd.UCCSD.__init__(self, mf, frozen, mo_coeff, mo_occ)
33
+ if getattr(mf, 'with_df', None):
34
+ self.with_df = mf.with_df
35
+ else:
36
+ self.with_df = df.DF(mf.mol)
37
+ self.with_df.auxbasis = df.make_auxbasis(mf.mol, mp2fit=True)
38
+
39
+ def reset(self, mol=None):
40
+ self.with_df.reset(mol)
41
+ return uccsd.UCCSD.reset(self, mol)
42
+
43
+ def ao2mo(self, mo_coeff=None):
44
+ return _make_df_eris(self, mo_coeff)
45
+
46
+ def _add_vvvv(self, t1, t2, eris, out=None, with_ovvv=False, t2sym=None):
47
+ assert (not self.direct)
48
+ return uccsd.UCCSD._add_vvvv(self, t1, t2, eris, out, with_ovvv, t2sym)
49
+
50
+ def _add_vvVV(self, t1, t2, eris, out=None):
51
+ assert (not self.direct)
52
+ return uccsd.UCCSD._add_vvVV(self, t1, t2, eris, out)
53
+
54
+ to_gpu = lib.to_gpu
55
+
56
+ class _ChemistsERIs(uccsd._ChemistsERIs):
57
+ def _contract_vvvv_t2(self, mycc, t2, direct=False, out=None, verbose=None):
58
+ assert (not direct)
59
+ return dfccsd._contract_vvvv_t2(mycc, self.mol, self.vvL, self.vvL, t2, out, verbose)
60
+ def _contract_VVVV_t2(self, mycc, t2, direct=False, out=None, verbose=None):
61
+ assert (not direct)
62
+ return dfccsd._contract_vvvv_t2(mycc, self.mol, self.VVL, self.VVL, t2, out, verbose)
63
+ def _contract_vvVV_t2(self, mycc, t2, direct=False, out=None, verbose=None):
64
+ assert (not direct)
65
+ return dfccsd._contract_vvvv_t2(mycc, self.mol, self.vvL, self.VVL, t2, out, verbose)
66
+
67
+ def _cp(a):
68
+ return np.asarray(a, order='C')
69
+
70
+ def _make_df_eris(mycc, mo_coeff=None):
71
+ assert mycc._scf.istype('UHF')
72
+ cput0 = (logger.process_clock(), logger.perf_counter())
73
+ log = logger.Logger(mycc.stdout, mycc.verbose)
74
+ eris = _ChemistsERIs()
75
+ eris._common_init_(mycc, mo_coeff)
76
+
77
+ moa, mob = eris.mo_coeff
78
+ nocca, noccb = eris.nocc
79
+ nao = moa.shape[0]
80
+ nmoa = moa.shape[1]
81
+ nmob = mob.shape[1]
82
+ nvira = nmoa - nocca
83
+ nvirb = nmob - noccb
84
+ nvira_pair = nvira * (nvira + 1) // 2
85
+ nvirb_pair = nvirb * (nvirb + 1) // 2
86
+ with_df = mycc.with_df
87
+ naux = eris.naux = with_df.get_naoaux()
88
+
89
+ # --- Three-center integrals
90
+ # (L|aa)
91
+ Loo = np.empty((naux, nocca, nocca))
92
+ Lov = np.empty((naux, nocca, nvira))
93
+ Lvo = np.empty((naux, nvira, nocca))
94
+ # (L|bb)
95
+ LOO = np.empty((naux, noccb, noccb))
96
+ LOV = np.empty((naux, noccb, nvirb))
97
+ LVO = np.empty((naux, nvirb, noccb))
98
+
99
+ # --- Four-center integrals
100
+ eris.feri = lib.H5TmpFile()
101
+ # (aa|aa)
102
+ eris.oooo = eris.feri.create_dataset('oooo', (nocca,nocca,nocca,nocca), 'f8')
103
+ eris.oovv = eris.feri.create_dataset('oovv', (nocca,nocca,nvira,nvira), 'f8', chunks=(nocca,nocca,1,nvira))
104
+ eris.ovoo = eris.feri.create_dataset('ovoo', (nocca,nvira,nocca,nocca), 'f8', chunks=(nocca,1,nocca,nocca))
105
+ eris.ovvo = eris.feri.create_dataset('ovvo', (nocca,nvira,nvira,nocca), 'f8', chunks=(nocca,1,nvira,nocca))
106
+ eris.ovov = eris.feri.create_dataset('ovov', (nocca,nvira,nocca,nvira), 'f8', chunks=(nocca,1,nocca,nvira))
107
+ # (bb|bb)
108
+ eris.OOOO = eris.feri.create_dataset('OOOO', (noccb,noccb,noccb,noccb), 'f8')
109
+ eris.OOVV = eris.feri.create_dataset('OOVV', (noccb,noccb,nvirb,nvirb), 'f8', chunks=(noccb,noccb,1,nvirb))
110
+ eris.OVOO = eris.feri.create_dataset('OVOO', (noccb,nvirb,noccb,noccb), 'f8', chunks=(noccb,1,noccb,noccb))
111
+ eris.OVVO = eris.feri.create_dataset('OVVO', (noccb,nvirb,nvirb,noccb), 'f8', chunks=(noccb,1,nvirb,noccb))
112
+ eris.OVOV = eris.feri.create_dataset('OVOV', (noccb,nvirb,noccb,nvirb), 'f8', chunks=(noccb,1,noccb,nvirb))
113
+ # (aa|bb)
114
+ eris.ooOO = eris.feri.create_dataset('ooOO', (nocca,nocca,noccb,noccb), 'f8')
115
+ eris.ooVV = eris.feri.create_dataset('ooVV', (nocca,nocca,nvirb,nvirb), 'f8', chunks=(nocca,nocca,1,nvirb))
116
+ eris.ovOO = eris.feri.create_dataset('ovOO', (nocca,nvira,noccb,noccb), 'f8', chunks=(nocca,1,noccb,noccb))
117
+ eris.ovVO = eris.feri.create_dataset('ovVO', (nocca,nvira,nvirb,noccb), 'f8', chunks=(nocca,1,nvirb,noccb))
118
+ eris.ovOV = eris.feri.create_dataset('ovOV', (nocca,nvira,noccb,nvirb), 'f8', chunks=(nocca,1,noccb,nvirb))
119
+ # (bb|aa)
120
+ eris.OOvv = eris.feri.create_dataset('OOvv', (noccb,noccb,nvira,nvira), 'f8', chunks=(noccb,noccb,1,nvira))
121
+ eris.OVoo = eris.feri.create_dataset('OVoo', (noccb,nvirb,nocca,nocca), 'f8', chunks=(noccb,1,nocca,nocca))
122
+ eris.OVvo = eris.feri.create_dataset('OVvo', (noccb,nvirb,nvira,nocca), 'f8', chunks=(noccb,1,nvira,nocca))
123
+
124
+ # nrow ~ 4e9/8/blockdim to ensure hdf5 chunk < 4GB
125
+ chunks = (min(nvira_pair, int(4e8 / with_df.blockdim)), min(naux, with_df.blockdim))
126
+ eris.vvL = eris.feri.create_dataset('vvL', (nvira_pair,naux), 'f8', chunks=chunks)
127
+ chunks = (min(nvirb_pair, int(4e8 / with_df.blockdim)), min(naux, with_df.blockdim))
128
+ eris.VVL = eris.feri.create_dataset('VVL', (nvirb_pair,naux), 'f8', chunks=chunks)
129
+
130
+ # Transform three-center integrals to MO basis
131
+ p1 = 0
132
+ for eri1 in with_df.loop():
133
+ eri1 = lib.unpack_tril(eri1).reshape(-1, nao, nao)
134
+ # (L|aa)
135
+ Lpq = lib.einsum('Lab,ap,bq->Lpq', eri1, moa, moa)
136
+ p0, p1 = p1, p1 + Lpq.shape[0]
137
+ blk = np.s_[p0:p1]
138
+ Loo[blk] = Lpq[:, :nocca, :nocca]
139
+ Lov[blk] = Lpq[:, :nocca, nocca:]
140
+ Lvo[blk] = Lpq[:, nocca:, :nocca]
141
+ eris.vvL[:, p0:p1] = lib.pack_tril(Lpq[:, nocca:, nocca:]).T
142
+ # (L|bb)
143
+ Lpq = None
144
+ Lpq = lib.einsum('Lab,ap,bq->Lpq', eri1, mob, mob)
145
+ LOO[blk] = Lpq[:, :noccb, :noccb]
146
+ LOV[blk] = Lpq[:, :noccb, noccb:]
147
+ LVO[blk] = Lpq[:, noccb:, :noccb]
148
+ eris.VVL[:, p0:p1] = lib.pack_tril(Lpq[:, noccb:, noccb:]).T
149
+ Lpq = None
150
+
151
+ Loo = Loo.reshape(naux, nocca * nocca)
152
+ Lov = Lov.reshape(naux, nocca * nvira)
153
+ Lvo = Lvo.reshape(naux, nocca * nvira)
154
+ LOO = LOO.reshape(naux, noccb * noccb)
155
+ LOV = LOV.reshape(naux, noccb * nvirb)
156
+ LVO = LVO.reshape(naux, noccb * nvirb)
157
+
158
+ eris.oooo[:] = lib.ddot(Loo.T, Loo).reshape(nocca,nocca,nocca,nocca)
159
+ eris.ovoo[:] = lib.ddot(Lov.T, Loo).reshape(nocca,nvira,nocca,nocca)
160
+ eris.ovvo[:] = lib.ddot(Lov.T, Lvo).reshape(nocca,nvira,nvira,nocca)
161
+ eris.ovov[:] = lib.ddot(Lov.T, Lov).reshape(nocca,nvira,nocca,nvira)
162
+
163
+ eris.OVoo[:] = lib.ddot(LOV.T, Loo).reshape(noccb,nvirb,nocca,nocca)
164
+ eris.OVvo[:] = lib.ddot(LOV.T, Lvo).reshape(noccb,nvirb,nvira,nocca)
165
+
166
+ Lvo = None
167
+
168
+ eris.OOOO[:] = lib.ddot(LOO.T, LOO).reshape(noccb,noccb,noccb,noccb)
169
+ eris.OVOO[:] = lib.ddot(LOV.T, LOO).reshape(noccb,nvirb,noccb,noccb)
170
+ eris.OVVO[:] = lib.ddot(LOV.T, LVO).reshape(noccb,nvirb,nvirb,noccb)
171
+ eris.OVOV[:] = lib.ddot(LOV.T, LOV).reshape(noccb,nvirb,noccb,nvirb)
172
+
173
+ eris.ooOO[:] = lib.ddot(Loo.T, LOO).reshape(nocca,nocca,noccb,noccb)
174
+ eris.ovOO[:] = lib.ddot(Lov.T, LOO).reshape(nocca,nvira,noccb,noccb)
175
+ eris.ovVO[:] = lib.ddot(Lov.T, LVO).reshape(nocca,nvira,nvirb,noccb)
176
+ eris.ovOV[:] = lib.ddot(Lov.T, LOV).reshape(nocca,nvira,noccb,nvirb)
177
+
178
+ LVO = None
179
+
180
+ mem_now = lib.current_memory()[0]
181
+ max_memory = max(0, mycc.max_memory - mem_now)
182
+
183
+ # eris.oovv
184
+ blksize = max(ccsd.BLKMIN, int((max_memory*.9e6/8-nocca**2*nvira_pair)/(nocca**2+naux)))
185
+ oovv_tril = np.empty((nocca * nocca, nvira_pair))
186
+ for p0, p1 in lib.prange(0, nvira_pair, blksize):
187
+ oovv_tril[:, p0:p1] = lib.ddot(Loo.T, _cp(eris.vvL[p0:p1]).T)
188
+ eris.oovv[:] = lib.unpack_tril(oovv_tril).reshape(nocca, nocca, nvira, nvira)
189
+ oovv_tril = None
190
+
191
+ # eris.ooVV
192
+ blksize = max(ccsd.BLKMIN, int((max_memory*.9e6/8-nocca**2*nvirb_pair)/(nocca**2+naux)))
193
+ oovv_tril = np.empty((nocca * nocca, nvirb_pair))
194
+ for p0, p1 in lib.prange(0, nvirb_pair, blksize):
195
+ oovv_tril[:, p0:p1] = lib.ddot(Loo.T, _cp(eris.VVL[p0:p1]).T)
196
+ eris.ooVV[:] = lib.unpack_tril(oovv_tril).reshape(nocca, nocca, nvirb, nvirb)
197
+ oovv_tril = Loo = None
198
+
199
+ mem_now = lib.current_memory()[0]
200
+ max_memory = max(0, mycc.max_memory - mem_now)
201
+
202
+ # eris.OOvv
203
+ blksize = max(ccsd.BLKMIN, int((max_memory*.9e6/8-noccb**2*nvira_pair)/(noccb**2+naux)))
204
+ oovv_tril = np.empty((noccb * noccb, nvira_pair))
205
+ for p0, p1 in lib.prange(0, nvira_pair, blksize):
206
+ oovv_tril[:, p0:p1] = lib.ddot(LOO.T, _cp(eris.vvL[p0:p1]).T)
207
+ eris.OOvv[:] = lib.unpack_tril(oovv_tril).reshape(noccb, noccb, nvira, nvira)
208
+ oovv_tril = None
209
+
210
+ # eris.OOVV
211
+ blksize = max(ccsd.BLKMIN, int((max_memory*.9e6/8-noccb**2*nvirb_pair)/(noccb**2+naux)))
212
+ oovv_tril = np.empty((noccb * noccb, nvirb_pair))
213
+ for p0, p1 in lib.prange(0, nvirb_pair, blksize):
214
+ oovv_tril[:, p0:p1] = lib.ddot(LOO.T, _cp(eris.VVL[p0:p1]).T)
215
+ eris.OOVV[:] = lib.unpack_tril(oovv_tril).reshape(noccb, noccb, nvirb, nvirb)
216
+ oovv_tril = LOO = None
217
+
218
+ mem_now = lib.current_memory()[0]
219
+ max_memory = max(0, mycc.max_memory - mem_now)
220
+
221
+ Lov = Lov.reshape(naux, nocca, nvira)
222
+ LOV = LOV.reshape(naux, noccb, nvirb)
223
+
224
+ # eris.ovvv
225
+ vblk = max(nocca, int((max_memory*.15e6/8)/(nocca*nvira_pair)))
226
+ vvblk = int(min(nvira_pair, 4e8/nocca, max(4, (max_memory*.8e6/8)/(vblk*nocca+naux))))
227
+ eris.ovvv = eris.feri.create_dataset('ovvv', (nocca, nvira, nvira_pair), 'f8', chunks=(nocca, 1, vvblk))
228
+ for q0, q1 in lib.prange(0, nvira_pair, vvblk):
229
+ vvL = _cp(eris.vvL[q0:q1])
230
+ for p0, p1 in lib.prange(0, nvira, vblk):
231
+ tmpLov = Lov[:, :, p0:p1].reshape(naux, -1)
232
+ eris.ovvv[:, p0:p1, q0:q1] = lib.ddot(tmpLov.T, vvL.T).reshape(nocca, p1 - p0, q1 - q0)
233
+ vvL = None
234
+
235
+ # eris.ovVV
236
+ vblk = max(nocca, int((max_memory*.15e6/8)/(nocca*nvirb_pair)))
237
+ vvblk = int(min(nvirb_pair, 4e8/nocca, max(4, (max_memory*.8e6/8)/(vblk*nocca+naux))))
238
+ eris.ovVV = eris.feri.create_dataset('ovVV', (nocca, nvira, nvirb_pair), 'f8', chunks=(nocca, 1, vvblk))
239
+ for q0, q1 in lib.prange(0, nvirb_pair, vvblk):
240
+ vvL = _cp(eris.VVL[q0:q1])
241
+ for p0, p1 in lib.prange(0, nvira, vblk):
242
+ tmpLov = Lov[:, :, p0:p1].reshape(naux, -1)
243
+ eris.ovVV[:, p0:p1, q0:q1] = lib.ddot(tmpLov.T, vvL.T).reshape(nocca, p1 - p0, q1 - q0)
244
+ vvL = None
245
+ Lov = None
246
+
247
+ mem_now = lib.current_memory()[0]
248
+ max_memory = max(0, mycc.max_memory - mem_now)
249
+
250
+ # eris.OVvv
251
+ vblk = max(noccb, int((max_memory*.15e6/8)/(noccb*nvira_pair)))
252
+ vvblk = int(min(nvira_pair, 4e8/noccb, max(4, (max_memory*.8e6/8)/(vblk*noccb+naux))))
253
+ eris.OVvv = eris.feri.create_dataset('OVvv', (noccb, nvirb, nvira_pair), 'f8', chunks=(noccb, 1, vvblk))
254
+ for q0, q1 in lib.prange(0, nvira_pair, vvblk):
255
+ vvL = _cp(eris.vvL[q0:q1])
256
+ for p0, p1 in lib.prange(0, nvirb, vblk):
257
+ tmpLov = LOV[:, :, p0:p1].reshape(naux, -1)
258
+ eris.OVvv[:, p0:p1, q0:q1] = lib.ddot(tmpLov.T, vvL.T).reshape(noccb, p1 - p0, q1 - q0)
259
+ vvL = None
260
+
261
+ # eris.OVVV
262
+ vblk = max(noccb, int((max_memory*.15e6/8)/(noccb*nvirb_pair)))
263
+ vvblk = int(min(nvirb_pair, 4e8/noccb, max(4, (max_memory*.8e6/8)/(vblk*noccb+naux))))
264
+ eris.OVVV = eris.feri.create_dataset('OVVV', (noccb, nvirb, nvirb_pair), 'f8', chunks=(noccb, 1, vvblk))
265
+ for q0, q1 in lib.prange(0, nvirb_pair, vvblk):
266
+ vvL = _cp(eris.VVL[q0:q1])
267
+ for p0, p1 in lib.prange(0, nvirb, vblk):
268
+ tmpLov = LOV[:, :, p0:p1].reshape(naux, -1)
269
+ eris.OVVV[:, p0:p1, q0:q1] = lib.ddot(tmpLov.T, vvL.T).reshape(noccb, p1 - p0, q1 - q0)
270
+ vvL = None
271
+ LOV = None
272
+
273
+ log.timer('DF-UCCSD integral transformation', *cput0)
274
+ return eris
275
+
276
+ if __name__ == '__main__':
277
+ from pyscf import gto
278
+ from pyscf import scf
279
+
280
+ mol = gto.Mole()
281
+ mol.atom = [
282
+ [8 , (0. , 0. , 0.)],
283
+ [1 , (0. , -0.757 , 0.587)],
284
+ [1 , (0. , 0.757 , 0.587)]]
285
+
286
+ mol.basis = 'cc-pvdz'
287
+ mol.build()
288
+ mf = scf.UHF(mol).density_fit('weigend').run()
289
+ mycc = UCCSD(mf).run()
290
+ print(mycc.e_corr - -0.2133709727796199)
291
+
292
+ print("IP energies... (right eigenvector)")
293
+ e,v = mycc.ipccsd(nroots=8)
294
+ print(e)
295
+ print(e[0] - 0.4336428577342009)
296
+ print(e[2] - 0.5188000951518845)
297
+ print(e[4] - 0.6785158684375829)
298
+
299
+ print("EA energies... (right eigenvector)")
300
+ e,v = mycc.eaccsd(nroots=8)
301
+ print(e)
302
+ print(e[0] - 0.1673013569134136)
303
+ print(e[2] - 0.2399984284491973)
304
+ print(e[4] - 0.5096018470162480)
305
+
306
+ e, v = mycc.eeccsd(nroots=4)
307
+ print(e[0] - 0.2757563806054133)
308
+ print(e[1] - 0.2757563806171079)
309
+ print(e[2] - 0.2757563806183815)
310
+ print(e[3] - 0.3006896721085447)
pyscf/cc/rccsd.py CHANGED
@@ -247,7 +247,11 @@ def _make_eris_incore(mycc, mo_coeff=None, ao2mofn=None):
247
247
  eri1 = ao2mofn(eris.mo_coeff).reshape([nmo]*4)
248
248
  else:
249
249
  eri1 = ao2mo.incore.full(mycc._scf._eri, eris.mo_coeff)
250
- eri1 = ao2mo.restore(1, eri1, nmo)
250
+ if mycc._scf._eri.size == nmo**4:
251
+ # The N^4-sized full integral tensor.
252
+ eri1 = eri1.reshape([nmo]*4)
253
+ else:
254
+ eri1 = ao2mo.restore(1, eri1, nmo)
251
255
  eris.oooo = eri1[:nocc,:nocc,:nocc,:nocc].copy()
252
256
  eris.ovoo = eri1[:nocc,nocc:,:nocc,:nocc].copy()
253
257
  eris.ovov = eri1[:nocc,nocc:,:nocc,nocc:].copy()
pyscf/cc/uccsd.py CHANGED
@@ -236,8 +236,8 @@ def update_amps(cc, t1, t2, eris):
236
236
  u1a -= np.einsum('imea,me->ia', t2aa, Fova)
237
237
  u1a += np.einsum('iMaE,ME->ia', t2ab, Fovb)
238
238
  u1b += fovb.conj()
239
- u1b += np.einsum('ie,ae->ia',t1b,Fvvb)
240
- u1b -= np.einsum('ma,mi->ia',t1b,Foob)
239
+ u1b += np.einsum('ie,ae->ia', t1b, Fvvb)
240
+ u1b -= np.einsum('ma,mi->ia', t1b, Foob)
241
241
  u1b -= np.einsum('imea,me->ia', t2bb, Fovb)
242
242
  u1b += np.einsum('mIeA,me->IA', t2ab, Fova)
243
243
 
@@ -246,8 +246,8 @@ def update_amps(cc, t1, t2, eris):
246
246
  wovvo -= eris_oovv.transpose(0,2,3,1)
247
247
  wovvo += eris_ovvo.transpose(0,2,1,3)
248
248
  oovv = eris_oovv - eris_ovvo.transpose(0,3,2,1)
249
- u1a-= np.einsum('nf,niaf->ia', t1a, oovv)
250
- tmp1aa = lib.einsum('ie,mjbe->mbij', t1a, oovv)
249
+ u1a-= np.einsum('nf,niaf->ia', t1a, oovv)
250
+ tmp1aa = lib.einsum('ie,mjbe->mbij', t1a, oovv)
251
251
  u2aa += 2*lib.einsum('ma,mbij->ijab', t1a, tmp1aa)
252
252
  eris_ovvo = eris_oovv = oovv = tmp1aa = None
253
253
 
@@ -256,8 +256,8 @@ def update_amps(cc, t1, t2, eris):
256
256
  wOVVO -= eris_OOVV.transpose(0,2,3,1)
257
257
  wOVVO += eris_OVVO.transpose(0,2,1,3)
258
258
  OOVV = eris_OOVV - eris_OVVO.transpose(0,3,2,1)
259
- u1b-= np.einsum('nf,niaf->ia', t1b, OOVV)
260
- tmp1bb = lib.einsum('ie,mjbe->mbij', t1b, OOVV)
259
+ u1b-= np.einsum('nf,niaf->ia', t1b, OOVV)
260
+ tmp1bb = lib.einsum('ie,mjbe->mbij', t1b, OOVV)
261
261
  u2bb += 2*lib.einsum('ma,mbij->ijab', t1b, tmp1bb)
262
262
  eris_OVVO = eris_OOVV = OOVV = None
263
263
 
@@ -356,16 +356,16 @@ def energy(cc, t1=None, t2=None, eris=None):
356
356
  fovb = eris.fockb[:noccb,noccb:]
357
357
  e = np.einsum('ia,ia', fova, t1a)
358
358
  e += np.einsum('ia,ia', fovb, t1b)
359
- e += 0.25*np.einsum('ijab,iajb',t2aa,eris_ovov)
360
- e -= 0.25*np.einsum('ijab,ibja',t2aa,eris_ovov)
361
- e += 0.25*np.einsum('ijab,iajb',t2bb,eris_OVOV)
362
- e -= 0.25*np.einsum('ijab,ibja',t2bb,eris_OVOV)
363
- e += np.einsum('iJaB,iaJB',t2ab,eris_ovOV)
364
- e += 0.5*np.einsum('ia,jb,iajb',t1a,t1a,eris_ovov)
365
- e -= 0.5*np.einsum('ia,jb,ibja',t1a,t1a,eris_ovov)
366
- e += 0.5*np.einsum('ia,jb,iajb',t1b,t1b,eris_OVOV)
367
- e -= 0.5*np.einsum('ia,jb,ibja',t1b,t1b,eris_OVOV)
368
- e += np.einsum('ia,jb,iajb',t1a,t1b,eris_ovOV)
359
+ e += 0.25*np.einsum('ijab,iajb',t2aa, eris_ovov)
360
+ e -= 0.25*np.einsum('ijab,ibja',t2aa, eris_ovov)
361
+ e += 0.25*np.einsum('ijab,iajb',t2bb, eris_OVOV)
362
+ e -= 0.25*np.einsum('ijab,ibja',t2bb, eris_OVOV)
363
+ e += np.einsum('iJaB,iaJB',t2ab, eris_ovOV)
364
+ e += 0.5*lib.einsum('ia,jb,iajb',t1a, t1a, eris_ovov)
365
+ e -= 0.5*lib.einsum('ia,jb,ibja',t1a, t1a, eris_ovov)
366
+ e += 0.5*lib.einsum('ia,jb,iajb',t1b, t1b, eris_OVOV)
367
+ e -= 0.5*lib.einsum('ia,jb,ibja',t1b, t1b, eris_OVOV)
368
+ e += lib.einsum('ia,jb,iajb',t1a, t1b, eris_ovOV)
369
369
  if abs(e.imag) > 1e-4:
370
370
  logger.warn(cc, 'Non-zero imaginary part found in UCCSD energy %s', e)
371
371
  return e.real
@@ -687,11 +687,10 @@ class UCCSD(ccsd.CCSDBase):
687
687
  return _make_eris_incore(self, mo_coeff)
688
688
 
689
689
  elif getattr(self._scf, 'with_df', None):
690
- # TODO: Uncomment once there is an unrestricted DF-CCSD implementation
691
- #logger.warn(self, 'UCCSD detected DF being used in the HF object. '
692
- # 'MO integrals are computed based on the DF 3-index tensors.\n'
693
- # 'It\'s recommended to use dfccsd.CCSD for the '
694
- # 'DF-CCSD calculations')
690
+ logger.warn(self, 'UCCSD detected DF being used in the HF object. '
691
+ 'MO integrals are computed based on the DF 3-index tensors.\n'
692
+ 'It\'s recommended to use dfuccsd.UCCSD for the '
693
+ 'DF-UCCSD calculations')
695
694
  return _make_df_eris_outcore(self, mo_coeff)
696
695
  else:
697
696
  return _make_eris_outcore(self, mo_coeff)
@@ -732,6 +731,16 @@ class UCCSD(ccsd.CCSDBase):
732
731
  from pyscf.cc import eom_uccsd
733
732
  return eom_uccsd.EOMEE(self)
734
733
 
734
+ def density_fit(self, auxbasis=None, with_df=None):
735
+ from pyscf.cc import dfuccsd
736
+ mycc = dfuccsd.UCCSD(self._scf, self.frozen, self.mo_coeff, self.mo_occ)
737
+ if with_df is not None:
738
+ mycc.with_df = with_df
739
+ if mycc.with_df.auxbasis != auxbasis:
740
+ mycc.with_df = mycc.with_df.copy()
741
+ mycc.with_df.auxbasis = auxbasis
742
+ return mycc
743
+
735
744
  def nuc_grad_method(self):
736
745
  from pyscf.grad import uccsd
737
746
  return uccsd.Gradients(self)
pyscf/df/addons.py CHANGED
@@ -52,8 +52,10 @@ DEFAULT_AUXBASIS = {
52
52
  'def2svp' : ('def2-svp-jkfit' , 'def2-svp-ri' ),
53
53
  'def2svpd' : ('def2-svp-jkfit' , 'def2-svpd-ri' ),
54
54
  'def2tzvp' : ('def2-tzvp-jkfit' , 'def2-tzvp-ri' ),
55
+ 'def2mtzvp' : ('def2-tzvp-jkfit' , 'def2-tzvp-ri' ),
55
56
  'def2tzvpd' : ('def2-tzvp-jkfit' , 'def2-tzvpd-ri' ),
56
57
  'def2tzvpp' : ('def2-tzvpp-jkfit' , 'def2-tzvpp-ri' ),
58
+ 'def2mtzvpp' : ('def2-tzvpp-jkfit' , 'def2-tzvpp-ri' ),
57
59
  'def2tzvppd' : ('def2-tzvpp-jkfit' , 'def2-tzvppd-ri' ),
58
60
  'def2qzvp' : ('def2-qzvp-jkfit' , 'def2-qzvp-ri' ),
59
61
  'def2qzvpd' : ('def2-qzvp-jkfit' , None ),
@@ -174,6 +176,9 @@ def make_auxbasis(mol, mp2fit=False):
174
176
  _basis = {a: default_basis for a in uniq_atoms}
175
177
  _basis.update(mol.basis)
176
178
  del (_basis['default'])
179
+ elif (isinstance(mol.basis, dict) and
180
+ all([isinstance(basis, str) for basis in mol.basis.values()])):
181
+ _basis = {a: mol.basis[a] for a in uniq_atoms}
177
182
  else:
178
183
  _basis = mol._basis or {}
179
184
 
@@ -191,7 +196,7 @@ def make_auxbasis(mol, mp2fit=False):
191
196
  if auxb is not None:
192
197
  try:
193
198
  # Test if basis auxb for element k is available
194
- gto.basis.load(auxb, k)
199
+ gto.basis.load(auxb, elements._std_symbol_without_ghost(k))
195
200
  except BasisNotFoundError:
196
201
  pass
197
202
  else:
pyscf/df/df_jk.py CHANGED
@@ -258,6 +258,33 @@ def get_jk(dfobj, dm, hermi=0, with_j=True, with_k=True, direct_scf_tol=1e-13):
258
258
  vj = 0
259
259
  vk = numpy.zeros_like(dms)
260
260
 
261
+ if numpy.iscomplexobj(dms):
262
+ if with_j:
263
+ vj = numpy.zeros_like(dms)
264
+ max_memory = dfobj.max_memory - lib.current_memory()[0]
265
+ blksize = max(4, int(min(dfobj.blockdim, max_memory*.22e6/8/nao**2)))
266
+ buf = numpy.empty((blksize,nao,nao))
267
+ buf1 = numpy.empty((nao,blksize,nao))
268
+ for eri1 in dfobj.loop(blksize):
269
+ naux, nao_pair = eri1.shape
270
+ eri1 = lib.unpack_tril(eri1, out=buf)
271
+ if with_j:
272
+ tmp = numpy.einsum('pij,nji->pn', eri1, dms.real)
273
+ vj.real += numpy.einsum('pn,pij->nij', tmp, eri1)
274
+ tmp = numpy.einsum('pij,nji->pn', eri1, dms.imag)
275
+ vj.imag += numpy.einsum('pn,pij->nij', tmp, eri1)
276
+ buf2 = numpy.ndarray((nao,naux,nao), buffer=buf1)
277
+ for k in range(nset):
278
+ buf2[:] = lib.einsum('pij,jk->ipk', eri1, dms[k].real)
279
+ vk[k].real += lib.einsum('ipk,pkj->ij', buf2, eri1)
280
+ buf2[:] = lib.einsum('pij,jk->ipk', eri1, dms[k].imag)
281
+ vk[k].imag += lib.einsum('ipk,pkj->ij', buf2, eri1)
282
+ t1 = log.timer_debug1('jk', *t1)
283
+ if with_j: vj = vj.reshape(dm_shape)
284
+ if with_k: vk = vk.reshape(dm_shape)
285
+ logger.timer(dfobj, 'df vj and vk', *t0)
286
+ return vj, vk
287
+
261
288
  if with_j:
262
289
  idx = numpy.arange(nao)
263
290
  dmtril = lib.pack_tril(dms + dms.conj().transpose(0,2,1))
@@ -322,6 +349,7 @@ def get_jk(dfobj, dm, hermi=0, with_j=True, with_k=True, direct_scf_tol=1e-13):
322
349
  buf = numpy.empty((2,blksize,nao,nao))
323
350
  for eri1 in dfobj.loop(blksize):
324
351
  naux, nao_pair = eri1.shape
352
+ assert (nao_pair == nao*(nao+1)//2)
325
353
  if with_j:
326
354
  # uses numpy.matmul
327
355
  vj += dmtril.dot(eri1.T).dot(eri1)
@@ -388,6 +416,7 @@ def get_j(dfobj, dm, hermi=0, direct_scf_tol=1e-13):
388
416
  opt = dfobj._vjopt
389
417
  fakemol = opt.fakemol
390
418
  dm = numpy.asarray(dm, order='C')
419
+ assert dm.dtype == numpy.float64
391
420
  dm_shape = dm.shape
392
421
  nao = dm_shape[-1]
393
422
  dm = dm.reshape(-1,nao,nao)
pyscf/df/hessian/uhf.py CHANGED
@@ -465,9 +465,9 @@ def _gen_jk(hessobj, mo_coeff, mo_occ, chkfile=None, atmlst=None,
465
465
  vj1_buf[i] += np.einsum('xp,pij->xij', wj1, coef3c)
466
466
  if with_k:
467
467
  rhok0_PlJ = lib.einsum('plj,Jj->plJ', rhok0a_Pl_[p0:p1], mocca)
468
- vk1a_buf += lib.einsum('xijp,plj->xil', int3c_ip1, rhok0_PlJ[p0:p1])
468
+ vk1a_buf += lib.einsum('xijp,plj->xil', int3c_ip1, rhok0_PlJ)
469
469
  rhok0_PlJ = lib.einsum('plj,Jj->plJ', rhok0b_Pl_[p0:p1], moccb)
470
- vk1b_buf += lib.einsum('xijp,plj->xil', int3c_ip1, rhok0_PlJ[p0:p1])
470
+ vk1b_buf += lib.einsum('xijp,plj->xil', int3c_ip1, rhok0_PlJ)
471
471
  int3c_ip1 = None
472
472
  vj1_buf = ftmp['vj1_buf'] = vj1_buf
473
473
 
pyscf/df/incore.py CHANGED
@@ -62,7 +62,7 @@ def aux_e2(mol, auxmol_or_auxbasis, intor='int3c2e', aosym='s1', comp=None, out=
62
62
  mol.nbas, mol.nbas+auxmol.nbas)
63
63
  else:
64
64
  assert len(shls_slice) == 6
65
- assert shls_slice[5] < auxmol.nbas
65
+ assert shls_slice[5] <= auxmol.nbas
66
66
  shls_slice = list(shls_slice)
67
67
  shls_slice[4] += mol.nbas
68
68
  shls_slice[5] += mol.nbas
pyscf/dft/libxc.py CHANGED
@@ -19,7 +19,7 @@
19
19
 
20
20
  '''
21
21
  XC functional, the interface to libxc
22
- (http://www.tddft.org/programs/octopus/wiki/index.php/Libxc)
22
+ (https://libxc.gitlab.io)
23
23
  '''
24
24
 
25
25
  import sys
pyscf/fci/fci_dhf_slow.py CHANGED
@@ -76,7 +76,7 @@ def kernel(h1e, eri, norb, nelec, ecore=0, nroots=1, verbose=3):
76
76
 
77
77
 
78
78
  # dm_pq = <|p^+ q|>
79
- def make_rdm1(fcivec, norb, nelec, link_index=None):
79
+ def make_rdm1_slow(fcivec, norb, nelec, link_index=None):
80
80
  if link_index is None:
81
81
  link_index = cistring.gen_linkstr_index(range(norb), nelec)
82
82
  rdm1 = numpy.zeros((norb, norb), dtype=fcivec.dtype)
@@ -85,6 +85,20 @@ def make_rdm1(fcivec, norb, nelec, link_index=None):
85
85
  rdm1[a, i] += sign * numpy.dot(fcivec[str1].conj(), fcivec[str0])
86
86
  return rdm1
87
87
 
88
+
89
+ # dm_pq = <|p^+ q|>
90
+ def make_rdm1(fcivec, norb, nelec, link_index=None):
91
+ if nelec == 0:
92
+ return numpy.zeros((norb, norb), dtype=fcivec.dtype)
93
+ nd = cistring.num_strings(norb, nelec - 1)
94
+ index_d = cistring.gen_des_str_index(range(norb), nelec)
95
+ dci = numpy.zeros((nd, norb), dtype=fcivec.dtype)
96
+ for str0, tab in enumerate(index_d):
97
+ for _, i, str1, sign in tab:
98
+ dci[str1, i] += sign * fcivec[str0]
99
+ return dci.conj().T @ dci
100
+
101
+
88
102
  # dm_pq,rs = <|p^+ q r^+ s|>
89
103
  def make_rdm12(fcivec, norb, nelec, link_index=None, reorder=True):
90
104
  if link_index is None:
pyscf/grad/sacasscf.py CHANGED
@@ -444,6 +444,8 @@ class Gradients (lagrange.Gradients):
444
444
  self.e_states = np.asarray (mc.e_tot)
445
445
  if isinstance (mc, StateAverageMCSCFSolver):
446
446
  self.weights = np.asarray (mc.weights)
447
+ if np.amax (self.weights) - np.amin (self.weights) > 1e-8:
448
+ raise NotImplementedError ("Unequal weights in SA-CASSCF gradients")
447
449
  assert (len (self.weights) == self.nroots), '{} {} {}'.format (
448
450
  mc.fcisolver.__class__, self.weights, self.nroots)
449
451
  lagrange.Gradients.__init__(self, mc, self.ngorb+self.nci)