Skip to main content
IBM Quantum Platform

qiskit.circuit.library.n_local

qiskit.circuit.library.n_local(num_qubits, rotation_blocks, entanglement_blocks, entanglement='full', reps=3, insert_barriers=False, parameter_prefix='θ', overwrite_block_parameters=True, skip_final_rotation_layer=False, skip_unentangled_qubits=False, name='nlocal')

GitHub

Konstruieren Sie einen n-lokalen Variationskreis.

Die Struktur der n-lokalen Schaltung besteht aus abwechselnden Rotations- und Verschränkungsschichten. In beiden Schichten wirken parametrisierte Schaltungsblöcke in definierter Weise auf die Schaltung ein. In der Rotationsschicht werden die Blöcke übereinander gestapelt, in der Verflechtungsschicht nach der Strategie entanglement . Die Schaltungsblöcke können beliebige Größen haben (kleiner gleich der Anzahl der Qubits in der Schaltung). Jede Ebene wird reps Mal wiederholt, und standardmäßig wird eine abschließende Rotationsebene angefügt.

Ein Rotationsblock auf 2 Qubits und ein Verschränkungsblock auf 4 Qubits unter Verwendung von "linear" Verschränkung ergibt zum Beispiel die folgende Schaltung.

┌──────┐ ░ ┌──────┐                      ░ ┌──────┐
┤0     ├─░─┤0     ├──────────────── ... ─░─┤0     ├
│  Rot │ ░ │      │┌──────┐              ░ │  Rot │
┤1     ├─░─┤1     ├┤0     ├──────── ... ─░─┤1     ├
├──────┤ ░ │  Ent ││      │┌──────┐      ░ ├──────┤
┤0     ├─░─┤2     ├┤1     ├┤0     ├ ... ─░─┤0     ├
│  Rot │ ░ │      ││  Ent ││      │      ░ │  Rot │
┤1     ├─░─┤3     ├┤2     ├┤1     ├ ... ─░─┤1     ├
├──────┤ ░ └──────┘│      ││  Ent │      ░ ├──────┤
┤0     ├─░─────────┤3     ├┤2     ├ ... ─░─┤0     ├
│  Rot │ ░         └──────┘│      │      ░ │  Rot │
┤1     ├─░─────────────────┤3     ├ ... ─░─┤1     ├
└──────┘ ░                 └──────┘      ░ └──────┘

|                                 |
+---------------------------------+
       repeated reps times

Verstrickung:

Die Verschränkung beschreibt die Verbindungen der Gatter in der Verschränkungsschicht. Bei einem Zwei-Qubit-Gatter z.B. enthält die Verschränkung Paare von Qubits, auf die das Gatter wirken soll, z.B. [[ctrl0, target0], [ctrl1, target1], ...]. Eine Reihe von Standardverschränkungsstrategien ist vorhanden und kann nach Namen ausgewählt werden:

  • "full" Bei einer Verschränkung ist jedes Qubit mit allen anderen verschränkt.


  • "linear" Verschränkung ist Qubit ii verschränkt mit 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 Qubit ii verschränkt mit 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" Verschränkung ist eine Ebene, auf der Qubit- ii en mit Qubit-en verschränkt sind

    i+1i + 1 für alle geraden Werte von ii, und dann eine zweite 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, jedoch mit einer zusätzlichen Verschränkung der

    erstes und letztes Qubit vor dem linearen Teil.


  • "sca" (verschobene zirkuläre alternierende) Verschränkung ist eine verallgemeinerte und modifizierte Version

    der vorgeschlagenen Schaltung 14 in Sim et al. 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).

Enthält eine Verschränkungsschicht mehrere Blöcke, so sollte die Verschränkung als Liste von Verschränkungen für jeden Block angegeben werden. Zum Beispiel:

entanglement_blocks = ["rxx", "ryy"]
entanglement = ["full", "linear"]  # full for rxx and linear for ryy

oder:

structure_rxx = [[0, 1], [2, 3]]
structure_ryy = [[0, 2]]
entanglement = [structure_rxx, structure_ryy]

Schließlich kann die Verschränkung bei jeder Wiederholung der Schaltung variieren. Zu diesem Zweck unterstützen wir die Übergabe einer Callable, die als Eingabe den Ebenenindex erhält und die Verschränkung für die Ebene im obigen Format zurückgibt. Ein konkretes Beispiel finden Sie in den nachstehenden Beispielen.

Beispiele:

Die Rotations- und Verschränkungsgatter können über einzelne Strings angegeben werden, wenn sie aus einem einzigen Block pro Schicht bestehen:

