Vai al contenuto principale

Funzione IBM Circuit

Nota
  • Le Qiskit Functions sono una funzionalità sperimentale disponibile solo per gli utenti di IBM Quantum® Premium Plan, Flex Plan e On-Prem (tramite IBM Quantum Platform API) Plan. Sono in stato di anteprima e soggette a modifiche.

Panoramica​

IBM® circuito function accetta come input PUB astratti e restituisce come output valori di aspettazione mitigati. Questa circuit function include una pipeline automatizzata e personalizzata per consentire ai ricercatori di concentrarsi sulla scoperta di algoritmi e applicazioni.

Descrizione​

Dopo aver inviato il tuo PUB, i tuoi circuiti astratti e le osservabili vengono automaticamente transpilati, eseguiti sull'hardware e post-elaborati per restituire valori di aspettazione mitigati. Per farlo, vengono combinati i seguenti strumenti:

IBM Circuit function

Inizia​

Autenticati usando la tua chiave API e seleziona la Qiskit Function come segue. (Questo snippet presuppone che tu abbia già salvato il tuo account nel tuo ambiente locale.)

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-catalog qiskit-ibm-runtime
from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

function = catalog.load("ibm/circuit-function")

Esempio​

Per iniziare, prova questo esempio di base:

from qiskit.circuit.random import random_circuit
from qiskit_ibm_runtime import QiskitRuntimeService

# You can skip this step if you have a target backend, e.g.
# backend_name = "ibm_brisbane"
# You'll need to specify the credentials when initializing QiskitRuntimeService, if they were not previously saved.
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)

circuit = random_circuit(num_qubits=2, depth=2, seed=42)
observable = "Z" * circuit.num_qubits
pubs = [(circuit, observable)]

job = function.run(
# Use `backend_name=backend_name` if you didn't initialize a backend object
backend_name=backend.name,
pubs=pubs,
)

Controlla lo stato del tuo workload Qiskit Function o recupera i risultati come segue:

print(job.status())
result = job.result()
QUEUED

I risultati hanno lo stesso formato di un risultato Estimator:

print(f"The result of the submitted job had {len(result)} PUB\n")
print(
f"The associated PubResult of this job has the following DataBins:\n {result[0].data}\n"
)
print(f"And this DataBin has attributes: {result[0].data.keys()}")
print(
f"The expectation values measured from this PUB are: \n{result[0].data.evs}"
)
The result of the submitted job had 1 PUB

The associated PubResult of this job has the following DataBins:
DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>))

And this DataBin has attributes: dict_keys(['evs', 'stds', 'ensemble_standard_error'])
The expectation values measured from this PUB are:
1.02116704805492

Input​

Consulta la tabella seguente per tutti i parametri di input accettati da IBM Circuit function. La successiva sezione Opzioni fornisce ulteriori dettagli sulle options disponibili.

NomeTipoDescrizioneObbligatorioDefaultEsempio
backend_namestrNome del backend su cui eseguire la query.SìN/Aibm_fez
pubsIterable[EstimatorPubLike]Un iterabile di oggetti PUB-like astratti (primitive unified bloc), come tuple (circuit, observables) o (circuit, observables, parameter_values). Consulta Panoramica dei PUB per ulteriori informazioni. I circuiti possono essere astratti (non-ISA).SìN/A(circuit, observables, parameter_values)
optionsdictOpzioni di input. Consulta la sezione Opzioni per maggiori dettagli.NoConsulta la sezione Opzioni per i dettagli.{"optimization_level": 3}
instancestrIl cloud resource name dell'istanza da utilizzare in quel formato.NoNe viene scelta una casualmente se il tuo account ha accesso a più istanze.CRN

Opzioni​

Struttura​

Analogamente alle primitive Qiskit Runtime, le opzioni per IBM Circuit function possono essere specificate come dizionario annidato. Le opzioni più comuni, come optimization_level e mitigation_level, si trovano al primo livello. Altre opzioni più avanzate sono raggruppate in diverse categorie, come resilience.

Valori predefiniti​

Se non specifichi un valore per un'opzione, viene utilizzato il valore predefinito specificato dal servizio.

