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
The Pauli Expansion circuit.
The Pauli Expansion circuit is a data encoding circuit that transforms input data , where n is the feature_dimension
, as
Here, is a set of qubit indices that describes the connections in the feature map, is a set containing all these index sets, and . Per default the data-mapping is
The possible connections can be set using the entanglement
and paulis
arguments. For example, for single-qubit rotations and two-qubit 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- rotations and to ZZFeatureMap
for the single- and two-qubit Pauli- 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.
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 aCallable[[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)
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 type | entangler 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