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).

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.1.0.post1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

qufold-0.1.0.post1-cp313-cp313-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

qufold-0.1.0.post1-cp313-cp313-macosx_10_13_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

qufold-0.1.0.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

qufold-0.1.0.post1-cp312-cp312-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

qufold-0.1.0.post1-cp312-cp312-macosx_10_13_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

qufold-0.1.0.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

qufold-0.1.0.post1-cp311-cp311-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

qufold-0.1.0.post1-cp311-cp311-macosx_10_9_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

qufold-0.1.0.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

qufold-0.1.0.post1-cp310-cp310-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

qufold-0.1.0.post1-cp310-cp310-macosx_10_9_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

File details

Details for the file qufold-0.1.0.post1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for qufold-0.1.0.post1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 806705154c65509f45027843e381c2b1c2853b24d73753f2e3f8897a40bdf9cb
MD5 d49208a0cea5fca85f623e85eeaf138f
BLAKE2b-256 64212562e2536781372af9ab61dd61a8405f483eca2bfe31d0010afda8b9f9fe

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.1.0.post1-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.1.0.post1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for qufold-0.1.0.post1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 33151c772c6a82fd45aa2d8985cd8698a18b9fd5a1cf062ebe51d66b0409bfec
MD5 10c30366cfec6e23339ee4677a9ebf1b
BLAKE2b-256 0932dc679bc9ce40d1ebd117e0c1c9544be78377a146be3cee6833c8ffbb2354

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.1.0.post1-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.1.0.post1-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for qufold-0.1.0.post1-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 b199050461e42f80b366a7a6fbf875a77bd12c18a44b3610051560c5a1e28b36
MD5 0db627b1b1de291a525280534066fc55
BLAKE2b-256 a187f54bd7ec376b77673e0e505b1ab6edaf0b8c5db6f64eb39e790140e070dc

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.1.0.post1-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.1.0.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for qufold-0.1.0.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d19638e071c8f13ea89a7b05f1ae6d9f263213ccedb011d90a38e55be805b77b
MD5 a2aa311eed1727df0a75cb5402286023
BLAKE2b-256 889152b1cf62c5847acb076310bca5575da453c1630f413567bef225eaa90894

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.1.0.post1-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.1.0.post1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for qufold-0.1.0.post1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2e4a497b90729c334dee67ec5e8a49a004067e0d9581b893f6eac9cb06c8929b
MD5 3cba616374fc9eea77886d4318e5984e
BLAKE2b-256 1afe7790c06889901f459e399c17877dc5da7bf4d894feb4c21678db141a3b1f

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.1.0.post1-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.1.0.post1-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for qufold-0.1.0.post1-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 31b34c48b9495ee04ed3f9200299d37b40b760c1bfe59c20064e5debc772c49b
MD5 955ee94283666ac1e842aff18c8fe734
BLAKE2b-256 cbd0c8bc4eeaf74afd69e56b635640c30bdc1579076b6b112efe4c0f2c1619b1

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.1.0.post1-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.1.0.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for qufold-0.1.0.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9ed44f6c4db17b0e91ee646060c7dc22aa339c2131bd381c983ea8a29a175858
MD5 be8212f079606b50b37af2f3b6b5d483
BLAKE2b-256 a033883bf217199736bd86b0f2188b265b9b60d9895057d2fa65fa8025f726f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.1.0.post1-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.1.0.post1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for qufold-0.1.0.post1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e26335fba5e39b1e8e70c57c44ce0d464af3ba2c3e306b5108cd71926bb93d49
MD5 ff3ed27c8b0adb3508e2a033f919f836
BLAKE2b-256 2c2af402a2b4193da443d2d70f4f5ceeca6a1d87167e95a9795ba56fcf08ee96

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.1.0.post1-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.1.0.post1-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for qufold-0.1.0.post1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 66a6a49d5d204954d7600ddd23d53d5c0464da48f44f9c47d489bf874f5891d6
MD5 228247ad6ea3ed333736ca58108c1990
BLAKE2b-256 1659d4f206ae43d57757fe671320addf24daaab03ba6a27bf71d500922b62c84

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.1.0.post1-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.1.0.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for qufold-0.1.0.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8453e3a2a116b8c416297f9e43cbf2306133a0dfbec002073272205ce839576a
MD5 bc564049cc7b1b27fb44a56b0092e9db
BLAKE2b-256 1516a276b608b6ed173c5cf6fe1b4761fe4a6f3758ec21244ae48e7cc5fef6e1

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.1.0.post1-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.1.0.post1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for qufold-0.1.0.post1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 decc6b0716404b69c230e2c9139af402afcae2bd815c86873de216e466afd3c7
MD5 e9b5987ae7f6b865910a77cb81009df6
BLAKE2b-256 cd7ebfef24fd9d2ad503fffcb46eca9329b705a14ed7ef5500faeb23588b76c0

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.1.0.post1-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.1.0.post1-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for qufold-0.1.0.post1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1c11f91865a3f32d9f2bf74b9898c9329f66ee4534075fbf9f7f86c8dff2015c
MD5 5d7d83876dc562ba7b633e9397511f23
BLAKE2b-256 7c528d8e4ae892839f02ec382b13338bc824a9285338b9e3dc3c43f4e8e56171

See more details on using hashes here.

Provenance

The following attestation bundles were made for qufold-0.1.0.post1-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