Přibližná kvantová kompilace pro obvody časového vývoje
Odhadovaná náročnost: pět minut na procesoru Eagle (POZNÁMKA: Jedná se pouze o odhad. Skutečná doba běhu se může lišit.)
Pozadí
Tento tutoriál ukazuje, jak implementovat přibližnou kvantovou kompilaci pomocí tenzorových sítí (AQC-Tensor) s Qiskit pro zlepšení výkonu kvantových obvodů. AQC-Tensor aplikujeme v kontextu Trotterizovaného časového vývoje, abychom snížili hloubku obvodu při zachování přesnosti simulace — v souladu s frameworkem Qiskit pro přípravu stavů a optimalizaci. Naučíš se, jak vytvořit nízko-hloubkový ansatz Circuit z počátečního Trotter obvodu, optimalizovat ho pomocí tenzorových sítí a připravit ho pro spuštění na kvantovém hardwaru.
Primárním cílem je simulovat časový vývoj modelového hamiltoniánu se sníženou hloubkou obvodu. K tomu slouží doplněk AQC-Tensor pro Qiskit, qiskit-addon-aqc-tensor, který využívá tenzorové sítě — konkrétně stavy maticových součinů (MPS) — ke kompresi a optimalizaci počátečního obvodu. Iterativními úpravami komprimovaný ansatz Circuit zachovává věrnost původnímu obvodu a zároveň zůstává proveditelný na near-term kvantovém hardwaru. Další podrobnosti najdeš v příslušné dokumentaci a jednoduchém příkladu pro začátek.
Přibližná kvantová kompilace je obzvláště výhodná v kvantových simulacích, které překračují dobu koherence hardwaru, protože umožňuje provádět složité simulace efektivněji. Tento tutoriál tě provede nastavením pracovního postupu AQC-Tensor v Qiskit, včetně inicializace hamiltoniánu, generování Trotter obvodů a transpilace finálního optimalizovaného obvodu pro cílové zařízení.
Požadavky
Před zahájením tohoto tutoriálu se ujisti, že máš nainstalováno následující:
- Qiskit SDK v1.0 nebo novější s podporou vizualizace
- Qiskit Runtime v0.22 nebo novější (
pip install qiskit-ibm-runtime) - Doplněk AQC-Tensor pro Qiskit (
pip install 'qiskit-addon-aqc-tensor[aer,quimb-jax]')
Nastavení
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-addon-aqc-tensor qiskit-addon-utils qiskit-ibm-runtime quimb rustworkx scipy
import numpy as np
import quimb.tensor
import datetime
import matplotlib.pyplot as plt
from scipy.optimize import OptimizeResult, minimize
from qiskit.quantum_info import SparsePauliOp, Pauli
from qiskit.transpiler import CouplingMap
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit import QuantumCircuit
from qiskit.synthesis import SuzukiTrotter
from qiskit_addon_utils.problem_generators import (
generate_time_evolution_circuit,
)
from qiskit_addon_aqc_tensor.ansatz_generation import (
generate_ansatz_from_circuit,
)
from qiskit_addon_aqc_tensor.objective import MaximizeStateFidelity
from qiskit_addon_aqc_tensor.simulation.quimb import QuimbSimulator
from qiskit_addon_aqc_tensor.simulation import tensornetwork_from_circuit
from qiskit_addon_aqc_tensor.simulation import compute_overlap
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import EstimatorV2 as Estimator
from rustworkx.visualization import graphviz_draw
Část I. Malý příklad
První část tohoto tutoriálu používá malý příklad s 10 uzly, aby ilustrovala proces mapování kvantového simulačního problému na spustitelný kvantový Circuit. Zde prozkoumáme dynamiku modelu XXZ s 10 uzly, což nám umožní sestavit a optimalizovat zvládnutelný kvantový Circuit před přechodem na větší systémy.
Model XXZ je v fyzice hojně studován pro zkoumání spinových interakcí a magnetických vlastností. Hamiltonián nastavíme s otevřenými okrajovými podmínkami a interakcemi závislými na poloze uzlu mezi sousedními uzly v řetězci.
Hamiltonián modelu a pozorovatelná
Hamiltonián pro náš model XXZ s 10 uzly je definován jako:
kde je náhodný koeficient odpovídající hraně a je počet uzlů.
Simulací vývoje tohoto systému se sníženou hloubkou obvodu získáme přehled o tom, jak AQC-Tensor využívat ke kompresi a optimalizaci obvodů.
Nastavení hamiltoniánu a pozorovatelné
Než namapujeme náš problém, musíme nastavit mapu propojení (coupling map), hamiltonián a pozorovatelnou pro model XXZ s 10 uzly.
# L is the number of sites, also the length of the 1D spin chain
L = 10
# Generate the coupling map
edge_list = [(i - 1, i) for i in range(1, L)]
# Generate an edge-coloring so we can make hw-efficient circuits
even_edges = edge_list[::2]
odd_edges = edge_list[1::2]
coupling_map = CouplingMap(edge_list)
# Generate random coefficients for our XXZ Hamiltonian
np.random.seed(0)
Js = np.random.rand(L - 1) + 0.5 * np.ones(L - 1)
hamiltonian = SparsePauliOp(Pauli("I" * L))
for i, edge in enumerate(even_edges + odd_edges):
hamiltonian += SparsePauliOp.from_sparse_list(
[
("XX", (edge), Js[i] / 2),
("YY", (edge), Js[i] / 2),
("ZZ", (edge), Js[i]),
],
num_qubits=L,
)
# Generate a ZZ observable between the two middle qubits
observable = SparsePauliOp.from_sparse_list(
[("ZZ", (L // 2 - 1, L // 2), 1.0)], num_qubits=L
)
print("Hamiltonian:", hamiltonian)
print("Observable:", observable)
graphviz_draw(coupling_map.graph, method="circo")
Hamiltonian: SparsePauliOp(['IIIIIIIIII', 'IIIIIIIIXX', 'IIIIIIIIYY', 'IIIIIIIIZZ', 'IIIIIIXXII', 'IIIIIIYYII', 'IIIIIIZZII', 'IIIIXXIIII', 'IIIIYYIIII', 'IIIIZZIIII', 'IIXXIIIIII', 'IIYYIIIIII', 'IIZZIIIIII', 'XXIIIIIIII', 'YYIIIIIIII', 'ZZIIIIIIII', 'IIIIIIIXXI', 'IIIIIIIYYI', 'IIIIIIIZZI', 'IIIIIXXIII', 'IIIIIYYIII', 'IIIIIZZIII', 'IIIXXIIIII', 'IIIYYIIIII', 'IIIZZIIIII', 'IXXIIIIIII', 'IYYIIIIIII', 'IZZIIIIIII'],
coeffs=[1. +0.j, 0.52440675+0.j, 0.52440675+0.j, 1.0488135 +0.j,
0.60759468+0.j, 0.60759468+0.j, 1.21518937+0.j, 0.55138169+0.j,
0.55138169+0.j, 1.10276338+0.j, 0.52244159+0.j, 0.52244159+0.j,
1.04488318+0.j, 0.4618274 +0.j, 0.4618274 +0.j, 0.9236548 +0.j,
0.57294706+0.j, 0.57294706+0.j, 1.14589411+0.j, 0.46879361+0.j,
0.46879361+0.j, 0.93758721+0.j, 0.6958865 +0.j, 0.6958865 +0.j,
1.391773 +0.j, 0.73183138+0.j, 0.73183138+0.j, 1.46366276+0.j])
Observable: SparsePauliOp(['IIIIZZIIII'],
coeffs=[1.+0.j])
Po definování hamiltoniánu můžeme přistoupit k sestavení počátečního stavu.
# Generate an initial state
initial_state = QuantumCircuit(L)
for i in range(L):
if i % 2:
initial_state.x(i)
Krok 1: Mapování klasických vstupů na kvantový problém
Nyní, když jsme sestavili hamiltonián definující spin-spinové interakce a vnější magnetická pole charakterizující systém, postupujeme ve třech hlavních krocích pracovního postupu AQC-Tensor:
- Vygenerování optimalizovaného obvodu AQC: Pomocí Trotterizace přibližujeme počáteční vývoj, který je poté zkomprimován za účelem snížení hloubky obvodu.
- Vytvoření zbývajícího obvodu časového vývoje: Zachycen í vývoje pro zbývající čas za počátečním segmentem.
- Spojení obvodů: Sloučení optimalizovaného obvodu AQC se zbývajícím evolučním obvodem do kompletního obvodu časového vývoje připraveného ke spuštění.
Tento přístup vytváří nízko-hloubkový ansatz pro cílový vývoj, čímž podporuje efektivní simulaci v rámci omezení near-term kvantového hardwaru.
Určení části časového vývoje k simulaci klasicky
Naším cílem je simulovat časový vývoj dříve definovaného modelového hamiltoniánu pomocí Trotter evoluce. Aby byl tento proces efektivní pro kvantový hardware, rozdělíme vývoj do dvou segmentů:
-
Počáteční segment: Tato počáteční část vývoje, od