SQD pour l'estimation de l'énergie d'un Hamiltonien de chimie
Dans cette leçon, nous allons appliquer SQD pour estimer l'énergie de l'état fondamental d'une molécule.
En particulier, nous aborderons les sujets suivants en utilisant l'approche en étapes de Qiskit :
- Étape 1 : Mapper le problème sur des circuits quantiques et des opérateurs
- Configurer le Hamiltonien moléculaire pour .
- Expliquer l'ansatz de Jastrow à cluster unitaire local (LUCJ), compatible avec le matériel et inspiré de la chimie [1]
- Étape 2 : Optimiser pour le matériel cible
- Optimiser le nombre de portes et la disposition de l'ansatz pour l'exécution matérielle
- Étape 3 : Exécuter sur le matériel cible
- Exécuter le circuit optimisé sur un vrai QPU pour générer des échantillons du sous-espace.
- Étape 4 : Post-traiter les résultats
- Présenter la boucle de récupération de configuration auto-cohérente [2]
- Post-traiter l'ensemble complet des échantillons de chaînes de bits, en utilisant la connaissance a priori du nombre de particules et l'occupation orbitale moyenne calculée lors de la dernière itération.
- Créer de manière probabiliste des lots de sous-échantillons à partir des chaînes de bits récupérées.
- Projeter et diagonaliser le Hamiltonien moléculaire sur chaque sous-espace échantillonné.
- Sauvegarder l'énergie minimale de l'état fondamental trouvée parmi tous les lots et mettre à jour l'occupation orbitale moyenne.
- Présenter la boucle de récupération de configuration auto-cohérente [2]
Nous utiliserons plusieurs packages logiciels tout au long de la leçon.
PySCFpour définir la molécule et configurer le Hamiltonien.- Le package
ffsimpour construire l'ansatz LUCJ. Qiskitpour transpiler l'ansatz en vue de l'exécution matérielle.Qiskit IBM Runtimepour exécuter le circuit sur un QPU et collecter des échantillons.Qiskit addon SQDpour la récupération de configuration et l'estimation de l'énergie de l'état fondamental par projection sur sous-espace et diagonalisation matricielle.
1. Mapper le problème sur des circuits quantiques et des opérateurs
Hamiltonien moléculaire
Un Hamiltonien moléculaire prend la forme générique suivante :
/ sont les opérateurs de création/annihilation fermioniques associés au -ième élément de la base et au spin . et sont les intégrales électroniques à un et deux corps. En utilisant pySCF, nous allons définir la molécule et calculer les intégrales à un et deux corps du Hamiltonien pour la base 6-31g.
# Added by doQumentation — required packages for this notebook
!pip install -q ffsim matplotlib numpy pyscf qiskit qiskit-addon-sqd qiskit-ibm-runtime
import warnings
import pyscf
import pyscf.cc
import pyscf.mcscf
warnings.filterwarnings("ignore")
# Specify molecule properties
open_shell = False
spin_sq = 0
# Build N2 molecule
mol = pyscf.gto.Mole()
mol.build(
atom=[["N", (0, 0, 0)], ["N", (1.0, 0, 0)]], # Two N atoms 1 angstrom apart
basis="6-31g",
symmetry="Dooh",
)
# Define active space
n_frozen = 2
active_space = range(n_frozen, mol.nao_nr())
# Get molecular integrals
scf = pyscf.scf.RHF(mol).run()
num_orbitals = len(active_space)
n_electrons = int(sum(scf.mo_occ[active_space]))
num_elec_a = (n_electrons + mol.spin) // 2
num_elec_b = (n_electrons - mol.spin) // 2
cas = pyscf.mcscf.CASCI(scf, num_orbitals, (num_elec_a, num_elec_b))
mo = cas.sort_mo(active_space, base=0)
hcore, nuclear_repulsion_energy = cas.get_h1cas(mo) # hcore: one-body integrals
eri = pyscf.ao2mo.restore(1, cas.get_h2cas(mo), num_orbitals) # eri: two-body integrals
# Compute exact energy for comparison
exact_energy = cas.run().e_tot
converged SCF energy = -108.835236570774
CASCI E = -109.046671778080 E(CI) = -32.8155692383188 S^2 = 0.0000000
Dans cette leçon, nous utiliserons la transformation de Jordan-Wigner (JW) pour mapper une fonction d'onde fermionique sur une fonction d'onde de qubits, afin qu'elle puisse être préparée à l'aide d'un circuit quantique. La transformation JW mappe l'espace de Fock des fermions dans M orbitales spatiales sur l'espace de Hilbert de 2M qubits : une orbitale spatiale est divisée en deux orbitales de spin, l'une associée à un électron de spin haut () et l'autre au spin bas (). Une orbitale de spin peut être occupée ou inoccupée. En général, quand on parle du nombre d'orbitales, on utilise le nombre d'orbitales spatiales. Le nombre d'orbitales de spin sera le double. Dans les circuits quantiques, nous représentons chaque orbitale de spin par un qubit. Ainsi, un ensemble de qubits représente les orbitales spin-haut ou , et un autre ensemble représente les orbitales spin-bas ou . Par exemple, la molécule avec la base 6-31g a orbitales spatiales (soit + = orbitales de spin). Nous aurons donc besoin d'un circuit quantique à qubits (nous pourrions avoir besoin de qubits ancilla supplémentaires, comme discuté plus tard). Les qubits sont mesurés dans la base computationnelle pour générer des chaînes de bits, qui représentent des configurations électroniques ou des déterminants (de Slater). Tout au long de cette leçon, nous utiliserons indifféremment les termes chaînes de bits, configurations et déterminants. Les chaînes de bits nous indiquent l'occupation des électrons dans les orbitales de spin : un à une position de bit signifie que l'orbitale de spin correspondante est occupée, tandis qu'un signifie que l'orbitale de spin est vide. Comme les problèmes de structure électronique conservent le nombre de particules, seul un nombre fixe d'orbitales de spin doit être occupé. La molécule possède électrons spin-haut () et électrons spin-bas (). Ainsi, toute chaîne de bits représentant les orbitales et doit avoir cinq chacune pour la molécule .
1.1 Circuit quantique pour la génération d'échantillons : l'ansatz LUCJ
Dans cette leçon, nous utiliserons l'ansatz de Jastrow à cluster unitaire local (LUCJ) \[1\] pour la préparation d'état quantique et l'échantillonnage ultérieur. Nous expliquerons d'abord les différents blocs constitutifs de l'ansatz UCJ complet et les approximations effectuées dans sa version locale. Ensuite, en utilisant le package ffsim, nous construirons l'ansatz LUCJ et l'optimiserons avec le transpileur Qiskit pour l'exécution matérielle.
L'ansatz UCJ a la forme suivante (pour un produit de couches ou répétitions de l'opérateur UCJ) :
où est un état de référence, typiquement pris comme l'état de Hartree-Fock (HF). Comme l'état Hartree-Fock est défini en occupant les orbitales de plus faible indice, la préparation de l'état HF impliquera d'appliquer des portes X pour mettre à un les qubits correspondant aux orbitales occupées. Par exemple, le bloc de préparation de l'état HF pour 4 orbitales spatiales et 2 spins haut et 2 spins bas peut ressembler à ceci :
Une seule répétition de l'opérateur UCJ