# This code is part of Qiskit.
#
# (C) Copyright IBM 2017, 2020.
#
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.
"""Second-order Pauli-Z expansion circuit."""
from typing import Callable, List, Union, Optional
import numpy as np
from .pauli_feature_map import PauliFeatureMap
[Doku]class ZZFeatureMap(PauliFeatureMap):
"""Second-order Pauli-Z evolution circuit.
For 3 qubits and 1 repetition and linear entanglement the circuit is represented by:
.. parsed-literal::
ββββββββββββββββββββββββ
β€ H ββ€ U1(2.0*Ο(x[0])) ββββ βββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββββ
βββββ€βββββββββββββββββββ€βββ΄βββββββββββββββββββββββββββββ΄ββ
β€ H ββ€ U1(2.0*Ο(x[1])) ββ€ X ββ€ U1(2.0*Ο(x[0],x[1])) ββ€ X ββββ βββββββββββββββββββββββββββββ ββ
βββββ€βββββββββββββββββββ€βββββββββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββ΄ββ
β€ H ββ€ U1(2.0*Ο(x[2])) ββββββββββββββββββββββββββββββββββββ€ X ββ€ U1(2.0*Ο(x[1],x[2])) ββ€ X β
ββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββ
where ``Ο`` is a classical non-linear function, which defaults to ``Ο(x) = x`` if and
``Ο(x,y) = (pi - x)(pi - y)``.
Examples:
>>> from qiskit.circuit.library import ZZFeatureMap
>>> prep = ZZFeatureMap(2, reps=1)
>>> print(prep)
βββββββββββββββββββββ
q_0: β€ H ββ€ U1(2.0*x[0]) ββββ ββββββββββββββββββββββββββββββββββββββββ ββ
βββββ€ββββββββββββββββ€βββ΄ββββββββββββββββββββββββββββββββββββββββ΄ββ
q_1: β€ H ββ€ U1(2.0*x[1]) ββ€ X ββ€ U1(2.0*(pi - x[0])*(pi - x[1])) ββ€ X β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
>>> from qiskit.circuit.library import EfficientSU2
>>> classifier = ZZFeatureMap(3) + EfficientSU2(3)
>>> classifier.num_parameters
15
>>> classifier.parameters # 'x' for the data preparation, 'ΞΈ' for the SU2 parameters
ParameterView([
ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
ParameterVectorElement(x[2]), ParameterVectorElement(ΞΈ[0]),
ParameterVectorElement(ΞΈ[1]), ParameterVectorElement(ΞΈ[2]),
ParameterVectorElement(ΞΈ[3]), ParameterVectorElement(ΞΈ[4]),
ParameterVectorElement(ΞΈ[5]), ParameterVectorElement(ΞΈ[6]),
ParameterVectorElement(ΞΈ[7]), ParameterVectorElement(ΞΈ[8]),
ParameterVectorElement(ΞΈ[9]), ParameterVectorElement(ΞΈ[10]),
ParameterVectorElement(ΞΈ[11]), ParameterVectorElement(ΞΈ[12]),
ParameterVectorElement(ΞΈ[13]), ParameterVectorElement(ΞΈ[14]),
ParameterVectorElement(ΞΈ[15]), ParameterVectorElement(ΞΈ[16]),
ParameterVectorElement(ΞΈ[17]), ParameterVectorElement(ΞΈ[18]),
ParameterVectorElement(ΞΈ[19]), ParameterVectorElement(ΞΈ[20]),
ParameterVectorElement(ΞΈ[21]), ParameterVectorElement(ΞΈ[22]),
ParameterVectorElement(ΞΈ[23])
])
>>> classifier.count_ops()
OrderedDict([('ZZFeatureMap', 1), ('EfficientSU2', 1)])
"""
def __init__(
self,
feature_dimension: int,
reps: int = 2,
entanglement: Union[str, List[List[int]], Callable[[int], List[int]]] = "full",
data_map_func: Optional[Callable[[np.ndarray], float]] = None,
parameter_prefix: str = "x",
insert_barriers: bool = False,
name: str = "ZZFeatureMap",
) -> None:
"""Create a new second-order Pauli-Z expansion.
Args:
feature_dimension: Number of features.
reps: The number of repeated circuits, has a min. value of 1.
entanglement: Specifies the entanglement structure. Refer to
:class:`~qiskit.circuit.library.NLocal` for detail.
data_map_func: A mapping function for data x.
parameter_prefix: The prefix used if default parameters are generated.
insert_barriers: If True, barriers are inserted in between the evolution instructions
and hadamard layers.
Raises:
ValueError: If the feature dimension is smaller than 2.
"""
if feature_dimension < 2:
raise ValueError(
"The ZZFeatureMap contains 2-local interactions and cannot be "
f"defined for less than 2 qubits. You provided {feature_dimension}."
)
super().__init__(
feature_dimension=feature_dimension,
reps=reps,
entanglement=entanglement,
paulis=["Z", "ZZ"],
data_map_func=data_map_func,
parameter_prefix=parameter_prefix,
insert_barriers=insert_barriers,
name=name,
)