البداية السريعة
يعرض هذا الدليل مثالًا عمليًا بسيطًا لحزمة qiskit-addon-sqd. نستخدم التشخيص القُطري الكمّي المعتمد على العيّنات (SQD) لتنقية عيّنات مشوشة مأخوذة من دارة كمّية تقرّب الحالة الأرضية لهاميلتونيان كيميائي. تُقرَّب طاقات الحالة الأرضية عبر تشخيص الهاميلتونيان في فضاءات جزئية تتكوّن من العيّنات المنقّاة.
لمزيد من مسارات العمل الشاملة والأكثر شرحًا التي تعمل على العتاد الكمّي، اطّلع على الدروس التعليمية:
-
التشخيص القُطري الكمّي المعتمد على العيّنات: مسار عمل هاميلتونيان كيميائي
-
التشخيص القُطري الكمّي لكريلوف المعتمد على العيّنات: مسار عمل نموذج شبكي فرميوني
1. تجهيز المدخلات لـ SQD
أولًا، نعرّف الهاميلتونيان الكيميائي والدارة الكمّية التي تقرّب حالته الأرضية. النظام المدروس في هذا المثال هو N₂ عند الهندسة التوازنية في أساس STO-3G مع تجميد مداريّن قلبيّين. يحتوي هذا النظام على 8 مدارات مكانية و10 إلكترونات، أي أن الدارة الكمّية معرّفة على 16 كيوبت، حيث تمثّل الكيوبتات 0-7 المدارات ذات السبين الأعلى، وتمثّل الكيوبتات 8-15 المدارات ذات السبين الأدنى. وبما أن هذا نظام مغلق القشرة بـ 10 إلكترونات، فنعلم أن كل عيّنة صالحة فيزيائيًا يجب أن يكون وزن هامينغ لها 10، حيث يكون وزن هامينغ لكل من النصفين الأيسر والأيمن من سلسلة البتات 5.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"numpy": "numpy", "pyscf": "pyscf", "qiskit_addon_sqd": "qiskit-addon-sqd"}
_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 pyscf import ao2mo, gto, mcscf, scf
# Construct the Hamiltonian, pull out integrals and other information about the system
mol = gto.M(
atom="N 0 0 0; N 0 0 1.09768", basis="sto-3g", spin=0, charge=0, verbose=0
)
mf = scf.RHF(mol).run()
cas = mcscf.CASCI(mf, ncas=8, nelecas=10)
hcore, nuclear_repulsion_energy = cas.get_h1eff()
eri = cas.get_h2eff()
num_orbitals = cas.ncas
eri = ao2mo.restore(1, eri, num_orbitals)
n_alpha, n_beta = cas.nelecas
nelec = (n_alpha, n_beta)
print(
f"Spatial orbitals: {num_orbitals}\nQubits: {num_orbitals * 2}\nElectrons (alpha, beta): {nelec}"
)
Spatial orbitals: 8
Qubits: 16
Electrons (alpha, beta): (5, 5)
2. توليد عيّنات مشوشة
في مسار عمل حقيقي، ستصمّم دارة أنساتز، وتحسّنها للعتاد، وتأخذ منها العيّنات على QPU. هنا نتخطى ذلك ونسحب بدلًا منه 10,000 سلسلة بتات عشوائية منتظمة. ورغم أن عيّناتنا لا تحتوي على أي معلومات عن الحالة الأرضية الفعلية، سنرى أن بروتوكول SQD لا يزال قادرًا على استعادة الحالة الأرضية الحقيقية عبر تنقية هذه العيّنات تكراريًا، ثم التشخيص القُطري، ثم استخدام الطاقات في كل تكرار لتوجيه الجولة التالية من تنقية سلاسل البتات. يمكننا في النهاية استعادة الحالة الأرضية الدقيقة بهذه الطريقة لأن الفضاء الجزئي الذي يحتوي الحالة الأرضية صغير بما يكفي لحسابه بدقة. وتحديدًا، بما أننا نعلم أن وزن هامينغ لكل نصف من كل سلسلة بتات (8 بتات) يجب أن يكون 5، فإننا نعلم أن حجم فضاء هيلبرت الجزئي الكامل للنظام هو .
import numpy as np
from qiskit_addon_sqd.counts import generate_bit_array_uniform
# Generate some uniformly-random bitstrings to simulate QPU samples
rng = np.random.default_rng(24)
bit_array = generate_bit_array_uniform(
10_000, num_orbitals * 2, rand_seed=rng
)
print(
f"Generated {bit_array.num_shots} uniformly-random, {bit_array.num_bits}-qubit samples."
)
Generated 10000 uniformly-random, 16-qubit samples.
3. المعالجة اللاحقة باستخدام SQD
هدف خوارزمية SQD هو تنقية العيّنات المشوشة المأخوذة من QPU، ثم تشخيص الهاميلتونيان في نهاية المطاف في فضاء جزئي تمتدّ عليه تلك العيّنات المنقّاة. يتم ذلك تكراريًا على النحو التالي:
-
تنقية العيّنات عبر الانتقاء اللاحق للعيّنات التي لها العدد الصحيح من الجسيمات فقط، لكل من النظامين الجزئيين ذي السبين الأعلى وذي السبين الأدنى
-
التشخيص القُطري في فضاءات جزئية صغيرة تمتدّ عليها العيّنات المنقّاة، وجمع معلومات عن الفضاءات الجزئية التي تعطي أفضل (أدنى) الطاقات.
-
في كل تكرار:
-
تنقية العيّنات المشوشة عبر قلب البتات احتماليًا في العيّنات ذات عدد الجسيمات الخاطئ. تُحسب الاحتمالات باستخدام معلومات الفضاء الجزئي من أحدث عملية تشخيص قُطري.
-
التشخيص القُطري في فضاءات جزئية صغيرة تمتدّ عليها العيّنات المنقّاة
-
جمع معلومات عن الفضاءات الجزئية التي تعطي أفضل (أدنى) الطاقات
-
نرى من المخرجات أن الخوارزمية تتقارب إلى طاقة الحالة الأرضية الدقيقة بعد 6 تكرارات، وأن التشخيص القُطري يُجرى على فضاء هيلبرت الجزئي الكامل ذي البُعد . بالطبع، التشخيص القُطري على الفضاء الكامل غير ممكن عادةً، ولذلك فإن الأنظمة ذات الحالات الأرضية ذات الدعم المتناثر هي الأكثر احتمالًا للاستفادة من تقنيات التشخيص القُطري في الفضاءات الجزئية مثل SQD.
لمزيد من المعلومات حول الدالة diagonalize_fermionic_hamiltonian، زُر توثيق API.
from functools import partial
from pyscf import fci
from qiskit_addon_sqd.fermion import (
SCIResult,
diagonalize_fermionic_hamiltonian,
solve_sci_batch,
)
exact_energy, _ = fci.direct_spin1.kernel(
hcore, eri, int(num_orbitals), nelec
)
exact_energy += nuclear_repulsion_energy
print(f"Exact (FCI) reference energy: {exact_energy:.6f} Ha\n")
sci_solver = partial(solve_sci_batch, spin_sq=0.0, max_cycle=200)
result_history = []
def callback(results: list[SCIResult]):
result_history.append(results)
iteration = len(result_history)
print(f"Iteration {iteration}")
for i, result in enumerate(results):
error = result.energy + nuclear_repulsion_energy - exact_energy
print(f" Subsample {i}")
print(f" Energy: {result.energy + nuclear_repulsion_energy:.6f}")
print(
f" Subspace dimension: {np.prod(result.sci_state.amplitudes.shape)}"
)
print(f" Error vs exact: {error:.6f} Ha")
samples_per_batch = 20
result = diagonalize_fermionic_hamiltonian(
hcore,
eri,
bit_array,
samples_per_batch=samples_per_batch,
norb=num_orbitals,
nelec=nelec,
occupancies_tol=1e-7,
max_iterations=30,
sci_solver=sci_solver,
symmetrize_spin=True,
callback=callback,
seed=np.random.default_rng(32),
)
Exact (FCI) reference energy: -107.652521 Ha
Iteration 1
Subsample 0
Energy: -106.908481
Subspace dimension: 784
Error vs exact: 0.744040 Ha
Iteration 2
Subsample 0
Energy: -106.934921
Subspace dimension: 1764
Error vs exact: 0.717600 Ha
Iteration 3
Subsample 0
Energy: -106.953430
Subspace dimension: 2209
Error vs exact: 0.699091 Ha
Iteration 4
Subsample 0
Energy: -107.651946
Subspace dimension: 2916
Error vs exact: 0.000575 Ha
Iteration 5
Subsample 0
Energy: -107.652003
Subspace dimension: 3025
Error vs exact: 0.000518 Ha
Iteration 6
Subsample 0
Energy: -107.652521
Subspace dimension: 3136
Error vs exact: 0.000000 Ha
Iteration 7
Subsample 0
Energy: -107.652521
Subspace dimension: 3136
Error vs exact: 0.000000 Ha