PauliFeatureMap
class qiskit.circuit.library.PauliFeatureMap(feature_dimension=None, reps=2, entanglement='full', alpha=2.0, paulis=None, data_map_func=None, parameter_prefix='x', insert_barriers=False, name='PauliFeatureMap')
Bases : NLocal
Le circuit de l'expansion de Pauli.
Le circuit d'expansion de Pauli est un circuit de codage de données qui transforme les données d'entrée , où n est le feature_dimension, comme suit
Ici, est un ensemble d'indices de qubits qui décrit les connexions dans la carte de caractéristiques, est un ensemble contenant tous ces ensembles d'indices, et . Par défaut, la cartographie des données est
Les connexions possibles peuvent être définies à l'aide des arguments entanglement et paulis . Par exemple, pour les rotations du qubit unique et les interactions du qubit double entre toutes les paires de qubits, nous pouvons définir :
feature_map = PauliFeatureMap(..., paulis=["Z", "YY"], entanglement="full")qui produira des blocs de la forme
┌───┐┌─────────────┐┌──────────┐ ┌───────────┐
┤ H ├┤ P(2.0*x[0]) ├┤ RX(pi/2) ├──■──────────────────────────────────────■──┤ RX(-pi/2) ├
├───┤├─────────────┤├──────────┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐├───────────┤
┤ H ├┤ P(2.0*x[1]) ├┤ RX(pi/2) ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├┤ RX(-pi/2) ├
└───┘└─────────────┘└──────────┘└───┘└────────────────────────────────┘└───┘└───────────┘Le circuit contient reps répétitions de cette transformation.
Veuillez vous référer à ZFeatureMap pour le cas des rotations de Pauli- à qubit unique et à ZZFeatureMap pour les rotations de Pauli- à un ou deux qubits.
Exemples
>>> prep = PauliFeatureMap(2, reps=1, paulis=['ZZ'])
>>> print(prep.decompose())
┌───┐
q_0: ┤ H ├──■──────────────────────────────────────■──
├───┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐
q_1: ┤ H ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
└───┘└───┘└────────────────────────────────┘└───┘>>> prep = PauliFeatureMap(2, reps=1, paulis=['Z', 'XX'])
>>> print(prep.decompose())
┌───┐┌─────────────┐┌───┐ ┌───┐
q_0: ┤ H ├┤ P(2.0*x[0]) ├┤ H ├──■──────────────────────────────────────■──┤ H ├
├───┤├─────────────┤├───┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐├───┤
q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ H ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├┤ H ├
└───┘└─────────────┘└───┘└───┘└────────────────────────────────┘└───┘└───┘>>> prep = PauliFeatureMap(2, reps=1, paulis=['ZY'])
>>> print(prep.decompose())
┌───┐┌──────────┐ ┌───────────┐
q_0: ┤ H ├┤ RX(pi/2) ├──■──────────────────────────────────────■──┤ RX(-pi/2) ├
├───┤└──────────┘┌─┴─┐┌────────────────────────────────┐┌─┴─┐└───────────┘
q_1: ┤ H ├────────────┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├─────────────
└───┘ └───┘└────────────────────────────────┘└───┘>>> from qiskit.circuit.library import EfficientSU2
>>> prep = PauliFeatureMap(3, reps=3, paulis=['Z', 'YY', 'ZXZ'])
>>> wavefunction = EfficientSU2(3)
>>> classifier = prep.compose(wavefunction)
>>> classifier.num_parameters
27
>>> classifier.count_ops()
OrderedDict([('cx', 39), ('rx', 36), ('u1', 21), ('h', 15), ('ry', 12), ('rz', 12)])Références :
[1] Havlicek et al. Supervised learning with quantum enhanced feature spaces, Nature 567, 209-212 (2019).
La classe qiskit.circuit.library.data_preparation.pauli_feature_map.PauliFeatureMap est obsolète depuis Qiskit 2.1. Elle sera supprimée à Qiskit 3.0. Utilisez la fonction pauli_feature_map en remplacement. Notez que cela ne renverra plus un BlueprintCircuit, mais un simple QuantumCircuit.
Paramètres
- feature_dimension (int | None) – Nombre de qubits dans le circuit.
- reps (int) – Le nombre de fois où les couches d'évolution sont répétées.
- entanglement (str |dict[int, list[tuple[int]]] | Callable[[int], str |dict[int, list[tuple[int]]]]) – Définit la structure d'intrication. Il peut s'agir d'une chaîne de caractères (
'full','linear','reverse_linear','circular'ou'sca') ou d'un dictionnaire dont les clés représentent le nombre de qubits et les valeurs une liste de paires d'entiers indiquant les indices des qubits intriqués les uns avec les autres, par exemple :{1: [(0,), (2,)], 2: [(0,1), (2,0)]}ou peut être unCallable[[int], Union[str | Dict[...]]]pour renvoyer un état d'intrication spécifique à une répétition - alpha (float) – Le facteur de rotation de Pauli, multiplicatif par rapport aux rotations de Pauli
- paulis (list[str] | None) – Une liste de chaînes de caractères destinées aux paulis. Si aucune valeur n'est fournie,
['Z', 'ZZ']sera utilisé. - data_map_func (Callable[[np.ndarray], float] | None) – Une fonction de mappage pour les données
xqui peut être fournie afin de remplacer le mappage par défaut. - parameter_prefix (str) – Le préfixe utilisé si des paramètres par défaut sont générés.
- insert_barriers (bool) – Dans ce cas
True, des barrières sont insérées entre les instructions d'évolution et les couches de Hadamard. - name (str) – Nom du circuit.
Attributs
alpha
Le facteur de rotation de Pauli (alpha).
Retours
Le facteur de rotation de Pauli.
entanglement_blocks
Les blocs dans les couches d'enchevêtrement.
Retours
Les blocs dans les couches d'enchevêtrement.
feature_dimension
Renvoie la dimension de la caractéristique (qui est égale au nombre de qubits).
Retours
La dimension de l'élément de cette carte.
num_parameters_settable
Le nombre de paramètres distincts.
paulis
Les chaînes de Pauli utilisées dans l'enchevêtrement des qubits.
Retours
Les chaînes de Pauli sous forme de liste.
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_circuitMéthodes
get_entangler_map
get_entangler_map(rep_num, block_num, num_block_qubits)
Obtenez la carte d'enchevêtrement pour dans la répétition rep_num et le bloc block_num.
La carte des enchevêtrements pour le bloc en cours est dérivée de la valeur de self.entanglement. Les différents cas sont énumérés ci-dessous, où i et j désignent respectivement le numéro de répétition et le numéro de bloc, et n le nombre de qubits dans le bloc.
type d'enchevêtrement | carte de l'enchevêtrement |
|---|---|
None | [[0, ..., n - 1]] |
str (par exemple 'full') | la connectivité spécifiée sur n les qubits |
List[int] | [entanglement] |
List[List[int]] | entanglement |
List[List[List[int]]] | entanglement[i] |
List[List[List[List[int]]]] | entanglement[i][j] |
List[str] | la connectivité spécifiée dans entanglement[i] |
List[List[str]] | la connectivité spécifiée dans entanglement[i][j] |
Callable[int, str] | identique à List[str] |
Callable[int, List[List[int]]] | identique à List[List[List[int]]] |
Notez que tous les indices doivent être pris modulo la longueur du tableau sur lequel ils agissent, c'est-à-dire qu'aucune erreur d'indice hors limites ne sera soulevée mais nous réitérons à partir du début de la liste.
Paramètres
- rep_num (int) – La répétition actuelle dans laquelle nous nous trouvons.
- block_num (int) – Le numéro de bloc dans les couches d'enchevêtrement.
- num_block_qubits (int) – Le nombre de qubits dans le bloc.
Retours
La carte des enchevêtrements pour le bloc actuel dans la répétition actuelle.
Augmentations
ValueError - Si la valeur de entanglement n'a pas pu être attribuée à une carte d'enchevêtrement correspondante.
Type de retour
pauli_block
pauli_block(pauli_string)
Obtenir le bloc de Pauli pour le circuit de la carte de caractéristiques.
pauli_evolution
pauli_evolution(pauli_string, time)
Obtenir le bloc d'évolution pour la chaîne de caractères pauli donnée.