Livello di mitigazione​

IBM Circuit function supporta anche mitigation_level. Il livello di mitigazione specifica quanta soppressione e mitigazione degli errori applicare al job. Livelli più alti producono risultati più accurati, a scapito di tempi di elaborazione più lunghi. Il grado di riduzione degli errori dipende dal metodo applicato. Il livello di mitigazione astrae la scelta dettagliata dei metodi di mitigazione e soppressione degli errori per consentire agli utenti di ragionare sul compromesso costo/accuratezza appropriato per la loro applicazione. La tabella seguente mostra i metodi corrispondenti per ciascun livello.

nota

Sebbene i nomi siano simili, mitigation_level applica tecniche diverse da quelle usate da resilience_level dell'Estimator.

Analogamente a resilience_level in Qiskit Runtime Estimator, mitigation_level specifica un insieme base di opzioni curate. Tutte le opzioni che specifichi manualmente in aggiunta al livello di mitigazione vengono applicate sopra l'insieme base di opzioni definito dal livello di mitigazione. Quindi, in linea di principio, potresti impostare il livello di mitigazione a 1 e poi disattivare la mitigazione delle misure, anche se ciò non è consigliato.

Livello di mitigazioneTecnica
1 [Predefinito]Dynamical decoupling + measurement twirling + TREX
2Livello 1 + gate twirling + ZNE tramite gate folding
3Livello 1 + gate twirling + ZNE tramite PEA

L'esempio seguente mostra come impostare il livello di mitigazione:

options = {"mitigation_level": 2}

job = function.run(backend_name=backend.name, pubs=pubs, options=options)

Tutte le opzioni disponibili​

Oltre a mitigation_level, IBM Circuit function offre anche un numero selezionato di opzioni avanzate che ti permettono di affinare il compromesso costo/accuratezza. La tabella seguente mostra tutte le opzioni disponibili:

OpzioneSotto-opzioneSotto-sotto-opzioneDescrizioneValoriDefault
default_precisionLa precisione predefinita da usare per qualsiasi PUB o chiamata run()
che non ne specifichi una.
Ogni PUB di input può specificare la propria precisione. Se al metodo run() viene fornita una precisione, tale valore viene usato per tutti i PUB nella chiamata run() che non specificano la propria.
float > 00.015625
max_execution_timeTempo massimo di esecuzione in secondi, basato
sull'utilizzo della QPU (non sul tempo reale). L'utilizzo della QPU è il
tempo in cui la QPU è dedicata all'elaborazione del tuo job. Se un job supera questo limite di tempo, viene annullato forzatamente.
Numero intero di secondi nell'intervallo [1, 10800]
mitigation_levelQuanta soppressione e mitigazione degli errori applicare. Consulta la sezione Livello di mitigazione per ulteriori informazioni sui metodi usati a ciascun livello.1 / 2 / 31
optimization_levelQuanta ottimizzazione eseguire sui circuiti. I livelli più alti generano circuiti più ottimizzati, a scapito di tempi di transpilazione più lunghi.1 / 2 / 32
dynamical_decouplingenableSe abilitare il dynamical decoupling. Consulta Tecniche di soppressione e mitigazione degli errori per la spiegazione del metodo.True/FalseTrue
sequence_typeQuale sequenza di dynamical decoupling usare.
* XX: usa la sequenza tau/2 - (+X) - tau - (+X) - tau/2
* XpXm: usa la sequenza tau/2 - (+X) - tau - (-X) - tau/2
* XY4: usa la sequenza
tau/2 - (+X) - tau - (+Y) - tau (-X) - tau - (-Y) - tau/2
'XX'/'XpXm'/'XY4''XX'
twirlingenable_gatesSe applicare il gate twirling su gate Clifford a 2 qubit.True/FalseFalse
enable_measureSe abilitare il twirling delle misure.True/FalseTrue
resiliencemeasure_mitigationSe abilitare il metodo di mitigazione degli errori di misura TREX. Consulta Tecniche di soppressione e mitigazione degli errori per la spiegazione del metodo.True/FalseTrue
zne_mitigationSe attivare il metodo di mitigazione degli errori Zero Noise Extrapolation. Consulta Tecniche di soppressione e mitigazione degli errori per la spiegazione del metodo.True/FalseFalse
zneamplifierQuale tecnica usare per amplificare il rumore. Una tra:
- gate_folding (default) usa il gate folding a 2 qubit per amplificare il rumore. Se il fattore di rumore richiede di amplificare solo un sottoinsieme di gate, questi vengono scelti casualmente.

