Skip to content

Commit

Permalink
Amplitude Amplification algorithm as a Gate in ops (#327)
Browse files Browse the repository at this point in the history
* Amplitude Amplification algorithm as a Gate in ops

* Amplitude Amplification algorithm as a Gate in ops, correct test_string_functions

* Amplitude Amplification algorithm as a Gate in ops, correct coverage for _qaagate_test

* Amplitude Amplification algorithm as a Gate in ops, correct test estimation statistics in phaseestimation_test

* Try to triger Travis test because an apt get failure in the travis test

* Address changes proposed by Damien

* Address changes proposed by Damien, missed one

* Address comments by Damien including eliminate the usage of algorith_inverse and eliminate QPE files form the PR

* Address comments by Damien including eliminate the usage of algorith_inverse and eliminate QPE files form the PR, second try

* Address comments by Damien forgot _qaagate_test

* Update amplitudeamplification_test.py

Wrap lines to 80 characters

* Update amplitudeamplification.py

Wrap lines to 80 characters

* Update _qaagate.py

Minor style correction

* Update amplitudeamplification_test.py

Cleanup imports
  • Loading branch information
fernandodelaiglesia authored and Takishima committed Jul 18, 2019
1 parent 6a46f45 commit f3582b7
Show file tree
Hide file tree
Showing 8 changed files with 415 additions and 2 deletions.
1 change: 1 addition & 0 deletions docs/projectq.ops.rst
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ The operations collection consists of various default gates and is a work-in-pro
projectq.ops.StatePreparation
projectq.ops.QPE
projectq.ops.FlipBits
projectq.ops.QAA


Module contents
Expand Down
8 changes: 8 additions & 0 deletions docs/projectq.setups.decompositions.rst
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ The decomposition package is a collection of gate decomposition / replacement ru
projectq.setups.decompositions.toffoli2cnotandtgate
projectq.setups.decompositions.uniformlycontrolledr2cnot
projectq.setups.decompositions.phaseestimation
projectq.setups.decompositions.amplitudeamplification


Submodules
Expand Down Expand Up @@ -180,6 +181,13 @@ projectq.setups.decompositions.phaseestimation module
:members:
:undoc-members:

projectq.setups.decompositions.amplitudeamplification module
---------------------------------------------------------------

.. automodule:: projectq.setups.decompositions.amplitudeamplification
:members:
:undoc-members:


Module contents
---------------
Expand Down
1 change: 1 addition & 0 deletions projectq/ops/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,4 @@
UniformlyControlledRz)
from ._state_prep import StatePreparation
from ._qpegate import QPE
from ._qaagate import QAA
81 changes: 81 additions & 0 deletions projectq/ops/_qaagate.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# Copyright 2019 ProjectQ-Framework (www.projectq.ch)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from ._basics import BasicGate


class QAA(BasicGate):
"""
Quantum Aplitude Aplification gate.
(Quick reference https://en.wikipedia.org/wiki/Amplitude_amplification.
Complete reference G. Brassard, P. Hoyer, M. Mosca, A. Tapp (2000)
Quantum Amplitude Amplification and Estimation
https://arxiv.org/abs/quant-ph/0005055)
Quantum Amplitude Amplification (QAA) executes the algorithm, but not
the final measurement required to obtain the marked state(s) with high
probability. The starting state on wich the QAA algorithm is executed
is the one resulting of aplying the Algorithm on the |0> state.
Example:
.. code-block:: python
def func_algorithm(eng,system_qubits):
All(H) | system_qubits
def func_oracle(eng,system_qubits,qaa_ancilla):
# This oracle selects the state |010> as the one marked
with Compute(eng):
All(X) | system_qubits[0::2]
with Control(eng, system_qubits):
X | qaa_ancilla
Uncompute(eng)
system_qubits = eng.allocate_qureg(3)
# Prepare the qaa_ancilla qubit in the |-> state
qaa_ancilla = eng.allocate_qubit()
X | qaa_ancilla
H | qaa_ancilla
# Creates the initial state form the Algorithm
func_algorithm(eng, system_qubits)
# Apply Quantum Amplitude Amplification the correct number of times
num_it = int(math.pi/4.*math.sqrt(1 << 3))
with Loop(eng, num_it):
QAA(func_algorithm, func_oracle) | (system_qubits, qaa_ancilla)
All(Measure) | system_qubits
Warning:
No qubit allocation/deallocation may take place during the call
to the defined Algorithm :code:`func_algorithm`
Attributes:
func_algorithm: Algorithm that initialite the state and to be used
in the QAA algorithm
func_oracle: The Oracle that marks the state(s) as "good"
system_qubits: the system we are interested on
qaa_ancilla: auxiliary qubit that helps to invert the amplitude of the
"good" states
"""
def __init__(self, algorithm, oracle):
BasicGate.__init__(self)
self.algorithm = algorithm
self.oracle = oracle

