Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 48 additions & 15 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,30 @@ and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.ht

## [Unreleased]

## [0.5.0] - 2026-07-31

First release published to **PyPI** — `pip install quantui`.

### Added

- **Seed geometry for Geometry Optimization runs** — a run can now start from
the final geometry of a previous optimization instead of the current molecule,
which makes the standard "optimize at a cheap level of theory, then refine at
a higher one" workflow a single dropdown choice. Frequency and UV-Vis already
supported this; Geometry Opt now matches them.
- **A "still working" heartbeat in the live log.** Long silent phases — the
TD-DFT excited-state solve most of all — could leave the output log unchanged
for minutes while the calculation was running normally, which reads as a hang.
The log now reports `… still working — <stage> · <elapsed>` whenever it has
been quiet for 25 seconds. The saved `pyscf.log` is unaffected; it stays a
faithful record of the calculation's own output.
- **Basis-set names now show their alternate notation.** `6-31G*` and `6-31G(d)`
are the same basis set written two ways, and nothing in the UI said so. The
basis card now notes the equivalent spelling, and the basis-set help topic
explains the star/parenthesis convention, the `+`/`++` diffuse markers and
when anions need them, and why Dunning sets (`cc-pVDZ`) have no star at all.
- **The launcher terminal now prints the QuantUI wordmark** instead of two bare
lines of text.
- **Reorganization energy (Marcus 4-point)** — a new "Reorganization Energy"
calculation type that computes the internal reorganization energy λ for hole
(cation) and/or electron (anion) charge transfer. It optimizes the neutral and
Expand All @@ -20,9 +42,30 @@ and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.ht
- **One-click "Calc. Reorganization Energy" button** — sets the calculation type
to Reorganization Energy, defaults the channel to both hole + electron, and
launches the run in a single click.
- **GPU offload can now be switched off from the UI** — Status tab → Settings →
"Use GPU when available". The preference persists across launches. This exists
because GPU offload is not always faster: quantum-chemistry SCF is
double-precision throughout, and consumer/workstation GPUs gate FP64 to roughly
1/32–1/64 of their FP32 rate, so offload on such a card can be *slower* than a
many-core CPU. `QUANTUI_DISABLE_GPU=1` still overrides the setting for scripted
runs.
- **A warning when a detected GPU is unlikely to help.** `quantui gpu check` and
the Status tab now flag consumer-class devices with a note that double
precision is weak on them and offload may be slower than CPU, instead of
presenting any detected CUDA device as free speed.

### Changed

- **The live calculation log no longer snaps back to the bottom while a run is
in progress**, so you can scroll up and read earlier output mid-calculation.
It still follows new output automatically when you are at the bottom. The log
is now a container QuantUI owns and appends to, rather than a widget that
rebuilt itself on every line.
- **No pre-optimization preview when the geometry barely moves.** Previously a
relaxation that changed essentially nothing still opened an animation pane and
a Keep/Revert choice between two effectively identical structures. Below
0.05 Å RMS displacement QuantUI now just reports the number and proceeds with
your geometry.
- **All launcher scripts moved into a `launchers/` folder** to declutter the repo
root. Behaviour is unchanged — each launcher now resolves the repo root as its
parent directory. `launchers/launch-app.bat` still finds `quantui.sif` next to
Expand All @@ -36,22 +79,11 @@ and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.ht
avoids the base image's implicit `defaults` channel. No change to the shipped
package set or runtime behavior.

### Added

- **GPU offload can now be switched off from the UI** — Status tab → Settings →
"Use GPU when available". The preference persists across launches. This exists
because GPU offload is not always faster: quantum-chemistry SCF is
double-precision throughout, and consumer/workstation GPUs gate FP64 to roughly
1/32–1/64 of their FP32 rate, so offload on such a card can be *slower* than a
many-core CPU. `QUANTUI_DISABLE_GPU=1` still overrides the setting for scripted
runs.
- **A warning when a detected GPU is unlikely to help.** `quantui gpu check` and
the Status tab now flag consumer-class devices with a note that double
precision is weak on them and offload may be slower than CPU, instead of
presenting any detected CUDA device as free speed.

