1#!/usr/bin/env python
2# Copyright 2014-2018 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
16import unittest
17import copy
18import numpy
19import scipy.linalg
20
21from pyscf import gto, lib
22from pyscf import scf, dft
23from pyscf.scf import addons
24
25mol = gto.Mole()
26mol.verbose = 7
27mol.output = '/dev/null'
28mol.atom = [
29    ["O" , (0. , 0.     , 0.)],
30    [1   , (0. , -0.757 , 0.587)],
31    [1   , (0. , 0.757  , 0.587)] ]
32
33mol.basis = {"H": '6-31g',
34             "O": '6-31g',}
35mol.build()
36mf = scf.RHF(mol).run()
37
38mol_dz = mol.copy()
39mol_dz.basis = 'cc-pvdz'
40mol_dz.cart = True
41mol_dz.build(False, False)
42
43mol1 = mol.copy()
44mol1.spin = 2
45mf_u = scf.UHF(mol1).run()
46
47mol2 = mol.copy()
48mol2.symmetry = True
49mol2.build(0,0)
50sym_mf = scf.RHF(mol2).run()
51
52mol3 = mol1.copy()
53mol3.symmetry = True
54mol3.spin = 2
55mol3.build(0,0)
56sym_mf_u = scf.UHF(mol3).run()
57
58def tearDownModule():
59    global mol, mf, mol_dz, mol1, mf_u, mol2, sym_mf, mol3, sym_mf_u
60    mol.stdout.close()
61    del mol, mf, mol_dz, mol1, mf_u, mol2, sym_mf, mol3, sym_mf_u
62
63
64class KnownValues(unittest.TestCase):
65    def test_project_mo_nr2nr(self):
66        nao = mol.nao_nr()
67        c = numpy.random.random((nao,nao))
68        c1 = addons.project_mo_nr2nr(mol, c, mol)
69        self.assertAlmostEqual(abs(c-c1).max(), 0, 12)
70
71        numpy.random.seed(15)
72        nao = mol.nao_nr()
73        mo1 = numpy.random.random((nao,nao))
74        mo2 = addons.project_mo_nr2nr(mol, [mo1,mo1], mol_dz)
75        self.assertAlmostEqual(abs(mo2[0]).sum(), 83.436359425591888, 11)
76        self.assertAlmostEqual(abs(mo2[1]).sum(), 83.436359425591888, 11)
77
78    def test_project_mo_r2r(self):
79        nao = mol.nao_2c()
80        c = numpy.random.random((nao*2,nao*2))
81        c = c + numpy.sin(c)*1j
82        c1 = addons.project_mo_r2r(mol, c, mol)
83        self.assertAlmostEqual(abs(c-c1).max(), 0, 12)
84
85        numpy.random.seed(15)
86        n2c = mol.nao_2c()
87        n4c = n2c * 2
88        mo1 = numpy.random.random((n4c,n4c)) + numpy.random.random((n4c,n4c))*1j
89        mo2 = addons.project_mo_r2r(mol, [mo1,mo1], mol_dz)
90        self.assertAlmostEqual(abs(mo2[0]).sum(), 2159.3715489514038, 11)
91        self.assertAlmostEqual(abs(mo2[1]).sum(), 2159.3715489514038, 11)
92
93    def test_project_mo_nr2r(self):
94        numpy.random.seed(15)
95        nao = mol.nao_nr()
96        mo1 = numpy.random.random((nao,nao))
97        mo2 = addons.project_mo_nr2r(mol, [mo1,mo1], mol_dz)
98        self.assertAlmostEqual(abs(mo2[0]).sum(), 172.66468850263556, 11)
99        self.assertAlmostEqual(abs(mo2[1]).sum(), 172.66468850263556, 11)
100
101        mo2 = addons.project_mo_nr2r(mol, mo1, mol_dz)
102        self.assertAlmostEqual(abs(mo2).sum(), 172.66468850263556, 11)
103
104    def test_project_dm_nr2nr(self):
105        nao = mol.nao_nr()
106        dm = numpy.random.random((nao,nao))
107        dm = dm + dm.T
108        x1 = addons.project_dm_nr2nr(mol, dm, mol)
109        self.assertAlmostEqual(abs(dm-x1).max(), 0, 12)
110
111        numpy.random.seed(15)
112        mo = numpy.random.random((nao,10))
113        mo1 = addons.project_mo_nr2nr(mol, mo, mol_dz)
114        dm = numpy.dot(mo, mo.T)
115        dmref = numpy.dot(mo1, mo1.T)
116        dm1 = addons.project_dm_nr2nr(mol, [dm,dm], mol_dz)
117
118        self.assertAlmostEqual(abs(dmref-dm1[0]).max(), 0, 11)
119        self.assertAlmostEqual(abs(dmref-dm1[1]).max(), 0, 11)
120        self.assertAlmostEqual(lib.finger(dm1[0]), 73.603267455214876, 11)
121
122    def test_project_dm_r2r(self):
123        nao = mol.nao_2c()
124        dm = numpy.random.random((nao*2,nao*2))
125        dm = dm + numpy.sin(dm)*1j
126        x1 = addons.project_dm_r2r(mol, dm, mol)
127        self.assertTrue(numpy.allclose(dm, x1))
128
129        numpy.random.seed(15)
130        n2c = mol.nao_2c()
131        n4c = n2c * 2
132        mo = numpy.random.random((n4c,10)) + numpy.random.random((n4c,10))*1j
133        mo1 = addons.project_mo_r2r(mol, mo, mol_dz)
134        dm = numpy.dot(mo, mo.T.conj())
135        dmref = numpy.dot(mo1, mo1.T.conj())
136        dm1 = addons.project_dm_r2r(mol, [dm,dm], mol_dz)
137
138        self.assertAlmostEqual(abs(dmref-dm1[0]).max(), 0, 11)
139        self.assertAlmostEqual(abs(dmref-dm1[1]).max(), 0, 11)
140        self.assertAlmostEqual(lib.finger(dm1[0]), -5.3701392643370607+15.484616570244016j, 11)
141
142    def test_project_dm_nr2r(self):
143        numpy.random.seed(15)
144        nao = mol.nao_nr()
145        mo = numpy.random.random((nao,10))
146        mo1 = addons.project_mo_nr2r(mol, mo, mol_dz)
147        dm = numpy.dot(mo, mo.T.conj())
148        dmref = numpy.dot(mo1, mo1.T.conj())
149        dm1 = addons.project_dm_nr2r(mol, [dm,dm], mol_dz)
150
151        self.assertAlmostEqual(abs(dmref-dm1[0]).max(), 0, 11)
152        self.assertAlmostEqual(abs(dmref-dm1[1]).max(), 0, 11)
153        self.assertAlmostEqual(lib.finger(dm1[0]), -13.580612999088892-20.209297457056557j, 11)
154
155        dm1 = addons.project_dm_nr2r(mol, dm, mol_dz)
156        self.assertAlmostEqual(abs(dmref-dm1).max(), 0, 11)
157
158    def test_frac_occ(self):
159        mol = gto.Mole()
160        mol.verbose = 5
161        mol.output = '/dev/null'
162        mol.atom = '''
163            7      0.   0  -0.7
164            7      0.   0   0.7'''
165        mol.basis = 'cc-pvdz'
166        mol.charge = 2
167        mol.build()
168        mf = scf.RHF(mol)
169        mf = addons.frac_occ(mf)
170        self.assertAlmostEqual(mf.scf(), -107.13465364012296, 9)
171
172        mol.charge = -1
173        mol.spin = 1
174        mf = scf.RHF(mol)
175        mf = addons.frac_occ(mf)
176        self.assertAlmostEqual(mf.scf(), -108.3626325837689, 9)
177
178        mol.charge = 1
179        mol.spin = 1
180        mf = scf.rhf.RHF(mol)
181        mf = addons.frac_occ(mf)
182        self.assertAlmostEqual(mf.scf(), -108.10375514714799, 9)
183
184        mol.charge = 1
185        mol.spin = 1
186        mf = scf.UHF(mol)
187        mf = addons.frac_occ(mf)
188        self.assertAlmostEqual(mf.scf(), -108.17458104180083, 9)
189
190        mol.charge = 0
191        mol.spin = 0
192        mf = scf.RHF(mol)
193        mf = addons.frac_occ(mf)
194        self.assertAlmostEqual(mf.scf(), -108.76171800006837, 9)
195        self.assertTrue(numpy.allclose(mf.mo_occ[:7], [2,2,2,2,2,2,2]))
196        mol.stdout.close()
197
198    def test_dynamic_occ(self):
199        mol = gto.Mole()
200        mol.verbose = 5
201        mol.output = '/dev/null'
202        mol.atom = '''
203            6      0.   0  -0.7
204            6      0.   0   0.7'''
205        mol.basis = 'cc-pvdz'
206        mol.charge = 2
207        mol.build()
208        mf = scf.RHF(mol)
209        mf = addons.dynamic_occ(mf)
210        self.assertAlmostEqual(mf.scf(), -74.214503776693817, 9)
211        mol.stdout.close()
212
213    def test_follow_state(self):
214        mf1 = addons.follow_state(mf).run()
215        self.assertAlmostEqual(mf1.e_tot, mf.e_tot, 9)
216
217        mo0 = mf.mo_coeff[:,[0,1,2,3,5]]
218        mf1 = addons.follow_state(mf, mo0)
219        self.assertAlmostEqual(mf1.scf(), -75.178145727548511, 9)
220        self.assertTrue(numpy.allclose(mf1.mo_occ[:6], [2,2,2,2,0,2]))
221
222    def test_float_occ(self):
223        mol = gto.Mole()
224        mol.verbose = 5
225        mol.output = '/dev/null'
226        mol.atom = '''
227            C      0.   0   0'''
228        mol.basis = 'cc-pvdz'
229        mol.build()
230        mf = scf.UHF(mol)
231        mf = addons.float_occ(mf)
232        self.assertAlmostEqual(mf.scf(), -37.590712883365917, 9)
233        mol.stdout.close()
234
235    def test_mom_occ(self):
236        mf = dft.UKS(mol)
237        mf.xc = 'b3lyp'
238        mf.scf()
239        mo0 = mf.mo_coeff
240        occ = mf.mo_occ
241        occ[0][4] = 0.
242        occ[0][5] = 1.
243        mf = addons.mom_occ(mf, mo0, occ)
244        dm = mf.make_rdm1(mo0, occ)
245        self.assertAlmostEqual(mf.scf(dm), -76.0606858747, 9)
246        self.assertTrue(numpy.allclose(mf.mo_occ[0][:6], [1,1,1,1,0,1]))
247
248        mf = scf.ROHF(mol).run()
249        mo0 = mf.mo_coeff
250        occ = mf.mo_occ
251        setocc = numpy.zeros((2, occ.size))
252        setocc[:, occ==2] = 1
253        setocc[0][4] = 0
254        setocc[0][5] = 1
255        newocc = setocc[0][:] + setocc[1][:]
256        mf = addons.mom_occ(mf, mo0, setocc)
257        dm = mf.make_rdm1(mo0, newocc)
258        mf.kernel(dm)
259        self.assertAlmostEqual(mf.e_tot, -75.723654936331542, 9)
260        self.assertTrue(numpy.allclose(mf.mo_occ[:6], [2,2,2,2,1,1]))
261
262    def test_dynamic_level_shift(self):
263        mf = scf.RHF(mol)
264        mf = addons.dynamic_level_shift(mf)
265        mf.init_guess = 'hcore'
266        mf.max_cycle = 4
267        mf.kernel()
268        self.assertAlmostEqual(mf.e_tot, -75.868344714445342, 9)
269
270    def test_convert_to_scf(self):
271        from pyscf.x2c import x2c
272        from pyscf.df import df_jk
273        from pyscf.soscf import newton_ah
274        addons.convert_to_rhf(dft.RKS(mol))
275        addons.convert_to_uhf(dft.RKS(mol))
276        addons.convert_to_ghf(dft.RKS(mol))
277        addons.convert_to_rhf(dft.UKS(mol))
278        addons.convert_to_uhf(dft.UKS(mol))
279        addons.convert_to_ghf(dft.UKS(mol))
280        #addons.convert_to_rhf(dft.GKS(mol))
281        #addons.convert_to_uhf(dft.GKS(mol))
282        addons.convert_to_ghf(dft.GKS(mol))
283
284        self.assertTrue(isinstance(addons.convert_to_rhf(mf), scf.rhf.RHF))
285        self.assertTrue(isinstance(addons.convert_to_uhf(mf), scf.uhf.UHF))
286        self.assertTrue(isinstance(addons.convert_to_ghf(mf), scf.ghf.GHF))
287        self.assertTrue(isinstance(addons.convert_to_rhf(scf.UHF(mol)), scf.rhf.RHF))
288        self.assertTrue(isinstance(addons.convert_to_rhf(mf_u), scf.rohf.ROHF))
289        self.assertTrue(isinstance(addons.convert_to_uhf(mf_u), scf.uhf.UHF))
290        self.assertTrue(isinstance(addons.convert_to_ghf(mf_u), scf.ghf.GHF))
291        self.assertTrue(isinstance(addons.convert_to_rhf(sym_mf), scf.hf_symm.RHF))
292        self.assertTrue(isinstance(addons.convert_to_uhf(sym_mf), scf.uhf_symm.UHF))
293        self.assertTrue(isinstance(addons.convert_to_ghf(sym_mf), scf.ghf_symm.GHF))
294        self.assertTrue(isinstance(addons.convert_to_rhf(sym_mf_u), scf.hf_symm.ROHF))
295        self.assertTrue(isinstance(addons.convert_to_uhf(sym_mf_u), scf.uhf_symm.UHF))
296        self.assertTrue(isinstance(addons.convert_to_ghf(sym_mf_u), scf.ghf_symm.GHF))
297
298        mf1 = copy.copy(mf)
299        self.assertTrue(isinstance(mf1.convert_from_(mf), scf.rhf.RHF))
300        self.assertTrue(isinstance(mf1.convert_from_(mf_u), scf.rhf.RHF))
301        self.assertFalse(isinstance(mf1.convert_from_(mf_u), scf.rohf.ROHF))
302        self.assertTrue(isinstance(mf1.convert_from_(sym_mf), scf.rhf.RHF))
303        self.assertTrue(isinstance(mf1.convert_from_(sym_mf_u), scf.rhf.RHF))
304        self.assertFalse(isinstance(mf1.convert_from_(sym_mf_u), scf.rohf.ROHF))
305        self.assertFalse(isinstance(mf1.convert_from_(sym_mf), scf.hf_symm.RHF))
306        self.assertFalse(isinstance(mf1.convert_from_(sym_mf_u), scf.hf_symm.RHF))
307        mf1 = copy.copy(mf_u)
308        self.assertTrue(isinstance(mf1.convert_from_(mf), scf.uhf.UHF))
309        self.assertTrue(isinstance(mf1.convert_from_(mf_u), scf.uhf.UHF))
310        self.assertTrue(isinstance(mf1.convert_from_(sym_mf), scf.uhf.UHF))
311        self.assertTrue(isinstance(mf1.convert_from_(sym_mf_u), scf.uhf.UHF))
312        self.assertFalse(isinstance(mf1.convert_from_(sym_mf), scf.uhf_symm.UHF))
313        self.assertFalse(isinstance(mf1.convert_from_(sym_mf_u), scf.uhf_symm.UHF))
314        mf1 = scf.GHF(mol)
315        self.assertTrue(isinstance(mf1.convert_from_(mf), scf.ghf.GHF))
316        self.assertTrue(isinstance(mf1.convert_from_(mf_u), scf.ghf.GHF))
317        self.assertTrue(isinstance(mf1.convert_from_(sym_mf), scf.ghf.GHF))
318        self.assertTrue(isinstance(mf1.convert_from_(sym_mf_u), scf.ghf.GHF))
319        self.assertFalse(isinstance(mf1.convert_from_(sym_mf), scf.ghf_symm.GHF))
320        self.assertFalse(isinstance(mf1.convert_from_(sym_mf_u), scf.ghf_symm.GHF))
321
322        self.assertTrue(isinstance(addons.convert_to_rhf(scf.RHF(mol).density_fit(), remove_df=False), df_jk._DFHF))
323        self.assertTrue(isinstance(addons.convert_to_uhf(scf.RHF(mol).density_fit(), remove_df=False), df_jk._DFHF))
324        self.assertTrue(isinstance(addons.convert_to_ghf(scf.RHF(mol).density_fit(), remove_df=False), df_jk._DFHF))
325        self.assertTrue(isinstance(addons.convert_to_rhf(scf.UHF(mol).density_fit(), remove_df=False), df_jk._DFHF))
326        self.assertTrue(isinstance(addons.convert_to_uhf(scf.UHF(mol).density_fit(), remove_df=False), df_jk._DFHF))
327        self.assertTrue(isinstance(addons.convert_to_ghf(scf.UHF(mol).density_fit(), remove_df=False), df_jk._DFHF))
328        #self.assertTrue(isinstance(addons.convert_to_rhf(scf.GHF(mol).density_fit(), remove_df=False),df_jk. _DFHF))
329        #self.assertTrue(isinstance(addons.convert_to_uhf(scf.GHF(mol).density_fit(), remove_df=False),df_jk. _DFHF))
330        self.assertTrue(isinstance(addons.convert_to_ghf(scf.GHF(mol).density_fit(), remove_df=False), df_jk._DFHF))
331        self.assertFalse(isinstance(addons.convert_to_rhf(scf.RHF(mol).density_fit(), out=scf.RHF(mol), remove_df=False), df_jk._DFHF))
332        self.assertFalse(isinstance(addons.convert_to_uhf(scf.RHF(mol).density_fit(), out=scf.UHF(mol), remove_df=False), df_jk._DFHF))
333        self.assertFalse(isinstance(addons.convert_to_ghf(scf.RHF(mol).density_fit(), out=scf.GHF(mol), remove_df=False), df_jk._DFHF))
334        self.assertFalse(isinstance(addons.convert_to_rhf(scf.UHF(mol).density_fit(), out=scf.RHF(mol), remove_df=False), df_jk._DFHF))
335        self.assertFalse(isinstance(addons.convert_to_uhf(scf.UHF(mol).density_fit(), out=scf.UHF(mol), remove_df=False), df_jk._DFHF))
336        self.assertFalse(isinstance(addons.convert_to_ghf(scf.UHF(mol).density_fit(), out=scf.GHF(mol), remove_df=False), df_jk._DFHF))
337        #self.assertFalse(isinstance(addons.convert_to_rhf(scf.GHF(mol).density_fit(), out=scf.RHF(mol), remove_df=False),df_jk. _DFHF))
338        #self.assertFalse(isinstance(addons.convert_to_uhf(scf.GHF(mol).density_fit(), out=scf.UHF(mol), remove_df=False),df_jk. _DFHF))
339        self.assertFalse(isinstance(addons.convert_to_ghf(scf.GHF(mol).density_fit(), out=scf.GHF(mol), remove_df=False), df_jk._DFHF))
340        self.assertFalse(isinstance(addons.convert_to_rhf(scf.RHF(mol).density_fit(), out=scf.RHF(mol), remove_df=True), df_jk._DFHF))
341        self.assertFalse(isinstance(addons.convert_to_uhf(scf.RHF(mol).density_fit(), out=scf.UHF(mol), remove_df=True), df_jk._DFHF))
342        self.assertFalse(isinstance(addons.convert_to_ghf(scf.RHF(mol).density_fit(), out=scf.GHF(mol), remove_df=True), df_jk._DFHF))
343        self.assertFalse(isinstance(addons.convert_to_rhf(scf.UHF(mol).density_fit(), out=scf.RHF(mol), remove_df=True), df_jk._DFHF))
344        self.assertFalse(isinstance(addons.convert_to_uhf(scf.UHF(mol).density_fit(), out=scf.UHF(mol), remove_df=True), df_jk._DFHF))
345        self.assertFalse(isinstance(addons.convert_to_ghf(scf.UHF(mol).density_fit(), out=scf.GHF(mol), remove_df=True), df_jk._DFHF))
346        #self.assertFalse(isinstance(addons.convert_to_rhf(scf.GHF(mol).density_fit(), out=scf.RHF(mol), remove_df=True),df_jk. _DFHF))
347        #self.assertFalse(isinstance(addons.convert_to_uhf(scf.GHF(mol).density_fit(), out=scf.UHF(mol), remove_df=True),df_jk. _DFHF))
348        self.assertFalse(isinstance(addons.convert_to_ghf(scf.GHF(mol).density_fit(), out=scf.GHF(mol), remove_df=True), df_jk._DFHF))
349
350        addons.convert_to_rhf(scf.RHF(mol).x2c().density_fit())
351        addons.convert_to_uhf(scf.RHF(mol).x2c().density_fit())
352        addons.convert_to_ghf(scf.RHF(mol).x2c().density_fit())
353        addons.convert_to_rhf(scf.UHF(mol).x2c().density_fit())
354        addons.convert_to_uhf(scf.UHF(mol).x2c().density_fit())
355        addons.convert_to_ghf(scf.UHF(mol).x2c().density_fit())
356        #addons.convert_to_rhf(scf.GHF(mol).x2c().density_fit())
357        #addons.convert_to_uhf(scf.GHF(mol).x2c().density_fit())
358        addons.convert_to_ghf(scf.GHF(mol).x2c().density_fit())
359
360        self.assertFalse(isinstance(addons.convert_to_rhf(scf.RHF(mol).x2c().newton().density_fit()), newton_ah._CIAH_SOSCF))
361        self.assertFalse(isinstance(addons.convert_to_uhf(scf.RHF(mol).x2c().newton().density_fit()), newton_ah._CIAH_SOSCF))
362        self.assertFalse(isinstance(addons.convert_to_ghf(scf.RHF(mol).x2c().newton().density_fit()), newton_ah._CIAH_SOSCF))
363        self.assertFalse(isinstance(addons.convert_to_rhf(scf.UHF(mol).x2c().newton().density_fit()), newton_ah._CIAH_SOSCF))
364        self.assertFalse(isinstance(addons.convert_to_uhf(scf.UHF(mol).x2c().newton().density_fit()), newton_ah._CIAH_SOSCF))
365        self.assertFalse(isinstance(addons.convert_to_ghf(scf.UHF(mol).x2c().newton().density_fit()), newton_ah._CIAH_SOSCF))
366        #self.assertFalse(isinstance(addons.convert_to_rhf(scf.GHF(mol).x2c().newton().density_fit()), newton_ah._CIAH_SOSCF))
367        #self.assertFalse(isinstance(addons.convert_to_uhf(scf.GHF(mol).x2c().newton().density_fit()), newton_ah._CIAH_SOSCF))
368        self.assertFalse(isinstance(addons.convert_to_ghf(scf.GHF(mol).x2c().newton().density_fit()), newton_ah._CIAH_SOSCF))
369
370        self.assertFalse(isinstance(addons.convert_to_rhf(scf.RHF(mol).newton().density_fit()), df_jk._DFHF))
371        self.assertFalse(isinstance(addons.convert_to_uhf(scf.RHF(mol).newton().density_fit()), df_jk._DFHF))
372        self.assertFalse(isinstance(addons.convert_to_ghf(scf.RHF(mol).newton().density_fit()), df_jk._DFHF))
373        self.assertFalse(isinstance(addons.convert_to_rhf(scf.UHF(mol).newton().density_fit()), df_jk._DFHF))
374        self.assertFalse(isinstance(addons.convert_to_uhf(scf.UHF(mol).newton().density_fit()), df_jk._DFHF))
375        self.assertFalse(isinstance(addons.convert_to_ghf(scf.UHF(mol).newton().density_fit()), df_jk._DFHF))
376        #self.assertFalse(isinstance(addons.convert_to_rhf(scf.GHF(mol).newton().density_fit()), df_jk._DFHF))
377        #self.assertFalse(isinstance(addons.convert_to_uhf(scf.GHF(mol).newton().density_fit()), df_jk._DFHF))
378        self.assertFalse(isinstance(addons.convert_to_ghf(scf.GHF(mol).newton().density_fit()), df_jk._DFHF))
379
380        self.assertTrue(isinstance(addons.convert_to_rhf(scf.RHF(mol).density_fit().newton()), df_jk._DFHF))
381        self.assertTrue(isinstance(addons.convert_to_uhf(scf.RHF(mol).density_fit().newton()), df_jk._DFHF))
382        self.assertTrue(isinstance(addons.convert_to_ghf(scf.RHF(mol).density_fit().newton()), df_jk._DFHF))
383        self.assertTrue(isinstance(addons.convert_to_rhf(scf.UHF(mol).density_fit().newton()), df_jk._DFHF))
384        self.assertTrue(isinstance(addons.convert_to_uhf(scf.UHF(mol).density_fit().newton()), df_jk._DFHF))
385        self.assertTrue(isinstance(addons.convert_to_ghf(scf.UHF(mol).density_fit().newton()), df_jk._DFHF))
386        #self.assertTrue(isinstance(addons.convert_to_rhf(scf.GHF(mol).density_fit().newton()), df_jk._DFHF))
387        #self.assertTrue(isinstance(addons.convert_to_uhf(scf.GHF(mol).density_fit().newton()), df_jk._DFHF))
388        self.assertTrue(isinstance(addons.convert_to_ghf(scf.GHF(mol).density_fit().newton()), df_jk._DFHF))
389
390    def test_get_ghf_orbspin(self):
391        orbspin = addons.get_ghf_orbspin(mf.mo_energy, mf.mo_occ)
392        self.assertEqual(list(orbspin), [0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1])
393
394        orbspin = addons.get_ghf_orbspin(mf_u.mo_energy, mf_u.mo_occ, is_rhf=False)
395        self.assertEqual(list(orbspin), [0,1,0,1,0,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,1,0,1])
396
397    def test_remove_lindep(self):
398        mol = gto.M(verbose = 0,
399                    atom = [('H', 0, 0, i*.5) for i in range(4)],
400                    basis = ('sto-3g',[[0, [.002,1]]]))
401        mf = addons.remove_linear_dep_(scf.RHF(mol), threshold=1e-8,
402                                       lindep=1e-9).run()
403        self.assertAlmostEqual(mf.e_tot, -1.6291001503057689, 7)
404
405if __name__ == "__main__":
406    print("Full Tests for addons")
407    unittest.main()
408
409