Skip to main content
IBM Quantum Platform

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')

GitHub

Basi: NLocal

Il circuito di espansione di Pauli.

Il circuito di espansione Pauli è un circuito di codifica dei dati che trasforma i dati di ingresso xRn\vec{x} \in \mathbb{R}^n, dove n è il feature_dimension, come

UΦ(x)=exp(iSIϕS(x)iSPi).U_{\Phi(\vec{x})}=\exp\left(i\sum_{S \in \mathcal{I}} \phi_S(\vec{x})\prod_{i\in S} P_i\right).

Qui, SS è un insieme di indici di qubit che descrive le connessioni nella mappa delle caratteristiche, I\mathcal{I} è un insieme che contiene tutti questi insiemi di indici e Pi{I,X,Y,Z}P_i \in \{I, X, Y, Z\}. Per impostazione predefinita, il data-mapping ϕS\phi_S è

ϕS(x)={xi if S={i}jS(πxj) if S>1.\phi_S(\vec{x}) = \begin{cases} x_i \text{ if } S = \{i\} \\ \prod_{j \in S} (\pi - x_j) \text{ if } |S| > 1 \end{cases}.

Le connessioni possibili possono essere impostate con gli argomenti entanglement e paulis . Ad esempio, per le rotazioni ZZ a un qubit e le interazioni YYYY a due qubit tra tutte le coppie di qubit, possiamo impostare:

feature_map = PauliFeatureMap(..., paulis=["Z", "YY"], entanglement="full")

che produrrà blocchi della forma

┌───┐┌─────────────┐┌──────────┐                                            ┌───────────┐
┤ 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) ├
└───┘└─────────────┘└──────────┘└───┘└────────────────────────────────┘└───┘└───────────┘

Il circuito contiene reps ripetizioni di questa trasformazione.

Si rimanda a ZFeatureMap per il caso delle rotazioni Pauli- ZZ a un solo qubit e a ZZFeatureMap per il caso delle rotazioni Pauli- ZZ a uno e due qubit.

Esempi

>>> 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)])

Riferimenti:

[1] Havlicek et al. Apprendimento supervisionato con spazi di caratteristiche migliorati dal punto di vista quantistico, Nature 567, 209-212 (2019).

Deprecato dalla versione 2.1

La classe qiskit.circuit.library.data_preparation.pauli_feature_map.PauliFeatureMap è deprecata a partire da Qiskit 2.1. Verrà rimosso in Qiskit 3.0. Utilizzare la funzione pauli_feature_map in sostituzione. Si noti che questo non restituirà più un BlueprintCircuit, ma solo un semplice QuantumCircuit.

Parametri

  • feature_dimension (int | None) – Numero di qubit nel circuito.
  • reps (int) – Il numero di volte in cui vengono ripetuti i livelli di evoluzione.
  • entanglement (str |dict[int, list[tuple[int]]] | Callable[[int], str |dict[int, list[tuple[int]]]]) – Specifica la struttura di entanglement. Può essere una stringa ('full', 'linear', 'reverse_linear', 'circular' o 'sca') oppure un dizionario in cui le chiavi rappresentano il numero di qubit e i valori sono un elenco di coppie di numeri interi che specificano gli indici dei qubit intrecciati tra loro, ad esempio: {1: [(0,), (2,)], 2: [(0,1), (2,0)]} oppure può essere un Callable[[int], Union[str | Dict[...]]] per restituire un intreccio specifico per una ripetizione
  • alpha (float) – Il fattore di rotazione di Pauli, moltiplicativo delle rotazioni di Pauli
  • paulis (list[str] | None) – Un elenco di stringhe da utilizzare per i pauli. Se non viene specificato alcun valore, ['Z', 'ZZ'] verrà utilizzato.
  • data_map_func (Callable[[np.ndarray], float] | None) – Una funzione di mappatura per i dati x che può essere specificata per sovrascrivere la mappatura predefinita.
  • parameter_prefix (str) – Il prefisso utilizzato se vengono generati parametri predefiniti.
  • insert_barriers (bool) – In tal caso True, vengono inserite delle barriere tra le istruzioni di evoluzione e gli strati di Hadamard.
  • name (str) – Nome del circuito.

Attributi

alpha

Il fattore di rotazione Pauli (alfa).

Risultati

Il fattore di rotazione di Pauli.

entanglement_blocks

I blocchi negli strati di entanglement.

Risultati

I blocchi negli strati di entanglement.

feature_dimension

Restituisce la dimensione della caratteristica (che è uguale al numero di qubit).

Risultati

La dimensione della caratteristica di questa mappa di caratteristiche.

num_parameters_settable

Il numero di parametri distinti.

paulis

Le stringhe di Pauli utilizzate per l'entanglement dei qubit.

Risultati

Le stringhe di Pauli come elenco.

name

Tipo: str

Un nome leggibile per il circuito.

Esempio

from qiskit import QuantumCircuit

qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)
my_circuit

Metodi

get_entangler_map

get_entangler_map(rep_num, block_num, num_block_qubits)

GitHub

Ottenere la mappa entangler per la ripetizione rep_num e il blocco block_num.

La mappa entangler per il blocco corrente viene ricavata dal valore di self.entanglement. Di seguito sono elencati i diversi casi, dove i e j indicano rispettivamente il numero di ripetizioni e il numero di blocchi, e n il numero di qubit nel blocco.

tipo di entanglement
mappa del groviglio
None[[0, ..., n - 1]]
str (ad es. 'full')la connettività specificata sui n qubit
List[int][entanglement]
List[List[int]]entanglement
List[List[List[int]]]entanglement[i]
List[List[List[List[int]]]]entanglement[i][j]
List[str]la connettività specificata in entanglement[i]
List[List[str]]la connettività specificata in entanglement[i][j]
Callable[int, str]Come List[str]
Callable[int, List[List[int]]]Come List[List[List[int]]]

Si noti che tutti gli indici devono essere presi modulo per modulo della lunghezza dell'array su cui agiscono, quindi non verrà sollevato alcun errore di indice fuori limite, ma si ripeterà l'iter dall'inizio dell'elenco.

Parametri

  • rep_num (int) – L'attuale ripetizione in cui ci troviamo.
  • block_num (int) – Il numero di blocco all'interno degli strati di entanglement.
  • num_block_qubits (int) – Il numero di qubit nel blocco.

Risultati

La mappa entangler per il blocco corrente nella ripetizione corrente.

Aumenti

ValueError - Se il valore di entanglement non può essere lanciato in una mappa entangler corrispondente.

Tipo di restituzione

Sequenza[* Sequenza*[ int ]]

pauli_block

pauli_block(pauli_string)

GitHub

Ottenere il blocco Pauli per il circuito della mappa delle caratteristiche.

pauli_evolution

pauli_evolution(pauli_string, time)

GitHub

Ottiene il blocco di evoluzione per la stringa pauli data.

Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.