Skip to main content
IBM Quantum Platform

RelabelModes

class RelabelModes(permutation=None, *, solver=None, **kwargs)

Basi: GenericPass[DAGCircuit, DAGCircuit]

Un passaggio di transpilazione per riassegnare le etichette alle modalità fermioniche.

Questo passaggio riorganizza le modalità fermioniche di un circuito. Il riordino è descritto da una lista permutation , intesa come una corrispondenza tra l'indice della modalità originale e quello della nuova modalità: la modalità originale i viene collocata al nuovo indice nel permutation[i] circuito rietichettato. Ad esempio, permutation = [0, 2, 4, 1, 3, 5] assegna la modalità originale 1 al nuovo indice 2, la modalità originale 2 al nuovo indice 4 e così via. Trattandosi di una permutazione, ogni indice deve comparire esattamente una volta.

Post-elaborazione

La ridenominazione riorganizza le modalità fermioniche, il che a sua volta influenza la mappatura da fermioni a qubit scelta in una fase successiva della sintesi (e quindi la profondità del circuito ottenibile). Poiché l'ordine delle modalità cambia, qualsiasi stringa di bit campionata dal circuito finale viene espressa nel nuovo ordine delle modalità e deve essere rimappata all'ordine originale prima di poter essere interpretata. La rietichettatura effettivamente applicata è registrata in un campo permutation dei FermionicDAGCircuitrisultati restituiti metadata.

Importante

Leggere sempre la rietichettatura dai metadati del circuito piuttosto che da permutation. Quando si utilizza l'ottimizzazione automatica (ovvero permutationNone), la permutazione applicata è disponibile solo dai metadati; e anche quando permutation è stata fornita esplicitamente, si garantisce che i metadati riflettano ciò che ha fatto il passaggio.

Si noti che il campo dei metadati permutation è presente solo quando il passaggio ha effettivamente riassegnato l'etichetta al circuito. Quando il passaggio non ha alcun effetto – ad esempio, quando l'ottimizzazione automatica non può essere eseguita perché solver manca una pyomo dipendenza opzionale o un – il circuito restituito rimane invariato e non contiene alcun metadato permutation , pertanto è necessario accedervi con cautela (ad es. qcirc.metadata.get("permutation")).

Dal punto di vista concettuale, annullare la ridenominazione assegna a ciascuna modalità originale il m valore che era stato misurato per la nuova modalità permutation[m]. In pratica, la situazione è complicata dal fatto che le FermionicRegister modalità e i bit classici di Qiskit seguono un ordine opposto (little-endian), per cui l'operazione di raccolta nello spazio delle modalità si trasforma in una negazione dell'indice (~idx) seguita da un'inversione finale ([::-1]) sulle stringhe di bit dei conteggi.

L'esempio riportato di seguito riassegna le etichette a un sistema a sei modalità, passando da un ordinamento degli spin a blocchi ([u0, u1, u2, d0, d1, d2]) a uno intercalato ([u0, d0, u1, d1, u2, d2]), una tecnica comunemente utilizzata per ridurre la profondità di implementazione, per poi annullare la riassegnazione delle etichette sui conteggi campionati:

>>> from qiskit.passmanager import MultiStagePassManager
>>> from qiskit.providers.basic_provider import BasicSimulator
>>> from qiskit_fermions.circuit import FermionicCircuit
>>> from qiskit_fermions.circuit.library import InitializeModes
>>> from qiskit_fermions.transpiler import FermionicCircuitToDAG, QuantumDAGToCircuit
>>> from qiskit_fermions.transpiler.passes import (
...     F2QSynthesis, F2QSynthesisPluginManager, RelabelModes, TrivialF2QLayout,
... )
>>>
>>> # blocked occupation: spin-up orbitals 0 and 1 and spin-down orbital 0 are occupied
>>> circ = FermionicCircuit(6)
>>> circ.append(InitializeModes([1, 1, 0, 1, 0, 0]), circ.modes)
>>>
>>> synth_plugins = F2QSynthesisPluginManager()
>>> synth = F2QSynthesis()
>>> synth.methods["InitializeModes"] = synth_plugins.method("InitializeModes", "TrivialOccupation")()
>>>
>>> # map blocked mode order onto the interleaved one
>>> relabel = RelabelModes(permutation=[0, 2, 4, 1, 3, 5])
>>>
>>> pm = MultiStagePassManager(
...     init=FermionicCircuitToDAG(),
...     optimization=relabel,
...     layout=TrivialF2QLayout(),
...     synthesis=synth,
...     output=QuantumDAGToCircuit(),
... )
>>>
>>> qcirc = pm.run(circ)
>>> qcirc.measure_all()
>>>
>>> bit_permutation = qcirc.metadata.get("permutation")
>>> print(bit_permutation)
[0, 2, 4, 1, 3, 5]
>>>
>>> res = BasicSimulator().run(qcirc, shots=1).result()
>>> counts = res.get_counts()
>>> print(counts)  # measured in the interleaved ordering
{'000111': 1}
>>>
>>> # undo the relabeling to recover the counts in the original blocked ordering
>>> post_processed = {
...     "".join(bitstring[~idx] for idx in bit_permutation)[::-1]: count
...     for bitstring, count in counts.items()
... }
>>> print(post_processed)  # recovered in the original blocked ordering
{'001011': 1}

