quantui 0.8.2__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 (125) hide show
  1. {quantui-0.8.2 → quantui-0.10.0}/CHANGELOG.md +252 -1
  2. {quantui-0.8.2/quantui.egg-info → quantui-0.10.0}/PKG-INFO +131 -21
  3. {quantui-0.8.2 → quantui-0.10.0}/README.md +116 -20
  4. {quantui-0.8.2 → quantui-0.10.0}/pyproject.toml +66 -5
  5. {quantui-0.8.2 → quantui-0.10.0}/quantui/__init__.py +1 -1
  6. {quantui-0.8.2 → quantui-0.10.0}/quantui/app.py +632 -53
  7. {quantui-0.8.2 → quantui-0.10.0}/quantui/app_analysis.py +46 -1
  8. {quantui-0.8.2 → quantui-0.10.0}/quantui/app_builders.py +367 -15
  9. {quantui-0.8.2 → quantui-0.10.0}/quantui/app_exports.py +56 -8
  10. {quantui-0.8.2 → quantui-0.10.0}/quantui/app_formatters.py +392 -21
  11. {quantui-0.8.2 → quantui-0.10.0}/quantui/app_runflow.py +177 -18
  12. {quantui-0.8.2 → quantui-0.10.0}/quantui/app_slurm.py +183 -14
  13. quantui-0.10.0/quantui/app_structure_edit.py +404 -0
  14. {quantui-0.8.2 → quantui-0.10.0}/quantui/app_visualization.py +789 -25
  15. {quantui-0.8.2 → 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.8.2 → quantui-0.10.0}/quantui/backends/cluster_config.py +63 -6
  19. {quantui-0.8.2 → quantui-0.10.0}/quantui/backends/dispatch.py +22 -8
  20. {quantui-0.8.2 → quantui-0.10.0}/quantui/backends/registry.py +140 -4
  21. {quantui-0.8.2 → quantui-0.10.0}/quantui/backends/slurm.py +221 -51
  22. {quantui-0.8.2 → quantui-0.10.0}/quantui/backends/slurm_ingest.py +157 -12
  23. quantui-0.10.0/quantui/backends/slurm_utils.py +246 -0
  24. quantui-0.10.0/quantui/backends/worker.py +949 -0
  25. {quantui-0.8.2 → quantui-0.10.0}/quantui/backends/worker_payload.py +117 -1
  26. quantui-0.10.0/quantui/batch_launcher.py +153 -0
  27. {quantui-0.8.2 → quantui-0.10.0}/quantui/calculator.py +116 -1
  28. {quantui-0.8.2 → quantui-0.10.0}/quantui/checkpoint.py +162 -1
  29. quantui-0.10.0/quantui/cli.py +781 -0
  30. {quantui-0.8.2 → quantui-0.10.0}/quantui/config.py +221 -22
  31. {quantui-0.8.2 → quantui-0.10.0}/quantui/connectivity.py +40 -7
  32. quantui-0.10.0/quantui/data/launcher/quantui_batch.py +1648 -0
  33. quantui-0.10.0/quantui/downloads.py +90 -0
  34. quantui-0.10.0/quantui/engines/__init__.py +150 -0
  35. quantui-0.10.0/quantui/engines/base.py +194 -0
  36. quantui-0.10.0/quantui/engines/pyfock_engine.py +402 -0
  37. quantui-0.10.0/quantui/engines/pyscf_engine.py +165 -0
  38. {quantui-0.8.2 → quantui-0.10.0}/quantui/freq_calc.py +425 -147
  39. quantui-0.10.0/quantui/freq_displacement_ids.py +79 -0
  40. {quantui-0.8.2 → quantui-0.10.0}/quantui/freq_ir_workers.py +128 -3
  41. {quantui-0.8.2 → quantui-0.10.0}/quantui/freq_raman_workers.py +52 -5
  42. {quantui-0.8.2 → quantui-0.10.0}/quantui/help_content.py +141 -3
  43. {quantui-0.8.2 → quantui-0.10.0}/quantui/ir_plot.py +59 -8
  44. {quantui-0.8.2 → quantui-0.10.0}/quantui/log_utils.py +9 -4
  45. {quantui-0.8.2 → quantui-0.10.0}/quantui/molecule.py +38 -0
  46. {quantui-0.8.2 → quantui-0.10.0}/quantui/nmr_calc.py +18 -2
  47. {quantui-0.8.2 → quantui-0.10.0}/quantui/optimizer.py +241 -26
  48. {quantui-0.8.2 → quantui-0.10.0}/quantui/orbital_visualization.py +634 -24
  49. {quantui-0.8.2 → quantui-0.10.0}/quantui/pes_scan.py +66 -2
  50. quantui-0.10.0/quantui/pyfock_gpu.py +118 -0
  51. {quantui-0.8.2 → quantui-0.10.0}/quantui/raman_calc.py +108 -29
  52. {quantui-0.8.2 → quantui-0.10.0}/quantui/raman_plot.py +16 -5
  53. {quantui-0.8.2 → quantui-0.10.0}/quantui/reorganization_energy.py +128 -8
  54. {quantui-0.8.2 → quantui-0.10.0}/quantui/results_storage.py +100 -5
  55. quantui-0.10.0/quantui/scf_robust.py +167 -0
  56. {quantui-0.8.2 → quantui-0.10.0}/quantui/session_calc.py +458 -166
  57. quantui-0.10.0/quantui/structure_edit.py +272 -0
  58. quantui-0.10.0/quantui/structure_upload.py +234 -0
  59. quantui-0.10.0/quantui/symmetry.py +399 -0
  60. {quantui-0.8.2 → quantui-0.10.0}/quantui/tddft_calc.py +188 -11
  61. {quantui-0.8.2 → quantui-0.10.0}/quantui/theme.py +4 -0
  62. quantui-0.10.0/quantui/ts_search.py +363 -0
  63. {quantui-0.8.2 → quantui-0.10.0}/quantui/user_settings.py +16 -0
  64. {quantui-0.8.2 → quantui-0.10.0/quantui.egg-info}/PKG-INFO +131 -21
  65. {quantui-0.8.2 → quantui-0.10.0}/quantui.egg-info/SOURCES.txt +18 -1
  66. {quantui-0.8.2 → quantui-0.10.0}/quantui.egg-info/requires.txt +18 -0
  67. quantui-0.8.2/quantui/backends/slurm_utils.py +0 -184
  68. quantui-0.8.2/quantui/backends/worker.py +0 -479
  69. quantui-0.8.2/quantui/cli.py +0 -353
  70. {quantui-0.8.2 → quantui-0.10.0}/LICENSE +0 -0
  71. {quantui-0.8.2 → quantui-0.10.0}/MANIFEST.in +0 -0
  72. {quantui-0.8.2 → quantui-0.10.0}/SECURITY.md +0 -0
  73. {quantui-0.8.2 → quantui-0.10.0}/quantui/analytics.py +0 -0
  74. {quantui-0.8.2 → quantui-0.10.0}/quantui/app_history.py +0 -0
  75. {quantui-0.8.2 → quantui-0.10.0}/quantui/app_launcher.py +0 -0
  76. {quantui-0.8.2 → quantui-0.10.0}/quantui/app_measurement.py +0 -0
  77. {quantui-0.8.2 → quantui-0.10.0}/quantui/app_pes_pick.py +0 -0
  78. {quantui-0.8.2 → quantui-0.10.0}/quantui/ase_bridge.py +0 -0
  79. {quantui-0.8.2 → quantui-0.10.0}/quantui/backends/__init__.py +0 -0
  80. {quantui-0.8.2 → quantui-0.10.0}/quantui/backends/base.py +0 -0
  81. {quantui-0.8.2 → quantui-0.10.0}/quantui/backends/cluster_security.py +0 -0
  82. {quantui-0.8.2 → quantui-0.10.0}/quantui/backends/local.py +0 -0
  83. {quantui-0.8.2 → quantui-0.10.0}/quantui/backends/slurm_errors.py +0 -0
  84. {quantui-0.8.2 → quantui-0.10.0}/quantui/benchmarks.py +0 -0
  85. {quantui-0.8.2 → quantui-0.10.0}/quantui/c_stderr.py +0 -0
  86. {quantui-0.8.2 → quantui-0.10.0}/quantui/cactus.py +0 -0
  87. {quantui-0.8.2 → quantui-0.10.0}/quantui/calc_log.py +0 -0
  88. {quantui-0.8.2 → quantui-0.10.0}/quantui/cancellation.py +0 -0
  89. {quantui-0.8.2 → quantui-0.10.0}/quantui/comparison.py +0 -0
  90. {quantui-0.8.2 → quantui-0.10.0}/quantui/data/js/3Dmol-min.js +0 -0
  91. {quantui-0.8.2 → quantui-0.10.0}/quantui/data/js/3Dmol-min.js.LICENSE.txt +0 -0
  92. {quantui-0.8.2 → quantui-0.10.0}/quantui/data/library/library.sqlite +0 -0
  93. {quantui-0.8.2 → quantui-0.10.0}/quantui/data/manifests/bulk_qm9.json +0 -0
  94. {quantui-0.8.2 → quantui-0.10.0}/quantui/data/manifests/curated.json +0 -0
  95. {quantui-0.8.2 → quantui-0.10.0}/quantui/data/manifests/inorganic.json +0 -0
  96. {quantui-0.8.2 → quantui-0.10.0}/quantui/data/manifests/presets.json +0 -0
  97. {quantui-0.8.2 → quantui-0.10.0}/quantui/density_fitting.py +0 -0
  98. {quantui-0.8.2 → quantui-0.10.0}/quantui/descriptor_cards.py +0 -0
  99. {quantui-0.8.2 → quantui-0.10.0}/quantui/estimator_eval.py +0 -0
  100. {quantui-0.8.2 → quantui-0.10.0}/quantui/gpu_offload.py +0 -0
  101. {quantui-0.8.2 → quantui-0.10.0}/quantui/inorganic_guards.py +0 -0
  102. {quantui-0.8.2 → quantui-0.10.0}/quantui/issue_tracker.py +0 -0
  103. {quantui-0.8.2 → quantui-0.10.0}/quantui/live_log.py +0 -0
  104. {quantui-0.8.2 → quantui-0.10.0}/quantui/measurement.py +0 -0
  105. {quantui-0.8.2 → quantui-0.10.0}/quantui/molecule_library.py +0 -0
  106. {quantui-0.8.2 → quantui-0.10.0}/quantui/mulliken_plot.py +0 -0
  107. {quantui-0.8.2 → quantui-0.10.0}/quantui/nmr_plot.py +0 -0
  108. {quantui-0.8.2 → quantui-0.10.0}/quantui/pes_scan_ui.py +0 -0
  109. {quantui-0.8.2 → quantui-0.10.0}/quantui/populations_overlay.py +0 -0
  110. {quantui-0.8.2 → quantui-0.10.0}/quantui/preopt.py +0 -0
  111. {quantui-0.8.2 → quantui-0.10.0}/quantui/progress.py +0 -0
  112. {quantui-0.8.2 → quantui-0.10.0}/quantui/pubchem.py +0 -0
  113. {quantui-0.8.2 → quantui-0.10.0}/quantui/security.py +0 -0
  114. {quantui-0.8.2 → quantui-0.10.0}/quantui/spin_presets.py +0 -0
  115. {quantui-0.8.2 → quantui-0.10.0}/quantui/structure_providers.py +0 -0
  116. {quantui-0.8.2 → quantui-0.10.0}/quantui/utils.py +0 -0
  117. {quantui-0.8.2 → quantui-0.10.0}/quantui/vib_cache.py +0 -0
  118. {quantui-0.8.2 → quantui-0.10.0}/quantui/visualization_py3dmol.py +0 -0
  119. {quantui-0.8.2 → quantui-0.10.0}/quantui/viz_assets.py +0 -0
  120. {quantui-0.8.2 → quantui-0.10.0}/quantui/viz_backend_router.py +0 -0
  121. {quantui-0.8.2 → quantui-0.10.0}/quantui/xyz_input.py +0 -0
  122. {quantui-0.8.2 → quantui-0.10.0}/quantui.egg-info/dependency_links.txt +0 -0
  123. {quantui-0.8.2 → quantui-0.10.0}/quantui.egg-info/entry_points.txt +0 -0
  124. {quantui-0.8.2 → quantui-0.10.0}/quantui.egg-info/top_level.txt +0 -0
  125. {quantui-0.8.2 → quantui-0.10.0}/setup.cfg +0 -0