### Fixed

- **The live log and run header render in a fixed-width font again.** A
system-font rule was applying to the log, which garbled the ASCII wordmark and
pushed the run header's `Label : value` columns out of alignment.
- **`quantui gpu check` no longer reports a broken CUDA install as "gpu4pyscf not
installed".** `ModuleNotFoundError` is a subclass of `ImportError`, so catching
the latter conflated "the package is absent" with "the package is present but
Expand Down Expand Up @@ -429,7 +461,8 @@ Initial public scaffolding of the QuantUI package: `quantui` package with
`calculator.py`, basic notebook launcher, Apptainer container definition,
MIT license, and project metadata.

[Unreleased]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.4.1...HEAD
[Unreleased]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.5.0...HEAD
[0.5.0]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.4.1...v0.5.0
[0.4.1]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.4.0...v0.4.1
[0.4.0]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.3.0...v0.4.0
[0.3.0]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.2.0...v0.3.0
Expand Down
39 changes: 39 additions & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Source-distribution contents (M-PYPI PYPI.3).
#
# setuptools already picks up the package itself, README, LICENSE and
# pyproject.toml. This file fixes the two things it gets wrong for us:
# CHANGELOG.md was missing, and tests/ was being shipped.
#
# Policy — what belongs in the sdist:
# INCLUDE the package, its bundled data, and the documents a user or a
# downstream packager needs to understand what they installed.
# EXCLUDE anything only useful from a git clone. A pip user cannot run the
# test suite meaningfully (it needs dev extras and PySCF), cannot
# build the container, and does not get the notebooks in a usable
# location — those all stay in the repo.

include CHANGELOG.md
include SECURITY.md

# Tests need the dev extras + PySCF to run and are not importable from an
# installed copy; shipping them roughly doubles the sdist for no benefit.
prune tests

# Repo-only material: container recipes, launcher scripts, tutorial notebooks,
# the docs site, and the environment file are all clone-time artifacts.
prune apptainer
prune docs
prune launchers
prune notebooks
prune local-setup
prune scripts

# Build/dev droppings that must never reach an artifact.
prune .github
global-exclude *.py[cod]
global-exclude __pycache__
global-exclude .DS_Store
exclude .dev_install_stamp
exclude .pre-commit-config.yaml
exclude AUDIT_FINDINGS.md
exclude quantui.sif
37 changes: 19 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# QuantUI

