Quellcode fΓΌr qiskit.circuit.library.data_preparation.zz_feature_map

# 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, )