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

Bases: NLocal

El circuito de dos locales.

El circuito de dos localidades es un circuito parametrizado formado por capas de rotación y capas de entrelazamiento alternas. Las capas de rotación son puertas de un qubit aplicadas a todos los qubits. La capa de entrelazamiento utiliza puertas de dos qubits para entrelazar los qubits según una estrategia establecida mediante entanglement. Tanto las puertas de rotación como las de entrelazamiento pueden especificarse como cadenas (p. ej. 'ry' o 'cx'), como tipo de puerta (p. ej. RYGate o CXGate) o como QuantumCircuit (por ejemplo, un circuito de 1 qubit o de 2 qubits).

Se proporciona un conjunto de estrategias de enredo por defecto:

  • 'full' El entrelazamiento se produce cuando cada qubit está entrelazado con todos los demás.
  • 'linear' el enredo es el qubit ii enredado con el qubit i+1i + 1, para todo i∈{0,1,...,n−2}i \in \{0, 1, ... , n - 2\}, donde nn es el número total de qubits.
  • 'reverse_linear' el enredo es el qubit ii enredado con el qubit i+1i + 1, para todo i∈{n−2,n−3,...,1,0}i \in \{n-2, n-3, ... , 1, 0\}, donde nn es el número total de qubits. Observe que si entanglement_blocks = 'cx' entonces esta opción proporciona el mismo unitario que 'full' con menos puertas de enredo.
  • 'pairwise' el enredo es una capa en la que el qubit ii está enredado con el qubit i+1i + 1, para todos los valores pares de ii, y luego una segunda capa en la que el qubit ii está enredado con el qubit i+1i + 1, para todos los valores impares de ii.
  • 'circular' es el entrelazamiento lineal pero con un entrelazamiento adicional del primer y último qubit antes de la parte lineal.
  • 'sca' (shifted-circular-alternating) es una versión generalizada y modificada del circuito 14 propuesto en Sim et al.. Consiste en un entrelazamiento circular en el que el entrelazamiento "largo" que conecta el primer qubit con el último se desplaza uno en cada bloque. Además, el papel de los qubits de control y de destino se intercambian en cada bloque (por tanto, se alternan).

El enredo puede especificarse además utilizando un mapa de enredos, que es una lista de pares de índices, como por ejemplo

>>> entangler_map = [(0, 1), (1, 2), (2, 0)]

Si deben utilizarse diferentes enredos por bloque, facilite una lista de mapas de enredos. Vea en los ejemplos siguientes cómo puede utilizarse.

>>> entanglement = [entangler_map_layer_1, entangler_map_layer_2, ... ]

Se pueden insertar barreras entre las distintas capas para una mejor visualización utilizando el atributo insert_barriers .

Para cada puerta parametrizada se genera un nuevo parámetro mediante ParameterVector. El nombre de estos parámetros puede elegirse mediante parameter_prefix.

Ejemplos

>>> 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 ├
     └───┘ ░      └───┘ ░ └───┘ ░ └───┘ ░ └───┘
Obsoleto desde la versión 2.1

La clase qiskit.circuit.library.n_local.two_local.TwoLocal está obsoleta a partir de Qiskit 2.1. Se eliminará en Qiskit 3.0. En su lugar, utilice la función qiskit.circuit.library.n_local.

Parámetros

  • num_qubits (int | None) – El número de qubits del circuito de dos nodos locales.
  • rotation_blocks (str |type |qiskit.circuit.Instruction |QuantumCircuit |list[str |type |qiskit.circuit.Instruction |QuantumCircuit] | None) – Las puertas utilizadas en la capa de rotación. Se puede especificar mediante el nombre de una puerta (p. ej., 'ry') o el propio tipo de puerta (p. ej., RYGate). Si solo se dispone de una puerta, se aplica la misma puerta a cada qubit. Si se proporciona una lista de puertas, todas ellas se aplican a cada qubit en el orden indicado. Consulta la sección «Ejemplos» para obtener más detalles.
  • entanglement_blocks (str |type |qiskit.circuit.Instruction |QuantumCircuit |list[str |type |qiskit.circuit.Instruction |QuantumCircuit] | None) – Las puertas utilizadas en la capa de entrelazamiento. Se puede especificar con el mismo formato que rotation_blocks.
  • entanglement (str |list[list[int]] | Callable[[int], list[int]]) – Especifica la estructura de entrelazamiento. Puede ser una cadena ('full', 'linear', 'reverse_linear', o 'circular' 'sca'), una lista de pares de números enteros que especifican los índices de los qubits entrelazados entre sí, o una función que devuelva dicha lista a partir del índice de la capa de entrelazamiento. Por defecto, se establece el entrelazamiento 'full' . Ten en cuenta que, si entanglement_blocks = 'cx', entonces el entrelazamiento 'full' proporciona el mismo operador unitario que, 'reverse_linear' pero esta última opción tiene menos puertas de entrelazamiento. Consulta la sección «Ejemplos» para obtener más detalles.
  • reps (int) – Especifica la frecuencia con la que se repite un bloque compuesto por una capa de rotación y una capa de entrelazamiento.
  • skip_unentangled_qubits (bool) – Si True, las puertas de un solo qubit solo se aplican a los qubits que están entrelazados con otro qubit. Si es así False, se aplican las puertas de un solo qubit a cada qubit del ansatz. El valor por defecto es False.
  • skip_final_rotation_layer (bool) – Si False, se añade una capa de rotación al final del ansatz. En ese caso True, no se añade ninguna capa de rotación.
  • parameter_prefix (str) – Las puertas parametrizadas requieren que se defina un parámetro, para lo cual utilizamos instancias de Parameter. El nombre de cada parámetro será este prefijo especificado más su índice.
  • insert_barriers (bool) – Si es así True, se insertan barreras entre cada capa. Si False, no se insertan barreras. El valor por defecto es False.
  • initial_state (QuantumCircuit | None) – Un QuantumCircuit objeto que se debe añadir al principio del circuito.
  • name (str) – El nombre que se utilizará para el circuito generado.
  • flatten (bool | None) – Establece este valor en True para generar un circuito plano en lugar de anidarlo dentro de varias capas de objetos de puerta. Por defecto, actualmente el contenido del circuito de salida se presenta en objetos anidados para facilitar su visualización. Sin embargo, si utilizas este circuito para cualquier otra finalidad que no sea la visualización, se recomienda encarecidamente configurar este indicador en True para evitar una gran merma en el rendimiento debida a la asignación de parámetros.

Atributos

name

Tipo: str

Un nombre legible para el circuito.

Ejemplo

from qiskit import QuantumCircuit

qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)
my_circuit

Métodos

get_entangler_map

get_entangler_map(rep_num, block_num, num_block_qubits)

GitHub

Sobrecarga para manejar el caso especial de 1 qubit donde se ignoran los enredos.

Parámetros

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

Tipo de retorno

Secuencia [ Secuencia [ int ]]

¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.