quantui 0.9.0__tar.gz → 0.10.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 (122) hide show
  1. {quantui-0.9.0 → quantui-0.10.0}/CHANGELOG.md +161 -1
  2. {quantui-0.9.0/quantui.egg-info → quantui-0.10.0}/PKG-INFO +66 -17
  3. {quantui-0.9.0 → quantui-0.10.0}/README.md +61 -16
  4. {quantui-0.9.0 → quantui-0.10.0}/pyproject.toml +15 -1
  5. {quantui-0.9.0 → quantui-0.10.0}/quantui/__init__.py +1 -1
  6. {quantui-0.9.0 → quantui-0.10.0}/quantui/app.py +317 -18
  7. {quantui-0.9.0 → quantui-0.10.0}/quantui/app_analysis.py +44 -1
  8. {quantui-0.9.0 → quantui-0.10.0}/quantui/app_builders.py +239 -8
  9. {quantui-0.9.0 → quantui-0.10.0}/quantui/app_exports.py +56 -8
  10. {quantui-0.9.0 → quantui-0.10.0}/quantui/app_formatters.py +178 -4
  11. {quantui-0.9.0 → quantui-0.10.0}/quantui/app_runflow.py +118 -38
  12. {quantui-0.9.0 → quantui-0.10.0}/quantui/app_slurm.py +29 -1
  13. quantui-0.10.0/quantui/app_structure_edit.py +404 -0
  14. {quantui-0.9.0 → quantui-0.10.0}/quantui/app_visualization.py +751 -16
  15. {quantui-0.9.0 → quantui-0.10.0}/quantui/app_xyz_input.py +57 -0
  16. quantui-0.10.0/quantui/backends/batch_chain.py +103 -0
  17. quantui-0.10.0/quantui/backends/batch_input.py +236 -0
  18. {quantui-0.9.0 → quantui-0.10.0}/quantui/backends/cluster_config.py +3 -0
  19. {quantui-0.9.0 → quantui-0.10.0}/quantui/backends/dispatch.py +22 -8
  20. {quantui-0.9.0 → quantui-0.10.0}/quantui/backends/slurm.py +126 -26
  21. {quantui-0.9.0 → quantui-0.10.0}/quantui/backends/slurm_ingest.py +4 -0
  22. {quantui-0.9.0 → quantui-0.10.0}/quantui/backends/slurm_utils.py +33 -51
  23. {quantui-0.9.0 → quantui-0.10.0}/quantui/backends/worker.py +109 -26
  24. {quantui-0.9.0 → quantui-0.10.0}/quantui/backends/worker_payload.py +32 -1
  25. quantui-0.10.0/quantui/batch_launcher.py +153 -0
  26. {quantui-0.9.0 → quantui-0.10.0}/quantui/calculator.py +87 -1
  27. {quantui-0.9.0 → quantui-0.10.0}/quantui/checkpoint.py +1 -0
  28. {quantui-0.9.0 → quantui-0.10.0}/quantui/cli.py +191 -14
  29. {quantui-0.9.0 → quantui-0.10.0}/quantui/config.py +84 -7
  30. {quantui-0.9.0 → quantui-0.10.0}/quantui/connectivity.py +40 -7
  31. quantui-0.10.0/quantui/data/launcher/quantui_batch.py +1648 -0
  32. quantui-0.10.0/quantui/downloads.py +90 -0
  33. {quantui-0.9.0 → quantui-0.10.0}/quantui/engines/base.py +1 -0
  34. {quantui-0.9.0 → quantui-0.10.0}/quantui/engines/pyscf_engine.py +2 -0
  35. {quantui-0.9.0 → quantui-0.10.0}/quantui/freq_calc.py +204 -105
  36. {quantui-0.9.0 → quantui-0.10.0}/quantui/freq_ir_workers.py +9 -0
  37. {quantui-0.9.0 → quantui-0.10.0}/quantui/help_content.py +120 -0
  38. {quantui-0.9.0 → quantui-0.10.0}/quantui/molecule.py +38 -0
  39. {quantui-0.9.0 → quantui-0.10.0}/quantui/optimizer.py +54 -1
  40. {quantui-0.9.0 → quantui-0.10.0}/quantui/orbital_visualization.py +493 -10
  41. {quantui-0.9.0 → quantui-0.10.0}/quantui/reorganization_energy.py +100 -8
  42. {quantui-0.9.0 → quantui-0.10.0}/quantui/results_storage.py +5 -0
  43. {quantui-0.9.0 → quantui-0.10.0}/quantui/session_calc.py +268 -141
  44. quantui-0.10.0/quantui/structure_edit.py +272 -0
  45. quantui-0.10.0/quantui/structure_upload.py +234 -0
  46. quantui-0.10.0/quantui/symmetry.py +399 -0
  47. {quantui-0.9.0 → quantui-0.10.0}/quantui/tddft_calc.py +79 -0
  48. quantui-0.10.0/quantui/ts_search.py +363 -0
  49. {quantui-0.9.0 → quantui-0.10.0/quantui.egg-info}/PKG-INFO +66 -17
  50. {quantui-0.9.0 → quantui-0.10.0}/quantui.egg-info/SOURCES.txt +10 -0
  51. {quantui-0.9.0 → quantui-0.10.0}/quantui.egg-info/requires.txt +5 -0
  52. {quantui-0.9.0 → quantui-0.10.0}/LICENSE +0 -0
  53. {quantui-0.9.0 → quantui-0.10.0}/MANIFEST.in +0 -0
  54. {quantui-0.9.0 → quantui-0.10.0}/SECURITY.md +0 -0
  55. {quantui-0.9.0 → quantui-0.10.0}/quantui/analytics.py +0 -0
  56. {quantui-0.9.0 → quantui-0.10.0}/quantui/app_history.py +0 -0
  57. {quantui-0.9.0 → quantui-0.10.0}/quantui/app_launcher.py +0 -0
  58. {quantui-0.9.0 → quantui-0.10.0}/quantui/app_measurement.py +0 -0
  59. {quantui-0.9.0 → quantui-0.10.0}/quantui/app_pes_pick.py +0 -0
  60. {quantui-0.9.0 → quantui-0.10.0}/quantui/ase_bridge.py +0 -0
  61. {quantui-0.9.0 → quantui-0.10.0}/quantui/backends/__init__.py +0 -0
  62. {quantui-0.9.0 → quantui-0.10.0}/quantui/backends/base.py +0 -0
  63. {quantui-0.9.0 → quantui-0.10.0}/quantui/backends/cluster_security.py +0 -0
  64. {quantui-0.9.0 → quantui-0.10.0}/quantui/backends/local.py +0 -0
  65. {quantui-0.9.0 → quantui-0.10.0}/quantui/backends/registry.py +0 -0
  66. {quantui-0.9.0 → quantui-0.10.0}/quantui/backends/slurm_errors.py +0 -0
  67. {quantui-0.9.0 → quantui-0.10.0}/quantui/benchmarks.py +0 -0
  68. {quantui-0.9.0 → quantui-0.10.0}/quantui/c_stderr.py +0 -0
  69. {quantui-0.9.0 → quantui-0.10.0}/quantui/cactus.py +0 -0
  70. {quantui-0.9.0 → quantui-0.10.0}/quantui/calc_log.py +0 -0
  71. {quantui-0.9.0 → quantui-0.10.0}/quantui/cancellation.py +0 -0
  72. {quantui-0.9.0 → quantui-0.10.0}/quantui/comparison.py +0 -0
  73. {quantui-0.9.0 → quantui-0.10.0}/quantui/data/js/3Dmol-min.js +0 -0
  74. {quantui-0.9.0 → quantui-0.10.0}/quantui/data/js/3Dmol-min.js.LICENSE.txt +0 -0
  75. {quantui-0.9.0 → quantui-0.10.0}/quantui/data/library/library.sqlite +0 -0
  76. {quantui-0.9.0 → quantui-0.10.0}/quantui/data/manifests/bulk_qm9.json +0 -0
  77. {quantui-0.9.0 → quantui-0.10.0}/quantui/data/manifests/curated.json +0 -0
  78. {quantui-0.9.0 → quantui-0.10.0}/quantui/data/manifests/inorganic.json +0 -0
  79. {quantui-0.9.0 → quantui-0.10.0}/quantui/data/manifests/presets.json +0 -0
  80. {quantui-0.9.0 → quantui-0.10.0}/quantui/density_fitting.py +0 -0
  81. {quantui-0.9.0 → quantui-0.10.0}/quantui/descriptor_cards.py +0 -0
  82. {quantui-0.9.0 → quantui-0.10.0}/quantui/engines/__init__.py +0 -0
  83. {quantui-0.9.0 → quantui-0.10.0}/quantui/engines/pyfock_engine.py +0 -0
  84. {quantui-0.9.0 → quantui-0.10.0}/quantui/estimator_eval.py +0 -0
  85. {quantui-0.9.0 → quantui-0.10.0}/quantui/freq_displacement_ids.py +0 -0
  86. {quantui-0.9.0 → quantui-0.10.0}/quantui/freq_raman_workers.py +0 -0
  87. {quantui-0.9.0 → quantui-0.10.0}/quantui/gpu_offload.py +0 -0
  88. {quantui-0.9.0 → quantui-0.10.0}/quantui/inorganic_guards.py +0 -0
  89. {quantui-0.9.0 → quantui-0.10.0}/quantui/ir_plot.py +0 -0
  90. {quantui-0.9.0 → quantui-0.10.0}/quantui/issue_tracker.py +0 -0
  91. {quantui-0.9.0 → quantui-0.10.0}/quantui/live_log.py +0 -0
  92. {quantui-0.9.0 → quantui-0.10.0}/quantui/log_utils.py +0 -0
  93. {quantui-0.9.0 → quantui-0.10.0}/quantui/measurement.py +0 -0
  94. {quantui-0.9.0 → quantui-0.10.0}/quantui/molecule_library.py +0 -0
  95. {quantui-0.9.0 → quantui-0.10.0}/quantui/mulliken_plot.py +0 -0
  96. {quantui-0.9.0 → quantui-0.10.0}/quantui/nmr_calc.py +0 -0
  97. {quantui-0.9.0 → quantui-0.10.0}/quantui/nmr_plot.py +0 -0
  98. {quantui-0.9.0 → quantui-0.10.0}/quantui/pes_scan.py +0 -0
  99. {quantui-0.9.0 → quantui-0.10.0}/quantui/pes_scan_ui.py +0 -0
  100. {quantui-0.9.0 → quantui-0.10.0}/quantui/populations_overlay.py +0 -0
  101. {quantui-0.9.0 → quantui-0.10.0}/quantui/preopt.py +0 -0
  102. {quantui-0.9.0 → quantui-0.10.0}/quantui/progress.py +0 -0
  103. {quantui-0.9.0 → quantui-0.10.0}/quantui/pubchem.py +0 -0
  104. {quantui-0.9.0 → quantui-0.10.0}/quantui/pyfock_gpu.py +0 -0
  105. {quantui-0.9.0 → quantui-0.10.0}/quantui/raman_calc.py +0 -0
  106. {quantui-0.9.0 → quantui-0.10.0}/quantui/raman_plot.py +0 -0
  107. {quantui-0.9.0 → quantui-0.10.0}/quantui/scf_robust.py +0 -0
  108. {quantui-0.9.0 → quantui-0.10.0}/quantui/security.py +0 -0
  109. {quantui-0.9.0 → quantui-0.10.0}/quantui/spin_presets.py +0 -0
  110. {quantui-0.9.0 → quantui-0.10.0}/quantui/structure_providers.py +0 -0
  111. {quantui-0.9.0 → quantui-0.10.0}/quantui/theme.py +0 -0
  112. {quantui-0.9.0 → quantui-0.10.0}/quantui/user_settings.py +0 -0
  113. {quantui-0.9.0 → quantui-0.10.0}/quantui/utils.py +0 -0
  114. {quantui-0.9.0 → quantui-0.10.0}/quantui/vib_cache.py +0 -0
  115. {quantui-0.9.0 → quantui-0.10.0}/quantui/visualization_py3dmol.py +0 -0
  116. {quantui-0.9.0 → quantui-0.10.0}/quantui/viz_assets.py +0 -0
  117. {quantui-0.9.0 → quantui-0.10.0}/quantui/viz_backend_router.py +0 -0
  118. {quantui-0.9.0 → quantui-0.10.0}/quantui/xyz_input.py +0 -0
  119. {quantui-0.9.0 → quantui-0.10.0}/quantui.egg-info/dependency_links.txt +0 -0
  120. {quantui-0.9.0 → quantui-0.10.0}/quantui.egg-info/entry_points.txt +0 -0
  121. {quantui-0.9.0 → quantui-0.10.0}/quantui.egg-info/top_level.txt +0 -0
  122. {quantui-0.9.0 → quantui-0.10.0}/setup.cfg +0 -0