- gate_folding_front usa il gate folding a 2 qubit per amplificare il rumore. Se il fattore di rumore richiede di amplificare solo un sottoinsieme di gate, questi vengono selezionati dall'inizio del circuito DAG ordinato topologicamente.

- gate_folding_back usa il gate folding a 2 qubit per amplificare il rumore. Se il fattore di rumore richiede di amplificare solo un sottoinsieme di gate, questi vengono selezionati dalla fine del circuito DAG ordinato topologicamente.

- pea usa una tecnica chiamata Probabilistic Error Amplification (PEA) per amplificare il rumore. Consulta Tecniche di soppressione e mitigazione degli errori per la spiegazione del metodo.
gate_folding / gate_folding_front / gate_folding_back / peagate_folding
noise_factorsFattori di rumore da usare per l'amplificazione del rumore.lista di float; ogni float >= 1(1, 1.5, 2) per PEA, e (1, 3, 5) negli altri casi.
extrapolatorFattori di rumore a cui valutare i modelli di estrapolazione del fit. Questa opzione non influisce sull'esecuzione né sul fitting del modello in alcun modo; determina solo i punti in cui gli oggetti extrapolator vengono valutati per essere restituiti nei campi dati chiamati evs_extrapolated e stds_extrapolated.uno o più tra exponential,linear, double_exponential,polynomial_degree_(1 <= k <= 7)(exponential, linear)
pec_mitigationSe attivare il metodo di mitigazione degli errori Probabilistic Error Cancellation. Consulta Tecniche di soppressione e mitigazione degli errori per la spiegazione del metodo.True/FalseFalse
pecmax_overheadIl massimo overhead di campionamento del circuito consentito, o None per nessun massimo.None/ intero >1100

Nell'esempio seguente, impostare il livello di mitigazione a 1 disattiva inizialmente la mitigazione ZNE, ma impostare zne_mitigation a True sovrascrive la configurazione corrispondente di mitigation_level.

options = {"mitigation_level": 1, "resilience": {"zne_mitigation": True}}

Output​

L'output di una circuito function è un PrimitiveResult, che contiene due campi:

  • Uno o più oggetti PubResult. Questi possono essere indicizzati direttamente dal PrimitiveResult.

  • Metadati a livello di job.

Ogni PubResult contiene un campo data e un campo metadata.

  • Il campo data contiene almeno un array di valori di aspettazione (PubResult.data.evs) e un array di errori standard (PubResult.data.stds). Può contenere anche altri dati, a seconda delle opzioni usate.

  • Il campo metadata contiene i metadati a livello di PUB (PubResult.metadata).

Il seguente snippet di codice descrive il formato di PrimitiveResult (e del relativo PubResult).

print(f"The result of the submitted job had {len(result)} PUB")
print(
f"The expectation values measured from this PUB are: \n{result[0].data.evs}"
)
print(f"And the associated metadata is: \n{result[0].metadata}")
The result of the submitted job had 1 PUB
The expectation values measured from this PUB are:
1.02116704805492
And the associated metadata is:
{'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}

Recupero dei messaggi di errore​

Se lo stato del tuo workload è ERROR, usa job.result() per recuperare il messaggio di errore e facilitare il debug come segue:

job = function.run(
backend_name="bad_backend_name", pubs=pubs, options=options
)

print(job.result())

Ottenere supporto​

Contatta il supporto IBM Quantum e includi le seguenti informazioni:

  • Qiskit Function Job ID (qiskit-ibm-catalog), job.job_id
  • Una descrizione dettagliata del problema
  • Eventuali messaggi o codici di errore pertinenti
  • I passaggi per riprodurre il problema

Passi successivi​

Raccomandazioni