@@ -7,6 +7,251 @@ 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
+
169
+ ## [0.9.0] - 2026-09-26
170
+
171
+ ### Added
172
+
173
+ - **SLURM job folders with per-attempt subfolders (M-JOBDIRS)** — each cluster
174
+ job gets a readable folder (`<formula>_<calc>_<method>_<basis>`, or the
175
+ optional **Job name** on the Calculate tab) that doubles as the SLURM job
176
+ name. Every run of its `submit.slurm` creates a new `attempt-NN_job<id>/`
177
+ subfolder, so **Resubmit** (new, Cluster Jobs tab) and a hand-run
178
+ `sbatch submit.slurm` never overwrite an earlier attempt. The job root is
179
+ configurable in **System Settings** (or `QUANTUI_STAGING_DIR`), for
180
+ clusters with small home quotas.
181
+ - **SLURM results marked in History** — entries show
182
+ `🖥 SLURM <job id>·a<attempt>` and the result card has a "Ran on" row with
183
+ the job folder. Hand-run attempts are added to History on the next Cluster
184
+ Jobs refresh; failed attempts stay in the job folder only.
185
+ - **GPU offload for geometry optimization** — gpu4pyscf offload now reaches
186
+ every SCF/gradient step of a geometry optimization, not just single points.
187
+ A separate, guarded CuPy GPU path for PyFock, GPU provenance
188
+ (`gpu_used` / `gpu_name`) on optimization results, and
189
+ `quantui gpu check --engine pyfock`.
190
+ - **PyFock backend (M-PYFOCK)** — Phase 1: normalized engine dispatch,
191
+ native-Windows PBE/def2 single points for neutral closed-shell molecules,
192
+ capability-driven calculation menus, engine provenance in logs and saved
193
+ results, a pinned `pyfock` install extra, and a Windows water parity gate
194
+ against PySCF; unsupported hybrids, ions, open-shell systems, solvent,
195
+ checkpoints and orbital analysis are rejected before compute. Phase 2:
196
+ geometry optimization via PyFock's ASE calculator with analytical
197
+ density-fitted gradients; results keep orbital arrays, Mulliken charges,
198
+ dipoles, and engine-native cube generation.
199
+ - **`quantui submit` CLI** — submit request JSON files to SLURM from a script
200
+ (with `--job-name`, `--dry-run`, resource and mail options); resource
201
+ estimates account for parallel IR/Raman workers.
202
+ - **Checkpoint/resume for batch and Frequency runs** — the SLURM batch worker
203
+ resumes Geometry Optimization, PES Scan and Frequency runs from their
204
+ checkpoints; Frequency (interactive and batch) banks each finished
205
+ displacement so a restart skips completed ones.
206
+ - **SCF rescue for hard open-shell cases (M-SCF-ROBUST)** — one shared
207
+ convergence-rescue helper at every SCF call site, with provenance lines in
208
+ the log.
209
+ - **RKS/UKS/RHF/UHF label** on every result card, live and saved.
210
+
211
+ ### Changed
212
+
213
+ - **SLURM output layout** — new submissions use the job-folder layout above
214
+ instead of `~/.quantui/staging/<request_id>/`. Jobs submitted earlier keep
215
+ their old folders and still list, reconnect and ingest.
216
+ - **Unconverged results are no longer reported as converged** — CCSD/CCSD(T)
217
+ amplitudes, TD-DFT roots, frequency Hessians, and optimizer gradients from an
218
+ unconverged SCF are now flagged instead of shown as a clean result. Saved
219
+ cards name the step that failed rather than blaming the SCF.
220
+ - **Parallel IR/Raman worker pools** are sized from the SLURM/cgroup
221
+ allocation, not the node's full CPU count.
222
+
223
+ ### Fixed
224
+
225
+ - **Thermochemistry** — entropy units no longer corrupt the Gibbs free energy;
226
+ thermochemistry is saved and shown again when a frequency result is
227
+ reopened from History.
228
+ - **Raman activities** — added the missing a₀³→ų polarizability conversion.
229
+ - **Functionals** — ωB97X-D resolves to the real functional (not `wb97x`+D3),
230
+ and the D3 dispersion status is shown instead of silently dropped.
231
+ - **ECP systems** — ECPs are passed to parallel IR/Raman workers and embedded
232
+ in exported scripts; charge/spin inference handles ROHF and ECP systems.
233
+ - **Exported scripts** for MP2/CCSD/CCSD(T) now run the requested method
234
+ instead of a DFT branch.
235
+ - **Solvation** — PCM requested for a calc type that cannot use it is
236
+ rejected instead of silently ignored; solvated Geometry Optimization works
237
+ in the SLURM batch worker.
238
+ - **SLURM ingest** keeps computed properties and provenance (dipole, charges,
239
+ SCF variant, solvent, GPU); reconnecting to a finished SLURM job no longer
240
+ saves a second copy of its result to History.
241
+ - **SLURM scripts** quote paths containing spaces, and no longer export an
242
+ unused `QUANTUI_RESULTS_DIR`.
243
+ - **Checkpoints** — PES Scan checkpoint identity is coordinate-aware, and the
244
+ interactive Frequency run uses its own checkpoint.
245
+ - **NMR** fallback-reference metadata is saved and shown.
246
+ - **Parallel IR/Raman workers** honor density fitting and SCF rescue.
247
+ - **Batch results** carry Mulliken charges and dipoles; UHF Molden export is
248
+ complete.
249
+ - **Spectra** — the x-range covers every real mode; exported NPZ files carry
250
+ the fields the cube helper needs, and cube provenance can't be overwritten.
251
+ - **Packaging** — the built wheel ships `quantui.engines`.
252
+ - **Theme** — Plotly axis and zero lines follow the active palette instead of
253
+ staying pale blue-gray on dark themes.
254
+
10
255
  ## [0.8.2] - 2026-08-30
