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
El circuito de expansión de Pauli.
El circuito de expansión de Pauli es un circuito de codificación de datos que transforma los datos de entrada , donde n es el feature_dimension, como
Aquí, es un conjunto de índices qubit que describe las conexiones en el mapa de características, es un conjunto que contiene todos estos conjuntos de índices, y . Por defecto, el mapa de datos es
Las conexiones posibles pueden establecerse utilizando los argumentos entanglement y paulis . Por ejemplo, para rotaciones de un solo qubit e interacciones de dos qubits entre todos los pares de qubits, podemos establecer:
feature_map = PauliFeatureMap(..., paulis=["Z", "YY"], entanglement="full")que producirá bloques de la 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) ├
└───┘└─────────────┘└──────────┘└───┘└────────────────────────────────┘└───┘└───────────┘El circuito contiene reps repeticiones de esta transformación.
Consulte ZFeatureMap para el caso de rotaciones Pauli- de un solo qubit y a ZZFeatureMap para las rotaciones Pauli- de uno y dos qubits.
Ejemplos
>>> 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)])Referencias:
[1] Havlicek et al. Supervised learning with quantum enhanced feature spaces, Nature 567, 209-212 (2019).
La clase qiskit.circuit.library.data_preparation.pauli_feature_map.PauliFeatureMap está obsoleta a partir de Qiskit 2.1. Se eliminará en Qiskit 3.0. Utilice la función pauli_feature_map en su lugar. Tenga en cuenta que esto ya no devolverá un BlueprintCircuit, sino un simple QuantumCircuit.
Parámetros
- feature_dimension (int | None) – Número de qubits en el circuito.
- reps (int) – El número de veces que se repiten las capas de evolución.
- entanglement (str |dict[int, list[tuple[int]]] | Callable[[int], str |dict[int, list[tuple[int]]]]) – Especifica la estructura de entrelazamiento. Puede ser una cadena (
'full','linear','reverse_linear','circular'o'sca') o un diccionario en el que las claves representan el número de qubits y los valores son listas de pares de números enteros que especifican los índices de los qubits que están entrelazados entre sí, por ejemplo:{1: [(0,), (2,)], 2: [(0,1), (2,0)]}o puede ser unCallable[[int], Union[str | Dict[...]]]para devolver un entrelazamiento específico para una repetición - alpha (float) – El factor de rotación Pauli, multiplicativo de las rotaciones pauli
- paulis (list[str] | None) – Una lista de cadenas para los paulis que se van a utilizar. Si no se proporciona ninguno,
['Z', 'ZZ']se utilizará. - data_map_func (Callable[[np.ndarray], float] | None) – Una función de asignación para los datos
xque se puede proporcionar para anular la asignación predeterminada. - parameter_prefix (str) – El prefijo utilizado si se generan parámetros por defecto.
- insert_barriers (bool) – En ese caso
True, se insertan barreras entre las instrucciones de evolución y las capas de Hadamard. - name (str) – Nombre del circuito.
Atributos
alpha
El factor de rotación de Pauli (alfa).
Devuelve
El factor de rotación de Pauli.
entanglement_blocks
Los bloques en las capas de enredo.
Devuelve
Los bloques en las capas de enredo.
feature_dimension
Devuelve la dimensión de la característica (que es igual al número de qubits).
Devuelve
La dimensión de la característica de este mapa de características.
num_parameters_settable
El número de parámetros distintos.
paulis
Las cuerdas de Pauli utilizadas en el entrelazamiento de los qubits.
Devuelve
Las cuerdas de Pauli como lista.
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_circuitMétodos
get_entangler_map
get_entangler_map(rep_num, block_num, num_block_qubits)
Obtenga el mapa de enredos para en la repetición rep_num y el bloque block_num.
El mapa de enredos del bloque actual se obtiene a partir del valor de self.entanglement. A continuación se enumeran los distintos casos, donde i y j denotan el número de repetición y el número de bloque, respectivamente, y n el número de qubits del bloque.
tipo de enredo | mapa de enredos |
|---|---|
None | [[0, ..., n - 1]] |
str (p. ej 'full'.) | la conectividad especificada en n los 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 conectividad especificada en entanglement[i] |
List[List[str]] | la conectividad especificada en entanglement[i][j] |
Callable[int, str] | Igual que List[str] |
Callable[int, List[List[int]]] | Igual que List[List[List[int]]] |
Tenga en cuenta que todos los índices deben tomarse modulando la longitud de la matriz sobre la que actúan, es decir, no se producirá ningún error de índice fuera de los límites, sino que se reitera desde el principio de la lista.
Parámetros
- rep_num (int) – La repetición actual en la que nos encontramos.
- block_num (int) – El número de bloque dentro de las capas de enredo.
- num_block_qubits (int) – El número de qubits del bloque.
Devuelve
El mapa de enredos para el bloque actual en la repetición actual.
Eleva
ValueError - Si el valor de entanglement no se ha podido asignar a un mapa de enredos correspondiente.
Tipo de retorno
Secuencia[* Secuencia*[ int ]]
pauli_block
pauli_block(pauli_string)
Obtener el bloque de Pauli para el circuito del mapa de características.