Avvio rapido con Executor
Versioni dei pacchetti
Il codice in questa pagina è stato sviluppato con i seguenti requisiti. Ti consigliamo di utilizzare queste versioni o versioni più recenti.
qiskit[all]~=2.4.0
qiskit-ibm-runtime~=0.46.1
samplomatic~=0.18.0
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime samplomatic
Analogamente alla primitiva Sampler, Executor campiona i registri di output dalle esecuzioni di Circuit quantistici, ma non dispone di alcuna soppressione o mitigazione degli errori integrata. È invece parte del modello di esecuzione diretto che fornisce gli ingredienti per catturare gli intenti di progettazione sul lato client e spostare la costosa generazione di varianti di Circuit sul lato server. Executor segue le direttive fornite nelle annotazioni e nelle opzioni del circuito, genera e associa i valori dei parametri, esegue i circuito associati sull'hardware e restituisce i risultati dell'esecuzione e i metadati. Non prende alcuna decisione implicita per te e ti offre pieno controllo e trasparenza.
Il pacchetto Qiskit non dispone ancora di una classe base per la primitiva Executor.
Prima di iniziare
Alcuni degli esempi di codice in questa pagina utilizzano samplex, che fa parte del pacchetto Samplomatic. Pertanto, prima di eseguire quei blocchi di codice, devi installare Samplomatic, come mostrato nel seguente blocco di codice. Per ulteriori informazioni, consulta la documentazione di Samplomatic.
pip install samplomatic
# For visualization support, include the visualization dependencies.
# pip install samplomatic[vis]
Passaggi per utilizzare la primitiva Executor
1. Inizializza l'account
Poiché Qiskit Runtime è un servizio gestito, devi prima inizializzare il tuo account. Puoi quindi selezionare la QPU che desideri utilizzare per calcolare il valore di aspettazione.
Segui i passaggi in Configura il tuo account IBM Cloud® se non hai già un account.
from qiskit_ibm_runtime import QiskitRuntimeService, Executor
from qiskit_ibm_runtime.quantum_program import QuantumProgram
from qiskit.circuit import QuantumCircuit
from qiskit.transpiler import generate_preset_pass_manager
from samplomatic.transpiler import generate_boxing_pass_manager
from samplomatic import build
# Initialize the service and choose a backend
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
print(backend)
<IBMBackend('ibm_fez')>
2. Crea e transpila un circuito
Hai bisogno di almeno un circuito per utilizzare la primitiva Executor. Può facoltativamente avere parametri.
# Generate the circuit
circuit = QuantumCircuit(2)
circuit.h(0)
circuit.h(1)
circuit.cz(0, 1)
circuit.h(1)
# Using `measure_all` automatically creates the necessary
# classical registers.
circuit.measure_all()
Il circuito deve essere trasformato per usare solo le istruzioni supportate dalla QPU (chiamati circuiti instruction set architecture (ISA)). Usa il Transpiler per farlo.
# Transpile the circuit
preset_pass_manager = generate_preset_pass_manager(
backend=backend, optimization_level=0
)
isa_circuit = preset_pass_manager.run(circuit)
3. Inizializza un QuantumProgram
Inizializza un QuantumProgram con il tuo carico di lavoro. Un QuantumProgram è composto da QuantumProgramItems. Tipicamente, ogni elemento è composto da un circuito, un insieme di valori dei parametri e possibilmente un samplex per randomizzare il contenuto del circuito. Per i dettagli completi, consulta Input e output di Executor.
La seguente cella inizializza un QuantumProgram e specifica di eseguire 25 shot. Poi aggiunge il circuito target transpilato.
# Initialize an empty program
program = QuantumProgram(shots=25)
# Append the circuit to the program
program.append_circuit_item(isa_circuit)
4. Opzionale: Raggruppa gate e misurazioni in box annotati
Raggruppare le istruzioni in box e annotarle è il modo principale per specificare il tuo intento. Nell'esempio seguente, usiamo generate_boxing_pass_manager e i suoi parametri di twirling per raggruppare i gate a due qubit e le misurazioni in box e applicare l'annotazione di twirling.
# Generate a boxing pass manager to group gates
# and measurements into boxes and add
# a`Twirl` annotation.
boxes_pm = generate_boxing_pass_manager(
# Add gate twirling
enable_gates=True,
# Add measurement twirling
enable_measures=True,
)
boxed_circuit = boxes_pm.run(isa_circuit)
boxed_circuit.draw("mpl", idle_wires=False)
5. Opzionale: Costruisci un circuito template e un samplex e aggiungili al programma
Poi, usa il metodo Samplomatic build per generare la coppia Circuit template e samplex. Il circuito template è strutturalmente equivalente al circuito originale. Tuttavia, i suoi gate a singolo qubit vengono sostituiti da gate parametrizzati per implementare le annotazioni prescritte (twirling di gate e misurazioni, in questo esempio). Il samplex codifica tutte le informazioni necessarie per generare parametri randomizzati per il circuito template.
Dopo aver generato la coppia Circuit template e samplex, usa il metodo append_samplex_item per aggiungere la coppia al programma.
Consulta la documentazione dell'API di Samplomatic per i dettagli completi su samplomatic.samplex.Samplex e i suoi argomenti.
# Build the template circuit and the samplex
template_circuit, samplex = build(boxed_circuit)
# Append the template circuit and samplex as a `samplex_item`
program.append_samplex_item(
template_circuit,
samplex=samplex,
shape=(num_randomizations := 20,),
)
6. Invoca Executor e ottieni i risultati
Esegui il QuantumProgram su un backend IBM® utilizzando la primitiva Executor con le opzioni predefinite. Consulta le opzioni di Executor per informazioni sulle opzioni disponibili.
# Initialize an Executor with the default options
executor = Executor(mode=backend)
# Submit the job
job = executor.run(program)
job
<RuntimeJobV2('d8286580bvlc73d1vmsg', 'executor')>
# Retrieve the result
result = job.result()
Il risultato è di tipo QuantumProgramResult. Consulta Input e output di Executor per informazioni sull'oggetto risultato.
Passi successivi
- Prova alcuni esempi di Executor.
- Comprendi l'input e output di Executor.
- Scopri le semantiche di broadcasting di Executor.