# 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
[docs]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,
)