Точна симуляція за допомогою примітивів Qiskit SDK
Версії пакетів
Код на цій сторінці розроблено з використанням наведених нижче залежностей. Рекомендуємо використовувати ці або новіші версії.
qiskit[all]~=2.3.0
Референсні примітиви в Qiskit SDK виконують локальну симуляцію вектора стану. Ці симуляції не підтримують моделювання шуму пристрою, але корисні для швидкого прототипування алгоритмів перед переходом до більш просунутих технік симуляції (з використанням Qiskit Aer) або запуску на реальних пристроях (примітиви Qiskit Runtime).
Примітив Estimator може обчислювати очікувані значення схем, а примітив Sampler — виконувати вибірку з вихідних розподілів схем.
У наступних розділах показано, як використовувати референсні примітиви для локального запуску свого робочого процесу.
Використання референсного Estimator
Референсна реалізація EstimatorV2 у qiskit.primitives, що виконується на локальних симуляторах вектора стану, — це клас StatevectorEstimator. Він приймає схеми, спостережувані та параметри як вхідні дані й повертає локально обчислені очікувані значення.
Наступний код готує вхідні дані, які використовуватимуться в прикладах далі. Очікуваний тип вхідних даних для спостережуваних — qiskit.quantum_info.SparsePauliOp. Зауважимо, що схема в прикладі параметризована, але ти також можеш запускати Estimator на непараметризованих схемах.
Будь-яка схема, що передається до Estimator, не повинна містити вимірювань.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
# circuit for which you want to obtain the expected value
circuit = QuantumCircuit(2)
circuit.ry(Parameter("theta"), 0)
circuit.h(0)
circuit.cx(0, 1)
circuit.draw("mpl", style="iqp")
from qiskit.quantum_info import SparsePauliOp
import numpy as np
# observable(s) whose expected values you want to compute
observable = SparsePauliOp(["II", "XX", "YY", "ZZ"], coeffs=[1, 1, -1, 1])
# value(s) for the circuit parameter(s)
parameter_values = [[0], [np.pi / 6], [np.pi / 2]]
Робочий процес примітивів Qiskit Runtime вимагає перетворення схем і спостережуваних так, щоб використовувати лише інструкції, підтримувані QPU (так звані схеми та спостережувані instruction set architecture (ISA)). Референсні примітиви все ще приймають абстрактні інструкції, оскільки покладаються на локальні симуляції вектора стану, але транспіляція схеми може бути корисною з точки зору оптимізації схеми.
# Generate a pass manager without providing a backend
from qiskit.transpiler import generate_preset_pass_manager
pm = generate_preset_pass_manager(optimization_level=1)
isa_circuit = pm.run(circuit)
isa_observable = observable.apply_layout(isa_circuit.layout)
Ініціалізація Estimator
Створи екземпляр qiskit.primitives.StatevectorEstimator.
from qiskit.primitives import StatevectorEstimator
estimator = StatevectorEstimator()
Запуск і отримання результатів
У цьому прикладі використовується лише одна схема (типу QuantumCircuit) та одна
спостережувана.
Запусти оцінку, викликавши метод StatevectorEstimator.run, який повертає екземпляр об'єкта PrimitiveJob. Ти можеш отримати результати завдання (як об'єкт qiskit.primitives.PrimitiveResult)
за допомогою методу qiskit.primitives.PrimitiveJob.result.
job = estimator.run([(circuit, observable, parameter_values)])
result = job.result()
print(f" > Result class: {type(result)}")
> Result class: <class 'qiskit.primitives.containers.primitive_result.PrimitiveResult'>
Отримання очікуваного значення з результату
Результат примітивів виводить масив об'єктів PubResult, де кожен елемент масиву — це об'єкт PubResult, що містить у своїх даних масив оцінок, що відповідають кожній комбінації схема-спостережувана у PUB.
Щоб отримати очікувані значення та метадані для першого (і в цьому випадку єдиного) оцінювання схеми, потрібно звернутися до data для PUB 0:
print(f" > Expectation value: {result[0].data.evs}")
print(f" > Metadata: {result[0].metadata}")
> Expectation value: [4. 3.73205081 2. ]
> Metadata: {'target_precision': 0.0, 'circuit_metadata': {}}