quantui 0.8.2__tar.gz → 0.9.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 (113) hide show
  1. {quantui-0.8.2 → quantui-0.9.0}/CHANGELOG.md +92 -1
  2. {quantui-0.8.2/quantui.egg-info → quantui-0.9.0}/PKG-INFO +68 -7
  3. {quantui-0.8.2 → quantui-0.9.0}/README.md +57 -6
  4. {quantui-0.8.2 → quantui-0.9.0}/pyproject.toml +52 -5
  5. {quantui-0.8.2 → quantui-0.9.0}/quantui/__init__.py +1 -1
  6. {quantui-0.8.2 → quantui-0.9.0}/quantui/app.py +316 -36
  7. {quantui-0.8.2 → quantui-0.9.0}/quantui/app_analysis.py +2 -0
  8. {quantui-0.8.2 → quantui-0.9.0}/quantui/app_builders.py +128 -7
  9. {quantui-0.8.2 → quantui-0.9.0}/quantui/app_formatters.py +216 -19
  10. {quantui-0.8.2 → quantui-0.9.0}/quantui/app_runflow.py +82 -3
  11. {quantui-0.8.2 → quantui-0.9.0}/quantui/app_slurm.py +154 -13
  12. {quantui-0.8.2 → quantui-0.9.0}/quantui/app_visualization.py +39 -10
  13. {quantui-0.8.2 → quantui-0.9.0}/quantui/backends/cluster_config.py +60 -6
  14. {quantui-0.8.2 → quantui-0.9.0}/quantui/backends/registry.py +140 -4
  15. {quantui-0.8.2 → quantui-0.9.0}/quantui/backends/slurm.py +99 -29
  16. {quantui-0.8.2 → quantui-0.9.0}/quantui/backends/slurm_ingest.py +153 -12
  17. {quantui-0.8.2 → quantui-0.9.0}/quantui/backends/slurm_utils.py +81 -1
  18. quantui-0.9.0/quantui/backends/worker.py +866 -0
  19. {quantui-0.8.2 → quantui-0.9.0}/quantui/backends/worker_payload.py +86 -1
  20. {quantui-0.8.2 → quantui-0.9.0}/quantui/calculator.py +29 -0
  21. {quantui-0.8.2 → quantui-0.9.0}/quantui/checkpoint.py +161 -1
  22. {quantui-0.8.2 → quantui-0.9.0}/quantui/cli.py +267 -16
  23. {quantui-0.8.2 → quantui-0.9.0}/quantui/config.py +139 -17
  24. quantui-0.9.0/quantui/engines/__init__.py +150 -0
  25. quantui-0.9.0/quantui/engines/base.py +193 -0
  26. quantui-0.9.0/quantui/engines/pyfock_engine.py +402 -0
  27. quantui-0.9.0/quantui/engines/pyscf_engine.py +163 -0
  28. {quantui-0.8.2 → quantui-0.9.0}/quantui/freq_calc.py +245 -66
  29. quantui-0.9.0/quantui/freq_displacement_ids.py +79 -0
  30. {quantui-0.8.2 → quantui-0.9.0}/quantui/freq_ir_workers.py +119 -3
  31. {quantui-0.8.2 → quantui-0.9.0}/quantui/freq_raman_workers.py +52 -5
  32. {quantui-0.8.2 → quantui-0.9.0}/quantui/help_content.py +21 -3
  33. {quantui-0.8.2 → quantui-0.9.0}/quantui/ir_plot.py +59 -8
  34. {quantui-0.8.2 → quantui-0.9.0}/quantui/log_utils.py +9 -4
  35. {quantui-0.8.2 → quantui-0.9.0}/quantui/nmr_calc.py +18 -2
  36. {quantui-0.8.2 → quantui-0.9.0}/quantui/optimizer.py +187 -25
  37. {quantui-0.8.2 → quantui-0.9.0}/quantui/orbital_visualization.py +141 -14
  38. {quantui-0.8.2 → quantui-0.9.0}/quantui/pes_scan.py +66 -2
  39. quantui-0.9.0/quantui/pyfock_gpu.py +118 -0
  40. {quantui-0.8.2 → quantui-0.9.0}/quantui/raman_calc.py +108 -29
  41. {quantui-0.8.2 → quantui-0.9.0}/quantui/raman_plot.py +16 -5
  42. {quantui-0.8.2 → quantui-0.9.0}/quantui/reorganization_energy.py +28 -0
  43. {quantui-0.8.2 → quantui-0.9.0}/quantui/results_storage.py +95 -5
  44. quantui-0.9.0/quantui/scf_robust.py +167 -0
  45. {quantui-0.8.2 → quantui-0.9.0}/quantui/session_calc.py +224 -59
  46. {quantui-0.8.2 → quantui-0.9.0}/quantui/tddft_calc.py +109 -11
  47. {quantui-0.8.2 → quantui-0.9.0}/quantui/theme.py +4 -0
  48. {quantui-0.8.2 → quantui-0.9.0}/quantui/user_settings.py +16 -0
  49. {quantui-0.8.2 → quantui-0.9.0/quantui.egg-info}/PKG-INFO +68 -7
  50. {quantui-0.8.2 → quantui-0.9.0}/quantui.egg-info/SOURCES.txt +8 -1
  51. {quantui-0.8.2 → quantui-0.9.0}/quantui.egg-info/requires.txt +13 -0
  52. quantui-0.8.2/quantui/backends/worker.py +0 -479
  53. {quantui-0.8.2 → quantui-0.9.0}/LICENSE +0 -0
  54. {quantui-0.8.2 → quantui-0.9.0}/MANIFEST.in +0 -0
  55. {quantui-0.8.2 → quantui-0.9.0}/SECURITY.md +0 -0
  56. {quantui-0.8.2 → quantui-0.9.0}/quantui/analytics.py +0 -0
  57. {quantui-0.8.2 → quantui-0.9.0}/quantui/app_exports.py +0 -0
  58. {quantui-0.8.2 → quantui-0.9.0}/quantui/app_history.py +0 -0
  59. {quantui-0.8.2 → quantui-0.9.0}/quantui/app_launcher.py +0 -0
  60. {quantui-0.8.2 → quantui-0.9.0}/quantui/app_measurement.py +0 -0
  61. {quantui-0.8.2 → quantui-0.9.0}/quantui/app_pes_pick.py +0 -0
  62. {quantui-0.8.2 → quantui-0.9.0}/quantui/app_xyz_input.py +0 -0
  63. {quantui-0.8.2 → quantui-0.9.0}/quantui/ase_bridge.py +0 -0
  64. {quantui-0.8.2 → quantui-0.9.0}/quantui/backends/__init__.py +0 -0
  65. {quantui-0.8.2 → quantui-0.9.0}/quantui/backends/base.py +0 -0
  66. {quantui-0.8.2 → quantui-0.9.0}/quantui/backends/cluster_security.py +0 -0
  67. {quantui-0.8.2 → quantui-0.9.0}/quantui/backends/dispatch.py +0 -0
  68. {quantui-0.8.2 → quantui-0.9.0}/quantui/backends/local.py +0 -0
  69. {quantui-0.8.2 → quantui-0.9.0}/quantui/backends/slurm_errors.py +0 -0
  70. {quantui-0.8.2 → quantui-0.9.0}/quantui/benchmarks.py +0 -0
  71. {quantui-0.8.2 → quantui-0.9.0}/quantui/c_stderr.py +0 -0
  72. {quantui-0.8.2 → quantui-0.9.0}/quantui/cactus.py +0 -0
  73. {quantui-0.8.2 → quantui-0.9.0}/quantui/calc_log.py +0 -0
  74. {quantui-0.8.2 → quantui-0.9.0}/quantui/cancellation.py +0 -0
  75. {quantui-0.8.2 → quantui-0.9.0}/quantui/comparison.py +0 -0
  76. {quantui-0.8.2 → quantui-0.9.0}/quantui/connectivity.py +0 -0
  77. {quantui-0.8.2 → quantui-0.9.0}/quantui/data/js/3Dmol-min.js +0 -0
  78. {quantui-0.8.2 → quantui-0.9.0}/quantui/data/js/3Dmol-min.js.LICENSE.txt +0 -0
  79. {quantui-0.8.2 → quantui-0.9.0}/quantui/data/library/library.sqlite +0 -0
  80. {quantui-0.8.2 → quantui-0.9.0}/quantui/data/manifests/bulk_qm9.json +0 -0
  81. {quantui-0.8.2 → quantui-0.9.0}/quantui/data/manifests/curated.json +0 -0
  82. {quantui-0.8.2 → quantui-0.9.0}/quantui/data/manifests/inorganic.json +0 -0
  83. {quantui-0.8.2 → quantui-0.9.0}/quantui/data/manifests/presets.json +0 -0
  84. {quantui-0.8.2 → quantui-0.9.0}/quantui/density_fitting.py +0 -0
  85. {quantui-0.8.2 → quantui-0.9.0}/quantui/descriptor_cards.py +0 -0
  86. {quantui-0.8.2 → quantui-0.9.0}/quantui/estimator_eval.py +0 -0
  87. {quantui-0.8.2 → quantui-0.9.0}/quantui/gpu_offload.py +0 -0
  88. {quantui-0.8.2 → quantui-0.9.0}/quantui/inorganic_guards.py +0 -0
  89. {quantui-0.8.2 → quantui-0.9.0}/quantui/issue_tracker.py +0 -0
  90. {quantui-0.8.2 → quantui-0.9.0}/quantui/live_log.py +0 -0
  91. {quantui-0.8.2 → quantui-0.9.0}/quantui/measurement.py +0 -0
  92. {quantui-0.8.2 → quantui-0.9.0}/quantui/molecule.py +0 -0
  93. {quantui-0.8.2 → quantui-0.9.0}/quantui/molecule_library.py +0 -0
  94. {quantui-0.8.2 → quantui-0.9.0}/quantui/mulliken_plot.py +0 -0
  95. {quantui-0.8.2 → quantui-0.9.0}/quantui/nmr_plot.py +0 -0
  96. {quantui-0.8.2 → quantui-0.9.0}/quantui/pes_scan_ui.py +0 -0
  97. {quantui-0.8.2 → quantui-0.9.0}/quantui/populations_overlay.py +0 -0
  98. {quantui-0.8.2 → quantui-0.9.0}/quantui/preopt.py +0 -0
  99. {quantui-0.8.2 → quantui-0.9.0}/quantui/progress.py +0 -0
  100. {quantui-0.8.2 → quantui-0.9.0}/quantui/pubchem.py +0 -0
  101. {quantui-0.8.2 → quantui-0.9.0}/quantui/security.py +0 -0
  102. {quantui-0.8.2 → quantui-0.9.0}/quantui/spin_presets.py +0 -0
  103. {quantui-0.8.2 → quantui-0.9.0}/quantui/structure_providers.py +0 -0
  104. {quantui-0.8.2 → quantui-0.9.0}/quantui/utils.py +0 -0
  105. {quantui-0.8.2 → quantui-0.9.0}/quantui/vib_cache.py +0 -0
  106. {quantui-0.8.2 → quantui-0.9.0}/quantui/visualization_py3dmol.py +0 -0
  107. {quantui-0.8.2 → quantui-0.9.0}/quantui/viz_assets.py +0 -0
  108. {quantui-0.8.2 → quantui-0.9.0}/quantui/viz_backend_router.py +0 -0
  109. {quantui-0.8.2 → quantui-0.9.0}/quantui/xyz_input.py +0 -0
  110. {quantui-0.8.2 → quantui-0.9.0}/quantui.egg-info/dependency_links.txt +0 -0
  111. {quantui-0.8.2 → quantui-0.9.0}/quantui.egg-info/entry_points.txt +0 -0
  112. {quantui-0.8.2 → quantui-0.9.0}/quantui.egg-info/top_level.txt +0 -0
  113. {quantui-0.8.2 → quantui-0.9.0}/setup.cfg +0 -0
