Source code for qlearnkit.encodings.angle_encoding

from .encoding_map import EncodingMap

from qiskit import QuantumCircuit
from qiskit.circuit.library.standard_gates import RXGate, RYGate, RZGate
import numpy as np


"""Encoding classical data to quantum state via amplitude encoding."""


[docs]class AngleEncoding(EncodingMap): """ Angle Encoding algorithm. Assumes data is feature-normalized. """ def __init__(self, rotation='Y', scaling=np.pi / 2): r""" Args: rotation: the direction admitted values: X, Y, Z scaling: scaling factor for normalized input data. The default scaling .. math:: \pi/2 does not induce a relative phase difference. """ ROT = { 'X': RXGate, 'Y': RYGate, 'Z': RZGate } if rotation not in ROT: raise ValueError('No such rotation direction {}'.format(rotation)) self.gate = ROT[rotation] self.scaling = scaling
[docs] def n_qubits(self, x): """ Args: x (np.array): The input data to encode Returns: Number of qubits needed to encode x """ return len(x)
[docs] def circuit(self, x): """ Args: x (np.array): The input data to encode Returns: (qiskit.QuantumCircuit): The circuit that encodes x Assumes data is feature-normalized. Assumes every element in x is in [0, 1]. """ n_qubits = self.n_qubits(x) Sx = QuantumCircuit(n_qubits) for i in range(n_qubits): Sx.append(self.gate(2 * self.scaling * x[i]), [i]) return Sx
[docs] def state_vector(self, x): """ Args x (np.array): The input data to encode Returns: np.array: The state vector representation of x after angle encoding """ from functools import reduce qubit_states = [] for x_i in x: qubit_state = self.gate(2 * self.scaling * x_i).to_matrix()[:, 0] qubit_states.append(qubit_state) return reduce(lambda a, b: np.kron(a, b), qubit_states)