Weitergabe
pauli_prop.propagation
Funktionen zur Durchführung der Pauli-Ausbreitung.
RotationGates
class RotationGates(gates, qargs, thetas)
Basen: NamedTuple
Eine minimale Zwischenrepräsentation von a QuantumCircuit.
Unterstützte Pauli-Rotationen: rx/rxx, ry/ryy, rz/rzz, PauliEvolutionGate
Neue Instanz von RotationGates(gates, qargs, thetas) erstellen
Parameter
append_circuit_instruction
append_circuit_instruction(inst, qargs, num_qubits, *, clifford=None)
Analysiert eine Schaltungsanweisung und fügt deren Daten den internen Listen hinzu.
Parameter
- inst (CircuitInstruction) – Die Anweisung in der Schleife zum Parsen und Anhängen
- qargs (list[int]) – Die Liste der Qubit-Indizes des Befehls im Kontext seiner Schaltung
- num_qubits (int) – Die Anzahl der Qubits der Schaltung, die diesen Befehl enthält
- clifford (Clifford | None) – Ein optionaler Clifford, durch den die bereitgestellte Anweisung verschoben werden soll. Der Clifford-Operator muss auf alle Qubits im Schaltkreis wirken.
Erhöhungen
- ValueError – Im Schaltkreis wurde ein nicht unterstütztes Gatter gefunden
- ValueError – Falls angegeben,
cliffordmuss die Funktion auf alle Qubits im Schaltkreis angewendet werden
Rückgabetyp
Keine
count
count(value, /)
Gibt die Anzahl der Vorkommen des Werts zurück.
gates
index
index(value, start=0, stop=9223372036854775807, /)
Gibt den ersten Index des Werts zurück.
Löst eine „ ValueError “-Ausnahme aus, wenn der Wert nicht vorhanden ist.
qargs
thetas
circuit_to_rotation_gates
circuit_to_rotation_gates(circuit)
Wandelt die angegebene Schaltung in eine Zwischenrepräsentation um.
Unterstützt Pauli-Rotationsgatter („rx/rxx“, „ry/ryy“, „rz/rzz“, „ ‘PauliEvolutionGate’ “) sowie Pauli-Lindblad-Fehlerkanäle, die als „ PauliLindbladError “-Anweisungen angegeben werden.
Parameter
circuit (QuantumCircuit) –
Die zu konvertierende Schaltung. Kann Pauli-Rotationen (rx/rxx, ry/ryy, rz/rzz, PauliEvolutionGate ) und optional die Befehle „ PauliLindbladError “ enthalten.
Rückgabe
Eine Instanz RotationGates , wenn die Schaltung keine PauliLindbladError Befehle enthält; andernfalls wird eine Instanz NoisyRotationGates zurückgegeben.
Erhöhungen
ValueError – wenn in … ein nicht unterstütztes Gate auftritt circuit.
Rückgabetyp
RotationGates | NoisyRotationGates
propagate_through_rotation_gates
propagate_through_rotation_gates(operator, rot_gates, max_terms, atol, frame)
Wende einen spärlichen Pauli-Operator, , auf eine Schaltung an (dargestellt in rot_gates), .
Zur Schrödinger-Ausbreitung: . Zur Heisenberg-Ausbreitung: .
Wenn eine Instanz NoisyRotationGates rot_gates ist, wird der Operator durch jeden Rauschgenerator weitergeleitet. Der Koeffizient, der jedem Term in operator„ “ zugeordnet ist, wird entsprechend der Rate des jeweiligen antikommutierenden Fehlergenerators gedämpft, : .
Im Allgemeinen steigen der Speicherbedarf und die Zeit, die für die Ausbreitung durch eine Schaltung benötigt werden, exponentiell mit der Anzahl der Operationen in der Schaltung an, was auf das exponentielle Wachstum der Anzahl der Terme des Operators in der Pauli-Basis zurückzuführen ist. Um diese exponentielle Schwierigkeit zu begrenzen, kann man kleine Pauli-Terme abschneiden (d. h. auf Null setzen), was zu einer Verzerrung führt, die proportional zur Größe der abgeschnittenen Terme ist. Nachdem die Terme durch alle Operationen in der Schaltung durchlaufen haben, werden sie in Bezug auf zwei Parameter gekürzt:
- Es werden nur die größten
max_termsPauli-Komponenten beibehalten; alle kleineren Terme werden abgeschnitten. Mit dieser Option lässt sich im Voraus abschätzen, wie viel Zeit und Speicher für die Berechnung ausreichen werden. - Terme mit einer Größe kleiner als
atolwerden abgeschnitten (auf Null gesetzt).
Diese Funktion reserviert im Speicher Platz für den Operator in voller Größe und den Operator-Puffer. Es liegt in der Verantwortung des Aufrufers, sicherzustellen, dass genügend Speicherplatz für Operatoren mit Begriffen max_terms vorhanden ist. Wenn gilt max_terms``None , steigen der Speicher- und Zeitaufwand in der Regel exponentiell mit der Anzahl der Operationen in der Schaltung.
Parameter
- operator (SparsePauliOp) – Der Operator, der übertragen werden soll
- rot_gates (RotationGates | NoisyRotationGates) – Ein Schaltkreis, dargestellt in der Form von
RotationGates. - max_terms (int) – Die maximale Anzahl von Termen, die der Operator bei seiner Weiterverbreitung enthalten darf
- atol (float) – Terme mit Koeffizienten, deren Absolutwert kleiner als dieser ist, werden bei der Weiterverbreitung nicht zum Operator hinzugefügt. Dieser Parameter stellt keine Garantie für die Genauigkeit des zurückgegebenen Operators dar.
- frame (str) –
sfür die Schrödinger-Entwicklunghfür die Heisenberg-Entwicklung
Rückgabe
Der entwickelte Operator und die Ein-Norm aller abgeschnittenen Koeffizienten.
Erhöhungen
- ValueError – ist
frameweder nochhs. - ValueError – ist
atolnegativ. - ValueError – ist
max_termsnicht positiv.
Rückgabetyp
Tupel [ SparsePauliOp, float ]
propagate_through_circuit
propagate_through_circuit(operator, circuit, max_terms, atol, frame)
Leite einen spärlichen Pauli-Operator ( ) durch eine Schaltung ( ) weiter.
Unterstützt Pauli-Rotationsgatter („rx/rxx“, „ry/ryy“, „rz/rzz“, „ ‘PauliEvolutionGate’ “) sowie Pauli-Lindblad-Fehlerkanäle, die als „ PauliLindbladError “-Anweisungen angegeben werden.
Zur Schrödinger-Ausbreitung: . Zur Heisenberg-Ausbreitung: .
Wenn Anweisungen für Pauli-Lindblad-Rauschen enthält circuit , wird der Operator durch jeden Rauschgenerator weitergeleitet. Der Koeffizient, der jedem Term in operator„ “ zugeordnet ist, wird entsprechend der Rate des jeweiligen antikommutierenden Fehlergenerators gedämpft, : .
Im Allgemeinen steigen der Speicherbedarf und die Zeit, die für die Ausbreitung durch eine Schaltung benötigt werden, exponentiell mit der Anzahl der Operationen in der Schaltung an, was auf das exponentielle Wachstum der Anzahl der Terme des Operators in der Pauli-Basis zurückzuführen ist. Um diese exponentielle Schwierigkeit zu begrenzen, kann man kleine Pauli-Terme abschneiden (d. h. auf Null setzen), was zu einer Verzerrung führt, die proportional zur Größe der abgeschnittenen Terme ist. Nachdem die Terme durch alle Operationen in der Schaltung durchlaufen haben, werden sie in Bezug auf zwei Parameter gekürzt:
- Es werden nur die größten
max_termsPauli-Komponenten beibehalten; alle kleineren Terme werden abgeschnitten. Mit dieser Option lässt sich im Voraus abschätzen, wie viel Zeit und Speicher für die Berechnung ausreichen werden. - Terme mit einer Größe kleiner als
atolwerden abgeschnitten (auf Null gesetzt).
Diese Funktion reserviert im Speicher Platz für den Operator in voller Größe und den Operator-Puffer. Es liegt in der Verantwortung des Aufrufers, sicherzustellen, dass genügend Speicherplatz für Operatoren mit Begriffen max_terms vorhanden ist. Wenn gilt max_terms``None , steigen der Speicher- und Zeitaufwand in der Regel exponentiell mit der Anzahl der Operationen in der Schaltung.
Parameter
- operator (SparsePauliOp) – Der Operator, der übertragen werden soll
- circuit (QuantumCircuit) – Der Pfad, über den der Befehl weitergeleitet wird
- max_terms (int) – Die maximale Anzahl von Termen, die der Operator bei seiner Weiterverbreitung enthalten darf
- atol (float) – Terme mit Koeffizienten, deren Absolutwert kleiner als dieser ist, werden bei der Weiterverbreitung nicht zum Operator hinzugefügt. Dieser Parameter stellt keine Garantie für die Genauigkeit des zurückgegebenen Operators dar.
- frame (str) –
sfür die Schrödinger-Entwicklunghfür die Heisenberg-Entwicklung
Rückgabe
Der weiterentwickelte Operator
Erhöhungen
- ValueError – ist
frameweder nochhs. - ValueError – ist
atolnegativ. - ValueError – ist
max_termsnicht positiv.
Rückgabetyp
Tupel [ SparsePauliOp, float ]
propagate_through_operator
propagate_through_operator(op1, op2, max_terms=None, coerce_op1_traceless=False, num_leading_terms=0, frame='s', atol=0.0, search_step=4)
Leiten Sie einen Betreiber ( op1 oder ) über einen anderen Betreiber ( op2 oder ) weiter.
Zur Schrödinger-Entwicklung: .
Zur Heisenberg-Entwicklung: .
Die Evolution wird in der Pauli-Basis durchgeführt, indem Terme der Form summiert werden (wobei der Dolch vernachlässigt wird, siehe Anmerkung unten). Die Anzahl solcher Terme ist kubisch zur Operatorgröße (len( op1 ) * len( op2 )**2) und umfasst in der Regel viele doppelte Pauli-Terme.
Durch die Festlegung von max_terms wird ein Näherungsergebnis erzielt, bei dem nur die max_terms größten Terme (gemessen an der Größe des Koeffizienten) berechnet werden. Dies kann zwar wesentlich schneller sein, führt jedoch aufgrund der Verkürzung kleinerer Terme zu einigen Fehlern.
Die Näherungsberechnung besteht aus zwei Teilen: der Suche nach den zu beibehaltenden Termen und der anschließenden Berechnung dieser Terme. Eine erhebliche search_step (kubische) Erhöhung beschleunigt die Suche, wobei die Genauigkeit oft nur geringfügig beeinträchtigt wird.
Es ist möglich, dass einige der in den beibehaltenen Termen vorkommenden „Paulis“ auch in den gekürzten Termen aufgetaucht wären. Da solche verkürzten Terme niemals berechnet werden, können sie unmöglich mit den beibehaltenen Termen, die denselben Pauli-Index haben, zusammengeführt werden. Daher kann n``th-largest term in the approximate result is not guaranteed to equal the nth-largest term in the exact result. Likewise, convergence to the exact result with increasing ``max_terms die nicht-monoton sein.
wird als hermitesch angenommen ( = )
Parameter
-
op1 (SparsePauliOp) – Der Operator, der übertragen werden soll
-
op2 (SparsePauliOp) – Der Operator, über den die Ausbreitung erfolgen soll
-
max_terms (int | None) –
Ist dies nicht der Fall
None, ergibt sich ein Näherungsergebnis, das nur die größtenmax_termsTerme im direkten Produkt der drei Operatoren im Pauli-Raum berücksichtigt.Wenn
max_termsgilt undNonedie Anzahl der Qubits < 12, the propagation will be performed in the computational basis using matrix multiplication. For systems > 12 Qubits beträgt, werden alle Pauli-Terme berechnet und summiert; dies ist jedoch aufgrund der vielen doppelten Terme in der Regel keine geeignete Methode zur Berechnung der exakten Entwicklung. -
coerce_op1_traceless (bool) – Ein Flag, das angibt, ob Identitätsterme aus dem Ausgaboperator entfernt werden sollen.
-
num_leading_terms (int) – Die Anzahl der Terme in, die mit jedem Term in konjugiert werden sollen
op1``op2. Die Menge der enthaltenen Terme wird um ihre Vereinigung mit der Menge der Terme erweitert, wobei gilt. Dies kann die Genauigkeit für die führenden Komponenten von O in der Ausgabe verbessern, ist jedoch mit einem gewissen Rechenaufwand verbunden. -
frame (str) – s für die Schrödinger-Entwicklung, h für die Heisenberg-Entwicklung
-
atol (float) – Terme im abgeleiteten Operator, deren Absolutwerte unter liegen,
atolwerden abgeschnitten -
search_step (int) – Ein Parameter, der die Suche im sehr großen Raum der „ 3D “ beschleunigen kann, um die größten
max_termsTerme im Produkt zu ermitteln. Wird diese Schrittweite auf einen Wert >1 gesetzt, wird die Suche um den Faktor beschleunigtsearch_step**3, was jedoch möglicherweise zu Einbußen bei der Genauigkeit führen kann. Es ist zu erwarten, dass diese Ungenauigkeit für … gering istsearch_step**3 << max_terms.
Rückgabe
Der transformierte Operator
Erhöhungen
- ValueError – ist
frameweder nochsh. - ValueError – ist
search_stepnicht positiv. - ValueError – enthält
max_termseinen ungültigen Wert.
Rückgabetyp
evolve_through_cliffords
evolve_through_cliffords(circuit)
Führe eine Evolution (Schrödinger-Rahmen) aller Nicht-Clifford-Anweisungen durch alle Clifford-Gatter in der Schaltung durch.
Dadurch werden alle erkannten Clifford-Gatter an den Anfang der Schaltung verschoben und die Basen der Pauli-Rotationsgatter (z. B. RxGate, RzzGate, PauliEvolutionGate) sowie der „ PauliLindbladError “-Kanäle aktualisiert. Andere Vorgänge werden nicht unterstützt. Weitere Informationen zur Entwicklung von Paulis durch Cliffords finden Sie in der Dokumentation unter Pauli.evolve.
Der Effekt ähnelt dem Übergang zum Clifford-Interaktionsbild unter arXiv:2306.04797, allerdings ohne dass alle Rotationswinkelgrößen auf abgebildet werden.
Die Funktion gibt zwei Objekte zurück, die den Clifford- und den Nicht-Clifford-Teil der Schaltung darstellen.
Parameter
circuit (QuantumCircuit) – Das soll QuantumCircuit umgewandelt werden. Darf ausschließlich Pauli-Rotationsgatter ( PauliLindbladError die der Schaltung als Quantenkanäle angehängt sind) sowie anerkannte Clifford-Gatter enthalten.
Rückgabe
- Clifford – Ein einzelner All-Qubit -Clifford-Operator, der den ersten Teil der Schaltung darstellt
- QuantumCircuit - Eine Schaltung, die den verbleibenden, umgewandelten Teil der Schaltung enthält
Erhöhungen
ValueError – Die Eingangsschaltung enthält ein nicht unterstütztes Gate
Rückgabetyp
Tupel [ Clifford, QuantumCircuit ]