quantui 0.8.1__tar.gz → 0.8.2__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 (106) hide show
  1. {quantui-0.8.1 → quantui-0.8.2}/CHANGELOG.md +47 -0
  2. {quantui-0.8.1/quantui.egg-info → quantui-0.8.2}/PKG-INFO +7 -6
  3. {quantui-0.8.1 → quantui-0.8.2}/README.md +4 -4
  4. {quantui-0.8.1 → quantui-0.8.2}/pyproject.toml +4 -3
  5. {quantui-0.8.1 → quantui-0.8.2}/quantui/__init__.py +1 -1
  6. {quantui-0.8.1 → quantui-0.8.2}/quantui/app.py +860 -218
  7. {quantui-0.8.1 → quantui-0.8.2}/quantui/app_analysis.py +47 -15
  8. {quantui-0.8.1 → quantui-0.8.2}/quantui/app_builders.py +478 -118
  9. {quantui-0.8.1 → quantui-0.8.2}/quantui/app_exports.py +40 -10
  10. {quantui-0.8.1 → quantui-0.8.2}/quantui/app_formatters.py +218 -154
  11. {quantui-0.8.1 → quantui-0.8.2}/quantui/app_history.py +13 -2
  12. quantui-0.8.2/quantui/app_launcher.py +375 -0
  13. {quantui-0.8.1 → quantui-0.8.2}/quantui/app_measurement.py +3 -3
  14. quantui-0.8.2/quantui/app_pes_pick.py +134 -0
  15. {quantui-0.8.1 → quantui-0.8.2}/quantui/app_runflow.py +611 -71
  16. quantui-0.8.2/quantui/app_slurm.py +667 -0
  17. {quantui-0.8.1 → quantui-0.8.2}/quantui/app_visualization.py +269 -48
  18. {quantui-0.8.1 → quantui-0.8.2}/quantui/app_xyz_input.py +3 -3
  19. quantui-0.8.2/quantui/backends/__init__.py +37 -0
  20. quantui-0.8.2/quantui/backends/base.py +111 -0
  21. quantui-0.8.2/quantui/backends/cluster_config.py +159 -0
  22. quantui-0.8.2/quantui/backends/cluster_security.py +149 -0
  23. quantui-0.8.2/quantui/backends/dispatch.py +193 -0
  24. quantui-0.8.2/quantui/backends/local.py +46 -0
  25. quantui-0.8.2/quantui/backends/registry.py +206 -0
  26. quantui-0.8.2/quantui/backends/slurm.py +642 -0
  27. quantui-0.8.2/quantui/backends/slurm_errors.py +205 -0
  28. quantui-0.8.2/quantui/backends/slurm_ingest.py +242 -0
  29. quantui-0.8.2/quantui/backends/slurm_utils.py +184 -0
  30. quantui-0.8.2/quantui/backends/worker.py +479 -0
  31. quantui-0.8.2/quantui/backends/worker_payload.py +287 -0
  32. {quantui-0.8.1 → quantui-0.8.2}/quantui/benchmarks.py +1 -0
  33. {quantui-0.8.1 → quantui-0.8.2}/quantui/calc_log.py +122 -19
  34. {quantui-0.8.1 → quantui-0.8.2}/quantui/checkpoint.py +35 -8
  35. {quantui-0.8.1 → quantui-0.8.2}/quantui/cli.py +59 -0
  36. {quantui-0.8.1 → quantui-0.8.2}/quantui/descriptor_cards.py +15 -11
  37. {quantui-0.8.1 → quantui-0.8.2}/quantui/estimator_eval.py +2 -3
  38. {quantui-0.8.1 → quantui-0.8.2}/quantui/freq_calc.py +194 -13
  39. {quantui-0.8.1 → quantui-0.8.2}/quantui/freq_ir_workers.py +50 -20
  40. quantui-0.8.2/quantui/freq_raman_workers.py +103 -0
  41. {quantui-0.8.1 → quantui-0.8.2}/quantui/help_content.py +120 -16
  42. {quantui-0.8.1 → quantui-0.8.2}/quantui/ir_plot.py +2 -1
  43. {quantui-0.8.1 → quantui-0.8.2}/quantui/live_log.py +1 -1
  44. {quantui-0.8.1 → quantui-0.8.2}/quantui/log_utils.py +0 -1
  45. {quantui-0.8.1 → quantui-0.8.2}/quantui/nmr_calc.py +4 -0
  46. {quantui-0.8.1 → quantui-0.8.2}/quantui/orbital_visualization.py +43 -15
  47. {quantui-0.8.1 → quantui-0.8.2}/quantui/pes_scan.py +15 -1
  48. quantui-0.8.2/quantui/pes_scan_ui.py +384 -0
  49. {quantui-0.8.1 → quantui-0.8.2}/quantui/populations_overlay.py +27 -9
  50. {quantui-0.8.1 → quantui-0.8.2}/quantui/progress.py +5 -3
  51. quantui-0.8.2/quantui/raman_calc.py +403 -0
  52. quantui-0.8.2/quantui/raman_plot.py +110 -0
  53. {quantui-0.8.1 → quantui-0.8.2}/quantui/results_storage.py +82 -0
  54. {quantui-0.8.1 → quantui-0.8.2}/quantui/session_calc.py +8 -0
  55. {quantui-0.8.1 → quantui-0.8.2}/quantui/tddft_calc.py +2 -2
  56. quantui-0.8.2/quantui/theme.py +742 -0
  57. {quantui-0.8.1 → quantui-0.8.2}/quantui/user_settings.py +96 -1
  58. {quantui-0.8.1 → quantui-0.8.2}/quantui/visualization_py3dmol.py +103 -30
  59. {quantui-0.8.1 → quantui-0.8.2/quantui.egg-info}/PKG-INFO +7 -6
  60. {quantui-0.8.1 → quantui-0.8.2}/quantui.egg-info/SOURCES.txt +20 -0
  61. {quantui-0.8.1 → quantui-0.8.2}/quantui.egg-info/requires.txt +2 -1
  62. quantui-0.8.1/quantui/theme.py +0 -232
  63. {quantui-0.8.1 → quantui-0.8.2}/LICENSE +0 -0
  64. {quantui-0.8.1 → quantui-0.8.2}/MANIFEST.in +0 -0
  65. {quantui-0.8.1 → quantui-0.8.2}/SECURITY.md +0 -0
  66. {quantui-0.8.1 → quantui-0.8.2}/quantui/analytics.py +0 -0
  67. {quantui-0.8.1 → quantui-0.8.2}/quantui/ase_bridge.py +0 -0
  68. {quantui-0.8.1 → quantui-0.8.2}/quantui/c_stderr.py +0 -0
  69. {quantui-0.8.1 → quantui-0.8.2}/quantui/cactus.py +0 -0
  70. {quantui-0.8.1 → quantui-0.8.2}/quantui/calculator.py +0 -0
  71. {quantui-0.8.1 → quantui-0.8.2}/quantui/cancellation.py +0 -0
  72. {quantui-0.8.1 → quantui-0.8.2}/quantui/comparison.py +0 -0
  73. {quantui-0.8.1 → quantui-0.8.2}/quantui/config.py +0 -0
  74. {quantui-0.8.1 → quantui-0.8.2}/quantui/connectivity.py +0 -0
  75. {quantui-0.8.1 → quantui-0.8.2}/quantui/data/js/3Dmol-min.js +0 -0
  76. {quantui-0.8.1 → quantui-0.8.2}/quantui/data/js/3Dmol-min.js.LICENSE.txt +0 -0
  77. {quantui-0.8.1 → quantui-0.8.2}/quantui/data/library/library.sqlite +0 -0
  78. {quantui-0.8.1 → quantui-0.8.2}/quantui/data/manifests/bulk_qm9.json +0 -0
  79. {quantui-0.8.1 → quantui-0.8.2}/quantui/data/manifests/curated.json +0 -0
  80. {quantui-0.8.1 → quantui-0.8.2}/quantui/data/manifests/inorganic.json +0 -0
  81. {quantui-0.8.1 → quantui-0.8.2}/quantui/data/manifests/presets.json +0 -0
  82. {quantui-0.8.1 → quantui-0.8.2}/quantui/density_fitting.py +0 -0
  83. {quantui-0.8.1 → quantui-0.8.2}/quantui/gpu_offload.py +0 -0
  84. {quantui-0.8.1 → quantui-0.8.2}/quantui/inorganic_guards.py +0 -0
  85. {quantui-0.8.1 → quantui-0.8.2}/quantui/issue_tracker.py +0 -0
  86. {quantui-0.8.1 → quantui-0.8.2}/quantui/measurement.py +0 -0
  87. {quantui-0.8.1 → quantui-0.8.2}/quantui/molecule.py +0 -0
  88. {quantui-0.8.1 → quantui-0.8.2}/quantui/molecule_library.py +0 -0
  89. {quantui-0.8.1 → quantui-0.8.2}/quantui/mulliken_plot.py +0 -0
  90. {quantui-0.8.1 → quantui-0.8.2}/quantui/nmr_plot.py +0 -0
  91. {quantui-0.8.1 → quantui-0.8.2}/quantui/optimizer.py +0 -0
  92. {quantui-0.8.1 → quantui-0.8.2}/quantui/preopt.py +0 -0
  93. {quantui-0.8.1 → quantui-0.8.2}/quantui/pubchem.py +0 -0
  94. {quantui-0.8.1 → quantui-0.8.2}/quantui/reorganization_energy.py +0 -0
  95. {quantui-0.8.1 → quantui-0.8.2}/quantui/security.py +0 -0
  96. {quantui-0.8.1 → quantui-0.8.2}/quantui/spin_presets.py +0 -0
  97. {quantui-0.8.1 → quantui-0.8.2}/quantui/structure_providers.py +0 -0
  98. {quantui-0.8.1 → quantui-0.8.2}/quantui/utils.py +0 -0
  99. {quantui-0.8.1 → quantui-0.8.2}/quantui/vib_cache.py +0 -0
  100. {quantui-0.8.1 → quantui-0.8.2}/quantui/viz_assets.py +0 -0
  101. {quantui-0.8.1 → quantui-0.8.2}/quantui/viz_backend_router.py +0 -0
  102. {quantui-0.8.1 → quantui-0.8.2}/quantui/xyz_input.py +0 -0
  103. {quantui-0.8.1 → quantui-0.8.2}/quantui.egg-info/dependency_links.txt +0 -0
  104. {quantui-0.8.1 → quantui-0.8.2}/quantui.egg-info/entry_points.txt +0 -0
  105. {quantui-0.8.1 → quantui-0.8.2}/quantui.egg-info/top_level.txt +0 -0
  106. {quantui-0.8.1 → quantui-0.8.2}/setup.cfg +0 -0
