Vai al contenuto principale
Questo progetto è in fase beta. Hai trovato un bug? Apri una issue su GitHub. Hai una domanda o un'idea? Chiedi su GitHub Discussions — apprezziamo il tuo feedback!
Com'è la qualità della traduzione su questa pagina?

Avvio rapido con Sampler

Il compito principale di Sampler è campionare il registro di output dall'esecuzione di uno o più Circuit quantistici. I Circuit dinamici e i circuiti parametrizzati sono accettati come input (se vengono inviati Circuit parametrizzati, è necessario fornire anche i valori dei parametri). Sampler supporta anche il decoupling dinamico integrato e il twirling per la soppressione degli errori.

I passaggi in questo argomento descrivono come configurare Sampler, esplorare le opzioni che puoi usare per configurarlo e invocarlo in un programma.

Nuova implementazione di Sampler

Nuove implementazioni delle interfacce Qiskit SamplerV2 ed EstimatorV2 sono state introdotte in qiskit-ibm-runtime v0.50.0. Queste primitive lato client svolgono sul client la maggior parte della pre- e post-elaborazione e delegano l'esecuzione alla primitiva Executor. L'esecuzione lato client offre maggiore trasparenza, feedback di debug più rapido e controllo più fine.

Poiché implementano la stessa API, queste primitive lato client sono in gran parte sostituti immediati delle primitive legacy lato server, con l'unica modifica costituita dall'istruzione di importazione. Consulta Migra da Sampler ed Estimator lato server a lato client per maggiori informazioni.

Versioni dei pacchetti

Il codice in questa pagina è stato sviluppato con i seguenti requisiti. Ti consigliamo di usare queste versioni o versioni più recenti.

qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0

Passaggi per utilizzare la primitiva Sampler​

1. Inizializza l'account​

Prima devi inizializzare il tuo account. Puoi quindi selezionare la QPU che desideri utilizzare.

Segui i passaggi nell'argomento Configura il tuo account IBM Cloud se non hai già un account configurato.

gate frazionari

Per utilizzare i gate frazionari supportati di recente, imposta use_fractional_gates=True quando richiedi un backend da un'istanza di QiskitRuntimeService. Ad esempio:

service = QiskitRuntimeService()
fractional_gate_backend = service.least_busy(use_fractional_gates=True)

Questa è una funzionalità sperimentale e potrebbe cambiare in futuro.

# 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")
from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)

2. Crea un circuito​

Hai bisogno di almeno un circuito come input per la primitiva Sampler.

import numpy as np
from qiskit.circuit.library import efficient_su2

circuit = efficient_su2(127, entanglement="linear")
circuit.measure_all()
# The circuit is parametrized, so we will define the parameter values for execution
param_values = np.random.rand(circuit.num_parameters)

Il circuito e l'osservabile devono essere trasformati per usare solo le istruzioni supportate dalla QPU (chiamati circuiti instruction set architecture (ISA)). Usa il Transpiler per farlo.

from qiskit.transpiler import generate_preset_pass_manager

pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
isa_circuit = pm.run(circuit)
print(f">>> Circuit ops (ISA): {isa_circuit.count_ops()}")
>>> Circuit ops (ISA): OrderedDict([('rz', 3036), ('sx', 1769), ('cz', 378), ('measure', 127), ('barrier', 1)])

3. Inizializza l'IBM Quantum Sampler​

Quando inizializzi Sampler, usa il parametro mode per specificare la modalità in cui vuoi che venga eseguito. I valori possibili sono oggetti batch, session o backend per la modalità di esecuzione batch, session e job rispettivamente. Per ulteriori informazioni, consulta Introduzione alle modalità di esecuzione di IBM Quantum Compute Service. Nota che gli utenti del piano Open non possono inviare job di Session.

# 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

sampler = Sampler(mode=backend)

4. Invoca Sampler e ottieni i risultati​

Poi, invoca il metodo run() per generare l'output. Il circuito e i set di valori dei parametri opzionali vengono passati come tuple primitive unified bloc (PUB).

job = sampler.run([(isa_circuit, param_values)])
print(f">>> Job ID: {job.job_id()}")
print(f">>> Job Status: {job.status()}")
>>> Job ID: dab7lb6rrl7c7386gjgg
>>> Job Status: QUEUED
result = job.result()

# Get results for the first (and only) PUB
pub_result = result[0]
print(
f"First ten results for the 'meas' output register: "
f"{pub_result.data.meas.get_bitstrings()[:10]}"
)
First ten results for the 'meas' output register: ['1110001000100100100111011000001001000101010000001100010010110011001100110111100000000110001000011001101000110100101110101010011', '1110101100010101010001010111111011000110011010100101001100110101010010101010101110001010100100000000011110101101011000100000100', '1100110011101000110000000100110111101010110001100010111100001101100001010100111001101010101110000101010001001101010101001000100', '1011001001011000000101010111111010011101001111010100001011110011000101110101011001100110011011110011101010000111001111110110011', '1110111011011111101011110101110101010110011001100110101111100100011101100011011100101100101001001111110101111010101110111111011', '0101001110001110010001010100010111011001000000011110000000000001110000010010101101011001000100000001011011101111010010110111110', '1101101001000100010000110001000101010010101011000011000011001010000111100110010101010110100110011010101100001011100110001111011', '1000110011111111100010101010101111001001100001110111101001100111010101010111110110011000110011010010010000100000100010010010101', '0101010100110011110011010000000100011001111100101100101100101111101110100001101101111010100011011000010011111010001100110000010', '0010000111011100000000110000001110001100010011000100101110111111100011001100011001101010011111111100000000011100101101111010100']

Passi successivi​

Consigli