def __str__(self):
return 'QAA(Algorithm = {0}, Oracle = {1})'.format(
str(self.algorithm.__name__), str(self.oracle.__name__))
27 changes: 27 additions & 0 deletions projectq/ops/_qaagate_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Copyright 2019 ProjectQ-Framework (www.projectq.ch)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Tests for projectq.ops._qaagate."""

from projectq.ops import _qaagate, All, H, X


def test_qaa_str():

def func_algorithm(): All(H)

def func_oracle(): All(X)

gate = _qaagate.QAA(func_algorithm, func_oracle)
assert str(gate) == "QAA(Algorithm = func_algorithm, Oracle = func_oracle)"
6 changes: 4 additions & 2 deletions projectq/setups/decompositions/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@
toffoli2cnotandtgate,
time_evolution,
uniformlycontrolledr2cnot,
phaseestimation)
phaseestimation,
amplitudeamplification)

all_defined_decomposition_rules = [
rule
Expand All @@ -56,6 +57,7 @@
toffoli2cnotandtgate,
time_evolution,
uniformlycontrolledr2cnot,
phaseestimation]
phaseestimation,
amplitudeamplification]
for rule in module.all_defined_decomposition_rules
]
111 changes: 111 additions & 0 deletions projectq/setups/decompositions/amplitudeamplification.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
# Copyright 2019 ProjectQ-Framework (www.projectq.ch)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Registers a decomposition for quantum amplitude amplification.
(Quick reference https://en.wikipedia.org/wiki/Amplitude_amplification.
Complete reference G. Brassard, P. Hoyer, M. Mosca, A. Tapp (2000)
Quantum Amplitude Amplification and Estimation
https://arxiv.org/abs/quant-ph/0005055)
Quantum Amplitude Amplification (QAA) executes the algorithm, but not
the final measurement required to obtain the marked state(s) with high
probability. The starting state on wich the QAA algorithm is executed
is the one resulting of aplying the Algorithm on the |0> state.
Example:
.. code-block:: python
def func_algorithm(eng,system_qubits):
All(H) | system_qubits
def func_oracle(eng,system_qubits,qaa_ancilla):
# This oracle selects the state |010> as the one marked
with Compute(eng):
All(X) | system_qubits[0::2]
with Control(eng, system_qubits):
X | qaa_ancilla
Uncompute(eng)
system_qubits = eng.allocate_qureg(3)
# Prepare the qaa_ancilla qubit in the |-> state
qaa_ancilla = eng.allocate_qubit()
X | qaa_ancilla
H | qaa_ancilla
# Creates the initial state form the Algorithm
func_algorithm(eng, system_qubits)
# Apply Quantum Amplitude Amplification the correct number of times
num_it = int(math.pi/4.*math.sqrt(1 << 3))
with Loop(eng, num_it):
QAA(func_algorithm, func_oracle) | (system_qubits, qaa_ancilla)
All(Measure) | system_qubits
Warning:
No qubit allocation/deallocation may take place during the call
to the defined Algorithm :code:`func_algorithm`
Attributes:
func_algorithm: Algorithm that initialite the state and to be used
in the QAA algorithm
func_oracle: The Oracle that marks the state(s) as "good"
system_qubits: the system we are interested on
qaa_ancilla: auxiliary qubit that helps to invert the amplitude of the
"good" states
"""

import math
import numpy as np

from projectq.cengines import DecompositionRule
from projectq.meta import Control, Compute, Uncompute, CustomUncompute, Dagger
from projectq.ops import X, Z, Ph, All

from projectq.ops import QAA


def _decompose_QAA(cmd):
""" Decompose the Quantum Amplitude Apmplification algorithm as a gate. """
eng = cmd.engine

# System-qubit is the first qubit/qureg. Ancilla qubit is the second qubit
system_qubits = cmd.qubits[0]
qaa_ancilla = cmd.qubits[1]

# The Oracle and the Algorithm
Oracle = cmd.gate.oracle
A = cmd.gate.algorithm

# Apply the oracle to invert the amplitude of the good states, S_Chi
Oracle(eng, system_qubits, qaa_ancilla)

# Apply the inversion of the Algorithm,
# the inversion of the aplitude of |0> and the Algorithm

with Compute(eng):
with Dagger(eng):
A(eng, system_qubits)
All(X) | system_qubits
with Control(eng, system_qubits[0:-1]):
Z | system_qubits[-1]
with CustomUncompute(eng):
All(X) | system_qubits
A(eng, system_qubits)
Ph(math.pi) | system_qubits[0]


#: Decomposition rules
all_defined_decomposition_rules = [DecompositionRule(QAA, _decompose_QAA)]

0 comments on commit f3582b7

Please sign in to comment.