sciforma 1.0.0__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 (374) hide show
  1. sciforma-1.0.0/CHANGELOG.md +623 -0
  2. sciforma-1.0.0/Cargo.lock +2503 -0
  3. sciforma-1.0.0/Cargo.toml +131 -0
  4. sciforma-1.0.0/LICENSE +21 -0
  5. sciforma-1.0.0/PKG-INFO +554 -0
  6. sciforma-1.0.0/README.md +534 -0
  7. sciforma-1.0.0/crates/python/Cargo.toml +70 -0
  8. sciforma-1.0.0/crates/python/README.md +534 -0
  9. sciforma-1.0.0/crates/python/src/alpha.rs +888 -0
  10. sciforma-1.0.0/crates/python/src/analysis.rs +179 -0
  11. sciforma-1.0.0/crates/python/src/beta.rs +469 -0
  12. sciforma-1.0.0/crates/python/src/buffer.rs +151 -0
  13. sciforma-1.0.0/crates/python/src/compare.rs +138 -0
  14. sciforma-1.0.0/crates/python/src/dynamics.rs +243 -0
  15. sciforma-1.0.0/crates/python/src/eht.rs +352 -0
  16. sciforma-1.0.0/crates/python/src/electronic.rs +569 -0
  17. sciforma-1.0.0/crates/python/src/embed.rs +330 -0
  18. sciforma-1.0.0/crates/python/src/errors.rs +241 -0
  19. sciforma-1.0.0/crates/python/src/experimental.rs +2094 -0
  20. sciforma-1.0.0/crates/python/src/forcefield.rs +128 -0
  21. sciforma-1.0.0/crates/python/src/hf_ani_esp.rs +215 -0
  22. sciforma-1.0.0/crates/python/src/lib.rs +424 -0
  23. sciforma-1.0.0/crates/python/src/materials.rs +789 -0
  24. sciforma-1.0.0/crates/python/src/mesh.rs +83 -0
  25. sciforma-1.0.0/crates/python/src/ml.rs +602 -0
  26. sciforma-1.0.0/crates/python/src/naming.rs +336 -0
  27. sciforma-1.0.0/crates/python/src/nmr.rs +420 -0
  28. sciforma-1.0.0/crates/python/src/options.rs +126 -0
  29. sciforma-1.0.0/crates/python/src/population.rs +159 -0
  30. sciforma-1.0.0/crates/python/src/potentials.rs +52 -0
  31. sciforma-1.0.0/crates/python/src/properties.rs +335 -0
  32. sciforma-1.0.0/crates/python/src/reactivity.rs +138 -0
  33. sciforma-1.0.0/crates/python/src/rings.rs +196 -0
  34. sciforma-1.0.0/crates/python/src/smirks.rs +132 -0
  35. sciforma-1.0.0/crates/python/src/solvation.rs +99 -0
  36. sciforma-1.0.0/crates/python/src/spectroscopy.rs +566 -0
  37. sciforma-1.0.0/crates/python/src/stereo.rs +88 -0
  38. sciforma-1.0.0/crates/python/src/system.rs +239 -0
  39. sciforma-1.0.0/crates/python/src/transport.rs +107 -0
  40. sciforma-1.0.0/pyproject.toml +29 -0
  41. sciforma-1.0.0/src/alignment/kabsch.rs +598 -0
  42. sciforma-1.0.0/src/alignment/mod.rs +15 -0
  43. sciforma-1.0.0/src/alpha/cga.rs +13 -0
  44. sciforma-1.0.0/src/alpha/edl.rs +14 -0
  45. sciforma-1.0.0/src/alpha/gsm/backend.rs +873 -0
  46. sciforma-1.0.0/src/alpha/gsm/mod.rs +36 -0
  47. sciforma-1.0.0/src/alpha/gsm/saddle.rs +247 -0
  48. sciforma-1.0.0/src/alpha/gsm/string.rs +367 -0
  49. sciforma-1.0.0/src/alpha/kinetics/gpu.rs +81 -0
  50. sciforma-1.0.0/src/alpha/kinetics/mod.rs +1157 -0
  51. sciforma-1.0.0/src/alpha/mod.rs +52 -0
  52. sciforma-1.0.0/src/alpha/periodic_linear/gpu.rs +74 -0
  53. sciforma-1.0.0/src/alpha/periodic_linear/mod.rs +232 -0
  54. sciforma-1.0.0/src/alpha/reaction_dynamics/ci_neb.rs +583 -0
  55. sciforma-1.0.0/src/alpha/reaction_dynamics/complex.rs +670 -0
  56. sciforma-1.0.0/src/alpha/reaction_dynamics/constrained_opt.rs +747 -0
  57. sciforma-1.0.0/src/alpha/reaction_dynamics/electrostatics.rs +163 -0
  58. sciforma-1.0.0/src/alpha/reaction_dynamics/idpp.rs +150 -0
  59. sciforma-1.0.0/src/alpha/reaction_dynamics/irc.rs +349 -0
  60. sciforma-1.0.0/src/alpha/reaction_dynamics/mod.rs +1190 -0
  61. sciforma-1.0.0/src/alpha/reaction_dynamics/orbital_approach.rs +222 -0
  62. sciforma-1.0.0/src/alpha/reaction_dynamics/per_frame.rs +174 -0
  63. sciforma-1.0.0/src/alpha/reaction_dynamics/reactive_sites.rs +525 -0
  64. sciforma-1.0.0/src/alpha/reaction_dynamics/sampling.rs +255 -0
  65. sciforma-1.0.0/src/alpha/render_bridge/gpu.rs +66 -0
  66. sciforma-1.0.0/src/alpha/render_bridge/mod.rs +601 -0
  67. sciforma-1.0.0/src/alpha/sdr.rs +13 -0
  68. sciforma-1.0.0/src/ani/aev.rs +285 -0
  69. sciforma-1.0.0/src/ani/aev_params.rs +112 -0
  70. sciforma-1.0.0/src/ani/ani_tm.rs +287 -0
  71. sciforma-1.0.0/src/ani/api.rs +212 -0
  72. sciforma-1.0.0/src/ani/cutoff.rs +78 -0
  73. sciforma-1.0.0/src/ani/gradients.rs +480 -0
  74. sciforma-1.0.0/src/ani/mod.rs +21 -0
  75. sciforma-1.0.0/src/ani/neighbor.rs +288 -0
  76. sciforma-1.0.0/src/ani/nn.rs +234 -0
  77. sciforma-1.0.0/src/ani/weights.rs +185 -0
  78. sciforma-1.0.0/src/beta/cpm/mod.rs +15 -0
  79. sciforma-1.0.0/src/beta/kpm/chebyshev.rs +402 -0
  80. sciforma-1.0.0/src/beta/kpm/density.rs +386 -0
  81. sciforma-1.0.0/src/beta/kpm/mod.rs +32 -0
  82. sciforma-1.0.0/src/beta/mbh/blocks.rs +314 -0
  83. sciforma-1.0.0/src/beta/mbh/hessian.rs +352 -0
  84. sciforma-1.0.0/src/beta/mbh/mod.rs +30 -0
  85. sciforma-1.0.0/src/beta/mod.rs +48 -0
  86. sciforma-1.0.0/src/beta/rand_nla/mod.rs +24 -0
  87. sciforma-1.0.0/src/beta/rand_nla/nystrom.rs +292 -0
  88. sciforma-1.0.0/src/beta/rand_nla/solver.rs +336 -0
  89. sciforma-1.0.0/src/beta/riemannian.rs +16 -0
  90. sciforma-1.0.0/src/canonical_smiles.rs +580 -0
  91. sciforma-1.0.0/src/cga/conformer.rs +322 -0
  92. sciforma-1.0.0/src/cga/materials.rs +299 -0
  93. sciforma-1.0.0/src/cga/mod.rs +20 -0
  94. sciforma-1.0.0/src/cga/motor.rs +255 -0
  95. sciforma-1.0.0/src/cga/multivector.rs +438 -0
  96. sciforma-1.0.0/src/charges/gasteiger.rs +788 -0
  97. sciforma-1.0.0/src/charges/mod.rs +13 -0
  98. sciforma-1.0.0/src/charges_eeq/charges.rs +470 -0
  99. sciforma-1.0.0/src/charges_eeq/eeq2019.rs +151 -0
  100. sciforma-1.0.0/src/charges_eeq/eeq2019_data.rs +123 -0
  101. sciforma-1.0.0/src/charges_eeq/eeqbc.rs +327 -0
  102. sciforma-1.0.0/src/charges_eeq/eeqbc_data.rs +1673 -0
  103. sciforma-1.0.0/src/charges_eeq/energy.rs +140 -0
  104. sciforma-1.0.0/src/charges_eeq/mod.rs +44 -0
  105. sciforma-1.0.0/src/clustering.rs +272 -0
  106. sciforma-1.0.0/src/conformer.rs +767 -0
  107. sciforma-1.0.0/src/cpm/grand_potential.rs +329 -0
  108. sciforma-1.0.0/src/cpm/mod.rs +11 -0
  109. sciforma-1.0.0/src/cpm/surface.rs +140 -0
  110. sciforma-1.0.0/src/dft/becke.rs +123 -0
  111. sciforma-1.0.0/src/dft/ecp.rs +214 -0
  112. sciforma-1.0.0/src/dft/functionals/mod.rs +4 -0
  113. sciforma-1.0.0/src/dft/functionals/pbe.rs +176 -0
  114. sciforma-1.0.0/src/dft/functionals/svwn.rs +150 -0
  115. sciforma-1.0.0/src/dft/gradient.rs +281 -0
  116. sciforma-1.0.0/src/dft/grid.rs +196 -0
  117. sciforma-1.0.0/src/dft/ks_fock.rs +771 -0
  118. sciforma-1.0.0/src/dft/lebedev.rs +179 -0
  119. sciforma-1.0.0/src/dft/mod.rs +29 -0
  120. sciforma-1.0.0/src/dft/valence_basis.rs +263 -0
  121. sciforma-1.0.0/src/dft/vxc_matrix.rs +267 -0
  122. sciforma-1.0.0/src/dipole/dipole.rs +184 -0
  123. sciforma-1.0.0/src/dipole/mod.rs +5 -0
  124. sciforma-1.0.0/src/dispersion/dispersion.rs +209 -0
  125. sciforma-1.0.0/src/dispersion/mod.rs +25 -0
  126. sciforma-1.0.0/src/dispersion/params.rs +515 -0
  127. sciforma-1.0.0/src/distgeom/bounds/geometry.rs +448 -0
  128. sciforma-1.0.0/src/distgeom/bounds/matrix.rs +463 -0
  129. sciforma-1.0.0/src/distgeom/bounds/mod.rs +9 -0
  130. sciforma-1.0.0/src/distgeom/bounds/smoothing.rs +123 -0
  131. sciforma-1.0.0/src/distgeom/chirality.rs +278 -0
  132. sciforma-1.0.0/src/distgeom/embedding/coordinates.rs +603 -0
  133. sciforma-1.0.0/src/distgeom/embedding/mod.rs +7 -0
  134. sciforma-1.0.0/src/distgeom/embedding/rng.rs +133 -0
  135. sciforma-1.0.0/src/distgeom/mod.rs +40 -0
  136. sciforma-1.0.0/src/distgeom/parallel.rs +272 -0
  137. sciforma-1.0.0/src/distgeom/validation.rs +661 -0
  138. sciforma-1.0.0/src/dos/dos.rs +589 -0
  139. sciforma-1.0.0/src/dos/mod.rs +19 -0
  140. sciforma-1.0.0/src/dos/multi_method.rs +201 -0
  141. sciforma-1.0.0/src/dynamics.rs +2147 -0
  142. sciforma-1.0.0/src/dynamics_live/barostat.rs +111 -0
  143. sciforma-1.0.0/src/dynamics_live/langevin.rs +230 -0
  144. sciforma-1.0.0/src/dynamics_live/mod.rs +44 -0
  145. sciforma-1.0.0/src/dynamics_live/neighbor_list.rs +290 -0
  146. sciforma-1.0.0/src/dynamics_live/pbc.rs +283 -0
  147. sciforma-1.0.0/src/dynamics_live/state.rs +449 -0
  148. sciforma-1.0.0/src/edl/gpu.rs +113 -0
  149. sciforma-1.0.0/src/edl/mod.rs +1591 -0
  150. sciforma-1.0.0/src/eht/band_structure.rs +416 -0
  151. sciforma-1.0.0/src/eht/basis.rs +469 -0
  152. sciforma-1.0.0/src/eht/gradients.rs +297 -0
  153. sciforma-1.0.0/src/eht/hamiltonian.rs +121 -0
  154. sciforma-1.0.0/src/eht/marching_cubes.rs +983 -0
  155. sciforma-1.0.0/src/eht/metal_fallback.rs +348 -0
  156. sciforma-1.0.0/src/eht/mod.rs +35 -0
  157. sciforma-1.0.0/src/eht/overlap.rs +228 -0
  158. sciforma-1.0.0/src/eht/params.rs +1346 -0
  159. sciforma-1.0.0/src/eht/solver.rs +373 -0
  160. sciforma-1.0.0/src/eht/volume.rs +538 -0
  161. sciforma-1.0.0/src/esp/esp.rs +857 -0
  162. sciforma-1.0.0/src/esp/mod.rs +12 -0
  163. sciforma-1.0.0/src/etkdg.rs +110 -0
  164. sciforma-1.0.0/src/experimental_status.rs +300 -0
  165. sciforma-1.0.0/src/fd_gradient.rs +86 -0
  166. sciforma-1.0.0/src/fixture_io.rs +55 -0
  167. sciforma-1.0.0/src/forcefield/atom_typer.rs +247 -0
  168. sciforma-1.0.0/src/forcefield/bounds_ff/bfgs.rs +388 -0
  169. sciforma-1.0.0/src/forcefield/bounds_ff/energy.rs +572 -0
  170. sciforma-1.0.0/src/forcefield/bounds_ff/lbfgs.rs +612 -0
  171. sciforma-1.0.0/src/forcefield/bounds_ff/mod.rs +57 -0
  172. sciforma-1.0.0/src/forcefield/builder.rs +374 -0
  173. sciforma-1.0.0/src/forcefield/dg_terms.rs +185 -0
  174. sciforma-1.0.0/src/forcefield/energy.rs +655 -0
  175. sciforma-1.0.0/src/forcefield/etkdg_3d/builder.rs +740 -0
  176. sciforma-1.0.0/src/forcefield/etkdg_3d/energy.rs +790 -0
  177. sciforma-1.0.0/src/forcefield/etkdg_3d/gradient.rs +628 -0
  178. sciforma-1.0.0/src/forcefield/etkdg_3d/mod.rs +142 -0
  179. sciforma-1.0.0/src/forcefield/etkdg_3d/optimizer.rs +667 -0
  180. sciforma-1.0.0/src/forcefield/etkdg_lite.rs +305 -0
  181. sciforma-1.0.0/src/forcefield/gradients.rs +564 -0
  182. sciforma-1.0.0/src/forcefield/minimizer.rs +222 -0
  183. sciforma-1.0.0/src/forcefield/mmff94.rs +2513 -0
  184. sciforma-1.0.0/src/forcefield/mmff94_params.rs +5356 -0
  185. sciforma-1.0.0/src/forcefield/mod.rs +82 -0
  186. sciforma-1.0.0/src/forcefield/params.rs +391 -0
  187. sciforma-1.0.0/src/forcefield/reaxff/bond_order.rs +309 -0
  188. sciforma-1.0.0/src/forcefield/reaxff/eem.rs +161 -0
  189. sciforma-1.0.0/src/forcefield/reaxff/energy.rs +209 -0
  190. sciforma-1.0.0/src/forcefield/reaxff/gradients.rs +172 -0
  191. sciforma-1.0.0/src/forcefield/reaxff/mod.rs +29 -0
  192. sciforma-1.0.0/src/forcefield/reaxff/nonbonded.rs +187 -0
  193. sciforma-1.0.0/src/forcefield/reaxff/params.rs +327 -0
  194. sciforma-1.0.0/src/forcefield/reaxff/taper.rs +77 -0
  195. sciforma-1.0.0/src/forcefield/torsion_scan.rs +723 -0
  196. sciforma-1.0.0/src/forcefield/traits.rs +393 -0
  197. sciforma-1.0.0/src/forcefield/uff.rs +513 -0
  198. sciforma-1.0.0/src/gpu/aligned_types.rs +257 -0
  199. sciforma-1.0.0/src/gpu/alpb_born_gpu.rs +222 -0
  200. sciforma-1.0.0/src/gpu/ani_aev_gpu.rs +210 -0
  201. sciforma-1.0.0/src/gpu/backend_report.rs +104 -0
  202. sciforma-1.0.0/src/gpu/buffer_manager.rs +408 -0
  203. sciforma-1.0.0/src/gpu/context.rs +901 -0
  204. sciforma-1.0.0/src/gpu/cpm_gpu.rs +221 -0
  205. sciforma-1.0.0/src/gpu/d4_dispersion_gpu.rs +220 -0
  206. sciforma-1.0.0/src/gpu/density_grid_gpu.rs +282 -0
  207. sciforma-1.0.0/src/gpu/eeq_gpu.rs +271 -0
  208. sciforma-1.0.0/src/gpu/esp_grid_gpu.rs +266 -0
  209. sciforma-1.0.0/src/gpu/fock_build_gpu.rs +211 -0
  210. sciforma-1.0.0/src/gpu/gamma_matrix_gpu.rs +171 -0
  211. sciforma-1.0.0/src/gpu/hct_born_gpu.rs +213 -0
  212. sciforma-1.0.0/src/gpu/hessian_gpu.rs +148 -0
  213. sciforma-1.0.0/src/gpu/isosurface.rs +270 -0
  214. sciforma-1.0.0/src/gpu/marching_cubes.rs +727 -0
  215. sciforma-1.0.0/src/gpu/memory_budget.rs +604 -0
  216. sciforma-1.0.0/src/gpu/mmff94_gpu.rs +684 -0
  217. sciforma-1.0.0/src/gpu/mod.rs +57 -0
  218. sciforma-1.0.0/src/gpu/one_electron_gpu.rs +430 -0
  219. sciforma-1.0.0/src/gpu/orbital_grid.rs +595 -0
  220. sciforma-1.0.0/src/gpu/pipeline_coordinator.rs +471 -0
  221. sciforma-1.0.0/src/gpu/shader_registry.rs +413 -0
  222. sciforma-1.0.0/src/gpu/stda_gpu.rs +326 -0
  223. sciforma-1.0.0/src/gpu/two_electron_gpu.rs +536 -0
  224. sciforma-1.0.0/src/graph.rs +627 -0
  225. sciforma-1.0.0/src/hf/api.rs +395 -0
  226. sciforma-1.0.0/src/hf/basis.rs +434 -0
  227. sciforma-1.0.0/src/hf/cis.rs +392 -0
  228. sciforma-1.0.0/src/hf/cisd.rs +671 -0
  229. sciforma-1.0.0/src/hf/d3.rs +406 -0
  230. sciforma-1.0.0/src/hf/d3_data.rs +24457 -0
  231. sciforma-1.0.0/src/hf/fock.rs +117 -0
  232. sciforma-1.0.0/src/hf/gcp.rs +98 -0
  233. sciforma-1.0.0/src/hf/integrals.rs +125 -0
  234. sciforma-1.0.0/src/hf/mo_transform.rs +318 -0
  235. sciforma-1.0.0/src/hf/mod.rs +33 -0
  236. sciforma-1.0.0/src/hf/nuclear.rs +90 -0
  237. sciforma-1.0.0/src/hf/overlap_kin.rs +53 -0
  238. sciforma-1.0.0/src/hf/scf.rs +396 -0
  239. sciforma-1.0.0/src/hf/scf_trait.rs +196 -0
  240. sciforma-1.0.0/src/hf/srb.rs +88 -0
  241. sciforma-1.0.0/src/imd.rs +135 -0
  242. sciforma-1.0.0/src/ir/hessian.rs +679 -0
  243. sciforma-1.0.0/src/ir/mod.rs +20 -0
  244. sciforma-1.0.0/src/ir/peak_assignment.rs +878 -0
  245. sciforma-1.0.0/src/ir/vibrations.rs +1478 -0
  246. sciforma-1.0.0/src/kmesh.rs +1086 -0
  247. sciforma-1.0.0/src/lib.rs +3650 -0
  248. sciforma-1.0.0/src/materials/assembly.rs +829 -0
  249. sciforma-1.0.0/src/materials/cell.rs +1048 -0
  250. sciforma-1.0.0/src/materials/cif.rs +708 -0
  251. sciforma-1.0.0/src/materials/geometry_opt.rs +661 -0
  252. sciforma-1.0.0/src/materials/mod.rs +27 -0
  253. sciforma-1.0.0/src/materials/sbu.rs +257 -0
  254. sciforma-1.0.0/src/materials/scattering_factors.rs +396 -0
  255. sciforma-1.0.0/src/materials/space_group_table.rs +6750 -0
  256. sciforma-1.0.0/src/materials/space_groups.rs +273 -0
  257. sciforma-1.0.0/src/materials/topology_data.rs +734 -0
  258. sciforma-1.0.0/src/materials/variable_cell.rs +501 -0
  259. sciforma-1.0.0/src/mesh.rs +351 -0
  260. sciforma-1.0.0/src/method.rs +145 -0
  261. sciforma-1.0.0/src/ml/advanced_models.rs +812 -0
  262. sciforma-1.0.0/src/ml/descriptors.rs +670 -0
  263. sciforma-1.0.0/src/ml/ensemble.rs +599 -0
  264. sciforma-1.0.0/src/ml/getaway.rs +298 -0
  265. sciforma-1.0.0/src/ml/inference.rs +263 -0
  266. sciforma-1.0.0/src/ml/mlff.rs +227 -0
  267. sciforma-1.0.0/src/ml/mod.rs +31 -0
  268. sciforma-1.0.0/src/ml/models.rs +283 -0
  269. sciforma-1.0.0/src/ml/pharmacophore.rs +342 -0
  270. sciforma-1.0.0/src/ml/rdf_descriptors.rs +202 -0
  271. sciforma-1.0.0/src/ml/symmetry_functions.rs +263 -0
  272. sciforma-1.0.0/src/ml/whim.rs +450 -0
  273. sciforma-1.0.0/src/nmr/coupling.rs +668 -0
  274. sciforma-1.0.0/src/nmr/hose.rs +390 -0
  275. sciforma-1.0.0/src/nmr/mod.rs +34 -0
  276. sciforma-1.0.0/src/nmr/nucleus.rs +1747 -0
  277. sciforma-1.0.0/src/nmr/second_order.rs +393 -0
  278. sciforma-1.0.0/src/nmr/shifts.rs +1236 -0
  279. sciforma-1.0.0/src/nmr/spectrum.rs +716 -0
  280. sciforma-1.0.0/src/optimization/bfgs.rs +168 -0
  281. sciforma-1.0.0/src/optimization/mod.rs +7 -0
  282. sciforma-1.0.0/src/periodic.rs +399 -0
  283. sciforma-1.0.0/src/pm3/faithful.rs +2007 -0
  284. sciforma-1.0.0/src/pm3/gpu.rs +149 -0
  285. sciforma-1.0.0/src/pm3/gradients.rs +119 -0
  286. sciforma-1.0.0/src/pm3/mod.rs +55 -0
  287. sciforma-1.0.0/src/pm3/params.rs +346 -0
  288. sciforma-1.0.0/src/pm3/params_table.rs +1021 -0
  289. sciforma-1.0.0/src/pm3/solver.rs +929 -0
  290. sciforma-1.0.0/src/population/mod.rs +15 -0
  291. sciforma-1.0.0/src/population/npa.rs +413 -0
  292. sciforma-1.0.0/src/population/population.rs +961 -0
  293. sciforma-1.0.0/src/potentials.rs +58 -0
  294. sciforma-1.0.0/src/reactivity.rs +974 -0
  295. sciforma-1.0.0/src/render_bridge.rs +132 -0
  296. sciforma-1.0.0/src/riemannian/lbfgs.rs +542 -0
  297. sciforma-1.0.0/src/riemannian/manifold.rs +279 -0
  298. sciforma-1.0.0/src/riemannian/mod.rs +12 -0
  299. sciforma-1.0.0/src/rings/aromaticity.rs +219 -0
  300. sciforma-1.0.0/src/rings/ecfp.rs +296 -0
  301. sciforma-1.0.0/src/rings/mod.rs +13 -0
  302. sciforma-1.0.0/src/rings/sssr.rs +568 -0
  303. sciforma-1.0.0/src/scf/basis.rs +939 -0
  304. sciforma-1.0.0/src/scf/constants.rs +30 -0
  305. sciforma-1.0.0/src/scf/core_matrices.rs +186 -0
  306. sciforma-1.0.0/src/scf/density_matrix.rs +247 -0
  307. sciforma-1.0.0/src/scf/diis.rs +203 -0
  308. sciforma-1.0.0/src/scf/dipole_matrix.rs +145 -0
  309. sciforma-1.0.0/src/scf/energy.rs +115 -0
  310. sciforma-1.0.0/src/scf/extended_basis.rs +391 -0
  311. sciforma-1.0.0/src/scf/fock_matrix.rs +171 -0
  312. sciforma-1.0.0/src/scf/gaussian_integrals.rs +252 -0
  313. sciforma-1.0.0/src/scf/gradients.rs +202 -0
  314. sciforma-1.0.0/src/scf/kinetic_matrix.rs +140 -0
  315. sciforma-1.0.0/src/scf/mod.rs +43 -0
  316. sciforma-1.0.0/src/scf/mulliken.rs +152 -0
  317. sciforma-1.0.0/src/scf/nuclear_matrix.rs +298 -0
  318. sciforma-1.0.0/src/scf/obara_saika.rs +249 -0
  319. sciforma-1.0.0/src/scf/orthogonalization.rs +155 -0
  320. sciforma-1.0.0/src/scf/overlap_matrix.rs +112 -0
  321. sciforma-1.0.0/src/scf/scf_loop.rs +512 -0
  322. sciforma-1.0.0/src/scf/screening.rs +142 -0
  323. sciforma-1.0.0/src/scf/two_electron.rs +671 -0
  324. sciforma-1.0.0/src/scf/types.rs +204 -0
  325. sciforma-1.0.0/src/scf/uhf.rs +718 -0
  326. sciforma-1.0.0/src/scf/validation.rs +145 -0
  327. sciforma-1.0.0/src/sdr/embedding.rs +212 -0
  328. sciforma-1.0.0/src/sdr/mod.rs +14 -0
  329. sciforma-1.0.0/src/sdr/projections.rs +300 -0
  330. sciforma-1.0.0/src/smarts/matcher.rs +667 -0
  331. sciforma-1.0.0/src/smarts/mod.rs +20 -0
  332. sciforma-1.0.0/src/smarts/parser.rs +860 -0
  333. sciforma-1.0.0/src/smarts/torsion_data.rs +3271 -0
  334. sciforma-1.0.0/src/smarts/torsion_matcher.rs +237 -0
  335. sciforma-1.0.0/src/smiles.rs +875 -0
  336. sciforma-1.0.0/src/smirks.rs +593 -0
  337. sciforma-1.0.0/src/solvation.rs +502 -0
  338. sciforma-1.0.0/src/solvation_alpb/born.rs +209 -0
  339. sciforma-1.0.0/src/solvation_alpb/mod.rs +41 -0
  340. sciforma-1.0.0/src/solvation_alpb/solvation.rs +269 -0
  341. sciforma-1.0.0/src/spectroscopy/fluorescence.rs +387 -0
  342. sciforma-1.0.0/src/spectroscopy/giao_nmr.rs +306 -0
  343. sciforma-1.0.0/src/spectroscopy/hessian.rs +468 -0
  344. sciforma-1.0.0/src/spectroscopy/ir_intensities.rs +245 -0
  345. sciforma-1.0.0/src/spectroscopy/mod.rs +36 -0
  346. sciforma-1.0.0/src/spectroscopy/stda_uvvis.rs +847 -0
  347. sciforma-1.0.0/src/spectroscopy/transition_dipoles.rs +190 -0
  348. sciforma-1.0.0/src/spectroscopy/types.rs +105 -0
  349. sciforma-1.0.0/src/stereo.rs +1121 -0
  350. sciforma-1.0.0/src/surface/mod.rs +28 -0
  351. sciforma-1.0.0/src/surface/sasa.rs +335 -0
  352. sciforma-1.0.0/src/topology.rs +368 -0
  353. sciforma-1.0.0/src/transport/arrow.rs +328 -0
  354. sciforma-1.0.0/src/transport/chunked.rs +223 -0
  355. sciforma-1.0.0/src/transport/mod.rs +16 -0
  356. sciforma-1.0.0/src/transport/worker.rs +185 -0
  357. sciforma-1.0.0/src/validation.rs +216 -0
  358. sciforma-1.0.0/src/xtb/broyden.rs +330 -0
  359. sciforma-1.0.0/src/xtb/d4.rs +845 -0
  360. sciforma-1.0.0/src/xtb/d4_data.rs +4675 -0
  361. sciforma-1.0.0/src/xtb/gfn0.rs +1086 -0
  362. sciforma-1.0.0/src/xtb/gfn0_params.rs +2544 -0
  363. sciforma-1.0.0/src/xtb/gfn1.rs +900 -0
  364. sciforma-1.0.0/src/xtb/gfn1_params.rs +1765 -0
  365. sciforma-1.0.0/src/xtb/gfn2.rs +1677 -0
  366. sciforma-1.0.0/src/xtb/gfn2_params.rs +885 -0
  367. sciforma-1.0.0/src/xtb/gpu.rs +227 -0
  368. sciforma-1.0.0/src/xtb/gradients.rs +109 -0
  369. sciforma-1.0.0/src/xtb/mod.rs +52 -0
  370. sciforma-1.0.0/src/xtb/params.rs +564 -0
  371. sciforma-1.0.0/src/xtb/solver.rs +581 -0
  372. sciforma-1.0.0/src/xtb/spin_params.rs +170 -0
  373. sciforma-1.0.0/src/xtb/sto_overlap.rs +1411 -0
  374. sciforma-1.0.0/src/xtb/uks.rs +1362 -0
