{ "cells": [ { "cell_type": "markdown", "id": "29990c15", "metadata": {}, "source": [ "# Getting started with Perceval" ] }, { "cell_type": "markdown", "id": "c1e5e2ac", "metadata": {}, "source": [ "In this notebook, we aim to reproduce the $\\mathsf{CNOT}$ Gate to \n", "evaluate its performance while demonstrating key features of Perceval. We use as basis the implementation from [1]." ] }, { "cell_type": "code", "execution_count": 1, "id": "bb751c13", "metadata": { "scrolled": true }, "outputs": [], "source": [ "import perceval as pcvl\n", "import sympy as sp\n", "import numpy as np" ] }, { "cell_type": "markdown", "id": "cb91de5c", "metadata": {}, "source": [ "### Ralph CNOT Gate" ] }, { "cell_type": "markdown", "id": "d1d6cd32", "metadata": {}, "source": [ "We start by describing the circuit as defined by the paper above- it is a circuit on six modes (labelled from 0 to 5 from top to bottom) consisting of five beam splitters. Modes 1 and 2 contain the control system while modes 3 and 4 encode the target system. Modes 0 and 5 are unoccupied ancillary modes." ] }, { "cell_type": "code", "execution_count": 2, "id": "83ff4732", "metadata": {}, "outputs": [ { "data": { "text/plain": "", "image/svg+xml": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nΦ_tl=3*pi/2Φ_bl=piΦ_tr=pi/2\nΘ=1.910633\n\n\nH\n\n\n\n\n\n\n\n\n\nH\n\n\n\n\n\n\nΦ_tl=3*pi/2Φ_bl=piΦ_tr=pi/2\nΘ=1.910633\n\n\nH\n\n\n\n\n\n\n\nΘ=1.910633\n\n\nH\n\n\n\n\n\n\n\n\n\nH\n\n\n\n\n\n\n\n\n\n\n0\n1\n2\n3\n4\n5\n0\n1\n2\n3\n4\n5\n" }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cnot = pcvl.Circuit(6, name=\"Ralph CNOT\")\n", "cnot.add((0, 1), pcvl.BS.H(pcvl.BS.r_to_theta(1/3), phi_tl = -np.pi/2, phi_bl = np.pi, phi_tr = np.pi / 2))\n", "cnot.add((3, 4), pcvl.BS.H())\n", "cnot.add((2, 3), pcvl.BS.H(pcvl.BS.r_to_theta(1/3), phi_tl = -np.pi/2, phi_bl = np.pi, phi_tr = np.pi / 2))\n", "cnot.add((4, 5), pcvl.BS.H(pcvl.BS.r_to_theta(1/3)))\n", "cnot.add((3, 4), pcvl.BS.H())\n", "pcvl.pdisplay(cnot)" ] }, { "cell_type": "markdown", "id": "ed7b0498", "metadata": {}, "source": [ "We can then simulate this circuit using the `Naive` backend on four different input states corresponding to the two-qubit computational basis states. We use `Analyzer` to analyse the performance of the gate. Using heralds, we can get a better visualisation of what the circuit actually does." ] }, { "cell_type": "code", "execution_count": 3, "id": "edafa605", "metadata": {}, "outputs": [ { "data": { "text/plain": "", "image/svg+xml": "\n\n\n\n\n\n\n\n\nRALPH CNOT\n\n\n\n\n\nΦ_tl=3*pi/2Φ_bl=piΦ_tr=pi/2\nΘ=1.910633\n\n\nH\n\n\n\n\n\n\n\n\n\nH\n\n\n\n\n\n\nΦ_tl=3*pi/2Φ_bl=piΦ_tr=pi/2\nΘ=1.910633\n\n\nH\n\n\n\n\n\n\nΘ=1.910633\n\n\nH\n\n\n\n\n\n\n\n\n\nH\n\n\n\n\n\n\n\n[herald0]\n0\n\n[herald1]\n0\n\n[herald0]\n0\n\n[herald1]\n0\n" }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = pcvl.Processor(\"Naive\", cnot)\n", "p.set_postprocess(lambda s: (s[1] or s[2]) and (s[3] or s[4]))\n", "p.add_herald(0, 0)\n", "p.add_herald(5, 0)\n", "\n", "pcvl.pdisplay(p, recursive = True)" ] }, { "cell_type": "code", "execution_count": 4, "id": "87a00b53", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "in Analyzer : probs.execute_sync() 0.0019991397857666016\n", "in Analyzer : probs.execute_sync() 0.0009999275207519531\n", "in Analyzer : probs.execute_sync() 0.0010013580322265625\n", "in Analyzer : probs.execute_sync() 0.002000570297241211\n" ] }, { "data": { "text/plain": "", "text/html": "\n\n\n\n\n\n\n\n\n\n
00 01 10 11
00 1 0 0 0
01 0 1 0 0
10 0 0 0 1
11 0 0 1 0
" }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "performance=1/9, fidelity=100.000%\n" ] } ], "source": [ "states = {\n", " pcvl.BasicState([1, 0, 1, 0]): \"00\",\n", " pcvl.BasicState([1, 0, 0, 1]): \"01\",\n", " pcvl.BasicState([0, 1, 1, 0]): \"10\",\n", " pcvl.BasicState([0, 1, 0, 1]): \"11\"\n", "}\n", "\n", "ca = pcvl.algorithm.Analyzer(p, states)\n", "ca.compute(expected={\"00\": \"00\", \"01\": \"01\", \"10\": \"11\", \"11\": \"10\"})\n", "pcvl.pdisplay(ca)\n", "print(\"performance=%s, fidelity=%.3f%%\" % (pcvl.simple_float(ca.performance)[1], ca.fidelity * 100))" ] }, { "cell_type": "markdown", "id": "0cd5fcf4", "metadata": {}, "source": [ "Beyond the actual logic function, what is interesting with this gate us that it produces entangled states that we will be trying to check with CHSH experiment when the source is not perfect." ] }, { "cell_type": "markdown", "id": "c0fb4c12", "metadata": {}, "source": [ "### Checking for entanglement with CHSH experiment\n", "![https://en.wikipedia.org/wiki/File:Two_channel_bell_test.svg](https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/Two_channel_bell_test.svg/1340px-Two_channel_bell_test.svg.png)\n", "*https://en.wikipedia.org/wiki/File:Two_channel_bell_test.svg*" ] }, { "cell_type": "markdown", "id": "4e523cfc", "metadata": {}, "source": [ "To reproduce this Bell test protocol, we define a new circuit which uses the $\\mathsf{CNOT}$ gate implemented above as a sub-circuit. The parameters $a$ and $b$ describe the measurement bases used by players $A$ and $B$ in the runs of the Bell-test. We define a photon source with a brightness of 40% and a purity of 99% that will be used by the `Processor`." ] }, { "cell_type": "code", "execution_count": 5, "id": "6b889867", "metadata": {}, "outputs": [ { "data": { "text/plain": "", "image/svg+xml": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nH\n\n\n\n\n\n\n\n\n\n\n\nRALPH CNOT\n\n\n\n\n\nΦ_tl=3*pi/2Φ_bl=piΦ_tr=pi/2\nΘ=1.910633\n\n\nH\n\n\n\n\n\n\n\n\n\nH\n\n\n\n\n\n\nΦ_tl=3*pi/2Φ_bl=piΦ_tr=pi/2\nΘ=1.910633\n\n\nH\n\n\n\n\n\n\nΘ=1.910633\n\n\nH\n\n\n\n\n\n\n\n\n\nH\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nΘ=a\n\nH\n\n\n\n\n\n\nΘ=b\n\nH\n\n\n\n\n\n[herald0]\n0\n\n[herald1]\n0\n\n[herald0]\n0\n\n[herald1]\n0\n" }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "source = pcvl.Source(emission_probability=0.40, multiphoton_component=0.01)\n", "\n", "QPU = pcvl.Processor(\"Naive\", 4, source)\n", "QPU.add(0, pcvl.BS.H())\n", "\n", "# Remove postprocess function as it would mean nothing to the new QPU\n", "p.clear_postprocess()\n", "\n", "QPU.add(0, p)\n", "\n", "a = pcvl.Parameter(\"a\")\n", "b = pcvl.Parameter(\"b\")\n", "\n", "QPU.add(0, pcvl.BS.H(theta=a))\n", "QPU.add(2, pcvl.BS.H(theta=b))\n", "\n", "pcvl.pdisplay(QPU, recursive = True)" ] }, { "cell_type": "markdown", "id": "1c96eaec", "metadata": {}, "source": [ "We start by setting the values of the two parameters to 0, meaning that the beam splitters after the $\\mathsf{CNOT}$ effectively act as the identity. " ] }, { "cell_type": "code", "execution_count": 6, "id": "1e935739", "metadata": {}, "outputs": [], "source": [ "a.set_value(0)\n", "b.set_value(0)" ] }, { "cell_type": "markdown", "id": "3451e7d1", "metadata": {}, "source": [ "We now state that our photons will be inputted on ports 1 and 2 (using the 0-index convention, and not counting heralded modes)." ] }, { "cell_type": "code", "execution_count": 7, "id": "1b626655", "metadata": {}, "outputs": [], "source": [ "QPU.with_input(pcvl.BasicState([0, 1, 1, 0]))" ] }, { "cell_type": "markdown", "id": "fcdef3f6", "metadata": {}, "source": [ "We now detail the different state vectors that are the probabilistic inputs to the circuit. The most frequent input is the empty state, followed by two states with only a single photon on either of the input ports, then by the expected nominal input $|0,1,1,0,0,0\\rangle$. Here, the heralded modes are shown because if there were a photon on them, they would also have the imperfect source. They are represented at the end of the state (the two last modes) as they have been added after the declaration of the processor." ] }, { "cell_type": "code", "execution_count": 8, "id": "e8af01a9", "metadata": {}, "outputs": [ { "data": { "text/plain": "", "text/html": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
state probability
|0,0,0,0,0,0> 9/25
|0,0,{_:0},0,0,0> 0.2395
|0,{_:0},0,0,0,0> 0.2395
|0,{_:0},{_:0},0,0,0> 0.1594
|0,0,{_:0}{_:1},0,0,0> 4.8193e-4
|0,{_:0}{_:1},0,0,0,0> 4.8193e-4
|0,{_:0}{_:1},{_:0},0,0,0> 3.2064e-4
|0,{_:0},{_:0}{_:1},0,0,0> 3.2064e-4
|0,{_:0}{_:1},{_:0}{_:2},0,0,0>0
" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pcvl.pdisplay(QPU.source_distribution, precision=1e-4)" ] }, { "cell_type": "markdown", "id": "73af9f32", "metadata": {}, "source": [ "We can then check the output state distribution corresponding to this input distribution. By default, since our input state had 2 photons, only states having at least 2 detected photons are kept. This can be changed using `min_detected_photons_filter`." ] }, { "cell_type": "code", "execution_count": 9, "id": "cbee9802", "metadata": {}, "outputs": [ { "data": { "text/plain": "", "text/html": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
state probability
|0,0,2,0> 0.248773
|0,2,0,0> 0.248773
|0,0,1,1> 0.124293
|1,1,0,0> 0.124293
|1,0,1,0> 0.124293
|0,1,0,1> 0.124293
|0,1,1,0> 0.001874
|1,0,0,1> 0.000374751
|0,0,3,0> 0.000249333
|0,1,2,0> 0.000249333
" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "output_distribution=QPU.probs()[\"results\"]\n", "pcvl.pdisplay(output_distribution, max_v=10)" ] }, { "cell_type": "markdown", "id": "3cda6b52", "metadata": {}, "source": [ "Let us run now the experiment with increasing value of g2 in the range $[0, 0.2]$ with a brightness of $0.15$ and check the CHSH inequality." ] }, { "cell_type": "code", "execution_count": 10, "id": "3f29137a", "metadata": {}, "outputs": [ { "data": { "text/plain": " 0%| | 0/40 [00:00", "image/png": "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\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "plt.title(\"CHSH value with purity\")\n", "plt.xlabel(\"g2 (%)\")\n", "plt.ylabel(\"bell inegality\")\n", "plt.axhline(y=2, linewidth=2, color=\"red\", label= 'horizontal-line')\n", "plt.plot(x, y, color =\"green\")\n", "plt.grid(color='b', dashes=(3, 2, 1, 2))\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "1329a625", "metadata": {}, "source": [ "Beyond 13% of g2, we are crossing the value $2$, i.e. not violating anymore the $|CHSH|\\le 2$ inegality!" ] }, { "cell_type": "markdown", "id": "e55db30c", "metadata": {}, "source": [ "## Reference\n", "\n", "> [1] T. C. Ralph, N. K. Langford, T. B. Bell, and A. G. White. Linear optical controlled-NOT gate in the coincidence basis. [Physical Review A](https://link.aps.org/doi/10.1103/PhysRevA.65.062324), 65(6):062324, June 2002. Publisher: American Physical Society." ] } ], "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.9.7" } }, "nbformat": 4, "nbformat_minor": 5 }