@@ -7,6 +7,165 @@ and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.ht
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.10.0] - 2026-10-03
11
+
12
+ ### Added
13
+
14
+ - **Upload structure files** — new **Upload File** tab (Calculate → Molecule
15
+ Input) and **Load as molecule** on the Files tab: XYZ (last frame), MOL,
16
+ SDF, MOL2, PDB, CIF, Gaussian `.gjf`/`.com` and `.log`/`.out`. Charge and
17
+ multiplicity are read from the file when it records them; 2-D MOL/SDF
18
+ drawings are embedded in 3-D.
19
+ - **Download to your computer** — every export (structure files, script,
20
+ bundle, cubes, PNGs, plots, CSV, animations) now offers a browser download
21
+ link, and the Files tab has a **Download** button. Works on remote
22
+ Voilà/OnDemand sessions; files over 25 MB get a notice instead.
23
+ - **Implicit solvent for optimizations, frequencies and TD-DFT** — Geometry
24
+ Opt is solvated at every step; Frequency uses PySCF's PCM Hessian and
25
+ solvated IR displacements (Raman is skipped in solvent); TD-DFT uses an
26
+ equilibrium ground state and non-equilibrium excitations with each
27
+ solvent's own optical dielectric. Also in SLURM batch jobs.
28
+ - **Point groups and orbital symmetry labels** — the molecule summary and
29
+ result cards show the point group (0.01 Å tolerance, with a "nearly X"
30
+ hint); the orbital energy diagram labels orbitals textbook-style
31
+ (1a₁, 2a₁, 1b₂, 3a₁, 1b₁ for water; σ/π for linear molecules; C₃ᵥ labels
32
+ for NH₃).
33
+ - **Density, spin-density and ESP surfaces** — the Isosurface panel draws the
34
+ electron density, the spin density (α − β) and the electrostatic potential
35
+ mapped on the density surface (red = negative, blue = positive, with a
36
+ colour bar), and α/β orbitals for unrestricted results.
37
+ - **Vibration viewer** — displacement arrows, an amplitude slider and a table
38
+ of every mode with IR intensity and Raman activity.
39
+ - **Thermochemistry at any temperature and pressure** — recomputed from the
40
+ stored frequencies (no new calculation), with U, H, S, G, Cv, Cp and the
41
+ rotational symmetry number.
42
+ - **Edit Structure** — set a bond length, angle or dihedral to a value,
43
+ delete atoms, add a hydrogen, change an element, undo; pick atoms by
44
+ clicking the viewer. **Freeze atoms** for a constrained Geometry Opt.
45
+ - **Orbital gallery** — the Isosurface panel's **Orbital gallery** button
46
+ shows the orbitals around the HOMO–LUMO gap (2, 3 or 4 on each side) as
47
+ small viewers that rotate together, each labelled with its symmetry and
48
+ energy; follows the α/β choice for unrestricted results.
49
+ - **Transition State calc type** — searches for the saddle point near the
50
+ input geometry with Sella (starting from the analytic Hessian, with the
51
+ same PySCF settings as an optimization: PCM, density fitting, D3, GPU, SCF
52
+ rescue), then runs a frequency calculation and says plainly whether it
53
+ found a transition state (exactly one imaginary frequency), a minimum, or
54
+ a higher-order saddle point. Results open on the Vibrational panel to
55
+ animate the imaginary mode, plus IR, search trajectory, orbitals and
56
+ populations. Needs the optional extra: `pip install "quantui[ts]"`.
57
+ Local runs only for now (not SLURM batch).
58
+ - **Populations and Isosurface for Frequency and TD-DFT results** — both
59
+ record the reference SCF's Mulliken charges, dipole and orbitals (both spin
60
+ channels for UHF/UKS), so the Populations, Isosurface and (TD-DFT) Energies
61
+ panels fill for them too, locally and from SLURM. Frequency Molden files
62
+ now include the orbitals.
63
+ - **⟨S²⟩ for open-shell results** — single points record and show ⟨S²⟩
64
+ next to the ideal S(S+1), flagged when off by more than 10 % (spin
65
+ contamination). Reorganization-energy results record it at all four
66
+ points of each channel (`s2_*` fields in `result.json`), so a
67
+ spin-contaminated ion SCF can be filtered out of a λ dataset.
68
+ - **Submit from a login node with `quantui-batch`** — a standard-library
69
+ Python 3.6+ launcher for SSH users. It never starts the image or imports
70
+ QuantUI on the login node: it writes the same job folder as
71
+ `SlurmBackend.prepare()` (constants copied from QuantUI at install time,
72
+ logic held equal by tests) and calls `sbatch`; the calculation runs in the
73
+ image on a compute node. Install once per image, e.g.
74
+ `apptainer exec IMAGE quantui install-launcher /shared/bin`.
75
+ `quantui-batch submit mol.xyz --calc frequency --method B3LYP --basis def2-SVP`;
76
+ `status`, `log`, `rerun` (e.g. `--mem=64G` after running out of memory),
77
+ `cancel`, `estimate` and `path` follow it. At most
78
+ `QUANTUI_MAX_CONCURRENT_JOBS` (default 2) QuantUI jobs may be queued or
79
+ running per user, counted from the real queue.
80
+ - **`quantui-batch` workflow commands** — `--preset NAME` (shared
81
+ `presets.json` beside the launcher, plus per-user presets); `--from JOB`
82
+ starts from another job's optimized geometry, waiting on it with an
83
+ `afterok` dependency if it is still running (the worker loads the geometry
84
+ at run time, `quantui/backends/batch_chain.py`); `--queue-rest` lines jobs
85
+ up behind the user's running ones instead of refusing them; a duplicate
86
+ guard (`--again` to override); `rerun --more-memory` / `--more-time`;
87
+ `results JOB` (energy, convergence, imaginary modes, strongest IR bands,
88
+ excited states, shifts); `presets`; and `check` (python, image, Slurm
89
+ commands, job folders and free space, presets).
90
+ - **Every QuantUI batch job is tagged `#SBATCH --comment=quantui`**, so an
91
+ operator can list all of them with `squeue -o "%k"`.
92
+ - **`quantui submit` accepts `.xyz` files** with `--calc`, `--method`,
93
+ `--basis`, `--charge`, `--mult`, `--solvent`, `--preopt` and repeatable
94
+ `--option KEY=VALUE`; an impossible charge/multiplicity is refused before
95
+ anything is queued. The same flags override a request JSON's values.
96
+ - **`quantui submit --prepare-only`** writes the job folder (`request.json` +
97
+ `submit.slurm`) without calling `sbatch` and prints the script path. Its
98
+ registry record has the new non-active status `prepared`.
99
+
100
+ ### Changed
101
+
102
+ - **The GPU image builds from the working tree, like the CPU image** —
103
+ `quantui-gpu.def` copies the same `%files` allowlist as `quantui.def` and
104
+ installs it editable, instead of a pinned PyPI release, so a GPU node runs
105
+ the code that was just tested. `build-gpu.sh` records the commit
106
+ (`git describe`) in the image's `QuantUICommit` label and
107
+ `/opt/build-info/quantui-commit.txt`; its `--version` flag is gone — check
108
+ out a release tag to build that release.
109
+ - **Finished batch attempts reach History when the app starts**, even where
110
+ SLURM is unavailable (e.g. an OnDemand session), so jobs submitted from a
111
+ terminal show up without opening the Cluster Jobs tab.
112
+
113
+ ### Fixed
114
+
115
+ - **PBE-D3 now includes D3** — it needed `pyscf.dftd3`, which no QuantUI
116
+ environment installed, so PBE-D3 ran as plain PBE (with a warning). D3
117
+ (zero damping) is now applied through PySCF's built-in dispersion
118
+ (`pyscf-dispersion`, added to the `[pyscf]` extra, the conda environment
119
+ and the CPU image), including in gradients and Hessians.
120
+ - **Rotational symmetry number** — thermochemistry detected symmetry at
121
+ PySCF's strict tolerance, so slightly unsymmetric geometries (any
122
+ optimized water or ammonia) used σ = 1, overstating the entropy by R ln σ.
123
+ Symmetric molecules' S and G change.
124
+ - **`quantui submit --depends-on`** accepts a request id or a SLURM job id
125
+ and resolves it; it used to write the request id into
126
+ `--dependency=afterok:` and validate nothing.
127
+ - **"Geometry optimization before the calculation" on SLURM** — Single
128
+ Point and NMR batch jobs ignored the checkbox (the local run honoured it).
129
+ - **Mode-displaced Frequency seeds are re-optimized** — picking "displace
130
+ along mode" as the Frequency seed disabled the pre-optimization, so the
131
+ frequencies were computed at a geometry that is not a stationary point.
132
+ The checkbox is now ticked for that seed (left on, user can untick).
133
+ - **Reorganization Energy shows its optimizer settings** — the run used the
134
+ max-force and max-steps fields while they were hidden, so values left over
135
+ from Geometry Opt or PES Scan applied unseen.
136
+ - **No placeholder Raman spectrum** — when Raman activities were not
137
+ computed (PCM run, or `pyscf-properties` missing), the Raman panel drew
138
+ every mode at the same height. It now says why there is no spectrum.
139
+ - **Disconnected structures are flagged for every source** — the molecule
140
+ summary notes separate fragments for pasted, library, uploaded, edited and
141
+ History structures, not only Online Search results.
142
+ - **Pasting a multi-frame XYZ** says what it is and how to load it, instead
143
+ of "Line N: not enough values".
144
+ - **Export Script follows the calculation** — it used to write a gas-phase
145
+ single point whatever was set up. It now applies the selected PCM solvent
146
+ and density fitting, adds the Hessian + thermochemistry for Frequency and
147
+ the excited states (with the solvent's optical dielectric) for TD-DFT, and
148
+ says plainly when it covers only the SCF (Geometry Opt, NMR, PES Scan,
149
+ Reorganization Energy).
150
+ - **CPU image: NMR and analytical Raman** — the image installed QuantUI
151
+ without the `[pyscf]` extra, so `pyscf-properties` was missing. It now
152
+ installs the extra, and the build fails if `pyscf.prop.nmr` or
153
+ `pyscf.dispersion` cannot be imported.
154
+ - **Solvent names are case-insensitive**; an unknown solvent is an error.
155
+ A request with `"water"` used to run in the gas phase.
156
+ - **Export Script** writes into the result folder instead of the server's
157
+ working directory.
158
+
159
+ - **Solvated batch requests the worker cannot run are refused up front** —
160
+ `quantui submit` and `quantui-batch` reject an unknown solvent, and a
161
+ solvent on a calc type the batch worker runs gas-phase only (e.g. `nmr`),
162
+ instead of letting the job queue and then fail. The supported set now
163
+ lives in one place (`batch_input.SOLVENT_CALC_TYPES`).
164
+ - **SLURM memory estimate for transition-metal complexes** —
165
+ `estimate_slurm_resources()` used a short element table without Mn, Co,
166
+ Ni, Mo and most other metals, so a metal counted as 0 electrons and the
167
+ memory estimate came out low. It now uses the full table.
168
+
10
169
  ## [0.9.0] - 2026-09-26
11
170
 
12
171
  ### Added
@@ -934,7 +1093,8 @@ Initial public scaffolding of the QuantUI package: `quantui` package with
934
1093
  `calculator.py`, basic notebook launcher, Apptainer container definition,
935
1094
  MIT license, and project metadata.
936
1095
 
937
- [Unreleased]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.9.0...HEAD
1096
+ [Unreleased]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.10.0...HEAD
1097
+ [0.10.0]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.9.0...v0.10.0
938
1098
  [0.9.0]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.8.2...v0.9.0
939
1099
  [0.8.2]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.8.1...v0.8.2
940
1100
  [0.8.1]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.8.0...v0.8.1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: quantui
3
- Version: 0.9.0
3
+ Version: 0.10.0
4
4
  Summary: An open-source frontend for DFT and post-HF quantum chemistry with PySCF
5
5
  Author-email: Jonathan Schultz <nccu-schultz-lab@users.noreply.github.com>
6
6
  License: MIT License
@@ -61,6 +61,7 @@ Requires-Dist: kaleido<2,>=0.2.1
61
61
  Provides-Extra: pyscf
62
62
  Requires-Dist: pyscf<3,>=2.13.0; extra == "pyscf"
63
63
  Requires-Dist: pyscf-properties; extra == "pyscf"
64
+ Requires-Dist: pyscf-dispersion>=1.0; extra == "pyscf"
64
65
  Provides-Extra: pyfock
65
66
  Requires-Dist: pyfock<0.3,>=0.1.7; extra == "pyfock"
66
67
  Requires-Dist: ase<4,>=3.22.0; extra == "pyfock"
@@ -71,6 +72,9 @@ Requires-Dist: ase<4,>=3.22.0; extra == "ase"
71
72
  Provides-Extra: xtb
72
73
  Requires-Dist: xtb>=22.1; extra == "xtb"
73
74
  Requires-Dist: ase<4,>=3.22.0; extra == "xtb"
75
+ Provides-Extra: ts
76
+ Requires-Dist: sella>=2.6; extra == "ts"
77
+ Requires-Dist: ase<4,>=3.26; extra == "ts"
74
78
  Provides-Extra: app
75
79
  Requires-Dist: voila<0.6,>=0.5.0; extra == "app"
76
80
  Requires-Dist: ipykernel<8,>=6.0.0; extra == "app"
@@ -166,7 +170,11 @@ Real output from QuantUI, straight from the app:
166
170
  ready-to-run coordination complexes**, searchable by name/formula), or run a
