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

L'ansatz heuristique de la fonction d'onde préservant l'excitation.

Le circuit ExcitationPreserving préserve le rapport entre les états 00|00\rangle, 01+10|01\rangle + |10\rangle et 11|11\rangle. À cette fin, ce circuit utilise des interactions à deux qubits de la forme

(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}

pour le mode 'fsim' ou avec eiϕ=1e^{-i\phi} = 1 pour le mode 'iswap'.

Notez que d'autres fonctions d'onde, telles que les UCC-ansatzes, préservent également l'excitation. Cependant, ces circuits peuvent devenir rapidement complexes, alors que ce circuit heuristiquement motivé suit un schéma plus simple.

Cette fonction d'onde d'essai est constituée de couches de rotations de type « ZZ » associées à des intriques à deux qubits. L'intrication est créée à l'aide de rotations de type « XX+YYXX+YY » et, éventuellement, d'une porte à phase contrôlée pour le mode 'fsim'.

Pour plus de détails sur les arguments et options possibles, tels que RealAmplitudes l'ignorance des qubits non intriqués, qui s'appliquent également ici, voir [...].

Les rotations de l'ansatz ExcitationPreserving peuvent être écrites comme suit

Exemples

>>> 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])
     └──────────┘ ░ └────────────┘└────────────┘        ░ └──────────┘
Voir aussi

La fonction excitation_preserving() construit un circuit fonctionnellement équivalent, mais plus rapidement.

Déclassé depuis la version 2.1

La classe qiskit.circuit.library.n_local.excitation_preserving.ExcitationPreserving est obsolète depuis Qiskit 2.1. Elle sera supprimée à Qiskit 3.0. Utilisez plutôt la fonction qiskit.circuit.library.excitation_preserving.

Paramètres

  • num_qubits (int | None) – Le nombre de qubits du circuit ExcitationPreserving.
  • mode (str) – Choisissez le mode d'enchevêtrement, qui peut être 'iswap' ou 'fsim'.
  • reps (int) – Spécifie la fréquence de répétition de la structure d'une couche de rotation suivie d'une couche d'enchevêtrement.
  • entanglement (str |list[list[int]] | Callable[[int], list[int]]) – Spécifie la structure de l'enchevêtrement. Il peut s'agir d'une chaîne ("full", "linear" ou "sca"), d'une liste de paires d'entiers spécifiant les indices des qubits intriqués l'un avec l'autre, ou d'un appel renvoyant une telle liste avec l'indice de la couche d'intrication. Voir la section Exemples de TwoLocal pour plus de détails.
  • initial_state (QuantumCircuit | None) – Un objet de type « QuantumCircuit » à ajouter au début du circuit.
  • skip_unentangled_qubits (bool) – Si True, les portes de qubit unique ne sont appliquées qu'aux qubits intriqués avec un autre qubit. Si False, les portes de qubit unique sont appliquées à chaque qubit dans l'Ansatz. La valeur par défaut est false.
  • skip_final_rotation_layer (bool) – Si True, une couche de rotation est ajoutée à la fin de l'ansatz. Si False, aucune couche de rotation n'est ajoutée. La valeur par défaut est true.
  • parameter_prefix (str) – Les portes paramétrées nécessitent la définition d'un paramètre, pour lequel nous utilisons ParameterVector.
  • insert_barriers (bool) – Si Vrai, des barrières sont insérées entre chaque couche. Si Faux, aucune barrière n'est insérée.
  • flatten (bool | None) – Réglez ce paramètre sur True pour obtenir un circuit plat au lieu de l'imbriquer dans plusieurs couches d'objets de porte. Par défaut, le contenu du circuit de sortie sera enveloppé dans des objets imbriqués pour une visualisation plus propre. Cependant, si vous utilisez ce circuit pour autre chose que la visualisation, il est fortement recommandé de mettre ce drapeau à True afin d'éviter une surcharge de performance importante pour la liaison des paramètres.
  • name (str) – Nom du circuit.

Augmentations

ValueError - Si le mode sélectionné n'est pas pris en charge.


Attributs

parameter_bounds

Renvoie les limites du paramètre.

Retours

Les limites du paramètre.

name

Type : str

Un nom lisible par l'homme pour le circuit.

Exemple

from qiskit import QuantumCircuit

qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)
my_circuit
Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.