MultiOptPy 1.20.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. multioptpy/Calculator/__init__.py +0 -0
  2. multioptpy/Calculator/ase_calculation_tools.py +424 -0
  3. multioptpy/Calculator/ase_tools/__init__.py +0 -0
  4. multioptpy/Calculator/ase_tools/fairchem.py +28 -0
  5. multioptpy/Calculator/ase_tools/gamess.py +19 -0
  6. multioptpy/Calculator/ase_tools/gaussian.py +165 -0
  7. multioptpy/Calculator/ase_tools/mace.py +28 -0
  8. multioptpy/Calculator/ase_tools/mopac.py +19 -0
  9. multioptpy/Calculator/ase_tools/nwchem.py +31 -0
  10. multioptpy/Calculator/ase_tools/orca.py +22 -0
  11. multioptpy/Calculator/ase_tools/pygfn0.py +37 -0
  12. multioptpy/Calculator/dxtb_calculation_tools.py +344 -0
  13. multioptpy/Calculator/emt_calculation_tools.py +458 -0
  14. multioptpy/Calculator/gpaw_calculation_tools.py +183 -0
  15. multioptpy/Calculator/lj_calculation_tools.py +314 -0
  16. multioptpy/Calculator/psi4_calculation_tools.py +334 -0
  17. multioptpy/Calculator/pwscf_calculation_tools.py +189 -0
  18. multioptpy/Calculator/pyscf_calculation_tools.py +327 -0
  19. multioptpy/Calculator/sqm1_calculation_tools.py +611 -0
  20. multioptpy/Calculator/sqm2_calculation_tools.py +376 -0
  21. multioptpy/Calculator/tblite_calculation_tools.py +352 -0
  22. multioptpy/Calculator/tersoff_calculation_tools.py +818 -0
  23. multioptpy/Constraint/__init__.py +0 -0
  24. multioptpy/Constraint/constraint_condition.py +834 -0
  25. multioptpy/Coordinate/__init__.py +0 -0
  26. multioptpy/Coordinate/polar_coordinate.py +199 -0
  27. multioptpy/Coordinate/redundant_coordinate.py +638 -0
  28. multioptpy/IRC/__init__.py +0 -0
  29. multioptpy/IRC/converge_criteria.py +28 -0
  30. multioptpy/IRC/dvv.py +544 -0
  31. multioptpy/IRC/euler.py +439 -0
  32. multioptpy/IRC/hpc.py +564 -0
  33. multioptpy/IRC/lqa.py +540 -0
  34. multioptpy/IRC/modekill.py +662 -0
  35. multioptpy/IRC/rk4.py +579 -0
  36. multioptpy/Interpolation/__init__.py +0 -0
  37. multioptpy/Interpolation/adaptive_interpolation.py +283 -0
  38. multioptpy/Interpolation/binomial_interpolation.py +179 -0
  39. multioptpy/Interpolation/geodesic_interpolation.py +785 -0
  40. multioptpy/Interpolation/interpolation.py +156 -0
  41. multioptpy/Interpolation/linear_interpolation.py +473 -0
  42. multioptpy/Interpolation/savitzky_golay_interpolation.py +252 -0
  43. multioptpy/Interpolation/spline_interpolation.py +353 -0
  44. multioptpy/MD/__init__.py +0 -0
  45. multioptpy/MD/thermostat.py +185 -0
  46. multioptpy/MEP/__init__.py +0 -0
  47. multioptpy/MEP/pathopt_bneb_force.py +443 -0
  48. multioptpy/MEP/pathopt_dmf_force.py +448 -0
  49. multioptpy/MEP/pathopt_dneb_force.py +130 -0
  50. multioptpy/MEP/pathopt_ewbneb_force.py +207 -0
  51. multioptpy/MEP/pathopt_gpneb_force.py +512 -0
  52. multioptpy/MEP/pathopt_lup_force.py +113 -0
  53. multioptpy/MEP/pathopt_neb_force.py +225 -0
  54. multioptpy/MEP/pathopt_nesb_force.py +205 -0
  55. multioptpy/MEP/pathopt_om_force.py +153 -0
  56. multioptpy/MEP/pathopt_qsm_force.py +174 -0
  57. multioptpy/MEP/pathopt_qsmv2_force.py +304 -0
  58. multioptpy/ModelFunction/__init__.py +7 -0
  59. multioptpy/ModelFunction/avoiding_model_function.py +29 -0
  60. multioptpy/ModelFunction/binary_image_ts_search_model_function.py +47 -0
  61. multioptpy/ModelFunction/conical_model_function.py +26 -0
  62. multioptpy/ModelFunction/opt_meci.py +50 -0
  63. multioptpy/ModelFunction/opt_mesx.py +47 -0
  64. multioptpy/ModelFunction/opt_mesx_2.py +49 -0
  65. multioptpy/ModelFunction/seam_model_function.py +27 -0
  66. multioptpy/ModelHessian/__init__.py +0 -0
  67. multioptpy/ModelHessian/approx_hessian.py +147 -0
  68. multioptpy/ModelHessian/calc_params.py +227 -0
  69. multioptpy/ModelHessian/fischer.py +236 -0
  70. multioptpy/ModelHessian/fischerd3.py +360 -0
  71. multioptpy/ModelHessian/fischerd4.py +398 -0
  72. multioptpy/ModelHessian/gfn0xtb.py +633 -0
  73. multioptpy/ModelHessian/gfnff.py +709 -0
  74. multioptpy/ModelHessian/lindh.py +165 -0
  75. multioptpy/ModelHessian/lindh2007d2.py +707 -0
  76. multioptpy/ModelHessian/lindh2007d3.py +822 -0
  77. multioptpy/ModelHessian/lindh2007d4.py +1030 -0
  78. multioptpy/ModelHessian/morse.py +106 -0
  79. multioptpy/ModelHessian/schlegel.py +144 -0
  80. multioptpy/ModelHessian/schlegeld3.py +322 -0
  81. multioptpy/ModelHessian/schlegeld4.py +559 -0
  82. multioptpy/ModelHessian/shortrange.py +346 -0
  83. multioptpy/ModelHessian/swartd2.py +496 -0
  84. multioptpy/ModelHessian/swartd3.py +706 -0
  85. multioptpy/ModelHessian/swartd4.py +918 -0
  86. multioptpy/ModelHessian/tshess.py +40 -0
  87. multioptpy/Optimizer/QHAdam.py +61 -0
  88. multioptpy/Optimizer/__init__.py +0 -0
  89. multioptpy/Optimizer/abc_fire.py +83 -0
  90. multioptpy/Optimizer/adabelief.py +58 -0
  91. multioptpy/Optimizer/adabound.py +68 -0
  92. multioptpy/Optimizer/adadelta.py +65 -0
  93. multioptpy/Optimizer/adaderivative.py +56 -0
  94. multioptpy/Optimizer/adadiff.py +68 -0
  95. multioptpy/Optimizer/adafactor.py +70 -0
  96. multioptpy/Optimizer/adam.py +65 -0
  97. multioptpy/Optimizer/adamax.py +62 -0
  98. multioptpy/Optimizer/adamod.py +83 -0
  99. multioptpy/Optimizer/adamw.py +65 -0
  100. multioptpy/Optimizer/adiis.py +523 -0
  101. multioptpy/Optimizer/afire_neb.py +282 -0
  102. multioptpy/Optimizer/block_hessian_update.py +709 -0
  103. multioptpy/Optimizer/c2diis.py +491 -0
  104. multioptpy/Optimizer/component_wise_scaling.py +405 -0
  105. multioptpy/Optimizer/conjugate_gradient.py +82 -0
  106. multioptpy/Optimizer/conjugate_gradient_neb.py +345 -0
  107. multioptpy/Optimizer/coordinate_locking.py +405 -0
  108. multioptpy/Optimizer/dic_rsirfo.py +1015 -0
  109. multioptpy/Optimizer/ediis.py +417 -0
  110. multioptpy/Optimizer/eve.py +76 -0
  111. multioptpy/Optimizer/fastadabelief.py +61 -0
  112. multioptpy/Optimizer/fire.py +77 -0
  113. multioptpy/Optimizer/fire2.py +249 -0
  114. multioptpy/Optimizer/fire_neb.py +92 -0
  115. multioptpy/Optimizer/gan_step.py +486 -0
  116. multioptpy/Optimizer/gdiis.py +609 -0
  117. multioptpy/Optimizer/gediis.py +203 -0
  118. multioptpy/Optimizer/geodesic_step.py +433 -0
  119. multioptpy/Optimizer/gpmin.py +633 -0
  120. multioptpy/Optimizer/gpr_step.py +364 -0
  121. multioptpy/Optimizer/gradientdescent.py +78 -0
  122. multioptpy/Optimizer/gradientdescent_neb.py +52 -0
  123. multioptpy/Optimizer/hessian_update.py +433 -0
  124. multioptpy/Optimizer/hybrid_rfo.py +998 -0
  125. multioptpy/Optimizer/kdiis.py +625 -0
  126. multioptpy/Optimizer/lars.py +21 -0
  127. multioptpy/Optimizer/lbfgs.py +253 -0
  128. multioptpy/Optimizer/lbfgs_neb.py +355 -0
  129. multioptpy/Optimizer/linesearch.py +236 -0
  130. multioptpy/Optimizer/lookahead.py +40 -0
  131. multioptpy/Optimizer/nadam.py +64 -0
  132. multioptpy/Optimizer/newton.py +200 -0
  133. multioptpy/Optimizer/prodigy.py +70 -0
  134. multioptpy/Optimizer/purtubation.py +16 -0
  135. multioptpy/Optimizer/quickmin_neb.py +245 -0
  136. multioptpy/Optimizer/radam.py +75 -0
  137. multioptpy/Optimizer/rfo_neb.py +302 -0
  138. multioptpy/Optimizer/ric_rfo.py +842 -0
  139. multioptpy/Optimizer/rl_step.py +627 -0
  140. multioptpy/Optimizer/rmspropgrave.py +65 -0
  141. multioptpy/Optimizer/rsirfo.py +1647 -0
  142. multioptpy/Optimizer/rsprfo.py +1056 -0
  143. multioptpy/Optimizer/sadam.py +60 -0
  144. multioptpy/Optimizer/samsgrad.py +63 -0
  145. multioptpy/Optimizer/tr_lbfgs.py +678 -0
  146. multioptpy/Optimizer/trim.py +273 -0
  147. multioptpy/Optimizer/trust_radius.py +207 -0
  148. multioptpy/Optimizer/trust_radius_neb.py +121 -0
  149. multioptpy/Optimizer/yogi.py +60 -0
  150. multioptpy/OtherMethod/__init__.py +0 -0
  151. multioptpy/OtherMethod/addf.py +1150 -0
  152. multioptpy/OtherMethod/dimer.py +895 -0
  153. multioptpy/OtherMethod/elastic_image_pair.py +629 -0
  154. multioptpy/OtherMethod/modelfunction.py +456 -0
  155. multioptpy/OtherMethod/newton_traj.py +454 -0
  156. multioptpy/OtherMethod/twopshs.py +1095 -0
  157. multioptpy/PESAnalyzer/__init__.py +0 -0
  158. multioptpy/PESAnalyzer/calc_irc_curvature.py +125 -0
  159. multioptpy/PESAnalyzer/cmds_analysis.py +152 -0
  160. multioptpy/PESAnalyzer/koopman_analysis.py +268 -0
  161. multioptpy/PESAnalyzer/pca_analysis.py +314 -0
  162. multioptpy/Parameters/__init__.py +0 -0
  163. multioptpy/Parameters/atomic_mass.py +20 -0
  164. multioptpy/Parameters/atomic_number.py +22 -0
  165. multioptpy/Parameters/covalent_radii.py +44 -0
  166. multioptpy/Parameters/d2.py +61 -0
  167. multioptpy/Parameters/d3.py +63 -0
  168. multioptpy/Parameters/d4.py +103 -0
  169. multioptpy/Parameters/dreiding.py +34 -0
  170. multioptpy/Parameters/gfn0xtb_param.py +137 -0
  171. multioptpy/Parameters/gfnff_param.py +315 -0
  172. multioptpy/Parameters/gnb.py +104 -0
  173. multioptpy/Parameters/parameter.py +22 -0
  174. multioptpy/Parameters/uff.py +72 -0
  175. multioptpy/Parameters/unit_values.py +20 -0
  176. multioptpy/Potential/AFIR_potential.py +55 -0
  177. multioptpy/Potential/LJ_repulsive_potential.py +345 -0
  178. multioptpy/Potential/__init__.py +0 -0
  179. multioptpy/Potential/anharmonic_keep_potential.py +28 -0
  180. multioptpy/Potential/asym_elllipsoidal_potential.py +718 -0
  181. multioptpy/Potential/electrostatic_potential.py +69 -0
  182. multioptpy/Potential/flux_potential.py +30 -0
  183. multioptpy/Potential/gaussian_potential.py +101 -0
  184. multioptpy/Potential/idpp.py +516 -0
  185. multioptpy/Potential/keep_angle_potential.py +146 -0
  186. multioptpy/Potential/keep_dihedral_angle_potential.py +105 -0
  187. multioptpy/Potential/keep_outofplain_angle_potential.py +70 -0
  188. multioptpy/Potential/keep_potential.py +99 -0
  189. multioptpy/Potential/mechano_force_potential.py +74 -0
  190. multioptpy/Potential/nanoreactor_potential.py +52 -0
  191. multioptpy/Potential/potential.py +896 -0
  192. multioptpy/Potential/spacer_model_potential.py +221 -0
  193. multioptpy/Potential/switching_potential.py +258 -0
  194. multioptpy/Potential/universal_potential.py +34 -0
  195. multioptpy/Potential/value_range_potential.py +36 -0
  196. multioptpy/Potential/void_point_potential.py +25 -0
  197. multioptpy/SQM/__init__.py +0 -0
  198. multioptpy/SQM/sqm1/__init__.py +0 -0
  199. multioptpy/SQM/sqm1/sqm1_core.py +1792 -0
  200. multioptpy/SQM/sqm2/__init__.py +0 -0
  201. multioptpy/SQM/sqm2/calc_tools.py +95 -0
  202. multioptpy/SQM/sqm2/sqm2_basis.py +850 -0
  203. multioptpy/SQM/sqm2/sqm2_bond.py +119 -0
  204. multioptpy/SQM/sqm2/sqm2_core.py +303 -0
  205. multioptpy/SQM/sqm2/sqm2_data.py +1229 -0
  206. multioptpy/SQM/sqm2/sqm2_disp.py +65 -0
  207. multioptpy/SQM/sqm2/sqm2_eeq.py +243 -0
  208. multioptpy/SQM/sqm2/sqm2_overlapint.py +704 -0
  209. multioptpy/SQM/sqm2/sqm2_qm.py +578 -0
  210. multioptpy/SQM/sqm2/sqm2_rep.py +66 -0
  211. multioptpy/SQM/sqm2/sqm2_srb.py +70 -0
  212. multioptpy/Thermo/__init__.py +0 -0
  213. multioptpy/Thermo/normal_mode_analyzer.py +865 -0
  214. multioptpy/Utils/__init__.py +0 -0
  215. multioptpy/Utils/bond_connectivity.py +264 -0
  216. multioptpy/Utils/calc_tools.py +884 -0
  217. multioptpy/Utils/oniom.py +96 -0
  218. multioptpy/Utils/pbc.py +48 -0
  219. multioptpy/Utils/riemann_curvature.py +208 -0
  220. multioptpy/Utils/symmetry_analyzer.py +482 -0
  221. multioptpy/Visualization/__init__.py +0 -0
  222. multioptpy/Visualization/visualization.py +156 -0
  223. multioptpy/WFAnalyzer/MO_analysis.py +104 -0
  224. multioptpy/WFAnalyzer/__init__.py +0 -0
  225. multioptpy/Wrapper/__init__.py +0 -0
  226. multioptpy/Wrapper/autots.py +1239 -0
  227. multioptpy/Wrapper/ieip_wrapper.py +93 -0
  228. multioptpy/Wrapper/md_wrapper.py +92 -0
  229. multioptpy/Wrapper/neb_wrapper.py +94 -0
  230. multioptpy/Wrapper/optimize_wrapper.py +76 -0
  231. multioptpy/__init__.py +5 -0
  232. multioptpy/entrypoints.py +916 -0
  233. multioptpy/fileio.py +660 -0
  234. multioptpy/ieip.py +340 -0
  235. multioptpy/interface.py +1086 -0
  236. multioptpy/irc.py +529 -0
  237. multioptpy/moleculardynamics.py +432 -0
  238. multioptpy/neb.py +1267 -0
  239. multioptpy/optimization.py +1553 -0
  240. multioptpy/optimizer.py +709 -0
  241. multioptpy-1.20.2.dist-info/METADATA +438 -0
  242. multioptpy-1.20.2.dist-info/RECORD +246 -0
  243. multioptpy-1.20.2.dist-info/WHEEL +5 -0
  244. multioptpy-1.20.2.dist-info/entry_points.txt +9 -0
  245. multioptpy-1.20.2.dist-info/licenses/LICENSE +674 -0
  246. multioptpy-1.20.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,40 @@