167
171
  structure search by name, SMILES, InChI, PubChem CID, InChIKey, or CAS number
168
172
  (PubChem → NCI CACTUS → offline bundled-library fallback; SMILES/InChI resolve
169
- locally with no network)
173
+ locally with no network), or upload a structure file (XYZ, MOL/SDF, MOL2,
174
+ PDB, CIF, Gaussian input or output)
175
+ - **Structure editing** — set a bond length, angle or dihedral to a value,
176
+ delete atoms, add a hydrogen, change an element, undo; pick atoms by
177
+ clicking the viewer. Freeze atoms for a constrained geometry optimization
170
178
  - **Offline-first** — runs with no internet: the bundled molecule library and
171
179
  the 3D viewer's JavaScript (3Dmol.js) are vendored, so structure lookup and
172
180
  every 3D view work in an air-gapped classroom. (Network is used only for the
@@ -176,21 +184,30 @@ Real output from QuantUI, straight from the app:
176
184
  router picks the right renderer per task, and a Status-tab toggle persists
177
185
  your default-backend preference between sessions
178
186
  - **In-session calculations** — RHF, UHF, 9 DFT functionals, MP2, CCSD,
179
- CCSD(T), NMR shielding, TD-DFT UV-Vis, and 1D PES scans via PySCF, running
187
+ CCSD(T), NMR shielding, TD-DFT UV-Vis, 1D PES scans, Marcus reorganization
188
+ energies and **transition-state searches** (Sella, with an automatic
189
+ frequency check that says whether it found a TS) via PySCF, running
180
190
  in your Python kernel. Optional PyFock 0.1.x adds native-Windows PBE
181
191
  single points and geometry optimizations for neutral, closed-shell molecules
182
192
  with def2-SVP/def2-TZVP, including orbital and population analysis;
183
193
  engine capabilities automatically gate the setup menus
184
194
  - **Implicit solvent** — PCM solvation (Water, Ethanol, THF, DMSO,
185
- Acetonitrile) via a single checkbox
195
+ Acetonitrile) via a single checkbox: single points, solvated geometry
196
+ optimizations, frequencies (PCM Hessian + IR; Raman stays gas-phase) and
197
+ TD-DFT (non-equilibrium excitations). NMR and PES scans are gas-phase only
186
198
  - **Rich results** — total energy, HOMO-LUMO gap, Mulliken charges, dipole
