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.
- sciforma-1.0.0/CHANGELOG.md +623 -0
- sciforma-1.0.0/Cargo.lock +2503 -0
- sciforma-1.0.0/Cargo.toml +131 -0
- sciforma-1.0.0/LICENSE +21 -0
- sciforma-1.0.0/PKG-INFO +554 -0
- sciforma-1.0.0/README.md +534 -0
- sciforma-1.0.0/crates/python/Cargo.toml +70 -0
- sciforma-1.0.0/crates/python/README.md +534 -0
- sciforma-1.0.0/crates/python/src/alpha.rs +888 -0
- sciforma-1.0.0/crates/python/src/analysis.rs +179 -0
- sciforma-1.0.0/crates/python/src/beta.rs +469 -0
- sciforma-1.0.0/crates/python/src/buffer.rs +151 -0
- sciforma-1.0.0/crates/python/src/compare.rs +138 -0
- sciforma-1.0.0/crates/python/src/dynamics.rs +243 -0
- sciforma-1.0.0/crates/python/src/eht.rs +352 -0
- sciforma-1.0.0/crates/python/src/electronic.rs +569 -0
- sciforma-1.0.0/crates/python/src/embed.rs +330 -0
- sciforma-1.0.0/crates/python/src/errors.rs +241 -0
- sciforma-1.0.0/crates/python/src/experimental.rs +2094 -0
- sciforma-1.0.0/crates/python/src/forcefield.rs +128 -0
- sciforma-1.0.0/crates/python/src/hf_ani_esp.rs +215 -0
- sciforma-1.0.0/crates/python/src/lib.rs +424 -0
- sciforma-1.0.0/crates/python/src/materials.rs +789 -0
- sciforma-1.0.0/crates/python/src/mesh.rs +83 -0
- sciforma-1.0.0/crates/python/src/ml.rs +602 -0
- sciforma-1.0.0/crates/python/src/naming.rs +336 -0
- sciforma-1.0.0/crates/python/src/nmr.rs +420 -0
- sciforma-1.0.0/crates/python/src/options.rs +126 -0
- sciforma-1.0.0/crates/python/src/population.rs +159 -0
- sciforma-1.0.0/crates/python/src/potentials.rs +52 -0
- sciforma-1.0.0/crates/python/src/properties.rs +335 -0
- sciforma-1.0.0/crates/python/src/reactivity.rs +138 -0
- sciforma-1.0.0/crates/python/src/rings.rs +196 -0
- sciforma-1.0.0/crates/python/src/smirks.rs +132 -0
- sciforma-1.0.0/crates/python/src/solvation.rs +99 -0
- sciforma-1.0.0/crates/python/src/spectroscopy.rs +566 -0
- sciforma-1.0.0/crates/python/src/stereo.rs +88 -0
- sciforma-1.0.0/crates/python/src/system.rs +239 -0
- sciforma-1.0.0/crates/python/src/transport.rs +107 -0
- sciforma-1.0.0/pyproject.toml +29 -0
- sciforma-1.0.0/src/alignment/kabsch.rs +598 -0
- sciforma-1.0.0/src/alignment/mod.rs +15 -0
- sciforma-1.0.0/src/alpha/cga.rs +13 -0
- sciforma-1.0.0/src/alpha/edl.rs +14 -0
- sciforma-1.0.0/src/alpha/gsm/backend.rs +873 -0
- sciforma-1.0.0/src/alpha/gsm/mod.rs +36 -0
- sciforma-1.0.0/src/alpha/gsm/saddle.rs +247 -0
- sciforma-1.0.0/src/alpha/gsm/string.rs +367 -0
- sciforma-1.0.0/src/alpha/kinetics/gpu.rs +81 -0
- sciforma-1.0.0/src/alpha/kinetics/mod.rs +1157 -0
- sciforma-1.0.0/src/alpha/mod.rs +52 -0
- sciforma-1.0.0/src/alpha/periodic_linear/gpu.rs +74 -0
- sciforma-1.0.0/src/alpha/periodic_linear/mod.rs +232 -0
- sciforma-1.0.0/src/alpha/reaction_dynamics/ci_neb.rs +583 -0
- sciforma-1.0.0/src/alpha/reaction_dynamics/complex.rs +670 -0
- sciforma-1.0.0/src/alpha/reaction_dynamics/constrained_opt.rs +747 -0
- sciforma-1.0.0/src/alpha/reaction_dynamics/electrostatics.rs +163 -0
- sciforma-1.0.0/src/alpha/reaction_dynamics/idpp.rs +150 -0
- sciforma-1.0.0/src/alpha/reaction_dynamics/irc.rs +349 -0
- sciforma-1.0.0/src/alpha/reaction_dynamics/mod.rs +1190 -0
- sciforma-1.0.0/src/alpha/reaction_dynamics/orbital_approach.rs +222 -0
- sciforma-1.0.0/src/alpha/reaction_dynamics/per_frame.rs +174 -0
- sciforma-1.0.0/src/alpha/reaction_dynamics/reactive_sites.rs +525 -0
- sciforma-1.0.0/src/alpha/reaction_dynamics/sampling.rs +255 -0
- sciforma-1.0.0/src/alpha/render_bridge/gpu.rs +66 -0
- sciforma-1.0.0/src/alpha/render_bridge/mod.rs +601 -0
- sciforma-1.0.0/src/alpha/sdr.rs +13 -0
- sciforma-1.0.0/src/ani/aev.rs +285 -0
- sciforma-1.0.0/src/ani/aev_params.rs +112 -0
- sciforma-1.0.0/src/ani/ani_tm.rs +287 -0
- sciforma-1.0.0/src/ani/api.rs +212 -0
- sciforma-1.0.0/src/ani/cutoff.rs +78 -0
- sciforma-1.0.0/src/ani/gradients.rs +480 -0
- sciforma-1.0.0/src/ani/mod.rs +21 -0
- sciforma-1.0.0/src/ani/neighbor.rs +288 -0
- sciforma-1.0.0/src/ani/nn.rs +234 -0
- sciforma-1.0.0/src/ani/weights.rs +185 -0
- sciforma-1.0.0/src/beta/cpm/mod.rs +15 -0
- sciforma-1.0.0/src/beta/kpm/chebyshev.rs +402 -0
- sciforma-1.0.0/src/beta/kpm/density.rs +386 -0
- sciforma-1.0.0/src/beta/kpm/mod.rs +32 -0
- sciforma-1.0.0/src/beta/mbh/blocks.rs +314 -0
- sciforma-1.0.0/src/beta/mbh/hessian.rs +352 -0
- sciforma-1.0.0/src/beta/mbh/mod.rs +30 -0
- sciforma-1.0.0/src/beta/mod.rs +48 -0
- sciforma-1.0.0/src/beta/rand_nla/mod.rs +24 -0
- sciforma-1.0.0/src/beta/rand_nla/nystrom.rs +292 -0
- sciforma-1.0.0/src/beta/rand_nla/solver.rs +336 -0
- sciforma-1.0.0/src/beta/riemannian.rs +16 -0
- sciforma-1.0.0/src/canonical_smiles.rs +580 -0
- sciforma-1.0.0/src/cga/conformer.rs +322 -0
- sciforma-1.0.0/src/cga/materials.rs +299 -0
- sciforma-1.0.0/src/cga/mod.rs +20 -0
- sciforma-1.0.0/src/cga/motor.rs +255 -0
- sciforma-1.0.0/src/cga/multivector.rs +438 -0
- sciforma-1.0.0/src/charges/gasteiger.rs +788 -0
- sciforma-1.0.0/src/charges/mod.rs +13 -0
- sciforma-1.0.0/src/charges_eeq/charges.rs +470 -0
- sciforma-1.0.0/src/charges_eeq/eeq2019.rs +151 -0
- sciforma-1.0.0/src/charges_eeq/eeq2019_data.rs +123 -0
- sciforma-1.0.0/src/charges_eeq/eeqbc.rs +327 -0
- sciforma-1.0.0/src/charges_eeq/eeqbc_data.rs +1673 -0
- sciforma-1.0.0/src/charges_eeq/energy.rs +140 -0
- sciforma-1.0.0/src/charges_eeq/mod.rs +44 -0
- sciforma-1.0.0/src/clustering.rs +272 -0
- sciforma-1.0.0/src/conformer.rs +767 -0
- sciforma-1.0.0/src/cpm/grand_potential.rs +329 -0
- sciforma-1.0.0/src/cpm/mod.rs +11 -0
- sciforma-1.0.0/src/cpm/surface.rs +140 -0
- sciforma-1.0.0/src/dft/becke.rs +123 -0
- sciforma-1.0.0/src/dft/ecp.rs +214 -0
- sciforma-1.0.0/src/dft/functionals/mod.rs +4 -0
- sciforma-1.0.0/src/dft/functionals/pbe.rs +176 -0
- sciforma-1.0.0/src/dft/functionals/svwn.rs +150 -0
- sciforma-1.0.0/src/dft/gradient.rs +281 -0
- sciforma-1.0.0/src/dft/grid.rs +196 -0
- sciforma-1.0.0/src/dft/ks_fock.rs +771 -0
- sciforma-1.0.0/src/dft/lebedev.rs +179 -0
- sciforma-1.0.0/src/dft/mod.rs +29 -0
- sciforma-1.0.0/src/dft/valence_basis.rs +263 -0
- sciforma-1.0.0/src/dft/vxc_matrix.rs +267 -0
- sciforma-1.0.0/src/dipole/dipole.rs +184 -0
- sciforma-1.0.0/src/dipole/mod.rs +5 -0
- sciforma-1.0.0/src/dispersion/dispersion.rs +209 -0
- sciforma-1.0.0/src/dispersion/mod.rs +25 -0
- sciforma-1.0.0/src/dispersion/params.rs +515 -0
- sciforma-1.0.0/src/distgeom/bounds/geometry.rs +448 -0
- sciforma-1.0.0/src/distgeom/bounds/matrix.rs +463 -0
- sciforma-1.0.0/src/distgeom/bounds/mod.rs +9 -0
- sciforma-1.0.0/src/distgeom/bounds/smoothing.rs +123 -0
- sciforma-1.0.0/src/distgeom/chirality.rs +278 -0
- sciforma-1.0.0/src/distgeom/embedding/coordinates.rs +603 -0
- sciforma-1.0.0/src/distgeom/embedding/mod.rs +7 -0
- sciforma-1.0.0/src/distgeom/embedding/rng.rs +133 -0
- sciforma-1.0.0/src/distgeom/mod.rs +40 -0
- sciforma-1.0.0/src/distgeom/parallel.rs +272 -0
- sciforma-1.0.0/src/distgeom/validation.rs +661 -0
- sciforma-1.0.0/src/dos/dos.rs +589 -0
- sciforma-1.0.0/src/dos/mod.rs +19 -0
- sciforma-1.0.0/src/dos/multi_method.rs +201 -0
- sciforma-1.0.0/src/dynamics.rs +2147 -0
- sciforma-1.0.0/src/dynamics_live/barostat.rs +111 -0
- sciforma-1.0.0/src/dynamics_live/langevin.rs +230 -0
- sciforma-1.0.0/src/dynamics_live/mod.rs +44 -0
- sciforma-1.0.0/src/dynamics_live/neighbor_list.rs +290 -0
- sciforma-1.0.0/src/dynamics_live/pbc.rs +283 -0
- sciforma-1.0.0/src/dynamics_live/state.rs +449 -0
- sciforma-1.0.0/src/edl/gpu.rs +113 -0
- sciforma-1.0.0/src/edl/mod.rs +1591 -0
- sciforma-1.0.0/src/eht/band_structure.rs +416 -0
- sciforma-1.0.0/src/eht/basis.rs +469 -0
- sciforma-1.0.0/src/eht/gradients.rs +297 -0
- sciforma-1.0.0/src/eht/hamiltonian.rs +121 -0
- sciforma-1.0.0/src/eht/marching_cubes.rs +983 -0
- sciforma-1.0.0/src/eht/metal_fallback.rs +348 -0
- sciforma-1.0.0/src/eht/mod.rs +35 -0
- sciforma-1.0.0/src/eht/overlap.rs +228 -0
- sciforma-1.0.0/src/eht/params.rs +1346 -0
- sciforma-1.0.0/src/eht/solver.rs +373 -0
- sciforma-1.0.0/src/eht/volume.rs +538 -0
- sciforma-1.0.0/src/esp/esp.rs +857 -0
- sciforma-1.0.0/src/esp/mod.rs +12 -0
- sciforma-1.0.0/src/etkdg.rs +110 -0
- sciforma-1.0.0/src/experimental_status.rs +300 -0
- sciforma-1.0.0/src/fd_gradient.rs +86 -0
- sciforma-1.0.0/src/fixture_io.rs +55 -0
- sciforma-1.0.0/src/forcefield/atom_typer.rs +247 -0
- sciforma-1.0.0/src/forcefield/bounds_ff/bfgs.rs +388 -0
- sciforma-1.0.0/src/forcefield/bounds_ff/energy.rs +572 -0
- sciforma-1.0.0/src/forcefield/bounds_ff/lbfgs.rs +612 -0
- sciforma-1.0.0/src/forcefield/bounds_ff/mod.rs +57 -0
- sciforma-1.0.0/src/forcefield/builder.rs +374 -0
- sciforma-1.0.0/src/forcefield/dg_terms.rs +185 -0
- sciforma-1.0.0/src/forcefield/energy.rs +655 -0
- sciforma-1.0.0/src/forcefield/etkdg_3d/builder.rs +740 -0
- sciforma-1.0.0/src/forcefield/etkdg_3d/energy.rs +790 -0
- sciforma-1.0.0/src/forcefield/etkdg_3d/gradient.rs +628 -0
- sciforma-1.0.0/src/forcefield/etkdg_3d/mod.rs +142 -0
- sciforma-1.0.0/src/forcefield/etkdg_3d/optimizer.rs +667 -0
- sciforma-1.0.0/src/forcefield/etkdg_lite.rs +305 -0
- sciforma-1.0.0/src/forcefield/gradients.rs +564 -0
- sciforma-1.0.0/src/forcefield/minimizer.rs +222 -0
- sciforma-1.0.0/src/forcefield/mmff94.rs +2513 -0
- sciforma-1.0.0/src/forcefield/mmff94_params.rs +5356 -0
- sciforma-1.0.0/src/forcefield/mod.rs +82 -0
- sciforma-1.0.0/src/forcefield/params.rs +391 -0
- sciforma-1.0.0/src/forcefield/reaxff/bond_order.rs +309 -0
- sciforma-1.0.0/src/forcefield/reaxff/eem.rs +161 -0
- sciforma-1.0.0/src/forcefield/reaxff/energy.rs +209 -0
- sciforma-1.0.0/src/forcefield/reaxff/gradients.rs +172 -0
- sciforma-1.0.0/src/forcefield/reaxff/mod.rs +29 -0
- sciforma-1.0.0/src/forcefield/reaxff/nonbonded.rs +187 -0
- sciforma-1.0.0/src/forcefield/reaxff/params.rs +327 -0
- sciforma-1.0.0/src/forcefield/reaxff/taper.rs +77 -0
- sciforma-1.0.0/src/forcefield/torsion_scan.rs +723 -0
- sciforma-1.0.0/src/forcefield/traits.rs +393 -0
- sciforma-1.0.0/src/forcefield/uff.rs +513 -0
- sciforma-1.0.0/src/gpu/aligned_types.rs +257 -0
- sciforma-1.0.0/src/gpu/alpb_born_gpu.rs +222 -0
- sciforma-1.0.0/src/gpu/ani_aev_gpu.rs +210 -0
- sciforma-1.0.0/src/gpu/backend_report.rs +104 -0
- sciforma-1.0.0/src/gpu/buffer_manager.rs +408 -0
- sciforma-1.0.0/src/gpu/context.rs +901 -0
- sciforma-1.0.0/src/gpu/cpm_gpu.rs +221 -0
- sciforma-1.0.0/src/gpu/d4_dispersion_gpu.rs +220 -0
- sciforma-1.0.0/src/gpu/density_grid_gpu.rs +282 -0
- sciforma-1.0.0/src/gpu/eeq_gpu.rs +271 -0
- sciforma-1.0.0/src/gpu/esp_grid_gpu.rs +266 -0
- sciforma-1.0.0/src/gpu/fock_build_gpu.rs +211 -0
- sciforma-1.0.0/src/gpu/gamma_matrix_gpu.rs +171 -0
- sciforma-1.0.0/src/gpu/hct_born_gpu.rs +213 -0
- sciforma-1.0.0/src/gpu/hessian_gpu.rs +148 -0
- sciforma-1.0.0/src/gpu/isosurface.rs +270 -0
- sciforma-1.0.0/src/gpu/marching_cubes.rs +727 -0
- sciforma-1.0.0/src/gpu/memory_budget.rs +604 -0
- sciforma-1.0.0/src/gpu/mmff94_gpu.rs +684 -0
- sciforma-1.0.0/src/gpu/mod.rs +57 -0
- sciforma-1.0.0/src/gpu/one_electron_gpu.rs +430 -0
- sciforma-1.0.0/src/gpu/orbital_grid.rs +595 -0
- sciforma-1.0.0/src/gpu/pipeline_coordinator.rs +471 -0
- sciforma-1.0.0/src/gpu/shader_registry.rs +413 -0
- sciforma-1.0.0/src/gpu/stda_gpu.rs +326 -0
- sciforma-1.0.0/src/gpu/two_electron_gpu.rs +536 -0
- sciforma-1.0.0/src/graph.rs +627 -0
- sciforma-1.0.0/src/hf/api.rs +395 -0
- sciforma-1.0.0/src/hf/basis.rs +434 -0
- sciforma-1.0.0/src/hf/cis.rs +392 -0
- sciforma-1.0.0/src/hf/cisd.rs +671 -0
- sciforma-1.0.0/src/hf/d3.rs +406 -0
- sciforma-1.0.0/src/hf/d3_data.rs +24457 -0
- sciforma-1.0.0/src/hf/fock.rs +117 -0
- sciforma-1.0.0/src/hf/gcp.rs +98 -0
- sciforma-1.0.0/src/hf/integrals.rs +125 -0
- sciforma-1.0.0/src/hf/mo_transform.rs +318 -0
- sciforma-1.0.0/src/hf/mod.rs +33 -0
- sciforma-1.0.0/src/hf/nuclear.rs +90 -0
- sciforma-1.0.0/src/hf/overlap_kin.rs +53 -0
- sciforma-1.0.0/src/hf/scf.rs +396 -0
- sciforma-1.0.0/src/hf/scf_trait.rs +196 -0
- sciforma-1.0.0/src/hf/srb.rs +88 -0
- sciforma-1.0.0/src/imd.rs +135 -0
- sciforma-1.0.0/src/ir/hessian.rs +679 -0
- sciforma-1.0.0/src/ir/mod.rs +20 -0
- sciforma-1.0.0/src/ir/peak_assignment.rs +878 -0
- sciforma-1.0.0/src/ir/vibrations.rs +1478 -0
- sciforma-1.0.0/src/kmesh.rs +1086 -0
- sciforma-1.0.0/src/lib.rs +3650 -0
- sciforma-1.0.0/src/materials/assembly.rs +829 -0
- sciforma-1.0.0/src/materials/cell.rs +1048 -0
- sciforma-1.0.0/src/materials/cif.rs +708 -0
- sciforma-1.0.0/src/materials/geometry_opt.rs +661 -0
- sciforma-1.0.0/src/materials/mod.rs +27 -0
- sciforma-1.0.0/src/materials/sbu.rs +257 -0
- sciforma-1.0.0/src/materials/scattering_factors.rs +396 -0
- sciforma-1.0.0/src/materials/space_group_table.rs +6750 -0
- sciforma-1.0.0/src/materials/space_groups.rs +273 -0
- sciforma-1.0.0/src/materials/topology_data.rs +734 -0
- sciforma-1.0.0/src/materials/variable_cell.rs +501 -0
- sciforma-1.0.0/src/mesh.rs +351 -0
- sciforma-1.0.0/src/method.rs +145 -0
- sciforma-1.0.0/src/ml/advanced_models.rs +812 -0
- sciforma-1.0.0/src/ml/descriptors.rs +670 -0
- sciforma-1.0.0/src/ml/ensemble.rs +599 -0
- sciforma-1.0.0/src/ml/getaway.rs +298 -0
- sciforma-1.0.0/src/ml/inference.rs +263 -0
- sciforma-1.0.0/src/ml/mlff.rs +227 -0
- sciforma-1.0.0/src/ml/mod.rs +31 -0
- sciforma-1.0.0/src/ml/models.rs +283 -0
- sciforma-1.0.0/src/ml/pharmacophore.rs +342 -0
- sciforma-1.0.0/src/ml/rdf_descriptors.rs +202 -0
- sciforma-1.0.0/src/ml/symmetry_functions.rs +263 -0
- sciforma-1.0.0/src/ml/whim.rs +450 -0
- sciforma-1.0.0/src/nmr/coupling.rs +668 -0
- sciforma-1.0.0/src/nmr/hose.rs +390 -0
- sciforma-1.0.0/src/nmr/mod.rs +34 -0
- sciforma-1.0.0/src/nmr/nucleus.rs +1747 -0
- sciforma-1.0.0/src/nmr/second_order.rs +393 -0
- sciforma-1.0.0/src/nmr/shifts.rs +1236 -0
- sciforma-1.0.0/src/nmr/spectrum.rs +716 -0
- sciforma-1.0.0/src/optimization/bfgs.rs +168 -0
- sciforma-1.0.0/src/optimization/mod.rs +7 -0
- sciforma-1.0.0/src/periodic.rs +399 -0
- sciforma-1.0.0/src/pm3/faithful.rs +2007 -0
- sciforma-1.0.0/src/pm3/gpu.rs +149 -0
- sciforma-1.0.0/src/pm3/gradients.rs +119 -0
- sciforma-1.0.0/src/pm3/mod.rs +55 -0
- sciforma-1.0.0/src/pm3/params.rs +346 -0
- sciforma-1.0.0/src/pm3/params_table.rs +1021 -0
- sciforma-1.0.0/src/pm3/solver.rs +929 -0
- sciforma-1.0.0/src/population/mod.rs +15 -0
- sciforma-1.0.0/src/population/npa.rs +413 -0
- sciforma-1.0.0/src/population/population.rs +961 -0
- sciforma-1.0.0/src/potentials.rs +58 -0
- sciforma-1.0.0/src/reactivity.rs +974 -0
- sciforma-1.0.0/src/render_bridge.rs +132 -0
- sciforma-1.0.0/src/riemannian/lbfgs.rs +542 -0
- sciforma-1.0.0/src/riemannian/manifold.rs +279 -0
- sciforma-1.0.0/src/riemannian/mod.rs +12 -0
- sciforma-1.0.0/src/rings/aromaticity.rs +219 -0
- sciforma-1.0.0/src/rings/ecfp.rs +296 -0
- sciforma-1.0.0/src/rings/mod.rs +13 -0
- sciforma-1.0.0/src/rings/sssr.rs +568 -0
- sciforma-1.0.0/src/scf/basis.rs +939 -0
- sciforma-1.0.0/src/scf/constants.rs +30 -0
- sciforma-1.0.0/src/scf/core_matrices.rs +186 -0
- sciforma-1.0.0/src/scf/density_matrix.rs +247 -0
- sciforma-1.0.0/src/scf/diis.rs +203 -0
- sciforma-1.0.0/src/scf/dipole_matrix.rs +145 -0
- sciforma-1.0.0/src/scf/energy.rs +115 -0
- sciforma-1.0.0/src/scf/extended_basis.rs +391 -0
- sciforma-1.0.0/src/scf/fock_matrix.rs +171 -0
- sciforma-1.0.0/src/scf/gaussian_integrals.rs +252 -0
- sciforma-1.0.0/src/scf/gradients.rs +202 -0
- sciforma-1.0.0/src/scf/kinetic_matrix.rs +140 -0
- sciforma-1.0.0/src/scf/mod.rs +43 -0
- sciforma-1.0.0/src/scf/mulliken.rs +152 -0
- sciforma-1.0.0/src/scf/nuclear_matrix.rs +298 -0
- sciforma-1.0.0/src/scf/obara_saika.rs +249 -0
- sciforma-1.0.0/src/scf/orthogonalization.rs +155 -0
- sciforma-1.0.0/src/scf/overlap_matrix.rs +112 -0
- sciforma-1.0.0/src/scf/scf_loop.rs +512 -0
- sciforma-1.0.0/src/scf/screening.rs +142 -0
- sciforma-1.0.0/src/scf/two_electron.rs +671 -0
- sciforma-1.0.0/src/scf/types.rs +204 -0
- sciforma-1.0.0/src/scf/uhf.rs +718 -0
- sciforma-1.0.0/src/scf/validation.rs +145 -0
- sciforma-1.0.0/src/sdr/embedding.rs +212 -0
- sciforma-1.0.0/src/sdr/mod.rs +14 -0
- sciforma-1.0.0/src/sdr/projections.rs +300 -0
- sciforma-1.0.0/src/smarts/matcher.rs +667 -0
- sciforma-1.0.0/src/smarts/mod.rs +20 -0
- sciforma-1.0.0/src/smarts/parser.rs +860 -0
- sciforma-1.0.0/src/smarts/torsion_data.rs +3271 -0
- sciforma-1.0.0/src/smarts/torsion_matcher.rs +237 -0
- sciforma-1.0.0/src/smiles.rs +875 -0
- sciforma-1.0.0/src/smirks.rs +593 -0
- sciforma-1.0.0/src/solvation.rs +502 -0
- sciforma-1.0.0/src/solvation_alpb/born.rs +209 -0
- sciforma-1.0.0/src/solvation_alpb/mod.rs +41 -0
- sciforma-1.0.0/src/solvation_alpb/solvation.rs +269 -0
- sciforma-1.0.0/src/spectroscopy/fluorescence.rs +387 -0
- sciforma-1.0.0/src/spectroscopy/giao_nmr.rs +306 -0
- sciforma-1.0.0/src/spectroscopy/hessian.rs +468 -0
- sciforma-1.0.0/src/spectroscopy/ir_intensities.rs +245 -0
- sciforma-1.0.0/src/spectroscopy/mod.rs +36 -0
- sciforma-1.0.0/src/spectroscopy/stda_uvvis.rs +847 -0
- sciforma-1.0.0/src/spectroscopy/transition_dipoles.rs +190 -0
- sciforma-1.0.0/src/spectroscopy/types.rs +105 -0
- sciforma-1.0.0/src/stereo.rs +1121 -0
- sciforma-1.0.0/src/surface/mod.rs +28 -0
- sciforma-1.0.0/src/surface/sasa.rs +335 -0
- sciforma-1.0.0/src/topology.rs +368 -0
- sciforma-1.0.0/src/transport/arrow.rs +328 -0
- sciforma-1.0.0/src/transport/chunked.rs +223 -0
- sciforma-1.0.0/src/transport/mod.rs +16 -0
- sciforma-1.0.0/src/transport/worker.rs +185 -0
- sciforma-1.0.0/src/validation.rs +216 -0
- sciforma-1.0.0/src/xtb/broyden.rs +330 -0
- sciforma-1.0.0/src/xtb/d4.rs +845 -0
- sciforma-1.0.0/src/xtb/d4_data.rs +4675 -0
- sciforma-1.0.0/src/xtb/gfn0.rs +1086 -0
- sciforma-1.0.0/src/xtb/gfn0_params.rs +2544 -0
- sciforma-1.0.0/src/xtb/gfn1.rs +900 -0
- sciforma-1.0.0/src/xtb/gfn1_params.rs +1765 -0
- sciforma-1.0.0/src/xtb/gfn2.rs +1677 -0
- sciforma-1.0.0/src/xtb/gfn2_params.rs +885 -0
- sciforma-1.0.0/src/xtb/gpu.rs +227 -0
- sciforma-1.0.0/src/xtb/gradients.rs +109 -0
- sciforma-1.0.0/src/xtb/mod.rs +52 -0
- sciforma-1.0.0/src/xtb/params.rs +564 -0
- sciforma-1.0.0/src/xtb/solver.rs +581 -0
- sciforma-1.0.0/src/xtb/spin_params.rs +170 -0
- sciforma-1.0.0/src/xtb/sto_overlap.rs +1411 -0
- 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+`.
|