PauliEvolutionGate
class qiskit.circuit.library.PauliEvolutionGate(operator, time=1.0, label=None, synthesis=None)
Basen: Gate
Zeitliche Entwicklung eines aus Paulis bestehenden Operators.
Für einen hermiteschen Operator , der aus Pauli-Termen und der (reellen) Entwicklungszeit besteht, stellt dieses Tor die unitäre
Die Evolutionstore sind mit den Pauli-Rotationstoren um den Faktor 2 verwandt. Zum Beispiel ist die zeitliche Entwicklung des Pauli Operators mit der Pauli Rotation verbunden durch
Zusammenstellung:
Dieses Gatter stellt die exakte Entwicklung v dar. Die exakte Umsetzung dieser Operation erfordert jedoch in der Regel eine exponentielle Anzahl von Gattern. Der Compiler implementiert daher in der Regel eine Näherung der unitären , z. B. unter Verwendung einer Produktformel, wie sie durch LieTrotter… definiert ist. Durch die Übergabe des synthesis Arguments können Sie festlegen, welche Methode der Compiler verwenden soll; die verfügbaren Optionen finden Sie qiskit.synthesis unter.
Beachten Sie, dass die Reihenfolge, in der die Annäherung und Methoden wie control() und power() aufgerufen werden. Eine Änderung der Reihenfolge kann zu unterschiedlichen Einheiten führen.
Kommutierungsprüfungen:
Qiskit unterstützt effiziente Kommutationsprüfungen von PauliEvolutionGate Instanzen mit anderen Pauli-basierten Gattern, wie z. B. PauliGate oder PauliProductMeasurement. Diese Überprüfungen erfordern jedoch die Konvertierung des Operators in SparseObservable das Format. Daher empfehlen wir dringend, Operatoren mit dieser Operatorklasse zu erstellen, wenn eine große Anzahl von Kommutierungsprüfungen zu erwarten ist (z. B. wenn Sie einen Schaltkreis mit einer großen Anzahl von sequenziellen PauliEvolutionGates haben).
Beispiele:
from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import PauliEvolutionGate
from qiskit.quantum_info import SparsePauliOp
X = SparsePauliOp("X")
Z = SparsePauliOp("Z")
I = SparsePauliOp("I")
# build the evolution gate
operator = (Z ^ Z) - 0.1 * (X ^ I)
evo = PauliEvolutionGate(operator, time=0.2)
# plug it into a circuit
circuit = QuantumCircuit(2)
circuit.append(evo, range(2))
print(circuit.draw())Der obige Text wird gedruckt (beachten Sie, dass der Koeffizient -0.1 nicht gedruckt wird!):
┌──────────────────────────┐
q_0: ┤0 ├
│ exp(-it (ZZ + XI))(0.2) │
q_1: ┤1 ├
└──────────────────────────┘Quellenangaben:
[1] G. Li et al. Paulihedral: Ein verallgemeinerter blockweiser Compiler-Optimierungsrahmen für Quantensimulationskerne (2021). arXiv:2109.03371
Parameter
- operator (qiskit.quantum_info.Pauli |SparsePauliOp |SparseObservable |list[qiskit.quantum_info.Pauli |SparsePauliOp |SparseObservable]) – Der Betreiber muss sich weiterentwickeln. Kann auch als Liste von nicht-kommutierenden Operatoren angegeben werden, wobei die Elemente Summen von kommutierenden Operatoren sind. Beispiel:
[XY + YX, ZZ + ZI + IZ, YY]. - time (ParameterValueType) – Die Entwicklungszeit.
- label (str | None) – Eine Bezeichnung für das Tor, die in Visualisierungen angezeigt wird. Standardmäßig ist die Beschriftung auf
exp(-it <operators>)eingestellt, wobei<operators>die Summe der Paulis ist. Beachten Sie, dass das Etikett keine Koeffizienten des Paulis enthält. Ein Beispiel finden Sie in der Klassendokumentation. - synthesis (EvolutionSynthesis | None) – Eine Synthesestrategie. Wenn Keine, ist die Standardsynthese die Lie-Trotter-Produktformel mit einer einzigen Wiederholung.
Attribute
base_class
Ermittelt die Basisklasse dieser Instruktion. Dies ist garantiert im Vererbungsbaum von self zu finden.
Die "Basisklasse" einer Anweisung ist die niedrigste Klasse in ihrem Vererbungsbaum, mit der das Objekt für _all_ Schaltkreisanwendungen als vollständig kompatibel angesehen werden sollte. Dies bedeutet in der Regel, dass die Unterklasse nur definiert ist, um dem Programmierer eine gewisse Bequemlichkeit gegenüber der Basisklasse zu bieten, und die Basisklasse ist die "wahre" Klasse für eine Verhaltensperspektive. Insbesondere sollten Sie Folgendes nicht außer Kraft setzen base_class nicht überschreiben, wenn Sie eine benutzerdefinierte Version einer Anweisung definieren, die von der Hardware anders implementiert wird, wie z. B. eine alternative Messstrategie oder eine Version eines parametrisierten Gatters mit einem bestimmten Satz von Parametern, um es in einer Target von dem vollständig parametrisierten Gatter zu unterscheiden.
Dies ist oft genau gleichwertig mit type(obj), außer im Fall von Singleton-Instanzen von Standard-Bibliotheksanweisungen. Diese Singleton-Instanzen sind spezielle Unterklassen ihrer Basisklasse, und diese Eigenschaft gibt die Basisklasse zurück. Zum Beispiel:
>>> isinstance(XGate(), XGate)
True
>>> type(XGate()) is XGate
False
>>> XGate().base_class is XGate
TrueIm Allgemeinen sollte man sich nicht auf die genaue Klasse eines Befehls verlassen; innerhalb einer bestimmten Schaltung sollte Instruction.name in den meisten Situationen ein geeigneteres Unterscheidungsmerkmal sein.
decompositions
Holen Sie sich die Zerlegungen der Anweisung von SessionEquivalenceLibrary.
definition
Definition der Rückgabe in Bezug auf andere grundlegende Gates.
label
Etikett mit Rücksendeanweisungen
mutable
Ist diese Instanz eine veränderbare eindeutige Instanz oder nicht.
Wenn dieses Attribut False lautet, ist die Gate-Instanz ein gemeinsam genutztes Singleton und nicht veränderbar.
name
Geben Sie den Namen zurück.
num_clbits
Gibt die Anzahl der Clbits zurück.
num_qubits
Gibt die Anzahl der Qubits zurück.
params
Die Parameter dieses Instruction. Im Idealfall sind dies Torwinkel.
time
Gibt die in den Gate-Parametern gespeicherte Evolutionszeit zurück.
Rückgabe
Die Entwicklungszeit.
Methoden
add_decomposition
add_decomposition(decomposition)
Fügen Sie eine Dekomposition der Anweisung in die SessionEquivalenceLibrary ein.
broadcast_arguments
broadcast_arguments(qargs, cargs)
Validierung und Handhabung der Argumente und ihrer Beziehung.
Zum Beispiel bedeutet cx([q[0],q[1]], q[2]) cx(q[0], q[2]); cx(q[1], q[2]). Diese Methode liefert die Argumente in der richtigen Gruppierung. Im gegebenen Beispiel:
in: [[q[0],q[1]], q[2]],[]
outs: [q[0], q[2]], []
[q[1], q[2]], []Es gelten die allgemeinen Übertragungsregeln:
Wenn len(qargs) == 1:
[q[0], q[1]] -> [q[0]],[q[1]]Wenn len(qargs) == 2:
[[q[0], q[1]], [r[0], r[1]]] -> [q[0], r[0]], [q[1], r[1]] [[q[0]], [r[0], r[1]]] -> [q[0], r[0]], [q[0], r[1]] [[q[0], q[1]], [r[0]]] -> [q[0], r[0]], [q[1], r[0]]Wenn len(qargs) >= 3:
[q[0], q[1]], [r[0], r[1]], ...] -> [q[0], r[0], ...], [q[1], r[1], ...]
Parameter
Rückgabe
Ein Tupel mit einzelnen Argumenten.
Erhöht
CircuitError – Wenn die Eingabe ungültig ist. Beispielsweise stimmt die Anzahl der Argumente nicht mit der vom Gatter erwarteten Anzahl überein.
Rückgabetyp
control
control(num_ctrl_qubits=1, label=None, ctrl_state=None, annotated=None)
Gibt die kontrollierte Version von sich selbst zurück.
Das Ergebnis ist die angegebene kontrollierte Version von . Das zurückgegebene Tor stellt dar, wobei der ursprüngliche Operator ist, der mit den Projektoren und (je nach Kontrollstatus) gestreckt wurde.
Das gesteuerte Gatter wird unabhängig vom Wert von als PauliEvolutionGateannotatedimplementiert.
Parameter
- num_ctrl_qubits (int) – Anzahl der hinzuzufügenden Steuerelemente. Der Standardwert ist
1. - label (str | None) – Eine Bezeichnung für das resultierende Pauli-Evolutionsgatter, die in Visualisierungen angezeigt werden soll. Standardmäßig ist das Label auf gesetzt
exp(-it <operators>), wobei die Summe<operators>der Paulis ist. Beachten Sie, dass das Label keine Koeffizienten der Paulis enthält. Ein Beispiel finden Sie im Dokumentationsstring der Klasse. - ctrl_state (int |str | None) – Der Steuerzustand des Gatters, angegeben entweder als Ganzzahl oder als Bitfolge (z. B.
"110"). WennNone, wird standardmäßig der Zustand „alles2**num_ctrl_qubits - 1Einsen“ angenommen. - annotated (bool | None) – Ignoriert.
Rückgabe
Eine kontrollierte Version dieses Tors.
Rückgabetyp
copy
copy(name=None)
Kopie der Anweisung.
Parameter
name (str) – name, der dem kopierten Schaltkreis gegeben werden soll, wenn None , dann bleibt der Name derselbe.
Rückgabe
eine Kopie der aktuellen Anweisung, wobei der Name aktualisiert wird, wenn er angegeben wurde
Rückgabetyp
inverse
inverse(annotated=False)
Gibt den Kehrwert zurück, der durch Umkehrung des Vorzeichens der Entwicklungszeit erhalten wird.
Parameter
annotated (bool)
is_parameterized
power
power(exponent, annotated=False)
Erhöhen Sie dieses Tor auf die Macht von exponent.
Das Ergebnis ist , wobei gleich exponent ist.
Parameter
- exponent (float) – Die Macht, das Tor zu erhöhen.
- annotated (bool) – Nicht anwendbar auf diese Klasse. Normalerweise, wenn dies
Trueist, geben wir eineAnnotatedOperationmit einem gesetzten Leistungsmodifikator anstelle eines konkretenGate. Wir können jedoch Potenzen von Pauli-Entwicklungen effizient darstellen alsPauliEvolutionGatedarstellen, was hier verwendet wird.
Rückgabe
Eine Operation, die gate^exponent implementiert.
Rückgabetyp
repeat
repeat(n)
Erstellt eine Anweisung, die self -mal wiederholt wird.
Parameter
n (int) – Anzahl der Wiederholungen des Befehls
Rückgabe
Enthält die Definition.
Rückgabetyp
Erhöht
CircuitError – Wenn n < 1 ist.
reverse_ops
reverse_ops()
Bei einer zusammengesetzten Anweisung kehren Sie die Reihenfolge der Unteranweisungen um.
Dies geschieht durch rekursive Umkehrung aller Unterbefehle. Es wird kein Tor invertiert.
Rückgabe
eine neue Anweisung mit
unteranweisungen umgedreht.
Rückgabetyp
soft_compare
soft_compare(other)
Weicher Vergleich zwischen Gates. Ihre Namen, die Anzahl der Qubits und die klassischen Bitnummern müssen übereinstimmen. Die Anzahl der Parameter muss übereinstimmen. Jeder Parameter wird verglichen. Wenn man eine ParameterExpression ist, wird sie nicht berücksichtigt.
Parameter
other (instruction) – sonstiger Unterricht.
Rückgabe
sind selbst und andere gleich bis hin zu Parameterausdrücken.
Rückgabetyp
to_matrix
to_matrix()
Geben Sie die Matrix als numpy.ndarray zurück.
Rückgabe
Die Matrix, die dieses Gatter darstellt.
Erhöht
ValueError - Wenn der Parameter time nicht numerisch ist.
Rückgabetyp
to_mutable
to_mutable()
Gibt eine veränderbare Kopie dieses Tores zurück.
Diese Methode gibt eine neue veränderbare Kopie dieser Gate-Instanz zurück. Wenn eine Singleton-Instanz verwendet wird, ist dies eine neue, eindeutige Instanz, die verändert werden kann. Wenn die Instanz bereits veränderbar ist, handelt es sich um eine Deepcopy dieser Instanz.
validate_parameter
validate_parameter(parameter)
Gate-Parameter sollten int, float, oder ParameterExpression
Parameter
parameter (ParameterExpression |float)
Rückgabetyp