Snižování hloubky Circuit pomocí zpětné propagace operátorů
Zpětná propagace operátorů je technika, při které se operace z konce kvantového Circuit absorbují do Pauliho operátoru. Obecně to vede ke snížení hloubky Circuit za cenu většího počtu členů v operátoru. Cílem je zpětně propagovat co největší část Circuit, aniž by operátor příliš narostl.
Jedním ze způsobů, jak umožnit hlubší zpětnou propagaci do obvod a zároveň zabránit nadměrnému růstu operátoru, je zkrácení (truncation) členů s malými koeficienty namísto jejich přidávání do operátoru. Zkrácení členů může vést k menšímu počtu kvantových Circuit ke spuštění, avšak způsobuje určitou chybu ve výsledném výpočtu střední hodnoty úměrnou velikosti koeficientů zkrácených členů. V tomto tutoriálu implementujeme Qiskit vzor pro simulaci kvantové dynamiky Heisenbergova spinového řetězce pomocí zpětné propagace operátorů:
-
Krok 1: Mapování na kvantový problém
- Namapování časově vyvíjeného Hamiltoniánu na kvantový Circuit
-
Krok 2: Optimalizace problému
-
Rozdělení Circuit na řezy (slices)
- Zpětná propagace řezů z Circuit na Pauliho pozorovatelnou
-
Sloučení zbývajících řezů do jediného Circuit
-
Transpilace Circuit pro Backend
-
-
Krok 3: Provádění experimentů
- Výpočet střední hodnoty pomocí redukovaného Circuit a rozšířené pozorovatelné se StatevectorEstimator pro jednoduchost v tomto notebooku
-
Krok 4: Rekonstrukce výsledků
- Netýká se.
Poznámka: Qiskit volně popisuje vrstvy jako oddíly Circuit o hloubce 1 napříč všemi qubit. Tento balíček používá termín řezy (slices) pro vrstvy libovolné hloubky. Funkce qiskit_addon_obp.backpropagate je navržena tak, aby zpětně propagovala celé řezy najednou, takže volba způsobu dělení kvantového Circuit může mít zásadní vliv na to, jak dobře zpětná propagace funguje pro daný problém. O řezech se dozvíš více níže.
Krok 1: Mapování na kvantový problém
Mapování časového vývoje kvantového Heisenbergova modelu na kvantový experiment.
Balíček qiskit_addon_utils poskytuje znovupoužitelné funkcionality pro různé účely.
Jeho modul qiskit_addon_utils.problem_generators obsahuje funkce pro generování Hamiltoniánů podobných Heisenbergovým na zadaném grafu propojení. Tento graf může být buď rustworkx.PyGraph, nebo CouplingMap, což usnadňuje použití v pracovních postupech orientovaných na Qiskit.
V následujícím příkladu nejprve vygenerujeme CouplingMap ve tvaru heavy-hex, z nějž vyřízneme lineární řetězec 10 qubitů. Všimni si, že indexy nové reduced_coupling_map jsou opět číslovány od nuly.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"numpy": "numpy", "qiskit": "qiskit", "qiskit_addon_obp": "qiskit-addon-obp", "qiskit_addon_utils": "qiskit-addon-utils", "qiskit_ibm_runtime": "qiskit-ibm-runtime", "rustworkx": "rustworkx"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit.transpiler import CouplingMap
coupling_map = CouplingMap.from_heavy_hex(3, bidirectional=False)
# Choose a 10-qubit linear chain on this coupling map
reduced_coupling_map = coupling_map.reduce([0, 13, 1, 14, 10, 16, 5, 12, 8, 18])
from rustworkx.visualization import graphviz_draw
graphviz_draw(reduced_coupling_map.graph, method="circo")
Dále vygenerujeme Pauliho operátor modelující Heisenbergův XYZ Hamiltonián.
undefined