11
256
 
12
257
  ### Added
@@ -848,7 +1093,13 @@ Initial public scaffolding of the QuantUI package: `quantui` package with
848
1093
  `calculator.py`, basic notebook launcher, Apptainer container definition,
849
1094
  MIT license, and project metadata.
850
1095
 
851
- [Unreleased]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.6.1...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
1098
+ [0.9.0]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.8.2...v0.9.0
1099
+ [0.8.2]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.8.1...v0.8.2
1100
+ [0.8.1]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.8.0...v0.8.1
1101
+ [0.8.0]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.7.0...v0.8.0
1102
+ [0.7.0]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.6.1...v0.7.0
852
1103
  [0.6.1]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.6.0...v0.6.1
853
1104
  [0.6.0]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.5.2...v0.6.0
854
1105
  [0.5.2]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.5.1...v0.5.2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: quantui
3
- Version: 0.8.2
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,11 +61,20 @@ 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"
65
+ Provides-Extra: pyfock
66
+ Requires-Dist: pyfock<0.3,>=0.1.7; extra == "pyfock"
67
+ Requires-Dist: ase<4,>=3.22.0; extra == "pyfock"
68
+ Requires-Dist: scipy<2,>=1.10; extra == "pyfock"
69
+ Requires-Dist: numba<0.68,>=0.57; extra == "pyfock"
64
70
  Provides-Extra: ase
