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 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. Consulte la sección «Ejemplos» para obtener más información. - 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 enredo. Puede ser una cadena (
'full','linear','reverse_linear','circular'o'sca'), una lista de pares de enteros que especifique los índices de los qubits entrelazados entre sí, o una llamada que devuelva dicha lista con el índice de la capa de entrelazamiento. Por defecto'full'entanglement. Nótese que sientanglement_blocks = 'cx', entonces el enredo'full'proporciona el mismo unitario que'reverse_linear'pero esta última opción tiene menos puertas de enredo. Consulte la sección Ejemplos para obtener más información. - reps (int) – Especifica la frecuencia con la que se repite un bloque formado por una capa de rotación y una capa de enredo.
- skip_unentangled_qubits (bool) – Si
True, las puertas de un qubit sólo se aplican a los qubits que están enredados con otro qubit. SiFalse, las puertas de un qubit se aplican a cada qubit en el ansatz. Por defectoFalse. - skip_final_rotation_layer (bool) – Si
False, se añade una capa de rotación al final del ansatz. SiTrue, 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
True, se insertan barreras entre cada capa. SiFalse, no se inserta ninguna barrera. Por defectoFalse. - initial_state (QuantumCircuit | None) – A
QuantumCircuitpara añadirlo al circuito. - name (str) – El nombre que se utilizará para el circuito generado.
- flatten (bool | None) – Establézcalo en
Truepara obtener un circuito plano en lugar de anidarlo dentro de múltiples capas de objetos puerta. Por defecto actualmente el contenido del circuito de salida se envolverá en objetos anidados para una visualización más limpia. Sin embargo, si está utilizando este circuito para algo más que la visualización, se recomienda encarecidamente establecer esta bandera enTruepara evitar una gran sobrecarga de rendimiento para la vinculació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