187
- moment, thermochemistry (H, S, G at 298 K), IR spectrum chart (stick and
188
- Lorentzian-broadened), ¹H/¹³C NMR chemical shifts, orbital energy-level
189
- diagram, HOMO/LUMO isosurface (cube-file rendering with toggle for HOMO-1,
190
- HOMO, LUMO, LUMO+1), and a side-by-side comparison table for multiple
191
- calculations
199
+ moment, point group, ⟨S²⟩ with a spin-contamination flag for open-shell
200
+ results, thermochemistry (U, H, S, G, Cv, Cp at any temperature and
201
+ pressure), IR spectrum chart (stick and Lorentzian-broadened), ¹H/¹³C NMR
202
+ chemical shifts, an orbital energy-level diagram with symmetry labels
203
+ (1a₁, 1b₂ …), and a side-by-side comparison table for multiple calculations
204
+ - **Surfaces** — any molecular orbital (α and β for unrestricted results), an
205
+ **orbital gallery** of the orbitals around the HOMO–LUMO gap in small linked
206
+ viewers, the electron density, the spin density, and the electrostatic
207
+ potential mapped on the density surface
192
208
  - **Geometry optimization** — BFGS optimizer with step-by-step trajectory
193
209
  animation; vibrational frequency analysis with animated normal modes,