@@ -0,0 +1,623 @@
1
+ # Changelog
2
+
3
+ This file captures the project-level highlights from `v0.12.0` onward.
4
+ GitHub Releases already exist for each tag, but most release bodies are auto-generated;
5
+ the summary below records the substantive work that landed in each release line.
6
+ Future releases should append new sections here so this file remains the maintained,
7
+ human-written changelog for the repository.
8
+
9
+ ## Unreleased
10
+
11
+ ### Fixed
12
+
13
+ - **`pm3-gradient` / `xtb-gradient` (and the NEB/MD `pm3` / `xtb` backends) returned
14
+ wrong forces.** The hand-written Hellmann-Feynman/Pulay expressions
15
+ differentiated a legacy simplified model, not the energy the API reports: they
16
+ deviated from the numerical gradient by up to 18 eV/Å (PM3, H₂O₂) and
17
+ 209–263 eV/Å (xTB). The gradients are now central differences (5e-4 Å) of the
18
+ energy the matching `pm3` / `xtb` call returns — the MOPAC-parity PM3 energy
19
+ and the GFN2-xTB energy — so they agree with it to ≤ 1e-4 eV/Å (gates F80).
20
+ `xtb-gradient` now differentiates GFN2, matching `xtb`. Cost is `6·N` SCF
21
+ evaluations per gradient; an analytic NDDO/GFN2 gradient remains future work.
22
+ `compute_semianalytical_hessian` is therefore a double finite difference; prefer
23
+ `compute_numerical_hessian`.
24
+ - **PM3 SCF (MOPAC-parity solver) converges with Pulay DIIS** (27 iterations
25
+ instead of the full 200 on H₂O₂). The energy moves by ≲ 1e-5 eV (1e-7 on H₂O₂, 4e-6 on ethanol), but
26
+ the scatter between finite-difference steps drops from ~2e-3 to ~6e-6 eV/Å.
27
+ The damped iteration remains as the fallback, now with a density-residual
28
+ criterion.
29
+ - **The KS-DFT gradient was correct.** Its F80 gate compared it with a derivative
30
+ taken per Å (ratio exactly 0.5292 = Å/Bohr). The reference is now converted,
31
+ the gate is enforced (3e-7 Ha/Bohr on H₂O₂) and the module no longer claims a
32
+ missing XC response term.
33
+ - **The UKS (open-shell) KS-DFT gradient was wrong; it is fixed.** It reused the restricted
34
+ density, occupation and orbital energies and was off by 1.4e-2 Ha/Bohr (5 %) on the OH
35
+ radical. It now uses the spin densities and a spin-resolved Pulay term (1e-6 Ha/Bohr with
36
+ `energy_threshold = 1e-13`), and a new F80 gate covers it. `DftResult` gains
37
+ `orbital_energies_beta` and `coefficients_beta` (empty when restricted).
38
+ - **CI/CD: no tests on GitHub.** `ci.yml` only builds (with the cargo cache). The whole test
39
+ suite runs locally through `scripts/release-check.sh`; `scripts/release.sh` tags only a commit
40
+ that passed it. `release.yml` builds and publishes (crates.io, PyPI, npm) and attaches the CLI
41
+ to the GitHub Release as `.tar.gz` (Linux, macOS), `.zip` (Windows), `.deb` and `.rpm`, with
42
+ `SHA256SUMS`. The documentation is deployed afterwards.
43
+ - **A guided CLI.** `sci-form` with no arguments prints a guide; new `commands`, `examples
44
+ [--run]` and `completions` commands; every command's `--help` ends with a ready-to-run example.
45
+ The catalogue is tested (every command listed, every example executed).
46
+ - **Live examples in the documentation.** One runnable example for each of the 155 public WASM
47
+ functions, executed in the visitor's browser with the compiled package
48
+ (`/guide/live-examples`), plus examples embedded in the algorithm pages.
49
+ - **The 3D reaction path (`alpha-reaction-dynamics`) is Rust-core only.** It is too
50
+ expensive for the bindings (`6·N` SCF per gradient) and is not a validated reaction path,
51
+ so `sci_form.alpha.compute_reaction_dynamics_3d`, the `sci-form-wasm/alpha`
52
+ `compute_reaction_dynamics_3d` / `compute_approach_dynamics` and the CLI command
53
+ `reaction-dynamics3d` are removed, together with the feature in the three binding
54
+ crates. The module, its tests and the feature in the core crate stay.
55
+ - **`"xtb"` means GFN2 in NEB, MD and reaction dynamics too.** It used to select a
56
+ simplified model (`xtb::solve_xtb`) with unrelated absolute energies. `NebBackend::Xtb`
57
+ is gone (`from_method("xtb")` → `Gfn2`); `MdBackend::Xtb` evaluates GFN2; `"gfn0"` is a legacy alias.
58
+ - Reaction-dynamics sites that only need an energy no longer compute a gradient
59
+ (`neb_energy_kcal`). `tests/reaction_dynamics_study.rs` (17 categories) is now
60
+ `#[ignore]`: with `xtb` = GFN2 it needs more than 10 minutes; run it with
61
+ `cargo test --test reaction_dynamics_study -- --ignored`.
62
+ - **`xtb` is GFN2.** `compute_xtb`, `sci-form xtb` and the bindings run GFN2-xTB
63
+ (identical to `gfn2`); the documentation, the CLI `--help` and the README
64
+ called it GFN0. The crate-level unit table said PM3/xTB energies are in
65
+ Hartree; they are in eV (heat of formation in kcal/mol).
66
+ - `neb-energy` and the final image energies of the simplified NEB no longer
67
+ compute (and discard) a gradient, which would have cost `6·N` extra SCF runs
68
+ for `pm3`/`xtb`.
69
+ - `tests/integration/test_cross_language.py` was updated to the 1.0 API
70
+ (`embed` raises, `parse` returns a `ParseResult`, Node tests run against the
71
+ WASM `pkg-node`); `crates/python/tests/test_bindings.py` and the WASM
72
+ integration suite now run in CI.
73
+ - The `topology_data.rs` clippy `approx_constant` error and the stale
74
+ `full_pipeline_ethanol_rearrangement` frame count (a single product has a
75
+ single departure frame).
76
+
77
+ ## v1.0.0 - 2026-10-22
78
+
79
+ The first stable release. v1.0.0 closes **three exhaustive audits** (100 findings
80
+ in `reports/auditoria-total.md`, 88 findings in `reports/v1.0-blockers.md`) and
81
+ raises the floor on everything that matters for a chemistry library: the crate
82
+ no longer panics on user input, its results are reproducible bit-for-bit
83
+ regardless of the machine's core count, every public item is documented, and
84
+ the published artefact is 13 MB smaller.
85
+
86
+ **Upgrade guide:** [`docs/guide/migration-1.0.md`](docs/guide/migration-1.0.md)
87
+ lists every breaking change. The short version: the functions that can fail
88
+ now return a `Result` instead of panicking, and the canonical name of every
89
+ capability is the Rust root name in all four surfaces.
90
+
91
+ ### Security and robustness
92
+
93
+ - **The library no longer panics on user input.** 164 panicking sites in the
94
+ library code were classified; the 39 reachable from a malformed molecule, a
95
+ degenerate geometry or an unsupported element were eliminated.
96
+ - A new shared validator (`src/validation.rs`) rejects a length mismatch
97
+ between the elements and the coordinates, a non-finite coordinate and an
98
+ empty system with one actionable message, and it guards every public
99
+ entry point that takes a geometry.
100
+ - The same validator family now also checks the parameters that reach a
101
+ kernel: a partial-charge vector of the wrong length, a non-finite charge,
102
+ a dielectric constant outside `ε >= 1.0` and a negative probe radius.
103
+ - All 30 `partial_cmp(...).unwrap()` sites became `unwrap_or(Ordering::Equal)`.
104
+ A single NaN coordinate used to panic the whole library.
105
+ - `Molecule::from_smiles("[")` returns an error instead of panicking, and
106
+ the SMILES parse errors now carry the position and the offending fragment
107
+ instead of a bare `Expected ')'`.
108
+ - `compute_uhf` validates the charge and the multiplicity against the real
109
+ electron count instead of casting a negative `i32` to `usize`.
110
+ - The GFN0 public helpers, `solve_gfn0`, the PM3 faithful solver, the DOS,
111
+ the orbital mesh and the ESP grid validate their parameters. A zero
112
+ spacing or a zero point count used to return an EMPTY result in release
113
+ builds — a debug-only panic let CI stay green while the published crate
114
+ returned garbage.
115
+ - `GasteigerConfig` rejects `max_iter = 0` and a non-positive damping; those
116
+ used to yield all-zero charges while reporting `converged = true`.
117
+ - `embed_batch` clamps the thread count (`1 << 20` used to hang forever) and
118
+ propagates the pool-creation error.
119
+ - The SMARTS parser returns parse errors instead of `panic!`.
120
+ - **The WASM error encoder produced invalid JSON.** serde_json embeds the
121
+ offending value in quotes, so `{"error":"invalid type: string "abc"…"}` did
122
+ not parse and `JSON.parse()` threw instead of showing the error. Every WASM
123
+ error path was affected. It now builds the payload with serde_json, and a
124
+ test parses the output back.
125
+ - **A panic inside a PyO3 function is a `PanicException`**, which inherits from
126
+ `BaseException` and is therefore NOT caught by `except Exception:`. With the
127
+ panics removed from the core, the Python surface now raises ordinary
128
+ exceptions.
129
+
130
+ ### Fixed
131
+
132
+ - **A misspelled method name silently changed the result.** The method names
133
+ were parsed by every binding with its own `match`, and the copies had
134
+ drifted apart: the orbital mesh accepted nine aliases but its error
135
+ message listed four, the DOS multimethod had the same `match` three
136
+ times, and the IR broadening fell back to the **Lorentzian** shape for
137
+ anything that was not `"gaussian"` — so the typo `gauassian` changed the
138
+ line shape without a word. The parsing now lives in the core, next to the
139
+ enum it produces, and every surface reports the same error:
140
+ `Invalid method 'gauassian'. Supported: 'gaussian', 'lorentzian'.`
141
+ `compute_ir_spectrum_broadened` now returns a `Result` instead of
142
+ silently choosing a shape.
143
+ - **The published wheel and npm package shipped fewer capabilities than CI
144
+ tested.** The release workflow carried its own copy of the feature lists
145
+ and that copy had fallen behind: the published Python wheel and npm
146
+ package were missing the `alpha-edl`, `alpha-periodic-linear`,
147
+ `alpha-kinetics`, `alpha-render-bridge` and `alpha-reaction-dynamics`
148
+ modules, while CI built and tested all of them. Both workflows now use
149
+ the same lists, and `scripts/check_feature_parity.py` fails the build if
150
+ they ever drift apart again.
151
+ - **The TypeScript declarations of the alpha/beta subpaths promised functions
152
+ the binary did not contain.** They were a hand-written file listing every
153
+ research function, independent of the feature set the package was compiled
154
+ with: with the release feature set, 18 of the 36 declared functions were
155
+ missing from the binary. They are now generated from the build itself, so
156
+ they cannot drift. `alpha_modules_info()` likewise reports the modules the
157
+ binary actually contains.
158
+ - **The npm package could not be used from Node.js.** Only the browser ESM
159
+ build was ever published: `require('sci-form-wasm')` — the path the
160
+ TypeScript guide documents — failed with `self is not defined`, and the
161
+ CommonJS build was compiled and smoke-tested in CI but never uploaded.
162
+ The published package is now **dual**: the `require` condition of the
163
+ `exports` map resolves to the CommonJS half (`pkg/cjs/`), the `import`
164
+ condition to the ESM half, and both expose the same API. CI and the
165
+ release pipeline now pack the tarball, install it and require it *by
166
+ name*, so the artefact that is published is the artefact that is tested.
167
+ - **The Generalized Born solvation returned `NaN` for a zero dielectric
168
+ constant and aborted the process on a short charge vector.**
169
+ `compute_gb_solvation` divided by `ε` without checking it, so
170
+ `solvent_dielectric = 0` produced a `NaN` energy that looked like a
171
+ number; a charge vector shorter than the atom list indexed past its end
172
+ and killed the process (in Python, a `PanicException`, which inherits from
173
+ `BaseException` and is therefore *not* caught by `except Exception:`).
174
+ The same hole was in the ALPB sibling and in the Born-radius helpers.
175
+ The solvation family now validates the geometry, the charge vector, the
176
+ dielectric constants and the probe radius, and returns an error instead:
177
+ `ValueError` in Python, `{"error": "..."}` in WASM, a non-zero exit in the
178
+ CLI. `ε = 1.0` (the vacuum limit) and a zero probe radius (the plain van
179
+ der Waals surface) remain valid.
180
+ - **The force-field energy and gradient are now bit-identical regardless of
181
+ the rayon thread count.** The tree reduction made every UFF/MD/NEB result
182
+ depend on the machine's core count — three different bit patterns were
183
+ measured for the same molecule. This broke the crate's "same seed =
184
+ reproducible output" promise on every path that matters. The same fix was
185
+ applied to the GB electrostatic sum.
186
+ - **The UFF/MMFF94 energy accumulated in `f32`** while the rest of the library
187
+ is `f64`. This is the routine the conformer minimiser uses.
188
+ - **Python registered `cpm_charges` twice**, so the beta copy silently won and
189
+ computed at μ = 0.0 eV instead of the standard −4.44 eV.
190
+ - The swallowed errors are now reported: the faithful PM3 solver's real
191
+ failure reason, the GPU→CPU fallbacks (`notes` on the result).
192
+ - The EHT vibrational analysis now reports `n_imaginary_modes` and a loud
193
+ note. The EHT model is one-electron, so it has no repulsive wall and its
194
+ Hessian curvature is negative: the numbers are unchanged but the failure is
195
+ no longer silent.
196
+ - **The reaction-dynamics path repeated the same departure frame.** With a
197
+ single product there is no second fragment to separate, so the departure
198
+ phase returned the *same* geometry `n_departure_frames` times. It now
199
+ contributes one frame and says so in the result notes.
200
+ - **The reaction-dynamics path could diverge into `NaN`.** The product-guided
201
+ alignment of acetaldehyde + water put a water oxygen 0.14 Å away from the
202
+ carbonyl carbon; the 1/r repulsion terms diverged, the analytic GFN0-xTB
203
+ gradients overflowed and every remaining frame of the path was `NaN`. The
204
+ fix adds a minimum inter-fragment separation (1.5 Å), a displacement cap
205
+ and a descent-direction check in the constrained relaxation, and a refusal
206
+ to run the CI-NEB on a singular geometry. The test that caught it,
207
+ `tests/reaction_dynamics_study.rs`, had never run in CI — the packaging
208
+ audit found 9 test targets that CI skipped.
209
+ - `align_coordinates` can no longer return NaN.
210
+ - The `unsafe` block in `stda_gpu.rs` had a factually wrong SAFETY comment and
211
+ a silent empty-slice fallback; it now returns a `Result`.
212
+ - The GPU context and the compute pipeline are cached instead of being
213
+ re-acquired and recompiled on every dispatch (27 ms → 6 ns).
214
+ - The Python integration test that passed a 3-atom geometry for a 9-atom
215
+ molecule now passes the right one.
216
+
217
+ ### Changed
218
+
219
+ - **The k-path and Fermi-surface chart builders now live in the core.** The
220
+ Python `compute_kpoint_path_chart` / `compute_fermi_surface_chart`, the CLI
221
+ `kpoint-path-chart` / `fermi-surface-chart` commands and the new WASM
222
+ exports all call `kmesh::kpath_standard` / `kmesh::fermi_surface_from_bands`;
223
+ the duplicated interpolation and contour-tracing code in every binding was
224
+ removed.
225
+ - **The capabilities that were Rust-only are now available in Python, WASM
226
+ and the CLI**: the open-shell SCF (`compute_uhf`, `compute_rohf`), the
227
+ analytical PM3 and xTB gradients, the UFF and MMFF94 energy breakdowns, the
228
+ topological polar surface area, the ensemble property prediction and the
229
+ CIF import/export. The Python `__all__` grows from 247 to 265 names in the
230
+ default build (327 in the release wheel, which now enables every alpha and
231
+ beta module) and the CLI from 90 to 100 subcommands.
232
+ - `compute_esp` is now a deprecated alias of `compute_esp_grid`, the name of
233
+ the Rust root function that returns the full grid.
234
+ - **Every public enum is now `#[non_exhaustive]`** (57 of 60; three
235
+ deliberately closed sets are documented as such). Adding a variant is no
236
+ longer a breaking change for downstream users. Downstream `match`
237
+ expressions need a wildcard arm.
238
+ - **The canonical name of every capability is the Rust root name** in all four
239
+ surfaces (Rust, Python, WASM, CLI). 93 deprecated Python aliases keep the
240
+ old names working with a `DeprecationWarning`; WASM gained the missing
241
+ names plus `*_seed64` variants so a 64-bit seed is no longer truncated.
242
+ - The non-idiomatic `get_` prefix is gone: `eht_support`,
243
+ `system_capabilities`, `system_method_plan` (the old names remain as
244
+ deprecated aliases).
245
+ - `compute_gfn1` and `compute_gfn2` now exist at the crate root.
246
+ - The Python classes no longer carry the `Py` suffix, the module exposes
247
+ `__all__` (grouped by capability) and `__version__`, `parse` returns a
248
+ `ParseResult` object instead of a plain dict, and the error taxonomy is
249
+ explicit: `ValueError` (malformed input), `RuntimeError` (engine failure),
250
+ `NotConvergedError` (non-convergence).
251
+ - The CLI uses one sentinel convention: an optional argument is simply
252
+ absent.
253
+ - One error-message style across the three surfaces:
254
+ `<What failed> '<actual value>'. Supported: 'a', 'b', 'c'.`
255
+ - The published crate carries an allow-list: 612 → 340 files, 20.6 → 8.0 MiB.
256
+ The 27 developer binaries (`benchmark`, `test_eigen`, `check_grad`, …) are
257
+ no longer installed on every user's `$PATH`.
258
+
259
+ ### Added
260
+
261
+ - **Multi-linker framework assembly.** `Topology::from_net` converts an RCSR
262
+ `NetData` entry into the symmetry-expanded graph used by assembly,
263
+ `Topology::from_name` now accepts the data-driven nets (`acs`, `afw`, `sod`,
264
+ `pts`, `xah`, `tfy`), and `Topology::edge_types` records one linker type per
265
+ edge. `assemble_framework_with_linkers` places a different linker on each
266
+ inequivalent edge; the single-linker `assemble_framework` remains as a
267
+ wrapper. The expanded node/edge data is generated from the pormake `.cgd`
268
+ files and the F67 gate checks it against pormake.
269
+ - **Core k-path and Fermi-surface helpers.** `kmesh::kpath_standard` samples
270
+ the default Γ→X→M→Γ path with cumulative distances and vertex indices, and
271
+ `kmesh::fermi_surface_from_bands` traces the `kz = 0` contour from real-space
272
+ operator blocks. The WASM surface exposes
273
+ `alpha_periodic_kpath_standard` and
274
+ `alpha_periodic_fermi_surface_from_bands`.
275
+ - **Quantitative benchmarks for the remaining beta/alpha methods** in
276
+ `tests/beta_benchmarks.rs`: CPM charges vs the closed-form two-site solution
277
+ (1.3e-15), Riemannian optimization vs the exact Gram matrix of a tetrahedron
278
+ (6.0e-9), SDR vs classical MDS (6.7e-16) and GSM barriers vs five analytic
279
+ double wells (relative error 0), alongside the existing KPM, Nyström and
280
+ MBH gates.
281
+ - Two zero-copy Python entry points (`embed_coords_into`,
282
+ `compute_esp_grid_into`) that write into a caller-owned buffer.
283
+ - `try_*` variants and `Result` returns for every entry point that can fail,
284
+ plus `MolecularSystem::{try_from_angstrom, try_from_flat_angstrom, validate}`,
285
+ `scf::scf_loop::try_run_scf`, `spectroscopy::hessian::try_compute_hessian`,
286
+ `spectroscopy::ir_intensities::try_compute_ir_intensities`,
287
+ `spectroscopy::stda_uvvis::try_compute_stda`, `ani::neighbor::CellList::try_new`
288
+ and `charges::gasteiger::GasteigerConfig::validate`.
289
+ - `forcefield::calculate_total_energy_f64` and the `f64` siblings of the
290
+ energy functions.
291
+ - `gpu::context::GpuContext::shared()` — a process-wide cached context.
292
+ - An options-mapping form for the eight worst-over-argumented Python
293
+ functions.
294
+
295
+ ### Documentation
296
+
297
+ - **The entire public API is documented.** `cargo clippy -- -W missing_docs`
298
+ reported 1038 undocumented items out of 2121 (49 % of the public API had no
299
+ rustdoc at all); there are now 0. `cargo doc` is warning-free.
300
+ - Every numeric field now states its unit. This was the most valuable class
301
+ of documentation to add: the library returns energies in Hartree in some
302
+ result structs and eV in others, and a caller comparing `total_energy`
303
+ across methods was off by 27×. The crate header now carries a per-method
304
+ unit table.
305
+ - Doc comments that contradicted the code were corrected rather than papered
306
+ over. The most consequential: `Hf3cResult.orbital_energies`, `homo_energy`,
307
+ `lumo_energy` and `gap` were documented as eV, but the values are the raw
308
+ Hartree-based SCF output with no conversion (water's 1a1 is −20.24 Ha, not
309
+ −20.24 eV).
310
+ - The crate header states what the library is AND IS NOT, the coordinate
311
+ convention, the element convention, the sign convention for gradients, a
312
+ "how do I compute a property?" lookup table and the feature-flag table.
313
+ - The API pages (Rust, Python, TypeScript, CLI) were regenerated against the
314
+ current code, with a units table on each.
315
+ - The materials-assembly page now documents the symmetry-expanded RCSR nets,
316
+ the `edge_types`-based multi-linker assembly, and the real Rust/Python/CLI
317
+ signatures. The complete supported-reference and TypeScript feature tables
318
+ list the new multi-linker and periodic k-path/Fermi-surface entries.
319
+
320
+ ### Packaging and CI
321
+
322
+ - The 27 developer binaries are out of the published crate.
323
+ - 13 MB of fixtures and the internal directories are out of the published
324
+ crate.
325
+ - `rand` 0.8.5 → 0.8.8 and `crossbeam-epoch` 0.9.18 → 0.9.21 clear two live
326
+ advisories; a `deny.toml` and a `cargo deny` CI job were added.
327
+ - The release workflow now verifies that the git tag matches the version of
328
+ all four packages before publishing.
329
+ - The documented WASM build path now produces a working npm package (the
330
+ `alpha` / `beta` subpaths and the `snippets` directory that
331
+ wasm-bindgen-rayon needs are present in both the ESM and the CommonJS
332
+ builds).
333
+ - All 9 integration test targets that CI never ran now run in CI (77 tests).
334
+ - The 20 hard-coded absolute paths in the scripts became an environment
335
+ variable and a repo-relative default.
336
+ - The 52 heavy benchmark tests (10 k molecules, ChemBL 10 k, 1 k molecules ×
337
+ 14 capabilities) are `#[ignore]`d, so `cargo test --workspace --all-targets`
338
+ no longer takes tens of minutes. Run them explicitly with
339
+ `cargo test --release --test benchmarks -- --ignored`.
340
+ - 6 of the 9 parameter generators gained a `--check` mode so they cannot
341
+ drift silently; CI checks all of them.
342
+ - `rust-version` (MSRV 1.87) is declared in all four manifests.
343
+
344
+ ### Known limitations
345
+
346
+ - The 1.0 API returns a `Result` from the functions that can fail, but the
347
+ error type is still `String`. A typed error enum is planned for 1.1.
348
+ - The ERI tensor is stored as a full M⁴ `Vec<f64>` (12.8 GB at M = 200).
349
+ There is no packed, Cholesky or density-fitting path yet.
350
+ - The conformer minimiser rebuilds the force field on every MD step.
351
+ - The ETKDG retry loop is 10 × N attempts of an O(N²) search.
352
+ - The open items of the first audit (12 of 100) are listed in
353
+ `reports/auditoria-resolucion.md`.
354
+
355
+ ---
356
+
357
+ This section covers the audit-remediation work of 2026-10-21 (commits `c96ffa3`,
358
+ `6d3d954`, `28323f4`, `161c2e1`), driven by `reports/auditoria-total.md`.
359
+
360
+ ### Detailed audit remediation (2026-10-21)
361
+
362
+ #### Added
363
+ - **Twenty-two Rust-only capabilities are now exposed on all three surfaces**
364
+ (Rust, Python via PyO3, WASM/TypeScript, plus CLI subcommands):
365
+ `embed_diverse`, `to_canonical_smiles`, `compute_ecfp_batch`,
366
+ `compute_charges_configured`, `compute_ensemble_j_couplings`,
367
+ `compute_ir_spectrum_broadened`, `compute_cisd`, `compute_dos_multimethod`,
368
+ `compute_eht_gradient`, `optimize_geometry_eht`, `compute_aevs_tm`,
369
+ `compute_whim`, `compute_rdf`, `compute_getaway`, `train_random_forest`,
370
+ `train_gradient_boosting`, `assign_peaks`, `space_group_by_number` /
371
+ `space_group_by_symbol`, `all_space_groups`, `build_periodic_molecule`,
372
+ `detect_hapticity`, `optimize_framework` and `filter_diverse`.
373
+ The CLI grew from 56 to 100 subcommands (34 of them feature-gated); see the
374
+ regenerated `docs/api/cli.md`.
375
+ - **New validation gates.** Two batches, each with a committed fixture and a
376
+ deterministic oracle script, so CI stays hermetic (no RDKit / PySCF / ASE /
377
+ tblite needed at test time):
378
+ - *F64–F76* — space groups vs spglib, CIF vs pymatgen, minimum-image
379
+ distances vs ASE, powder XRD vs pymatgen, bounds matrix vs RDKit, ETKDG
380
+ embedding vs RDKit ETKDGv3, the ETKDG-3D force field vs RDKit, BFGS vs
381
+ RDKit `ForceField::minimize`, SMARTS matching vs `GetSubstructMatches`,
382
+ and a SHA-256-pinned copy of the upstream CSD torsion table.
383
+ - *F77–F85* — sTDA UV-Vis vs PySCF TD-SCF, ESP grid vs the PySCF density
384
+ ESP, IR intensities vs PySCF, analytic gradients vs central finite
385
+ differences for every method that exposes one, CIP R/S and E/Z labels vs
386
+ RDKit, ML descriptors vs RDKit, canonical-SMILES round-trip and
387
+ reordering invariance, ALPB electrostatics vs tblite GB solvation, and
388
+ variable-cell stress / relaxed lattice vs ASE.
389
+ - New test targets: `tests/validation_gates.rs`, `tests/rdkit_parity.rs`,
390
+ `tests/rdkit_chem_parity.rs`, `tests/pyscf_parity.rs`,
391
+ `tests/gradient_parity.rs`, `tests/mmff94_validation.rs`, all wired into
392
+ the `validation` CI job.
393
+ - `tests/experimental_gates.rs` now aggregates the whole `tests/experimental/`
394
+ suite (149 tests) with the **current** `alpha-*` / `beta-*` feature names.
395
+ Previously these files were gated on the legacy `experimental-*` flags, which
396
+ compiled them to empty modules and silently skipped every test inside them.
397
+ - `tests/integration/test_python_integration.py` is now a real pytest suite
398
+ (77 tests) covering the whole public surface, and it runs in CI.
399
+ - The four WGSL shaders that existed but were missing from the registry
400
+ (HCT Born radii, ANI radial AEV, MMFF94 non-bonded, sTDA matmul) are now
401
+ registered, so the tier and budget checks cover them.
402
+
403
+ #### Changed
404
+ - **MMFF94 now uses the published MMFF94 parameter set** instead of placeholders.
405
+ - New generated table module `src/forcefield/mmff94_params.rs` (atom-type
406
+ equivalence levels, atom-type properties, bond / angle / torsion / van der
407
+ Waals parameters, default bond rule, Badger's-rule parameters), produced by
408
+ `scripts/validation/gen_mmff94_params.py` from the parameter tables embedded
409
+ in RDKit's `Code/ForceField/MMFF/Params.cpp` (BSD-3-Clause; parameter data
410
+ © Merck and Co., Inc., 1994–1996).
411
+ - Parameter resolution follows the published rules: the MMFF.I atom-type
412
+ equivalence hierarchy for angles, the five-stage MMFF.IV hierarchy for
413
+ torsions, and the MMFF.V empirical default rules for bonds, angles and
414
+ torsions when a typed parameter is absent.
415
+ - New builder entry point `Mmff94Builder::build_typed(mol, variant)`; the
416
+ existing `build` / `build_variant` entry points are unchanged and now
417
+ derive their atom types from the same MMFF94 typer.
418
+ - Fixed the cubic bend constant (was `-0.014 deg⁻¹`, now the MMFF94/RDKit
419
+ value `-0.4 rad⁻¹ = -0.006981317 deg⁻¹`), switched the angle force-constant
420
+ factor to the exact `143.9325 * (pi/180)^2`, added MMFF94's linear-centre
421
+ cosine angle form, and replaced the placeholder 1-4-only van der Waals
422
+ terms with the full MMFF94 pair set (all pairs separated by three or more
423
+ bonds) and the MMFF94 combination rules for `R*_ij` / `eps_ij`.
424
+ - Verified against an independent reference implementation
425
+ (`scripts/validation/oracle_mmff94.py`), the fixture
426
+ `tests/fixtures/validation/mmff94_rdkit.json` and the parity test
427
+ `tests/mmff94_validation.rs` (agreement with the Rust implementation at
428
+ the 1e-11 kcal/mol level for methane, ethanol, acetic acid, dimethyl ether,
429
+ benzene, water and methylamine).
430
+ - **ANI forces are now the exact negative gradient of the energy.** The angular
431
+ species-pair index aliased 6 of the 28 blocks and the gradient back-propagated
432
+ only the radial block, so the reported forces were not `-dE/dR`. The index is
433
+ now bijective (with a unit test) and the analytic gradient covers the full
434
+ AEV; it is checked against central finite differences for water and methane
435
+ (`src/ani/gradients.rs`).
436
+ - **AEV layout corrected.** The generalized Behler-Parrinello descriptor module
437
+ filled the radial block with a zip of the shift and eta lists, so only 16 of
438
+ the 256 `(eta, shift)` symmetry functions were ever computed and the remaining
439
+ 240 stayed zero. Both the implementation (`src/ml/symmetry_functions.rs`) and
440
+ the F79 oracle now use the full grid, and the F79 gate compares the whole
441
+ radial block instead of asserting that the tail is zero.
442
+ - **PyO3 upgraded 0.22 → 0.26** in `crates/python`. PyO3 0.22 reads CPython's
443
+ tuple layout directly, which is incompatible with Python 3.14: tuple
444
+ arguments segfaulted and tuple fields came back with a NULL element
445
+ (`sci_form.esp(...).origin` returned `(-3.757, -3.469, <NULL>)`). The
446
+ `abi3-py38` feature keeps a single cp38-abi3 wheel working on 3.8–3.14.
447
+ - `sci_form.alpha` and `sci_form.beta` are now reachable as attributes of the
448
+ top-level module (they were registered under their dotted `__name__`).
449
+ - The TypeScript declarations for the alpha/beta subpaths were regenerated from
450
+ the Rust signatures (optional-vs-required config arguments, `apply_thermostat`
451
+ / `apply_steering_force` / `set_temperature`, `num_atoms`) and 29 undeclared
452
+ functions were added.
453
+ - `GpuContext::try_create` now wraps adapter/device acquisition in
454
+ `catch_unwind`; wgpu-hal's GLES/EGL backend panics with `BadDisplay` on
455
+ headless hosts, which broke the documented CPU-fallback contract.
456
+ - The MMFF94 WGSL kernel no longer accumulates float energies with `atomicAdd`
457
+ on `bitcast<u32>` (integer addition of float bit patterns); it reduces in
458
+ workgroup memory and performs signed fixed-point atomic adds, with a test
459
+ that reproduces the kernel arithmetic on the host.
460
+ - `atomic_mass_amu` now carries the IUPAC table for Z = 1..118 instead of
461
+ returning 12.0 amu for ~100 elements.
462
+
463
+ #### Removed
464
+ - **~63 Python / WASM / CLI binding functions that returned hard-coded data
465
+ have been removed or wired to the real core implementations.** The removed
466
+ stubs included `total_dos: vec![1.0; 100]`, a hard-coded
467
+ `homo_energy_ev: -5.0`, a constant `"Generated: 2026-03-28"` timestamp, an
468
+ empty V2000 molfile and always-true validators.
469
+ - The absolute symlinks `pkg` and `pkg-node` (which pointed into another user's
470
+ home directory) are gone; the WASM output now lives under
471
+ `crates/wasm/pkg{,node}`.
472
+
473
+ #### Fixed
474
+ The eight defects the new gates proved, all fixed in the same cycle:
475
+
476
+ 1. **Stereo** — the R/S assignment was inverted. `assign_rs` mapped a positive
477
+ signed volume to "R", but the CIP rule is clockwise-1-2-3-with-4-away = R
478
+ for a *negative* signed volume. All 11 stereocentres in the corpus had the
479
+ wrong label (E/Z was already correct).
480
+ 2. **SCF gradients** — `nuclear_repulsion_gradient` returned the force
481
+ (`-dV/dR`) although it is named and documented as the gradient.
482
+ 3. **Spectroscopy / Hessian** — the frequency conversion carried a spurious
483
+ extra `2π`, so the frequencies were 6.283× too small.
484
+ 4. **Spectroscopy / IR intensities** — the conversion factor was applied to a
485
+ derivative in e·a₀/Bohr instead of Debye/(Å·√amu), so the intensities were
486
+ 23.07× too small.
487
+ 5. **Solvation / ALPB Born radii** — the descreening integral was garbled and
488
+ produced negative ψ, hence unphysical Born radii (0.67 Å for H) and ALPB
489
+ electrostatics off by up to 20 kcal/mol. Replaced with the OBC/ACE
490
+ formulation; radii are now 1.6–2.7 Å.
491
+ 6. **ML descriptors** — the atomic-weight fallback was `z * 1.5` (27.96 Da error
492
+ on metal-containing molecules) and `balaban_j` was the placeholder
493
+ `|ln μ| + 1` (6.66 off). Both are now exact against RDKit.
494
+ 7. **ML ensemble** — the Ertl TPSA was a rough approximation (280 Ų off) and
495
+ is now the real RDKit-compatible fragment table (5.7e-14 Ų).
496
+ 8. **Canonical SMILES** — ring digits were emitted in `HashMap` order, so the
497
+ output was non-deterministic; the numbering was not idempotent; formal
498
+ charges and explicit H on bracket atoms were dropped; aromatic-aromatic
499
+ single bonds were not written out. Rewritten with
500
+ individualisation-refinement.
501
+
502
+ The RDKit-parity batch (F71–F76) proved three more:
503
+
504
+ - **Distance geometry / bounds** — the "squish" slack was applied when *either*
505
+ end of a bond was flagged, but RDKit's `set12Bounds` requires *both* ends.
506
+ Every bond touching a squished heteroatom was therefore looser than RDKit's
507
+ (thiophene C–C: ±0.21 Å instead of ±0.01 Å).
508
+ - **SMARTS torsion table** — twelve macrocycle patterns carried `r{9-}` where
509
+ upstream has a bare `r`, changing the semantics from "in any ring" to "in a
510
+ ring of size ≥ 9".
511
+ - **SMARTS torsion table** — the eight sci-form-specific patterns were mixed
512
+ into the upstream table, so it was not a faithful transcription. They now
513
+ live in `TORSION_PREFS_EXTENSIONS`; the matching order is unchanged.
514
+
515
+ And the F64–F69 batch proved two more:
516
+
517
+ - The X-ray scattering-factor table was read one element off, so every element
518
+ used its neighbour's coefficients (NaCl intensities were off by up to 14 %).
519
+ - The minimum-image search was only valid for orthogonal cells.
520
+
521
+ #### Known limitations
522
+ - The F80 gradient gate documents three analytic gradients that are still wrong
523
+ and are marked `#[ignore]` with their measured numbers: PM3 (18.4 eV/Å),
524
+ GFN0-xTB (209–263 eV/Å) and KS-DFT (0.202 Ha/Bohr, missing the adiabatic
525
+ XC response term).
526
+ - The official ANI-2x `.netFormat` weight files still cannot be loaded — the
527
+ loader in `src/ani/weights.rs` only reads sci-form's own binary container.
528
+ - The browser WebGPU harness (`crates/wasm/examples/vite-webgpu-hybrid/`) is
529
+ not in the repository, so `npm run webgpu:test` cannot produce a report; the
530
+ WebGPU path is covered by the Rust-side GPU-vs-CPU gates instead. See
531
+ `docs/algorithm/webgpu-validation.md`.
532
+
533
+ #### Documentation
534
+ - `docs/api/cli.md` regenerated from the real `Commands` enum (90 subcommands,
535
+ grouped by area, feature-gated ones marked); `docs/guide/cli.md` rewritten as
536
+ a task-oriented tour.
537
+ - `docs/api/python.md`, `docs/api/typescript.md`, `docs/guide/python.md`,
538
+ `docs/guide/rust.md`, `docs/guide/typescript.md`, `docs/guide/cli.md` and
539
+ `docs/index.md` corrected (removed non-existent functions, fixed every code
540
+ block, synchronised the version string to 0.15.2).
541
+ - `docs/algorithm/machine-learning-potentials.md` corrected: the non-existent
542
+ `load_ani2x_weights` is replaced by the real `ani::weights::load_weights`, the
543
+ two distinct AEV layouts are documented separately, and the inability to load
544
+ the official ANI-2x weights is stated explicitly.
545
+ - `docs/algorithm/webgpu-validation.md` rewritten to state that the browser
546
+ harness does not exist and what is actually runnable.
547
+ - `docs/guide/reaction-viewer.md` corrected: the example uses hard-coded
548
+ analytic 1-D potentials and never imports `sci-form-wasm`; the live
549
+ sci-form backends are not yet wired in.
550
+ - `docs/benchmarks.md` restructured into three explicit evidence tiers and the
551
+ stale figures (embed success, GDB-20 corpus size and seed count) corrected
552
+ against the current test output.
553
+ - `docs/experimental/*.md` test commands fixed: the suite lives in the
554
+ `experimental_gates` target, not `regression` (where the filters matched no
555
+ test and passed vacuously).
556
+ - The 12 orphan documentation pages are now reachable from the VitePress
557
+ sidebar.
558
+
559
+ ## v0.15.0 - 2026-04-06
560
+
561
+ ### Added
562
+ - New `alpha-reaction-dynamics` pipeline for full 3D reaction-path work.
563
+ - Climbing-image NEB, IDPP path initialization, IRC tracing, constrained optimization,
564
+ electrostatic steering, orbital-guided approach, per-frame properties, and angular sampling.
565
+ - Dedicated alpha reaction-dynamics regression tests, including checks for:
566
+ - no hardcoded X-axis forcing,
567
+ - SMIRKS-driven reactive-site identification,
568
+ - reactive atom-pair extraction from bond changes,
569
+ - end-to-end SMIRKS integration with the reaction pipeline.
570
+
571
+ ### Documentation
572
+ - Added `ROADMAP_REACTION_DYNAMICS_3D.md` to track the 3D reaction-dynamics plan and gaps.
573
+
574
+ ## v0.14.x - 2026-04-04 to 2026-04-05
575
+
576
+ ### Added in v0.14.0
577
+ - SMIRKS parsing and reaction-transform support in Rust.
578
+ - Python bindings for SMIRKS (`crates/python/src/smirks.rs`).
579
+ - WASM reaction bindings (`crates/wasm/src/reaction.rs`).
580
+ - Reaction documentation and validation assets:
581
+ - `SMIRKS_EXAMPLES.md`
582
+ - `SMIRKS_REVIEW.md`
583
+ - `SMIRKS_TESTING.md`
584
+ - `docs/guide/reaction-backends.md`
585
+ - `tests/test_smirks_reactions.rs`
586
+ - `tests/integration/test_smirks_reactions.py`
587
+ - `scripts/compare_smirks_reactions.py`
588
+ - `scripts/compare_reaction_layers.py`
589
+ - CIF import/export support for crystallographic workflows.
590
+ - AO→MO integral transform and open-shell HF (`UHF`) infrastructure.
591
+ - xTB upgrades including Broyden SCC support, D4 dispersion data, and expanded GFN1/GFN2 internals.
592
+ - Additional spectroscopy and GPU groundwork, including Hessian and sTDA support modules.
593
+
594
+ ### Follow-up work in v0.14.1-v0.14.4
595
+ - Stabilization and polish across SMIRKS, reaction tests, documentation, and CLI/WASM/Python surfaces.
596
+ - Maintenance updates in xTB, PM3, CIF, NMR, population analysis, UHF, and reaction benchmark coverage.
597
+
598
+ ## v0.13.0 - 2026-03-28
599
+
600
+ ### Added
601
+ - Architecture and export-matrix documentation for alpha/beta surfaces.
602
+ - New alpha modules for electrochemical double layers, kinetics, periodic linear algebra,
603
+ and render-bridge/GPU integration.
604
+ - Expanded CLI, Python, and WASM experimental exports for those alpha modules.
605
+
606
+ ### Updated
607
+ - GPU plumbing for MMFF94, PM3, and xTB-related experimental paths.
608
+ - Experimental documentation and regression tests for alpha modules.
609
+
610
+ ## v0.12.x - 2026-03-28
611
+
612
+ ### Added and improved across v0.12.0-v0.12.4
613
+ - Broader alpha/beta binding coverage in Python and WASM.
614
+ - Continued work on:
615
+ - CGA conformer and motor utilities,
616
+ - GSM string/saddle routines,
617
+ - SDR embedding/projection paths,
618
+ - CPM, MBH, RandNLA, and Riemannian beta modules,
619
+ - DOS and PM3 numerical improvements.
620
+
621
+ ### Release-line focus
622
+ - Consolidation and stabilization of experimental alpha/beta APIs before the larger
623
+ documentation and reaction-system expansion that followed in `v0.13.0+`.