Skip to main content

Fermionic Hamiltonian downfolding (CFU/UCC/PUCC/CCSD) and projective quantum eigensolvers (PQE), input-file driven.

Project description

qufold

Fermionic Hamiltonian downfolding + projective quantum eigensolvers, driven by a single Q-Chem-style input file.

qufold builds compact, accurate effective active-space Hamiltonians from a full electronic-structure problem, so that the expensive part of a quantum simulation (qubitized QPE, FCI, a projective eigensolver) runs on a small, strongly-correlated active space instead of the full orbital set. Its flagship method is CFUClosed-Form Unitary downfolding — which applies a sequence of exact single-generator unitary similarity transforms to the Hamiltonian before projecting the external orbitals onto Hartree–Fock. "Closed-form" means each rotation e^{-θA} H e^{θA} is evaluated exactly (no Baker–Campbell–Hausdorff truncation), so every step is rigorously unitary and norm-preserving.

You write one text file and run one command:

qufold examples/cfu/h4_cfu.in

The architecture is deliberately layered so the physics is auditable and the performance is swappable: every method is written once against a small operator-algebra interface (commutator, multiply, similarity_transform, rotate_single, hf_expectation, gradient, optimal_theta) and then runs unchanged on three interchangeable backends — a transparent reference implementation, a fast compiled C++ kernel, and a GPU Majorana kernel.


Status

qufold is research software under active development (alpha). All five methods run end-to-end on the openfermion reference backend and the fast cpu (C++ kernel) backend, with identical results; the gpu (CuPy Majorana) backend is wired against the same contract but has not yet been validated on GPU hardware (it imports cleanly and, when no GPU is present, transparently falls back to the reference backend). The table below is an honest map of what runs today.

Methods × backends

Method openfermion (reference) cpu (C++ kernel) gpu (CuPy Majorana)
cfu — Closed-Form Unitary ✅ implemented ✅ implemented ✅ kernel-validated¹
ucc — Double Unitary CC ✅ implemented ✅ implemented ✅ kernel-validated¹
pucc — Projective UCC ✅ implemented ✅ implemented ✅ kernel-validated¹
ccsd_downfold — non-unitary CCSD ✅ implemented ✅ implemented ✅ kernel-validated¹
pqe — Projective Quantum Eigensolver ✅ implemented ✅ implemented ✅ kernel-validated¹

Legend: ✅ implemented = runs and is validated. The cpu backend reproduces the openfermion reference bit-for-bit on the operator algebra and gives identical energies on every method. ✅ kernel-validated¹ = the gpu backend's CuPy Majorana algebra (product/commutator/transform — the GPU-specific code) was checked on an NVIDIA H100 to match the numpy reference to machine precision (max|Δ| ≈ 1e-16); since the method orchestration above it is backend-agnostic shared code (already validated on openfermion/cpu), the GPU path is correct. No method is a stub — every method is implemented; only unsupported options (e.g. PUCC triples, pucc_order≠2) raise a clear error. Requesting gpu with no GPU/CuPy present falls back to openfermion with a warning rather than crashing.

¹ GPU env caveat: running a full method end-to-end in one GPU process additionally needs openfermion and cupy installed together, which currently conflicts — openfermion's cirq dependency pins numpy<2 while CuPy needs numpy≥2. This is an environment-packaging issue (not a code bug); the GPU kernel is validated independently of it. Use the cpu backend for full runs until the env split is resolved.

Why keep the reference backend front-and-centre? It is the auditable truth: each primitive maps one-to-one to the math via OpenFermion/NumPy. The cpu (pybind11 fermionic kernel, ~7–10× faster on normal-ordered commutators/products) and gpu (CuPy bit-packed Majorana kernel — operators as 128-bit bitmasks, products are XOR + popcount) backends are validated against it.

