HI-VQE Chemistry – Eine Qiskit Function von Qunova Computing
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit-ibm-catalog qiskit-ibm-runtime
# This cell is hidden from users
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
instance = service.active_account()["instance"]
backend_name = service.least_busy(operational=True, min_num_qubits=16).name
Qiskit Functions sind ein experimentelles Feature, das ausschließlich Nutzerinnen und Nutzern des IBM Quantum® Premium Plan, Flex Plan und On-Prem (über die IBM Quantum Platform API) Plan zur Verfügung steht. Sie befinden sich im Preview-Release-Status und können sich noch ändern.
Überblick
In der Quantenchemie befasst sich das Problem der Elektronenstruktur mit der Lösung der elektronischen Schrödinger-Gleichung – also der Quantenwellenfunktionen, die das Verhalten der Elektronen im System beschreiben. Diese Wellenfunktionen sind Vektoren komplexer Amplituden, wobei jede Amplitude dem Beitrag einer möglichen Elektronenkonfiguration entspricht.
Der Grundzustand ist die Wellenfunktion niedrigster Energie des Systems und hat bei der Untersuchung molekularer Systeme eine besondere Bedeutung. Der genaueste Ansatz zur Berechnung des Grundzustands berücksichtigt alle möglichen Elektronenkonfigurationen, wird aber für größere Systeme schnell unlösbar, da die Anzahl der Konfigurationen exponentiell mit der Systemgröße wächst.
Der Handover Iterative Variational Quantum Eigensolver (HI-VQE) ist eine innovative hybride Quanten-klassische Methode zur genauen Schätzung des Grundzustands molekularer Systeme. Er verbindet Quantenhardware mit klassischem Computing: Quantenprozessoren erkunden effizient Kandidaten-Elektronenkonfigurationen, während die resultierende Wellenfunktion auf klassischen Rechnern berechnet wird. Durch die Erzeugung kompakter, aber chemisch genauer Wellenfunktionen fördert HI-VQE Forschung und Entdeckungen in der Quantenchemie und Materialwissenschaft.
HI-VQE reduziert die Rechenkomplexität des Elektronenstrukturproblems, indem es den Grundzustand effizient und mit hoher Genauigkeit schätzt. Der Fokus liegt auf einer sorgfältig ausgewählten Teilmenge der relevantesten Elektronenkonfigurationen, was sowohl Genauigkeit als auch Effizienz optimiert.
Durch die Kombination der Stärken klassischer und Quantenrechner verfeinert HI-VQE iterativ die aktuelle Schätzung der Wellenfunktion. Seine einzigartigen Techniken zur Teilraumkonstruktion machen die Konfigurationsauswahl effizienter, sodass Nutzerinnen und Nutzer mehr Rechenkontrolle und verbesserte Genauigkeit in Quantenchemiesimulationen erhalten.
Wenn du den Algorithmus eingehender kennenlernen möchtest, kannst du das zugehörige Forschungspapier lesen.
Beschreibung
Die Anzahl der Elektronenkonfigurationen eines molekularen Systems wächst exponentiell mit der Systemgröße. Bei bestimmten elektronischen Zuständen, wie dem Grundzustand, tragen jedoch häufig nur wenige Konfigurationen wesentlich zur Energie des Zustands bei. Methoden der ausgewählten Konfigurationswechselwirkung (Selected Configuration Interaction, SCI) nutzen diese Spärlichkeit, um Rechenkosten zu senken, indem sie die relevantesten Konfigurationen identifizieren und auf sie fokussieren. Diese Teilmenge der Konfigurationen wird als Teilraum (Subspace) bezeichnet.
HI-VQE nutzt die inhärente Effizienz von Quantencomputern bei der Darstellung molekularer Systeme, um die Teilraumsuche zu unterstützen. Es verbindet klassische und Quanten-Subroutinen, um das Elektronenstrukturproblem mit hoher Genauigkeit zu lösen. Im Gegensatz zu bestehenden Quanten-SCI-Methoden kombiniert HI-VQE Variationstraining, iterative Teilraumkonstruktion und Vordiagonalisierungs-Konfigurations-Screening, um die Effizienz durch Reduzierung von Quantenmessungen, Iterationen und klassischen Diagonalisierungskosten zu steigern. HI-VQE kann daher auf größere molekulare Systeme angewendet werden, die mehr Qubits benötigen, und senkt die Kosten zur Lösung eines Problems gegebener Größe auf denselben Genauigkeitsgrad.