1
+ import numpy as np
2
+
3
+ class TransitionStateHessian:
4
+ """
5
+ A class for modifying an existing Hessian matrix to introduce a negative eigenvalue
6
+ for transition state optimizations, but without using neg_eigenvalue directly as the replacement.
7
+ Instead, it applies a procedure to the targeted eigenvalue: first take its absolute value,
8
+ multiply by -1, and then add neg_eigenvalue.
9
+ """
10
+
11
+ def __init__(self):
12
+ pass
13
+
14
+ def create_ts_hessian(self, model_hessian, cart_gradient):
15
+
16
+ # Diagonalize the supplied Hessian
17
+ eigenvalues, eigenvectors = np.linalg.eigh(model_hessian)
18
+
19
+ if np.any(eigenvalues < -1e-8):
20
+ return model_hessian # No need to modify if negative eigenvalues already exist
21
+
22
+
23
+ count = 0
24
+ for i in range(len(eigenvalues)):
25
+ if abs(eigenvalues[i]) < 1e-8:
26
+ count += 1
27
+ else:
28
+ break
29
+
30
+
31
+ target_eigvec = eigenvectors[:, count]
32
+
33
+ P = np.eye(len(eigenvalues)) - 2.0 * np.outer(target_eigvec, target_eigvec)
34
+
35
+ ts_hessian = np.dot(P, model_hessian)
36
+
37
+ # Enforce symmetry
38
+ ts_hessian = 0.5 * (ts_hessian + ts_hessian.T)
39
+
40
+ return ts_hessian
@@ -0,0 +1,61 @@
1
+ import numpy as np
2
+ import copy
3
+
4
+ class QHAdam:
5
+ def __init__(self, **config):
6
+ #arXiv:1810.06801v4
7
+ self.adam_count = 1
8
+ self.DELTA = 0.1
9
+ self.beta_m = 0.9
10
+ self.beta_v = 0.999
11
+ self.Epsilon = 1e-12
12
+ self.nu_m = 1.0
13
+ self.nu_v = 1.0
14
+ self.Initialization = True
15
+ self.config = config
16
+ self.hessian = None
17
+ self.bias_hessian = None
18
+
19
+ return
20
+
21
+ def run(self, geom_num_list, B_g, pre_B_g=[], pre_geom=[], B_e=0.0, pre_B_e=0.0, pre_move_vector=[], initial_geom_num_list=[], g=[], pre_g=[]):
22
+ print("QHAdam")
23
+ if self.Initialization:
24
+ self.adam_m = geom_num_list * 0.0
25
+ self.adam_v = geom_num_list * 0.0
26
+ self.Initialization = False
27
+
28
+ adam_count = self.adam_count
29
+ adam_m = self.adam_m
30
+ adam_v = self.adam_v
31
+ new_adam_m = adam_m*0.0
32
+ new_adam_v = adam_v*0.0
33
+
34
+ for i in range(len(geom_num_list)):
35
+ new_adam_m[i] = copy.copy(self.beta_m*adam_m[i] + (1.0-self.beta_m)*(B_g[i]))
36
+ new_adam_v[i] = copy.copy(self.beta_v*adam_v[i] + (1.0-self.beta_v)*(B_g[i])**2)
37
+
38
+
39
+ move_vector = []
40
+
41
+ for i in range(len(geom_num_list)):
42
+ move_vector.append(self.DELTA*((1.0 - self.nu_m) * B_g[i] + new_adam_m[i] * self.nu_m)/np.sqrt(((1.0 - self.nu_v) * B_g[i] ** 2 + new_adam_v[i] * self.nu_v)+self.Epsilon))
43
+
44
+ self.adam_m = new_adam_m
45
+ self.adam_v = new_adam_v
46
+ self.adam_count += 1
47
+
48
+ return move_vector#Bohr
49
+ def set_hessian(self, hessian):
50
+ self.hessian = hessian
51
+ return
52
+
53
+ def set_bias_hessian(self, bias_hessian):
54
+ self.bias_hessian = bias_hessian
55
+ return
56
+
57
+ def get_hessian(self):
58
+ return self.hessian
59
+
60
+ def get_bias_hessian(self):
61
+ return self.bias_hessian
File without changes
@@ -0,0 +1,83 @@
1
+ import numpy as np
2
+ import copy
3
+
4
+
5
+
6
+ class ABC_FIRE:
7
+ def __init__(self, **config):#MD-like optimization method.
8
+ #ABC_FIRE
9
+ #Computational Materials Science Volume 218, 5 February 2023, 111978
10
+ self.iter = 0
11
+ self.sub_iter = 0
12
+ self.N_acc = 5
13
+ self.f_inc = 1.10
14
+ self.f_acc = 0.99
15
+ self.f_dec = 0.50
16
+ self.dt_max = 0.8
17
+ self.alpha_start = 0.1
18
+
19
+ self.display_flag = True
20
+ self.config = config
21
+ self.Initialization = True
22
+ self.hessian = None
23
+ self.bias_hessian = None
24
+
25
+ return
26
+
27
+ def run(self, geom_num_list, B_g, pre_B_g=[], pre_geom=[], B_e=0.0, pre_B_e=0.0, pre_move_vector=[], initial_geom_num_list=[], g=[], pre_g=[]):
28
+
29
+
30
+
31
+ if self.Initialization:
32
+ self.dt = 0.1
33
+ self.alpha = self.alpha_start
34
+ self.n_reset = 0
35
+ self.pre_velocity = geom_num_list * 0.0
36
+ self.Initialization = False
37
+
38
+
39
+
40
+ velocity = (1.0 / (1.0 - (1.0 - self.alpha) ** (self.sub_iter) + 1e-10)) * (1.0 - self.alpha) * self.pre_velocity + self.alpha * (np.linalg.norm(self.pre_velocity, ord=2)/np.linalg.norm(B_g, ord=2)) * B_g
41
+
42
+ if self.iter > 0 and np.dot(self.pre_velocity.reshape(1, len(geom_num_list)), B_g.reshape(len(geom_num_list), 1)) > 0:
43
+ if self.n_reset > self.N_acc:
44
+ self.dt = min(self.dt * self.f_inc, self.dt_max)
45
+ self.alpha = self.alpha * self.f_acc
46
+ self.n_reset += 1
47
+ else:
48
+
49
+ velocity *= 0.0
50
+ self.alpha = self.alpha_start
51
+ self.dt *= self.f_dec
52
+ self.n_reset = 0
53
+
54
+ velocity += self.dt*B_g
55
+
56
+ move_vector = copy.copy(self.dt * velocity)
57
+
58
+ if self.display_flag:
59
+ print("FIRE")
60
+ print("dt, alpha, n_reset :", self.dt, self.alpha, self.n_reset)
61
+
62
+ self.pre_velocity = velocity
63
+ self.iter += 1
64
+ self.sub_iter += 1
65
+ if self.iter > 0:
66
+ if np.dot(velocity.reshape(1, len(geom_num_list)), B_g.reshape(len(geom_num_list), 1)) < 0:
67
+ self.sub_iter = 0
68
+ return move_vector#Bohr.
69
+
70
+ def set_hessian(self, hessian):
71
+ self.hessian = hessian
72
+ return
73
+
74
+ def set_bias_hessian(self, bias_hessian):
75
+ self.bias_hessian = bias_hessian
76
+ return
77
+
78
+
79
+ def get_hessian(self):
80
+ return self.hessian
81
+
82
+ def get_bias_hessian(self):
83
+ return self.bias_hessian
@@ -0,0 +1,58 @@
1
+ import numpy as np
2
+ import copy
3
+
4
+ class Adabelief:
5
+ def __init__(self, **config):
6
+ #AdaBelief
7
+ #ref. arXiv:2010.07468v5
8
+ self.adam_count = 1
9
+ self.DELTA = 0.03
10
+ self.beta_m = 0.9
11
+ self.beta_v = 0.999
12
+ self.Epsilon = 1e-15
13
+ self.Initialization = True
14
+ self.config = config
15
+ self.hessian = None
16
+ self.bias_hessian = None
17
+ return
18
+
19
+ def run(self, geom_num_list, B_g, pre_B_g=[], pre_geom=[], B_e=0.0, pre_B_e=0.0, pre_move_vector=[], initial_geom_num_list=[], g=[], pre_g=[]):
20
+ print("AdaBelief")
21
+ if self.Initialization:
22
+ self.adam_m = geom_num_list * 0.0
23
+ self.adam_v = geom_num_list * 0.0
24
+ self.Initialization = False
25
+
26
+ adam_count = self.adam_count
27
+ adam_m = self.adam_m
28
+ adam_v = self.adam_v
29
+ new_adam_m = adam_m*0.0
30
+ new_adam_v = adam_v*0.0
31
+
32
+ for i in range(len(geom_num_list)):
33
+ new_adam_m[i] = copy.copy(self.beta_m*adam_m[i] + (1.0-self.beta_m)*(B_g[i]))
34
+ new_adam_v[i] = copy.copy(self.beta_v*adam_v[i] + (1.0-self.beta_v)*(B_g[i]-new_adam_m[i])**2)
35
+
36
+ move_vector = []
37
+
38
+ for i in range(len(geom_num_list)):
39
+ move_vector.append(self.DELTA*new_adam_m[i]/np.sqrt(new_adam_v[i]+self.Epsilon))
40
+
41
+ self.adam_m = new_adam_m
42
+ self.adam_v = new_adam_v
43
+ self.adam_count += 1
44
+
45
+ return move_vector#Bohr
46
+ def set_hessian(self, hessian):
47
+ self.hessian = hessian
48
+ return
49
+
50
+ def set_bias_hessian(self, bias_hessian):
51
+ self.bias_hessian = bias_hessian
52
+ return
53
+
54
+ def get_hessian(self):
55
+ return self.hessian
56
+
57
+ def get_bias_hessian(self):
58
+ return self.bias_hessian
@@ -0,0 +1,68 @@
1
+ import numpy as np
2
+ import copy
3
+
4
+
5
+
6
+
7
+ class AdaBound:
8
+ def __init__(self, **config):
9
+ #AdaBound
10
+ #arXiv:1902.09843v1
11
+ self.adam_count = 1
12
+ self.beta_m = 0.9
13
+ self.beta_v = 0.999
14
+ self.DELTA = 0.05
15
+ self.Epsilon = 1e-08
16
+ self.Initialization = True
17
+ self.config = config
18
+ self.hessian = None
19
+ self.bias_hessian = None
20
+ return
21
+
22
+ def run(self, geom_num_list, B_g, pre_B_g=[], pre_geom=[], B_e=0.0, pre_B_e=0.0, pre_move_vector=[], initial_geom_num_list=[], g=[], pre_g=[]):
23
+ print("AdaBound")
24
+
25
+ if self.Initialization:
26
+ self.adam_m = geom_num_list * 0.0
27
+ self.adam_v = np.zeros((len(geom_num_list), 3, 3))
28
+
29
+ self.Initialization = False
30
+
31
+ move_vector = []
32
+
33
+
34
+ new_adam_m = self.adam_m*0.0
35
+ new_adam_v = self.adam_v*0.0
36
+ V = self.adam_m*0.0
37
+ Eta = self.adam_m*0.0
38
+ Eta_hat = self.adam_m*0.0
39
+
40
+ for i in range(len(geom_num_list)):
41
+ new_adam_m[i] = copy.copy(self.beta_m*self.adam_m[i] + (1.0-self.beta_m)*(B_g[i]))
42
+ new_adam_v[i] = copy.copy(self.beta_v*self.adam_v[i] + (1.0-self.beta_v)*(np.dot(np.array([B_g[i]]).T, np.array([B_g[i]]))))
43
+ V[i] = copy.copy(np.diag(new_adam_v[i]))
44
+
45
+ Eta_hat[i] = copy.copy(np.clip(self.DELTA/(np.sqrt(V[i]) + self.Epsilon), 0.1 - (0.1/((1.0 - self.beta_v) ** (self.adam_count + 1) + self.Epsilon)) ,0.1 + 0.1/((1.0 - self.beta_v) ** self.adam_count + self.Epsilon) ))
46
+ Eta[i] = copy.copy(Eta_hat[i]/np.sqrt(self.adam_count))
47
+
48
+ for i in range(len(geom_num_list)):
49
+ move_vector.append(Eta[i] * new_adam_m[i])
50
+
51
+ self.adam_m = new_adam_m
52
+ self.adam_v = new_adam_v
53
+ self.adam_count += 1
54
+ return move_vector
55
+
56
+ def set_hessian(self, hessian):
57
+ self.hessian = hessian
58
+ return
59
+
60
+ def set_bias_hessian(self, bias_hessian):
61
+ self.bias_hessian = bias_hessian
62
+ return
63
+
64
+ def get_hessian(self):
65
+ return self.hessian
66
+
67
+ def get_bias_hessian(self):
68
+ return self.bias_hessian
@@ -0,0 +1,65 @@
1
+ import numpy as np
2
+ import copy
3
+
4
+
5
+ class Adadelta:
6
+ def __init__(self, **config):
7
+ #Adadelta
8
+ #arXiv:1212.5701v1
9
+ self.adam_count = 1
10
+ self.beta_m = 0.9
11
+ self.beta_v = 0.999
12
+ self.DELTA = 0.03
13
+ self.Epsilon = 1e-06
14
+ self.RMS_DISPLACEMENT_THRESHOLD = 0.0
15
+ self.RMS_FORCE_THRESHOLD = 1e+10
16
+ self.Initialization = True
17
+ self.config = config
18
+ self.hessian = None
19
+ self.bias_hessian = None
20
+ return
21
+
22
+ def run(self, geom_num_list, B_g, pre_B_g=[], pre_geom=[], B_e=0.0, pre_B_e=0.0, pre_move_vector=[], initial_geom_num_list=[], g=[], pre_g=[]):#delta is not required. This method tends to converge local minima. This class doesnt work well.
23
+ print("Adadelta")
24
+ if self.Initialization:
25
+ self.adam_m = geom_num_list * 0.0
26
+ self.adam_v = geom_num_list * 0.0
27
+
28
+ self.Initialization = False
29
+ rho = 0.9
30
+ new_adam_m = self.adam_m*0.0
31
+ new_adam_v = self.adam_v*0.0
32
+
33
+ for i in range(len(geom_num_list)):
34
+ new_adam_m[i] = copy.copy(rho * self.adam_m[i] + (1.0 - rho)*(B_g[i]) ** 2)
35
+ move_vector = []
36
+
37
+ for i in range(len(geom_num_list)):
38
+ if self.adam_count > 1:
39
+ move_vector.append(B_g[i] * (np.sqrt(np.square(self.adam_v).mean()) + self.Epsilon)/(np.sqrt(np.square(new_adam_m).mean()) + self.Epsilon))
40
+ else:
41
+ move_vector.append(B_g[i])
42
+ if abs(np.sqrt(np.square(move_vector).mean())) < self.RMS_DISPLACEMENT_THRESHOLD and abs(np.sqrt(np.square(B_g).mean())) > self.RMS_FORCE_THRESHOLD:
43
+ move_vector = B_g
44
+
45
+ for i in range(len(geom_num_list)):
46
+ new_adam_v[i] = copy.copy(rho * self.adam_v[i] + (1.0 - rho) * (move_vector[i]) ** 2)
47
+
48
+ self.adam_m = new_adam_m
49
+ self.adam_v = new_adam_v
50
+ self.adam_count += 1
51
+ return move_vector
52
+
53
+ def set_hessian(self, hessian):
54
+ self.hessian = hessian
55
+ return
56
+
57
+ def set_bias_hessian(self, bias_hessian):
58
+ self.bias_hessian = bias_hessian
59
+ return
60
+
61
+ def get_hessian(self):
62
+ return self.hessian
63
+
64
+ def get_bias_hessian(self):
65
+ return self.bias_hessian
@@ -0,0 +1,56 @@
1
+ import numpy as np
2
+ import copy
3
+
4
+ class Adaderivative:
5
+ def __init__(self, **config):
6
+ #Engineering Applications of Artificial Intelligence 2023, 119, 105755. https://doi.org/10.1016/j.engappai.2022.105755
7
+ self.adam_count = 1
8
+ self.DELTA = 0.0001
9
+ self.beta_m = 0.9
10
+ self.beta_v = 0.999
11
+ self.Epsilon = 1e-12
12
+ self.Initialization = True
13
+ self.config = config
14
+ self.hessian = None
15
+ self.bias_hessian = None
16
+ return
17
+
18
+ def run(self, geom_num_list, B_g, pre_B_g, pre_geom=[], B_e=0.0, pre_B_e=0.0, pre_move_vector=[], initial_geom_num_list=[], g=[], pre_g=[]):
19
+ print("Adaderivative")
20
+ if self.Initialization:
21
+ self.adam_m = geom_num_list * 0.0
22
+ self.adam_v = geom_num_list * 0.0
23
+ self.Initialization = False
24
+
25
+ adam_count = self.adam_count
26
+ adam_m = self.adam_m
27
+ adam_v = self.adam_v
28
+ new_adam_m = adam_m*0.0
29
+ new_adam_v = adam_v*0.0
30
+
31
+ for i in range(len(geom_num_list)):
32
+ new_adam_m[i] = copy.copy((self.beta_m * adam_m[i] + (1.0-self.beta_m) * (B_g[i]) ))
33
+ new_adam_v[i] = copy.copy((self.beta_v * adam_v[i] + (1.0-self.beta_v) * (B_g[i] - pre_B_g[i]) ** 2))
34
+
35
+ move_vector = []
36
+
37
+ for i in range(len(geom_num_list)):
38
+ move_vector.append(self.DELTA*new_adam_m[i]/np.sqrt(new_adam_v[i]+self.Epsilon))
39
+ self.adam_m = new_adam_m
40
+ self.adam_v = new_adam_v
41
+ self.adam_count += 1
42
+
43
+ return move_vector#Bohr
44
+ def set_hessian(self, hessian):
45
+ self.hessian = hessian
46
+ return
47
+
48
+ def set_bias_hessian(self, bias_hessian):
49
+ self.bias_hessian = bias_hessian
50
+ return
51
+
52
+ def get_hessian(self):
53
+ return self.hessian
54
+
55
+ def get_bias_hessian(self):
56
+ return self.bias_hessian
@@ -0,0 +1,68 @@
1
+ import numpy as np
2
+ import copy
3
+
4
+
5
+
6
+
7
+ class AdaDiff:
8
+ def __init__(self, **config):
9
+ #AdaDiff
10
+ #ref. https://iopscience.iop.org/article/10.1088/1742-6596/2010/1/012027/pdf Dian Huang et al 2021 J. Phys.: Conf. Ser. 2010 012027
11
+ self.adam_count = 1
12
+ self.DELTA = 0.03
13
+ self.beta_m = 0.9
14
+ self.beta_v = 0.999
15
+ self.Epsilon = 1e-12
16
+ self.Initialization = True
17
+ self.config = config
18
+ self.hessian = None
19
+ self.bias_hessian = None
20
+ return
21
+
22
+ def run(self, geom_num_list, B_g, pre_B_g, pre_geom=[], B_e=0.0, pre_B_e=0.0, pre_move_vector=[], initial_geom_num_list=[], g=[], pre_g=[]):
23
+ print("AdaDiff")
24
+ if self.Initialization:
25
+ self.adam_m = geom_num_list * 0.0
26
+ self.adam_v = geom_num_list * 0.0
27
+ self.Initialization = False
28
+
29
+ adam_count = self.adam_count
30
+ adam_m = self.adam_m
31
+ adam_v = self.adam_v
32
+ new_adam_m = adam_m*0.0
33
+ new_adam_v = adam_v*0.0
34
+ new_adam_m_hat = adam_m*0.0
35
+ new_adam_v_hat = adam_v*0.0
36
+
37
+ for i in range(len(geom_num_list)):
38
+ new_adam_m[i] = copy.copy(self.beta_m*adam_m[i] + (1.0-self.beta_m)*(B_g[i]))
39
+ new_adam_v[i] = copy.copy(self.beta_v*adam_v[i] + (1.0-self.beta_v)*(B_g[i])**2 + (1.0-self.beta_v) * (B_g[i] - pre_B_g[i]) ** 2)
40
+
41
+
42
+ move_vector = []
43
+ for i in range(len(geom_num_list)):
44
+ new_adam_m_hat[i] = copy.copy(new_adam_m[i]/(1 - self.beta_m**adam_count))
45
+ new_adam_v_hat[i] = copy.copy((new_adam_v[i] + self.Epsilon)/(1 - self.beta_v**adam_count))
46
+
47
+
48
+ for i in range(len(geom_num_list)):
49
+ move_vector.append(self.DELTA*new_adam_m_hat[i]/np.sqrt(new_adam_v_hat[i]+self.Epsilon))
50
+ self.adam_m = new_adam_m
51
+ self.adam_v = new_adam_v
52
+ self.adam_count += 1
53
+
54
+ return move_vector#Bohr.
55
+
56
+ def set_hessian(self, hessian):
57
+ self.hessian = hessian
58
+ return
59
+
60
+ def set_bias_hessian(self, bias_hessian):
61
+ self.bias_hessian = bias_hessian
62
+ return
63
+
64
+ def get_hessian(self):
65
+ return self.hessian
66
+
67
+ def get_bias_hessian(self):
68
+ return self.bias_hessian
@@ -0,0 +1,70 @@
1
+ import numpy as np
2
+ import copy
3
+
4
+
5
+
6
+ class Adafactor:
7
+ def __init__(self, **config):
8
+ #Adafactor
9
+ #arXiv:1804.04235v1
10
+ self.adam_count = 1
11
+ self.beta_m = 0.9
12
+ self.beta_v = 0.999
13
+ self.DELTA = 0.06
14
+ self.Epsilon_1 = 1e-08
15
+ self.Epsilon_2 = self.DELTA
16
+ self.Initialization = True
17
+ self.config = config
18
+ self.hessian = None
19
+ self.bias_hessian = None
20
+ return
21
+
22
+ def run(self, geom_num_list, B_g, pre_B_g=[], pre_geom=[], B_e=0.0, pre_B_e=0.0, pre_move_vector=[], initial_geom_num_list=[], g=[], pre_g=[]):
23
+ print("Adafactor")
24
+
25
+ if self.Initialization:
26
+ self.adam_m = geom_num_list * 0.0
27
+ self.adam_v = geom_num_list * 0.0
28
+ self.adam_u = geom_num_list * 0.0
29
+
30
+ self.Initialization = False
31
+
32
+ beta = 1 - self.adam_count ** (-0.8)
33
+ rho = min(0.01, 1/np.sqrt(self.adam_count))
34
+ alpha = max(np.sqrt(np.square(geom_num_list).mean()), self.Epsilon_2) * rho
35
+ new_adam_m = self.adam_m
36
+ new_adam_v = self.adam_v*0.0
37
+ new_adam_u = self.adam_u*0.0
38
+ new_adam_u_hat = self.adam_u*0.0
39
+ for i in range(len(geom_num_list)):
40
+ new_adam_v[i] = copy.copy(beta*self.adam_v[i] + (1.0-beta)*((B_g[i])**2 + np.array([1]) * self.Epsilon_1))
41
+ new_adam_u[i] = copy.copy(B_g[i]/np.sqrt(new_adam_v[i]))
42
+
43
+
44
+ move_vector = []
45
+ for i in range(len(geom_num_list)):
46
+ new_adam_u_hat[i] = copy.copy(new_adam_u[i] / max(1, np.sqrt(np.square(new_adam_u).mean())))
47
+
48
+
49
+ for i in range(len(geom_num_list)):
50
+ move_vector.append(alpha*new_adam_u_hat[i])
51
+
52
+ self.adam_m = new_adam_m
53
+ self.adam_v = new_adam_v
54
+ self.adam_u = new_adam_u
55
+ self.adam_count += 1
56
+
57
+ return move_vector
58
+ def set_hessian(self, hessian):
59
+ self.hessian = hessian
60
+ return
61
+
62
+ def set_bias_hessian(self, bias_hessian):
63
+ self.bias_hessian = bias_hessian
64
+ return
65
+
66
+ def get_hessian(self):
67
+ return self.hessian
68
+
69
+ def get_bias_hessian(self):
70
+ return self.bias_hessian
@@ -0,0 +1,65 @@
1
+ import numpy as np
2
+ import copy
3
+
4
+
5
+
6
+ class Adam:
7
+ def __init__(self, **config):
8
+ #Adam
9
+ #arXiv:1412.6980
10
+ self.adam_count = 1
11
+ self.beta_m = 0.9
12
+ self.beta_v = 0.999
13
+ self.DELTA = 0.03
14
+ self.Epsilon = 1e-08
15
+ self.Initialization = True
16
+ self.config = config
17
+ self.hessian = None
18
+ self.bias_hessian = None
19
+
20
+
21
+ def run(self, geom_num_list, B_g, pre_B_g=[], pre_geom=[], B_e=0.0, pre_B_e=0.0, pre_move_vector=[], initial_geom_num_list=[], g=[], pre_g=[]):
22
+ print("Adam")
23
+ if self.Initialization:
24
+ self.adam_m = geom_num_list * 0.0
25
+ self.adam_v = geom_num_list * 0.0
26
+
27
+ self.Initialization = False
28
+
29
+ new_adam_m = self.adam_m*0.0
30
+ new_adam_v = self.adam_v*0.0
31
+
32
+ new_adam_m_hat = self.adam_m*0.0
33
+ new_adam_v_hat = self.adam_v*0.0
34
+ for i in range(len(geom_num_list)):
35
+ new_adam_m[i] = copy.copy(self.beta_m*self.adam_m[i] + (1.0-self.beta_m)*(B_g[i]))
36
+ new_adam_v[i] = copy.copy(self.beta_v*self.adam_v[i] + (1.0-self.beta_v)*(B_g[i])**2)
37
+
38
+
39
+ move_vector = []
40
+ for i in range(len(geom_num_list)):
41
+ new_adam_m_hat[i] = copy.copy(new_adam_m[i]/(1 - self.beta_m**self.adam_count))
42
+ new_adam_v_hat[i] = copy.copy((new_adam_v[i] + self.Epsilon)/(1 - self.beta_v**self.adam_count))
43
+
44
+
45
+ for i in range(len(geom_num_list)):
46
+ move_vector.append(self.DELTA*new_adam_m_hat[i]/np.sqrt(new_adam_v_hat[i]+self.Epsilon))
47
+ self.adam_m = new_adam_m
48
+ self.adam_v = new_adam_v
49
+ self.adam_count += 1
50
+
51
+ return move_vector#Bohr.
52
+
53
+ def set_hessian(self, hessian):
54
+ self.hessian = hessian
55
+ return
56
+
57
+ def set_bias_hessian(self, bias_hessian):
58
+ self.bias_hessian = bias_hessian
59
+ return
60
+
61
+ def get_hessian(self):
62
+ return self.hessian
63
+
64
+ def get_bias_hessian(self):
65
+ return self.bias_hessian