ExcitationPreserving
class qiskit.circuit.library.ExcitationPreserving(num_qubits=None, mode='iswap', entanglement='full', reps=3, skip_unentangled_qubits=False, skip_final_rotation_layer=False, parameter_prefix='θ', insert_barriers=False, initial_state=None, name='ExcitationPreserving', flatten=None)
Bases: TwoLocal
El ansatz heurístico de la función de onda que preserva la excitación.
El circuito ExcitationPreserving conserva la relación de estados , y . Para ello, este circuito utiliza interacciones de dos qubits de la forma
para el modo 'fsim' o con para el modo 'iswap'.
Obsérvese que otras funciones de onda, como las UCC-ansatzes, también preservan la excitación. Sin embargo, éstos pueden volverse complejos rápidamente, mientras que este circuito heurísticamente motivado sigue un patrón más sencillo.
Esta función de onda de prueba está formada por capas de rotaciones de tipo « » con entrelazamientos de dos qubits. El entrelazamiento se crea mediante rotaciones de tipo « » y, opcionalmente, una puerta de fase controlada para el modo 'fsim'.
Consulte RealAmplitudes para obtener más detalles sobre los posibles argumentos y opciones, como omitir los qubits no entrelazados, que también se aplican en este caso.
Las rotaciones del ansatz ExcitationPreserving pueden escribirse como
Ejemplos
>>> ansatz = ExcitationPreserving(3, reps=1, insert_barriers=True, entanglement='linear')
>>> print(ansatz.decompose()) # show the circuit
┌──────────┐ ░ ┌────────────┐┌────────────┐ ░ ┌──────────┐
q_0: ┤ RZ(θ[0]) ├─░─┤0 ├┤0 ├─────────────────────────────░─┤ RZ(θ[5]) ├
├──────────┤ ░ │ RXX(θ[3]) ││ RYY(θ[3]) │┌────────────┐┌────────────┐ ░ ├──────────┤
q_1: ┤ RZ(θ[1]) ├─░─┤1 ├┤1 ├┤0 ├┤0 ├─░─┤ RZ(θ[6]) ├
├──────────┤ ░ └────────────┘└────────────┘│ RXX(θ[4]) ││ RYY(θ[4]) │ ░ ├──────────┤
q_2: ┤ RZ(θ[2]) ├─░─────────────────────────────┤1 ├┤1 ├─░─┤ RZ(θ[7]) ├
└──────────┘ ░ └────────────┘└────────────┘ ░ └──────────┘>>> ansatz = ExcitationPreserving(2, reps=1, flatten=True)
>>> qc = QuantumCircuit(2) # create a circuit and append the RY variational form
>>> qc.cry(0.2, 0, 1) # do some previous operation
>>> qc.compose(ansatz, inplace=True) # add the excitation-preserving
>>> qc.draw()
┌──────────┐┌────────────┐┌────────────┐┌──────────┐
q_0: ─────■─────┤ RZ(θ[0]) ├┤0 ├┤0 ├┤ RZ(θ[3]) ├
┌────┴────┐├──────────┤│ RXX(θ[2]) ││ RYY(θ[2]) │├──────────┤
q_1: ┤ RY(0.2) ├┤ RZ(θ[1]) ├┤1 ├┤1 ├┤ RZ(θ[4]) ├
└─────────┘└──────────┘└────────────┘└────────────┘└──────────┘>>> ansatz = ExcitationPreserving(3, reps=1, mode='fsim', entanglement=[[0,2]],
... insert_barriers=True, flatten=True)
>>> print(ansatz.decompose())
┌──────────┐ ░ ┌────────────┐┌────────────┐ ░ ┌──────────┐
q_0: ┤ RZ(θ[0]) ├─░─┤0 ├┤0 ├─■──────░─┤ RZ(θ[5]) ├
├──────────┤ ░ │ ││ │ │ ░ ├──────────┤
q_1: ┤ RZ(θ[1]) ├─░─┤ RXX(θ[3]) ├┤ RYY(θ[3]) ├─┼──────░─┤ RZ(θ[6]) ├
├──────────┤ ░ │ ││ │ │θ[4] ░ ├──────────┤
q_2: ┤ RZ(θ[2]) ├─░─┤1 ├┤1 ├─■──────░─┤ RZ(θ[7]) ├
└──────────┘ ░ └────────────┘└────────────┘ ░ └──────────┘La función excitation_preserving() construye un circuito funcionalmente equivalente, pero más rápido.
La clase qiskit.circuit.library.n_local.excitation_preserving.ExcitationPreserving está obsoleta a partir de Qiskit 2.1. Se eliminará en Qiskit 3.0. En su lugar, utilice la función qiskit.circuit.library.excitation_preserving.
Parámetros
- num_qubits (int | None) – El número de qubits del circuito ExcitationPreserving.
- mode (str) – Elige el modo de entrelazamiento; puede ser «iswap» o «fsim».
- reps (int) – Especifica la frecuencia con la que se repite la estructura de una capa de rotación seguida de una capa de entrelazamiento.
- entanglement (str |list[list[int]] | Callable[[int], list[int]]) – Especifica la estructura de entrelazamiento. Puede ser una cadena («full», «linear» o «sca»), una lista de pares de números enteros que especifiquen 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. Consulta la sección «Ejemplos» de
TwoLocalpara obtener más detalles. - initial_state (QuantumCircuit | None) – Un objeto
QuantumCircuitque se debe añadir al principio del circuito. - skip_unentangled_qubits (bool) – Si el valor es «True», las puertas de un solo qubit solo se aplican a los qubits que están entrelazados con otro qubit. Si el valor es «False», se aplican las puertas de un solo qubit a cada qubit del Ansatz. El valor predeterminado es False.
- skip_final_rotation_layer (bool) – Si es verdadero, se añade una capa de rotación al final del ansatz. Si es «False», no se añade ninguna capa de rotación. El valor predeterminado es true.
- parameter_prefix (str) – Las puertas parametrizadas requieren que se defina un parámetro, para lo cual utilizamos
ParameterVector. - insert_barriers (bool) – Si el valor es «True», se insertan barreras entre cada capa. Si es «False», no se insertan barreras.
- flatten (bool | None) – Configura esta opción 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 pérdida de rendimiento en la asignación de parámetros. - name (str) – Nombre del circuito.
Eleva
ValueError : si el modo seleccionado no es compatible.
Atributos
parameter_bounds
Devuelve los límites del parámetro.
Devuelve
Los límites de los parámetros.
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