TwoLocal
class qiskit.circuit.library.TwoLocal(num_qubits=None, rotation_blocks=None, entanglement_blocks=None, entanglement='full', reps=3, skip_unentangled_qubits=False, skip_final_rotation_layer=False, parameter_prefix='θ', insert_barriers=False, initial_state=None, name='TwoLocal', flatten=None)
Basen: NLocal
Die Zweilokalschaltung.
Die zweilokale Schaltung ist eine parametrisierte Schaltung, die aus abwechselnden Rotationsschichten und Verschränkungsschichten besteht. Die Rotationsschichten sind Einzel-Qubit-Gates, die auf alle Qubits angewendet werden. Die Verschränkungsschicht verwendet Zwei-Qubit-Gatter, um die Qubits gemäß einer mit entanglement festgelegten Strategie zu verschränken. Sowohl die Rotations- als auch die Verschränkungsgates können als String angegeben werden (z. B. 'ry' oder 'cx'), als Gattertyp (z. B. RYGate oder CXGate) oder als QuantumCircuit (z. B. eine 1-Qubit-Schaltung oder eine 2-Qubit-Schaltung).
Es wird eine Reihe von Standard-Verschränkungsstrategien bereitgestellt:
'full'Bei einer Verschränkung ist jedes Qubit mit allen anderen verschränkt.'linear'verschränkung ist das Qubit verschränkt mit dem Qubit , für alle , wobei die Gesamtzahl der Qubits ist.'reverse_linear'verschränkung ist das Qubit verschränkt mit dem Qubit , für alle , wobei die Gesamtzahl der Qubits ist. Wennentanglement_blocks = 'cx'gewählt wird, bietet diese Option die gleiche Einheit wie'full'mit weniger Verschränkungsgattern.'pairwise'die Verschränkung besteht aus einer Schicht, in der das Qubit mit dem Qubit verschränkt ist, für alle geraden Werte von , und einer zweiten Schicht, in der das Qubit mit dem Qubit verschränkt ist, für alle ungeraden Werte von .'circular'verschränkung ist lineare Verschränkung, aber mit einer zusätzlichen Verschränkung des ersten und letzten Qubits vor dem linearen Teil.'sca'(shifted-circular-alternating) Verschränkung ist eine verallgemeinerte und modifizierte Version der in Sim et al. vorgeschlagenen Schaltung 14. Sie besteht aus einer zirkulären Verschränkung, bei der die "lange" Verschränkung, die das erste und das letzte Qubit verbindet, in jedem Block um eins verschoben wird. Außerdem werden die Rollen von Kontroll- und Ziel-Qubits in jedem Block getauscht (also abwechselnd).
Die Verschränkung kann ferner durch eine Verschränkungskarte spezifiziert werden, die aus einer Liste von Indexpaaren besteht, z. B
>>> entangler_map = [(0, 1), (1, 2), (2, 0)]Wenn verschiedene Verflechtungen pro Block verwendet werden sollen, legen Sie eine Liste der Verflechtungskarten vor. In den folgenden Beispielen sehen Sie, wie dies genutzt werden kann.
>>> entanglement = [entangler_map_layer_1, entangler_map_layer_2, ... ]Zur besseren Visualisierung können mit dem Attribut insert_barriers Barrieren zwischen die verschiedenen Ebenen eingefügt werden.
Für jedes parametrisierte Tor wird ein neuer Parameter mit Hilfe von ParameterVector erzeugt. Der Name dieser Parameter kann unter parameter_prefix gewählt werden.
Beispiele
>>> two = TwoLocal(3, 'ry', 'cx', 'linear', reps=2, insert_barriers=True)
>>> print(two.decompose()) # decompose the layers into standard gates
┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐
q_0: ┤ Ry(θ[0]) ├─░───■────────░─┤ Ry(θ[3]) ├─░───■────────░─┤ Ry(θ[6]) ├
├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤
q_1: ┤ Ry(θ[1]) ├─░─┤ X ├──■───░─┤ Ry(θ[4]) ├─░─┤ X ├──■───░─┤ Ry(θ[7]) ├
├──────────┤ ░ └───┘┌─┴─┐ ░ ├──────────┤ ░ └───┘┌─┴─┐ ░ ├──────────┤
q_2: ┤ Ry(θ[2]) ├─░──────┤ X ├─░─┤ Ry(θ[5]) ├─░──────┤ X ├─░─┤ Ry(θ[8]) ├
└──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘>>> two = TwoLocal(3, ['ry','rz'], 'cz', 'full', reps=1, insert_barriers=True, flatten=True)
>>> qc = QuantumCircuit(3)
>>> qc &= two
>>> print(qc.draw())
┌──────────┐┌──────────┐ ░ ░ ┌──────────┐ ┌──────────┐
q_0: ┤ Ry(θ[0]) ├┤ Rz(θ[3]) ├─░──■──■─────░─┤ Ry(θ[6]) ├─┤ Rz(θ[9]) ├
├──────────┤├──────────┤ ░ │ │ ░ ├──────────┤┌┴──────────┤
q_1: ┤ Ry(θ[1]) ├┤ Rz(θ[4]) ├─░──■──┼──■──░─┤ Ry(θ[7]) ├┤ Rz(θ[10]) ├
├──────────┤├──────────┤ ░ │ │ ░ ├──────────┤├───────────┤
q_2: ┤ Ry(θ[2]) ├┤ Rz(θ[5]) ├─░─────■──■──░─┤ Ry(θ[8]) ├┤ Rz(θ[11]) ├
└──────────┘└──────────┘ ░ ░ └──────────┘└───────────┘>>> entangler_map = [[0, 1], [1, 2], [2, 0]] # circular entanglement for 3 qubits
>>> two = TwoLocal(3, 'x', 'crx', entangler_map, reps=1, flatten=True)
>>> print(two) # note: no barriers inserted this time!
┌───┐ ┌──────────┐┌───┐
q_0: |0>┤ X ├─────■───────────────────────┤ Rx(θ[2]) ├┤ X ├
├───┤┌────┴─────┐ ┌───┐└─────┬────┘└───┘
q_1: |0>┤ X ├┤ Rx(θ[0]) ├─────■──────┤ X ├──────┼──────────
├───┤└──────────┘┌────┴─────┐└───┘ │ ┌───┐
q_2: |0>┤ X ├────────────┤ Rx(θ[1]) ├───────────■─────┤ X ├
└───┘ └──────────┘ └───┘>>> entangler_map = [[0, 3], [0, 2]] # entangle the first and last two-way
>>> two = TwoLocal(4, [], 'cry', entangler_map, reps=1, flatten=True)
>>> circuit = two.compose(two)
>>> print(circuit.draw()) # note, that the parameters are the same!
q_0: ─────■───────────■───────────■───────────■──────
│ │ │ │
q_1: ─────┼───────────┼───────────┼───────────┼──────
│ ┌────┴─────┐ │ ┌────┴─────┐
q_2: ─────┼──────┤ Ry(θ[1]) ├─────┼──────┤ Ry(θ[1]) ├
┌────┴─────┐└──────────┘┌────┴─────┐└──────────┘
q_3: ┤ Ry(θ[0]) ├────────────┤ Ry(θ[0]) ├────────────
└──────────┘ └──────────┘>>> layer_1 = [(0, 1), (0, 2)]
>>> layer_2 = [(1, 2)]
>>> two = TwoLocal(3, 'x', 'cx', [layer_1, layer_2], reps=2, insert_barriers=True,
... flatten=True)
>>> print(two)
┌───┐ ░ ░ ┌───┐ ░ ░ ┌───┐
q_0: ┤ X ├─░───■────■───░─┤ X ├─░───────░─┤ X ├
├───┤ ░ ┌─┴─┐ │ ░ ├───┤ ░ ░ ├───┤
q_1: ┤ X ├─░─┤ X ├──┼───░─┤ X ├─░───■───░─┤ X ├
├───┤ ░ └───┘┌─┴─┐ ░ ├───┤ ░ ┌─┴─┐ ░ ├───┤
q_2: ┤ X ├─░──────┤ X ├─░─┤ X ├─░─┤ X ├─░─┤ X ├
└───┘ ░ └───┘ ░ └───┘ ░ └───┘ ░ └───┘Die Klasse qiskit.circuit.library.n_local.two_local.TwoLocal ist ab Qiskit 2.1 veraltet. Sie wird in Qiskit 3.0 entfernt. Verwenden Sie stattdessen die Funktion qiskit.circuit.library.n_local.
Parameter
- num_qubits (int | None) – Die Anzahl der Qubits der zweilokalen Schaltung.
- rotation_blocks (str |type |qiskit.circuit.Instruction |QuantumCircuit |list[str |type |qiskit.circuit.Instruction |QuantumCircuit] | None) – Die in der Rotationsschicht verwendeten Gatter. Kann über den Namen eines Gates angegeben werden (z. B.
'ry') oder den Gate-Typ selbst (z. B.RYGate). Ist nur ein Gatter vorhanden, wird dasselbe Gatter auf jedes Qubit angewendet. Wird eine Liste von Toren angegeben, werden alle Tore in der angegebenen Reihenfolge auf jedes Qubit angewendet. Weitere Informationen finden Sie im Abschnitt „Beispiele“. - entanglement_blocks (str |type |qiskit.circuit.Instruction |QuantumCircuit |list[str |type |qiskit.circuit.Instruction |QuantumCircuit] | None) – Die in der Verschränkungsschicht verwendeten Gatter. Kann im gleichen Format wie
rotation_blocks. angegeben werden. - entanglement (str |list[list[int]] | Callable[[int], list[int]]) – Gibt die Verflechtungsstruktur an. Kann eine Zeichenkette sein (
'full','linear','reverse_linear','circular'oder'sca'), eine Liste von Integer-Paaren, die die Indizes der miteinander verschränkten Qubits angeben, oder eine aufrufbare Variable, die eine solche Liste mit dem Index der Verschränkungsschicht zurückgibt. Standardeinstellung:'full'Verschränkung. Wennentanglement_blocks = 'cx', dann bietet'full'Verschränkung die gleiche Einheit wie'reverse_linear', aber die letztere Option hat weniger Verschränkungsgatter. Im Abschnitt Beispiele finden Sie weitere Einzelheiten. - reps (int) – Gibt an, wie oft ein aus einer Rotationsschicht und einer Verschränkungsschicht bestehender Block wiederholt wird.
- skip_unentangled_qubits (bool) – Wenn
True, werden die Einzelbit-Gates nur auf Qubits angewendet, die mit einem anderen Qubit verschränkt sind. WennFalse, werden die einzelnen Qubit-Gates auf jedes Qubit im Ansatz angewendet. Die Standardeinstellung istFalse. - skip_final_rotation_layer (bool) – Falls
False, wird am Ende des Ansatzes eine Rotationsebene hinzugefügt. WennTrue, wird keine Rotationsebene hinzugefügt. - parameter_prefix (str) – Für die parametrisierten Gatter muss ein Parameter definiert werden, für den wir Instanzen von
Parameter. Der Name eines jeden Parameters ist das angegebene Präfix plus sein Index. - insert_barriers (bool) – Wenn
True, werden zwischen den einzelnen Schichten Barrieren eingefügt. WennFalse, werden keine Barrieren eingefügt. Die Standardeinstellung istFalse. - initial_state (QuantumCircuit | None) – Ein
QuantumCircuitObjekt, das dem Schaltkreis vorangestellt werden soll. - name (str) – Der Name, der für die generierte Schaltung verwendet werden soll.
- flatten (bool | None) – Setzen Sie dies auf
True, um eine flache Schaltung auszugeben, anstatt sie in mehrere Schichten von Gatterobjekten zu verschachteln. Standardmäßig wird der Inhalt des Ausgabeschaltkreises in verschachtelte Objekte eingewickelt, um eine übersichtlichere Darstellung zu erreichen. Wenn Sie diese Schaltung jedoch für etwas anderes als Visualisierung verwenden, wird dringend empfohlen, dieses Flag aufTruezu setzen, um einen großen Performance-Overhead für die Parameterbindung zu vermeiden.
Attribute
name
Typ: str
Ein von Menschen lesbarer Name für den Stromkreis.
Beispiel
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)my_circuit