xndo-rs
xndo-rs is a Rust library with Python-native, ASE, and CLI
interfaces for selected NDO-family semiempirical methods.
Implemented methods
| Method | Ground state | Derivatives | Excited states | Parameter source |
|---|---|---|---|---|
| CNDO/2 | RHF/UHF | analytic gradient, Hessian, optimization, frequencies | no | MolDS 0.3.1 |
| INDO | RHF/UHF | analytic gradient, Hessian, optimization, frequencies | no | MolDS 0.3.1 |
| MNDO | RHF/UHF | analytic gradient, Hessian, optimization, frequencies | no | OpenMOPAC 23.2.5 |
| MNDO/d | RHF/UHF | analytic gradient, Hessian, optimization, frequencies, including open-shell d AOs | no | OpenMOPAC 23.2.5 |
| MINDO/3 | RHF/UHF | analytic gradient, Hessian, optimization, frequencies | no | MOPAC7 |
| ZINDO/S | RHF/UHF | analytic ground optimization/derivatives and state gradients/Hessians | RHF singlet/triplet CIS; UHF spin-orbital UCIS; UV-vis properties | OpenMOPAC 23.2.5 |
Every method also reports orbital energies, occupations and the HOMO/LUMO pair,
and can write a Molden wavefunction file. Molden coefficients are
back-transformed with S^(-1/2): the engines assume an orthonormal AO basis and
a Molden file does not describe one, so the raw coefficients would give a
reader a density that does not integrate to the electron count.
Each method is checked against the program its own parameters came from --
OpenMOPAC 23.2.5, MolDS 0.3.1, MOPAC7 1.15 -- over 2415 independent scalar
comparisons with no known disagreements. VALIDATION_STATUS.md has the table
and tests/data/ORACLE_NOTES.md the detail.
No correlated method is implemented: no MP2, no coupled cluster, no CI, no
multireference. docs/scope.md lists what is out, and
docs/v0.3.0-delivery.md records what this release delivers against what was
planned, together with its known problems.
CNDO/1, INDO/1, INDO/2, ZINDO/1, ZINDO/2, MINDO/1, MINDO/2, SINDO1, and MSINDO are registered but deliberately fail at execution because no complete, compatible, provenance-audited parameter and Hamiltonian set is bundled. CNDO/3, INDO/3, and ZINDO/3 are non-canonical compatibility labels.
For open-shell diatomics such as OH, the UHF ground-state energy and analytic gradient and the vertical UCIS spectrum are available and tested. A state-specific UHF Hessian or UCIS derivative is not unique on the degenerate electronic surface without a state-averaged or diabatic definition, so those requests return an explicit error instead of a branch-dependent value. The same safeguard applies when requested CIS/UCIS roots are separated by less than 0.0001 eV; vertical spectra remain available, while state-specific derivatives require a state-averaged or diabatic treatment.
Build and test
Install the published Python package with optional ASE support:
pip install "xndo-rs-python[ase]"
Build local PyPI artifacts with:
cargo check --all-targets --all-features
cargo clippy --all-targets --all-features -- -D warnings
cargo test --all-targets --all-features
maturin build --release --features python
maturin sdist
twine check target/wheels/*
pip install --force-reinstall --no-deps target/wheels/*.whl
python -m pytest tests/test_python.py tests/test_python_api.py
Install the wheel before running the Python tests. They open with
pytest.importorskip("xndo_rs"), so against a source tree with nothing
installed they all skip and report success without having run.
A release build records the directories it was built from -- the project, the
cargo registry and the rustup toolchains -- inside the binary, which for a
published artifact means the maintainer's home directory. [profile.release]
sets strip = "symbols"; supply the rest at build time. CARGO_HOME and
RUSTUP_HOME are the canonical variables for the other two; set them if your
environment has not already.
RUSTFLAGS="--remap-path-prefix=$PWD=. --remap-path-prefix=$CARGO_HOME=/cargo --remap-path-prefix=$RUSTUP_HOME=/rustup" maturin build --release --features python
Then check, rather than assume:
python tools/privacy_scan.py --artifacts target/wheels/*.whl target/wheels/*.tar.gz target/release/xndo_rs_cli*
The scanner reads inside archives and binaries. It permits an e-mail address
only where the same address appears in this tree's licence and notice documents,
because those are the attributions Apache-2.0 4(c) and the GPL require to be
carried and src/licenses.rs embeds them in every binary. One known finding it
will report is maturin's generated .dist-info/sboms/*.cyclonedx.json, which
records absolute source paths; remove it, or do not publish that wheel.
The release profile uses fat LTO and one code-generation unit. Embedded tables
are parsed once per process. The ZDO Hessian engines solve all Cartesian CPHF
right-hand sides with one factorization. Memory guards are available through
NddoOptions; XNDO_MAX_PAIR_CACHE_MB can override the two-electron
pair-cache limit.
Rust API
use xndo_rs::{run_gradient, run_hessian, Method, Molecule, NddoOptions};
let xyz = "3\nwater\nO 0 0 0\nH 0.9584 0 0\nH -0.2400 0.9278 0\n";
let molecule = Molecule::from_xyz_str(xyz, 0.0)?;
let gradient = run_gradient(&molecule, Method::Cndo2, &NddoOptions::default())?;
let hessian = run_hessian(&molecule, Method::Cndo2, &NddoOptions::default())?;
println!("{} eV; {} Cartesian coordinates", gradient.energy_ev, hessian.hessian.rows);
# Ok::<(), xndo_rs::XndoError>(())
Use run_method for the unified fixed-geometry dispatcher and
methods_for_api for programmatic capability discovery.
Python and ASE
import xndo_rs
z = [8, 1, 1]
xyz = [[0.0, 0.0, 0.0], [0.9584, 0.0, 0.0], [-0.2400, 0.9278, 0.0]]
result = xndo_rs.single_point(z, xyz, method="mndo")
gradient = xndo_rs.gradient(z, xyz, method="cndo2")
hessian = xndo_rs.hessian(z, xyz, method="mindo3")
optimized = xndo_rs.optimize(z, xyz, method="indo", gtol=2.0e-3)
states = xndo_rs.excited_states(z, xyz, method="zindo/s", n_states=5)
uv_vis = xndo_rs.uv_vis_spectrum(z, xyz, n_states=10)
state_gradients = xndo_rs.excited_state_gradients(z, xyz, n_states=5)
state_hessians = xndo_rs.excited_state_hessians(z, xyz, n_states=5)
from ase import Atoms
from xndo_rs.ase import XNDO
atoms = Atoms(numbers=z, positions=xyz)
atoms.calc = XNDO(method="mndo")
print(atoms.get_potential_energy())
print(atoms.get_forces())
Python coordinates and ASE positions are Angstrom. Returned dictionary keys carry units in their names. ASE uses eV and Angstrom conventions.
ref.: A. H. Larsen et al., "The atomic simulation environment - a Python library for working with atoms," J. Phys.: Condens. Matter 29, 273002 (2017), doi:10.1088/1361-648X/aa680e.
CLI
xndo_rs_cli methods
xndo_rs_cli energy examples/water.xyz --method mndo
xndo_rs_cli gradient examples/water.xyz --method mndod
xndo_rs_cli hessian examples/water.xyz --method cndo2
xndo_rs_cli optimize examples/water.xyz --method mindo3 --opt-gtol 2e-3
xndo_rs_cli uv-vis examples/water.xyz --method zindo/s --states 10
xndo_rs_cli excited-gradient examples/water.xyz --method zindo/s --states 5
xndo_rs_cli excited-hessian examples/water.xyz --method zindo/s --states 5
See docs/methods.md, docs/parameter-provenance.md,
docs/parameter-search.md, and docs/oracles.md for exact scope and evidence.
License
The library is GPL-3.0-or-later. Retained upstream notices and data licenses
are recorded in THIRD_PARTY_NOTICES.md and third_party/.
Metadata
Release files for xndo-rs-python 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| xndo_rs_python-0.3.0.tar.gz | 559.5 kB | Without provenance | Details for xndo_rs_python-0.3.0.tar.gz |
Release files / xndo_rs_python-0.3.0.tar.gz
| Download URL | xndo_rs_python-0.3.0.tar.gz |
|---|---|
| Size | 559.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a57a01d5b2a9f7ea55aa4a1410702574bb01dc9fd5c2ac0ac18a5e6bcdfea961
|
|
BLAKE2b-256 checksum How to use checksums |
86dd0bda217a95f97b0148533a44128c5fc9a3b24e459c18fa0458c11c84fc56
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.9
|
Security for xndo-rs-python 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.