Skip to main content
IBM Quantum Platform

TwoQubitPeepholeOptimization

class qiskit.transpiler.passes.TwoQubitPeepholeOptimization(*args, **kwargs)

GitHub

Basi: TransformationPass

Ottimizzazione unitaria unificata a due qubit con metodo “peephole”

Questo passaggio del transpiler è progettato per eseguire l'ottimizzazione unitaria "peephole" a due qubit. Questo passaggio individua tutti i blocchi da 2 qubit presenti nel circuito, calcola l'operatore unitario di ciascun blocco e quindi sintetizza tale operatore unitario. Se l'operatore unitario a due qubit sintetizzato risulta “migliore” del sottocircuito originale, quest'ultimo viene sostituito con il nuovo. L'euristica utilizzata per determinare quale sia la soluzione migliore esamina innanzitutto il numero di porte a due qubit presenti nel circuito e privilegia la sintesi con un numero inferiore di porte a due qubit; se il numero di porte a due qubit è lo stesso, esamina la fedeltà stimata del circuito e sceglie il sottocircuito con la fedeltà stimata più elevata; infine, se necessario, sceglie il sottocircuito con il minor numero totale di porte.

Nel caso in cui il target sia sovracompleto, il passaggio proverà tutti i decompositori supportati per tutti i gate supportati su un dato qubit. Verrà selezionata la scomposizione che, in base all'euristica sopra descritta, offre le migliori prestazioni attese e verrà utilizzata per sostituire il blocco.

Questo passaggio è progettato per essere eseguito su un circuito fisico e si presume che i dettagli delle operazioni su un dato qubit corrispondano al qubit hardware del target. Tuttavia, l'output del passaggio potrebbe non utilizzare operazioni hardware; in particolare, potrebbero essere emessi gate a singolo qubit che non rientrano tra le operazioni supportate dal target, in genere solo se per la sintesi viene utilizzato un gate parametrizzato supportato dal TwoQubitControlledUDecomposer . Pertanto, se si esegue questo passaggio in una fase di ottimizzazione fisica (come la fase di ottimizzazione), è opportuno abbinarlo a passaggi quali BasisTranslator e/o Optimize1qGatesDecomposition per garantire che questi gate su singolo qubit non corretti vengano sostituiti con operazioni supportate dall'hardware prima di uscire dalla fase.

Questo passaggio è multithread e eseguirà l'analisi in parallelo, utilizzando tutti i core disponibili sul sistema locale. Per maggiori dettagli su come gestire il comportamento del threading in Qiskit in generale — il che influirà anche su questo passaggio — è possibile consultare la guida alla configurazione

Questo pass ha una funzionalità simile all'esecuzione ConsolidateBlocks sequenziale di e UnitarySynthesis nel gestore dei pass. Tuttavia, questo passaggio offre prestazioni di esecuzione migliorate grazie all’esecuzione della sintesi in parallelo. Presenta inoltre euristiche migliorate, rese possibili dall'ottimizzazione in un unico passaggio, che possono garantire risultati di qualità superiore, specialmente nei casi in cui gli obiettivi siano sovracompleti e/o eterogenei. Tuttavia, queste euristiche e questo passaggio nel suo complesso sono validi solo per i circuiti fisici. Inoltre, a differenza di UnitarySynthesis pass, questa funzione non utilizza i plugin di sintesi unitaria. Si tratta di un compromesso in termini di prestazioni che comporta la rinuncia alla pluggabilità offerta da tale interfaccia. A livello interno, attualmente utilizza solo e TwoQubitControlledUDecomposer per sintetizzare le operazioni TwoQubitBasisDecomposer unitarie a due qubit. Non dovresti utilizzare questo pass se hai bisogno di utilizzare l'interfaccia pluggable e la possibilità di impiegare diversi algoritmi di sintesi; dovresti invece utilizzare una combinazione di ConsolidateBlocks e UnitarySynthesis per sfruttare il meccanismo dei plugin in UnitarySynthesis.

from qiskit.circuit import QuantumCircuit
from qiskit.transpiler.passes import TwoQubitPeepholeOptimization
from qiskit.providers.fake_provider import GenericBackendV2

# Build an unoptimized 2 qubit circuit
unoptimized = QuantumCircuit(2)
for i in range(10):
  if i % 2:
    unoptimized.cx(0, 1)
  else:
    unoptimized.cx(1, 0)
# Generate a target with random error rates
backend = GenericBackendV2(2, ["u", "cx"], coupling_map=[[0, 1], [1, 0]])
# Instantiate pass
peephole_pass = TwoQubitPeepholeOptimization(backend.target)
# Run pass and visualize output
optimized = peephole_pass(unoptimized)
optimized.draw("mpl")
Circuito ottimizzato

Inizializza il pass

Parametri

  • destinatario – Il destinatario a cui è rivolto il passaggio
  • approximation_degree – manopola euristica utilizzata per l'approssimazione dei circuiti (approssimazione 1.0=no, approssimazione 0.0=maximal ). L'approssimazione può ridurre il numero di porte utilizzate negli unitariani sintetizzati più piccoli, a costo di allontanarsi dall'unitario originale. Se None, l'approssimazione viene effettuata sulla base delle fedeltà dei gate specificate nel target.

Attributi

is_analysis_pass

Verifica se il ciclo è un ciclo di analisi.

Se il pass è di tipo " AnalysisPass, ", significa che è in grado di analizzare il DAG e di scrivere i risultati di tale analisi nel set di proprietà. Questo tipo di passaggio non consente di apportare modifiche al DAG.

is_transformation_pass

Verifica se il pass è un pass di trasformazione.

Se il pass è di tipo " TransformationPass, ", ciò significa che il pass può manipolare il DAG, ma non può modificare l'insieme delle proprietà (sebbene possa leggerlo).


Metodi

execute

execute(passmanager_ir, state, callback=None)

GitHub

Esegui l'operazione di ottimizzazione per l'IR di Qiskit in ingresso.

Parametri

  • passmanager_ir (DAGCircuit) – Qiskit IR da ottimizzare.
  • state (DAGCircuit) – Stato associato all'esecuzione del flusso di lavoro da parte dello stesso gestore dei passaggi.
  • callback (Callable[[Task, DAGCircuit, PropertySet, float, int], None] | None) – Una funzione di callback che viene chiamata ad ogni esecuzione di un'attività di ottimizzazione.

Risultati

IR ottimizzato di Qiskit e stato del flusso di lavoro.

Tipo di restituzione

tuple [ DAGCircuit, PassManagerState ]

name

name()

GitHub

Nome del passo.

Tipo di restituzione

STR

run

run(dag)

GitHub

Esegui un passaggio sul DAGCircuit. L'implementazione è a carico dello sviluppatore del pass.

Parametri

dag (DAGCircuit) – il giorno in cui si svolge la gara.

Aumenti

NotImplementedError – quando questa operazione non viene eseguita per un passaggio.

Tipo di restituzione

DAGCircuit

update_status

update_status(state, run_state)

GitHub

Aggiornare lo stato del flusso di lavoro.

Parametri

  • state (PassManagerState) – Passare lo stato del gestore per l'aggiornamento.
  • run_state (RunState) – Stato di completamento dell'attività corrente.

Risultati

Stato del gestore dei pass aggiornato.

Tipo di restituzione

PassManagerState

Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.