# 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.
"""Create a new first-order Pauli-Z expansion circuit."""
from typing import Callable, Optional
import numpy as np
from .pauli_feature_map import PauliFeatureMap
[documentos]class ZFeatureMap(PauliFeatureMap):
"""The first order Pauli Z-evolution circuit.
On 3 qubits and with 2 repetitions the circuit is represented by:
.. parsed-literal::
ββββββββββββββββββββββββββββββββββββββββββ
β€ H ββ€ U1(2.0*x[0]) ββ€ H ββ€ U1(2.0*x[0]) β
βββββ€ββββββββββββββββ€βββββ€ββββββββββββββββ€
β€ H ββ€ U1(2.0*x[1]) ββ€ H ββ€ U1(2.0*x[1]) β
βββββ€ββββββββββββββββ€βββββ€ββββββββββββββββ€
β€ H ββ€ U1(2.0*x[2]) ββ€ H ββ€ U1(2.0*x[2]) β
ββββββββββββββββββββββββββββββββββββββββββ
This is a sub-class of :class:`~qiskit.circuit.library.PauliFeatureMap` where the Pauli
strings are fixed as `['Z']`. As a result the first order expansion will be a circuit without
entangling gates.
Examples:
>>> prep = ZFeatureMap(3, reps=3, insert_barriers=True)
>>> print(prep)
βββββ β ββββββββββββββββ β βββββ β ββββββββββββββββ β βββββ β ββββββββββββββββ
q_0: β€ H βββββ€ U1(2.0*x[0]) βββββ€ H βββββ€ U1(2.0*x[0]) βββββ€ H βββββ€ U1(2.0*x[0]) β
βββββ€ β ββββββββββββββββ€ β βββββ€ β ββββββββββββββββ€ β βββββ€ β ββββββββββββββββ€
q_1: β€ H βββββ€ U1(2.0*x[1]) βββββ€ H βββββ€ U1(2.0*x[1]) βββββ€ H βββββ€ U1(2.0*x[1]) β
βββββ€ β ββββββββββββββββ€ β βββββ€ β ββββββββββββββββ€ β βββββ€ β ββββββββββββββββ€
q_2: β€ H βββββ€ U1(2.0*x[2]) βββββ€ H βββββ€ U1(2.0*x[2]) βββββ€ H βββββ€ U1(2.0*x[2]) β
βββββ β ββββββββββββββββ β βββββ β ββββββββββββββββ β βββββ β ββββββββββββββββ
>>> data_map = lambda x: x[0]*x[0] + 1 # note: input is an array
>>> prep = ZFeatureMap(3, reps=1, data_map_func=data_map)
>>> print(prep)
ββββββββββββββββββββββββββββββ
q_0: β€ H ββ€ U1(2.0*x[0]**2 + 2.0) β
βββββ€βββββββββββββββββββββββββ€
q_1: β€ H ββ€ U1(2.0*x[1]**2 + 2.0) β
βββββ€βββββββββββββββββββββββββ€
q_2: β€ H ββ€ U1(2.0*x[2]**2 + 2.0) β
ββββββββββββββββββββββββββββββ
>>> classifier = ZFeatureMap(3, reps=1) + RY(3, reps=1)
>>> print(classifier)
βββββββββββββββββββββββββββββββββ ββββββββββββ
q_0: β€ H ββ€ U1(2.0*x[0]) ββ€ RY(ΞΈ[0]) βββ βββ ββ€ RY(ΞΈ[3]) βββββββββββββ
βββββ€ββββββββββββββββ€ββββββββββββ€ β β ββββββββββββββββββββββββ
q_1: β€ H ββ€ U1(2.0*x[1]) ββ€ RY(ΞΈ[1]) βββ βββΌβββββββ βββββββ€ RY(ΞΈ[4]) β
βββββ€ββββββββββββββββ€ββββββββββββ€ β β ββββββββββββ€
q_2: β€ H ββ€ U1(2.0*x[2]) ββ€ RY(ΞΈ[2]) ββββββ βββββββ βββββββ€ RY(ΞΈ[5]) β
βββββββββββββββββββββββββββββββββ ββββββββββββ
"""
def __init__(
self,
feature_dimension: int,
reps: int = 2,
data_map_func: Optional[Callable[[np.ndarray], float]] = None,
parameter_prefix: str = "x",
insert_barriers: bool = False,
name: str = "ZFeatureMap",
) -> None:
"""Create a new first-order Pauli-Z expansion circuit.
Args:
feature_dimension: The number of features
reps: The number of repeated circuits. Defaults to 2, has a minimum value of 1.
data_map_func: A mapping function for data x which can be supplied to override the
default mapping from :meth:`self_product`.
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.
"""
super().__init__(
feature_dimension=feature_dimension,
paulis=["Z"],
reps=reps,
data_map_func=data_map_func,
parameter_prefix=parameter_prefix,
insert_barriers=insert_barriers,
name=name,
)