@@ -7,6 +7,92 @@ and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.ht
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.9.0] - 2026-09-26
11
+
12
+ ### Added
13
+
14
+ - **SLURM job folders with per-attempt subfolders (M-JOBDIRS)** — each cluster
15
+ job gets a readable folder (`<formula>_<calc>_<method>_<basis>`, or the
16
+ optional **Job name** on the Calculate tab) that doubles as the SLURM job
17
+ name. Every run of its `submit.slurm` creates a new `attempt-NN_job<id>/`
18
+ subfolder, so **Resubmit** (new, Cluster Jobs tab) and a hand-run
19
+ `sbatch submit.slurm` never overwrite an earlier attempt. The job root is
20
+ configurable in **System Settings** (or `QUANTUI_STAGING_DIR`), for
21
+ clusters with small home quotas.
22
+ - **SLURM results marked in History** — entries show
23
+ `🖥 SLURM <job id>·a<attempt>` and the result card has a "Ran on" row with
24
+ the job folder. Hand-run attempts are added to History on the next Cluster
25
+ Jobs refresh; failed attempts stay in the job folder only.
26
+ - **GPU offload for geometry optimization** — gpu4pyscf offload now reaches
27
+ every SCF/gradient step of a geometry optimization, not just single points.
28
+ A separate, guarded CuPy GPU path for PyFock, GPU provenance
29
+ (`gpu_used` / `gpu_name`) on optimization results, and
30
+ `quantui gpu check --engine pyfock`.
31
+ - **PyFock backend (M-PYFOCK)** — Phase 1: normalized engine dispatch,
32
+ native-Windows PBE/def2 single points for neutral closed-shell molecules,
33
+ capability-driven calculation menus, engine provenance in logs and saved
34
+ results, a pinned `pyfock` install extra, and a Windows water parity gate
35
+ against PySCF; unsupported hybrids, ions, open-shell systems, solvent,
36
+ checkpoints and orbital analysis are rejected before compute. Phase 2:
37
+ geometry optimization via PyFock's ASE calculator with analytical
38
+ density-fitted gradients; results keep orbital arrays, Mulliken charges,
39
+ dipoles, and engine-native cube generation.
40
+ - **`quantui submit` CLI** — submit request JSON files to SLURM from a script
41
+ (with `--job-name`, `--dry-run`, resource and mail options); resource
42
+ estimates account for parallel IR/Raman workers.
43
+ - **Checkpoint/resume for batch and Frequency runs** — the SLURM batch worker
44
+ resumes Geometry Optimization, PES Scan and Frequency runs from their
45
+ checkpoints; Frequency (interactive and batch) banks each finished
46
+ displacement so a restart skips completed ones.
47
+ - **SCF rescue for hard open-shell cases (M-SCF-ROBUST)** — one shared
48
+ convergence-rescue helper at every SCF call site, with provenance lines in
49
+ the log.
50
+ - **RKS/UKS/RHF/UHF label** on every result card, live and saved.
51
+
52
+ ### Changed
53
+
54
+ - **SLURM output layout** — new submissions use the job-folder layout above
55
+ instead of `~/.quantui/staging/<request_id>/`. Jobs submitted earlier keep
56
+ their old folders and still list, reconnect and ingest.
57
+ - **Unconverged results are no longer reported as converged** — CCSD/CCSD(T)
58
+ amplitudes, TD-DFT roots, frequency Hessians, and optimizer gradients from an
59
+ unconverged SCF are now flagged instead of shown as a clean result. Saved
60
+ cards name the step that failed rather than blaming the SCF.
61
+ - **Parallel IR/Raman worker pools** are sized from the SLURM/cgroup
62
+ allocation, not the node's full CPU count.
63
+
64
+ ### Fixed
65
+
66
+ - **Thermochemistry** — entropy units no longer corrupt the Gibbs free energy;
67
+ thermochemistry is saved and shown again when a frequency result is
68
+ reopened from History.
69
+ - **Raman activities** — added the missing a₀³→ų polarizability conversion.
70
+ - **Functionals** — ωB97X-D resolves to the real functional (not `wb97x`+D3),
71
+ and the D3 dispersion status is shown instead of silently dropped.
72
+ - **ECP systems** — ECPs are passed to parallel IR/Raman workers and embedded
73
+ in exported scripts; charge/spin inference handles ROHF and ECP systems.
74
+ - **Exported scripts** for MP2/CCSD/CCSD(T) now run the requested method
75
+ instead of a DFT branch.
76
+ - **Solvation** — PCM requested for a calc type that cannot use it is
77
+ rejected instead of silently ignored; solvated Geometry Optimization works
78
+ in the SLURM batch worker.
79
+ - **SLURM ingest** keeps computed properties and provenance (dipole, charges,
80
+ SCF variant, solvent, GPU); reconnecting to a finished SLURM job no longer
81
+ saves a second copy of its result to History.
82
+ - **SLURM scripts** quote paths containing spaces, and no longer export an
83
+ unused `QUANTUI_RESULTS_DIR`.
84
+ - **Checkpoints** — PES Scan checkpoint identity is coordinate-aware, and the
85
+ interactive Frequency run uses its own checkpoint.
86
+ - **NMR** fallback-reference metadata is saved and shown.
87
+ - **Parallel IR/Raman workers** honor density fitting and SCF rescue.
88
+ - **Batch results** carry Mulliken charges and dipoles; UHF Molden export is
89
+ complete.
90
+ - **Spectra** — the x-range covers every real mode; exported NPZ files carry
91
+ the fields the cube helper needs, and cube provenance can't be overwritten.
92
+ - **Packaging** — the built wheel ships `quantui.engines`.
93
+ - **Theme** — Plotly axis and zero lines follow the active palette instead of
94
+ staying pale blue-gray on dark themes.
95
+
10
96
  ## [0.8.2] - 2026-08-30