from qiskit.circuit.library import n_local

circuit = n_local(3, "ry", "cx", "linear", reps=2, insert_barriers=True)
circuit.draw("mpl")
Schaltplan, der durch den vorherigen Code ausgegeben wurde.

Durch die Übergabe einer Liste können mehrere Gates pro Schicht gesetzt werden. Hier verwenden wir zum Beispiel Pauli-Y- und Pauli-Z-Drehungen in der Rotationsschicht:

circuit = n_local(3, ["ry", "rz"], "cz", "full", reps=1, insert_barriers=True)
circuit.draw("mpl")
Schaltplan, der durch den vorherigen Code ausgegeben wurde.

Um Rotations- oder Verschränkungsschichten auszulassen, kann der Block auf eine leere Liste gesetzt werden:

circuit = n_local(4, [], "cry", reps=2)
circuit.draw("mpl")
Schaltplan, der durch den vorherigen Code ausgegeben wurde.

Die Verschränkung kann explizit über das Argument entanglement eingestellt werden:

entangler_map = [[0, 1], [2, 0]]
circuit = n_local(3, "x", "crx", entangler_map, reps=2)
circuit.draw("mpl")
Schaltplan, der durch den vorherigen Code ausgegeben wurde.

Wir können für jede Schicht unterschiedliche Verschränkungen festlegen, indem wir eine aufrufbare Funktion angeben, die den aktuellen Schichtindex als Eingabe entgegennimmt und die Verschränkungsstruktur zurückgibt. Beispielsweise werden im folgenden Fall unterschiedliche Verschränkungen für ungerade und gerade Schichten verwendet:

def entanglement(layer_index):
    if layer_index % 2 == 0:
        return [[0, 1], [0, 2]]
    return [[1, 2]]

circuit = n_local(3, "x", "cx", entanglement, reps=3, insert_barriers=True)
circuit.draw("mpl")
Schaltplan, der durch den vorherigen Code ausgegeben wurde.

Parameter

  • num_qubits (int) – Die Anzahl der Qubits der Schaltung.
  • rotation_blocks (str |Gate |Iterable[str |Gate]) – Die in den Rotationsschichten verwendeten Blöcke. Wenn mehrere übergeben werden, werden diese nacheinander angewendet (wie neue Unterebenen).
  • entanglement_blocks (str |Gate |Iterable[str |Gate]) – Die in den Verschränkungsschichten verwendeten Blöcke. Wenn mehrere übergeben werden, werden diese nacheinander angewendet.
  • entanglement (str |Iterable[Iterable[int]] | Iterable[str |Iterable[Iterable[int]]] | Callable[[int], str |Iterable[Iterable[int]] | Iterable[str |Iterable[Iterable[int]]]]) – Die Indizes, die angeben, auf welche Qubits die Eingabeblöcke wirken. Dies wird durch eine Zeichenfolge angegeben, die eine Verschränkungsstrategie beschreibt (siehe zusätzliche Informationen), oder durch eine Liste von Qubit-Verbindungen. Wenn eine Liste von Verschränkungsblöcken übergeben wird, kann für jeden Block eine andere Verschränkung angegeben werden, indem eine Liste von Verschränkungen übergeben wird. Um für jede Wiederholung eine unterschiedliche Verschränkung festzulegen, übergeben Sie eine aufrufbare Funktion, die als Eingabe die Schicht entgegennimmt und die Verschränkung für diese Schicht zurückgibt. Standardwert ist "full", was eine All-zu-All-Verschränkungsstruktur bedeutet.
  • reps (int) – Gibt an, wie oft die Rotations- und Verschränkungsblöcke wiederholt werden.
  • insert_barriers (bool) – Wenn True, werden zwischen den einzelnen Schichten Barrieren eingefügt. Wenn False, werden keine Barrieren eingefügt.
  • parameter_prefix (str) – Das Präfix, das verwendet wird, wenn Standardparameter generiert werden.
  • overwrite_block_parameters (bool) – Wenn die Parameter in den hinzugefügten Blöcken überschrieben werden sollen. Wenn False, werden die Parameter in den Blöcken nicht geändert.
  • skip_final_rotation_layer (bool) – Ob dem Stromkreis eine abschließende Rotationsschicht hinzugefügt wird.
  • skip_unentangled_qubits (bool) – Wenn True, wirken die Rotationsgatter nur auf verschränkte Qubits. Wenn False, wirken die Rotationsgatter auf alle Qubits.
  • name (str | None) – Der Name des Stromkreises.

Rückgabe

Eine n-örtliche Schaltung.

Rückgabetyp

QuantumCircuit

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