L'inizializzazione di questo passaggio del transpiler può essere effettuata utilizzando gli argomenti elencati di seguito.

Parametri

  • permutation (list[int] | None) – la permutazione degli indici utilizzata per riassegnare gli indici delle modalità fermioniche. Quando ciò avviene None, verrà determinata automaticamente una permutazione in base a build_excitation_span_minimization_model(). permutation Per ulteriori dettagli, consulta anche [...].
  • solver (pyomo.opt.SolverFactory | None) – l'istanza del risolutore di problemi di ottimizzazione utilizzata per risolvere il problema build_excitation_span_minimization_model() . Quando ciò si verifica None, non permutation è possibile determinare automaticamente alcun valore. solver Per ulteriori dettagli, consulta anche [...].
  • kwargs – eventuali argomenti chiave aggiuntivi verranno inoltrati a build_excitation_span_minimization_model().

Attributi

permutation

La permutazione degli indici utilizzata per riassegnare gli indici delle modalità fermioniche.

Può trattarsi di una mappatura list[int]che associa l'indice della modalità originale i al nuovo indice della modalità ( permutation[i] per ulteriori dettagli, consultare la stringa di documentazione della classe). La sua lunghezza deve corrispondere al numero di modi fermionici del circuito oggetto della transpilazione, e ogni indice deve comparire esattamente una volta. Questo scenario richiede quindi che il passaggio del transpiler sia adattato in modo molto specifico al circuito dell'utente.

Oppure potrebbe essere che None, in tal caso, la funzione build_excitation_span_minimization_model() venga utilizzata per definire un problema di ottimizzazione che cerchi di minimizzare lo span di tutte le eccitazioni fermioniche presenti. In questo caso, la permutazione applicata è disponibile solo dai metadati del circuito transpilato (vedere la stringa di documentazione della classe).

Nota

L'utilizzo di questo modello di ottimizzazione è implementato solo per i gate di evoluzione temporale che contengono un'istanza FermionOperator .

solver

L'istanza del risolutore di problemi di ottimizzazione per individuare automaticamente permutation.

Quando permutation è None, il problema di ottimizzazione definito da build_excitation_span_minimization_model() viene utilizzato per individuare automaticamente una buona permutazione degli indici di modalità. In tal caso, l'utente deve fornire un ottimizzatore per risolvere questo modello.


Metodi

find_permutation

find_permutation(dag)

Trova un indice di modalità permutation se non specificato dall'utente.

Questa funzione viene chiamata solo quando non permutation è specificato dall'utente (cioè quando è None). In tal caso, procede come segue:

  1. Assicurati che la dipendenza opzionale pyomo sia installata. In caso contrario, non è possibile eseguire alcuna ottimizzazione e questa fase del transpiler non ha alcun effetto.
  2. assicurarsi che solver sia specificato un. In caso contrario, non è possibile eseguire alcuna ottimizzazione e questa fase del transpiler non ha alcun effetto.
  3. raccogliere tutte le eccitazioni fermioniche da qualsiasi gate Evolution contenente un’istanza FermionOperator di.
  4. costruire il problema di ottimizzazione utilizzando build_excitation_span_minimization_model(), inoltrando eventuali argomenti chiave aggiuntivi (kwargs) provenienti dal momento in cui è stato creato questo passaggio del transpiler.
  5. risolvere il problema di ottimizzazione utilizzando solver ed estrarre la permutazione finale.

Parametri

dag (FermionicDAGCircuit) – il circuito da sottoporre a transpilazione.

Risultati

La permutazione da utilizzare. In tal caso None, questa fase di transpilazione non avrà alcun effetto.

Aumenti

NotImplementedError – quando si incontra un gate Evolution contenente un operatore che non è un’istanza FermionOperator di.

Tipo di restituzione

tuple [ list [ int ] | None, pyomo.opt.results.results_.SolverResults | None]

run

run(dag)

Esegue questo ciclo di transpilazione.

Parametri

dag (DAGCircuit) – il circuito di ingresso con istruzioni basate sui fermioni. Sono op supportate solo le istanze FermionicGate come quelle indicate DAGOpNode .

Risultati

Il circuito di uscita che continua ad agire su un registro fermionico.

Aumenti

NotImplementedError – quando il circuito di ingresso fornito dispone di più di un registro.

Tipo di restituzione

DAGCircuit

Metodi ereditati

execute

execute(passmanager_ir, state, callback=None)

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

Parametri

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

Risultati

IR ottimizzato di Qiskit e stato del flusso di lavoro.

Tipo di restituzione

tupla [ IR_OUT, PassManagerState ]

name

name()

Nome del passo.

Tipo di restituzione

STR

update_status

update_status(state, run_state)

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.