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

Bases: NLocal

The Pauli Expansion circuit.

The Pauli Expansion circuit is a data encoding circuit that transforms input data xRn\vec{x} \in \mathbb{R}^n, where n is the feature_dimension, as

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

Here, SS is a set of qubit indices that describes the connections in the feature map, I\mathcal{I} is a set containing all these index sets, and Pi{I,X,Y,Z}P_i \in \{I, X, Y, Z\}. Per default the data-mapping ϕS\phi_S is

ϕ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}.

The possible connections can be set using the entanglement and paulis arguments. For example, for single-qubit ZZ rotations and two-qubit YYYY interactions between all qubit pairs, we can set:

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

which will produce blocks of the form

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

The circuit contains reps repetitions of this transformation.

Please refer to ZFeatureMap for the case of single-qubit Pauli-ZZ rotations and to ZZFeatureMap for the single- and two-qubit Pauli-ZZ rotations.

Examples

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

References:

[1] Havlicek et al. Supervised learning with quantum enhanced feature spaces, Nature 567, 209-212 (2019).

Create a new Pauli expansion circuit.

Deprecated since version 2.1

The class qiskit.circuit.library.data_preparation.pauli_feature_map.PauliFeatureMap is deprecated as of Qiskit 2.1. It will be removed in Qiskit 3.0. Use the pauli_feature_map function as a replacement. Note that this will no longer return a BlueprintCircuit, but just a plain QuantumCircuit.

Parameters

  • feature_dimension (Optional[int]) – Number of qubits in the circuit.
  • reps (int) – The number of repeated circuits.
  • entanglement (Union[str, Dict[int, List[Tuple[int]]], Callable[[int], Union[str, Dict[int, List[Tuple[int]]]]]]) – Specifies the entanglement structure. Can be a string ('full', 'linear', 'reverse_linear', 'circular' or 'sca') or can be a dictionary where the keys represent the number of qubits and the values are list of integer-pairs specifying the indices of qubits that are entangled with one another, for example: {1: [(0,), (2,)], 2: [(0,1), (2,0)]} or can be a Callable[[int], Union[str | Dict[...]]] to return an entanglement specific for a repetition
  • alpha (float) – The Pauli rotation factor, multiplicative to the pauli rotations
  • paulis (Optional[List[str]]) – A list of strings for to-be-used paulis. If None are provided, ['Z', 'ZZ'] will be used.
  • data_map_func (Optional[Callable[[np.ndarray], float]]) – A mapping function for data x which can be supplied to override the default mapping from self_product().
  • parameter_prefix (str) – The prefix used if default parameters are generated.
  • insert_barriers (bool) – If True, barriers are inserted in between the evolution instructions and hadamard layers.
  • name (str) –

Attributes

alpha

The Pauli rotation factor (alpha).

Returns

The Pauli rotation factor.

entanglement_blocks

The blocks in the entanglement layers.

Returns

The blocks in the entanglement layers.

feature_dimension

Returns the feature dimension (which is equal to the number of qubits).

Returns

The feature dimension of this feature map.

num_parameters_settable

The number of distinct parameters.

paulis

The Pauli strings used in the entanglement of the qubits.

Returns

The Pauli strings as list.

name

Type: str

A human-readable name for the circuit.

Example

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

Methods

get_entangler_map

get_entangler_map(rep_num, block_num, num_block_qubits)

GitHub

Get the entangler map for in the repetition rep_num and the block block_num.

The entangler map for the current block is derived from the value of self.entanglement. Below the different cases are listed, where i and j denote the repetition number and the block number, respectively, and n the number of qubits in the block.

entanglement typeentangler map

| None | [[0, ..., n - 1]] | | str (e.g 'full') | the specified connectivity on n qubits | | List[int] | [entanglement] | | List[List[int]] | entanglement | | List[List[List[int]]] | entanglement[i] | | List[List[List[List[int]]]] | entanglement[i][j] | | List[str] | the connectivity specified in entanglement[i] | | List[List[str]] | the connectivity specified in entanglement[i][j] | | Callable[int, str] | same as List[str] | | Callable[int, List[List[int]]] | same as List[List[List[int]]] |

Note that all indices are to be taken modulo the length of the array they act on, i.e. no out-of-bounds index error will be raised but we re-iterate from the beginning of the list.

Parameters

  • rep_num (int) – The current repetition we are in.
  • block_num (int) – The block number within the entanglement layers.
  • num_block_qubits (int) – The number of qubits in the block.

Returns

The entangler map for the current block in the current repetition.

Raises

ValueError – If the value of entanglement could not be cast to a corresponding entangler map.

Return type

Sequence[Sequence[int]]

pauli_block

pauli_block(pauli_string)

GitHub

Get the Pauli block for the feature map circuit.

pauli_evolution

pauli_evolution(pauli_string, time)

GitHub

Get the evolution block for the given pauli string.

Was this page helpful?
Report a bug or request content on GitHub.