@@ -7,6 +7,53 @@ and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.ht
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.8.2] - 2026-08-30
11
+
12
+ ### Added
13
+
14
+ - **SLURM batch execution (M-CLUSTER2)** — optional cluster backend when
15
+ `QUANTUI_ENABLE_SLURM=1` and `sbatch` is on PATH: submit from the same UI,
16
+ monitor on the **Cluster Jobs** tab, hybrid `squeue`/`sacct` polling, submit
17
+ cooldown, and stale-registry cleanup. All Calculate-tab calc types supported
18
+ on the batch worker path.
19
+ - **`QUANTUI_ENABLE_SLURM` site gate** — SLURM batch stays hidden and
20
+ undispatchable until an operator sets this environment variable. Student CPU
21
+ images and JupyterHub profiles can omit it (default off); instructors enable
22
+ cluster testing with `QUANTUI_ENABLE_SLURM=1` without any extra student
23
+ command.
24
+ - **`quantui setup` and `quantui run app`** — writes `~/QuantUI.ipynb` for
25
+ NCShare/JupyterLab (Render with Voilà). `run app` detects Apptainer +
26
+ Jupyter and exits with Voilà instructions instead of opening an unreachable
27
+ second port.
28
+ - **Parallel IR intensity displacements (CPU)** — Settings checkbox
29
+ (`compute.freq_parallel`) plus `QUANTUI_FREQ_PARALLEL` env override fans out
30
+ the 6N finite-difference SCF loop on hosts with ≥4 cores and ≥2 atoms. The
31
+ **CPU teaching SIF** sets `QUANTUI_FREQ_PARALLEL=1` by default; the checkbox
32
+ reflects the deployment value and locks while the env var is set.
33
+ - **Imaginary-mode perturbation** for Frequency reruns seeded from History.
34
+ - **Stage-aware frequency cost estimate** and per-phase run status labels (NMR,
35
+ Hessian, post-HF).
36
+ - **Preset theme palettes** replacing the invert filter (M-THEME THEME.6).
37
+ - **Quantum engine registry** (`quantui/engines/`) and
38
+ `ComputeSettings.quantum_engine` field (M-PYFOCK PYF.1 groundwork).
39
+ - **Static Raman spectrum** on the Analysis tab (M-SPECTRA2).
40
+
41
+ ### Fixed
42
+
43
+ - **Mulliken 3D viewer** could render blank after geometry persistence and lazy
44
+ panel activation (#103).
45
+ - **`apptainer/quantui-gpu.def` never installed the `xtb` extra**, so GFN-FF
46
+ metal-capable classical pre-optimization (DEC-018) was unavailable in every
47
+ GPU/HPC image — the app correctly reported the honest-failure message
48
+ ("RDKit could not perceive bonds ... and the GFN-FF (xtb) metal backend is
49
+ not installed"), but the underlying cause was a container gap, not a
50
+ missing local install. Fixed by pinning the image's Python to 3.11 via the
51
+ deadsnakes PPA (Ubuntu 24.04's own repos ship 3.12 only, and `xtb`'s PyPI
52
+ wheels stop at `cp311`) and adding `xtb` to the pip extras. `quantui.def`
53
+ (the CPU teaching image) gained the equivalent `xtb-python` conda-forge
54
+ package, which it had also been missing despite `local-setup/environment.yml`
55
+ already carrying it for local conda installs.
56
+
10
57
  ## [0.8.1] - 2026-08-26
11
58
 
12
59
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: quantui
3
- Version: 0.8.1
3
+ Version: 0.8.2
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
@@ -55,8 +55,9 @@ Requires-Dist: numpy<3,>=1.24.0
55
55
  Requires-Dist: requests<3,>=2.28.0
56
56
  Requires-Dist: py3Dmol<3,>=2.0.0
57
57
  Requires-Dist: matplotlib<4,>=3.7.0
58
- Requires-Dist: plotly<7,>=5.0.0
58
+ Requires-Dist: plotly<8,>=5.0.0
59
59
  Requires-Dist: plotlymol<1,>=0.2.1
60
+ Requires-Dist: kaleido<2,>=0.2.1
60
61
  Provides-Extra: pyscf
61
62
  Requires-Dist: pyscf<3,>=2.13.0; extra == "pyscf"
62
63
  Requires-Dist: pyscf-properties; extra == "pyscf"
@@ -119,24 +120,24 @@ Real output from QuantUI, straight from the app:
119
120
  <table>
120
121
  <tr>
121
122
  <td width="50%" align="center" valign="top">
122
- <img src="docs/images/cisplatin_lumo.png" alt="Cisplatin LUMO isosurface" width="400"><br>
123
+ <img src="https://raw.githubusercontent.com/The-Schultz-Lab/QuantUI/main/docs/images/cisplatin_lumo.png" alt="Cisplatin LUMO isosurface" width="400"><br>
123
124
  <b>Cisplatin LUMO</b><br>
124
125
  <sub>Molecular-orbital isosurface · B3LYP/LANL2DZ (ECP on Pt &amp; Cl)</sub>
125
126
  </td>
126
127
  <td width="50%" align="center" valign="top">
127
- <img src="docs/images/aspartame_orbital_diagram.png" alt="Aspartame orbital energy-level diagram" width="300"><br>
128
+ <img src="https://raw.githubusercontent.com/The-Schultz-Lab/QuantUI/main/docs/images/aspartame_orbital_diagram.png" alt="Aspartame orbital energy-level diagram" width="300"><br>
128
129
  <b>Aspartame orbital energies</b><br>
129
130
  <sub>Occupied/virtual levels · HOMO–LUMO gap 6.09 eV · B3LYP/6-31G*</sub>
130
131
  </td>
131
132
  </tr>
132
133
  <tr>
133
134
  <td width="50%" align="center" valign="top">
134
- <img src="docs/images/benzene_ir_spectrum.png" alt="Benzene IR spectrum" width="400"><br>
135
+ <img src="https://raw.githubusercontent.com/The-Schultz-Lab/QuantUI/main/docs/images/benzene_ir_spectrum.png" alt="Benzene IR spectrum" width="400"><br>
135
136
  <b>Benzene IR spectrum</b><br>
136
137
  <sub>Analytical Hessian · ωB97X-D/6-31G · the four IR-active bands</sub>
137
138
  </td>
138
139
  <td width="50%" align="center" valign="top">
139
- <img src="docs/images/cisplatin_optimization.png" alt="Cisplatin geometry-optimization energy convergence" width="400"><br>
140
+ <img src="https://raw.githubusercontent.com/The-Schultz-Lab/QuantUI/main/docs/images/cisplatin_optimization.png" alt="Cisplatin geometry-optimization energy convergence" width="400"><br>
140
141
  <b>Geometry optimization</b><br>
141
142
  <sub>Cisplatin relaxing over 21 BFGS steps · B3LYP/LANL2DZ</sub>
142
143
  </td>
@@ -25,24 +25,24 @@ Real output from QuantUI, straight from the app:
25
25
  <table>
26
26
  <tr>
27
27
  <td width="50%" align="center" valign="top">
28
- <img src="docs/images/cisplatin_lumo.png" alt="Cisplatin LUMO isosurface" width="400"><br>
28
+ <img src="https://raw.githubusercontent.com/The-Schultz-Lab/QuantUI/main/docs/images/cisplatin_lumo.png" alt="Cisplatin LUMO isosurface" width="400"><br>
29
29
  <b>Cisplatin LUMO</b><br>
30
30
  <sub>Molecular-orbital isosurface · B3LYP/LANL2DZ (ECP on Pt &amp; Cl)</sub>
31
31
  </td>
32
32
  <td width="50%" align="center" valign="top">
33
- <img src="docs/images/aspartame_orbital_diagram.png" alt="Aspartame orbital energy-level diagram" width="300"><br>
33
+ <img src="https://raw.githubusercontent.com/The-Schultz-Lab/QuantUI/main/docs/images/aspartame_orbital_diagram.png" alt="Aspartame orbital energy-level diagram" width="300"><br>
34
34
  <b>Aspartame orbital energies</b><br>
35
35
  <sub>Occupied/virtual levels · HOMO–LUMO gap 6.09 eV · B3LYP/6-31G*</sub>
36
36
  </td>
37
37
  </tr>
38
38
  <tr>
39
39
  <td width="50%" align="center" valign="top">
40
- <img src="docs/images/benzene_ir_spectrum.png" alt="Benzene IR spectrum" width="400"><br>
40
+ <img src="https://raw.githubusercontent.com/The-Schultz-Lab/QuantUI/main/docs/images/benzene_ir_spectrum.png" alt="Benzene IR spectrum" width="400"><br>
41
41
  <b>Benzene IR spectrum</b><br>
42
42
  <sub>Analytical Hessian · ωB97X-D/6-31G · the four IR-active bands</sub>
43
43
  </td>
44
44
  <td width="50%" align="center" valign="top">
45
- <img src="docs/images/cisplatin_optimization.png" alt="Cisplatin geometry-optimization energy convergence" width="400"><br>
45
+ <img src="https://raw.githubusercontent.com/The-Schultz-Lab/QuantUI/main/docs/images/cisplatin_optimization.png" alt="Cisplatin geometry-optimization energy convergence" width="400"><br>
46
46
  <b>Geometry optimization</b><br>
47
47
  <sub>Cisplatin relaxing over 21 BFGS steps · B3LYP/LANL2DZ</sub>
48
48
  </td>
@@ -8,7 +8,7 @@ build-backend = "setuptools.build_meta"
8
8
 
9
9
  [project]
10
10
  name = "quantui"
11
- version = "0.8.1"
11
+ version = "0.8.2"
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"
@@ -62,8 +62,9 @@ dependencies = [
62
62
  "requests>=2.28.0,<3",
63
63
  "py3Dmol>=2.0.0,<3",
64
64
  "matplotlib>=3.7.0,<4",
65
- "plotly>=5.0.0,<7",
65
+ "plotly>=5.0.0,<8",
66
66
  "plotlymol>=0.2.1,<1",
67
+ "kaleido>=0.2.1,<2",
67
68
  ]
68
69
 
69
70
  [project.urls]
@@ -82,7 +83,7 @@ Issues = "https://github.com/The-Schultz-Lab/QuantUI/issues"
82
83
  quantui = "quantui.cli:main"
83
84
 
84
85
  [tool.setuptools]
85
- packages = ["quantui"]
86
+ packages = ["quantui", "quantui.backends"]
86
87
 
87
88
  [tool.setuptools.package-data]
88
89
  # Bundled molecule library (M-STRUCT): the indexed SQLite store + the
@@ -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.8.1"
10
+ __version__ = "0.8.2"
11
11
 
12
12
  import logging
13
13
  from typing import Any