Source code for unitaria.nodes.amplification.grover_amplification
import numpy as np
from unitaria.nodes.node import Node
from unitaria.nodes.proxy_node import ProxyNode
from unitaria.nodes.qsvt.qsvt import QSVT
[docs]
class GroverAmplification(ProxyNode):
def __init__(self, A: Node, iterations: int):
assert A.is_vector()
assert iterations >= 0
super().__init__(A.dimension_in, A.dimension_out)
self.A = A
self.iterations = iterations
def definition(self) -> Node:
# Angles for the Chebyshev polynomial
angles = np.pi / 2 * np.ones(2 * self.iterations + 2)
angles[0] = -self.iterations * np.pi / 2
angles[-1] = -self.iterations * np.pi / 2
# The Chebyshev polynomial has negative derivative at zero if
# `self.iterations` is odd
if self.iterations % 2 == 1:
angles[0] += np.pi / 2
angles[-1] += np.pi / 2
return QSVT(self.A, angles)