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.
Files changed (142) hide show
  1. {mlatom-3.16.0/src/mlatom.egg-info → mlatom-3.16.2}/PKG-INFO +4 -4
  2. {mlatom-3.16.0 → mlatom-3.16.2}/README.md +3 -3
  3. {mlatom-3.16.0 → mlatom-3.16.2}/setup.py +1 -1
  4. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatom.py +3 -2
  5. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLtasks.py +20 -5
  6. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/al.py +15 -13
  7. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/al_utils.py +14 -13
  8. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/args_class.py +4 -0
  9. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/data.py +105 -7
  10. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/__init__.py +5 -1
  11. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/ase_interface.py +3 -1
  12. mlatom-3.16.2/src/mlatom/interfaces/dftbplus_interface.py +235 -0
  13. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/gaussian_interface.py +106 -6
  14. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/pyscf_interface.py +6 -4
  15. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/torchani_interface.py +20 -10
  16. mlatom-3.16.2/src/mlatom/interfaces/xtb_interface.py +338 -0
  17. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/models.py +6 -5
  18. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/simulations.py +37 -22
  19. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/spectra.py +3 -2
  20. mlatom-3.16.2/src/mlatom/xyz.py +102 -0
  21. {mlatom-3.16.0 → mlatom-3.16.2/src/mlatom.egg-info}/PKG-INFO +4 -4
  22. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom.egg-info/SOURCES.txt +1 -0
  23. mlatom-3.16.0/src/mlatom/interfaces/xtb_interface.py +0 -209
  24. mlatom-3.16.0/src/mlatom/xyz.py +0 -65
  25. {mlatom-3.16.0 → mlatom-3.16.2}/LICENSE.txt +0 -0
  26. {mlatom-3.16.0 → mlatom-3.16.2}/setup.cfg +0 -0
  27. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/GICnet.py +0 -0
  28. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLTPA.py +0 -0
  29. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/ML_NEA.py +0 -0
  30. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF +0 -0
  31. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/A_KRR.f90 +0 -0
  32. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/A_KRR_kernel.f90 +0 -0
  33. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/D_CoulombMatrix.f90 +0 -0
  34. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/D_ID.f90 +0 -0
  35. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/D_rel2eq.f90 +0 -0
  36. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/MLatomF.f90 +0 -0
  37. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/MLatomFInfo.f90 +0 -0
  38. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/MLmodel.f90 +0 -0
  39. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/Makefile +0 -0
  40. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/Makefile.intel +0 -0
  41. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/__init__.py +0 -0
  42. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/analyze.f90 +0 -0
  43. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/constants.f90 +0 -0
  44. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/cs.cpp +0 -0
  45. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/dataset.f90 +0 -0
  46. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/mathUtils.f90 +0 -0
  47. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/molDescr.f90 +0 -0
  48. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/optionsModule.f90 +0 -0
  49. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/precision.f90 +0 -0
  50. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/recover.sh +0 -0
  51. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/sampling.f90 +0 -0
  52. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/statistics.f90 +0 -0
  53. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/stopper.f90 +0 -0
  54. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/strings.f90 +0 -0
  55. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/timing.f90 +0 -0
  56. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/MLatomF_src/types.f90 +0 -0
  57. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/__init__.py +0 -0
  58. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1.py +0 -0
  59. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/__init__.py +0 -0
  60. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_cc_cv0.pt +0 -0
  61. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_cc_cv1.pt +0 -0
  62. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_cc_cv2.pt +0 -0
  63. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_cc_cv3.pt +0 -0
  64. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_cc_cv4.pt +0 -0
  65. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_cc_cv5.pt +0 -0
  66. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_cc_cv6.pt +0 -0
  67. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_cc_cv7.pt +0 -0
  68. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_dft_cv0.pt +0 -0
  69. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_dft_cv1.pt +0 -0
  70. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_dft_cv2.pt +0 -0
  71. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_dft_cv3.pt +0 -0
  72. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_dft_cv4.pt +0 -0
  73. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_dft_cv5.pt +0 -0
  74. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_dft_cv6.pt +0 -0
  75. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm1_model/aiqm1_dft_cv7.pt +0 -0
  76. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2.py +0 -0
  77. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2_model/__init__.py +0 -0
  78. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2_model/aiqm2_cv0.pt +0 -0
  79. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2_model/aiqm2_cv1.pt +0 -0
  80. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2_model/aiqm2_cv2.pt +0 -0
  81. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2_model/aiqm2_cv3.pt +0 -0
  82. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2_model/aiqm2_cv4.pt +0 -0
  83. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2_model/aiqm2_cv5.pt +0 -0
  84. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2_model/aiqm2_cv6.pt +0 -0
  85. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/aiqm2_model/aiqm2_cv7.pt +0 -0
  86. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/ccsdtstarcbs.py +0 -0
  87. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/composite_methods.py +0 -0
  88. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/constants.py +0 -0
  89. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/conversions.py +0 -0
  90. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/cs.so +0 -0
  91. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/decorators.py +0 -0
  92. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/dens.py +0 -0
  93. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/doc.py +0 -0
  94. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/fortran/KREG.f90 +0 -0
  95. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/fortran/KREG.so +0 -0
  96. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/fortran/__init__.py +0 -0
  97. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/fortran/compile.py +0 -0
  98. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/fortran/mathUtils.f90 +0 -0
  99. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/fortran/stopper.f90 +0 -0
  100. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/functionsGICnet.py +0 -0
  101. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/gap_md.py +0 -0
  102. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/header.py +0 -0
  103. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/initial_conditions.py +0 -0
  104. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interface_MLatomF.py +0 -0
  105. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/columbus_interface.py +0 -0
  106. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/dftd3_interface.py +0 -0
  107. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/dftd4_interface.py +0 -0
  108. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/dpmd_interface.py +0 -0
  109. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/gap_interface.py +0 -0
  110. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/mace_interface.py +0 -0
  111. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/mndo_interface.py +0 -0
  112. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/orca_interface.py +0 -0
  113. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/physnet_interface.py +0 -0
  114. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/sgdml_interface.py +0 -0
  115. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/sparrow_interface.py +0 -0
  116. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/turbomole_interface.py +0 -0
  117. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/interfaces/xtb +0 -0
  118. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/kreg_api.py +0 -0
  119. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/log.py +0 -0
  120. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/md.py +0 -0
  121. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/md2vibr.py +0 -0
  122. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/md2vibr_cmd.py +0 -0
  123. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/md_cmd.py +0 -0
  124. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/md_parallel.py +0 -0
  125. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/mlatom_gui.py +0 -0
  126. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/mltpa/__init__.py +0 -0
  127. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/mltpa/mff.txt +0 -0
  128. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/mltpa/mltpa2022_2.pkl +0 -0
  129. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/mltpa/mltpa2022_2_new_.pkl +0 -0
  130. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/namd.py +0 -0
  131. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/plot.py +0 -0
  132. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/ref.json +0 -0
  133. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/shell_cmd.py +0 -0
  134. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/sliceData.py +0 -0
  135. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/stats.py +0 -0
  136. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/stopper.py +0 -0
  137. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/thermostat.py +0 -0
  138. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom/utils.py +0 -0
  139. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom.egg-info/dependency_links.txt +0 -0
  140. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom.egg-info/entry_points.txt +0 -0
  141. {mlatom-3.16.0 → mlatom-3.16.2}/src/mlatom.egg-info/requires.txt +0 -0
  142. {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.0
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.0
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.0, Xiamen University, Xiamen, China, 2013-2024.
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.0
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.0, Xiamen University, Xiamen, China, 2013-2024.
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}
@@ -43,7 +43,7 @@ with open(os.path.join(here, 'README.md')) as f:
43
43
 
