Penepatan Kuantum Krylov Berasaskan Pensampelan (SKQD)
Pelajaran tentang penepatan kuantum Krylov berasaskan pensampelan (SKQD) ini menggabungkan kaedah yang dijelaskan dalam pelajaran-pelajaran sebelumnya. Ia terdiri daripada satu contoh yang memanfaatkan kerangka corak Qiskit:
- Langkah 1: Petakan masalah kepada Circuit kuantum dan operator
- Langkah 2: Optimumkan untuk perkakasan sasaran
- Langkah 3: Laksanakan menggunakan Primitif Qiskit
- Langkah 4: Pasca-proses
Langkah penting dalam kaedah penepatan kuantum berasaskan pensampelan ialah menghasilkan vektor berkualiti untuk subruang. Dalam pelajaran sebelumnya, kami menggunakan ansatz LUCJ untuk menghasilkan vektor subruang bagi Hamiltonian kimia. Dalam pelajaran ini, kami akan menggunakan keadaan Krylov kuantum[1] seperti yang dibincangkan dalam pelajaran 2. Pertama, kami akan mengkaji semula cara mencipta ruang Krylov pada komputer kuantum menggunakan operasi evolusi masa. Kami kemudian akan membuat sampel darinya. Kami akan memproyeksikan Hamiltonian sistem ke atas subruang yang disampling dan mentepatinya untuk menganggar tenaga keadaan asas. Algoritma ini terbukti dan cekap menumpu ke keadaan asas, di bawah andaian yang diterangkan dalam pelajaran 2.
0. Ruang Krylovβ
Ingat bahawa ruang Krylov berperingkat ialah ruang yang direntangi oleh vektor-vektor yang diperoleh dengan mendarab kuasa lebih tinggi matriks , sehingga , dengan vektor rujukan .
Jika matriks ialah Hamiltonian , ruang yang sepadan disebut ruang Krylov kuasa . Dalam kes di mana ialah operator evolusi masa yang dijana oleh Hamiltonian , ruang itu dirujuk sebagai ruang Krylov unitari . Subruang Krylov kuasa tidak boleh dijana secara langsung pada komputer kuantum kerana bukan operator unitari. Sebaliknya, kita boleh menggunakan operator evolusi masa yang boleh ditunjukkan memberikan jaminan penumpuan yang serupa dengan ruang Krylov kuasa. Kuasa kemudian menjadi langkah masa yang berbeza di mana .
1. Petakan masalah kepada Circuit kuantum dan operatorβ
Dalam pelajaran ini, kami mempertimbangkan Hamiltonian untuk rantai spin-1/2 XX-Z antiferromagnet dengan tapak dengan syarat sempadan berkala:
# Added by doQumentation β required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-addon-sqd qiskit-addon-utils qiskit-ibm-runtime
from qiskit.transpiler import CouplingMap
from qiskit_addon_utils.problem_generators import generate_xyz_hamiltonian
num_spins = 22
coupling_map = CouplingMap.from_ring(num_spins)
H_op = generate_xyz_hamiltonian(coupling_map, coupling_constants=(0.3, 0.3, 1.0))
Untuk membina ruang Krylov, kita memerlukan tiga bahan utama:
- Pilihan dimensi Krylov () dan langkah masa ().
- Keadaan awal (rujukan) (vektor di atas) dengan pertindihan polinomial dengan keadaan sasaran (asas), di mana keadaan sasaran adalah jarang. Keperluan untuk pertindihan polinomial ini sama seperti dalam algoritma anggaran fasa kuantum.
- Operator evolusi masa ().
Untuk nilai yang dipilih (dan, ), kita akan mencipta Circuit kuantum berasingan dan membuat sampel darinya. Setiap Circuit kuantum dicipta dengan menggabungkan representasi Circuit kuantum keadaan rujukan dan operator evolusi masa untuk nilai .
Dimensi Krylov yang lebih besar meningkatkan penumpuan tenaga yang dianggar. Kami menetapkan dimensi kepada dalam pelajaran ini untuk menggambarkan trend penumpuan.
Ref [2] menunjukkan bahawa langkah masa yang cukup kecil untuk KQD ialah , dan lebih baik untuk meremehkan nilai ini daripada melebih-lebihkan. Sebaliknya, memilih yang terlalu kecil membawa kepada pengkondisian subruang Krylov yang lebih lemah, kerana vektor asas Krylov kurang berbeza dari satu langkah masa ke langkah masa berikutnya. Selain itu, walaupun pilihan ini terbukti mencukupi untuk penumpuan SKQD, dalam konteks berasaskan pensampelan ini, pilihan optimum dalam praktik adalah topik kajian berterusan. Dalam pelajaran ini, kami menetapkan .
Selain dimensi Krylov dan langkah masa, kita perlu menetapkan bilangan langkah Trotter untuk evolusi masa. Menggunakan terlalu sedikit langkah membawa kepada ralat Trotterisasi yang lebih besar, manakala terlalu banyak langkah membawa kepada Circuit yang lebih dalam. Dalam pelajaran ini, kami menetapkan bilangan langkah Trotter kepada .
# Set parameters for quantum Krylov algorithm
krylov_dim = 5 # size of krylov subspace
dt = 0.15
num_trotter_steps = 6
Seterusnya, kita perlu memilih keadaan rujukan yang mempunyai sedikit pertindihan dengan keadaan asas. Untuk Hamiltonian ini, kami menggunakan keadaan Neel dengan 1 dan 0 berselang-seli sebagai keadaan rujukan kami.
# Prep `Neel` state as the reference state for evolution
from qiskit import QuantumCircuit
qc_state_prep = QuantumCircuit(num_spins)
for i in range(num_spins):
if i % 2 == 0:
qc_state_prep.x(i)
Akhir sekali, kita perlu memetakan operator evolusi masa kepada Circuit kuantum. Ini telah dilakukan dalam pelajaran 2, tetapi di sini kami akan memanfaatkan kaedah dalam Qiskit, khususnya kaedah bernama synthesis. Terdapat kaedah berbeza untuk mensintesis operator matematik kepada Circuit kuantum dengan Gate kuantum. Banyak teknik sedemikian tersedia dalam modul sintesis Qiskit. Kami akan menggunakan pendekatan LieTrotter untuk sintesis [3] [4].
from qiskit.circuit import QuantumRegister
from qiskit.circuit.library import PauliEvolutionGate
from qiskit.synthesis import LieTrotter
evol_gate = PauliEvolutionGate(
H_op, time=(dt / num_trotter_steps), synthesis=LieTrotter(reps=num_trotter_steps)
) # `U` operator
qr = QuantumRegister(num_spins)
qc_evol = QuantumCircuit(qr)
qc_evol.append(evol_gate, qargs=qr)
circuits = []
for rep in range(krylov_dim):
circ = qc_state_prep.copy()
# Repeating the `U` operator to implement U^0, U^1, U^2, and so on, for power Krylov space
for _ in range(rep):
circ.compose(other=qc_evol, inplace=True)
circ.measure_all()
circuits.append(circ)
circuits[1].decompose().draw("mpl", fold=-1)

