mlatom 3.16.0__tar.gz → 3.16.2__tar.gz
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.
- {mlatom-3.16.0/src/mlatom.egg-info → mlatom-3.16.2}/PKG-INFO +4 -4
- {mlatom-3.16.0 → mlatom-3.16.2}/README.md +3 -3
- {mlatom-3.16.0 → mlatom-3.16.2}/setup.py +1 -1
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatom.py +3 -2
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLtasks.py +20 -5
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/al.py +15 -13
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/al_utils.py +14 -13
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/args_class.py +4 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/data.py +105 -7
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/__init__.py +5 -1
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/ase_interface.py +3 -1
- mlatom-3.16.2/src/mlatom/interfaces/dftbplus_interface.py +235 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/gaussian_interface.py +106 -6
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/pyscf_interface.py +6 -4
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/torchani_interface.py +20 -10
- mlatom-3.16.2/src/mlatom/interfaces/xtb_interface.py +338 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/models.py +6 -5
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/simulations.py +37 -22
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/spectra.py +3 -2
- mlatom-3.16.2/src/mlatom/xyz.py +102 -0
- {mlatom-3.16.0 → mlatom-3.16.2/src/mlatom.egg-info}/PKG-INFO +4 -4
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom.egg-info/SOURCES.txt +1 -0
- mlatom-3.16.0/src/mlatom/interfaces/xtb_interface.py +0 -209
- mlatom-3.16.0/src/mlatom/xyz.py +0 -65
- {mlatom-3.16.0 → mlatom-3.16.2}/LICENSE.txt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/setup.cfg +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/GICnet.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLTPA.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/ML_NEA.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/A_KRR.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/A_KRR_kernel.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/D_CoulombMatrix.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/D_ID.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/D_rel2eq.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/MLatomF.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/MLatomFInfo.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/MLmodel.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/Makefile +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/Makefile.intel +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/__init__.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/analyze.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/constants.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/cs.cpp +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/dataset.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/mathUtils.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/molDescr.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/optionsModule.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/precision.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/recover.sh +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/sampling.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/statistics.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/stopper.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/strings.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/timing.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/types.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/__init__.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/__init__.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_cc_cv0.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_cc_cv1.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_cc_cv2.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_cc_cv3.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_cc_cv4.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_cc_cv5.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_cc_cv6.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_cc_cv7.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_dft_cv0.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_dft_cv1.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_dft_cv2.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_dft_cv3.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_dft_cv4.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_dft_cv5.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_dft_cv6.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_dft_cv7.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2_model/__init__.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2_model/aiqm2_cv0.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2_model/aiqm2_cv1.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2_model/aiqm2_cv2.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2_model/aiqm2_cv3.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2_model/aiqm2_cv4.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2_model/aiqm2_cv5.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2_model/aiqm2_cv6.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2_model/aiqm2_cv7.pt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/ccsdtstarcbs.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/composite_methods.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/constants.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/conversions.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/cs.so +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/decorators.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/dens.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/doc.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/fortran/KREG.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/fortran/KREG.so +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/fortran/__init__.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/fortran/compile.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/fortran/mathUtils.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/fortran/stopper.f90 +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/functionsGICnet.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/gap_md.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/header.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/initial_conditions.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interface_MLatomF.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/columbus_interface.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/dftd3_interface.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/dftd4_interface.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/dpmd_interface.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/gap_interface.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/mace_interface.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/mndo_interface.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/orca_interface.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/physnet_interface.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/sgdml_interface.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/sparrow_interface.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/turbomole_interface.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/xtb +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/kreg_api.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/log.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/md.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/md2vibr.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/md2vibr_cmd.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/md_cmd.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/md_parallel.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/mlatom_gui.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/mltpa/__init__.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/mltpa/mff.txt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/mltpa/mltpa2022_2.pkl +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/mltpa/mltpa2022_2_new_.pkl +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/namd.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/plot.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/ref.json +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/shell_cmd.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/sliceData.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/stats.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/stopper.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/thermostat.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/utils.py +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom.egg-info/dependency_links.txt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom.egg-info/entry_points.txt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom.egg-info/requires.txt +0 -0
- {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: mlatom
|
|
3
|
-
Version: 3.16.
|
|
3
|
+
Version: 3.16.2
|
|
4
4
|
Summary: A Package for AI-enhanced computational chemistry
|
|
5
5
|
Home-page: http://mlatom.com
|
|
6
6
|
Author: Pavlo O. Dral
|
|
@@ -27,7 +27,7 @@ Requires-Dist: tqdm
|
|
|
27
27
|
# About Program
|
|
28
28
|
MLatom: a Package for Atomistic Simulations with Machine Learning
|
|
29
29
|
|
|
30
|
-
Version 3.16.
|
|
30
|
+
Version 3.16.2
|
|
31
31
|
|
|
32
32
|
**Official website**: http://mlatom.com/
|
|
33
33
|
**Documentation**: http://mlatom.com/docs/
|
|
@@ -56,7 +56,7 @@ When this Software or its derivatives are used in scientific publications, it sh
|
|
|
56
56
|
* Pavlo O. Dral, Fuchun Ge, Yi-Fan Hou, Peikun Zheng, Yuxinxin Chen, Mario Barbatti, Olexandr Isayev, Cheng Wang, Bao-Xin Xue, Max Pinheiro Jr, Yuming Su, Yiheng Dai, Yangtao Chen, Lina Zhang, Shuang Zhang, Arif Ullah, Quanhao Zhang, Yanchi Ou. [MLatom 3: A Platform for Machine Learning-enhanced Computational Chemistry Simulations and Workflows](https://doi.org/10.1021/acs.jctc.3c01203). *J. Chem. Theory Comput.* **2024**, *20*, 1193--1213.
|
|
57
57
|
* Pavlo O. Dral, Fuchun Ge, Bao-Xin Xue, Yi-Fan Hou, Max Pinheiro Jr, Jianxing Huang, Mario Barbatti. [MLatom 2: An Integrative Platform for Atomistic Machine Learning](http://doi.org/10.1007/s41061-021-00339-5). *Top. Curr. Chem.* **2021**, *379*, 27.
|
|
58
58
|
* Pavlo O. Dral. [MLatom: A Program Package for Quantum Chemical Research Assisted by Machine Learning](http://dx.doi.org/10.1002/jcc.26004). *J. Comput. Chem.* **2019**, *40*, 2339--2347.
|
|
59
|
-
* Pavlo O. Dral, Fuchun Ge, Yi-Fan Hou, Peikun Zheng, Yuxinxin Chen, Bao-Xin Xue, Mikolaj Martyka, Max Pinheiro Jr, Yuming Su, Yiheng Dai, Yangtao Chen, Shuang Zhang, Lina Zhang, Arif Ullah, Quanhao Zhang, Sebastian V. Pios, Yanchi Ou, Matheus O. Bispo, Vignesh B. Kumar, MLatom: A Package for Atomistic Simulations with Machine Learning, version 3.16.
|
|
59
|
+
* Pavlo O. Dral, Fuchun Ge, Yi-Fan Hou, Peikun Zheng, Yuxinxin Chen, Bao-Xin Xue, Mikolaj Martyka, Max Pinheiro Jr, Yuming Su, Yiheng Dai, Yangtao Chen, Shuang Zhang, Lina Zhang, Arif Ullah, Quanhao Zhang, Sebastian V. Pios, Yanchi Ou, Matheus O. Bispo, Vignesh B. Kumar, Xin-Yu Tong, MLatom: A Package for Atomistic Simulations with Machine Learning, version 3.16.2, Xiamen University, Xiamen, China, 2013-2024.
|
|
60
60
|
[MLatom.com](http://mlatom.com).
|
|
61
61
|
|
|
62
62
|
The citations for MLatom's interfaces and features shall be eventually
|
|
@@ -105,7 +105,7 @@ Citations mentioned above should be included. For convenience, below we provide
|
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
@misc{MLatomProg,
|
|
108
|
-
author = {Dral, Pavlo O. and Ge, Fuchun and Hou, Yi-Fan and Zheng, Peikun and Chen, Yuxinxin and Xue, Bao-Xin and Martyka, Mikolaj and Pinheiro Jr, Max and Su, Yuming and Dai, Yiheng and Chen, Yangtao and Zhang, Shuang and Zhang, Lina and Ullah, Arif and Zhang, Quanhao and Pios, Sebastian V. and Ou, Yanchi and Bispo, Matheus O. and Kumar, Vignesh B.},
|
|
108
|
+
author = {Dral, Pavlo O. and Ge, Fuchun and Hou, Yi-Fan and Zheng, Peikun and Chen, Yuxinxin and Xue, Bao-Xin and Martyka, Mikolaj and Pinheiro Jr, Max and Su, Yuming and Dai, Yiheng and Chen, Yangtao and Zhang, Shuang and Zhang, Lina and Ullah, Arif and Zhang, Quanhao and Pios, Sebastian V. and Ou, Yanchi and Bispo, Matheus O. and Kumar, Vignesh B. and Tong, Xin-Yu},
|
|
109
109
|
title = {MLatom: A Package for Atomistic Simulations with Machine Learning},
|
|
110
110
|
year = {2013--2024},
|
|
111
111
|
type = {Computer Program}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# About Program
|
|
2
2
|
MLatom: a Package for Atomistic Simulations with Machine Learning
|
|
3
3
|
|
|
4
|
-
Version 3.16.
|
|
4
|
+
Version 3.16.2
|
|
5
5
|
|
|
6
6
|
**Official website**: http://mlatom.com/
|
|
7
7
|
**Documentation**: http://mlatom.com/docs/
|
|
@@ -30,7 +30,7 @@ When this Software or its derivatives are used in scientific publications, it sh
|
|
|
30
30
|
* Pavlo O. Dral, Fuchun Ge, Yi-Fan Hou, Peikun Zheng, Yuxinxin Chen, Mario Barbatti, Olexandr Isayev, Cheng Wang, Bao-Xin Xue, Max Pinheiro Jr, Yuming Su, Yiheng Dai, Yangtao Chen, Lina Zhang, Shuang Zhang, Arif Ullah, Quanhao Zhang, Yanchi Ou. [MLatom 3: A Platform for Machine Learning-enhanced Computational Chemistry Simulations and Workflows](https://doi.org/10.1021/acs.jctc.3c01203). *J. Chem. Theory Comput.* **2024**, *20*, 1193--1213.
|
|
31
31
|
* Pavlo O. Dral, Fuchun Ge, Bao-Xin Xue, Yi-Fan Hou, Max Pinheiro Jr, Jianxing Huang, Mario Barbatti. [MLatom 2: An Integrative Platform for Atomistic Machine Learning](http://doi.org/10.1007/s41061-021-00339-5). *Top. Curr. Chem.* **2021**, *379*, 27.
|
|
32
32
|
* Pavlo O. Dral. [MLatom: A Program Package for Quantum Chemical Research Assisted by Machine Learning](http://dx.doi.org/10.1002/jcc.26004). *J. Comput. Chem.* **2019**, *40*, 2339--2347.
|
|
33
|
-
* Pavlo O. Dral, Fuchun Ge, Yi-Fan Hou, Peikun Zheng, Yuxinxin Chen, Bao-Xin Xue, Mikolaj Martyka, Max Pinheiro Jr, Yuming Su, Yiheng Dai, Yangtao Chen, Shuang Zhang, Lina Zhang, Arif Ullah, Quanhao Zhang, Sebastian V. Pios, Yanchi Ou, Matheus O. Bispo, Vignesh B. Kumar, MLatom: A Package for Atomistic Simulations with Machine Learning, version 3.16.
|
|
33
|
+
* Pavlo O. Dral, Fuchun Ge, Yi-Fan Hou, Peikun Zheng, Yuxinxin Chen, Bao-Xin Xue, Mikolaj Martyka, Max Pinheiro Jr, Yuming Su, Yiheng Dai, Yangtao Chen, Shuang Zhang, Lina Zhang, Arif Ullah, Quanhao Zhang, Sebastian V. Pios, Yanchi Ou, Matheus O. Bispo, Vignesh B. Kumar, Xin-Yu Tong, MLatom: A Package for Atomistic Simulations with Machine Learning, version 3.16.2, Xiamen University, Xiamen, China, 2013-2024.
|
|
34
34
|
[MLatom.com](http://mlatom.com).
|
|
35
35
|
|
|
36
36
|
The citations for MLatom's interfaces and features shall be eventually
|
|
@@ -79,7 +79,7 @@ Citations mentioned above should be included. For convenience, below we provide
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
@misc{MLatomProg,
|
|
82
|
-
author = {Dral, Pavlo O. and Ge, Fuchun and Hou, Yi-Fan and Zheng, Peikun and Chen, Yuxinxin and Xue, Bao-Xin and Martyka, Mikolaj and Pinheiro Jr, Max and Su, Yuming and Dai, Yiheng and Chen, Yangtao and Zhang, Shuang and Zhang, Lina and Ullah, Arif and Zhang, Quanhao and Pios, Sebastian V. and Ou, Yanchi and Bispo, Matheus O. and Kumar, Vignesh B.},
|
|
82
|
+
author = {Dral, Pavlo O. and Ge, Fuchun and Hou, Yi-Fan and Zheng, Peikun and Chen, Yuxinxin and Xue, Bao-Xin and Martyka, Mikolaj and Pinheiro Jr, Max and Su, Yuming and Dai, Yiheng and Chen, Yangtao and Zhang, Shuang and Zhang, Lina and Ullah, Arif and Zhang, Quanhao and Pios, Sebastian V. and Ou, Yanchi and Bispo, Matheus O. and Kumar, Vignesh B. and Tong, Xin-Yu},
|
|
83
83
|
title = {MLatom: A Package for Atomistic Simulations with Machine Learning},
|
|
84
84
|
year = {2013--2024},
|
|
85
85
|
type = {Computer Program}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
!---------------------------------------------------------------------------!
|
|
5
5
|
! !
|
|
6
6
|
! MLatom: a Package for Atomistic Simulations with Machine Learning !
|
|
7
|
-
! MLatom 3.16.
|
|
7
|
+
! MLatom 3.16.2 !
|
|
8
8
|
! @ !
|
|
9
9
|
! Xiamen Atomistic Computing Suite (XACS) !
|
|
10
10
|
! !
|
|
@@ -36,8 +36,9 @@
|
|
|
36
36
|
! Bao-Xin Xue, Mikolaj Martyka, Max Pinheiro Jr, Yuming Su, Yiheng Dai, !
|
|
37
37
|
! Yangtao Chen, Shuang Zhang, Lina Zhang, Arif Ullah, Quanhao Zhang, !
|
|
38
38
|
! Sebastian V. Pios, Yanchi Ou, Matheus O. Bispo, Vignesh B. Kumar, !
|
|
39
|
+
! Xin-Yu Tong, !
|
|
39
40
|
! MLatom: A Package for Atomistic Simulations with Machine Learning, !
|
|
40
|
-
! version 3.16.
|
|
41
|
+
! version 3.16.2, Xiamen University, Xiamen, China, 2013-2024. !
|
|
41
42
|
! !
|
|
42
43
|
! The citations for MLatom's interfaces and features shall be eventually !
|
|
43
44
|
! included too. See header.py, ref.json and http://mlatom.com. !
|
|
@@ -364,7 +364,15 @@ def slice(args):
|
|
|
364
364
|
from . import sliceData
|
|
365
365
|
sliceData.sliceDataCls(argsSD = args.args2pass)
|
|
366
366
|
|
|
367
|
-
def
|
|
367
|
+
def optfreq(args):
|
|
368
|
+
molDB = geomopt(args, return_moldb=True)
|
|
369
|
+
freq(args, molDB=molDB)
|
|
370
|
+
|
|
371
|
+
def tsfreq(args):
|
|
372
|
+
molDB = ts(args, return_moldb=True)
|
|
373
|
+
freq(args, molDB=molDB)
|
|
374
|
+
|
|
375
|
+
def geomopt(args, return_moldb=False):
|
|
368
376
|
from . import simulations
|
|
369
377
|
molDB = loading_data(XYZfile=args.XYZfile, charges=args.charges, multiplicities=args.multiplicities)
|
|
370
378
|
model = loading_model(args)
|
|
@@ -419,13 +427,20 @@ def geomopt(args):
|
|
|
419
427
|
else:
|
|
420
428
|
print('\n Final energy of molecule %6d: %25.13f Hartree\n\n' % (imol+1, geomopt.optimized_molecule.energy))
|
|
421
429
|
db_opt.write_file_with_xyz_coordinates(filename=fname)
|
|
430
|
+
if return_moldb:
|
|
431
|
+
return db_opt
|
|
422
432
|
|
|
423
|
-
def ts(args):
|
|
424
|
-
|
|
433
|
+
def ts(args, return_moldb=False):
|
|
434
|
+
if return_moldb:
|
|
435
|
+
molDB = geomopt(args, return_moldb=return_moldb)
|
|
436
|
+
return molDB
|
|
437
|
+
else:
|
|
438
|
+
geomopt(args, return_moldb=return_moldb)
|
|
425
439
|
|
|
426
|
-
def freq(args):
|
|
440
|
+
def freq(args, molDB=None):
|
|
427
441
|
from . import simulations
|
|
428
|
-
molDB
|
|
442
|
+
if molDB is None:
|
|
443
|
+
molDB = loading_data(args.XYZfile, charges=args.charges, multiplicities=args.multiplicities)
|
|
429
444
|
model = loading_model(args)
|
|
430
445
|
kwargs = {}
|
|
431
446
|
if args.freqProg: kwargs['program'] = args.freqProg
|
|
@@ -1,20 +1,13 @@
|
|
|
1
1
|
import sys
|
|
2
|
-
from . import data, stats, models, optimize_geometry, freq, md, md_parallel, generate_initial_conditions
|
|
3
|
-
from .
|
|
2
|
+
from . import data, stats, models, simulations, optimize_geometry, freq, md, md_parallel, generate_initial_conditions
|
|
3
|
+
from .simulations import run_in_parallel
|
|
4
|
+
from .al_utils import Sampler, ml_model_trainer, ml_model, ml_model_msani, stopper
|
|
4
5
|
import numpy as np
|
|
5
6
|
import os
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import torch
|
|
9
|
-
import random
|
|
10
|
-
import joblib
|
|
11
|
-
from joblib import Parallel, delayed
|
|
12
|
-
from multiprocessing.pool import ThreadPool as Pool
|
|
13
|
-
import timeit
|
|
14
|
-
import json
|
|
7
|
+
import random
|
|
8
|
+
import timeit
|
|
15
9
|
import copy
|
|
16
10
|
|
|
17
|
-
|
|
18
11
|
class al():
|
|
19
12
|
'''
|
|
20
13
|
Active learning procedure
|
|
@@ -141,6 +134,7 @@ class al():
|
|
|
141
134
|
elif 'nthreads' in kwargs:
|
|
142
135
|
self.label_nthreads = kwargs['nthreads']
|
|
143
136
|
else:
|
|
137
|
+
import joblib
|
|
144
138
|
self.label_nthreads = joblib.cpu_count()
|
|
145
139
|
|
|
146
140
|
if 'refmethod_kwargs' in kwargs:
|
|
@@ -186,6 +180,8 @@ class al():
|
|
|
186
180
|
if 'device' in kwargs:
|
|
187
181
|
self.device = kwargs['device']
|
|
188
182
|
else:
|
|
183
|
+
# to-do: that should be done just for the models using torch, otherwise loading takes time
|
|
184
|
+
import torch
|
|
189
185
|
self.device = 'cuda' if torch.cuda.is_available() else 'cpu'
|
|
190
186
|
# ..property_to_learn: A list of properties to learn with ML
|
|
191
187
|
# ...Note:
|
|
@@ -233,6 +229,7 @@ class al():
|
|
|
233
229
|
if 'nthreads' in kwargs:
|
|
234
230
|
self.sampler_kwargs['nthreads'] = kwargs['nthreads']
|
|
235
231
|
elif 'nthreads' not in self.sampler_kwargs.keys():
|
|
232
|
+
import joblib
|
|
236
233
|
self.sampler_kwargs['nthreads'] = joblib.cpu_count()
|
|
237
234
|
if 'initcond_sampler' in self.sampler_kwargs.keys():
|
|
238
235
|
self.sampler_kwargs['initcond_sampler'] = Sampler(sampler_function=self.sampler_kwargs['initcond_sampler'])
|
|
@@ -314,6 +311,7 @@ class al():
|
|
|
314
311
|
|
|
315
312
|
# Dump AL info
|
|
316
313
|
def dump(self):
|
|
314
|
+
import json
|
|
317
315
|
jsonfile = open('al_info.json','w')
|
|
318
316
|
json.dump(self.dict_to_json_dict(self.al_info),jsonfile,indent=4)
|
|
319
317
|
jsonfile.close()
|
|
@@ -321,6 +319,7 @@ class al():
|
|
|
321
319
|
# Load AL info
|
|
322
320
|
def load(self):
|
|
323
321
|
if os.path.exists('al_info.json'):
|
|
322
|
+
import json
|
|
324
323
|
jsonfile = open('al_info.json','r')
|
|
325
324
|
al_info = json.load(jsonfile)
|
|
326
325
|
else:
|
|
@@ -472,6 +471,7 @@ class al():
|
|
|
472
471
|
if len(Ntrain_list) > 1 and len(Ntrain_list) >= self.minimum_number_of_fitting_points:
|
|
473
472
|
x = np.log(Ntrain_list)
|
|
474
473
|
y = np.log(eRMSE_list)
|
|
474
|
+
import scipy
|
|
475
475
|
linreg = scipy.stats.linregress(x,y)
|
|
476
476
|
slope = linreg.slope
|
|
477
477
|
intercept = linreg.intercept
|
|
@@ -701,7 +701,7 @@ class al():
|
|
|
701
701
|
return molecule
|
|
702
702
|
nmols = len(moldb)
|
|
703
703
|
if nthreads > 1:
|
|
704
|
-
newmols =
|
|
704
|
+
newmols = run_in_parallel(molecular_database=moldb,
|
|
705
705
|
task=sptask,
|
|
706
706
|
task_kwargs={'model': method, 'refmethod_kwargs': {'calculate_energy': calculate_energy, 'calculate_energy_gradients':calculate_energy_gradients, 'calculate_hessian':calculate_hessian, **model_predict_kwargs}},
|
|
707
707
|
nthreads=nthreads,
|
|
@@ -709,8 +709,10 @@ class al():
|
|
|
709
709
|
for imol in range(len(moldb)):
|
|
710
710
|
moldb.molecules[imol] = newmols[imol]
|
|
711
711
|
|
|
712
|
+
# from multiprocessing.pool import ThreadPool as Pool
|
|
712
713
|
#pool = Pool(processes=nthreads)
|
|
713
714
|
#mols = pool.map(label,list(range(nmols)))
|
|
715
|
+
# from joblib import Parallel, delayed
|
|
714
716
|
# mols = Parallel(n_jobs=nthreads)(delayed(label)(i) for i in range(nmols))
|
|
715
717
|
else:
|
|
716
718
|
moldb2label = data.molecular_database()
|
|
@@ -1,20 +1,9 @@
|
|
|
1
1
|
import sys
|
|
2
2
|
from . import data, stats, models, simulations, optimize_geometry, md, md_parallel, constants, generate_initial_conditions
|
|
3
3
|
import numpy as np
|
|
4
|
-
import os
|
|
5
|
-
import matplotlib.pyplot as plt
|
|
6
|
-
import scipy
|
|
7
|
-
import torch
|
|
8
|
-
from scipy.optimize import fsolve
|
|
4
|
+
import os
|
|
9
5
|
import random
|
|
10
|
-
import joblib
|
|
11
|
-
from joblib import Parallel, delayed
|
|
12
|
-
import timeit
|
|
13
|
-
import json
|
|
14
6
|
from . import gap_md, namd
|
|
15
|
-
from time import sleep
|
|
16
|
-
|
|
17
|
-
|
|
18
7
|
|
|
19
8
|
class Sampler():
|
|
20
9
|
def __init__(self,sampler_function=None):
|
|
@@ -200,6 +189,7 @@ class Sampler():
|
|
|
200
189
|
else:
|
|
201
190
|
initial_molecular_database = initcond_sampler.sample(**initcond_sampler_kwargs)
|
|
202
191
|
if nthreads is None:
|
|
192
|
+
import joblib
|
|
203
193
|
nthreads = joblib.cpu_count()
|
|
204
194
|
if stop_function is None:
|
|
205
195
|
stop_function = internal_stop_function
|
|
@@ -278,6 +268,7 @@ class Sampler():
|
|
|
278
268
|
else:
|
|
279
269
|
initial_molecular_database = initcond_sampler.sample(**initcond_sampler_kwargs)
|
|
280
270
|
if nthreads is None:
|
|
271
|
+
import joblib
|
|
281
272
|
nthreads = joblib.cpu_count()
|
|
282
273
|
if stop_function is None:
|
|
283
274
|
stop_function = internal_stop_function
|
|
@@ -356,6 +347,7 @@ class Sampler():
|
|
|
356
347
|
else:
|
|
357
348
|
initial_molecular_database = initcond_sampler.sample(**initcond_sampler_kwargs)
|
|
358
349
|
if nthreads is None:
|
|
350
|
+
import joblib
|
|
359
351
|
nthreads = joblib.cpu_count()
|
|
360
352
|
if stop_function is None:
|
|
361
353
|
stop_function = internal_stop_function
|
|
@@ -426,6 +418,7 @@ class Sampler():
|
|
|
426
418
|
traj = dyn.molecular_trajectory
|
|
427
419
|
return traj
|
|
428
420
|
|
|
421
|
+
from joblib import Parallel, delayed
|
|
429
422
|
trajs = Parallel(n_jobs=nthreads)(delayed(run_traj)(i) for i in range(len(initial_molecular_database)))
|
|
430
423
|
sys.stdout.flush()
|
|
431
424
|
|
|
@@ -598,6 +591,7 @@ class Sampler():
|
|
|
598
591
|
if 'nthreads' in kwargs:
|
|
599
592
|
nthreads = kwargs['nthreads']
|
|
600
593
|
else:
|
|
594
|
+
import joblib
|
|
601
595
|
nthreads = joblib.cpu_count()
|
|
602
596
|
if 'uq_tresholds' in kwargs:
|
|
603
597
|
uq_tresholds = kwargs['uq_tresholds']
|
|
@@ -846,7 +840,8 @@ class Sampler():
|
|
|
846
840
|
for i in range(N_gapMD):
|
|
847
841
|
if os.path.exists("gapMD_traj{}.h5".format(i)):
|
|
848
842
|
os.system("rm gapMD_traj{}.h5".format(i))
|
|
849
|
-
|
|
843
|
+
|
|
844
|
+
from joblib import Parallel, delayed
|
|
850
845
|
gapMD_trajs_down = Parallel(n_jobs=nthreads)(delayed(run_gapMD)(init_cond_for_gapMD_down,i, lower_surface=lower_surface_list[i], current_surface=lower_surface_list[i]) for i in range(len(init_cond_for_gapMD_down)))
|
|
851
846
|
|
|
852
847
|
sys.stdout.flush()
|
|
@@ -886,6 +881,7 @@ class Sampler():
|
|
|
886
881
|
upper_surface_list = []
|
|
887
882
|
for i in range(N_gapMD):
|
|
888
883
|
upper_surface_list.append(random.randrange(1,nstates))
|
|
884
|
+
from joblib import Parallel, delayed
|
|
889
885
|
gapMD_trajs_up = Parallel(n_jobs=nthreads)(delayed(run_gapMD)(init_cond_for_gapMD_up,i, lower_surface=upper_surface_list[i]-1, current_surface=upper_surface_list[i]) for i in range(len(init_cond_for_gapMD_up)))
|
|
890
886
|
sys.stdout.flush()
|
|
891
887
|
itraj=0
|
|
@@ -959,6 +955,7 @@ class excess_energy_generator():
|
|
|
959
955
|
bb = 7*aa
|
|
960
956
|
aa = min(aa,0.3)
|
|
961
957
|
return self.get_average_IEE(aa,bb,self.number_of_valence_electrons) - target
|
|
958
|
+
from scipy.optimize import fsolve
|
|
962
959
|
self.aa = fsolve(func,[0.2])[0]
|
|
963
960
|
self.bb = 7*self.aa
|
|
964
961
|
self.aa = min(self.aa,0.3)
|
|
@@ -1210,6 +1207,8 @@ class delta_ml_model_trainer(ml_model_trainer):
|
|
|
1210
1207
|
class ml_model(models.ml_model):
|
|
1211
1208
|
def __init__(self,al_info={},model_file=None,device=None,verbose=False,ml_model_type='ANI',**kwargs):
|
|
1212
1209
|
if device is None:
|
|
1210
|
+
# to-do: that should be done just for the models using torch, otherwise loading takes time
|
|
1211
|
+
import torch
|
|
1213
1212
|
device = 'cuda' if torch.cuda.is_available() else 'cpu'
|
|
1214
1213
|
self.ml_model_type = ml_model_type
|
|
1215
1214
|
if model_file is None:
|
|
@@ -1470,6 +1469,7 @@ class ml_model(models.ml_model):
|
|
|
1470
1469
|
print(f" Correlation coefficient = {aux_model_validate_vPCC}")
|
|
1471
1470
|
|
|
1472
1471
|
# Value scatter plot of the main model
|
|
1472
|
+
import matplotlib.pyplot as plt
|
|
1473
1473
|
fig,ax = plt.subplots()
|
|
1474
1474
|
fig.set_size_inches(15,12)
|
|
1475
1475
|
diagonal_line = [min([min(values),min(estimated_values)]),max([max(values),max(estimated_values)])]
|
|
@@ -1883,6 +1883,7 @@ class ml_model_msani(models.ml_model):
|
|
|
1883
1883
|
print(f" Correlation coefficient = {aux_model_validate_vPCC}")
|
|
1884
1884
|
|
|
1885
1885
|
# Value scatter plot of the main model
|
|
1886
|
+
import matplotlib.pyplot as plt
|
|
1886
1887
|
fig,ax = plt.subplots()
|
|
1887
1888
|
fig.set_size_inches(15,12)
|
|
1888
1889
|
diagonal_line = [min([min(values),min(estimated_values)]),max([max(values),max(estimated_values)])]
|
|
@@ -695,6 +695,10 @@ class mlatom_args(ArgsBase):
|
|
|
695
695
|
elif len(tasks) > 1:
|
|
696
696
|
if self.selfCorrect:
|
|
697
697
|
self._task = 'selfCorrect'
|
|
698
|
+
elif 'geomopt' in tasks and 'freq' in tasks:
|
|
699
|
+
self._task = 'optfreq'
|
|
700
|
+
elif 'ts' in tasks and 'freq' in tasks:
|
|
701
|
+
self._task = 'tsfreq'
|
|
698
702
|
else:
|
|
699
703
|
if 'useMLmodel' in tasks:
|
|
700
704
|
tasks.remove('useMLmodel')
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
!---------------------------------------------------------------------------!
|
|
6
6
|
! data: Module for working with data !
|
|
7
7
|
! Implementations by: Pavlo O. Dral, Fuchun Ge, !
|
|
8
|
-
! Shuang Zhang, Yi-Fan Hou, Yanchi Ou
|
|
8
|
+
! Shuang Zhang, Yi-Fan Hou, Yanchi Ou, Mikołaj Martyka !
|
|
9
9
|
!---------------------------------------------------------------------------!
|
|
10
10
|
'''
|
|
11
11
|
|
|
@@ -13,6 +13,7 @@ from __future__ import annotations
|
|
|
13
13
|
from typing import Any, Union, Dict, List, Optional, Iterable
|
|
14
14
|
import uuid, copy, os, json
|
|
15
15
|
import numpy as np
|
|
16
|
+
import math
|
|
16
17
|
import h5py
|
|
17
18
|
import functools
|
|
18
19
|
from . import constants
|
|
@@ -142,6 +143,10 @@ def load_return_molecule(filename=None, format='json'):
|
|
|
142
143
|
jsonfile = open(filename, 'r')
|
|
143
144
|
moldict = json.load(jsonfile)
|
|
144
145
|
newmol = dict_to_molecule_class_instance(moldict)
|
|
146
|
+
elif format.casefold() == 'xyz'.casefold():
|
|
147
|
+
newmol = molecule.from_xyz_file(filename)
|
|
148
|
+
elif format.casefold() == 'xyzstring'.casefold():
|
|
149
|
+
newmol = molecule.from_xyz_string(filename)
|
|
145
150
|
elif format.casefold() == 'gaussian'.casefold():
|
|
146
151
|
from .interfaces import gaussian_interface
|
|
147
152
|
newmol = gaussian_interface.parse_gaussian_output(filename=filename)
|
|
@@ -663,7 +668,78 @@ class molecule:
|
|
|
663
668
|
new_molecule = copy.deepcopy(self)
|
|
664
669
|
new_molecule.id = str(uuid.uuid4())
|
|
665
670
|
return new_molecule
|
|
671
|
+
def bond_length(self, a1, a2):
|
|
672
|
+
"""Return the distance between atom numbers a1 and a2.
|
|
666
673
|
|
|
674
|
+
Atoms are numbered from zero.
|
|
675
|
+
|
|
676
|
+
"""
|
|
677
|
+
diff = self.atoms[a1].xyz_coordinates - self.atoms[a2].xyz_coordinates
|
|
678
|
+
return np.linalg.norm(diff)
|
|
679
|
+
|
|
680
|
+
def bond_angle(self, a1, a2, a3, degrees=True):
|
|
681
|
+
"""Return the bond angle a1-a2-a3.
|
|
682
|
+
|
|
683
|
+
The angle is defined by the vectors a1-a2 and a2-a3.
|
|
684
|
+
Atoms are numbered from zero.
|
|
685
|
+
based on Tom Keal MNDOtools.py, October 2007
|
|
686
|
+
degrees - if true, return angle in degrees, else radians.
|
|
687
|
+
|
|
688
|
+
"""
|
|
689
|
+
# Based on the bond angle routine from geoman.f90 by Eduardo Fabiano
|
|
690
|
+
# vector 1 = 1->2
|
|
691
|
+
v1 = self.atoms[a2].xyz_coordinates - self.atoms[a1].xyz_coordinates
|
|
692
|
+
v1 = v1/np.linalg.norm(v1)
|
|
693
|
+
|
|
694
|
+
# vector 2 = 2->3
|
|
695
|
+
v2 = self.atoms[a3].xyz_coordinates - self.atoms[a2].xyz_coordinates
|
|
696
|
+
v2 = v2/np.linalg.norm(v2)
|
|
697
|
+
|
|
698
|
+
# dot product
|
|
699
|
+
dotp = np.dot(v1, v2)
|
|
700
|
+
# angle in radians
|
|
701
|
+
ang = math.pi - math.acos(dotp)
|
|
702
|
+
if degrees:
|
|
703
|
+
ang *= (180.0 / math.pi)
|
|
704
|
+
return ang
|
|
705
|
+
def dihedral_angle(self, a1, a2, a3, a4, degrees=True):
|
|
706
|
+
"""Return the dihedral angle a1-a2-a3-a4.
|
|
707
|
+
|
|
708
|
+
The angle is defined between the planes a1-a2-a3 and a2-a3-a4.
|
|
709
|
+
Atoms are numbered from zero.
|
|
710
|
+
based on Tom Keal MNDOtools.py, October 2007
|
|
711
|
+
|
|
712
|
+
degrees - if true, return angle in degrees, else radians.
|
|
713
|
+
|
|
714
|
+
"""
|
|
715
|
+
# Based on the dihedral routine from geoman.f90 by Eduardo Fabiano
|
|
716
|
+
# vector 1 = 1->2
|
|
717
|
+
v1 = self.atoms[a2].xyz_coordinates - self.atoms[a1].xyz_coordinates
|
|
718
|
+
v1 = v1/np.linalg.norm(v1)
|
|
719
|
+
|
|
720
|
+
# vector 2 = 2->3
|
|
721
|
+
v2 = self.atoms[a3].xyz_coordinates - self.atoms[a2].xyz_coordinates
|
|
722
|
+
v2 = v2/np.linalg.norm(v2)
|
|
723
|
+
|
|
724
|
+
# vector 3 = 3->4
|
|
725
|
+
v3 = self.atoms[a4].xyz_coordinates - self.atoms[a3].xyz_coordinates
|
|
726
|
+
v3 = v3/np.linalg.norm(v3)
|
|
727
|
+
|
|
728
|
+
# vector product 1 = v1^v2
|
|
729
|
+
w1 = np.cross(v1,v2)
|
|
730
|
+
w1 = w1/np.linalg.norm(w1)
|
|
731
|
+
|
|
732
|
+
# vector product 2 = v3^v2
|
|
733
|
+
w2 = np.cross(v3,v2)
|
|
734
|
+
w2 = w2/np.linalg.norm(w2)
|
|
735
|
+
|
|
736
|
+
# dot product
|
|
737
|
+
dotp = np.dot(w1,w2)
|
|
738
|
+
# angle in radians
|
|
739
|
+
ang = math.pi - math.acos(dotp)
|
|
740
|
+
if degrees:
|
|
741
|
+
ang *= (180.0 / math.pi)
|
|
742
|
+
return ang
|
|
667
743
|
def proliferate(
|
|
668
744
|
self,
|
|
669
745
|
shifts: Optional[Iterable] = None,
|
|
@@ -1647,7 +1723,7 @@ class molecular_database:
|
|
|
1647
1723
|
'''
|
|
1648
1724
|
return molecular_database([mol.proliferate(*args, **kwargs) for mol in self])
|
|
1649
1725
|
|
|
1650
|
-
def dump(self, filename=None, format=
|
|
1726
|
+
def dump(self, filename=None, format='json'):
|
|
1651
1727
|
'''
|
|
1652
1728
|
Dump the molecular database to a file.
|
|
1653
1729
|
'''
|
|
@@ -1663,14 +1739,21 @@ class molecular_database:
|
|
|
1663
1739
|
jsonfile = open(filename, 'r')
|
|
1664
1740
|
data = json.load(jsonfile)
|
|
1665
1741
|
self.molecules = []
|
|
1666
|
-
for
|
|
1667
|
-
self.molecules.append(dict_to_molecule_class_instance(
|
|
1668
|
-
|
|
1742
|
+
for mol in data['molecules']:
|
|
1743
|
+
self.molecules.append(dict_to_molecule_class_instance(mol))
|
|
1744
|
+
elif format.casefold() == 'npz'.casefold():
|
|
1669
1745
|
with np.load(filename, allow_pickle=True) as npz:
|
|
1670
1746
|
data = dict(npz)
|
|
1671
1747
|
self.molecules = []
|
|
1672
|
-
for
|
|
1673
|
-
self.molecules.append(dict_to_molecule_class_instance(
|
|
1748
|
+
for mol in data['molecules']:
|
|
1749
|
+
self.molecules.append(dict_to_molecule_class_instance(mol))
|
|
1750
|
+
elif format.casefold() == 'gaussian'.casefold():
|
|
1751
|
+
mol = molecule.load(filename, format=format)
|
|
1752
|
+
if 'molecular_database' in mol.__dict__.keys():
|
|
1753
|
+
for key in mol.molecular_database.__dict__.keys():
|
|
1754
|
+
self.__dict__[key] = mol.molecular_database.__dict__[key]
|
|
1755
|
+
else:
|
|
1756
|
+
self.molecules.append(mol)
|
|
1674
1757
|
return self
|
|
1675
1758
|
|
|
1676
1759
|
@classmethod
|
|
@@ -1887,6 +1970,14 @@ def dict_to_molecule_class_instance(dd):
|
|
|
1887
1970
|
mol.atoms.append(dict_to_atom_class_instance(aa))
|
|
1888
1971
|
elif key == 'electronic_states':
|
|
1889
1972
|
mol.electronic_states = [dict_to_molecule_class_instance(state_dict) for state_dict in dd[key]]
|
|
1973
|
+
elif key == 'molecular_database':
|
|
1974
|
+
mol.molecular_database = molecular_database()
|
|
1975
|
+
mol.molecular_database.molecules = [dict_to_molecule_class_instance(state_dict) for state_dict in dd[key]['molecules']]
|
|
1976
|
+
elif key == 'optimization_trajectory':
|
|
1977
|
+
mol.optimization_trajectory = molecular_trajectory()
|
|
1978
|
+
mol.optimization_trajectory.steps = [molecular_trajectory_step(step=state_dict['step'],
|
|
1979
|
+
molecule=dict_to_molecule_class_instance(state_dict['molecule']))
|
|
1980
|
+
for state_dict in dd[key]['steps']]
|
|
1890
1981
|
elif type(dd[key]) == dict:
|
|
1891
1982
|
if 'parent' in dd[key].keys():
|
|
1892
1983
|
dict_to_properties_tree_node_class_instance(dd, key, mol)
|
|
@@ -2134,6 +2225,13 @@ class molecular_trajectory():
|
|
|
2134
2225
|
if not key in ['step', 'molecule']:
|
|
2135
2226
|
self.steps[-1].__dict__[key] = step[key]
|
|
2136
2227
|
|
|
2228
|
+
elif format.casefold() == 'gaussian'.casefold():
|
|
2229
|
+
mol = molecule.load(filename, format=format)
|
|
2230
|
+
if 'optimization_trajectory' in mol.__dict__.keys():
|
|
2231
|
+
for key in mol.optimization_trajectory.__dict__.keys():
|
|
2232
|
+
self.__dict__[key] = mol.optimization_trajectory.__dict__[key]
|
|
2233
|
+
else:
|
|
2234
|
+
raise ValueError('No optimization trajectory could be parsed from the Gaussian output file')
|
|
2137
2235
|
|
|
2138
2236
|
def get_xyz_string(self) -> str:
|
|
2139
2237
|
'''
|
|
@@ -129,9 +129,11 @@ def dimer_method(initial_molecule, model,
|
|
|
129
129
|
atoms.calc = MLatomCalculator(model=model, model_predict_kwargs= model_predict_kwargs, save_optimization_trajectory=True)
|
|
130
130
|
|
|
131
131
|
from ase.dimer import DimerControl, MinModeAtoms, MinModeTranslate
|
|
132
|
+
|
|
133
|
+
random_seed = kwargs.pop('random_seed') if 'random_seed' in kwargs else None
|
|
132
134
|
|
|
133
135
|
with DimerControl(**kwargs) as d_control:
|
|
134
|
-
d_atoms = MinModeAtoms(atoms, d_control, random_seed =
|
|
136
|
+
d_atoms = MinModeAtoms(atoms, d_control, random_seed = random_seed)
|
|
135
137
|
d_atoms.displace()
|
|
136
138
|
with MinModeTranslate(d_atoms) as dim_rlx:
|
|
137
139
|
dim_rlx.run(fmax=convergence_criterion_for_forces,
|