Um den Grundzustand eines Systems zu berechnen, verwendet HI-VQE zunächst das klassische Chemiepaket PySCF, um aus nutzergegebenen Eingaben – wie der Molekülgeometrie und weiteren molekularen Informationen – eine molekulare Darstellung zu erzeugen. Anschließend tritt es in eine hybride Quanten-klassische Optimierungsschleife ein, die iterativ einen Teilraum verfeinert, um den Grundzustand optimal darzustellen und gleichzeitig die Anzahl der enthaltenen Konfigurationen zu minimieren. Die Schleife läuft bis Konvergenzkriterien – wie Teilraumgröße oder Energiestabilität – erfüllt sind; danach werden die berechnete Grundzustandswellenfunktion und Energie ausgegeben. Diese Ergebnisse können genutzt werden, um genaue Potentialenergieflächen zu konstruieren und weitere Analysen des Systems durchzuführen.
Die Optimierungsschleife konzentriert sich darauf, die Parameter eines Quantum Circuits anzupassen, um einen hochwertigen Teilraum zu erzeugen. HI-VQE bietet drei Quantum Circuit-Optionen: excitation_preserving, efficient_su2 und LUCJ. Die Optimierung wird nahe dem Hartree-Fock-Referenzzustand initialisiert, da dieser sich allgemein gut eignet. Der Circuit wird dann auf einem Quantengerät ausgeführt und Konfigurationen werden aus dem resultierenden Quantenzustand gesampelt, bevor sie als binäre Zeichenketten zurückgegeben werden. Aufgrund von Quantengeräterauschen können einige gesampelte Konfigurationen physikalisch ungültig sein und die Elektronenzahl oder den Spin nicht erhalten. HI-VQE begegnet diesem Problem mit dem Konfigurationswiederherstellungsprozess aus dem qiskit-addon-sqd-Paket, sodass Nutzerinnen und Nutzer ungültige Konfigurationen entweder korrigieren oder verwerfen können.
Die gültigen Konfigurationen durchlaufen dann einen optionalen Screening-Schritt, um jene zu entfernen, die voraussichtlich nur minimal beitragen. Dies reduziert die Dimension des Teilraums und senkt dadurch die Kosten des Diagonalisierungsschritts. Wenn das Screening aktiviert ist, wird ein vorläufiger Teilraum-Hamiltonoperator aus den gültigen Konfigurationen aufgebaut und eine Diagonalisierung mit sehr lockeren Abbruchkriterien durchgeführt. Obwohl die Genauigkeit der resultierenden Amplituden für jede Konfiguration gering ist, eignet sie sich gut dafür vorherzusagen, welche Konfigurationen in dieser Iteration aus dem Teilraum herausgelassen werden sollen – und sie ist schnell zu berechnen.
Die ausgewählten Konfigurationen werden dem Teilraum hinzugefügt und der Hamiltonoperator des Systems in diesen Teilraum projiziert. Der Teilraum wird iterativ aktualisiert und behält dabei die relevantesten Konfigurationen über Iterationen hinweg. Dieser Ansatz unterscheidet sich von alternativen Methoden, da der Quantum Circuit nicht bei jedem Schritt den vollständigen Grundzustand approximieren muss.
Anschließend wird der Teilraum-Hamiltonoperator klassisch diagonalisiert, um den niedrigsten Eigenwert und den zugehörigen Eigenvektor zu erhalten – eine Approximation des Grundzustands und seiner Energie. Da sich die Qualität des Teilraums durch die Iterationen verbessert, nähert sich der berechnete Grundzustand immer mehr dem wahren Grundzustand an. In diesem Schritt kann ein zusätzlicher Screening-Schritt durchgeführt werden, um Konfigurationen aus dem Teilraum zu entfernen, die keinen wesentlichen Beitrag zum berechneten Grundzustand leisten. Dieser Schritt stellt sicher, dass der in die nächste Iteration übergehende Teilraum so kompakt wie möglich ist. Die Bewertung erfolgt anhand der Amplituden aus der Diagonalisierung, da diese den Wichtigkeitsbeitrag jeder Konfiguration zum berechneten Grundzustand darstellen.
Eine Konvergenzprüfung stellt dann fest, ob weiteres Training die Ergebnisse verbessern würde. Falls ja, wird ein optionaler klassischer Erweiterungsschritt durchgeführt, die Parameter des Quantum Circuits werden aktualisiert, um die berechnete Energie weiter zu minimieren, und der Prozess wiederholt sich. Der klassische Erweiterungsschritt erzeugt zusätzliche Konfigurationen für den Teilraum und ergänzt damit die vom Quantengerät gesampelten Konfigurationen. Dabei wird zunächst die Konfiguration mit der größten Amplitude in den Diagonalisierungsergebnissen identifiziert, bevor neue Konfigurationen mit einfachen und doppelten Anregungen aus der identifizierten Konfiguration generiert werden. Die gewünschte Anzahl dieser Konfigurationen wird dann dem Teilraum hinzugefügt.
Sobald festgestellt wird, dass die Iterationen konvergiert sind, gibt HI-VQE den berechneten Grundzustand (in Form der Zustände im Teilraum und ihrer Amplituden in der Grundzustandswellenfunktion), seine Energie und ein Energievarianzmaß zurück, das angibt, ob der berechnete Zustand einen Eigenzustand des Hamiltonoperators des Systems bildet.
Nutzerinnen und Nutzer können den verwendeten Quantum Circuit und die Anzahl der Shots pro Quantum Circuit wählen sowie die Teilraumgröße steuern oder die klassische Generierung zusätzlicher Konfigurationen aktivieren, um die quantengenerierten Konfigurationen zu ergänzen. Auf diese Weise lässt sich das Verhalten von HI-VQE an die jeweiligen Anwendungsfälle anpassen.
Erste Schritte
Zuerst beantrage Zugang zur Function. Authentifiziere dich dann mit deinem IBM Quantum® API-Schlüssel und – vorausgesetzt, du hast dein Konto bereits in deiner lokalen Umgebung gespeichert – wähle die Qiskit Function wie folgt aus:
import reprlib
from qiskit_ibm_catalog import QiskitFunctionsCatalog
catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")
function = catalog.load("qunova/hivqe-chemistry")
Eingaben
Die folgende Tabelle zeigt alle Eingabeparameter, die die Function akzeptiert. Die nachfolgenden Abschnitte Moleküloptionen und HI-VQE-Optionen gehen auf diese Argumente näher ein.
| Name | Typ | Beschreibung | Erforderlich | Standard | Beispiel |
|---|---|---|---|---|---|
| geometry | Union[List[List[Union[str, Tuple[float, float, float]]]], str] | Kann entweder eine Zeichenkette oder strukturierte Listen mit Atom-Koordinaten-Paaren sein. Als Zeichenkette muss es eine Molekülgeometrie im kartesischen Koordinatenformat sein. Als Liste sollte es eine Liste von Listen sein, die jeweils eine Atom-Zeichenkette und ein Koordinatentupel enthalten. | Ja | N/A | [['O', (0, 0, 0)], ['H', (0, 1, 0)], ['H', (0, 0, 1)]] oder "O 0 0 0; H 0 1 0; H 0 0 1" |
| backend_name | str | Name des Backends, an das die Anfrage gestellt wird. | Ja | N/A | ibm_fez |
| max_states | int | Die maximale Teilraumdimension für die Diagonalisierung. Wenn die Zahl kein vollständiges Quadrat ist, werden weniger Zustände verwendet. | Ja | N/A | 100 |
| max_expansion_states | int | Die maximale Anzahl klassisch generierter CI-Zustände, die in jeder Iteration einbezogen werden. | Ja | N/A | 10 |
| molecule_options | dict | Optionen zum Molekül, das als Eingabe für HI-VQE dient. Weitere Details im Abschnitt Moleküloptionen. | Nein | Siehe Abschnitt Moleküloptionen. | {"basis": "sto3g", "unit": "angstrom" } |
| hivqe_options | dict | Optionen zur Steuerung des HI-VQE-Algorithmus. Weitere Details im Abschnitt HI-VQE-Optionen. | Nein | Siehe Abschnitt HI-VQE-Optionen. | {"shots": 10_000, "max_iter": 10 } |
Moleküloptionen
Die folgende Tabelle beschreibt alle Schlüssel und Werte, die im Dictionary molecule_options gesetzt werden können, sowie ihre Datentypen und Standardwerte. Alle Schlüssel sind optional.
| Schlüssel | Werttyp | Standardwert | Gültiger Bereich | Erklärung |
|---|---|---|---|---|
"charge" | int | 0 | Verschiedene | Eine ganze Zahl, die die Gesamtnettoladung des Molekülsystems angibt. Der Standardwert ist 0; es kann jedoch jede ganze Zahl verwendet werden. |
"basis" | str | 'sto-3g' | Verschiedene | Eine Zeichenkette, die den Basistyp angibt; diese werden an pyscf übergeben. (z. B.: "sto-3g", "3-21g", "6-31g", "cc-pvdz") |
"active_orbitals" | List[int] | Alle Orbitalindizes. | Die räumlichen Orbitalindizes, die für das Problem gültig sind. | Eine Liste aktiver Orbitalindizes im Intervall [0, n), wobei n die Anzahl der im Problem verwendeten Qubits ist. Wenn dies angegeben wird, muss auch das Argument frozen_orbitals angegeben werden. |
"frozen_orbitals" | List[int] | Keine Indizes. | Die räumlichen Orbitalindizes, die für das Problem gültig sind, ausschließlich der aktiven Orbitale. | Eine Liste eingefrorener Orbitalindizes im gleichen Bereich wie active_orbitals. Falls angegeben, muss auch active_orbitals angegeben werden. Beachte, dass nur besetzte Orbitale eingefroren werden sollten, da die Anzahl aktiver Elektronen um 2 für jedes eingefrorene besetzte Orbital reduziert wird. |
"orbital_coeffs" | List[List[float]] | Hartree-Fock-Molekülorbitale. | Verschiedene. | Die Koeffizienten für die räumlichen Orbitale, die bei der Berechnung der elektronischen Abstoßungsintegrale des Systems verwendet werden. Gültige Beispiele sind Hartree-Fock-Molekülorbitale, natürliche Orbitale und AVAS-Orbitale. |
"symmetry" | Union[str, bool] | False | True oder False | Wird verwendet, um Punktgruppensymmetrie für die anfänglichen Molekülberechnungen zu aktivieren und so die symmetrieangepasste Orbitalbasis zu konstruieren. Diese symmetrieangepassten Orbitale dienen als Basisfunktionen für die nachfolgenden SCF-Berechnungen. Der Standardwert ist False; bei True wird sie aktiviert und beliebige Punktgruppen werden automatisch erkannt und verwendet. Wenn eine bestimmte Symmetrie angegeben wird, z. B. symmetry = "Dooh", wird ein Fehler ausgelöst, wenn die Molekülgeometrie diese erforderliche Symmetrie nicht aufweist. |
"symmetry_subgroup" | Optional[str] | None | Siehe pyscf-Dokumentation. | Kann verwendet werden, um eine Untergruppe der erkannten Symmetrie zu erzeugen. Hat keinen Effekt, wenn die Symmetrie über das Schlüsselwortargument symmetry angegeben wird. |
"unit" | str | "angstrom" | Siehe pyscf-Dokumentation. | Gibt die Maßeinheit für Atomkoordinaten und Abstände an. Standard ist Angström. |
"nucmod" | Optional[Union[dict, str]] | None | Siehe pyscf-Dokumentation. | Gibt das Kernmodell an. Standardmäßig wird das Punktkernmodell verwendet; andere Werte aktivieren das Gaußsche Kernmodell. Wird eine Funktion übergeben, wird sie mit dem Gaußschen Kernmodell verwendet, um den Wert der Kernladungsverteilung 'zeta' zu generieren. |
"pseudo" | Optional[Union[dict, str]] | None | Siehe pyscf-Dokumentation. | Gibt das Pseudopotential für die Atome im Molekül an. Standardmäßig None, d. h. es werden keine Pseudopotentiale angewandt und alle Elektronen werden explizit in den Berechnungen berücksichtigt. |
"cart" | bool | False | Siehe pyscf-Dokumentation. | Gibt an, ob kartesische GTOs als Drehimpuls-Basisfunktionen in der Berechnung verwendet werden sollen. Der Standardwert False verwendet sphärische GTOs. |
"magmom" | Optional[List[Union[int, float]]] | None | Siehe pyscf-Dokumentation. | Setzt das kolineare Spin-magnetische Moment jedes Atoms. Standardmäßig None; jedes Atom wird mit einem Spin von null initialisiert. |
"avas_aolabels" | Optional[List[str]] | None | z. B. ["H 1s", "O 2p"] für H2O | Definiert die im AVAS-Schema einzubeziehenden Atomorbitale. Siehe AVAS-Dokumentation. |
"avas_threshold" | float | 0.2 | Zwischen 0.0 und 2.0 | Gibt den Schwellenwert an, mit dem bestimmt wird, welche Atomorbitale (AOs) im aktiven Raum beibehalten werden. |
"noons_level" | Optional[str] | None | "mp2" oder "ccsd" | Definiert den theoretischen Ansatz zur Erzeugung natürlicher Orbitale und zur Auswahl aktiver Orbitale basierend auf dem NOONs-Schema (Natural Orbital Occupation Numbers). Siehe NOONs-Dokumentation. Sowohl die Indizes der aktiven als auch der eingefrorenen Orbitale müssen angegeben werden, um die Anzahl der Orbitale (und Qubits) zu steuern. |
HI-VQE-Optionen
Die folgende Tabelle beschreibt alle Schlüssel und Werte, die im Dictionary hivqe_options gesetzt werden können, sowie ihre Datentypen und Standardwerte. Alle Schlüssel sind optional.
| Schlüssel | Werttyp | Standardwert | Gültiger Bereich | Erklärung |
|---|---|---|---|---|
"shots" | int | 1_000 | Zwischen 1 und 10 000. | Anzahl der Shots, die pro Iteration auf dem Quantengerät verwendet werden. |
"max_iter" | int | 25 | Zwischen 1 und 50. | Die maximale Anzahl an Iterationen zur Optimierung des Ansatzes. Der Algorithmus kann bei frühzeitiger Konvergenz weniger Iterationen verwenden. |
"initial_basis_states" | List[str] | Der Hartree-Fock-Zustand. | Binäre Zeichenketten, deren Bitanzahl mit der erforderlichen Qubit-Anzahl für das Problem übereinstimmt. | Kann verwendet werden, um den Algorithmus mit klassischen Zuständen aus einem früheren Ergebnis neu zu starten. |
"ansatz" | str | "epa" | "epa", "hea" oder "lucj" | Gibt den Quanten-Ansatz an, der zur Erzeugung neuer Zustände optimiert wird. "epa" wählt den anregungserhaltenden Ansatz. "hea" wählt den hardwareeffizienten Ansatz. "lucj" wählt den Local Unitary Cluster Jastrow Ansatz. |
"convergence_count" | int | 3 | Mindestens 2. | Die Anzahl der Iterationen ohne wesentliche Änderung der berechneten Energie, die verstreichen müssen, bevor der Algorithmus als konvergiert gilt. |
"convergence_abstol" | float | 1e-4 | Größer als 0 und höchstens 1. | Der Betrag der Änderung der berechneten Energie, der für Konvergenzprüfungen als wesentlich gilt. |
"reset_convergence_count" | bool | True | True oder False | Bei True müssen die convergence_count-Iterationen aufeinanderfolgen, ohne dass eine wesentliche Änderung sie unterbricht. Bei False stoppt der Algorithmus nach convergence_count unwesentlichen Änderungen, die an beliebigen Punkten während des Optimierungsprozesses aufgetreten sein können. |
"configuration_recovery" | bool | True | True oder False. | Gibt an, ob die Konfigurationswiederherstellung aus dem qiskit-addon-sqd-Paket verwendet werden soll. Bei True werden vom Quantengerät gesampelte ungültige Zustände klassisch korrigiert. Bei False werden sie verworfen. |
"ansatz_entanglement" | str | "circular" | Eines von "linear", "reverse_linear", "pairwise", "circular", "full" oder "sca". Bei Verwendung des "lucj"-Ansatzes ist auch "lucj_default" möglich. | Gibt das Verschränkungsschema an, das im Quantum Circuit verwendet werden soll, gemäß den gängigen Qiskit- und ffsim-Konventionen für den LUCJ-Ansatz. |
"ansatz_reps" | int | 2 | Größer als 0. | Die Anzahl der Wiederholungen jeder Schicht im Quantum Circuit. |
"amplitude_screening_tolerance" | Union[float,int] | 0 | Mindestens 0 und kleiner als 1. | Der Toleranzwert für die Entscheidung, welche Zustände nach der Diagonalisierung aus dem Teilraum herausgefiltert werden sollen. Er gibt den Einschlussschwellenwert für Teilraumzustände basierend auf ihren berechneten Amplituden an. |
"overlap_screening_tolerance" | float | 1e-2 | Zwischen 1e-4 und 1e-1, inklusive. | Der Toleranzwert für die Vorhersage, welche Zustände vor der Diagonalisierung aus dem Teilraum herausgefiltert werden sollen. Er steuert die Genauigkeit der vorhergesagten Amplituden für jeden Zustand; ein kleinerer Wert ergibt genauere Vorhersagen. |
Ausgaben
Die Function gibt ein Dictionary mit vier Schlüsseln und Werten zurück. Die Schlüssel und Werte sind in der folgenden Tabelle dokumentiert:
| Schlüssel | Werttyp | Erklärung |
|---|---|---|
"energy" | float | Die approximierte Grundzustandsenergie des Moleküls. |
"states" | List[str] | Die ausgewählten Determinanten, die den Teilraum zur Energielösung bilden. Sie liegen im abwechselnden Alpha-Beta-Format vor. |
"eigenvector" | List[float] | Der Eigenvektor, der dem Grundzustand des aus "states" zusammengesetzten Teilraums entspricht. |
"energy_variance" | float | Die Energievarianz des Grundzustands des aus "states" zusammengesetzten Teilraums; gibt einen Hinweis auf die Lösungsqualität. Der Wert ist nicht-negativ; ein kleinerer Wert bedeutet, dass der Grundzustand des Teilraums einen Eigenzustand des Hamiltonoperators des Systems besser approximiert. |
"energy_history" | List[float] | Die in jeder Iteration des hybriden Optimierungsprozesses berechneten Energien in der Reihenfolge ihrer Berechnung. Pro Iteration werden im Rahmen des SPSA-Optimierungsprozesses zwei Energien berechnet. |
Beispiel
Das erste Beispiel zeigt, wie die Grundzustandsenergie eines NH3-Moleküls mit dem HI-VQE-Algorithmus berechnet wird.
Molekülgeometrie und Optionen definieren
Die Molekülgeometrie von NH3 wird mit kartesischen Koordinaten angegeben, getrennt durch ";" für jedes Atom.
# Define the molecule geometry
geometry = """
N -0.85188 -0.02741 0.03141;
H 0.16545 0.00593 -0.01648;
H -1.16348 -0.39357 -0.86702;
H -1.16348 0.94228 0.06281;
"""
Weitere Optionen können für das Molekülsystem im folgenden Dictionary-Format definiert und übergeben werden.
# Configure some options for the job.
molecule_options = {"basis": "sto3g"}
hivqe_options = {"shots": 100, "max_iter": 20}
Führe die Function mit den Geometrie- und Optionseingaben aus.
# Run HI-VQE
job = function.run(
geometry=geometry,
# `backend_name` is the name of a backend with at least 16 qubits, for example, "ibm_marrakesh".
backend_name=backend_name,
max_states=2000,
max_expansion_states=10,
molecule_options=molecule_options,
hivqe_options=hivqe_options,
)
Es ist empfehlenswert, die Job-ID der Function auszugeben, damit sie bei Support-Anfragen angegeben werden kann, falls etwas schiefgeht.
print("Job ID:", job.job_id)
Job ID: 128ee399-7cfc-4be2-91e9-c4abd22b97c7
In diesem Beispiel werden 16 Qubits mit 8 Orbitalen der sto3g-Basis für ein NH3-Molekül verwendet. Überprüfe den Status deiner Qiskit Function-Arbeitslast oder rufe die Ergebnisse wie folgt ab:
print(job.status())
QUEUED
Nach Abschluss des Jobs können die Ergebnisse mit der result()-Instanz abgerufen werden.
result = job.result()
# Output can be long, so we display a shortened representation
shortened_result = reprlib.repr(result)
print(shortened_result)
{'eigenvector': [0.9824200343205695, 0.009520846167419264, 6.365368845740147e-08, 3.6832123006425615e-07, 0.0012869941182066654, 2.3403891050875465e-05, ...], 'energy': -55.521146537970466, 'energy_history': [-55.52091922342852, -55.52113695367561, -55.521146537970466, -55.52114653864798, -55.521146537970466, -55.521146537970466, ...], 'energy_variance': 9.788555455342562e-12, ...}
Um auf die Grundzustandsenergie zuzugreifen, verwende den Schlüssel "energy". Der Schlüssel "eigenvector" liefert die CI-Koeffizienten mit entsprechender Bitstring-Notation der Elektronenkonfiguration, die unter "states" der Ergebnisse gespeichert ist.
fci_energy = -55.521148034704126 # the exact energy using FCI method
hivqe_energy = result["energy"]
print(
f"|Exact Energy - HI-VQE Energy|: {abs(fci_energy - hivqe_energy) * 1000} mHa"
)
print(f"Sampled Number of States: {len(result['states'])}")
|Exact Energy - HI-VQE Energy|: 0.0014967336596782843 mHa
Sampled Number of States: 1936
Ausgabe:
|Exact Energy - HI-VQE Energy|: 0.077237504 mHa Sampled Number of States: 1936
Leistung
Dieser Abschnitt zeigt die nachgewiesenen Benchmark-Berechnungen von HI-VQE mit einem 24-Qubit-Fall für Li2S, einem 40-Qubit-Fall für ein N2-Molekül und einem 44-Qubit-Fall für ein FeP-NO-System.
Dissoziations-Potentialenergieflächenkurve für ein Li2S-Molekül mit 24 Qubits
Die PES-Kurve wird mit der FCI-Referenz und dem Startwert aus RHF zusammen mit dem Energiefehler gegenüber der FCI-Referenz gezeigt.