circuits[2].decompose().draw("mpl", fold=-1)

2. Optimumkan untuk perkakasan sasaranβ
Setelah mencipta Circuit, kita boleh mengoptimumkannya untuk perkakasan sasaran. Kami memilih QPU berskala utiliti.
import warnings
from qiskit import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService
warnings.filterwarnings("ignore")
service = QiskitRuntimeService()
# Use the least-busy backend or specify a quantum computer using the syntax commented out below.
backend = service.least_busy(operational=True, simulator=False)
# backend = service.backend("ibm_brisbane")
Sekarang, kami men-transpile Circuit ke Backend sasaran menggunakan pengurus laluan pra-tetap.
pm = generate_preset_pass_manager(backend=backend, optimization_level=3)
isa_circuits = pm.run(circuits=circuits)
3. Laksanakan pada perkakasan sasaranβ
Setelah mengoptimumkan Circuit untuk pelaksanaan perkakasan, kami sedia untuk menjalankannya pada perkakasan sasaran dan mengumpulkan sampel untuk anggaran tenaga keadaan asas.
from qiskit_ibm_runtime import SamplerV2 as Sampler
sampler = Sampler(mode=backend)
job = sampler.run(isa_circuits, shots=100_000) # Takes approximately 2m 58s of QPU time
counts_all = [job.result()[k].data.meas.get_counts() for k in range(krylov_dim)]
4. Pasca-proses keputusanβ
Seterusnya, kami mengagregat kiraan untuk dimensi Krylov yang meningkat secara kumulatif. Menggunakan kiraan kumulatif, kami akan merentangi subruang untuk dimensi Krylov yang meningkat dan menganalisis tingkah laku penumpuan.
from collections import Counter
counts_cumulative = []
for i in range(krylov_dim):
counter = Counter()
for d in counts_all[: i + 1]:
counter.update(d)
counts = dict(counter)
counts_cumulative.append(counts)
Untuk memproyeksikan dan mentepati Hamiltonian, kami menggunakan keupayaan daripada qiskit-addon-sqd. Addon ini menawarkan fungsi untuk memproyeksikan Hamiltonian berasaskan rentetan Pauli ke atas subruang dan menyelesaikan nilai eigen menggunakan SciPy.
from qiskit_addon_sqd.counts import counts_to_arrays
from qiskit_addon_sqd.qubit import solve_qubit
Pada dasarnya, kita boleh menapis rentetan bit dengan corak yang tidak betul sebelum merentangi subruang. Sebagai contoh, keadaan asas untuk Hamiltonian antiferromagnet dalam pelajaran ini biasanya mempunyai bilangan spin "atas" dan "bawah" yang sama, iaitu bilangan "1" dalam rentetan bit mestilah tepat separuh daripada jumlah bilangan bit (spin) dalam sistem. Fungsi berikut menapis rentetan bit dengan bilangan "1" yang tidak betul daripada kiraan.
# Filters out bitstrings that do not have specified number (`num_ones`) of `1` bits.
def postselect_counts(counts, num_ones):
filtered_counts = {}
for bitstring, freq in counts.items():
if bitstring.count("1") == num_ones:
filtered_counts[bitstring] = freq
return filtered_counts
Menggunakan rentetan bit dengan bilangan elektron atas/bawah yang betul, kami merentangi subruang dan mengira nilai eigen untuk dimensi Krylov yang meningkat. Bergantung pada saiz masalah dan sumber klasik yang tersedia, kami mungkin perlu menggunakan subpensampelan (serupa dengan pelajaran tentang SQD) untuk mengekalkan dimensi subruang dalam had yang terkawal. Selain itu, kami boleh menggunakan konsep pemulihan konfigurasi serupa dengan Pelajaran 4. Kami boleh mengira penghunian elektron per tapak daripada eigen-keadaan yang dibina semula dan menggunakan maklumat tersebut untuk membetulkan rentetan bit dengan bilangan elektron atas/bawah yang tidak betul. Kami tinggalkan ini sebagai latihan untuk pembaca yang berminat.
import numpy as np
num_batches = 10
rand_seed = 0
scipy_kwargs = {"k": 2, "which": "SA"}
ground_state_energies = []
for idx, counts in enumerate(counts_cumulative):
counts = postselect_counts(counts, num_ones=num_spins // 2)
bitstring_matrix, probs = counts_to_arrays(counts=counts)
eigenvals, eigenstates = solve_qubit(
bitstring_matrix, H_op, verbose=False, **scipy_kwargs
)
gs_en = np.min(eigenvals)
ground_state_energies.append(gs_en)
Seterusnya, kami memplot tenaga yang dikira sebagai fungsi dimensi Krylov dan membandingkan dengan tenaga tepat. Tenaga tepat dikira secara berasingan menggunakan kaedah Brute force klasik. Kita dapat melihat bahawa tenaga keadaan asas yang dianggar menumpu dengan peningkatan dimensi ruang Krylov. Walaupun dimensi Krylov adalah terhad, hasilnya masih menunjukkan penumpuan yang mengagumkan, yang dijangka bertambah baik dengan dimensi Krylov yang lebih besar [1].
import matplotlib.pyplot as plt
exact_gs_en = -23.934184
plt.plot(
range(1, krylov_dim + 1),
ground_state_energies,
color="blue",
linestyle="-.",
label="estimate",
)
plt.plot(
range(1, krylov_dim + 1),
[exact_gs_en] * krylov_dim,
color="red",
linestyle="-",
label="exact",
)
plt.xticks(range(1, krylov_dim + 1), range(1, krylov_dim + 1))
plt.legend()
plt.xlabel("Krylov space dimension")
plt.ylabel("Energy")
plt.ylim([-24, -22.50])
plt.title(
"Estimating Ground state energy with Sample-based Krylov Quantum Diagonalization"
)
plt.show()
Semak pemahaman kamuβ
Baca soalan di bawah, fikirkan jawapan kamu, kemudian klik segitiga untuk mendedahkan penyelesaian.
Apakah yang boleh dilakukan untuk meningkatkan penumpuan dalam plot di atas?
Jawapan:
Tingkatkan dimensi Krylov. Secara umum, seseorang juga boleh meningkatkan bilangan shots, tetapi ini sudah agak tinggi dalam pengiraan di atas.
Apakah kelebihan utama SKQD berbanding (a) SQD, dan (b) KQD?
Jawapan:
Mungkin ada jawapan lain yang sah, tetapi jawapan lengkap harus merangkumi perkara berikut:
(a) SKQD dilengkapi dengan jaminan penumpuan yang tidak dimiliki SQD. Dalam SQD kamu sama ada perlu membuat tekaan yang sangat baik untuk ansatz kamu yang mempunyai pertindihan yang sangat baik dengan sokongan keadaan asas dalam asas pengkomputeran, atau kamu perlu memperkenalkan komponen variasional ke dalam pengiraan untuk membuat sampel keluarga ansaetze.
(b) SKQD memerlukan masa QPU yang jauh lebih sedikit, kerana ia mengelakkan pengiraan elemen matriks yang mahal melalui ujian Hadamard.
5. Ringkasanβ
- Anggaran tenaga keadaan asas melalui pensampelan keadaan asas Krylov sangat sesuai untuk model kekisi termasuk sistem spin, masalah jirim pekat, dan teori tolok kekisi. Pendekatan ini berskala jauh lebih baik daripada VQE, kerana ia tidak memerlukan pengoptimuman ke atas banyak parameter dalam ansatz variasional seperti dalam VQE, atau dalam SQD berasaskan ansatz heuristik (contohnya, masalah kimia dalam pelajaran sebelumnya).
- Untuk mengekalkan kedalaman Circuit yang rendah, adalah bijak untuk menangani masalah kekisi yang sesuai untuk perkakasan pra-toleransi kesalahan.
- SKQD tidak menghadapi masalah pengukuran kuantum seperti dalam VQE. Tiada kumpulan operator Pauli yang bertukar-ganti yang perlu dianggar.
- SKQD tahan terhadap sampel yang bising kerana seseorang boleh menggunakan rutin pemilihan pasca yang khusus masalah (contohnya, menapis rentetan bit yang tidak mematuhi corak khusus masalah) atau menanggung overhead penepatan klasik (iaitu, mentepati dalam subruang yang lebih besar) untuk menghapuskan kesan bunyi secara berkesan.
Rujukanβ
[1] Jeffery Yu et al., "Quantum-Centric Algorithm for Sample-Based Krylov Diagonalization" (2025). arxiv:quant-ph/2501.09702.
[2] Ethan N. Epperly, Lin Lin, and Yuji Nakatsukasa. "A theory of quantum subspace diagonalization". SIAM Journal on Matrix Analysis and Applications 43, 1263β1290 (2022).
[2] N. Hatano and M. Suzuki, "Finding Exponential Product Formulas of Higher Orders" (2005). arXiv:math-ph/0506007.
[4] D. Berry, G. Ahokas, R. Cleve and B. Sanders, "Efficient quantum algorithms for simulating sparse Hamiltonians" (2006). arXiv:quant-ph/0508139.