Dokładna symulacja przy użyciu prymitywów Qiskit SDK
Wersje pakietów
Kod na tej stronie został opracowany przy użyciu poniższych wymagań. Zalecamy korzystanie z tych wersji lub nowszych.
qiskit[all]~=2.3.0
Referencyjne prymitywy w Qiskit SDK wykonują lokalne symulacje wektora stanu. Symulacje te nie obsługują modelowania szumów urządzenia, ale są przydatne do szybkiego prototypowania algorytmów przed skorzystaniem z bardziej zaawansowanych technik symulacji (przy użyciu Qiskit Aer) lub uruchamianiem na prawdziwych urządzeniach (prymitywy Qiskit Runtime).
Prymityw Estimator może obliczać wartości oczekiwane obwodów, a prymityw Sampler może próbkować z rozkładów wyjściowych obwodów.
Poniższe sekcje pokazują, jak korzystać z referencyjnych prymitywów, aby uruchamiać swój przepływ pracy lokalnie.
Użycie referencyjnego Estimatora
Referencyjna implementacja EstimatorV2 w qiskit.primitives, działająca na lokalnym symulatorze wektora stanu,
to klasa StatevectorEstimator. Przyjmuje ona obwody, obserwable i parametry jako dane wejściowe, a zwraca lokalnie obliczone wartości oczekiwane.
Poniższy kod przygotowuje dane wejściowe, które zostaną użyte w kolejnych przykładach. Oczekiwanym typem wejściowym dla
obserwabli jest qiskit.quantum_info.SparsePauliOp. Zwróć uwagę, że
obwód w przykładzie jest sparametryzowany, ale możesz też uruchomić Estimator na nieparametryzowanych obwodach.
Każdy obwód przekazywany do Estimatora nie może zawierać żadnych pomiarów.
# 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]]
Przepływ pracy prymitywów Qiskit Runtime wymaga, aby obwody i obserwable były przekształcone tak, by korzystały wyłącznie z instrukcji obsługiwanych przez QPU (określanych jako obwody i obserwable architektury zestawu instrukcji (ISA)). Referencyjne prymitywy nadal przyjmują abstrakcyjne instrukcje, ponieważ opierają się na lokalnych symulacjach wektora stanu, ale transpilacja obwodu może być nadal korzystna pod względem optymalizacji.
# 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)
Inicjalizacja Estimatora
Utwórz instancję qiskit.primitives.StatevectorEstimator.
from qiskit.primitives import StatevectorEstimator
estimator = StatevectorEstimator()
Uruchomienie i uzyskanie wyników
Ten przykład wykorzystuje tylko jeden obwód (typu QuantumCircuit) i jedną
obserwablę.
Uruchom estymację, wywołując metodę StatevectorEstimator.run, która zwraca instancję obiektu PrimitiveJob. Możesz uzyskać wyniki z zadania (jako obiekt qiskit.primitives.PrimitiveResult)
przy użyciu metody 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'>