Die Berechnungen wurden mit den folgenden Geometrien und Optionen durchgeführt.
# This cell is hidden from users
backend_name = service.least_busy(operational=True, min_num_qubits=38).name
# Define Li2S geometries
Li2S_geoms = {
"Li2S_1.51": "S -1.239044 0.671232 -0.030374;Li -1.506327 0.432403 -1.498949;Li -0.899996 0.973348 1.826768;",
"Li2S_2.40": "S -1.741432 0.680397 0.346702;Li -0.529307 0.488006 -1.729343;Li -1.284307 0.989409 2.177209;",
"Li2S_3.80": "S -2.707255 0.674298 0.909161;Li 0.079218 0.552012 -1.671656;Li -0.927010 0.931502 1.557063;",
}
# Configure some options for the job.
molecule_options = {
"basis": "sto3g",
}
hivqe_options = {
"shots": 100,
"max_iter": 20,
}
results = []
for geom in ["Li2S_1.51", "Li2S_2.40", "Li2S_3.80"]:
# Run HI-VQE
job = function.run(
geometry=Li2S_geoms[geom],
backend_name=backend_name, # can use any device with at least 38 qubits
max_states=2000,
max_expansion_states=10,
molecule_options=molecule_options,
hivqe_options=hivqe_options,
)
results.append(job.result())
Die roten Punkte stellen die HI-VQE-Berechnungsergebnisse für sechs verschiedene Geometrien dar; drei Geometrien entsprechend 1,51, 2,40 und 3,80 Ångström sind als Eingabe in der obigen Zelle angegeben.
Dissoziations-PES-Kurve für ein N2-Molekül mit 40 Qubits
Das Stickstoffmolekül wurde als Multireferenzsystem mit großen Korrelationsenergiebeträgen über den Hartree-Fock-Zustand hinaus identifiziert. Wir haben eine Benchmark-Berechnung für das N2-Molekül mit cc-pvdz-Basis, (20o,14e) unter Verwendung der homo-lumo aktiven Orbitalauswahl durchgeführt. Die vollständige aktive Raumzahl (CAS), um dieses Problem darzustellen, beträgt 6.009.350.400. Es ist nicht möglich, die Eigenwertaufgabe (für Energie und Elektronenstruktur) mit dieser Anzahl von Zuständen auf einem leistungsstarken Desktop-Rechner (16 CPU/64 GB) zu lösen. Mit HI-VQE können Nutzerinnen und Nutzer den Teilraum der CAS-Zustände effizient durchsuchen, um chemisch genaue Ergebnisse zu erzielen und dabei Rechenressourcen erheblich einzusparen. Die folgenden Diagramme zeigen die PES-Kurve der 40-Qubit-HI-VQE-Berechnung der N2-Moleküldissoziation.