Validation snapshot

  • Exact downfold: the K=0 (no-transform) downfold → FCI reproduces the full FCI / PySCF CASCI to ~1e-12 Ha — the active-space projection itself is exact, so any recovery comes from the transforms, not approximation.
  • CFU on H4 recovers ~87 % of the CASSCF→FCI correlation gap.
  • All five methods run end-to-end on H4 CAS(2,2) on both the openfermion and cpu backends, giving identical energies (e.g. CFU −2.14068, PUCC −2.16049, CCSD-downfold −2.16536 on both backends).
  • cpu backend reproduces the reference operator algebra bit-for-bit (commutator max|Δ| = 0).
  • gpu backend (CuPy Majorana kernel) validated on an NVIDIA H100: product and commutator match the numpy reference to max|Δ| ≈ 1e-16.
  • Test suite: 25/25 pytest passing (parser, downfold-exactness, CFU).

Solvers, truncation & extrapolation (new in 0.2.0)

The downfolded (and full, un-downfolded) Hamiltonian can be solved beyond exact FCI, and the CFU transform can be truncated by a controllable error budget:

  • DMRG solver (downfold_solver = dmrg, requires qufold[dmrg] → block2): solves active spaces too large for sparse FCI, with arbitrary operator body rank, over a general spin-orbital MPO.
  • Discarded-weight extrapolation (dmrg_extrapolate, several dmrg_bond_dims): linear E(δϵ) → E(0) fit with a reported 95 % CI — the standard route to the DMRG complete-basis limit.
  • Full-space DMRG reference (solve_full_dmrg): an independent DMRG solve of the un-downfolded active Hamiltonian, for benchmarking the downfolding gap.
  • Budget truncation (trunc_criterion = budget, trunc_budget): drops the smallest terms up to a cumulative-ℓ1 cap per transform, so the discarded operator obeys ‖ΔH‖ ≤ budget (triangle bound) — a rigorous, far more effective knob than the flat per-term trunc_eps threshold.
  • Fastest path: the cpu backend's pybind11 C++ kernel (fast_comm/fast_mul, ~7–10× over pure NumPy) is the default fast route for production-scale transforms.

Install

qufold works out of the box with only the reference backend's dependencies (NumPy, SciPy, OpenFermion, PySCF):

pip install qufold                 # reference (openfermion) backend
pip install "qufold[cpu]"          # + compile the bundled C++ fermionic kernel
pip install "qufold[gpu]"          # + GPU Majorana backend (needs CuPy/CUDA)
pip install "qufold[pqe]"          # + QForte bridge for the PQE methods
pip install "qufold[dev]"          # + tests / docs / build tooling

From source (development):

git clone https://github.com/mjangrou/qufold
cd qufold
pip install -e ".[dev]"

