Overview
VQE (Variational Quantum Eigensolver) implementation for finding molecular ground state energies using the UCCSD (Unitary Coupled Cluster Singles and Doubles) ansatz.Core Functions
uccsd()
state: Initial quantum state (typically Hartree-Fock)thetas: Variational parameters arraysingles: Single excitation indices[(occ, virt), ...]doubles: Double excitation indices[(o1, o2, v1, v2), ...]backend: Physics backend for time evolutionrunner: Circuit execution function
- θ = 0: Returns identity (no change to state)
- Singles: CNOT ladder + RY(2θ) rotation on virtual orbital
- Doubles: Givens rotation in 2-electron excitation subspace
- Particle number: Always conserved
prepare_hf()
mol: Molecule data withn_electronsandn_qubitsfactory: State factory for initializationbackend: Physics backend
n_electrons qubits in |1⟩, rest in |0⟩
Example:
UCCSD Ansatz Details
Single Excitations
For each single excitation (occupied orbitalo → virtual orbital v):
- Apply CNOT ladder from
otov-1 - Apply RY gate:
RY(v, 2θ) - Reverse CNOT ladder from
v-1too
Double Excitations
For each double excitation (occupied orbitalso1, o2 → virtual orbitals v1, v2):
- Identify occupied and virtual qubits from current state
- Select pivot qubit (first virtual)
- Apply CNOT chain to entangle
- Apply RY rotation:
RY(pivot, 2θ) - Reverse CNOT chain
Parameter Mapping
Parameters are indexed sequentially:- Indices
[0 : n_singles): Single excitation amplitudes - Indices
[n_singles : n_singles + n_doubles): Double excitation amplitudes
Excitation Generation
_sd_indices()
n_e: Number of electrons (occupied orbitals)n_q: Number of qubits (total spin-orbitals)
singles: List of (occupied, virtual) pairsdoubles: List of (occ1, occ2, virt1, virt2) quadruplets
Energy Evaluation
ExactJWEnergy Class
Exact energy evaluator using Jordan-Wigner Hamiltonian. Constructor:call()
amps: State amplitudes(2^n, 2, G, G)or(2^n, 2)
- Normalize state:
|ψ⟩ → |ψ⟩/||ψ|| - For each Pauli term
(c, P)in Hamiltonian:- Apply Pauli operator:
|φ⟩ = P|ψ⟩ - Accumulate:
E += c * ⟨ψ|φ⟩
- Apply Pauli operator:
- Add nuclear repulsion:
E += E_nuc
_apply()
amps: State amplitudes(2^n, 2)pauli: List of(qubit_index, pauli_op)wherepauli_op ∈ {"X", "Y", "Z"}
- X: Bit flip + identity phase
- Y: Bit flip + i*phase (depends on bit value)
- Z: Phase flip (no bit flip)
Optimization Workflow
VQESolver.run() Implementation
-
Initialization
-
Identity Check
-
Parameter Scan (initial guess)
-
Optimization
-
Final Evaluation
Optimization Parameters
L-BFGS-B Settings
- method:
"L-BFGS-B"(Limited-memory BFGS with box constraints) - maxiter:
200(default, configurable) - ftol:
1e-8(function tolerance) - gtol:
1e-7(gradient tolerance) - eps:
1e-5(finite difference step for gradient)
Convergence Criteria
- Energy change: |E(n+1) - E(n)| <
ftol - Gradient norm: ||∇E|| <
gtol - Max iterations: Reached
maxiter
VQEResult Output
Attributes
String Representation
Example: Complete VQE Run
Performance Characteristics
Scaling
| Molecule | Electrons | Qubits | Parameters | Iterations | Time (CPU) |
|---|---|---|---|---|---|
| H2 | 2 | 4 | 5 | 30-50 | 5-10 min |
| LiH | 4 | 12 | 44 | 100-200 | 30-60 min |
| H2O | 10 | 14 | 84 | 200-400 | 2-4 hours |
Accuracy
- Chemical accuracy: < 1.6 mHa (1 kcal/mol)
- Typical error: 1e-5 to 1e-6 Ha
- Correlation captured: > 99%
Troubleshooting
Identity Check Fails
Slow Convergence
Symptoms: > 200 iterations without convergence Solutions:- Reduce
ftolto1e-6 - Use better initial guess from parameter scan
- Check for numerical instabilities in state evolution
Energy Below FCI
Symptoms:vqe_energy < fci_energy
Cause: Numerical error in Hamiltonian or state norm
Solution: Increase normalization precision, verify Hamiltonian terms