From d57d3f1d6563318505d827dda615157009bfe0b1 Mon Sep 17 00:00:00 2001 From: Conrad Johnston Date: Wed, 6 Nov 2024 19:49:25 -0800 Subject: [PATCH] Release upper version limit on PySCF To enable check-pointing of the state of a converged calculation, Sebastiaan rolled some custom serialization with Dill. This worked until some data structures were changed in PySCF around v2.4, breaking this functionality. This forced an upper version limit on PySCF. Recently, in PySCF v2.7, serialization via Pickle is natively supported. This commit removes the upper version constraints on PySCF by making the needed changes to the templates and parser, and regenerating the reference file for the tests. Other versions were also bumped, where appropriate. --- pyproject.toml | 12 ++++++------ .../calculations/templates/results.py.j2 | 9 +++------ src/aiida_pyscf/parsers/base.py | 6 +++--- .../test_base/test_checkpoint.pyr | 10 +++------- tests/calculations/test_base/test_default.pyr | 10 +++------- .../test_parameters_cubegen_parameters0_.pyr | 10 +++------- .../test_parameters_cubegen_parameters1_.pyr | 10 +++------- .../test_parameters_cubegen_parameters2_.pyr | 10 +++------- .../test_parameters_cubegen_parameters3_.pyr | 10 +++------- .../test_base/test_parameters_fcidump.pyr | 10 +++------- .../test_base/test_parameters_hessian.pyr | 10 +++------- .../test_base/test_parameters_mean_field.pyr | 10 +++------- ...arameters_mean_field_localize_orbitals.pyr | 10 +++------- .../test_base/test_parameters_optimizer.pyr | 10 +++------- .../test_parameters_pickle_model.pyr | 3 +-- .../test_base/test_parameters_structure.pyr | 10 +++------- .../fixtures/base/model_valid/aiida.out | 6 +++--- .../fixtures/base/model_valid/model.pickle | Bin 16009 -> 16158 bytes .../fixtures/base/model_valid/results.json | 2 +- .../test_pyscf_base_geometry_optimization.csv | 18 +++++++++--------- .../test_pyscf_base_mean_field.csv | 12 ++++++------ 21 files changed, 68 insertions(+), 120 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f10e4d0..9a63ce3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,8 @@ requires = ['flit_core>=3.4,<4'] [project] authors = [ {name = 'Sebastiaan P. Huber', email = 'mail@sphuber.net'}, - {name = 'Adam Grofe', email = 'v-adamgrofe@microsoft.com'} + {name = 'Adam Grofe', email = 'adamgrofe@microsoft.com'}, + {name = 'Conrad Johnston', email = 'conrad.johnston@microsoft.com'} ] classifiers = [ 'Development Status :: 3 - Alpha', @@ -20,19 +21,18 @@ classifiers = [ 'Topic :: Scientific/Engineering' ] dependencies = [ - 'aiida-core[atomic_tools]~=2.5', + 'aiida-core[atomic_tools]~=2.6', 'aiida-shell>=0.5.3', - 'dill', 'numpy', 'pint', - 'pyscf[geomopt]~=2.2,<2.4' + 'pyscf[geomopt] ~= 2.7' ] dynamic = ['description', 'version'] keywords = ['aiida', 'workflows', 'pyscf'] license = {file = 'LICENSE.txt'} name = 'aiida-pyscf' readme = 'README.md' -requires-python = '>=3.9' +requires-python = '>=3.9,<3.12' [project.entry-points.'aiida.calculations'] 'pyscf.base' = 'aiida_pyscf.calculations.base:PyscfCalculation' @@ -51,7 +51,7 @@ pre-commit = [ tests = [ 'packaging', 'pgtest~=1.3,>=1.3.1', - 'pytest~=7.2', + 'pytest~=8.3', 'pytest-regressions' ] diff --git a/src/aiida_pyscf/calculations/templates/results.py.j2 b/src/aiida_pyscf/calculations/templates/results.py.j2 index a9a70f8..024efd3 100644 --- a/src/aiida_pyscf/calculations/templates/results.py.j2 +++ b/src/aiida_pyscf/calculations/templates/results.py.j2 @@ -1,7 +1,7 @@ # Section: Results def write_results_and_exit(results): - import dill import json + import pickle import sys results['timings']['total'] = time.perf_counter() - time_start @@ -11,11 +11,8 @@ def write_results_and_exit(results): {% if results.pickle_model %} with open('{{ results.filename_model }}', 'wb') as handle: - # Need to unset the ``_chkfile`` attribute as it contains an open file handle which cannot be unpickled. - mean_field_run._chkfile = None - # Need to unset the ``opt`` attribute as it contains ctypes objects containing pointers which cannot be pickled. - mean_field_run.opt = None - dill.dump(mean_field_run, handle) + pickle.dump(mean_field_run, handle) + {% endif %} sys.exit(0) diff --git a/src/aiida_pyscf/parsers/base.py b/src/aiida_pyscf/parsers/base.py index ec57dce..d7d72ea 100644 --- a/src/aiida_pyscf/parsers/base.py +++ b/src/aiida_pyscf/parsers/base.py @@ -4,8 +4,8 @@ import json import pathlib +import pickle -import dill import numpy from aiida.engine import ExitCode from aiida.orm import ArrayData, Dict, FolderData, SinglefileData, TrajectoryData @@ -54,11 +54,11 @@ def parse(self, retrieved_temporary_folder: str | None = None, **kwargs): # noq try: with retrieved.open(PyscfCalculation.FILENAME_MODEL, 'rb') as handle: - model = dill.load(handle) + model = pickle.load(handle) except FileNotFoundError: if parameters.get('results', {}).get('pickle_model', True): self.logger.warning(f'The pickled model file `{PyscfCalculation.FILENAME_MODEL}` could not be read.') - except dill.UnpicklingError: + except pickle.UnpicklingError: self.logger.warning(f'The pickled model file `{PyscfCalculation.FILENAME_MODEL}` could not be unpickled.') else: self.out('model', PickledData(model)) diff --git a/tests/calculations/test_base/test_checkpoint.pyr b/tests/calculations/test_base/test_checkpoint.pyr index af93197..84105bd 100644 --- a/tests/calculations/test_base/test_checkpoint.pyr +++ b/tests/calculations/test_base/test_checkpoint.pyr @@ -14,8 +14,8 @@ def main(): # Section: Results def write_results_and_exit(results): - import dill import json + import pickle import sys results['timings']['total'] = time.perf_counter() - time_start @@ -24,14 +24,10 @@ def main(): json.dump(results, handle) with open('model.pickle', 'wb') as handle: - # Need to unset the ``_chkfile`` attribute as it contains an open file handle which cannot be unpickled. - mean_field_run._chkfile = None - # Need to unset the ``opt`` attribute as it contains ctypes objects containing pointers which cannot be pickled. - mean_field_run.opt = None - dill.dump(mean_field_run, handle) + pickle.dump(mean_field_run, handle) - sys.exit(0) + sys.exit(0) # Section: Structure definition from pyscf import gto structure = gto.Mole() diff --git a/tests/calculations/test_base/test_default.pyr b/tests/calculations/test_base/test_default.pyr index 448ce84..65b6942 100644 --- a/tests/calculations/test_base/test_default.pyr +++ b/tests/calculations/test_base/test_default.pyr @@ -14,8 +14,8 @@ def main(): # Section: Results def write_results_and_exit(results): - import dill import json + import pickle import sys results['timings']['total'] = time.perf_counter() - time_start @@ -24,14 +24,10 @@ def main(): json.dump(results, handle) with open('model.pickle', 'wb') as handle: - # Need to unset the ``_chkfile`` attribute as it contains an open file handle which cannot be unpickled. - mean_field_run._chkfile = None - # Need to unset the ``opt`` attribute as it contains ctypes objects containing pointers which cannot be pickled. - mean_field_run.opt = None - dill.dump(mean_field_run, handle) + pickle.dump(mean_field_run, handle) - sys.exit(0) + sys.exit(0) # Section: Structure definition from pyscf import gto structure = gto.Mole() diff --git a/tests/calculations/test_base/test_parameters_cubegen_parameters0_.pyr b/tests/calculations/test_base/test_parameters_cubegen_parameters0_.pyr index 65f8683..68ffdff 100644 --- a/tests/calculations/test_base/test_parameters_cubegen_parameters0_.pyr +++ b/tests/calculations/test_base/test_parameters_cubegen_parameters0_.pyr @@ -14,8 +14,8 @@ def main(): # Section: Results def write_results_and_exit(results): - import dill import json + import pickle import sys results['timings']['total'] = time.perf_counter() - time_start @@ -24,14 +24,10 @@ def main(): json.dump(results, handle) with open('model.pickle', 'wb') as handle: - # Need to unset the ``_chkfile`` attribute as it contains an open file handle which cannot be unpickled. - mean_field_run._chkfile = None - # Need to unset the ``opt`` attribute as it contains ctypes objects containing pointers which cannot be pickled. - mean_field_run.opt = None - dill.dump(mean_field_run, handle) + pickle.dump(mean_field_run, handle) - sys.exit(0) + sys.exit(0) # Section: Structure definition from pyscf import gto structure = gto.Mole() diff --git a/tests/calculations/test_base/test_parameters_cubegen_parameters1_.pyr b/tests/calculations/test_base/test_parameters_cubegen_parameters1_.pyr index 4c53af2..2657a5b 100644 --- a/tests/calculations/test_base/test_parameters_cubegen_parameters1_.pyr +++ b/tests/calculations/test_base/test_parameters_cubegen_parameters1_.pyr @@ -14,8 +14,8 @@ def main(): # Section: Results def write_results_and_exit(results): - import dill import json + import pickle import sys results['timings']['total'] = time.perf_counter() - time_start @@ -24,14 +24,10 @@ def main(): json.dump(results, handle) with open('model.pickle', 'wb') as handle: - # Need to unset the ``_chkfile`` attribute as it contains an open file handle which cannot be unpickled. - mean_field_run._chkfile = None - # Need to unset the ``opt`` attribute as it contains ctypes objects containing pointers which cannot be pickled. - mean_field_run.opt = None - dill.dump(mean_field_run, handle) + pickle.dump(mean_field_run, handle) - sys.exit(0) + sys.exit(0) # Section: Structure definition from pyscf import gto structure = gto.Mole() diff --git a/tests/calculations/test_base/test_parameters_cubegen_parameters2_.pyr b/tests/calculations/test_base/test_parameters_cubegen_parameters2_.pyr index ee5ee85..3d7edbd 100644 --- a/tests/calculations/test_base/test_parameters_cubegen_parameters2_.pyr +++ b/tests/calculations/test_base/test_parameters_cubegen_parameters2_.pyr @@ -14,8 +14,8 @@ def main(): # Section: Results def write_results_and_exit(results): - import dill import json + import pickle import sys results['timings']['total'] = time.perf_counter() - time_start @@ -24,14 +24,10 @@ def main(): json.dump(results, handle) with open('model.pickle', 'wb') as handle: - # Need to unset the ``_chkfile`` attribute as it contains an open file handle which cannot be unpickled. - mean_field_run._chkfile = None - # Need to unset the ``opt`` attribute as it contains ctypes objects containing pointers which cannot be pickled. - mean_field_run.opt = None - dill.dump(mean_field_run, handle) + pickle.dump(mean_field_run, handle) - sys.exit(0) + sys.exit(0) # Section: Structure definition from pyscf import gto structure = gto.Mole() diff --git a/tests/calculations/test_base/test_parameters_cubegen_parameters3_.pyr b/tests/calculations/test_base/test_parameters_cubegen_parameters3_.pyr index 0024f46..e118d7e 100644 --- a/tests/calculations/test_base/test_parameters_cubegen_parameters3_.pyr +++ b/tests/calculations/test_base/test_parameters_cubegen_parameters3_.pyr @@ -14,8 +14,8 @@ def main(): # Section: Results def write_results_and_exit(results): - import dill import json + import pickle import sys results['timings']['total'] = time.perf_counter() - time_start @@ -24,14 +24,10 @@ def main(): json.dump(results, handle) with open('model.pickle', 'wb') as handle: - # Need to unset the ``_chkfile`` attribute as it contains an open file handle which cannot be unpickled. - mean_field_run._chkfile = None - # Need to unset the ``opt`` attribute as it contains ctypes objects containing pointers which cannot be pickled. - mean_field_run.opt = None - dill.dump(mean_field_run, handle) + pickle.dump(mean_field_run, handle) - sys.exit(0) + sys.exit(0) # Section: Structure definition from pyscf import gto structure = gto.Mole() diff --git a/tests/calculations/test_base/test_parameters_fcidump.pyr b/tests/calculations/test_base/test_parameters_fcidump.pyr index c8862c3..23bef76 100644 --- a/tests/calculations/test_base/test_parameters_fcidump.pyr +++ b/tests/calculations/test_base/test_parameters_fcidump.pyr @@ -14,8 +14,8 @@ def main(): # Section: Results def write_results_and_exit(results): - import dill import json + import pickle import sys results['timings']['total'] = time.perf_counter() - time_start @@ -24,14 +24,10 @@ def main(): json.dump(results, handle) with open('model.pickle', 'wb') as handle: - # Need to unset the ``_chkfile`` attribute as it contains an open file handle which cannot be unpickled. - mean_field_run._chkfile = None - # Need to unset the ``opt`` attribute as it contains ctypes objects containing pointers which cannot be pickled. - mean_field_run.opt = None - dill.dump(mean_field_run, handle) + pickle.dump(mean_field_run, handle) - sys.exit(0) + sys.exit(0) # Section: Structure definition from pyscf import gto structure = gto.Mole() diff --git a/tests/calculations/test_base/test_parameters_hessian.pyr b/tests/calculations/test_base/test_parameters_hessian.pyr index 0bd2703..1afbac2 100644 --- a/tests/calculations/test_base/test_parameters_hessian.pyr +++ b/tests/calculations/test_base/test_parameters_hessian.pyr @@ -14,8 +14,8 @@ def main(): # Section: Results def write_results_and_exit(results): - import dill import json + import pickle import sys results['timings']['total'] = time.perf_counter() - time_start @@ -24,14 +24,10 @@ def main(): json.dump(results, handle) with open('model.pickle', 'wb') as handle: - # Need to unset the ``_chkfile`` attribute as it contains an open file handle which cannot be unpickled. - mean_field_run._chkfile = None - # Need to unset the ``opt`` attribute as it contains ctypes objects containing pointers which cannot be pickled. - mean_field_run.opt = None - dill.dump(mean_field_run, handle) + pickle.dump(mean_field_run, handle) - sys.exit(0) + sys.exit(0) # Section: Structure definition from pyscf import gto structure = gto.Mole() diff --git a/tests/calculations/test_base/test_parameters_mean_field.pyr b/tests/calculations/test_base/test_parameters_mean_field.pyr index 99b622d..fc5fe88 100644 --- a/tests/calculations/test_base/test_parameters_mean_field.pyr +++ b/tests/calculations/test_base/test_parameters_mean_field.pyr @@ -14,8 +14,8 @@ def main(): # Section: Results def write_results_and_exit(results): - import dill import json + import pickle import sys results['timings']['total'] = time.perf_counter() - time_start @@ -24,14 +24,10 @@ def main(): json.dump(results, handle) with open('model.pickle', 'wb') as handle: - # Need to unset the ``_chkfile`` attribute as it contains an open file handle which cannot be unpickled. - mean_field_run._chkfile = None - # Need to unset the ``opt`` attribute as it contains ctypes objects containing pointers which cannot be pickled. - mean_field_run.opt = None - dill.dump(mean_field_run, handle) + pickle.dump(mean_field_run, handle) - sys.exit(0) + sys.exit(0) # Section: Structure definition from pyscf import gto structure = gto.Mole() diff --git a/tests/calculations/test_base/test_parameters_mean_field_localize_orbitals.pyr b/tests/calculations/test_base/test_parameters_mean_field_localize_orbitals.pyr index 060da34..6d35fd6 100644 --- a/tests/calculations/test_base/test_parameters_mean_field_localize_orbitals.pyr +++ b/tests/calculations/test_base/test_parameters_mean_field_localize_orbitals.pyr @@ -14,8 +14,8 @@ def main(): # Section: Results def write_results_and_exit(results): - import dill import json + import pickle import sys results['timings']['total'] = time.perf_counter() - time_start @@ -24,14 +24,10 @@ def main(): json.dump(results, handle) with open('model.pickle', 'wb') as handle: - # Need to unset the ``_chkfile`` attribute as it contains an open file handle which cannot be unpickled. - mean_field_run._chkfile = None - # Need to unset the ``opt`` attribute as it contains ctypes objects containing pointers which cannot be pickled. - mean_field_run.opt = None - dill.dump(mean_field_run, handle) + pickle.dump(mean_field_run, handle) - sys.exit(0) + sys.exit(0) # Section: Structure definition from pyscf import gto structure = gto.Mole() diff --git a/tests/calculations/test_base/test_parameters_optimizer.pyr b/tests/calculations/test_base/test_parameters_optimizer.pyr index b8ea31c..4871c94 100644 --- a/tests/calculations/test_base/test_parameters_optimizer.pyr +++ b/tests/calculations/test_base/test_parameters_optimizer.pyr @@ -14,8 +14,8 @@ def main(): # Section: Results def write_results_and_exit(results): - import dill import json + import pickle import sys results['timings']['total'] = time.perf_counter() - time_start @@ -24,14 +24,10 @@ def main(): json.dump(results, handle) with open('model.pickle', 'wb') as handle: - # Need to unset the ``_chkfile`` attribute as it contains an open file handle which cannot be unpickled. - mean_field_run._chkfile = None - # Need to unset the ``opt`` attribute as it contains ctypes objects containing pointers which cannot be pickled. - mean_field_run.opt = None - dill.dump(mean_field_run, handle) + pickle.dump(mean_field_run, handle) - sys.exit(0) + sys.exit(0) # Section: Structure definition from pyscf import gto structure = gto.Mole() diff --git a/tests/calculations/test_base/test_parameters_pickle_model.pyr b/tests/calculations/test_base/test_parameters_pickle_model.pyr index 7f03730..cbc8558 100644 --- a/tests/calculations/test_base/test_parameters_pickle_model.pyr +++ b/tests/calculations/test_base/test_parameters_pickle_model.pyr @@ -14,8 +14,8 @@ def main(): # Section: Results def write_results_and_exit(results): - import dill import json + import pickle import sys results['timings']['total'] = time.perf_counter() - time_start @@ -25,7 +25,6 @@ def main(): sys.exit(0) - # Section: Structure definition from pyscf import gto structure = gto.Mole() diff --git a/tests/calculations/test_base/test_parameters_structure.pyr b/tests/calculations/test_base/test_parameters_structure.pyr index d1107c8..cd7eb84 100644 --- a/tests/calculations/test_base/test_parameters_structure.pyr +++ b/tests/calculations/test_base/test_parameters_structure.pyr @@ -14,8 +14,8 @@ def main(): # Section: Results def write_results_and_exit(results): - import dill import json + import pickle import sys results['timings']['total'] = time.perf_counter() - time_start @@ -24,14 +24,10 @@ def main(): json.dump(results, handle) with open('model.pickle', 'wb') as handle: - # Need to unset the ``_chkfile`` attribute as it contains an open file handle which cannot be unpickled. - mean_field_run._chkfile = None - # Need to unset the ``opt`` attribute as it contains ctypes objects containing pointers which cannot be pickled. - mean_field_run.opt = None - dill.dump(mean_field_run, handle) + pickle.dump(mean_field_run, handle) - sys.exit(0) + sys.exit(0) # Section: Structure definition from pyscf import gto structure = gto.Mole() diff --git a/tests/parsers/fixtures/base/model_valid/aiida.out b/tests/parsers/fixtures/base/model_valid/aiida.out index df54e87..b1d53b7 100644 --- a/tests/parsers/fixtures/base/model_valid/aiida.out +++ b/tests/parsers/fixtures/base/model_valid/aiida.out @@ -1,6 +1,6 @@ -converged SCF energy = -107.500603311882 +converged SCF energy = -107.882375574486 --------------- RHF gradients --------------- x y z -0 N -0.0000000000 -0.0000000000 -0.0139867876 -1 N 0.0000000000 0.0000000000 0.0139867876 +0 N -1.6236784581 0.0000000000 0.0000000000 +1 N 1.6236784581 -0.0000000000 -0.0000000000 ---------------------------------------------- diff --git a/tests/parsers/fixtures/base/model_valid/model.pickle b/tests/parsers/fixtures/base/model_valid/model.pickle index 8ac4c8ddcdbb812d66c68a733ce17681291a9fd5..d0dbaa125c94274359022b168aeebec6cea105e7 100644 GIT binary patch literal 16158 zcmd_RcT`l*w(pCQ!GHl26hx4q0(PLA&;^SuS)yc+oO4c+bA~2L&Ot;FQK4iZU>382 z0VIhipeU$_qIb2h&)L6y&$w^AH|~G02XwJ&&Z<@QtvPFT`>~=K@^>M0e_!cad_w*0 zog`?#E>6^RdINPeY994)3^kG}nojTO?Lkf7w(jB_;4Oh&J5tjbbZEt2FVkceI=XNH z+W>D*0a<~*qc`IJmEJ@I#P|j5Z2evR|Bl$f(TO1L zALQfkx85tz-qYIwGlWNCUXJ!YG@tNDS`*CVE6x|7rX8`K|Z%KhJO7w*LN~^TTTYF^7Mj-+$WvYkrt80yd6bL9~^`(g2(4|K&IQ z|8svN2{Ks*FC|TsB9diDcjVN=AktB}Kv}MjNW6grpQEj1-APCP?8hvHuRABqb>=Ekh*WF*&7iBr;Zs z4VaACrD)y+61FH<&f+8pm>QBqY;?rGeM=ItQAm=>Se+D}h>1#@C>A{gOiURfkwB1= z#N?FzyCT?ZvGtXb!b#&dCXXj#v&2-F!djDMa8m0*Xz#PJqtGs${k#Kxylg!kX&aR? zp0-T|c>DaV{qGtZ|4>g)8*e{XXROXE(8Gfk%zx`_LmX+F)4%Gx96cQE1N^+b{=LqY zwh8{r!x7szu}f(zu4to|!UV#^plyxoyQhVKE;fdLric}7S6Q$BKZURr&F}Aa`FAf5 z$6C-fTTCsBe}=U*=|EX&30~5r8dc zfM1{^=IZa`N((VeGXZ-STR&%7^wKT@yfSCr?+1yRi|=$I;*EQwjn$EIfqiyIlTfseL^Mdz5N^|JOe!fTy6dQY_a++Hhzxw z-d_ILZS4cFk2vX!e;ujm%w7)bE_qZfx&*57COc{p)qpChwMk1ff$Fj&ozWp6)Q9$| zD1Eb&G&Lo8-AbRn2~c%)bv6HBufK0vbOBVm6eWdCbaZBVF$-HNj`ba3y0wD=E7_eE zUVlBhhz`97%Q;H@gzg%>%J@!n7*)K1hKxi$LyvBhu@S;bd~E}0@J2aZeQ+zO=PIf@ z*2-efbQ>|P+8d$h@Bqon6uLiHJBpNSlm{P#&u9p~LBuyoVuJj$&=V8L)Q{atYylI< z;zl`T>E7@qe*#J7Z}d59GlgVql=&i6xmgZ#h>^X-X4QA|NX$lghrLD7Ec+AkZKEtc zdN`Bf{ROES|49yB_<|JKT{;ou{1u7A?;g9D$)J$DQR?V2cWC4=DClmK^9-wE0+2yr zVWU*8HvMLKi$P(Vf`cdhCPoF$jdI7aV|jH#j0#jt$#fQMRqeeUot&sH94@}nn-owO;MsF(9x+qUexDp`GgGPHgl?2KScymPB_OHzkFH=+UqQy8aQHr zhTQku{EpxPKC8{NSp?f4#Jfjd)|N1%_JRV%@6yar|0QXXcwZs1J?CW>F)9`P^i{wy zr7{RT_r_^5;NTL4$?nb;mdPVfHM%7z2P7bGbF!^W0_8wj(feN>D?U*4W9g3_xneNG z=tn@PWdJxm`h@K0?u&Svo$N1ProfUD=O{BrPoq0TfMz+H9qjbZS+fbW2M407Owm`S zh_Pgi!OJBz=vrZN^+=KVp^KrZ>vc}?5n(~&|5kM61TE?=AjC|`E`qQtAM-7=2m5uD&$YH*5lFIED){KdeD565p>WQ)(uHYn8(eOHllBr3TdvH5ZT!@#pfv`~qK zuIN$<%DtyO%$I=yOx|fZN@+KQFK28l?-S1VG8m(3E?_M zIvkx|fS%!X&JljX1;Xs#x0+5_fsA_s^%poEqx@H7By#huK#c7Ul|vRaV8U`!d?TYT zVEZus%R{pXK0zhqH$N^wdK3-{Xbky+Rb1Y8!+{!f<+3R6q31>5THTQ4C+;G6ZEcT1 z@?=FYMpde0O9VdjMV#Tp0o2ZI{)5OSD(K7j;`p)hA<}H;C1Lq41w3)cowQ>O29&gB zv*@a`sLfBOR3B12DBY_#lzjIx@@7yYaBl3TJQvIO{?0cp$m^$%ecXGeko$Hv!Wl=e zqmPCb)tKXR5lTko9<7IT@T1=$i^gdU=wr&bce;B7S?Mt&^A4#((UeJpw}aU*`n=u+ z5m`0J_L3suzf=hDg~P6%*L#qg><(l2Oe@GjxA5ZgmRl%2cm1b(qj3;d=t}6ll?Z(A z+mDU(HEL5nXHZrX*V}n&4^mgJjCQH9CRfPSqH8`9ch1Sg zB3I2;BEH2ydz2R9L41Wh?4Oe`vL3EM1=MOFRBr z9eia4#kn*dU5q~setS*1f9p?04#>_I>owiPbk=x+5CDuit0H!r66 za{$uOa`&fD9`LCz@w4=pLVmB*f7$L&1$l-g2?%d0w7kwxRl08xDXb=1Ym(1EYjPPm z)*u3@IlE;fU923EmbXzWc}~N;lMgz`H_m}W{Z1cWOy+^;i@g}${9}SN{1Ro_R0H9 z8bH{J>Eq|c`A|pg2V59;M=!&>(_+Te;JKljF-L76_+o02RG#gJ`iK8~9scVQ*ljFk zT-2U`Ec-?F73XKehhF-pYkE2WXC(iMWqczL?Fm65Ypb9&dzW{)uP?Iw6#v=Up)`2r z%i&7ZUCrRTpO~;LTn6|3PT*IHtfhQATfZ1}Vlyld?hG2L&Vo*&B@9`{ zS#aRXFuS`=ER0vnelI#%0DL!e+%ZaRbyF#WzkEAN>hI)1n++YE+~-x_-|>aGPgEH< zl>#vEQ{H2&!47*CdbpK< z$)zSm0vaC%7ttBrENyZ>Am#F znIjW3DCk?umzvXiucLIKJ7zcUtwN$4Nsm5pOrU4dVt?ZLsc`ivYxBqPF!0!AWiV;{ z3zEhC=luJtHo#!BveA*!a+s&TZ8yDzCjbHB(oEGkaO9WBT>ZOFv`U_->w>2(sOi33 z-^|mGsH?t#72CXl=V!-olbsPzJu!f&Em(>+E*-P##w7z;*0uw3){RJev%UWniB9=< zDfjwfl>^bE027vK49rm+n z_mIq)5AN^GV<1z~O+!!DM402&cvR3l5|G31?tOkP285@)@ex(Kj&v}Ie>fW*10V3< zUd4JmMlC-|9xB-u1G|n7N!mtv0UNXCW8&54kw0a-qpdAXz({7!ty2#my6Cc}_)vaB zkNrg2Go7bI*fV13U-6_8ZVrLZ3eaL8x5IaHu|z&RD>YbFC^doJpufB4wPO*qt%bFF zkA%bF-e9Hoj~0={+Ozp@ca=leOh#wk*&^f>$Blzlew7d%w;8TYN{06)CCBB*nnC7* zb|C-NV(>P}x6&f-x#O|0q8OR2|s&L@qE7@=SOq8K&j}Z!JDkgJX|- z+WH!mb@hwj(daK}zogB<%XB%J{pr=p6NR;vzWmY5OB>VhebF z@aRzJzGnD+ymn-MxB*#Z$M0C_&xA|NzOI^&Tfo<+%i!Iq%fNgxPeod`8fNJQ?)bh| zMfs8QxO@8ZTF)u=!>Ly9Q{jh4gS#W^(;%ah+A?EM7$7|hpdJ_~hOHYqhA+&%p|h`q z_ntXlGWnGPUu@{eXTPI&0hbQ#7OEB=W)^@kmEWB%Pn;onLs#=@bjX4QcxWm$)I#0ZF{MD#WI@%Orpo!j)A zdM9%rn`e;bC%Pyg^j!5~*YO~5W3#s(~Nv0%Ycn#Dc?_{fyG@;(Nk87&fP}f1z}rUCk_B2?C{&+lBDMp1^9yTw=AU zB+M`ot~^Pnf!NJtrEe2AfpGx*uis74VIn@&O%v* zL3XSy>s6{Qq>tkDwM~?TQ65@}{iz;+cNkGC9Lj^1e(miz@fc`rWo7BysST>0%Q(Zl z>j+5#4=U3WKoh@f|Kq)Zu;hxO4?}k(U~irA_L(n$y88y=CnFZoo49?i7~85q{(u_O z4~|gCD+~r_8nVF<|5|uvW&uSNH$ZlWp-Sih*3x$1;WA6Ts0W zy5Z#>JAnMS@>_wZ249Ij7T`P`0(7lk1g0xDg6%@rVtV`1VXSoGC8VMYa>F5}?rSkf z^kk8F5nl{=g-ae*_0EOcuQjYKu?B&p&AUHu?k)x|-ah1xO2)pYHXOVZ;@=5Dqq^&U zqe5WaR^P_d+X%yQFDlSntaL zH}uAN11=3B0>Z|pd$^ilkkt3d+L0v0V$KrLI}{AU&W-;le_jb%@fw>;k`~cXpI-vw z717}6qhZt0EI*{4sxbSIwYZo2-9Dpv$c7m9eE1Zbl7;a9<~9E45`ckNdVN5J#4_?_S8a*?`Rt&alRV}NT=Sum@8Jn+CXh;g2ah19VhLX2#u zphN$hxL-gj(xzq}k$AuaCioW6=N~+c8dop7gukc+Zj*BF(@xdEE(2dvaaA|Oeu#5l z>OdYmu=HniB3TFN>zHse+LA=+)y%36yZ5w5p;ejf2Gt$T-oPy#MEqb2*Sk+Ym=xh| z{hx9=Ta1DIMjos7b_cp{O@u4q33G8uXMoE_9uIvxV0@OR9Qa>ej9mR!CAWa*|rKOhS!HQ ze2?j29&CF+@b2qLN-cgm@Yn?WG|s;NV$l<@M|CJ~Aq`S;kF&~l)H}kQjXc&5j;#57 zlnp#&a{1W7b`}O98^V+-OQ7lP47_wg6 zMxZQY!?wZxgQH|yDA0KRrB-wm5EWg|YjIr1BR$6=Fi&~2O1C*tUWt+6NXv(Ph_{fv z(4OKvWX>w+Ku${(%E|K9EpeYZYEmdoIdD`JrbSiSPIaT(>c0an(=Yb<4p=w(4uWsbHwd0YF_#p5D-&9ops!R@B0lMup@B`3q9PJF_zSf)m=hKPM%uzgzwIi~yjOb<4K4@318+|*OFFs( z`9c@>d_K}pUX*f?BLT3j&Cn?vp+cMG z^>|xWI^@CW8~_atbUaJxwMA4TPaei2Wj%EaM*|)^j`oDh)+V1D^8>2QF{zC%$v}me zXo;}%g6DGNaFk!A4<|3biynp(6Z2CnqIDi_S&ddCS z98_<;$8awd2HiF{JVHr<`unyPDYym0KcW41%)H{^4@)x->&!7E&)F6U>5Kr$o7L^M zE+@b%`A27W2!zAiU$%c*7T!))Zc+t4KusjuawrO-n&;R+S| zy!Y_2Y_VQ@F>t>)R~p8V2W|;cY)*z|!U0dVZGTwFa4_NU?e@X*NDrZ?v$QJ{%zu^` z3mL=#R*v5t`L(rhSjqBe)!kE&a7}-k5048)s;1@wA$l{seqJ%)M}8FKdRN%k*u(=l zG%rM{=4e1vow?ahP9L67b207OVg$1Fwj>8Xa374lVkE=tRa=TtW*y1M-sQxG|qPthq%EwQp+!b6JP`C0+C6GjwmdMr)IiTkU#pd&18npSAs>`bTn6 z>b>YxF9}DK*m}}z^DZ%{-j?}P6~_e0@4N3^@@hdD!W?*5B>bSXx|3}K)P^QYKQ47D zMS_+pMTfClR5+Qnhm%v`6SC(Rm-n<685|Ck`et?bJR0x8D;hb|1Yi9KS-@o#Ly?nr zf*Pg9kdYc#tTI&rFDBnr-H}v?UgVncj4*1KA9b_SQIeKMDW|F;?=*Fx9zr`w;aS8c;fJu;6|U6O;Ummdx^X3D@k4_!8(dKqoGXl-}QF%GJWe%72#kA@MKP8IWR zii5#@F_HwfB9OV)yNYS)0{ZlBd0xet)6l>8&VwhrE+7e$DswltCqnO+@cg;bOppTh z)^Qh?puN0xok_74p#JEgTD6s2WVF2^PxwtuPqwW~HhO7^qTdmJV^?@G_|zlSF=UPLuRrQI7TXRrlf8+ja}D`vc-GZc7M=AW@(s|S}i^4OfjaIAy(Gz=6>xO8JY z4?N1c+8~!w3ICPXNxyW=+OW?}yO`|L=?X(&`l?`<$AttiPriGcq)`oiZRGVWK@Q#L z!>zFI`MELU3t1Fj_KU4O`a=a#C#L5| zRSqDMRXH+$&Xpp^IdBKkWuuYr*?$~)yYSGvGD?d4SrFVTHLrifa2-)3N?dne41&hu z`2(C!T>;-B=NYPG4CG9@dDl-P55#Q58}qTwUX-i~l8pmJ@N0vp&thpo-5(=p$DBN) z(wzV@H{vZVd|JumwIlp<=0mK3LL(xk^b)Vc&;MR*U#py8?lvZtw0)kbugVYj3mI907DUgY_cy7c?`E_*i5)!TZ&k%+nZOFxqKsSDo(&P2}{fn>9j!+ikhQ zUW_lO6t;ve^;try_A@}^3rgA<_B1}@YIUK2#%Ch;T3r#t_>6LQ%1cv>&xDp;FO}VW z6zSx0n7`QW1DETM{M4!mg;rJfV^vMP(4X9PkMXYN!1#Jo$U6Zw$e`4z7WO3?4)}fT z+gn0{)~4b?)fk^~BPRoPFE_}dYVeH*<1<;eui4C5J3y)L{0{j|Qjp+~&`0AldK9e> zgGX)Pz^cEoCB|o(84uDQ!uWzFUXV2$;|pfvUsGv(K~wdbP%p+8@>I0TTQ8*`?OpP+ z6S1uTcYAq?V37!%o_>(OMLdTZYTeB77;FbsW2aQAXA0p8*_)uBo(Z3(SYDi%ya4dr zH=R#md_kXWUY%N+2ECssZ9hwY%vb&&*E z$aDvx@r5?IP0kG%pLxdc^L{+WXT&=NUNTruBE{!#bREL@%-VC|Ti45k&|gy9%<0@? z;9Flo&LY=zNZdU4YV%Yf8krWF{GyDx zFg|0$NI2kXpACbHmF841K9gY`_;qH;53Z!-|0$JIgQ`q2%``rfcgZ;R42*>_$Rarz z<1;COJcgneU-)gkOo+z#!tHd4do;elcHQhMBgPkk>^ylY(+iLcbMGvEk$j*Q#hYf- z9tED|Om9BV@fg`1%yjYw*DW}|&xJP~R|Mj@xEc;l)c^r=jSn|oL%2LM7qa%K09h>` zrleNn0Isx;&rV=`frL+r%sQI`fMxm_O|vFQdcjtigz*LL33p+?*&LAd;fMu|FSIti z=61*U%rp8C7XggVR8Ps^<}p5FA%)l0#rRBn!_)g8^rH~cjU%syjzz$-x8C@z_(GY;PaMh{W^*Cz)+-9azB-m61f%^Mz{x0>vGc#PB#uvh0Cah##j)6OPS+COg zf=|kt*vIlvSmC_vad#{icx?|ic!}|a{bEC*#b;vSo#?32L5wfN1g2%Z!1&Df2g|>o z(D;mWz&igAiiP8%2 z7fr4Kk3bwpdc}wFnbAtWk ziiARND?3ZnRx(PK1u-_WG87_PtUVhF;B; z7^r2cMt4zbxfFyF&>!H1MJmP@tf%j`8fE3fW=RIylODdXjxRH(2;&RR50lIe@P>kl zJg4^V6V5-8g}){(}f+dL;19iD0rfJVAkA1@PWNIa*U7uXh%()e1KJYXM4RevZ5?* zUM^RQ_%$B;d{HJAwcKj5x`OeU9$7WLKkvN2xV~zeL0uro;%=v=VtgjL=oghPAP%^z zyc$fI4Fl&`*B($8si6A;|8kR97~ox|Je6OfBKzYAMXzBHxRg5csq;`ZiqE+(YiE@S zYMvk2b3x7*kSA;owJk>=q%D8sd6*Kw0qgfwxw}%({PFI~d)_(p#BaL2YBW93s0fGio?-tO+G2fIfe-LZ=}4SP-BwUzk# zqPvtchl9iFU~Br3>X8h;_M0eh7F!@>Elaqe0q>tncJ1kSa zWV1%WikiYt90w!72c9h=sFOE%vgOfE8;s95UD}k(*A)eoOk1k!7!rZuqRaC$7@zUE z4vee|Yd~w2Lq}QeFU&VS#em~(hTS4Tb--vt$3d4x`K;|_U=uGY?bwh8F34I% zCvFacu}$l`eiUF>8*@4gdyo`ThF3QXxmOWB^eq~^q)O`722n8{x2~&3aq65`TP%E2 zXna3WqO-Rz_{p{!TuD5s1s2gF2Zy!)FzEB%TUm*Ir5FFLNpX9mb z4?IqtcwdL{1??#M8eudWSP%Gp!`cI5(??Nf-Ls)sffUmVTn^N8q!jL-0{1V`CBB>)aq#ti1&(O|7vSE{!#6>R-Ii8~Hr!22wGEXHS$iXVZkC+d8_ zn&M+EjL)F5g5N4X$R`2D_Ld#YWdYz;q>zQCU@0QPqVk)<6AQdHHzZQ58_^e;DzirA z-jszJ6E^PDx0I8y_NAYrjDYNektX#cHZWFDb8)M^7w8t{>Vp_xc=ndnigT_Oe*3th zT$+&pJFi8E>0x}qjL$B>klYXRMJvu$+H|7^3kQ3%r7OYqc~O(z-Tp92N@u>Zu@SID zFD)th$H4v911@|RZa`bA&R+doS_dl=8cJWM$G~#@nRe%I=Yhnw+no=7x&yXC|9aKU zd6aM8|GYMQ;|=z3A07#lNrFXH?mPE8#DJEVF8rO*qvz-Im{4z)TKyzoS{5@;CNtR8IFf+BM-l3av~p_<%O@4%mU$gX?!aJFd~ z1vkR5)BZ+3h3mXM(S0HaDt7fM$Q(Q>C2%!wdVypGCPK zF6>_MTV^UqNWMyb5S|RTZ0P!nYs(Rq<9PUXx^g6w+Cmw6RdCRq5&|MW7Dm2t4ubbG zx*eQUl%d58nW57n0M1wsnz=qo25TESUd|Bcmg@`xd89?^)$}URy`f{eDlgaj*=kU1 zQ=z55KNG03D_N-dM#Gk$>$+N0ghcXk1cSMUF@56FSD@2Z? zwPfX`Moo1XWNNZ=y!I@s2Y{JnJ);qd_n(eFonwAL`3doY(aBI?b)ab%8LtdlZd&|E zpwmEaGwDv%g#>}Ge8qF*SJ=N-?NGkkgUd#%*mgwQ^IQeH%1@Wj_=2gBlX-`1KJ*uj z7-WzLg+p=i!!1m8a4KO0jeQ#c=gSH@m@&Q({pkCP^t5WQV5R)Vi@ORud!M={px^+wxwT^(FfKWeNf4bP=F#21P;35 zL=fLg@0ns}{Xk|)afgw40^DsGQ(wX2g&f%z!mbc`860PLD8CQmGr?+7?YfkF*u}Ab z;FDeyWZ<{mdhX>pAgJDFN_C6|#F=9nG(NMK6H*i=kOKV6w{Ke3C<4Bfsb{-CH$sJ% z+X642DFQ*Uh5`A+c#3X7qI8B}TMt8LPxPNOJJ{5~tfA%Q1MRp{xjOIgz(6UdW%fEH zFaYoBeI*?P%}mDMz07POBA+PKCX@^YjOd({G@Zctk)VfXSbX80jDq)9Fuowg?V!y` zN(DXyq@UVKCnDY-=U@TzE zCs&pa9}+LTW8>P_BgPcjR5|sA(kOj#@VmVkc=V0UwxsMZ(F+Ni@$e3<= zD-<~OXia?(a|9n>D^r+DEZ~*5rwh&!a)9M+&MX?AsSCSw{?zee@aAXI^SDt*$YMGg zUawvN?o?7zpJRN1&7jd`6ypoRr>vHvFupMLVo7on5`$FCWyWbp>!3H~^Y>?G*}&SI z<$jJZMQ}BL>*+6Zxv1{WzIXIKweX#Hx_@wWBG{{_2wcA*xGsOAdN40 z)o?vGd6f;$w3*1!_=5kNZ&q=eD#7ePpv{$`i!e?2@>dCrFNC@Ly2j&G3q}=$*~T!w zuym@_v;<1+(IbVqK! zwFjTMh!^WHKGSMNPagbH2Uq+=^gz<4T)&SH`f>^cAYR?Zh@@(?Bn9`}(byr9oBff(X}x!R zX~_rZPI9(<nwuclwK+k)Ryp2J&=8ep5A2W!9=N7y1J z&4--NgM^K|4hgrv5jL6(U0(|v;>7rZnO9%y6O1od8}lD{h4F>`w?5(N-(;ZU_ebsd zbj^@wWsaURzYM`xX0+C)22EgjIav0mT_vL2#-qV7RSc>(n~BURA<6|QXLiUKH}-&f zvTL4-$<9z_2XRoQyA5If#z-(W>wu=|5ydpVaGhV6swHyb z@cyV3ui0p5Gji9x1LF%m1L9XkE6#(gUG_g1#v;w? z=!+@B>Qnb}7Pi7CZ?7lPG33B+4J!>2&!eHsSJ8b^_w_(g(^K?%r6#JidCMP;TT1Zj z`5zZ{4(5YSMKyMJ`5biNXJre;5ZhOZh>*r-qBIQ89@v@+2CrBO*cjykfxBYbdZuLP zm$^O4G0YuinNLMpVSL8J_q4(fGzmVyH8EHO8UpL%kCfT96JXhz5ew5ve|XGe)7(S8 z>Ymk8d>MMbZc~;YIhK2+Mgz-V)?Qa5GXR^bd|ulQ0PfLu5WlPF!H@ln!aMjRLFkLO zSH#3)!P7sH?+@+FhY~wEAFXT+0~S5i)6v4&V7$RMn8p|Q6RX*~t=*v?dxTfDN)Zec zPv8>PP6nx74D$j0RX}c*`DY`>7aqrO!pPcWaCDc{=(YuKXm)d3$K~y5VEWpl>5*UV zJ#yE!W@{*a?^%2t6t}<13j)%X@O~j%z$$(*8~2(5Hs5?6#>}k&KG>P(rCrwqW_96G zt!%MiVst39MIhg~rgqwLq%H)Av7(SoIXWmEYiyB_3gUsx;DycyZ;ASqP z=;FR;s5{Cyas=4yFut&M zxwCa_2NE{}=ky5>k zNOa$hKWcXwtVyH=N{G9F!EhmK>9fV)?(&~1E!%T|{O4RUjW5Xe?kv%LkpuNeFMDZx z;Y9P$9l7*WC@YlnJ9@qfG)Lcf$b<2P>oIae6AH%A{I*)}af~m(a}_-57@y(ls32uw zd?sbrnKc@pIq}1F;x@)-=Dwc(q9);pys53_*zK(dPqQR^y7om4BDJ?Op;rsCw4#68 zjhYC3C^b*7U(SH7xqia+;uu#Tg%vR$E`=w?ZyVG2Ol}_hRr4wc2FcI4TVs4C+2$tw zSeF6}s=LK0)|Ur=hNxvUV0>ow+1r4&X&bnuNPC_G<1=!?`;)hC^`p3moY7&k@9Md> zbB^?)*bwf1{bkl|+7haS?6+)fBtZAXob3trzTn129&5EJ4%;0Gfmh#g+N)sCfrA@) zd^dCdp`Yn-aK_)e(K9I%lz*3)u|*Rgej~5FMI239^~1oAI}4^7TN~i4z7|3mjsatf zYQOkvqJhFjUYGu-8S-=_bUJFqoEj3BX(<2{^uE3u#w08^=HaDb|-_`XP=|g+8hAs zFyry$yRlGfBd;5|wq$M6wSZL}JAFmRDxu6^$lj>4>M-VosqAxN5J=g`>mzP;6FQSl z;LDZ#4=Na6@J)49Ovd=ajOuFhX^bx<(o6VlYb!uRww>rYTj}Nc? zxy}o%nPu4SGh9apxCQ0=lv|(~<9)VE$L%4vYUB@#T>)T)k*<8p?z7;f-m0#`*=kXpixkfc}$iPfh&LBMV-ytO@2&?iAS5mB9{oG$^Z$UAu%X zu(HO^f2)L}vVLnXhxOqlko@&PjWdXR^o{W01@`%VBi<&8CE}Blts&>hNOu~a(I8lk zPtD~(o><|uwtH!C=SIBAEJ+OB!MOn?d52{qjL-Z%Ey9GI7V);X|DVo^Ut%t22b~MU`SDD3N$Z0ra#k`N2h#j9w zXT=U%VMn%{9UZ92=}h*a_8yM@R4tZtcI-g9jenr0r!97P>+ex?>=+@{g+S}!{1_^1 ztZ`6by@$Fq+ec$q?gB><{-t0)&sP}kfZlYCseBD1Vo!%w@M?J0}+&(kAiSY_{ T8BDtz3C(#G+R6}UC-J`kYGWu& literal 16009 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 bd{OPaFQIrJkzK6Lw!VnXx@MUc9^m{RbcK`I diff --git a/tests/parsers/fixtures/base/model_valid/results.json b/tests/parsers/fixtures/base/model_valid/results.json index b510be0..990ab38 100644 --- a/tests/parsers/fixtures/base/model_valid/results.json +++ b/tests/parsers/fixtures/base/model_valid/results.json @@ -1 +1 @@ -{"mean_field": {"is_converged": true}} +{"timings": {"mean_field": 1.470824640000501, "total": 1.8824531299978844}, "mean_field": {"is_converged": true, "total_energy": -107.88237557448636, "forces": [[1.623678458070622, -3.4176827611007896e-17, -5.142126036397646e-19], [-1.6236784580706132, 3.4176827611003403e-17, 5.142126036398054e-19]], "molecular_orbitals": {"energies": [-15.810645505938895, -15.810577922503473, -1.0107325201009896, -0.9868371812252065, -0.361871486289105, -0.3358060054007162, -0.335806005400715, -0.15378168325421276, -0.15378168325421246, -0.11613780565825099, 0.19550741122997056, 0.2452470642031226, 0.4631816876555856, 0.463181687655586, 0.48652884967963145, 0.4865288496796321, 0.5409516491819545, 0.5454150477087832, 0.5454150477087847, 0.5495541829976925, 0.6054289055182531, 0.6054289055182537, 0.856025492082369, 0.9032311480142234, 0.9032311480142284, 0.9863706858235386, 0.9863706858235435, 1.1521564057499971, 1.1829750201996279, 1.3377593149108744, 2.569682822219137, 2.5696828222191392, 2.57094134411617, 2.5709413441161706, 2.591862059955579, 2.5918620599555795, 2.5978335614966297, 2.6254948183268487, 2.625494818326852, 2.6433822153829927], "labels": ["0 N 1s ", "0 N 2s ", "0 N 3s ", "0 N 4s ", "0 N 2px ", "0 N 2py ", "0 N 2pz ", "0 N 3px ", "0 N 3py ", "0 N 3pz ", "0 N 3dxy ", "0 N 3dyz ", "0 N 3dz^2 ", "0 N 3dxz ", "0 N 3dx2-y2", "0 N 4dxy ", "0 N 4dyz ", "0 N 4dz^2 ", "0 N 4dxz ", "0 N 4dx2-y2", "1 N 1s ", "1 N 2s ", "1 N 3s ", "1 N 4s ", "1 N 2px ", "1 N 2py ", "1 N 2pz ", "1 N 3px ", "1 N 3py ", "1 N 3pz ", "1 N 3dxy ", "1 N 3dyz ", "1 N 3dz^2 ", "1 N 3dxz ", "1 N 3dx2-y2", "1 N 4dxy ", "1 N 4dyz ", "1 N 4dz^2 ", "1 N 4dxz ", "1 N 4dx2-y2"], "occupations": [2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}}} diff --git a/tests/test_integration/test_pyscf_base_geometry_optimization.csv b/tests/test_integration/test_pyscf_base_geometry_optimization.csv index a7ab8cf..0b07c86 100644 --- a/tests/test_integration/test_pyscf_base_geometry_optimization.csv +++ b/tests/test_integration/test_pyscf_base_geometry_optimization.csv @@ -1,10 +1,10 @@ ,cell,positions,forces,total_energy,mo_energies -0,0,-9.7050863540394009e-16,4.6954902279503998e-15,-2039.8853743663999,-550.86280025027997 -1,0,-1.3585628030588e-14,-4.0141380435427002e-14,,-34.375426862456003 -2,0,0.14564171835594,2.2269701395494002,,-16.629598134599 -3,0,-4.4202075207958997e-15,8.7828630648273999e-16,,-12.323304634735999 -4,0,0.75805955516659995,0.64803113397732004,,-10.637428057751 -5,0,-0.49023685916527998,-1.1134850697745999,,16.200273277781999 -6,0,4.322127333997e-15,-5.5737765344331997e-15,,19.796075801491 -7,0,-0.75805955516655998,-0.64803113397734002,, -8,0,-0.49023685916535997,-1.1134850697747001,, +0,0,9.2454334534319001e-16,5.1421984712133999e-16,-2039.8853743663999,-550.86280025027997 +1,0,-2.0981529224280001e-14,3.4075571836296002e-14,,-34.375426862456003 +2,0,0.14564171835584,2.226970139549,,-16.629598134599 +3,0,3.1504975930679e-15,-5.9334106870606003e-15,,-12.323304634735999 +4,0,0.75805955516654999,0.64803113397734002,,-10.637428057751 +5,0,-0.49023685916542997,-1.1134850697747001,,16.200273277781999 +6,0,-3.2418990053028002e-15,5.4191908399392998e-15,,19.796075801491 +7,0,-0.75805955516661006,-0.64803113397722001,, +8,0,-0.49023685916540999,-1.1134850697747001,, diff --git a/tests/test_integration/test_pyscf_base_mean_field.csv b/tests/test_integration/test_pyscf_base_mean_field.csv index a908ff4..810bc15 100644 --- a/tests/test_integration/test_pyscf_base_mean_field.csv +++ b/tests/test_integration/test_pyscf_base_mean_field.csv @@ -1,10 +1,10 @@ ,forces,total_energy,mo_energies -0,7.0032013139647002e-15,-2039.8853743663999,-550.86280025027997 -1,4.2460660193918997e-14,,-34.375426862456003 +0,9.4886849325137992e-15,-2039.8853743663999,-550.86280025027997 +1,1.6056552174170998e-14,,-34.375426862456003 2,2.2269701395492998,,-16.629598134599 -3,-1.4382859546291e-15,,-12.323304634735999 -4,0.64803113397729994,,-10.637428057751 +3,-8.1286555240245e-15,,-12.323304634735999 +4,0.64803113397737,,-10.637428057751 5,-1.1134850697747001,,16.200273277781999 -6,-5.5649153593354002e-15,,19.796075801491 -7,-0.64803113397731005,, +6,-1.3600294084894e-15,,19.796075801491 +7,-0.64803113397735002,, 8,-1.1134850697747001,,