Початок роботи з наближеною квантовою компіляцією за допомогою тензорних мереж (AQC-Tensor)
Версії пакетів
Код на цій сторінці було розроблено з використанням наступних вимог. Рекомендуємо використовувати ці версії або новіші.
qiskit[all]~=2.3.0
qiskit-aer~=0.17
qiskit-addon-utils~=0.3.0
qiskit-addon-aqc-tensor[aer,quimb-jax]~=0.2.0; sys.platform != 'darwin'
scipy~=1.16.3
Цей посібник демонструє простий робочий приклад для початку роботи з AQC-Tensor. У цьому прикладі ти візьмеш схему Троттера, яка моделює еволюцію поперечно-польової моделі Ізінга, і використаєш метод AQC-Tensor для зменшення глибини отриманої схеми. Крім того, цей приклад вимагає пакету qiskit-addon-utils для генератора задач, qiskit-aer для моделювання тензорних мереж і scipy для оптимізації параметрів.
Для початку пригадаємо, що гамільтоніан поперечно-польової моделі Ізінга має вигляд
де ми будемо вважати, що діють періодичні гр аничні умови, які означають, що при отримуємо , — сила зв'язку між двома вузлами, а — сила зовнішнього магнітного поля.
Наступний фрагмент коду згенерує гамільтоніан ланцюжка Ізінга з 10 вузлів із періодичними граничними умовами.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-addon-aqc-tensor qiskit-addon-utils qiskit-aer scipy
from qiskit.transpiler import CouplingMap
from qiskit_addon_utils.problem_generators import generate_xyz_hamiltonian
from qiskit.synthesis import SuzukiTrotter
from qiskit_addon_utils.problem_generators import (
generate_time_evolution_circuit,
)
from qiskit_addon_aqc_tensor import generate_ansatz_from_circuit
from qiskit_addon_aqc_tensor.simulation import tensornetwork_from_circuit
from qiskit_addon_aqc_tensor.simulation import compute_overlap
from qiskit_addon_aqc_tensor.objective import MaximizeStateFidelity
from qiskit_aer import AerSimulator
from scipy.optimize import OptimizeResult, minimize
# Generate some coupling map to use for this example
coupling_map = CouplingMap.from_heavy_hex(3, bidirectional=False)
# Choose a 10-qubit circle on this coupling map
reduced_coupling_map = coupling_map.reduce(
[0, 13, 1, 14, 10, 16, 4, 15, 3, 9]
)
# Get a qubit operator describing the Ising field model
hamiltonian = generate_xyz_hamiltonian(
reduced_coupling_map,
coupling_constants=(0.0, 0.0, 1.0),
ext_magnetic_field=(0.4, 0.0, 0.0),
)
Розбиття часової еволюції на дві частини для класичного та квантового виконання
Загальна мета цього прикладу — моделювати часову еволюцію модельного гамільтоніана. Ми робимо це за допомогою еволюції Троттера, яка буде розбита на дві частини.
- Початкова частина, яку можна моделювати за допомогою матричних добутків станів (MPS). Саме вона буде «скомпільована» за допомогою AQC-Tensor.
- Подальша частина, яка буде виконана на квантовому залізі.
Ми оберемо еволюцію системи до часу і використаємо AQC-Tensor для стиснення часової еволюції до часу , а потім еволюціонуємо за допомогою звичайних кроків Троттера до .
Далі ми згенеруємо дві схеми: одну, яка буде стиснута за допомогою AQC-Tensor, і одну, яка буде виконана на QPU. Для першої схеми, оскільки вона буде класично моделюватись за допомогою матричних добутків станів, ми використаємо велику кількість шарів, щоб мінімізувати похибку Троттера. Тоді як друга схема, що моделює часову еволюцію від до , використовуватиме значно менше шарів для мінімізації глибини.
# Generate circuit to be compressed
aqc_evolution_time = 4.0
aqc_target_num_trotter_steps = 45
aqc_target_circuit = generate_time_evolution_circuit(
hamiltonian,
synthesis=SuzukiTrotter(reps=aqc_target_num_trotter_steps),
time=aqc_evolution_time,
)
# Generate circuit to execute on hardware
subsequent_evolution_time = 1.0
subsequent_num_trotter_steps = 5
subsequent_circuit = generate_time_evolution_circuit(
hamiltonian,
synthesis=SuzukiTrotter(reps=subsequent_num_trotter_steps),
time=subsequent_evolution_time,
)
Для порівняння ми також згенеруємо третю схему — таку, що еволюціонує до , але має таку саму кількість шарів, що й друга схема, яка еволюціонує від до . Це схема, яку ми б виконали, якби не використовували техніку AQC-Tensor. Назвемо її схемою порівняння.
aqc_comparison_num_trotter_steps = int(
subsequent_num_trotter_steps
/ subsequent_evolution_time
* aqc_evolution_time
)
aqc_comparison_num_trotter_steps
comparison_circuit = generate_time_evolution_circuit(
hamiltonian,
synthesis=SuzukiTrotter(reps=aqc_comparison_num_trotter_steps),
time=aqc_evolution_time,
)