11
97
 
12
98
  ### Added
@@ -848,7 +934,12 @@ Initial public scaffolding of the QuantUI package: `quantui` package with
848
934
  `calculator.py`, basic notebook launcher, Apptainer container definition,
849
935
  MIT license, and project metadata.
850
936
 
851
- [Unreleased]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.6.1...HEAD
937
+ [Unreleased]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.9.0...HEAD
938
+ [0.9.0]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.8.2...v0.9.0
939
+ [0.8.2]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.8.1...v0.8.2
940
+ [0.8.1]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.8.0...v0.8.1
941
+ [0.8.0]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.7.0...v0.8.0
942
+ [0.7.0]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.6.1...v0.7.0
852
943
  [0.6.1]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.6.0...v0.6.1
853
944
  [0.6.0]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.5.2...v0.6.0
854
945
  [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.9.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,11 @@ 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
+ Provides-Extra: pyfock
65
+ Requires-Dist: pyfock<0.3,>=0.1.7; extra == "pyfock"
66
+ Requires-Dist: ase<4,>=3.22.0; extra == "pyfock"
67
+ Requires-Dist: scipy<2,>=1.10; extra == "pyfock"
68
+ Requires-Dist: numba<0.68,>=0.57; extra == "pyfock"
64
69
  Provides-Extra: ase
65
70
  Requires-Dist: ase<4,>=3.22.0; extra == "ase"
66
71
  Provides-Extra: xtb
@@ -77,6 +82,10 @@ Provides-Extra: gpu-cuda13x
77
82
  Requires-Dist: gpu4pyscf-cuda13x; extra == "gpu-cuda13x"
78
83
  Requires-Dist: cupy-cuda13x; extra == "gpu-cuda13x"
79
84
  Requires-Dist: cutensor-cu13; extra == "gpu-cuda13x"
85
+ Provides-Extra: pyfock-gpu-cuda12x
86
+ Requires-Dist: cupy-cuda12x; extra == "pyfock-gpu-cuda12x"
87
+ Provides-Extra: pyfock-gpu-cuda13x
88
+ Requires-Dist: cupy-cuda13x; extra == "pyfock-gpu-cuda13x"
80
89
  Provides-Extra: notebook
81
90
  Requires-Dist: nbmake>=1.4.0; extra == "notebook"
82
91
  Requires-Dist: ipykernel<8,>=6.0.0; extra == "notebook"
@@ -85,6 +94,7 @@ Requires-Dist: pytest>=7.0.0; extra == "dev"
85
94
  Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
86
95
  Requires-Dist: pytest-mock>=3.10.0; extra == "dev"
87
96
  Requires-Dist: pytest-xdist>=3.0.0; extra == "dev"
97
+ Requires-Dist: build>=1.0.0; extra == "dev"
88
98
  Requires-Dist: mypy<2.4,>=1.10; extra == "dev"
89
99
  Requires-Dist: types-requests>=2.28.0; extra == "dev"
90
100
  Requires-Dist: black~=26.5.1; python_version >= "3.10" and extra == "dev"
@@ -102,7 +112,8 @@ Dynamic: license-file
102
112
  [![Python](https://img.shields.io/badge/python-3.9%20|%203.10%20|%203.11-blue)](https://www.python.org)
103
113
 
104
114
  A powerful open-source frontend for DFT and post-HF quantum chemistry.
105
- QuantUI puts [PySCF](https://pyscf.org) behind an interactive Jupyter/Voilà
115
+ QuantUI puts [PySCF](https://pyscf.org) and a guarded
116
+ [PyFock](https://github.com/manassharma07/PyFock) subset behind an interactive Jupyter/Voilà
106
117
  UI so you can build molecules, run calculations locally, and visualize the
107
118
  results — no cluster account, no SLURM, no queueing.
108
119
 
@@ -166,7 +177,10 @@ Real output from QuantUI, straight from the app:
166
177
  your default-backend preference between sessions
167
178
  - **In-session calculations** — RHF, UHF, 9 DFT functionals, MP2, CCSD,
168
179
  CCSD(T), NMR shielding, TD-DFT UV-Vis, and 1D PES scans via PySCF, running
169
- in your Python kernel (no batch submission)
180
+ in your Python kernel. Optional PyFock 0.1.x adds native-Windows PBE
181
+ single points and geometry optimizations for neutral, closed-shell molecules
182
+ with def2-SVP/def2-TZVP, including orbital and population analysis;
183
+ engine capabilities automatically gate the setup menus
170
184
  - **Implicit solvent** — PCM solvation (Water, Ethanol, THF, DMSO,
171
185
  Acetonitrile) via a single checkbox
172
186
  - **Rich results** — total energy, HOMO-LUMO gap, Mulliken charges, dipole
@@ -199,10 +213,12 @@ Real output from QuantUI, straight from the app:
199
213
  - **Plot export** — save IR, UV-Vis, PES, and orbital diagrams as standalone
200
214
  HTML
201
215
  - **Optional GPU acceleration** — when [gpu4pyscf](https://github.com/pyscf/gpu4pyscf)
202
- and a CUDA-capable NVIDIA GPU are present, SCF calculations auto-offload
216
+ and a CUDA-capable NVIDIA GPU are present, single-point SCF calculations auto-offload
203
217
  via `mf.to_gpu()` (RHF / UHF / RKS / UKS supported; CCSD(T) stays on CPU).
204
218
  The Status tab + every result card show which compute device was used.
205
219
  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.
206
222
  - **Timing calibration** — one-click benchmark suite populates the time
207
223
  estimator with real machine data so predictions are accurate from the first run
208
224
  - **Voilà app mode** — serve the notebook as a polished widget-only UI (no
@@ -217,11 +233,29 @@ Real output from QuantUI, straight from the app:
217
233
  | --- | --- | --- |
218
234
  | Linux / macOS | Full | PySCF installs natively |
219
235
  | WSL (Windows) | Full | Use an Ubuntu WSL environment |
220
- | Windows (native) | Partial | All UI and visualization features work; PySCF calculations require the Apptainer container |
236
+ | Windows (native) | Partial | PyFock runs guarded PBE single points and geometry optimizations; use WSL/Apptainer for the full PySCF feature set |
221
237
 
222
- ### Windows users: Apptainer container
238
+ ### Windows users: native PyFock or the full container
223
239
 
224
- PySCF does not install on Windows natively. The
240
+ For native Windows, install the PyFock subset:
241
+
242
+ ```powershell
243
+ py -3.11 -m venv .venv
244
+ .venv\Scripts\Activate.ps1
245
+ python -m pip install "quantui[pyfock,ase,app]"
246
+ ```
247
+
248
+ In **System Settings → Quantum engine**, select PyFock (or leave Automatic
249
+ selected when PySCF is absent). The validated subset supports neutral,
250
+ closed-shell PBE single points and geometry optimizations with def2-SVP or
251
+ def2-TZVP. Density fitting is always enabled, analytical gradients drive
252
+ optimization, and orbital, Mulliken, dipole, and cube analysis are retained.
253
+ Hybrids, charged/open-shell systems, solvent, and checkpoint warm starts remain
254
+ PySCF-only. Optional PyFock GPU acceleration is available separately through
255
+ CuPy; geometry optimization uses numerical forces on GPU because PyFock 0.1.7
256
+ does not yet provide analytical GPU gradients.
257
+
258
+ PySCF does not install on Windows natively. For the complete feature set, the
225
259
  [`apptainer/quantui.def`](https://github.com/The-Schultz-Lab/QuantUI/blob/main/apptainer/quantui.def) container bundles
226
260
  the complete environment and runs anywhere Apptainer/Singularity is available.
227
261
  See [`apptainer/README.md`](https://github.com/The-Schultz-Lab/QuantUI/blob/main/apptainer/README.md) for build and run instructions.
@@ -247,6 +281,12 @@ pip install -e ".[pyscf,ase,app]"
247
281
  python -m pip install quantui[pyscf,ase,app]
248
282
  ```
249
283
 
284
+ For the limited native-Windows engine instead:
285
+
286
+ ```bash
287
+ python -m pip install quantui[pyfock,ase,app]
288
+ ```
289
+
250
290
  ### Option C — Apptainer container (Windows / reproducible deployment)
251
291
 
252
292
  See [apptainer/README.md](https://github.com/The-Schultz-Lab/QuantUI/blob/main/apptainer/README.md).
@@ -307,6 +347,27 @@ and result cards will display the compute device.
307
347
  Whenever gpu4pyscf can't offload a particular call, QuantUI falls back
308
348
  to CPU automatically and the result card reflects which device ran.
309
349
 
350
+ ### Optional: PyFock GPU acceleration
351
+
352
+ PyFock uses its own CuPy/Numba CUDA implementation; it does not use
353
+ `gpu4pyscf`. Install the PyFock engine and the CUDA-suffixed CuPy extra that
354
+ matches the NVIDIA driver reported by `nvidia-smi`:
355
+
356
+ ```bash
357
+ # CUDA 13.x driver
358
+ pip install "quantui[pyfock,pyfock-gpu-cuda13x]"
359
+
360
+ # CUDA 12.x driver
361
+ pip install "quantui[pyfock,pyfock-gpu-cuda12x]"
362
+ ```
363
+
364
+ PyFock GPU use is guarded independently: QuantUI requires CuPy to import and
365
+ report a CUDA device, and still honors the Settings GPU toggle and
366
+ `QUANTUI_DISABLE_GPU=1`. If the probe fails, PyFock falls back to CPU and
367
+ reports the reason. GPU single points use PyFock's GPU SCF/integral/XC path;
368
+ GPU geometry optimizations use numerical finite-difference forces because the
369
+ installed PyFock release's analytical gradient implementation is CPU-only.
370
+
310
371
  ### Optional: GFN-FF metal pre-optimization (xtb)
311
372
 
312
373
  The classical (MMFF/UFF) pre-optimizer relies on RDKit's organic valence
@@ -7,7 +7,8 @@
7
7
  [![Python](https://img.shields.io/badge/python-3.9%20|%203.10%20|%203.11-blue)](https://www.python.org)
8
8
 
9
9
  A powerful open-source frontend for DFT and post-HF quantum chemistry.
10
- QuantUI puts [PySCF](https://pyscf.org) behind an interactive Jupyter/Voilà
10
+ QuantUI puts [PySCF](https://pyscf.org) and a guarded
11
+ [PyFock](https://github.com/manassharma07/PyFock) subset behind an interactive Jupyter/Voilà
11
12
  UI so you can build molecules, run calculations locally, and visualize the
12
13
  results — no cluster account, no SLURM, no queueing.
13
14
 
@@ -71,7 +72,10 @@ Real output from QuantUI, straight from the app:
71
72
  your default-backend preference between sessions
72
73
  - **In-session calculations** — RHF, UHF, 9 DFT functionals, MP2, CCSD,
73
74
  CCSD(T), NMR shielding, TD-DFT UV-Vis, and 1D PES scans via PySCF, running
74
- in your Python kernel (no batch submission)
75
+ in your Python kernel. Optional PyFock 0.1.x adds native-Windows PBE
76
+ single points and geometry optimizations for neutral, closed-shell molecules
77
+ with def2-SVP/def2-TZVP, including orbital and population analysis;
78
+ engine capabilities automatically gate the setup menus
75
79
  - **Implicit solvent** — PCM solvation (Water, Ethanol, THF, DMSO,
76
80
  Acetonitrile) via a single checkbox
77
81
  - **Rich results** — total energy, HOMO-LUMO gap, Mulliken charges, dipole
@@ -104,10 +108,12 @@ Real output from QuantUI, straight from the app:
104
108
  - **Plot export** — save IR, UV-Vis, PES, and orbital diagrams as standalone
105
109
  HTML
106
110
  - **Optional GPU acceleration** — when [gpu4pyscf](https://github.com/pyscf/gpu4pyscf)
107
- and a CUDA-capable NVIDIA GPU are present, SCF calculations auto-offload
111
+ and a CUDA-capable NVIDIA GPU are present, single-point SCF calculations auto-offload
108
112
  via `mf.to_gpu()` (RHF / UHF / RKS / UKS supported; CCSD(T) stays on CPU).
109
113
  The Status tab + every result card show which compute device was used.
110
114
  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.
111
117
  - **Timing calibration** — one-click benchmark suite populates the time
112
118
  estimator with real machine data so predictions are accurate from the first run
113
119
  - **Voilà app mode** — serve the notebook as a polished widget-only UI (no
@@ -122,11 +128,29 @@ Real output from QuantUI, straight from the app:
122
128
  | --- | --- | --- |
123
129
  | Linux / macOS | Full | PySCF installs natively |
124
130
  | WSL (Windows) | Full | Use an Ubuntu WSL environment |
125
- | Windows (native) | Partial | All UI and visualization features work; PySCF calculations require the Apptainer container |
131
+ | Windows (native) | Partial | PyFock runs guarded PBE single points and geometry optimizations; use WSL/Apptainer for the full PySCF feature set |
126
132
 
127
- ### Windows users: Apptainer container
133
+ ### Windows users: native PyFock or the full container
128
134
 
129
- PySCF does not install on Windows natively. The
135
+ For native Windows, install the PyFock subset:
136
+
137
+ ```powershell
138
+ py -3.11 -m venv .venv
139
+ .venv\Scripts\Activate.ps1
140
+ python -m pip install "quantui[pyfock,ase,app]"
141
+ ```
142
+
143
+ In **System Settings → Quantum engine**, select PyFock (or leave Automatic
144
+ selected when PySCF is absent). The validated subset supports neutral,
145
+ closed-shell PBE single points and geometry optimizations with def2-SVP or
146
+ def2-TZVP. Density fitting is always enabled, analytical gradients drive
147
+ optimization, and orbital, Mulliken, dipole, and cube analysis are retained.
148
+ Hybrids, charged/open-shell systems, solvent, and checkpoint warm starts remain
149
+ PySCF-only. Optional PyFock GPU acceleration is available separately through
150
+ CuPy; geometry optimization uses numerical forces on GPU because PyFock 0.1.7
151
+ does not yet provide analytical GPU gradients.
152
+
153
+ PySCF does not install on Windows natively. For the complete feature set, the
130
154
  [`apptainer/quantui.def`](https://github.com/The-Schultz-Lab/QuantUI/blob/main/apptainer/quantui.def) container bundles
131
155
  the complete environment and runs anywhere Apptainer/Singularity is available.
132
156
  See [`apptainer/README.md`](https://github.com/The-Schultz-Lab/QuantUI/blob/main/apptainer/README.md) for build and run instructions.
@@ -152,6 +176,12 @@ pip install -e ".[pyscf,ase,app]"
152
176
  python -m pip install quantui[pyscf,ase,app]
153
177
  ```
154
178
 
179
+ For the limited native-Windows engine instead:
180
+
181
+ ```bash
182
+ python -m pip install quantui[pyfock,ase,app]
183
+ ```
184
+
155
185
  ### Option C — Apptainer container (Windows / reproducible deployment)
156
186
 
157
187
  See [apptainer/README.md](https://github.com/The-Schultz-Lab/QuantUI/blob/main/apptainer/README.md).
@@ -212,6 +242,27 @@ and result cards will display the compute device.
212
242
  Whenever gpu4pyscf can't offload a particular call, QuantUI falls back
213
243
  to CPU automatically and the result card reflects which device ran.
214
244
 
245
+ ### Optional: PyFock GPU acceleration
246
+
247
+ PyFock uses its own CuPy/Numba CUDA implementation; it does not use
248
+ `gpu4pyscf`. Install the PyFock engine and the CUDA-suffixed CuPy extra that
249
+ matches the NVIDIA driver reported by `nvidia-smi`:
250
+
251
+ ```bash
252
+ # CUDA 13.x driver
253
+ pip install "quantui[pyfock,pyfock-gpu-cuda13x]"
254
+
255
+ # CUDA 12.x driver
256
+ pip install "quantui[pyfock,pyfock-gpu-cuda12x]"
257
+ ```
258
+
259
+ PyFock GPU use is guarded independently: QuantUI requires CuPy to import and
260
+ report a CUDA device, and still honors the Settings GPU toggle and
261
+ `QUANTUI_DISABLE_GPU=1`. If the probe fails, PyFock falls back to CPU and
262
+ reports the reason. GPU single points use PyFock's GPU SCF/integral/XC path;
263
+ GPU geometry optimizations use numerical finite-difference forces because the
264
+ installed PyFock release's analytical gradient implementation is CPU-only.
265
+
215
266
  ### Optional: GFN-FF metal pre-optimization (xtb)
216
267
 
217
268
  The classical (MMFF/UFF) pre-optimizer relies on RDKit's organic valence
@@ -8,7 +8,7 @@ build-backend = "setuptools.build_meta"
8
8
 
9
9
  [project]
10
10
  name = "quantui"
11
- version = "0.8.2"
11
+ version = "0.9.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"
@@ -30,8 +30,9 @@ classifiers = [
30
30
  # PyPI shows the licence from this classifier in the sidebar; the
31
31
  # [project] license table alone is not enough for the old-style display.
32
32
  "License :: OSI Approved :: MIT License",
33
- # PySCF is Linux/macOS only, so Windows users need the container. Saying so
34
- # in metadata means `pip` users see it before they hit an install failure.
33
+ # The complete PySCF feature set is Linux/macOS only. Native Windows has a
34
+ # smaller optional PyFock backend, documented in README; add a Windows
35
+ # classifier after its dedicated real-calculation CI gate is green.
35
36
  "Operating System :: POSIX :: Linux",
36
37
  "Operating System :: MacOS",
37
38
  "Environment :: Web Environment",
@@ -82,8 +83,19 @@ Issues = "https://github.com/The-Schultz-Lab/QuantUI/issues"
82
83
  # the terminal (``quantui log tail -n 50``, etc.). See ``quantui/cli.py``.
83
84
  quantui = "quantui.cli:main"
84
85
 
85
- [tool.setuptools]
86
- packages = ["quantui", "quantui.backends"]
86
+ [tool.setuptools.packages.find]
87
+ # AUDIT F20 — this used to be an explicit `packages = ["quantui",
88
+ # "quantui.backends"]` list under [tool.setuptools]. quantui.engines is a
89
+ # real subpackage (quantui/engines/__init__.py + base.py/pyscf_engine.py/
90
+ # pyfock_engine.py) that was never added to that list: the built wheel
91
+ # silently omitted it entirely (ModuleNotFoundError importing
92
+ # quantui.engines from an installed, non-editable wheel), while every CI
93
+ # run stayed green because CI installs editable (`pip install -e`), which
94
+ # doesn't go through this list at all. Automatic discovery means the next
95
+ # new subpackage ships by construction instead of needing a second edit
96
+ # here that's easy to forget.
97
+ include = ["quantui", "quantui.*"]
98
+ exclude = ["tests", "tests.*"]
87
99
 
88
100
  [tool.setuptools.package-data]
89
101
  # Bundled molecule library (M-STRUCT): the indexed SQLite store + the
@@ -114,6 +126,20 @@ pyscf = [
114
126
  "pyscf-properties",
115
127
  ]
116
128
 
129
+ # Native-Windows-capable pure-Python DFT backend (M-PYFOCK). PyFock 0.1.7
130
+ # imports SciPy but does not declare it in its own wheel metadata, so QuantUI's
131
+ # extra supplies and caps that runtime dependency explicitly.
132
+ pyfock = [
133
+ "pyfock>=0.1.7,<0.3",
134
+ # PyFock's ASE calculator is the geometry-optimization path used by
135
+ # QuantUI; include ASE here so the documented backend extra is complete.
136
+ "ase>=3.22.0,<4",
137
+ "scipy>=1.10,<2",
138
+ # 0.68.0rc1 can be selected by PyFock's permissive floor and brought a
139
+ # prerelease llvmlite that crashed at import on Linux/Python 3.12.
140
+ "numba>=0.57,<0.68",
141
+ ]
142
+
117
143
  # ASE: structure I/O, extended molecule library, geometry optimisation
118
144
  ase = [
119
145
  "ase>=3.22.0,<4",
@@ -164,6 +190,16 @@ gpu-cuda13x = [
164
190
  "cutensor-cu13",
165
191
  ]
166
192
 
193
+ # PyFock GPU acceleration is a separate CuPy-only path. Do not install or
194
+ # probe gpu4pyscf for a PyFock calculation: the two engines have independent
195
+ # CUDA implementations and capability gates.
196
+ pyfock-gpu-cuda12x = [
197
+ "cupy-cuda12x",
198
+ ]
199
+ pyfock-gpu-cuda13x = [
200
+ "cupy-cuda13x",
201
+ ]
202
+
167
203
  # Notebook smoke-test dependencies
168
204
  notebook = [
169
205
  "nbmake>=1.4.0",
@@ -176,6 +212,13 @@ dev = [
176
212
  "pytest-cov>=4.0.0",
177
213
  "pytest-mock>=3.10.0",
178
214
  "pytest-xdist>=3.0.0", # parallel test execution (-n=auto in addopts)
215
+ # AUDIT F20 — the PEP 517 build frontend, used by
216
+ # tests/test_packaging.py to build a real wheel and inspect its
217
+ # contents (import/package-data smoke test against a *built* wheel,
218
+ # not the editable install every other test runs against — the gap
219
+ # that let quantui.engines silently vanish from the shipped package
220
+ # while CI, always editable, stayed green).
221
+ "build>=1.0.0",
179
222
  "mypy>=1.10,<2.4", # pinned, not an open floor — same reasoning as
180
223
  # black/ruff below: it must agree with .pre-commit-config.yaml's rev,
181
224
  # which is what CI enforces (M-TYPECHECK TYPE.2). A newer mypy silently
@@ -256,6 +299,7 @@ strict_equality = true
256
299
  [[tool.mypy.overrides]]
257
300
  module = [
258
301
  "pyscf.*",
302
+ "pyfock.*",
259
303
  "py3Dmol.*",
260
304
  "IPython.*",
261
305
  "ipywidgets.*",
@@ -294,6 +338,9 @@ markers = [
294
338
  "unit: marks tests as unit tests",
295
339
  "network: marks tests that require network connectivity",
296
340
  "notebook: marks notebook smoke tests",
341
+ "pyfock: marks real PyFock integration/parity tests (opt in with QUANTUI_RUN_PYFOCK_INTEGRATION=1)",
342
+ "gpu_integration: marks real NVIDIA GPU integration tests (opt in with QUANTUI_RUN_GPU_INTEGRATION=1)",
343
+ "pyfock_gpu: marks real PyFock CuPy GPU tests (opt in with QUANTUI_RUN_PYFOCK_GPU_INTEGRATION=1)",
297
344
  ]
298
345
 
299
346
  [tool.coverage.run]
@@ -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.2"
10
+ __version__ = "0.9.0"
11
11
 
12
12
  import logging
13
13
  from typing import Any