Побудуй шаблон функції Qiskit для симуляції гамільтоніана
Цей шаблон інкапсулює робочий процес симуляції часової еволюції початкового стану відносно визначеного користувачем спін-гамільтоніана та повертає набір вказаних значень математичного сподівання за допомогою надбудови Qiskit AQC-Tensor.
Цей шаблон структурований як Qiskit-патерн із такими кроками:
1. Збір вхідних даних і відображення задачі
Цей розділ приймає на вхід гамільтоніан для симуляції, початковий стан у вигляді QuantumCircuit, набір спостережуваних для оцінки значень математичного сподівання та специфікацію параметрів для AQC addon. На цьому кроці перевіряється наявність усіх необхідних вхідних даних і правильність їхнього формату.
Вхідні аргументи потім використовуються для побудови відповідних квантових схем і операторів для робочого процесу. Створюється цільова схема, і за допомогою AQC addon знаходиться представлення цієї схеми у вигляді матричного добутку станів. Після цього генерується та оптимізується схема анзацу за допомогою методів тензорних мереж, що дає фінальну схему, яка виконує решту часової еволюції.
2. Підготовка згенерованих схем до виконання
Згенеровані схеми AQC addon потім транспілюються для виконання на обраному бекенді. Створюється екземпляр EstimatorV2 із набором параметрів пом'якшення помилок за замовчуванням для керування виконанням схеми.
3. Виконання
Нарешті, схема анзацу транспілюється та виконується на QPU, збираючи оцінки для всіх вказаних значень математичног о сподівання, які повертаються у серіалізованому форматі для доступу користувача.
Написати шаблон функції
Спочатку напиши шаблон функції для симуляції гамільтоніана, що використовує AQC-Tensor Qiskit addon для відображення опису задачі на схему зменшеної глибини для виконання на апаратному забезпеченні.
Якщо ти завантажиш цю сторінку і переглянеш її локально в редакторі ноутбуків, то побачиш, що деякі клітинки коду містять магічну команду %%writefile. Ця магічна команда зберігає код у ./source_files/template_hamiltonian_simulation.py — це шаблон функції, який можна завантажити та запустити віддалено за допомогою Qiskit Serverless.
# Added by doQumentation — required packages for this notebook
!pip install -q mergedeep numpy qiskit qiskit-addon-aqc-tensor qiskit-addon-utils qiskit-ibm-catalog qiskit-ibm-runtime qiskit-serverless quimb scipy
# This cell is hidden from users, it just creates a new folder
from pathlib import Path
Path("./source_files").mkdir(exist_ok=True)
Збір і валідація вхідних даних
Почни зі збору вхідних даних для шаблону. Цей приклад має предметно-специфічні вхідні дані, що стосуються симуляції гамільтоніана (наприклад, сам гамільтоніан та спостережувана величина), і параметри, пов'язані з можливостями (наприклад, наскільки потрібно стискати початкові шари схеми Троттера за допомогою AQC-Tensor, або розширені параметри для тонкого налаштування придушення та пом'якшення помилок поза стандартними значеннями цього прикладу).
%%writefile ./source_files/template_hamiltonian_simulation.py
from qiskit import QuantumCircuit
from qiskit_serverless import get_arguments, save_result
# Extract parameters from arguments
#
# Do this at the top of the program so it fails early if any required arguments are missing or invalid.
arguments = get_arguments()
dry_run = arguments.get("dry_run", False)
backend_name = arguments["backend_name"]
aqc_evolution_time = arguments["aqc_evolution_time"]
aqc_ansatz_num_trotter_steps = arguments["aqc_ansatz_num_trotter_steps"]
aqc_target_num_trotter_steps = arguments["aqc_target_num_trotter_steps"]
remainder_evolution_time = arguments["remainder_evolution_time"]
remainder_num_trotter_steps = arguments["remainder_num_trotter_steps"]
# Stop if this fidelity is achieved
aqc_stopping_fidelity = arguments.get("aqc_stopping_fidelity", 1.0)
# Stop after this number of iterations, even if stopping fidelity is not achieved
aqc_max_iterations = arguments.get("aqc_max_iterations", 500)
hamiltonian = arguments["hamiltonian"]
observable = arguments["observable"]
initial_state = arguments.get("initial_state", QuantumCircuit(hamiltonian.num_qubits))
Writing ./source_files/template_hamiltonian_simulation.py
%%writefile --append ./source_files/template_hamiltonian_simulation.py
import numpy as np
import json
from mergedeep import merge
# Configure `EstimatorOptions`, to control the parameters of the hardware experiment
#
# Set default options
estimator_default_options = {
"resilience": {
"measure_mitigation": True,
"zne_mitigation": True,
"zne": {
"amplifier": "gate_folding",
"noise_factors": [1, 2, 3],
"extrapolated_noise_factors": list(np.linspace(0, 3, 31)),
"extrapolator": ["exponential", "linear", "fallback"],
},
"measure_noise_learning": {
"num_randomizations": 512,
"shots_per_randomization": 512,
},
},
"twirling": {
"enable_gates": True,
"enable_measure": True,
"num_randomizations": 300,
"shots_per_randomization": 100,
"strategy": "active",
},
}
# Merge with user-provided options
estimator_options = merge(
arguments.get("estimator_options", {}), estimator_default_options
)
Appending to ./source_files/template_hamiltonian_simulation.py
Коли шаблон функції виконується, корисно виводити інформацію в логи за допомогою операторів print, щоб краще відстежувати прогрес робочого навантаження. Нижче наведено простий приклад виведення estimator_options, щоб зберегти запис про фактично використані параметри Estimator. Упродовж усієї програми є ще багато подібних прикладів для відстеження прогресу під час виконання, включно зі значенням цільової функції під час ітераційної частини AQC-Tensor та глибиною двокубітних вентилів фінальної схеми в наборі інструкцій архітектури (ISA), призначеної для виконання на апаратному забезпеченні.
%%writefile --append ./source_files/template_hamiltonian_simulation.py
print("estimator_options =", json.dumps(estimator_options, indent=4))
Appending to ./source_files/template_hamiltonian_simulation.py
Валідація вхідних даних
Важливий аспект забезпечення багаторазового використання шаблону для різних вхідних даних — це їхня валідація. Наступний код є прикладом перевірки того, що порогова точність під час AQC-Tensor вказана правильно, а якщо ні — повертається інформативне повідомлення про помилку з поясненням, як її виправити.
%%writefile --append ./source_files/template_hamiltonian_simulation.py
# Perform parameter validation
if not 0.0 < aqc_stopping_fidelity <= 1.0:
raise ValueError(
f"Invalid stopping fidelity: {aqc_stopping_fidelity}. It must be a positive float no greater than 1."
)
Appending to ./source_files/template_hamiltonian_simulation.py