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
L'ansatz heuristique de la fonction d'onde préservant l'excitation.
Le circuit ExcitationPreserving préserve le rapport entre les états , et . À cette fin, ce circuit utilise des interactions à deux qubits de la forme
pour le mode 'fsim' ou avec 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 « » associées à des intriques à deux qubits. L'intrication est créée à l'aide de rotations de type « » 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]) ├
└──────────┘ ░ └────────────┘└────────────┘ ░ └──────────┘La fonction excitation_preserving() construit un circuit fonctionnellement équivalent, mais plus rapidement.
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
TwoLocalpour 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
Truepour 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 àTrueafin 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