44
44
  setup(
45
45
  name = pkg_name,
46
- version = "3.16.0",
46
+ version = "3.16.2",
47
47
  author = "Pavlo O. Dral",
48
48
  author_email = "admin@mlatom.com",
49
49
  license = 'MIT (modified)',
@@ -4,7 +4,7 @@
4
4
  !---------------------------------------------------------------------------!
5
5
  ! !
6
6
  ! MLatom: a Package for Atomistic Simulations with Machine Learning !
7
- ! MLatom 3.16.0 !
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.0, Xiamen University, Xiamen, China, 2013-2024. !
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 geomopt(args):
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
- geomopt(args)
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 = loading_data(args.XYZfile, charges=args.charges, multiplicities=args.multiplicities)
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 .al_utils import *
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 matplotlib.pyplot as plt
7
- import scipy
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 = simulations.run_in_parallel(molecular_database=moldb,
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=None):
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 molecule in data['molecules']:
1667
- self.molecules.append(dict_to_molecule_class_instance(molecule))
1668
- if format.casefold() == 'npz'.casefold():
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 molecule in data['molecules']:
1673
- self.molecules.append(dict_to_molecule_class_instance(molecule))
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
  '''
@@ -64,4 +64,8 @@ def pyscf():
64
64
 
65
65
  def orca():
66
66
  from .orca_interface import orca_methods as interface
67
- return interface
67
+ return interface
68
+
69
+ def dftbplus():
70
+ from .dftbplus_interface import dftbplus_methods as interface
71
+ return interface
@@ -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 = kwargs['random_seed'] if 'random_seed' in kwargs else 0)
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,