65
71
  Requires-Dist: ase<4,>=3.22.0; extra == "ase"
66
72
  Provides-Extra: xtb
67
73
  Requires-Dist: xtb>=22.1; extra == "xtb"
68
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"
69
78
  Provides-Extra: app
70
79
  Requires-Dist: voila<0.6,>=0.5.0; extra == "app"
71
80
  Requires-Dist: ipykernel<8,>=6.0.0; extra == "app"
@@ -77,6 +86,10 @@ Provides-Extra: gpu-cuda13x
77
86
  Requires-Dist: gpu4pyscf-cuda13x; extra == "gpu-cuda13x"
78
87
  Requires-Dist: cupy-cuda13x; extra == "gpu-cuda13x"
79
88
  Requires-Dist: cutensor-cu13; extra == "gpu-cuda13x"
89
+ Provides-Extra: pyfock-gpu-cuda12x
90
+ Requires-Dist: cupy-cuda12x; extra == "pyfock-gpu-cuda12x"
91
+ Provides-Extra: pyfock-gpu-cuda13x
92
+ Requires-Dist: cupy-cuda13x; extra == "pyfock-gpu-cuda13x"
80
93
  Provides-Extra: notebook
81
94
  Requires-Dist: nbmake>=1.4.0; extra == "notebook"