210
+ displacement arrows, an amplitude slider and a table of every mode,
194
211
  user-tunable playback FPS, and a per-result-directory disk cache so mode
195
212
  switches on repeat visits and history replay are instant
196
213
  - **Inorganic / coordination complexes** — first-class support for
@@ -209,7 +226,9 @@ Real output from QuantUI, straight from the app:
209
226
  timestamped directory; a built-in browser lets you reload past results
210
227
  after a kernel restart; the full `pyscf.log` is shown inline
211
228
  - **Structure exports** — download XYZ, MOL/SDF, or PDB files alongside the
212
- saved results; script export for a standalone `.py` file
229
+ saved results; script export for a standalone `.py` file. Every export also
230
+ downloads straight to your computer, including from a remote
231
+ Voilà/OnDemand session
213
232
  - **Plot export** — save IR, UV-Vis, PES, and orbital diagrams as standalone
214
233
  HTML
215
234
  - **Optional GPU acceleration** — when [gpu4pyscf](https://github.com/pyscf/gpu4pyscf)
@@ -217,8 +236,14 @@ Real output from QuantUI, straight from the app:
217
236
  via `mf.to_gpu()` (RHF / UHF / RKS / UKS supported; CCSD(T) stays on CPU).
218
237
  The Status tab + every result card show which compute device was used.
219
238
  Set `QUANTUI_DISABLE_GPU=1` to force CPU even when the GPU is available.
220
- Geometry-optimization SCF steps are currently CPU-only; that limitation was
221
- reproduced on real GPU hardware and remains an open optimizer-path fix.
239
+ Geometry-optimization SCF and gradient steps offload the same way. For a
240
+ frequency calculation, the displaced IR SCFs offload, but the reference SCF
241
+ and the analytical Hessian still run on the CPU.
242
+ - **Cluster batch jobs** — `quantui-batch` submits QuantUI calculations to
243
+ SLURM from a login node over SSH, without starting the image there (presets,
244
+ chaining from another job's optimized geometry, reruns with more memory or
245
+ time, results summaries); `quantui submit` does the same wherever QuantUI is
246
+ installed. See [apptainer/slurm/README.md](https://github.com/The-Schultz-Lab/QuantUI/blob/main/apptainer/slurm/README.md)
222
247
  - **Timing calibration** — one-click benchmark suite populates the time
223
248
  estimator with real machine data so predictions are accurate from the first run
224
249
  - **Voilà app mode** — serve the notebook as a polished widget-only UI (no
@@ -368,6 +393,19 @@ reports the reason. GPU single points use PyFock's GPU SCF/integral/XC path;
368
393
  GPU geometry optimizations use numerical finite-difference forces because the
369
394
  installed PyFock release's analytical gradient implementation is CPU-only.
370
395
 
396
+ ### Optional: transition-state searches (Sella)
397
+
398
+ The **Transition State** calc type uses [Sella](https://github.com/zadorlab/sella),
399
+ installed as an optional extra:
400
+
401
+ ```bash
402
+ pip install "quantui[ts]"
403
+ ```
404
+
405
+ Sella pulls in jax/jaxlib (about 380 MB) and is LGPL-3.0, used as a
406
+ separately installed library. Without it the calc type stays in the menu and
407
+ says how to install it. Local runs only for now (not SLURM batch jobs).
408
+
371
409
  ### Optional: GFN-FF metal pre-optimization (xtb)
372
410
 
373
411
  The classical (MMFF/UFF) pre-optimizer relies on RDKit's organic valence
@@ -516,8 +554,13 @@ dashboard. After installation:
516
554
  quantui log tail -n 50 # last 50 events from event_log.jsonl
517
555
  quantui gpu check # is GPU offload available right now?
518
556
  quantui analytics build --open # build dashboard.html + open in browser
557
+ quantui submit water.xyz --calc frequency --method B3LYP --basis def2-SVP # SLURM batch job
519
558
  ```
520
559
 
560
+ On a cluster, `apptainer exec IMAGE quantui install-launcher DIR` writes the
561
+ `quantui-batch` launcher for submitting from a login node — see
562
+ [apptainer/slurm/README.md](https://github.com/The-Schultz-Lab/QuantUI/blob/main/apptainer/slurm/README.md).
563
+
521
564
  Full reference with all flags and examples: [docs/CLI.md](https://github.com/The-Schultz-Lab/QuantUI/blob/main/docs/CLI.md).
522
565
 
523
566
  ---
@@ -566,11 +609,11 @@ Five step-by-step notebooks in [`notebooks/tutorials/`](https://github.com/The-S
566
609
  | PBE | DFT GGA | Large molecules; metals; when speed matters |
567
610
  | PBE0 | DFT hybrid | Charge-transfer, band gaps |
568
611
  | M06-2X | DFT meta-hybrid | Thermochemistry, barrier heights |
569
- | wB97X-D | DFT range-sep. + D3 | Non-covalent interactions, excited states |
612
+ | wB97X-D | DFT range-sep. + built-in dispersion | Non-covalent interactions, excited states |
570
613
  | CAM-B3LYP | DFT range-sep. | Charge-transfer UV-Vis, Rydberg states |
571
614
  | M06-L | DFT local meta-GGA | Large molecules; transition metals |
572
615
  | HSE06 | DFT screened hybrid | Band gaps, large molecules |
573
- | PBE-D3 | DFT GGA + dispersion | Van der Waals complexes, stacking |
616
+ | PBE-D3 | DFT GGA + Grimme D3 (zero damping) | Van der Waals complexes, stacking |
574
617
  | MP2 | Post-HF | Accurate energetics for small molecules (O(N⁵)) |
575
618
  | CCSD | Post-HF coupled cluster | High-accuracy small-molecule energies (O(N⁶)) |
576
619
  | CCSD(T) | Post-HF coupled cluster | Benchmark "gold standard" energies (O(N⁷); CPU only) |
@@ -580,11 +623,13 @@ Five step-by-step notebooks in [`notebooks/tutorials/`](https://github.com/The-S
580
623
  | Type | Output |
581
624
  | --- | --- |
582
625
  | Single Point | Energy, HOMO-LUMO gap, Mulliken charges, dipole moment |
583
- | Geometry Opt | Optimised structure, trajectory animation |
584
- | Frequency | Vibrational frequencies, ZPVE, IR intensities, thermochemistry (H/S/G at 298 K), animated normal modes, IR spectrum chart (stick / Lorentzian broadened) |
626
+ | Geometry Opt | Optimised structure, trajectory animation; optional frozen atoms |
627
+ | Transition State | Saddle point near the input geometry (Sella, optional `[ts]` extra), then a frequency check: transition state, minimum, or higher-order saddle point; animated imaginary mode |
628
+ | Frequency | Vibrational frequencies, ZPVE, IR intensities, thermochemistry at any temperature and pressure, animated normal modes, IR spectrum chart (stick / Lorentzian broadened) |
585
629
  | UV-Vis (TD-DFT) | Excitation energies, oscillator strengths, UV-Vis spectrum plot |
586
630
  | NMR Shielding | ¹H and ¹³C chemical shifts relative to TMS via GIAO; tabulated by element |
587
631
  | PES Scan | 1D potential energy surface along a bond, angle, or dihedral; energy profile chart; geometry animation at each scan point |
632
+ | Reorganization Energy | Marcus four-point internal reorganization energy λ = λ₁ + λ₂ for hole (cation) and/or electron (anion) transfer |
588
633
 
589
634
  ### Basis sets
590
635
 
@@ -633,6 +678,8 @@ quantui/ Main package
633
678
  freq_calc.py Vibrational frequency + thermochemistry
634
679
  ir_plot.py IR spectrum chart (stick / Lorentzian broadened)
635
680
  tddft_calc.py TD-DFT UV-Vis excited-state calculations
681
+ ts_search.py Transition-state search (Sella) + frequency check
682
+ reorganization_energy.py Marcus four-point reorganization energy
636
683
  nmr_calc.py NMR shielding + ¹H/¹³C chemical shifts
637
684
  pes_scan.py 1D potential energy surface scan
638
685
  optimizer.py QM geometry optimization with trajectory
@@ -653,12 +700,14 @@ quantui/ Main package
653
700
  benchmarks.py Timing calibration benchmark suite
654
701
  config.py Methods, basis sets, solvent/NMR options, presets
655
702
  ase_bridge.py ASE structure I/O
703
+ batch_launcher.py Renders the quantui-batch login-node launcher
704
+ backends/ SLURM batch backend, worker and job registry
656
705
  preopt.py RDKit MMFF94/UFF force-field pre-optimization
657
706
  data/ Bundled library (SQLite + manifests) + vendored 3Dmol.js
658
707
  notebooks/
659
708
  molecule_computations.ipynb Main user-facing interface (3-cell launcher)
660
709
  tutorials/ Step-by-step guided notebooks (01–05)
661
- tests/ pytest test suite (~1500 tests; run in parallel via pytest-xdist)
710
+ tests/ pytest test suite (~3,700 tests; run in parallel via pytest-xdist)
662
711
  apptainer/ Container definition for reproducible deployment
663
712
  local-setup/ Conda environment definition
664
713
  pyproject.toml Package metadata and tool config
@@ -61,7 +61,11 @@ Real output from QuantUI, straight from the app:
61
61
  ready-to-run coordination complexes**, searchable by name/formula), or run a
62
62
  structure search by name, SMILES, InChI, PubChem CID, InChIKey, or CAS number
63
63
  (PubChem → NCI CACTUS → offline bundled-library fallback; SMILES/InChI resolve
64
- locally with no network)
64
+ locally with no network), or upload a structure file (XYZ, MOL/SDF, MOL2,
65
+ PDB, CIF, Gaussian input or output)
66
+ - **Structure editing** — set a bond length, angle or dihedral to a value,
67
+ delete atoms, add a hydrogen, change an element, undo; pick atoms by
68
+ clicking the viewer. Freeze atoms for a constrained geometry optimization
65
69
  - **Offline-first** — runs with no internet: the bundled molecule library and
66
70
  the 3D viewer's JavaScript (3Dmol.js) are vendored, so structure lookup and
67
71
  every 3D view work in an air-gapped classroom. (Network is used only for the
@@ -71,21 +75,30 @@ Real output from QuantUI, straight from the app:
71
75
  router picks the right renderer per task, and a Status-tab toggle persists
72
76
  your default-backend preference between sessions
73
77
  - **In-session calculations** — RHF, UHF, 9 DFT functionals, MP2, CCSD,
74
- CCSD(T), NMR shielding, TD-DFT UV-Vis, and 1D PES scans via PySCF, running
78
+ CCSD(T), NMR shielding, TD-DFT UV-Vis, 1D PES scans, Marcus reorganization
79
+ energies and **transition-state searches** (Sella, with an automatic
80
+ frequency check that says whether it found a TS) via PySCF, running
75
81
  in your Python kernel. Optional PyFock 0.1.x adds native-Windows PBE
76
82
  single points and geometry optimizations for neutral, closed-shell molecules
77
83
  with def2-SVP/def2-TZVP, including orbital and population analysis;
78
84
  engine capabilities automatically gate the setup menus
79
85
  - **Implicit solvent** — PCM solvation (Water, Ethanol, THF, DMSO,
80
- Acetonitrile) via a single checkbox
86
+ Acetonitrile) via a single checkbox: single points, solvated geometry
87
+ optimizations, frequencies (PCM Hessian + IR; Raman stays gas-phase) and
88
+ TD-DFT (non-equilibrium excitations). NMR and PES scans are gas-phase only
81
89
  - **Rich results** — total energy, HOMO-LUMO gap, Mulliken charges, dipole
82
- moment, thermochemistry (H, S, G at 298 K), IR spectrum chart (stick and
83
- Lorentzian-broadened), ¹H/¹³C NMR chemical shifts, orbital energy-level
84
- diagram, HOMO/LUMO isosurface (cube-file rendering with toggle for HOMO-1,
85
- HOMO, LUMO, LUMO+1), and a side-by-side comparison table for multiple
86
- calculations
90
+ moment, point group, ⟨S²⟩ with a spin-contamination flag for open-shell
91
+ results, thermochemistry (U, H, S, G, Cv, Cp at any temperature and
92
+ pressure), IR spectrum chart (stick and Lorentzian-broadened), ¹H/¹³C NMR
93
+ chemical shifts, an orbital energy-level diagram with symmetry labels
94
+ (1a₁, 1b₂ …), and a side-by-side comparison table for multiple calculations
95
+ - **Surfaces** — any molecular orbital (α and β for unrestricted results), an
96
+ **orbital gallery** of the orbitals around the HOMO–LUMO gap in small linked
97
+ viewers, the electron density, the spin density, and the electrostatic
98
+ potential mapped on the density surface
87
99
  - **Geometry optimization** — BFGS optimizer with step-by-step trajectory
88
100
  animation; vibrational frequency analysis with animated normal modes,
101
+ displacement arrows, an amplitude slider and a table of every mode,
89
102
  user-tunable playback FPS, and a per-result-directory disk cache so mode
90
103
  switches on repeat visits and history replay are instant
91
104
  - **Inorganic / coordination complexes** — first-class support for
@@ -104,7 +117,9 @@ Real output from QuantUI, straight from the app:
104
117
  timestamped directory; a built-in browser lets you reload past results
105
118
  after a kernel restart; the full `pyscf.log` is shown inline
106
119
  - **Structure exports** — download XYZ, MOL/SDF, or PDB files alongside the
107
- saved results; script export for a standalone `.py` file
120
+ saved results; script export for a standalone `.py` file. Every export also
121
+ downloads straight to your computer, including from a remote
122
+ Voilà/OnDemand session
108
123
  - **Plot export** — save IR, UV-Vis, PES, and orbital diagrams as standalone
109
124
  HTML
110
125
  - **Optional GPU acceleration** — when [gpu4pyscf](https://github.com/pyscf/gpu4pyscf)
@@ -112,8 +127,14 @@ Real output from QuantUI, straight from the app:
112
127
  via `mf.to_gpu()` (RHF / UHF / RKS / UKS supported; CCSD(T) stays on CPU).
113
128
  The Status tab + every result card show which compute device was used.
114
129
  Set `QUANTUI_DISABLE_GPU=1` to force CPU even when the GPU is available.
115
- Geometry-optimization SCF steps are currently CPU-only; that limitation was
116
- reproduced on real GPU hardware and remains an open optimizer-path fix.
130
+ Geometry-optimization SCF and gradient steps offload the same way. For a
131
+ frequency calculation, the displaced IR SCFs offload, but the reference SCF
132
+ and the analytical Hessian still run on the CPU.
133
+ - **Cluster batch jobs** — `quantui-batch` submits QuantUI calculations to
134
+ SLURM from a login node over SSH, without starting the image there (presets,
135
+ chaining from another job's optimized geometry, reruns with more memory or
136
+ time, results summaries); `quantui submit` does the same wherever QuantUI is
137
+ installed. See [apptainer/slurm/README.md](https://github.com/The-Schultz-Lab/QuantUI/blob/main/apptainer/slurm/README.md)
117
138
  - **Timing calibration** — one-click benchmark suite populates the time
118
139
  estimator with real machine data so predictions are accurate from the first run
119
140
  - **Voilà app mode** — serve the notebook as a polished widget-only UI (no
@@ -263,6 +284,19 @@ reports the reason. GPU single points use PyFock's GPU SCF/integral/XC path;
263
284
  GPU geometry optimizations use numerical finite-difference forces because the
264
285
  installed PyFock release's analytical gradient implementation is CPU-only.
265
286
 
287
+ ### Optional: transition-state searches (Sella)
288
+
289
+ The **Transition State** calc type uses [Sella](https://github.com/zadorlab/sella),
290
+ installed as an optional extra:
291
+
292
+ ```bash
293
+ pip install "quantui[ts]"
294
+ ```
295
+
296
+ Sella pulls in jax/jaxlib (about 380 MB) and is LGPL-3.0, used as a
297
+ separately installed library. Without it the calc type stays in the menu and
298
+ says how to install it. Local runs only for now (not SLURM batch jobs).
299
+
266
300
  ### Optional: GFN-FF metal pre-optimization (xtb)
267
301
 
268
302
  The classical (MMFF/UFF) pre-optimizer relies on RDKit's organic valence
@@ -411,8 +445,13 @@ dashboard. After installation:
411
445
  quantui log tail -n 50 # last 50 events from event_log.jsonl
412
446
  quantui gpu check # is GPU offload available right now?
413
447
  quantui analytics build --open # build dashboard.html + open in browser
448
+ quantui submit water.xyz --calc frequency --method B3LYP --basis def2-SVP # SLURM batch job
414
449
  ```
415
450
 
451
+ On a cluster, `apptainer exec IMAGE quantui install-launcher DIR` writes the
452
+ `quantui-batch` launcher for submitting from a login node — see
453
+ [apptainer/slurm/README.md](https://github.com/The-Schultz-Lab/QuantUI/blob/main/apptainer/slurm/README.md).
454
+
416
455
  Full reference with all flags and examples: [docs/CLI.md](https://github.com/The-Schultz-Lab/QuantUI/blob/main/docs/CLI.md).
417
456
 
418
457
  ---
@@ -461,11 +500,11 @@ Five step-by-step notebooks in [`notebooks/tutorials/`](https://github.com/The-S
461
500
  | PBE | DFT GGA | Large molecules; metals; when speed matters |
462
501
  | PBE0 | DFT hybrid | Charge-transfer, band gaps |
463
502
  | M06-2X | DFT meta-hybrid | Thermochemistry, barrier heights |
464
- | wB97X-D | DFT range-sep. + D3 | Non-covalent interactions, excited states |
503
+ | wB97X-D | DFT range-sep. + built-in dispersion | Non-covalent interactions, excited states |
465
504
  | CAM-B3LYP | DFT range-sep. | Charge-transfer UV-Vis, Rydberg states |
466
505
  | M06-L | DFT local meta-GGA | Large molecules; transition metals |
467
506
  | HSE06 | DFT screened hybrid | Band gaps, large molecules |
468
- | PBE-D3 | DFT GGA + dispersion | Van der Waals complexes, stacking |
507
+ | PBE-D3 | DFT GGA + Grimme D3 (zero damping) | Van der Waals complexes, stacking |
469
508
  | MP2 | Post-HF | Accurate energetics for small molecules (O(N⁵)) |
470
509
  | CCSD | Post-HF coupled cluster | High-accuracy small-molecule energies (O(N⁶)) |
471
510
  | CCSD(T) | Post-HF coupled cluster | Benchmark "gold standard" energies (O(N⁷); CPU only) |
@@ -475,11 +514,13 @@ Five step-by-step notebooks in [`notebooks/tutorials/`](https://github.com/The-S
475
514
  | Type | Output |
476
515
  | --- | --- |
477
516
  | Single Point | Energy, HOMO-LUMO gap, Mulliken charges, dipole moment |
478
- | Geometry Opt | Optimised structure, trajectory animation |
479
- | Frequency | Vibrational frequencies, ZPVE, IR intensities, thermochemistry (H/S/G at 298 K), animated normal modes, IR spectrum chart (stick / Lorentzian broadened) |
517
+ | Geometry Opt | Optimised structure, trajectory animation; optional frozen atoms |
518
+ | Transition State | Saddle point near the input geometry (Sella, optional `[ts]` extra), then a frequency check: transition state, minimum, or higher-order saddle point; animated imaginary mode |
519
+ | Frequency | Vibrational frequencies, ZPVE, IR intensities, thermochemistry at any temperature and pressure, animated normal modes, IR spectrum chart (stick / Lorentzian broadened) |
480
520
  | UV-Vis (TD-DFT) | Excitation energies, oscillator strengths, UV-Vis spectrum plot |
481
521
  | NMR Shielding | ¹H and ¹³C chemical shifts relative to TMS via GIAO; tabulated by element |
482
522
  | PES Scan | 1D potential energy surface along a bond, angle, or dihedral; energy profile chart; geometry animation at each scan point |
523
+ | Reorganization Energy | Marcus four-point internal reorganization energy λ = λ₁ + λ₂ for hole (cation) and/or electron (anion) transfer |
483
524
 
484
525
  ### Basis sets
485
526
 
@@ -528,6 +569,8 @@ quantui/ Main package
528
569
  freq_calc.py Vibrational frequency + thermochemistry
529
570
  ir_plot.py IR spectrum chart (stick / Lorentzian broadened)
530
571
  tddft_calc.py TD-DFT UV-Vis excited-state calculations
572
+ ts_search.py Transition-state search (Sella) + frequency check
573
+ reorganization_energy.py Marcus four-point reorganization energy
531
574
  nmr_calc.py NMR shielding + ¹H/¹³C chemical shifts
532
575
  pes_scan.py 1D potential energy surface scan
533
576
  optimizer.py QM geometry optimization with trajectory
@@ -548,12 +591,14 @@ quantui/ Main package
548
591
  benchmarks.py Timing calibration benchmark suite
549
592
  config.py Methods, basis sets, solvent/NMR options, presets
550
593
  ase_bridge.py ASE structure I/O
594
+ batch_launcher.py Renders the quantui-batch login-node launcher
595
+ backends/ SLURM batch backend, worker and job registry
551
596
  preopt.py RDKit MMFF94/UFF force-field pre-optimization
552
597
  data/ Bundled library (SQLite + manifests) + vendored 3Dmol.js
553
598
  notebooks/
554
599
  molecule_computations.ipynb Main user-facing interface (3-cell launcher)
555
600
  tutorials/ Step-by-step guided notebooks (01–05)
556
- tests/ pytest test suite (~1500 tests; run in parallel via pytest-xdist)
601
+ tests/ pytest test suite (~3,700 tests; run in parallel via pytest-xdist)
557
602
  apptainer/ Container definition for reproducible deployment
558
603
  local-setup/ Conda environment definition
559
604
  pyproject.toml Package metadata and tool config
@@ -8,7 +8,7 @@ build-backend = "setuptools.build_meta"
8
8
 
9
9
  [project]
10
10
  name = "quantui"
11
- version = "0.9.0"
11
+ version = "0.10.0"
12
12
  description = "An open-source frontend for DFT and post-HF quantum chemistry with PySCF"
13
13
  readme = "README.md"
14
14
  requires-python = ">=3.9"
@@ -108,6 +108,8 @@ quantui = [
108
108
  "data/manifests/*.json",
109
109
  "data/js/*.js",
110
110
  "data/js/*.txt",
111
+ # Host-side quantui-batch launcher, written out by `quantui install-launcher`.
112
+ "data/launcher/*.py",
111
113
  ]
112
114
 
113
115
  [project.optional-dependencies]
@@ -124,6 +126,9 @@ pyscf = [
124
126
  # installers too, not just for our dependency bot.
125
127
  "pyscf>=2.13.0,<3",
126
128
  "pyscf-properties",
129
+ # Grimme D3/D4 for PBE-D3 via PySCF's built-in mf.disp (energies,
130
+ # gradients and Hessians). Without it PBE-D3 runs as plain PBE.
131
+ "pyscf-dispersion>=1.0",
127
132
  ]
128
133
 
129
134
  # Native-Windows-capable pure-Python DFT backend (M-PYFOCK). PyFock 0.1.7
@@ -156,6 +161,15 @@ xtb = [
156
161
  "ase>=3.22.0,<4",
157
162
  ]
158
163
 
164
+ # Transition-state search (M-TS, DEC-024): Sella drives QuantUI's own ASE
165
+ # calculator. LGPL-3.0, used as a separately installed library (no Sella code
166
+ # in QuantUI). Pulls in jax/jaxlib (~380 MB; jax >= 0.10 needs numpy >= 2 on
167
+ # Python 3.11, older jax resolves on 3.9/3.10). Sella 2.x needs ASE >= 3.26.
168
+ ts = [
169
+ "sella>=2.6",
170
+ "ase>=3.26,<4",
171
+ ]
172
+
159
173
  # Voilà app server — hides notebook code; students see only the widget UI.
160
174
  # Run with: voila notebooks/molecule_computations.ipynb
161
175
  app = [
@@ -7,7 +7,7 @@ Calculations run locally in the Jupyter session — no cluster or SLURM required
7
7
  PySCF requires Linux/macOS/WSL. Windows users should use the Apptainer container.
8
8
  """
9
9
 
10
- __version__ = "0.9.0"
10
+ __version__ = "0.10.0"
11
11
 
12
12
  import logging
13
13
  from typing import Any