The fast cpu backend ships its compiled kernel as package data (qufold/_vendor/*.so); public wheels carry a prebuilt kernel so most users never compile anything (see Distribution model below).


Quickstart

# 1. activate an environment with the deps (see Install)
# 2. run the bundled H4 CFU example
qufold examples/cfu/h4_cfu.in
# 3. read the result block printed to stdout (reference energy, downfolded
#    energy, recovery in mHa, generator count, trajectory)
# 4. or drive it programmatically:
python -c "import qufold; print(qufold.run_calculation('examples/cfu/h4_cfu.in').energy)"

The input file ($molecule / $rem)

A calculation is fully specified by one human-friendly, Q-Chem/Psi4-flavoured keyword file: a $molecule block (geometry + charge/multiplicity) and a $rem ("remarks") keyword block. Lines are keyword value; # starts a comment; sections are $section … $end.

$molecule
0 1                          # charge  spin-multiplicity
H   0.0000  0.0000  0.0000
H   0.0000  0.0000  0.7400
H   0.0000  0.0000  2.0000
H   0.0000  0.0000  2.7400
$end

$rem
method        cfu            # cfu | ucc | pucc | ccsd_downfold | pqe
backend       openfermion    # openfermion | cpu | gpu
basis         sto-3g
active_space  full           # avas | manual | full
orbital_opt   true           # CASSCF-optimize before downfolding
n_generators  40             # CFU: number of greedy-ADAPT steps K
generator_pool ccsd_screened # screened doubles (singles excluded by design)
pool_tol      1e-3
solve_fci     true           # exactly diagonalize the downfolded Hamiltonian
$end

Every keyword — its type, default, allowed values, and a one-paragraph help string — lives in qufold/input/keywords.py, the single source of truth from which the keyword reference (docs/keywords.md) is generated, so the manual can never drift from the code.


How it fits together

input file  ─►  Calculation  ─►  Problem (SCF / active space / CASSCF-OO)
            ─►  Method.run(backend)  ─►  Result  ─►  analysis (FCI, λ)  ─►  output
  • qufold/input/ — parser + keyword registry (the manual-in-code).
  • qufold/core/Problem builder (hamiltonian.py), CC amplitudes and the screened-doubles generator pool (amplitudes.py), FCI / LCU-1-norm analysis (analysis.py).
  • qufold/methods/ — thin orchestration over backend primitives. Each method subclasses Method and sets name=<keyword>. CFU is the worked template (cfu.py).
  • qufold/backends/ — the operator algebra. base.py is the contract; openfermion_backend.py is the reference impl; registry.py selects with graceful failover.
  • qufold/downfold/ — the backend-independent Majorana-space projection (projector.downfold_to_active(H, problem)), exact for any body rank.
  • qufold/drivers/driver.py — top-level orchestration (the CLI calls this; also the programmatic qufold.run_calculation).

Operators cross every API boundary as a plain dict FermionOp = { ((p,1),(q,0),…): complex } (OpenFermion term convention, 1 = creation, 0 = annihilation), so methods stay backend-agnostic even when a backend uses a faster internal representation (e.g. Majorana bitmasks).


Documentation

  • docs/keywords.md — the full keyword reference (generated from qufold/input/keywords.py).
  • docs/methods/ — the theory and contract for each method (CFU, UCC, PUCC, CCSD downfolding, PQE).
  • docs/tutorials/ — worked end-to-end examples.
  • examples/ — ready-to-run input files (examples/cfu/h4_cfu.in, …).
  • CONTRIBUTING.md — how to add a method, a keyword, or a backend.

Distribution model

qufold is developed in a private repository and released publicly as source-hidden binary wheels on PyPI for tagged versions. Every module — including the package __init__ files — is Cython-compiled to a platform .so and the original .py is excluded from the wheel, so the published package contains no readable Python source and no .pyc bytecode, only symbol-stripped machine code plus the compiled C++ kernel. pip install qufold then gives users the full functionality (and the fast cpu backend) without a compiler and without the source.

This is the strongest practical obfuscation for a pip package: recovering the original Python from a Cython .so is impractical (it is compiled C, not bytecode). It is not cryptographic secrecy — any runnable executable can in principle be reverse-engineered — but it defeats casual reading and decompilation.

The .github/workflows/wheels.yml pipeline builds these compiled wheels with cibuildwheel across Linux/macOS/Windows × CPython 3.10–3.13 on every vX.Y.Z tag and publishes them to PyPI via Trusted Publishing (no API token). Wheels only — no source distribution (sdist) is ever published, since an sdist would ship the source. (Trade-off: users on a platform/Python without a matching wheel cannot install; the wheel matrix is kept broad to cover common setups.) See setup.py for the build and .github/workflows/wheels.yml for the one-time PyPI Trusted-Publisher setup.


Citation

If qufold is useful in your work, please cite it (a CITATION.cff will ship with the first tagged release). Authors: Mohammad Reza Jangrouei, Artur F. Izmaylov.

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

qufold-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

qufold-0.2.0-cp313-cp313-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

qufold-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

qufold-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

qufold-0.2.0-cp312-cp312-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

qufold-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

qufold-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

qufold-0.2.0-cp311-cp311-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

qufold-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

qufold-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

qufold-0.2.0-cp310-cp310-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

qufold-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

File details

Details for the file qufold-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for qufold-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7f4451a698ecc570db237a0dc7e9178f6078f7f1bef52af89c3fe0cf9653deca
MD5 4b603da84cf0ee77573d5bb421e1326a
BLAKE2b-256 d8bb053bff5952afb1c42fcb61c3297f664838e8e222eb214696008781724cd3

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: wheels.yml on mrJangrouei/qufold

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qufold-0.2.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for qufold-0.2.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 683b8299aa367b4bbe9d0943f63ed4ac13d77d886ced823b2f2c9ac7dfb2fb6a
MD5 e9717e62d1e90fc566ec51284a6171d0
BLAKE2b-256 ac0b8e6f05dce82c9db4ffdafc582dd7c29fd2ae824037ee78cb718fe3a01d02

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.2.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: wheels.yml on mrJangrouei/qufold

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qufold-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for qufold-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 68e3dc35ca8b14d467f3037e2dc075d80c3f3796a54eeb857f160b4629d0be64
MD5 ca3b2ba0a354b7f7954623e569930043
BLAKE2b-256 bdb8c5cd2c3a4c3921b8bf55192ce2e2be04c09ebd563a013eb081b6437ef770

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl:

Publisher: wheels.yml on mrJangrouei/qufold

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qufold-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for qufold-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 12672e2a7e49c399ee582eed8daf20665f7af579b42681cfa3470e16dcff8f6d
MD5 d01a8657eafebc9a768a1d181ed3bb0e
BLAKE2b-256 db0dbacb1f170bddc38cd7b9b44e943618a5ba0a3b093989155d8c06f9fb9da9

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: wheels.yml on mrJangrouei/qufold

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qufold-0.2.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for qufold-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7a7c62d74208947faaff058c61784b235cf4e5f8a461ef4dbfa62dd839f48df0
MD5 29a493a4f615b37a76d8e4dd25dd5224
BLAKE2b-256 b9a9a1e9e1826178eaf2b77e8484113b98c3392af4e8fdd1d31792c1eec0a341

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.2.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: wheels.yml on mrJangrouei/qufold

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qufold-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for qufold-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 bb779dd691bc0747322e0f0bfcbd7322799e0daf2f83766cf884df11152ab33c
MD5 2bc009906a5ee401c9b80c45fdf8683a
BLAKE2b-256 32e2cd38a7578676d3d41de9c8c5898221d0c97ef18c8a7a8b33b6df1383214d

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl:

Publisher: wheels.yml on mrJangrouei/qufold

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qufold-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for qufold-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 afbfba1d36dc94ef8a909188558953af8f7d0b032e2213c36ccf755b242540ba
MD5 179be454609ce75cb2ca50a965dd54a8
BLAKE2b-256 0401d5649cc42fa14681253fab1d92b1abd539e58463f28576981dc5189e68ca

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: wheels.yml on mrJangrouei/qufold

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qufold-0.2.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for qufold-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7998fc18776b0d90cee714e0a95f7ff791dfbf3c008ef52f4c0abd54b56c35e9
MD5 32ba4d5af7775a4ebddbb494f1092a87
BLAKE2b-256 d50acca974de153f6c4d0993fd416fc650868cce7b334443256a5f7ccf7f2654

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.2.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: wheels.yml on mrJangrouei/qufold

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qufold-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for qufold-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 204dd7e8de488c85de1f6cacb2aa99ff0fdf21c2bd53e020f2671549bcdbf3e8
MD5 63e2b1fc8a969a74fa5c2b75f3fafa68
BLAKE2b-256 934192ea053920eb0759901b9e14b3b343e8e997a87eda86a37c7d33547519fb

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl:

Publisher: wheels.yml on mrJangrouei/qufold

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qufold-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for qufold-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c5e7130841c698a9ea67600ec30e6a0fc27506b10f4750bf432c3bc722739c18
MD5 817cbec16064d87b2e71df35f18202ae
BLAKE2b-256 9a644f451a213ff6caf87e5bc126a5a2205b86d61acca9dc9db3e4f1fc0180fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: wheels.yml on mrJangrouei/qufold

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qufold-0.2.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for qufold-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6351f7cdeb38ee1641fe4894e830847d8271a3d511c5654dc4495179cecdb28e
MD5 812555d5e0bd1479ba676b8c02d4a072
BLAKE2b-256 7a46a754fd5194bb27ec58b99a2fc955e91658957e30bce426030b8506c1c871

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.2.0-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: wheels.yml on mrJangrouei/qufold

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qufold-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for qufold-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 df218701ae88bcc1caf8ff7c5774b613b771c5353352df0d9b2593d1e7ee8736
MD5 824ddc26c72bae88a2cb8b2fab6e02e7
BLAKE2b-256 53c3fd24a555cab0e10ddc5e3ce5c2128f3315b11901bd2dc6cb4f300eb2a822

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl:

Publisher: wheels.yml on mrJangrouei/qufold

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page