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)
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 enredado con el qubit , para todo , donde es el número total de qubits.'reverse_linear'el enredo es el qubit enredado con el qubit , para todo , donde es el número total de qubits. Observe que sientanglement_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 está enredado con el qubit , para todos los valores pares de , y luego una segunda capa en la que el qubit está enredado con el qubit , para todos los valores impares de .'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 ├
└───┘ ░ └───┘ ░ └───┘ ░ └───┘ ░ └───┘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, sientanglement_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 esFalse. - skip_final_rotation_layer (bool) – Si
False, se añade una capa de rotación al final del ansatz. En ese casoTrue, 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. SiFalse, no se insertan barreras. El valor por defecto esFalse. - initial_state (QuantumCircuit | None) – Un
QuantumCircuitobjeto 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
Truepara 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 enTruepara 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