Skip to main content
IBM Quantum Platform

Weitergabe

pauli_prop.propagation

Funktionen zur Durchführung der Pauli-Ausbreitung.

RotationGates

class RotationGates(gates, qargs, thetas)

GitHub

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)

GitHub

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, clifford muss 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

Typ: list[ndarray[tuple[int,...], dtype[bool]]]

Eine ZX-Kalkül-ähnliche Darstellung der Gatter.

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

Typ: list[list[int]]

Die Qubit-Indizes, auf die das jeweilige Gatter einwirkt.

thetas

Typ: list[float]

Die Drehwinkel aller Gatter.

circuit_to_rotation_gates

circuit_to_rotation_gates(circuit)

GitHub

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)

GitHub

Wende einen spärlichen Pauli-Operator, OO, auf eine Schaltung an (dargestellt in rot_gates), UU.

Zur Schrödinger-Ausbreitung: UOU†U O U^{\dagger}. Zur Heisenberg-Ausbreitung: U†OUU^{\dagger} O U.

Wenn eine Instanz NoisyRotationGates rot_gates ist, wird der Operator durch jeden Rauschgenerator weitergeleitet. Der Koeffizient, der jedem Term in operator„ cic_i “ zugeordnet ist, wird entsprechend der Rate des jeweiligen antikommutierenden Fehlergenerators gedämpft, rir_i : ci∗=exp(−2.0∗ri)c_i *= exp(-2.0 * r_i).

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_terms Pauli-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 atol werden abgeschnitten (auf Null gesetzt).
Anmerkung

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) –s für die Schrödinger-Entwicklung h für die Heisenberg-Entwicklung

Rückgabe

Der entwickelte Operator und die Ein-Norm aller abgeschnittenen Koeffizienten.

Erhöhungen

Rückgabetyp

Tupel [ SparsePauliOp, float ]

propagate_through_circuit

propagate_through_circuit(operator, circuit, max_terms, atol, frame)

GitHub

Leite einen spärlichen Pauli-Operator ( OO ) durch eine Schaltung ( UU ) 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: UOU†U O U^{\dagger}. Zur Heisenberg-Ausbreitung: U†OUU^{\dagger} O U.

Wenn Anweisungen für Pauli-Lindblad-Rauschen enthält circuit , wird der Operator durch jeden Rauschgenerator weitergeleitet. Der Koeffizient, der jedem Term in operator„ cic_i “ zugeordnet ist, wird entsprechend der Rate des jeweiligen antikommutierenden Fehlergenerators gedämpft, rir_i : ci∗=exp(−2.0∗ri)c_i *= exp(-2.0 * r_i).

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_terms Pauli-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 atol werden abgeschnitten (auf Null gesetzt).
Anmerkung

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) –s für die Schrödinger-Entwicklung h für die Heisenberg-Entwicklung

Rückgabe

Der weiterentwickelte Operator

Erhöhungen

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)

GitHub

Leiten Sie einen Betreiber ( op1 oder OO ) über einen anderen Betreiber ( op2 oder UU ) weiter.

Zur Schrödinger-Entwicklung: UOU†U O U^{\dagger}.

Zur Heisenberg-Entwicklung: U†OUU^{\dagger} O U.

Die Evolution wird in der Pauli-Basis durchgeführt, indem Terme der Form UiOjUkU_i O_j U_k 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.

Anmerkung

OO wird als hermitesch angenommen ( OjO_j = Oj†O_j^{\dagger} )

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ößten max_terms Terme im direkten Produkt der drei Operatoren im Pauli-Raum berücksichtigt.

    Wenn max_terms gilt und None die 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 UiOjUi†U_i O_j U_i^{\dagger} erweitert, wobei j<numleadingtermsj < num_leading_terms 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, atol werden abgeschnitten

  • search_step (int) – Ein Parameter, der die Suche im sehr großen Raum der „ 3D “ beschleunigen kann, um die größten max_terms Terme im Produkt zu ermitteln. Wird diese Schrittweite auf einen Wert >1 gesetzt, wird die Suche um den Faktor beschleunigt search_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 ist search_step**3 << max_terms.

Rückgabe

Der transformierte Operator

Erhöhungen

Rückgabetyp

SparsePauliOp

evolve_through_cliffords

evolve_through_cliffords(circuit)

GitHub

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 ≤π/4\leq \pi/4 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 ]

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