Skip to main content
IBM Quantum Platform

RelabelModes

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

Basiszeichen: GenericPass[DAGCircuit, DAGCircuit]

Ein Transpilierungsdurchlauf zur Neubenennung der Fermionenmoden.

Dieser Durchlauf ordnet die Fermionenmoden eines Schaltkreises neu an. Die Neuanordnung wird durch eine Liste permutation beschrieben, die als Zuordnung vom ursprünglichen zum neuen Modusindex zu verstehen ist: Der ursprüngliche Modus i wird im permutation[i] neu beschrifteten Schaltkreis an den neuen Index gesetzt. Beispielsweise wird der ursprüngliche Modus 1 an den neuen Index permutation = [0, 2, 4, 1, 3, 5] gesetzt 2, der ursprüngliche Modus 2 an den neuen Index 4und so weiter. Da es sich um eine Permutation handelt, darf jeder Index genau einmal vorkommen.

Nachbearbeitung

Durch die Neukennzeichnung werden die Fermionenmoden neu geordnet, was wiederum die in einer späteren Synthesephase gewählte Abbildung von Fermionen auf Qubits (und damit die erreichbare Schaltungstiefe) beeinflusst. Da sich die Modusreihenfolge ändert, wird jede aus der endgültigen Schaltung abgetastete Bitfolge in der neuen Modusreihenfolge dargestellt und muss in die ursprüngliche Reihenfolge zurückgewandelt werden, bevor sie interpretiert werden kann. Die tatsächlich vorgenommene Umbenennung wird in einem Feld permutation der zurückgegebenen FermionicDAGCircuitaufgezeichnet metadata.

Wichtig

Lesen Sie die Umbenennung immer aus den Metadaten des Schaltkreises und nicht aus permutation. Wenn die automatische Optimierung verwendet wird (d. h. permutation ist None), ist die angewandte Permutation nur über die Metadaten verfügbar; und selbst wenn explizit angegeben permutation wurde, spiegeln die Metadaten garantiert wider, was der Durchlauf bewirkt hat.

Beachten Sie, dass das permutation Metadatenfeld nur vorhanden ist, wenn der Durchlauf die Schaltung tatsächlich neu beschriftet hat. Wenn der Durchlauf keine Auswirkungen hat – beispielsweise wenn die automatische Optimierung nicht ausgeführt werden kann, weil die optionale pyomo Abhängigkeit oder ein solver fehlt –, bleibt die zurückgegebene Schaltung unverändert und enthält keine Metadaten permutation ; greifen Sie daher vorsichtig darauf zu (z. B. qcirc.metadata.get("permutation")).

Konzeptionell wird durch das Rückgängigmachen der Neubenennung jedem ursprünglichen Modus der m Wert zugewiesen, der für den neuen Modus gemessen wurde permutation[m]. In der Praxis wird dies dadurch erschwert, dass die Modi FermionicRegister und die klassischen Bits von Qiskit in entgegengesetzter (Little-Endian-)Reihenfolge ablaufen, sodass das Sammeln im Modusraum zu einer Indexnegation (~idx) führt, gefolgt von einer abschließenden Umkehrung ([::-1]) der Zählbitstrings.

Im folgenden Beispiel wird ein Sechs-Modus-System von einer blockierten Spinordnung ([u0, u1, u2, d0, d1, d2]) in eine verschachtelte Spinordnung ([u0, d0, u1, d1, u2, d2]) umbenannt – ein gängiger Trick, um die Implementierungstiefe zu verringern – und anschließend wird die Umbenennung bei den Stichprobenzahlen rückgängig gemacht:

>>> 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}

Die Initialisierung dieses Transpiler-Durchlaufs kann mit den unten aufgeführten Argumenten erfolgen.

Parameter


Attribute

permutation

Die Indexpermutation, die zur Neubenennung der Indizes der Fermionenmoden verwendet wird.

Dies kann entweder eine sein list[int], die den ursprünglichen Modusindex i auf den neuen Modusindex abbildet ( permutation[i] Einzelheiten finden Sie in der Docstring der Klasse). Seine Länge muss mit der Anzahl der Fermionenmoden des zu transpilierenden Schaltkreises übereinstimmen, und jeder Index darf genau einmal vorkommen. Dieses Szenario erfordert daher, dass der Transpiler-Durchlauf ganz speziell auf die Schaltung des Anwenders zugeschnitten wird.

