Sampler-Beispiele
Paketversionen
Der Code auf dieser Seite wurde mit den folgenden Abhängigkeiten entwickelt. Wir empfehlen, diese oder neuere Versionen zu verwenden.
qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0
Erzeuge vollständige fehlergemilderte Quasi-Wahrscheinlichkeitsverteilungen, die aus den Ausgaben von Quantum-Circuit-Messungen gesampelt werden. Nutze die Fähigkeiten des Samplers für Such- und Klassifikationsalgorithmen wie Grover und QVSM.
Einzelnes Experiment ausführen
Verwende den Sampler, um das Messergebnis eines einzelnen Circuits als Bitstrings oder Counts (Häufigkeiten) zurückzugeben.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"numpy": "numpy", "qiskit": "qiskit", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_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")
import numpy as np
from qiskit.circuit.library import iqp
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.quantum_info import random_hermitian
from qiskit_ibm_runtime import QiskitRuntimeService
# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0
# from qiskit_ibm_runtime import Sampler
# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0
from qiskit_ibm_runtime.executor_sampler import Sampler
n_qubits = 127
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=n_qubits
)
mat = np.real(random_hermitian(n_qubits, seed=1234))
circuit = iqp(mat)
circuit.measure_all()
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(circuit)
sampler = Sampler(backend)
job = sampler.run([isa_circuit])
result = job.result()
# Get results for the first (and only) PUB
pub_result = result[0]
print(f" > First ten results: {pub_result.data.meas.get_bitstrings()[:10]}")
> First ten results: ['0111010010000101000101110000000101010000100111110000110011101100001100101111100100010110000110101001100010100001111010000110000', '0010001000101011111011110111001100101010110111001101100111100000011010010000100000011101010011101010000100101001101100000110001', '0010100110101011001001010111010110111011000101110001001011111010011010001000010010010001110010000001100000100110010000110010001', '1111000001010000010111000010100111001110101000100101000001110110001110010100010100010110001000001000100001101100100001101010100', '1100111010001011001011001010111100011100110010110011110010100001011101100110111000010000011110101010110101100001011000000000000', '0010111110001001110000001110001110010001111110100111100001001011000010000111000010011000100100000001001100001110000001100000110', '0110010101111101101111001101011100111000101110101101010100101010010000010000011000000100101110001010010110101001110001010000110', '0000001111111000001101101010111011010001111101101001111110100101100001110010000111011000000010101000100000000001101110000000001', '1011001100100101111000001000100100001011001001100001001010111011001000001010100111010001001110010101110000100001000100101111001', '1111100010100111000011010101000110011011110111011000000010101000100011000001000100000101000110001000000001001011101101110011000']
Mehrere Experimente in einem einzigen Job ausführen
Verwende den Sampler, um das Messergebnis mehrerer Circuits als Bitstrings oder Counts (Häufigkeiten) in einem einzigen Job zurückzugeben.
import numpy as np
from qiskit.circuit.library import iqp
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.quantum_info import random_hermitian
from qiskit_ibm_runtime import QiskitRuntimeService
# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0
# from qiskit_ibm_runtime import Sampler
# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0
from qiskit_ibm_runtime.executor_sampler import Sampler
n_qubits = 127
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=n_qubits
)
rng = np.random.default_rng()
mats = [np.real(random_hermitian(n_qubits, seed=rng)) for _ in range(3)]
circuits = [iqp(mat) for mat in mats]
for circuit in circuits:
circuit.measure_all()
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuits = pm.run(circuits)
sampler = Sampler(mode=backend)
job = sampler.run(isa_circuits)
result = job.result()
for idx, pub_result in enumerate(result):
print(
f" > First five results for pub {idx}: "
f"{pub_result.data.meas.get_bitstrings()[:5]}"
)
> First five results for pub 0: ['0000111110010100100011101001111111000010000000100001011110000101000111100110000000000110010000001001000001100000101101000000011', '1000001101000100111010110001100100100011111100001000011010100001001011001110000100100011100010010101000100001110001110000101000', '1010001100001101011000000110100001101000010101000000110010100001100010010000001000011100100101011001000001110101100000100010001', '0010010011001100001001111111001100001011010010010111011010111000010010100011011101101100110000101001001101000000001010000001000', '0000101100100011000111100010110010111000000101010101010101011010010010011011000110011010011001011110010101000111000111000100000']
> First five results for pub 1: ['1011011001010100010010111001111100011000110010000110000000100101101111100000010000011000100011101000101101001100000000011011000', '1110000000100001100111000010110011101110110010001011100001000000000100110011010010100010000100001111001101001000001000000011000', '0100000010010100010011000011111011010011010111110111110011101100110011111010111101011000110000001111110001110111001110000000001', '1110011011010111110110111000010111101010000110001101001000100000001010001001010000001000001110000000000110001101001010000010000', '1110010111110110100100100010100110101000001000100011100101001001110011001001011101000000000000110101010000100111010100010011000']
> First five results for pub 2: ['0011110001000000010000101101010100011011101101001111001000011011101010011010011000010001000001010101100100010000011100010000000', '1010110011100101001111110000110111110011101101100011000100001111001001101011000010100001000000100011110001101001001000101100001', '1111000011001100000101010110100010110001000000000111100111100011011101101001100110001010010000000101001000011100100001000011100', '0100101011111000010100001001001110001100001001100111011100010010000001000010100101101000001001101000110011010000001010101000000', '1101011000010000010011001111111011110111011101000011010001000000100010000110001010000101110000111101000110100000100011110110000']
Parametrisierte Circuits ausführen
Führe mehrere Experimente in einem einzigen Job aus und nutze dabei Parameterwerte, um die Wiederverwendbarkeit von Circuits zu erhöhen.
import numpy as np
from qiskit.circuit.library import real_amplitudes
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService
# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0
# from qiskit_ibm_runtime import Sampler
# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0
from qiskit_ibm_runtime.executor_sampler import Sampler
n_qubits = 127
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=n_qubits
)
# Step 1: Map classical inputs to a quantum problem
circuit = real_amplitudes(num_qubits=n_qubits, reps=2)
circuit.measure_all()
# Define three sets of parameters for the circuit
rng = np.random.default_rng(1234)
parameter_values = [
rng.uniform(-np.pi, np.pi, size=circuit.num_parameters) for _ in range(3)
]
# Step 2: Optimize problem for quantum execution.
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(circuit)
# Step 3: Execute using IBM Quantum primitives.
sampler = Sampler(backend)
job = sampler.run([(isa_circuit, parameter_values)])
result = job.result()
# Get results for the first (and only) PUB
pub_result = result[0]
# Get counts from the classical register "meas".
print(
f" >> First five results for the meas output register: "
f"{pub_result.data.meas.get_bitstrings()[:5]}"
)
>> First five results for the meas output register: ['0110001001111000110000000111110011100111100001110100111011011011001111100011011010110011111000000110111000110000001110100110111', '1110001011100111100000001110010100010110001011110100111111110111100001100010010000011111100010000100000111100010011000000010111', '0111100101110001001011010111111110111010001001100011000111001101101010001011101101000010110010000011010101001011101110010100101', '0110110010001000010010000110000010000100111111101011111000010111010101000110001010100110100010110000000010101011000011111110110', '0001010111110100001010000011010010101110000101100011001000111111000010101111110100000011010000101111110110111110011010001001101']
Batches und erweiterte Optionen verwenden
Erkunde den Batch-Ausführungsmodus und erweiterte Optionen, um die Circuit-Performance auf QPUs zu optimieren.
import numpy as np
from qiskit.circuit.library import iqp
from qiskit.quantum_info import random_hermitian
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import Batch, QiskitRuntimeService
# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0
# from qiskit_ibm_runtime import Sampler
# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0
from qiskit_ibm_runtime.executor_sampler import Sampler
n_qubits = 127
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=n_qubits
)
rng = np.random.default_rng(1234)
mat = np.real(random_hermitian(n_qubits, seed=rng))
circuit = iqp(mat)
circuit.measure_all()
mat = np.real(random_hermitian(n_qubits, seed=rng))
another_circuit = iqp(mat)
another_circuit.measure_all()
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(circuit)
another_isa_circuit = pm.run(another_circuit)
# The context manager automatically closes the batch.
with Batch(backend=backend) as batch:
sampler = Sampler(mode=batch)
job = sampler.run([isa_circuit])
another_job = sampler.run([another_isa_circuit])
result = job.result()
another_result = another_job.result()
# first job
print(
f" > The first five measurement results of job 1: "
f"{result[0].data.meas.get_bitstrings()[:5]}"
)
> The first five measurement results of job 1: ['0110100010111000010001000100100011111000100001010001000110010101011000100101000111010000110001010000001001101110101101000100000', '1001100000101110011000000101010000001100110110000101100011010001000000001001001000000011110000001110000000001001000000010000010', '0110000001010111011110011100010101101010011100000100001000110100010110100101111111000000010010001110100000000000000001100001100', '0000010011100000010111010111010100100100010000110110111111010111001010111101100010000100101011000000000010101110000011010001000', '0110000101011001001001111101011001111001100101000111010000001100111001000111111100000010001001110110010100110011000000000110110']
# second job
print(
" > The first five measurement results of job 2:",
another_result[0].data.meas.get_bitstrings()[:5],
)
> The first five measurement results of job 2: ['1001111000100001101101011000000001101101100101110001010110100000100111001011011110011010101001001010100100110001010000001000001', '1000111101000111011110110000000100010100011111110110001001101000001111111010001101010010111010000101101000001110100000110010001', '0101001101000011011000010101100101011110010010011000111100000000010010010010000001100000001001001000000010011110100011111100100', '0010110010110011100011001010100100011100001010001100110100000000111100111000000100011101111011011000101001000010100010101111000', '0011110001100010010111010010100110110010011000010000100100100000111011000011001001110100000110001010101000011000110001001101100']
Nächste Schritte
- Erweiterte Runtime-Optionen festlegen.
- Übe mit Primitiven, indem du die Lektion zu Kostenfunktionen im IBM Quantum Learning durcharbeitest.
- Lerne, wie du lokal transpilierst, im Abschnitt Transpilieren.
- Probiere die Anleitung Transpiler-Einstellungen vergleichen aus.
- Informiere dich über die Job-Limits, bevor du einen Job an eine IBM® QPU sendest.