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.
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
- permutation (list[int] | None) – die Indexpermutation, die zur Neubenennung der Indizes der fermionischen Moden verwendet wird. Ist dies der Fall
None, wird automatisch eine Permutation auf der Grundlage von bestimmtbuild_excitation_span_minimization_model(). Weitere Informationen finden Siepermutationunter. - solver (pyomo.opt.SolverFactory | None) – die Instanz des Optimierungsproblem-Lösers, die zur Lösung des Problems
build_excitation_span_minimization_model()verwendet wurde. Wenn dies der Fall istNone, kannpermutationkein Wert automatisch ermittelt werden. Weitere Informationen finden Siesolverunter. - kwargs – Alle weiteren Schlüsselwortargumente werden an weitergeleitet
build_excitation_span_minimization_model().
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).
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:
- 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.
- Stellen Sie sicher, dass ein angegeben
solverist. Andernfalls kann keine Optimierung durchgeführt werden, und dieser Transpiler-Durchlauf hat keine Auswirkungen. - Sammle alle fermionischen Anregungen aus allen Gatter
Evolution, die eine InstanzFermionOperatorenthalten. - 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. - Lösen Sie das Optimierungsproblem mithilfe von und
solverermitteln 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
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
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