Oder es könnte sein None, dass in diesem Fall die Funktion build_excitation_span_minimization_model() dazu dient, ein Optimierungsproblem zu definieren, das darauf abzielt, die Spannweite aller auftretenden fermionischen Anregungen zu minimieren. In diesem Fall ist die angewendete Permutation nur über die Metadaten der transpilierten Schaltung verfügbar (siehe die Docstring der Klasse).

Anmerkung

Die Verwendung dieses Optimierungsmodells ist nur für Zeitentwicklungsgatter implementiert, die eine Instanz FermionOperator enthalten.

solver

Die Instanz des Optimierungsproblem-Lösers, um automatisch zu ermitteln permutation.

Wenn gilt permutationNone , build_excitation_span_minimization_model() wird das durch definierte Optimierungsproblem verwendet, um automatisch eine gute Permutation der Modusindizes zu finden. In einem solchen Fall muss der Benutzer einen Optimierer bereitstellen, um dieses Modell zu lösen.


Methoden

find_permutation

find_permutation(dag)

Ermittelt einen Modusindex, sofern permutation dieser nicht vom Benutzer angegeben wurde.

Diese Funktion wird nur aufgerufen, wenn vom Benutzer nicht angegeben permutation wird (d. h., es ist None). In diesem Fall führt es Folgendes aus:

  1. Stellen Sie sicher, dass die optionale Abhängigkeit „pyomo“ installiert ist. Andernfalls kann keine Optimierung durchgeführt werden, und dieser Transpiler-Durchlauf hat keine Auswirkungen.
  2. Stellen Sie sicher, dass ein angegeben solver ist. Andernfalls kann keine Optimierung durchgeführt werden, und dieser Transpiler-Durchlauf hat keine Auswirkungen.
  3. Sammle alle fermionischen Anregungen aus allen Gatter Evolution , die eine Instanz FermionOperator enthalten.
  4. Erstelle das Optimierungsproblem unter Verwendung von build_excitation_span_minimization_model()und leite dabei alle zusätzlichen Schlüsselwortargumente (kwargs) weiter, die bei der Erstellung dieses Transpiler-Durchgangs übergeben wurden.
  5. Lösen Sie das Optimierungsproblem mithilfe von und solver ermitteln Sie die endgültige Permutation.

Parameter

dag (FermionicDAGCircuit) – die zu transpilierende Schaltung.

Rückgabe

Die zu verwendende Permutation. In Nonediesem Fall hat dieser Transpiler-Durchlauf keine Auswirkungen.

Erhöhungen

NotImplementedError – wenn ein Gate Evolution auftritt, das einen Operator enthält, der keine Instanz FermionOperator ist.

Rückgabetyp

Tupel [ Liste [ int ] | None, pyomo.opt.results.results_.SolverResults | None]

run

run(dag)

Führt diesen Transpiliierungsdurchlauf aus.

Parameter

dag (DAGCircuit) – die Eingabeschaltung mit auf Fermionen basierenden Befehlen. DAGOpNode Es op werden nur Instanzen FermionicGate wie diese unterstützt.

Rückgabe

Die Ausgangsschaltung, die weiterhin auf ein Fermionenregister einwirkt.

Erhöhungen

NotImplementedError – wenn die bereitgestellte Eingangsschaltung mehr als ein Register aufweist.

Rückgabetyp

DAGCircuit

Vererbte Methoden

execute

execute(passmanager_ir, state, callback=None)

Optimierungsaufgabe für die Qiskit-IR-Eingabe ausführen.

Parameter

  • passmanager_ir (IR) – Qiskit IR zur Optimierung.
  • state (PassManagerState) – Zustand, der mit der Ausführung des Workflows durch den Pass-Manager selbst verbunden ist.
  • callback (Callable[[Task, IR_OUT, PropertySet, float, int], None] | None) – Eine Callback-Funktion, die bei jeder Ausführung einer Optimierungsaufgabe aufgerufen wird.

Rückgabe

Optimiertes Qiskit-IR und aktueller Stand des Workflows.

Rückgabetyp

Tupel [ IR_OUT, PassManagerState ]

name

name()

Name des Passes.

Rückgabetyp

str

update_status

update_status(state, run_state)

Status des Workflows aktualisieren.

Parameter

  • state (PassManagerState) – Übergeben Sie den Status des Managers zur Aktualisierung.
  • run_state (RunState) – Fertigstellungsstatus der aktuellen Aufgabe.

Rückgabe

Status des Pass-Managers aktualisiert.

Rückgabetyp

PassManagerState

War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.