Skip to main content
IBM Quantum Platform

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)

GitHub

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 ii verschränkt mit dem Qubit i+1i + 1, für alle i∈{0,1,...,n−2}i \in \{0, 1, ... , n - 2\}, wobei nn die Gesamtzahl der Qubits ist.
  • 'reverse_linear' verschränkung ist das Qubit ii verschränkt mit dem Qubit i+1i + 1, für alle i∈{n−2,n−3,...,1,0}i \in \{n-2, n-3, ... , 1, 0\}, wobei nn die Gesamtzahl der Qubits ist. Wenn entanglement_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 ii mit dem Qubit i+1i + 1 verschränkt ist, für alle geraden Werte von ii, und einer zweiten Schicht, in der das Qubit ii mit dem Qubit i+1i + 1 verschränkt ist, für alle ungeraden Werte von ii.
  • '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 ├
     └───┘ ░      └───┘ ░ └───┘ ░ └───┘ ░ └───┘
Veraltet seit Version 2.1

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. Wenn entanglement_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. Wenn False, werden die einzelnen Qubit-Gates auf jedes Qubit im Ansatz angewendet. Die Standardeinstellung ist False.
  • skip_final_rotation_layer (bool) – Falls False, wird am Ende des Ansatzes eine Rotationsebene hinzugefügt. Wenn True, 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. Wenn False, werden keine Barrieren eingefügt. Die Standardeinstellung ist False.
  • initial_state (QuantumCircuit | None) – Ein QuantumCircuit Objekt, 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 auf True zu 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

Methoden

get_entangler_map

get_entangler_map(rep_num, block_num, num_block_qubits)

GitHub

Überladung zur Behandlung des Sonderfalls von 1 Qubit, bei dem die Verschränkung ignoriert wird.

Parameter

  • rep_num (int)
  • block_num (int)
  • num_block_qubits (int)

Rückgabetyp

Sequence[* Sequence*[ int ]]

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