Repository: dakk/qlasskit (language: python)

Issue:
Request for algorithms!
- Propose and implement an algorithm in the [`qlasskit.algorithms`](https://github.com/dakk/qlasskit/tree/master/qlasskit/algorithms) package.
- Create a notebook in docs, showcasing the algorithm
- The algorithm have to use one or more `qlassf` functions. 
- The algorithm have to preferably come from a peer-reviewed paper.
- The proposed algorithm have to be approved by the maintainer. 
- Take a look at the [documentation](https://dakk.github.io/qlasskit/algorithms.html) for hints.

The code of the pull request should include:
- the QAlgorithm implemented in the algorithm module
- the test suite with a complete coverage
- one or more notebook in the docs, showing a cool use case

Please read [**CONTRIBUTING.md**](https://github.com/dakk/qlasskit/blob/master/CONTRIBUTING.md) before contributing.


Discussion / hints:
Hi @dakk I have done a QPE Algo
Hi @AbdullahKazi500 , thank you for your contribution. Can you show me an example of use-case for the algo using a qlasskit function? 

Anyway, the algorithm should be implemented in the algorithms module; the notebook is only a showcase of the algorithm. Before writing more code, please answer the question above.
hi @dakk I can possibly try but since QPE is an advance and complex algo I dont know if we can extend it to a use case given qlasskit is in a beta stage do you want me to try it out 
in my notebook I have given a basic demo of the QPE circuit using qlasskit function 
> hi @dakk I can possibly try but since QPE is an advance and complex algo I dont know if we can extend it to a use case given qlasskit is in a beta stage do you want me to try it out

Yes, try it out. 



> in my notebook I have given a basic demo of the QPE circuit using qlasskit function

In your notebook you just the QAlgorithm of QPE, you're not using it. You should instead put the QAlgorithm implementation in a proper file in the algorithms module, while put a demo in the notebook. 

But before writing more code, please show me an example of use-case for the algo using a qlasskit function, so I can determine in the algorithm you proposed is suitable for qlasskit.
ok Suppose we have a simple quantum circuit that applies a single-qubit gate U to an ancillary qubit in the state 
∣+⟩, where U is a phase gate with an unknown phase θ. We want to estimate this phase θ.
this is a basic use case @dakk 
> ok Suppose we have a simple quantum circuit that applies a single-qubit gate U to an ancillary qubit in the state ∣+⟩, where U is a phase gate with an unknown phase θ. We want to estimate this phase θ. this is a basic use case @dakk

Ok thanks; I'm sorry but I don't think QPE meets the issue requirements. Thank you for the proposal anyway!
so can I Add my algorithm in the algorithm module and will it be considered for a bounty @dakk 
I can experiment with other advance algorithms as well if Have some time
No, I'm sorry but the requirements should be met in order to solve the issue. Anyway, if you have any other proposal let me know! 
ok @dakk you need a use case right ?
Yes, like I did for Grover search; in the use case, I used Grover implemented inside qlasskit, in order to search for a solution of an oracle. This oracle is built using qlasskit, for example searching for a sudoku puzzle solution.

https://dakk.github.io/qlasskit/example_grover_sudoku.html

Like I did for Grover, the final work of the issue should include:
- the QAlgorithm implemented in the algorithm module
- the test suite with a complete coverage
- a notebook in the docs, showing a cool use case

Fix patch:
diff --git a/docs/source/example_bernstein_vazirani.ipynb b/docs/source/example_bernstein_vazirani.ipynb
new file mode 100644
index 00000000..a7c4fee8
--- /dev/null
+++ b/docs/source/example_bernstein_vazirani.ipynb
@@ -0,0 +1,211 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Bernstein Vazirani algorithm\n",
+    "Bernstein-Vazirani algorithm, first introduced in [Quantum Complexity Theory by Ethan Bernstein and Umesh Vazirani](https://epubs.siam.org/doi/10.1137/S0097539796300921), can be seen as an extension of the Deutsch-Jozsa algorithm. It showed that there can be advantages in using a quantum computer as a computational tool for more complex problems than the Deutsch-Jozsa problem."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### The Bernstein-Vazirani Problem <a id='bvproblem'> </a>\n",
+    "\n",
+    "We are given a black-box function $f$, which takes as input a string of bits ($x$), and returns either $0$ or $1$, that is:\n",
+    "$$f(\\{x_0,x_1,x_2,...\\}) \\rightarrow 0 \\textrm{ or } 1 \\textrm{ where } x_n \\textrm{ is }0 \\textrm{ or } 1  $$ \n",
+    "\n",
+    "The function is guaranteed to return the bitwise product of the input with some string, $s$. In other words, given an input $x$, $f(x) = s \\cdot x \\, \\text{(mod 2)}$. We are expected to find $s$. "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### The Qlasskit implementation of Bernstein Vazirani Algorithm"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Defining Oracle with secret string =`14` which binary equivalent is `1110`"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from qlasskit import qlassf, Qint, Qint2,Qint4\n",
+    "\n",
+    "@qlassf\n",
+    "def oracle(x: Qint[4]) -> bool:\n",
+    "    s=Qint4(14)\n",
+    "    return ((x[0]&s[0])^(x[1]&s[1])^(x[2]&s[2])^(x[3]&s[3]))\n",
+    "    "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Printing the circuit formed in Qiskit draw format"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 371.107x451.5 with 1 Axes>"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "oracle.export(\"qiskit\").draw(\"mpl\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Using the predefined `BernsteinVazirani` algorithm function and passing the oracle in the function"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from qlasskit.algorithms import BernsteinVazirani\n",
+    "\n",
+    "q_algo = BernsteinVazirani(oracle)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Final Circuit with oracle and `BernsteinVazirani` applied to it"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 872.774x451.5 with 1 Axes>"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "qc = q_algo.export(\"qiskit\")\n",
+    "qc.draw(\"mpl\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Measuring and checking the results by giving `1024` shots the circuit formed. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'0111': 1024}\n"
+     ]
+    }
+   ],
+   "source": [
+    "from qiskit import QuantumCircuit\n",
+    "from qiskit.visualization import plot_histogram\n",
+    "from qiskit_aer import AerSimulator\n",
+    "\n",
+    "qc.measure_all()\n",
+    "simulator = AerSimulator()\n",
+    "result = simulator.run(qc).result()\n",
+    "counts = result.get_counts(qc)\n",
+    "\n",
+    "counts_readable = q_algo.decode_counts(counts)\n",
+    "print(counts_readable)\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Plotting the histogram from results `counts_readable`"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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AABQhar16uObb75ZGzdurM6vAAAAQBWo1ig8dOgQF5kAAAB4gUqfU1gah8OhEydOKCEhQZ9//rn69+9f1V8BAACAKlbpKHQ9+7g0TqdTjRo10muvvVbZrwAAAEANqXQU9unTp8QoNJvNatSokbp3767x48eradOm17RAAAAAVL9KR2FycnIVLgMAAACexLOPAQAAUDUXmmzdulW7d+9Wdna2AgMDFR0drd69e1fFRwMAAKAGXFMUfvfddxo/frzS0tIkXbq4xHWeYWRkpOLj49WzZ89rXyUAAACqVaWjcP/+/YqLi9OFCxc0cOBAxcbGqkWLFsrMzNSmTZuUlJSkQYMGafv27erQoUNVrhkAAABVrNJR+MILL6igoEDr1q3T4MGD3bbNmDFDX3/9tYYMGaIXXnhBH3zwwTUvFAAAANWn0heaJCcna/jw4cWC0GXw4MEaPny4Nm3aVOnFAQAAoGZUOgptNpsiIiLKnBMRESGbzVbZrwAAAEANqXQUhoaGavv27WXO2bFjh0JDQyv7FQAAAKghlY7CIUOGKDk5WTNnztTFixfdtl28eFGzZ8/Wpk2bdM8991zzIgEAAFC9TE6n01mZN545c0a33HKLjhw5ouDgYPXo0UPNmjXTqVOn9P333+v06dNq06aNUlJS1Lhx46pet9fKzs5WUFCQbDabAgMDq+17JrxRbR8NAACq0NJp1fv55W2PSu8pDA4O1vbt2zV27Fjl5uZq3bp1io+P17p165STk6Px48dr+/btNRKErVu3lslkKvFP3759i83Pz8/XCy+8oMjISNWvX1+hoaGaOHGi/v3vf5f6HatWrVKPHj3k7++vRo0a6e6779auXbuq8VcBAADUnGu6eXVISIjeeecdLVmyRD///LPxRJOoqCj5+PhU1RrLJSgoSNOmTSs23rp1a7fXDodD99xzjxITE3Xrrbdq2LBhSk1N1bJly7RhwwZt375dTZo0cXvPSy+9pOeee07h4eH605/+pJycHH3wwQfq1auXNmzYwNNbAACA16vw4eOXXnpJeXl5mjNnTqnhV1BQoDlz5iggIED/8R//USULLYsr/I4ePXrVufHx8XrooYc0evRorVq1yngCy1tvvaXJkydr4sSJWrJkiTE/NTVVHTp0MA6FBwUFSZJ2796tW2+9VW3atNFPP/0ks7l8O105fAwAAC7nlYeP169fr1mzZik4OLjMPYH16tVTcHCwnn322Vp3n8KlS5dKkubNm2cEoSRNmjRJbdq00apVq/Trr78a4/Hx8SosLNSzzz5rBKEkRUdHa/To0frXv/6lb7/9tuZ+AAAAQDWoUBS+++67atSokaZOnXrVuX/+85/VuHFjxcfHV3pxFZGfn6+EhAS9/PLLWrx4sXbs2FFszsWLF7Vjxw61a9dO4eHhbttMJpMGDhyovLw8/fDDD8Z4cnKyJCkuLq7Y5w0aNEiStHnz5jLXlZ2d7fZHkux2u/GnqKhIklRUVFTieGFhodu4w+Eoc9xut5fr7wwAAHiew+Fw+//zwsLCMsdL64WyOqI8KnRO4XfffacBAwbI19f3qnN9fX01YMAAbd26tSJfUWmZmZkaP36821j37t31/vvvq23btpKkQ4cOyeFwKDIyssTPcI2npqbq9ttvN/65QYMGat68eZnzSzNv3jzNmTOn2HhSUpKuu+46SVKrVq3UpUsX7d27V8ePHzfmtGvXTlFRUUpJSdHp06eN8ejoaIWHh2vLli3Kyckxxnv27KmmTZsqKSlJ0l2lrgkAANQeWVlZ2rZtm/E6ICBA/fr1U3p6unbv3m2MN2nSRL169VJqaqoOHDhgjF+tI3bu3FmudVQoCk+ePKk2bdqUe35ERIQ+//zzinxFpYwfP1633367OnbsqAYNGujgwYP629/+phUrVqh///7at2+fAgICjKerXH4Y+HKu4+yXP4XFZrOpadOm5Z5/pWeeeUbTp083XmdnZyssLExxcXHG+13nI3bu3FkdO3Y05rrGe/TooctP/bRYLJKkPn36lDgeFxenNaV3KgAAqEVCQkJ05513Gq9dp7eFhYW5PQTENR4ZGWns8JKu3hHdunUr1zoqFIVms7lChybtdnu5L8C4FrNnz3Z7HR0drXfffVeStGLFCi1dutQtzGqSr69viXtWfXx8ip2XabFYjLC7nNVa8r+m0sZr+spvAABQeWazucReKm28tF6oaEcU+75yzfo/oaGh+umnn8o9/6efftLvfve7inxFlZo0aZIkGYewXXsIS9uz5zrf7/I9ia6rdco7HwAAwBtVKApvv/12bdy4sVy3fjl69Kg2btyoPn36VHZt1ywkJESSlJeXJ0lq06aNzGZzqecAusYvP+cwMjJSubm5yszMLNd8AAAAb1ShKPzzn/8su92u4cOHKysrq9R5Z86c0YgRI1RYWKjJkydf8yIry3UFsus+hn5+furRo4cOHDigY8eOuc11Op365z//KX9/f918883GeExMjCT938Ub7hITE93mAAAAeKsKRWHXrl01bdo07dq1Sx06dNCsWbO0adMmpaamKjU1VcnJyZo5c6Y6dOignTt36i9/+Yu6du1aXWuXJP3888+6cOFCieMzZsyQJN13333G+MSJEyVdugDk8os0lixZosOHD+v++++Xn5+fMT5+/HhZrVa99NJLboeRd+/erffff1/t27fXbbfdVuW/CwAAoCZV+IkmTqdTzz77rBYsWGDcF+/K7RaLRU8//bRefPFFtxtEV4fnn39ef/vb39SnTx+Fh4fL399fBw8e1Lp162S32/XMM8/o5ZdfNuY7HA7deeedxmPuYmJilJaWpk8//VStW7fWjh07ynzM3bBhw4zH3BUUFFT4MXc80QQAAFyutjzRpMJR6HLo0CHFx8fru+++M863a968uXr37q1x48a5XSpdnTZv3qz/+q//0o8//qhTp07pwoULCgkJ0S233KIpU6aUeNPp/Px8vfLKK1qxYoXS09PVuHFj3X333XrxxRfVrFmzEr9n1apVeuONN7R//37Vq1dPvXv31ty5cyu8J5QoBAAAl/P6KETlEIUAAOBytSUKq/8mggAAAKj1iEIAAAAQhQAAACAKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAIKIQAAAAIgoBAAAgohAAAAAiCgEAACCiEAAAACIKAQAAoDoQ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",
+      "text/plain": [
+       "<Figure size 700x500 with 1 Axes>"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "plot_histogram(counts_readable)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.12.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/qlasskit/algorithms/__init__.py b/qlasskit/algorithms/__init__.py
index ab18c814..6df7ba1e 100644
--- a/qlasskit/algorithms/__init__.py
+++ b/qlasskit/algorithms/__init__.py
@@ -21,3 +21,4 @@
 from .grover import Grover  # noqa: F401, E402
 from .simon import Simon  # noqa: F401, E402
 from .deutschjozsa import DeutschJozsa  # noqa: F401, E402
+from .bernsteinvazirani import BernsteinVazirani
diff --git a/qlasskit/algorithms/bernsteinvazirani.py b/qlasskit/algorithms/bernsteinvazirani.py
new file mode 100644
index 00000000..51b3c436
--- /dev/null
+++ b/qlasskit/algorithms/bernsteinvazirani.py
@@ -0,0 +1,73 @@
+# Copyright 2023-2024 Davide Gessa
+
+# 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 typing import List, Tuple, Union
+
+from ..qcircuit import QCircuit
+from ..qlassfun import QlassF
+from ..types import Qtype, interpret_as_qtype, format_outcome
+from .qalgorithm import QAlgorithm
+
+
+class BernsteinVazirani(QAlgorithm):
+    def __init__(
+        self,
+        f: QlassF,
+    ):
+        """
+        Args:
+            f (QlassF): our f(x) -> bool
+        """
+        if len(f.args) != 1:
+            raise Exception("f should receive exactly one parameter")
+        if f.returns.ttype != bool:
+            raise Exception("f should returns bool")
+
+        self.f: QlassF = f
+        self.search_space_size = len(f.args[0])
+        self._qcircuit = QCircuit(self.f.num_qubits, name=f"deutsch_{f.name}")
+
+        self._f_circuit = self.f.circuit()
+
+        # State preparation
+        self._qcircuit.barrier(label="s")
+        for i in range(self.search_space_size):
+            self._qcircuit.h(i)
+        self._qcircuit.h(self._f_circuit["_ret"])
+        self._qcircuit.z(self._f_circuit["_ret"])
+
+        # Prepare and add the f
+        self._qcircuit.barrier(label="f")
+        self._qcircuit += self._f_circuit
+
+        # State preparation out
+        self._qcircuit.barrier(label="s")
+        for i in range(self.search_space_size):
+            self._qcircuit.h(i)
+
+    # @override
+    @property
+    def output_qubits(self) -> List[int]:
+        """Returns the list of output qubits"""
+        len_a = len(self.f.args[0])
+        return list(range(len_a))
+        
+
+
+    # @override
+    def decode_output(
+        self, istr: Union[str, int, List, dict]
+    ) -> Union[Tuple[str, int], Qtype, str]: 
+        format_outcome(istr, len(self.f.args[0]) - 1)
+        return istr[-len(self.f.args[0]):][::-1]


Test patch:
diff --git a/test/algo/test_bernstein_vazirani.py b/test/algo/test_bernstein_vazirani.py
new file mode 100644
index 00000000..cc9033a4
--- /dev/null
+++ b/test/algo/test_bernstein_vazirani.py
@@ -0,0 +1,69 @@
+# Copyright 2023-2024 Davide Gessa
+
+# 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.
+
+import unittest
+
+from parameterized import parameterized_class
+
+from qlasskit import qlassf
+from qlasskit.algorithms import BernsteinVazirani
+
+from ..utils import ENABLED_COMPILERS, qiskit_measure_and_count
+
+
+@parameterized_class(("compiler"), ENABLED_COMPILERS)
+class TestAlgoBernsteinVazirani(unittest.TestCase):
+    
+
+    def test_1_bernstein_vazirani(self):
+        f = """
+def oracle(x: Qint[4]) -> bool:
+        s=Qint4(14)
+        return ((x[0]&s[0])^(x[1]&s[1])^(x[2]&s[2])^(x[3]&s[3]))
+"""
+        qf = qlassf(f, compiler=self.compiler)
+        algo = BernsteinVazirani(qf)
+
+        qc_algo = algo.circuit().export("circuit", "qiskit")
+        counts = qiskit_measure_and_count(qc_algo, shots=1024)
+        counts_readable = algo.decode_counts(counts)
+        self.assertEqual(counts_readable["0111"],1024)
+
+    def test_2_bernstein_vazirani(self):
+        f = """
+def oracle(x: Qint[4]) -> bool:
+        s=Qint4(12)
+        return ((x[0]&s[0])^(x[1]&s[1])^(x[2]&s[2])^(x[3]&s[3]))
+"""
+        qf = qlassf(f, compiler=self.compiler)
+        algo = BernsteinVazirani(qf)
+
+        qc_algo = algo.circuit().export("circuit", "qiskit")
+        counts = qiskit_measure_and_count(qc_algo, shots=1024)
+        counts_readable = algo.decode_counts(counts)
+        self.assertEqual(counts_readable["0011"],1024)
+
+    def test_3_bernstein_vazirani(self):
+        f = """
+def oracle(x: Qint[4]) -> bool:
+        s=Qint4(15)
+        return ((x[0]&s[0])^(x[1]&s[1])^(x[2]&s[2])^(x[3]&s[3]))
+"""
+        qf = qlassf(f, compiler=self.compiler)
+        algo = BernsteinVazirani(qf)
+
+        qc_algo = algo.circuit().export("circuit", "qiskit")
+        counts = qiskit_measure_and_count(qc_algo, shots=1024)
+        counts_readable = algo.decode_counts(counts)
+        self.assertEqual(counts_readable["1111"],1024)