Skip to main content
IBM Quantum Platform

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)

GitHub

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 00|00\rangle, 01+10|01\rangle + |10\rangle y 11|11\rangle. Para ello, este circuito utiliza interacciones de dos qubits de la forma

(10000cos(θ/2)isin(θ/2)00isin(θ/2)cos(θ/2)0000eiϕ)\providecommand{\rotationangle}{\theta/2} \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos\left(\rotationangle\right) & -i\sin\left(\rotationangle\right) & 0 \\ 0 & -i\sin\left(\rotationangle\right) & \cos\left(\rotationangle\right) & 0 \\ 0 & 0 & 0 & e^{-i\phi} \end{pmatrix}

para el modo 'fsim' o con eiϕ=1e^{-i\phi} = 1 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 « ZZ » con entrelazamientos de dos qubits. El entrelazamiento se crea mediante rotaciones de tipo « XX+YYXX+YY » 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])
     └──────────┘ ░ └────────────┘└────────────┘        ░ └──────────┘
Consulte también

La función excitation_preserving() construye un circuito funcionalmente equivalente, pero más rápido.

Obsoleto desde la versión 2.1

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 enredo, 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 enredo.
  • entanglement (str |list[list[int]] | Callable[[int], list[int]]) – Especifica la estructura de enredo. Puede ser una cadena ("completa", "lineal" o "sca"), una lista de pares de enteros que especifiquen los índices de los qubits entrelazados entre sí, o una llamada que devuelva dicha lista con el índice de la capa de entrelazamiento. Consulte la sección Ejemplos de TwoLocal para más información.
  • initial_state (QuantumCircuit | None) – Un objeto QuantumCircuit para añadir al circuito.
  • skip_unentangled_qubits (bool) – Si es True, las puertas de un qubit sólo se aplican a los qubits que están enredados con otro qubit. Si es False, las puertas de qubit único se aplican a cada qubit en el Ansatz. El valor predeterminado es False.
  • skip_final_rotation_layer (bool) – Si es True, 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 es True, se insertan barreras entre cada capa. Si es False, no se insertan barreras.
  • flatten (bool | None) – Establézcalo en True para 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 en True para evitar una gran sobrecarga de rendimiento para la vinculació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
¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.