Dissoziations-PES-Kurve für fünffach koordiniertes Eisen(II)-Porphyrin mit einem NO-System mit 44 Qubits
Ein weiteres interessantes chemisches System ist ein Eisen(II)-Porphyrin-Komplex (FeP) mit einem koordinierten Stickstoffmonoxid-Liganden (NO), der ein biologisch relevantes Metalloporphyrinsystem darstellt und in verschiedenen physiologischen Prozessen eine entscheidende Rolle spielt. In diesem Beispiel wurde HI-VQE verwendet, um die genaue Potentialenergieflächenkurve der intermolekularen Wechselwirkung zwischen FeP und NO (Grundzustandsenergie für unterschiedlich separierte Geometrien) zu schätzen. Das kombinierte System hat 450 Orbitale und 202 Elektronen (450o,202e) mit 6-31g(d)-Basis insgesamt. Die homo-lumo aktive Orbitalauswahl wurde verwendet, um den kleineren Fall aus dem realen Fall mit (22o,22e) zu berechnen. Aus den folgenden Benchmark-Ergebnissen konnten wir die chemische Genauigkeit (> 1,6 mHa) mit einer hochmodernen klassischen Computerchemie-Berechnung der CASCI(DMRG) (22o,22e)-Referenz erreichen.

Benchmarks
- Die exakte Matrixgröße ist die Anzahl der Determinanten für die exakte Lösung, z. B. FCI und CASCI.
- HI-VQE sampelt und berechnet den Teilraum davon (d. h. die HI-VQE-Matrixgröße).
- Die Gesamtzeit umfasst die QPU-Laufzeit und Qiskit Function-Läufe mit CPU.
- Die Genauigkeit wird aus der Energiedifferenz zur exakten Lösung geschätzt.
| Chemisches System | Anzahl der Qubits | Exakte Matrixgröße | HI-VQE Matrixgröße | E(diff) zur exakten (mHa) | Anzahl der Iterationen | Gesamtzeit | QPU-Laufzeit |
|---|---|---|---|---|---|---|---|
| (8o,10e) | 16 | 3136 | 1936 | 0.08 | 6 | 37 s | 34 s |
| (10o,10e) | 20 | 63504 | 3969 | 0.60 | 5 | 250 s | 50 s |
| (15o,10e) | 30 | 9018009 | 49729 | 0.90 | 5 | 354 s | 54 s |
| (16o,14e) | 32 | 130873600 | 1798281 | 1.10 | 9 | 6531 s | 121 s |
| (18o,24e) | 36 | 344622096 | 399424 | 0.90 | 24 | 5174 s | 130 s |
| (20o,14e) | 40 | 6009350400 | 9012004 | 1.20 | 21 | 46547 s | 258 s |
Fehlermeldungen abrufen
Wenn deine Arbeitslast fehlschlägt, ist der Status ERROR und der Aufruf von job.result() löst eine Ausnahme aus:
job = function.run(
geometry="invalid-geometry", # This will cause an error
backend_name=backend_name,
max_states=2000,
max_expansion_states=15,
molecule_options=molecule_options,
hivqe_options=hivqe_options,
)
job.result()
job.status()
'ERROR'
Support erhalten
Du kannst eine E-Mail an qiskit.support@qunovacomputing.com senden, um Hilfe zu dieser Function zu erhalten.
Wenn du Hilfe bei der Fehlerbehebung eines bestimmten Fehlers benötigst, gib bitte die Function Job-ID des Jobs an, bei dem der Fehler aufgetreten ist.
Nächste Schritte
- Beantrage Zugang zur Function, indem du dieses Formular ausfüllst.
- Probiere das Tutorial Compute dissociation PES curve for FeP-NO with HI-VQE aus.
- Lies Pellow-Jarman, A., et al. (2025). HIVQE: Handover Iterative Variational Quantum Eigensolver for Efficient Quantum Chemistry Calculations. arXiv preprint arXiv:2503.06292.
- Probiere das Tutorial Dissociation PES curves with Qunova HiVQE aus.