82
95
  Requires-Dist: ipykernel<8,>=6.0.0; extra == "notebook"
@@ -85,6 +98,7 @@ Requires-Dist: pytest>=7.0.0; extra == "dev"
85
98
  Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
86
99
  Requires-Dist: pytest-mock>=3.10.0; extra == "dev"
87
100
  Requires-Dist: pytest-xdist>=3.0.0; extra == "dev"
101
+ Requires-Dist: build>=1.0.0; extra == "dev"
88
102
  Requires-Dist: mypy<2.4,>=1.10; extra == "dev"
89
103
  Requires-Dist: types-requests>=2.28.0; extra == "dev"
90
104
  Requires-Dist: black~=26.5.1; python_version >= "3.10" and extra == "dev"
@@ -102,7 +116,8 @@ Dynamic: license-file
102
116
  [![Python](https://img.shields.io/badge/python-3.9%20|%203.10%20|%203.11-blue)](https://www.python.org)
103
117
 
104
118
  A powerful open-source frontend for DFT and post-HF quantum chemistry.
105
- QuantUI puts [PySCF](https://pyscf.org) behind an interactive Jupyter/Voilà
119
+ QuantUI puts [PySCF](https://pyscf.org) and a guarded
120
+ [PyFock](https://github.com/manassharma07/PyFock) subset behind an interactive Jupyter/Voilà
106
121
  UI so you can build molecules, run calculations locally, and visualize the
107
122
  results — no cluster account, no SLURM, no queueing.
108
123
 
@@ -155,7 +170,11 @@ Real output from QuantUI, straight from the app:
155
170
  ready-to-run coordination complexes**, searchable by name/formula), or run a
156
171
  structure search by name, SMILES, InChI, PubChem CID, InChIKey, or CAS number
157
172
  (PubChem → NCI CACTUS → offline bundled-library fallback; SMILES/InChI resolve
158
- 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
159
178
  - **Offline-first** — runs with no internet: the bundled molecule library and
160
179
  the 3D viewer's JavaScript (3Dmol.js) are vendored, so structure lookup and
161
180
  every 3D view work in an air-gapped classroom. (Network is used only for the
@@ -165,18 +184,30 @@ Real output from QuantUI, straight from the app:
165
184
  router picks the right renderer per task, and a Status-tab toggle persists
166
185
  your default-backend preference between sessions
167
186
  - **In-session calculations** — RHF, UHF, 9 DFT functionals, MP2, CCSD,
168
- CCSD(T), NMR shielding, TD-DFT UV-Vis, and 1D PES scans via PySCF, running
169
- in your Python kernel (no batch submission)
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
190
+ in your Python kernel. Optional PyFock 0.1.x adds native-Windows PBE
191
+ single points and geometry optimizations for neutral, closed-shell molecules
192
+ with def2-SVP/def2-TZVP, including orbital and population analysis;
193
+ engine capabilities automatically gate the setup menus
170
194
  - **Implicit solvent** — PCM solvation (Water, Ethanol, THF, DMSO,
171
- 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
172
198
  - **Rich results** — total energy, HOMO-LUMO gap, Mulliken charges, dipole
173
- moment, thermochemistry (H, S, G at 298 K), IR spectrum chart (stick and
174
- Lorentzian-broadened), ¹H/¹³C NMR chemical shifts, orbital energy-level
175
- diagram, HOMO/LUMO isosurface (cube-file rendering with toggle for HOMO-1,
176
- HOMO, LUMO, LUMO+1), and a side-by-side comparison table for multiple
177
- 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
178
208
  - **Geometry optimization** — BFGS optimizer with step-by-step trajectory
179
209
  animation; vibrational frequency analysis with animated normal modes,
210
+ displacement arrows, an amplitude slider and a table of every mode,
180
211
  user-tunable playback FPS, and a per-result-directory disk cache so mode
181
212
  switches on repeat visits and history replay are instant
182
213
  - **Inorganic / coordination complexes** — first-class support for
@@ -195,14 +226,24 @@ Real output from QuantUI, straight from the app:
195
226
  timestamped directory; a built-in browser lets you reload past results
196
227
  after a kernel restart; the full `pyscf.log` is shown inline
197
228
  - **Structure exports** — download XYZ, MOL/SDF, or PDB files alongside the
198
- 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
199
232
  - **Plot export** — save IR, UV-Vis, PES, and orbital diagrams as standalone
200
233
  HTML
201
234
  - **Optional GPU acceleration** — when [gpu4pyscf](https://github.com/pyscf/gpu4pyscf)
202
- and a CUDA-capable NVIDIA GPU are present, SCF calculations auto-offload
235
+ and a CUDA-capable NVIDIA GPU are present, single-point SCF calculations auto-offload
203
236
  via `mf.to_gpu()` (RHF / UHF / RKS / UKS supported; CCSD(T) stays on CPU).
204
237
  The Status tab + every result card show which compute device was used.
205
238
  Set `QUANTUI_DISABLE_GPU=1` to force CPU even when the GPU is available.
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)
206
247
  - **Timing calibration** — one-click benchmark suite populates the time
207
248
  estimator with real machine data so predictions are accurate from the first run
208
249
  - **Voilà app mode** — serve the notebook as a polished widget-only UI (no
@@ -217,11 +258,29 @@ Real output from QuantUI, straight from the app:
217
258
  | --- | --- | --- |
218
259
  | Linux / macOS | Full | PySCF installs natively |
219
260
  | WSL (Windows) | Full | Use an Ubuntu WSL environment |
220
- | Windows (native) | Partial | All UI and visualization features work; PySCF calculations require the Apptainer container |
261
+ | Windows (native) | Partial | PyFock runs guarded PBE single points and geometry optimizations; use WSL/Apptainer for the full PySCF feature set |
221
262
 
222
- ### Windows users: Apptainer container
263
+ ### Windows users: native PyFock or the full container
223
264
 
224
- PySCF does not install on Windows natively. The
265
+ For native Windows, install the PyFock subset:
266
+
267
+ ```powershell
268
+ py -3.11 -m venv .venv
269
+ .venv\Scripts\Activate.ps1
270
+ python -m pip install "quantui[pyfock,ase,app]"
271
+ ```
272
+
273
+ In **System Settings → Quantum engine**, select PyFock (or leave Automatic
274
+ selected when PySCF is absent). The validated subset supports neutral,
275
+ closed-shell PBE single points and geometry optimizations with def2-SVP or
276
+ def2-TZVP. Density fitting is always enabled, analytical gradients drive
277
+ optimization, and orbital, Mulliken, dipole, and cube analysis are retained.
278
+ Hybrids, charged/open-shell systems, solvent, and checkpoint warm starts remain
279
+ PySCF-only. Optional PyFock GPU acceleration is available separately through
280
+ CuPy; geometry optimization uses numerical forces on GPU because PyFock 0.1.7
281
+ does not yet provide analytical GPU gradients.
282
+
283
+ PySCF does not install on Windows natively. For the complete feature set, the
225
284
  [`apptainer/quantui.def`](https://github.com/The-Schultz-Lab/QuantUI/blob/main/apptainer/quantui.def) container bundles
226
285
  the complete environment and runs anywhere Apptainer/Singularity is available.
227
286
  See [`apptainer/README.md`](https://github.com/The-Schultz-Lab/QuantUI/blob/main/apptainer/README.md) for build and run instructions.
@@ -247,6 +306,12 @@ pip install -e ".[pyscf,ase,app]"
247
306
  python -m pip install quantui[pyscf,ase,app]
248
307
  ```
249
308
 
309
+ For the limited native-Windows engine instead:
310
+
311
+ ```bash
312
+ python -m pip install quantui[pyfock,ase,app]
313
+ ```
314
+
250
315
  ### Option C — Apptainer container (Windows / reproducible deployment)
251
316
 
252
317
  See [apptainer/README.md](https://github.com/The-Schultz-Lab/QuantUI/blob/main/apptainer/README.md).
@@ -307,6 +372,40 @@ and result cards will display the compute device.
307
372
  Whenever gpu4pyscf can't offload a particular call, QuantUI falls back
308
373
  to CPU automatically and the result card reflects which device ran.
309
374
 
375
+ ### Optional: PyFock GPU acceleration
376
+
377
+ PyFock uses its own CuPy/Numba CUDA implementation; it does not use
378
+ `gpu4pyscf`. Install the PyFock engine and the CUDA-suffixed CuPy extra that
379
+ matches the NVIDIA driver reported by `nvidia-smi`:
380
+
381
+ ```bash
382
+ # CUDA 13.x driver
383
+ pip install "quantui[pyfock,pyfock-gpu-cuda13x]"
384
+
385
+ # CUDA 12.x driver
386
+ pip install "quantui[pyfock,pyfock-gpu-cuda12x]"
387
+ ```
388
+
389
+ PyFock GPU use is guarded independently: QuantUI requires CuPy to import and
390
+ report a CUDA device, and still honors the Settings GPU toggle and
391
+ `QUANTUI_DISABLE_GPU=1`. If the probe fails, PyFock falls back to CPU and
392
+ reports the reason. GPU single points use PyFock's GPU SCF/integral/XC path;
393
+ GPU geometry optimizations use numerical finite-difference forces because the
394
+ installed PyFock release's analytical gradient implementation is CPU-only.
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
+
310
409
  ### Optional: GFN-FF metal pre-optimization (xtb)
311
410
 
312
411
  The classical (MMFF/UFF) pre-optimizer relies on RDKit's organic valence
@@ -455,8 +554,13 @@ dashboard. After installation:
455
554
  quantui log tail -n 50 # last 50 events from event_log.jsonl
456
555
  quantui gpu check # is GPU offload available right now?
457
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
458
558
  ```
459
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
+
460
564
  Full reference with all flags and examples: [docs/CLI.md](https://github.com/The-Schultz-Lab/QuantUI/blob/main/docs/CLI.md).
461
565
 
462
566
  ---
@@ -505,11 +609,11 @@ Five step-by-step notebooks in [`notebooks/tutorials/`](https://github.com/The-S
505
609
  | PBE | DFT GGA | Large molecules; metals; when speed matters |
506
610
  | PBE0 | DFT hybrid | Charge-transfer, band gaps |
507
611
  | M06-2X | DFT meta-hybrid | Thermochemistry, barrier heights |
508
- | 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 |
509
613
  | CAM-B3LYP | DFT range-sep. | Charge-transfer UV-Vis, Rydberg states |
510
614
  | M06-L | DFT local meta-GGA | Large molecules; transition metals |
511
615
  | HSE06 | DFT screened hybrid | Band gaps, large molecules |
512
- | PBE-D3 | DFT GGA + dispersion | Van der Waals complexes, stacking |
616
+ | PBE-D3 | DFT GGA + Grimme D3 (zero damping) | Van der Waals complexes, stacking |
513
617
  | MP2 | Post-HF | Accurate energetics for small molecules (O(N⁵)) |
514
618
  | CCSD | Post-HF coupled cluster | High-accuracy small-molecule energies (O(N⁶)) |
515
619
  | CCSD(T) | Post-HF coupled cluster | Benchmark "gold standard" energies (O(N⁷); CPU only) |
@@ -519,11 +623,13 @@ Five step-by-step notebooks in [`notebooks/tutorials/`](https://github.com/The-S
519
623
  | Type | Output |
520
624
  | --- | --- |
521
625
  | Single Point | Energy, HOMO-LUMO gap, Mulliken charges, dipole moment |
522
- | Geometry Opt | Optimised structure, trajectory animation |
523
- | 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) |
524
629
  | UV-Vis (TD-DFT) | Excitation energies, oscillator strengths, UV-Vis spectrum plot |
525
630
  | NMR Shielding | ¹H and ¹³C chemical shifts relative to TMS via GIAO; tabulated by element |
526
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 |
527
633
 
528
634
  ### Basis sets
529
635
 
@@ -572,6 +678,8 @@ quantui/ Main package
572
678
  freq_calc.py Vibrational frequency + thermochemistry
573
679
  ir_plot.py IR spectrum chart (stick / Lorentzian broadened)
574
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
575
683
  nmr_calc.py NMR shielding + ¹H/¹³C chemical shifts
576
684
  pes_scan.py 1D potential energy surface scan
577
685
  optimizer.py QM geometry optimization with trajectory
@@ -592,12 +700,14 @@ quantui/ Main package
592
700
  benchmarks.py Timing calibration benchmark suite
593
701
  config.py Methods, basis sets, solvent/NMR options, presets
594
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
595
705
  preopt.py RDKit MMFF94/UFF force-field pre-optimization
596
706
  data/ Bundled library (SQLite + manifests) + vendored 3Dmol.js
597
707
  notebooks/
598
708
  molecule_computations.ipynb Main user-facing interface (3-cell launcher)
599
709
  tutorials/ Step-by-step guided notebooks (01–05)
600
- 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)
601
711
  apptainer/ Container definition for reproducible deployment
602
712
  local-setup/ Conda environment definition
603
713
  pyproject.toml Package metadata and tool config