[![PyPI](https://img.shields.io/pypi/v/quantui)](https://pypi.org/project/quantui/)
[![CI](https://github.com/The-Schultz-Lab/QuantUI/actions/workflows/ci.yml/badge.svg)](https://github.com/The-Schultz-Lab/QuantUI/actions/workflows/ci.yml)
[![Docs](https://img.shields.io/badge/docs-GitHub%20Pages-blue)](https://the-schultz-lab.github.io/QuantUI/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/The-Schultz-Lab/QuantUI/blob/main/LICENSE)
[![Python](https://img.shields.io/badge/python-3.9%20|%203.10%20|%203.11-blue)](https://www.python.org)

A powerful open-source frontend for DFT and post-HF quantum chemistry.
Expand Down Expand Up @@ -78,9 +79,9 @@ research and classroom use.
### Windows users: Apptainer container

PySCF does not install on Windows natively. The
[`apptainer/quantui.def`](apptainer/quantui.def) container bundles
[`apptainer/quantui.def`](https://github.com/The-Schultz-Lab/QuantUI/blob/main/apptainer/quantui.def) container bundles
the complete environment and runs anywhere Apptainer/Singularity is available.
See [`apptainer/README.md`](apptainer/README.md) for build and run instructions.
See [`apptainer/README.md`](https://github.com/The-Schultz-Lab/QuantUI/blob/main/apptainer/README.md) for build and run instructions.

---

Expand All @@ -105,7 +106,7 @@ python -m pip install quantui[pyscf,ase,app]

### Option C — Apptainer container (Windows / reproducible deployment)

See [apptainer/README.md](apptainer/README.md).
See [apptainer/README.md](https://github.com/The-Schultz-Lab/QuantUI/blob/main/apptainer/README.md).

### Optional: GPU acceleration (NVIDIA + Linux / WSL)

Expand Down Expand Up @@ -194,9 +195,9 @@ no rebuild.

| Platform | File | Action |
| --- | --- | --- |
| Windows | [`launchers/launch-native.bat`](launchers/launch-native.bat) | Activates the `quantui` conda env inside WSL Ubuntu, runs Voilà, and opens `http://localhost:8867` |
| macOS | [`launchers/launch-native.command`](launchers/launch-native.command) | Activates the local `quantui` conda env directly (no WSL needed) and does the same |
| Linux / WSL | [`launchers/launch-native.sh`](launchers/launch-native.sh) | Run `./launchers/launch-native.sh` from a Linux or WSL terminal; activates `quantui` and does the same |
| Windows | [`launchers/launch-native.bat`](https://github.com/The-Schultz-Lab/QuantUI/blob/main/launchers/launch-native.bat) | Activates the `quantui` conda env inside WSL Ubuntu, runs Voilà, and opens `http://localhost:8867` |
| macOS | [`launchers/launch-native.command`](https://github.com/The-Schultz-Lab/QuantUI/blob/main/launchers/launch-native.command) | Activates the local `quantui` conda env directly (no WSL needed) and does the same |
| Linux / WSL | [`launchers/launch-native.sh`](https://github.com/The-Schultz-Lab/QuantUI/blob/main/launchers/launch-native.sh) | Run `./launchers/launch-native.sh` from a Linux or WSL terminal; activates `quantui` and does the same |

All launchers reuse port `8867`, so you can keep the same browser tab pinned
across platforms. They **auto-detect your conda installation** — miniforge
Expand All @@ -221,7 +222,7 @@ prefix — so no path editing is needed regardless of which you installed.

### Windows — pin to the Start menu

1. Right-click [`launchers/launch-native.bat`](launchers/launch-native.bat) in
1. Right-click [`launchers/launch-native.bat`](https://github.com/The-Schultz-Lab/QuantUI/blob/main/launchers/launch-native.bat) in
File Explorer → **Send to** → **Desktop (create shortcut)**.
2. Rename the shortcut to something friendly like `QuantUI`.
3. *(Optional)* Right-click the shortcut → **Properties** → **Change Icon...**
Expand All @@ -242,7 +243,7 @@ in your browser.
### macOS — pin to the Dock / Launchpad

**Quickest:** double-click
[`launchers/launch-native.command`](launchers/launch-native.command)
[`launchers/launch-native.command`](https://github.com/The-Schultz-Lab/QuantUI/blob/main/launchers/launch-native.command)
from Finder. macOS will open Terminal, run the script, and pop the app open
in your browser. The first launch is gated by Gatekeeper: right-click the
file → **Open** → **Open** to clear it (one time only).
Expand Down Expand Up @@ -293,7 +294,7 @@ quantui gpu check # is GPU offload available right now?
quantui analytics build --open # build dashboard.html + open in browser
```

Full reference with all flags and examples: [docs/CLI.md](docs/CLI.md).
Full reference with all flags and examples: [docs/CLI.md](https://github.com/The-Schultz-Lab/QuantUI/blob/main/docs/CLI.md).

---

Expand All @@ -311,21 +312,21 @@ or any spreadsheet without screen-scraping. The quick reference:
| Spectrum data in Excel | `*_data_*.csv` | Excel, LibreOffice, pandas |
| Share whole result | `<result>.zip` (Export bundle) | Any unzip tool |

Full per-tool walkthrough with troubleshooting: [docs/IMPORTING-INTO-AVOGADRO.md](docs/IMPORTING-INTO-AVOGADRO.md).
Full per-tool walkthrough with troubleshooting: [docs/IMPORTING-INTO-AVOGADRO.md](https://github.com/The-Schultz-Lab/QuantUI/blob/main/docs/IMPORTING-INTO-AVOGADRO.md).

---

## Tutorials

Five step-by-step notebooks in [`notebooks/tutorials/`](notebooks/tutorials/):
Five step-by-step notebooks in [`notebooks/tutorials/`](https://github.com/The-Schultz-Lab/QuantUI/tree/main/notebooks/tutorials/):

| Notebook | Topic |
| --- | --- |
| [01_first_calculation.ipynb](notebooks/tutorials/01_first_calculation.ipynb) | Your first RHF calculation |
| [02_basis_set_study.ipynb](notebooks/tutorials/02_basis_set_study.ipynb) | Comparing STO-3G, 6-31G, cc-pVDZ |
| [03_multiplicity_radicals.ipynb](notebooks/tutorials/03_multiplicity_radicals.ipynb) | Open-shell molecules and UHF |
| [04_charged_species.ipynb](notebooks/tutorials/04_charged_species.ipynb) | Ions and charged systems |
| [05_comparing_results.ipynb](notebooks/tutorials/05_comparing_results.ipynb) | Side-by-side result analysis |
| [01_first_calculation.ipynb](https://github.com/The-Schultz-Lab/QuantUI/blob/main/notebooks/tutorials/01_first_calculation.ipynb) | Your first RHF calculation |
| [02_basis_set_study.ipynb](https://github.com/The-Schultz-Lab/QuantUI/blob/main/notebooks/tutorials/02_basis_set_study.ipynb) | Comparing STO-3G, 6-31G, cc-pVDZ |
| [03_multiplicity_radicals.ipynb](https://github.com/The-Schultz-Lab/QuantUI/blob/main/notebooks/tutorials/03_multiplicity_radicals.ipynb) | Open-shell molecules and UHF |
| [04_charged_species.ipynb](https://github.com/The-Schultz-Lab/QuantUI/blob/main/notebooks/tutorials/04_charged_species.ipynb) | Ions and charged systems |
| [05_comparing_results.ipynb](https://github.com/The-Schultz-Lab/QuantUI/blob/main/notebooks/tutorials/05_comparing_results.ipynb) | Side-by-side result analysis |

---

Expand Down Expand Up @@ -438,4 +439,4 @@ CHANGELOG.md Release history (Keep a Changelog format)

## License

[MIT](LICENSE) — Copyright 2026 The Schultz Lab, North Carolina Central University
[MIT](https://github.com/The-Schultz-Lab/QuantUI/blob/main/LICENSE) — Copyright 2026 The Schultz Lab, North Carolina Central University
2 changes: 1 addition & 1 deletion apptainer/quantui.def
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ FROM: condaforge/miniforge3:latest
%labels
Maintainer "Jonathan Schultz"
Purpose "Local teaching interface for quantum chemistry calculations"
Version "0.4.1"
Version "0.5.0"

%environment
export PATH="/opt/conda/bin:${PATH}"
Expand Down
76 changes: 60 additions & 16 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
[build-system]
requires = ["setuptools>=45", "wheel", "setuptools_scm[toml]>=9.2.2"]
# setuptools_scm was listed here historically but never configured — there is
# no [tool.setuptools_scm] table and `version` below is static, so nothing
# consumed it. Dropped for the first PyPI release rather than shipping a
# build dependency that does nothing.
requires = ["setuptools>=64", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "quantui"
version = "0.4.1"
version = "0.5.0"
description = "An open-source frontend for DFT and post-HF quantum chemistry with PySCF"
readme = "README.md"
requires-python = ">=3.9"
Expand All @@ -23,20 +27,55 @@ classifiers = [
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
# PyPI shows the licence from this classifier in the sidebar; the
# [project] license table alone is not enough for the old-style display.
"License :: OSI Approved :: MIT License",
# PySCF is Linux/macOS only, so Windows users need the container. Saying so
# in metadata means `pip` users see it before they hit an install failure.
"Operating System :: POSIX :: Linux",
"Operating System :: MacOS",
"Environment :: Web Environment",
"Framework :: Jupyter",
]

# Runtime dependencies carry MAJOR-version caps, not open floors (M-PYPI
# PYPI.2). QuantUI is installed by students as an application, not consumed as
# a library, so the usual "don't cap in a library" advice does not apply — a
# resolution conflict is a worse outcome for them than a slightly stale pin,
# but a silent break from a new major is worse still.
#
# The concrete motivation: Voila 0.5.x declares no upper bound on jupyterlab,
# so a fresh install already resolves a Lab newer than Voila was built against
# and logs federated-extension errors in the browser console (see GOTCHAS,
# "Voila 0.5.x does not bound JupyterLab"). Harmless today because the failing
# extension is Notebook's, which Voila does not use — but shipping an unbounded
# stack means the next major can break a student with no error we control.
#
# Caps are at the MAJOR boundary only: minor/patch updates still flow, and the
# bounds reflect what has actually been tested rather than pretending to more.
# Revisit when a new major of any of these is validated.
dependencies = [
"jupyter>=1.0.0",
"ipywidgets>=8.0.0",
"notebook>=7.0.0",
"numpy>=1.24.0",
"requests>=2.28.0",
"py3Dmol>=2.0.0",
"matplotlib>=3.7.0",
"plotly>=5.0.0",
"plotlymol>=0.2.1",
"jupyter>=1.0.0,<2",
"ipywidgets>=8.0.0,<9",
"notebook>=7.0.0,<8",
"numpy>=1.24.0,<3",
"requests>=2.28.0,<3",
"py3Dmol>=2.0.0,<3",
"matplotlib>=3.7.0,<4",
"plotly>=5.0.0,<7",
"plotlymol>=0.2.1,<1",
]

[project.urls]
# Rendered as the sidebar links on the PyPI project page. "Homepage" and
# "Source" are the two PyPI actually highlights; the rest appear under
# "Project links".
Homepage = "https://github.com/The-Schultz-Lab/QuantUI"
Source = "https://github.com/The-Schultz-Lab/QuantUI"
Documentation = "https://the-schultz-lab.github.io/QuantUI/"
Changelog = "https://github.com/The-Schultz-Lab/QuantUI/blob/main/CHANGELOG.md"
Issues = "https://github.com/The-Schultz-Lab/QuantUI/issues"

[project.scripts]
# ``quantui`` CLI — small toolkit for inspecting QuantUI state from
# the terminal (``quantui log tail -n 50``, etc.). See ``quantui/cli.py``.
Expand Down Expand Up @@ -67,20 +106,25 @@ quantui = [
# pyscf.nmr (that module doesn't exist in released pyscf); it's
# pyscf.prop.nmr, provided by pyscf-properties below.
pyscf = [
"pyscf>=2.13.0",
# .github/dependabot.yml already ignores pyscf MAJOR bumps ("may break
# API — review manually"); this cap makes that policy binding for
# installers too, not just for our dependency bot.
"pyscf>=2.13.0,<3",
"pyscf-properties",
]

# ASE: structure I/O, extended molecule library, geometry optimisation
ase = [
"ase>=3.22.0",
"ase>=3.22.0,<4",
]

# Voilà app server — hides notebook code; students see only the widget UI.
# Run with: voila notebooks/molecule_computations.ipynb
app = [
"voila>=0.5.0",
"ipykernel>=6.0.0",
# Capped for the same reason as the runtime stack above: Voila is the
# component whose own bounds are too loose, so ours have to hold the line.
"voila>=0.5.0,<0.6",
"ipykernel>=6.0.0,<8",
]

# GPU acceleration via gpu4pyscf + cupy (M-GPU). Linux + NVIDIA CUDA only.
Expand Down Expand Up @@ -111,7 +155,7 @@ gpu-cuda13x = [
# Notebook smoke-test dependencies
notebook = [
"nbmake>=1.4.0",
"ipykernel>=6.0.0",
"ipykernel>=6.0.0,<8",
]

# Development dependencies
Expand Down
2 changes: 1 addition & 1 deletion quantui/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
PySCF requires Linux/macOS/WSL. Windows users should use the Apptainer container.
"""

__version__ = "0.4.1"
__version__ = "0.5.0"

import logging
from typing import Any
Expand Down