{ "cells": [ { "cell_type": "markdown", "source": [ "# Circuits" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "Here we summarise the catalogue circuit components and their underlying physical models." ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "| Name | Method | Circuit Diagram | Modes |\n", "|:------------------------:|:-------------:|:------------------------------------:|------|\n", "| Beam splitter | `bs` | ![](../_static/img/beamsplitter.png) | 2 |\n", "| Phase shifter | `ps` | ![](../_static/img/phaseshifter.png) | 1 |\n", "| Permutation | `perm` | ![](../_static/img/perm.png) | 2+ |\n", "| Switch | `switch` | ![](../_static/img/switch.png) | 2 |\n", "| Loss | `loss` | ![](../_static/img/loss.png) | 1+ |\n", "| Gate | `gate` | ![](../_static/img/gate.png) | 1+ |\n", "| Haar random unitary | `haar_random` | ![](../_static/img/haar.png) | 1+ |\n", "| Custom scattering matrix | `custom` | ![](../_static/img/custom_u.png) | 1+ |" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "The following sections give more detail on each circuit component." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 105, "outputs": [], "source": [ "from zpgenerator import *" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:03.931883Z", "start_time": "2024-03-15T16:29:02.863965Z" } } }, { "cell_type": "markdown", "source": [ "## Beam splitter" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "The beam splitter implements a unitary transformation on two modes that is defined by the matrix\n", "$$\n", "\\hat{U}_\\text{bs} = \\begin{pmatrix}\n", "\\cos(\\theta) & i\\sin(\\theta)\\\\\n", "i\\sin(\\theta) & \\cos(\\theta)\n", "\\end{pmatrix}.\n", "$$\n", "\n", "Other variants of the beam splitter, such as the Hadamard unitary, can be implemented by placing the appropriate phase shifters on the input and output ports. Alternatively, the circuit can be constructed using [Perceval's circuit components](https://perceval.quandela.net/docs/components.html) and then converted to ZPGenerator.\n", "\n", "The parameters of this component are:\n", "\n", "\\begin{tabular}{c|l|l}\n", "\\text{Symbol}&\\text{Description}&\\text{ZPG Parameter}\\\\\\hline\n", "$\\theta & \\text{Beam splitter angle}& \\text{`angle'}\\\\\n", "\\end{tabular}" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "### Examples" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "The beam splitter defaults to $\\theta=\\pi/4$, indicating a 50:50 splitting ratio." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 106, "outputs": [ { "data": { "text/plain": "{'angle': 0.7853981633974483}" }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = Circuit.bs()\n", "c.default_parameters" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.038891Z", "start_time": "2024-03-15T16:29:02.947630Z" } } }, { "cell_type": "markdown", "source": [ "All circuit elements have a time argument, even if they are time independent. They can be evaluated to a matrix in QuTiP Qobj format." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 107, "outputs": [ { "data": { "text/plain": "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = False\nQobj data =\n[[0.70710678+0.j 0. +0.70710678j]\n [0. +0.70710678j 0.70710678+0.j ]]", "text/latex": "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = False $ \\\\ \\left(\\begin{matrix}0.707 & 0.707j\\\\0.707j & 0.707\\\\\\end{matrix}\\right)$" }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c.evaluate(t=0)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.040189Z", "start_time": "2024-03-15T16:29:02.969122Z" } } }, { "cell_type": "markdown", "source": [ "## Phase shifter" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "The phase shifter implements a unitary transformation on one mode that is defined by the matrix\n", "$$\n", "\\hat{U}_\\text{ps} = \\begin{pmatrix}\n", "e^{i\\phi}\n", "\\end{pmatrix}.\n", "$$\n", "\n", "This impact is only seen relative to the phase of light in other modes. The parameters of this component are:\n", "\n", "\\begin{tabular}{c|l|l}\n", "\\text{Symbol}&\\text{Description}&\\text{ZPG Parameter}\\\\\\hline\n", "$\\phi & \\text{Phase shift}& \\text{`phase'}\\\\\n", "\\end{tabular}" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "### Examples" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "By default, the phase is shifted by $\\pi$, which is equivalent to multiplying the amplitude of the light by -1." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 108, "outputs": [ { "data": { "text/plain": "{'phase': 3.141592653589793}" }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = Circuit.ps()\n", "c.default_parameters" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.050911Z", "start_time": "2024-03-15T16:29:03.055295Z" } } }, { "cell_type": "code", "execution_count": 109, "outputs": [ { "data": { "text/plain": "Quantum object: dims = [[1], [1]], shape = (1, 1), type = bra\nQobj data =\n[[-1.]]", "text/latex": "Quantum object: dims = [[1], [1]], shape = (1, 1), type = bra $ \\\\ \\left(\\begin{matrix}-1.0\\\\\\end{matrix}\\right)$" }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c.evaluate(t=0)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.051017Z", "start_time": "2024-03-15T16:29:03.059033Z" } } }, { "cell_type": "markdown", "source": [ "## Permutation" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "The permutation unitary is used to swap modes without having them interact. This is used to organise the locations of the modes so that they can interact properly with other components. The permutation is provided as a list of unique non-negative integers and the order determines the new ordering of the modes. For two modes, the permutation is simply\n", "$$\n", "\\hat{U}_\\text{perm} = \\begin{pmatrix}\n", "0 & 1\\\\\n", "1 & 0\n", "\\end{pmatrix}.\n", "$$" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "### Examples" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "This component has no parameters." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 110, "outputs": [ { "data": { "text/plain": "{}" }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = Circuit.perm()\n", "c.default_parameters" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.051773Z", "start_time": "2024-03-15T16:29:03.137811Z" } } }, { "cell_type": "markdown", "source": [ "By default, it swaps two modes." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 111, "outputs": [ { "data": { "text/plain": "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = True\nQobj data =\n[[0. 1.]\n [1. 0.]]", "text/latex": "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = True $ \\\\ \\left(\\begin{matrix}0.0 & 1.0\\\\1.0 & 0.0\\\\\\end{matrix}\\right)$" }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c.evaluate(0)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.052485Z", "start_time": "2024-03-15T16:29:03.159889Z" } } }, { "cell_type": "markdown", "source": [ "Providing a permutation as a list of integers, we can configure the reordering." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 112, "outputs": [ { "data": { "text/plain": "Quantum object: dims = [[5], [5]], shape = (5, 5), type = oper, isherm = False\nQobj data =\n[[0. 1. 0. 0. 0.]\n [1. 0. 0. 0. 0.]\n [0. 0. 0. 0. 1.]\n [0. 0. 1. 0. 0.]\n [0. 0. 0. 1. 0.]]", "text/latex": "Quantum object: dims = [[5], [5]], shape = (5, 5), type = oper, isherm = False $ \\\\ \\left(\\begin{matrix}0.0 & 1.0 & 0.0 & 0.0 & 0.0\\\\1.0 & 0.0 & 0.0 & 0.0 & 0.0\\\\0.0 & 0.0 & 0.0 & 0.0 & 1.0\\\\0.0 & 0.0 & 1.0 & 0.0 & 0.0\\\\0.0 & 0.0 & 0.0 & 1.0 & 0.0\\\\\\end{matrix}\\right)$" }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = Circuit.perm([1, 0, 4, 2, 3])\n", "c.evaluate(0)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.053216Z", "start_time": "2024-03-15T16:29:03.185229Z" } } }, { "cell_type": "markdown", "source": [ "## Switch" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "The switch is a time-dynamic component used to actively change the spatial mode of light during its evolution. It is a Mach-Zehnder interferometer composed of beam splitters and a phase shifter. The only difference is that the phase of the phase shifter is controlled in time. The parameters of this component are all user-defined." ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "### Examples" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "The switch can be instantiated with a function that determines the state of the switch over time. A value of 0 indicates the switch is fully off and all the light is transmitted in the same mode it enters, a value of 1 indicates the switch is fully on and the modes are swapped (with an appropriate phase factor). In addition to the function, it is necessary to supply an interval over which the function is applied to the switch and any default parameters needed to evaluate the function." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 113, "outputs": [ { "data": { "text/plain": "{'start': 0, 'end': 1}" }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = Circuit.switch(function=lambda t, args: (t - args['start'])/args['end'],\n", " interval=['start', 'end'],\n", " parameters={'start': 0, 'end': 1})\n", "c.default_parameters" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.054488Z", "start_time": "2024-03-15T16:29:03.266932Z" } } }, { "cell_type": "markdown", "source": [ "By evaluating the circuit we can see that the unitary changes over time." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 114, "outputs": [ { "data": { "text/plain": "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = True\nQobj data =\n[[1. 0.]\n [0. 1.]]", "text/latex": "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = True $ \\\\ \\left(\\begin{matrix}1.0 & 0.0\\\\0.0 & 1.0\\\\\\end{matrix}\\right)$" }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c.evaluate(t=0)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.055956Z", "start_time": "2024-03-15T16:29:03.289057Z" } } }, { "cell_type": "code", "execution_count": 115, "outputs": [ { "data": { "text/plain": "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = True\nQobj data =\n[[ 0. -1.]\n [-1. 0.]]", "text/latex": "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = True $ \\\\ \\left(\\begin{matrix}0.0 & -1.0\\\\-1.0 & 0.0\\\\\\end{matrix}\\right)$" }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c.evaluate(t=1)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.060049Z", "start_time": "2024-03-15T16:29:03.292983Z" } } }, { "cell_type": "markdown", "source": [ "Do demonstrate its impact, we can split a photon into two spatial modes and compare the intensity of the light as a function of time before and after the switch." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 116, "outputs": [ { "data": { "text/plain": "
", "image/png": "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bDqYxaTf9jLsymYuu7aIiEh1cXrMzbBhw+jXrx/Hjx/H39+f33//nX379tGpUyfefPPNqsgoFYk+2W3kgungpUwmE/93aWMAPvttLzmF57+ekYiISHVzurhZt24djz/+OGazGYvFQmFhIQkJCbz++us8/fTTVZFRKhJ9cq2bI9uhpOjM5zrhqtaxNIwMJDO/mK9WaENNERGpeZwubry9vcsG+UZFRZGS4vgFGBoa6hkL5NUUoQngGwK2Eji602WXtZhNDD7ZevPx0j0UFDs3A05ERMRoThc3HTp04I8//gAce06NGjWKL7/8kqFDh9K6tWbYVBuTyaUrFf/V9R3qERvqR3p2IVPXHHDptUVERKqa08XNK6+8QmxsLAAvv/wyderUYfDgwWRkZPDRRx+5PKCcQWnXVNoml17Wx8vMg5c41r0Zv3g3JVabS68vIiJSlZyeLdW5c+ey11FRUcyePdulgcQJZSsVu7blBuD2LvV575dd7D+Wz08bDnN9h3ouv4eIiEhVcLrlRtxIlGv3mPorfx8L913UEIAPFu3CZnN6OSQRERFDVKq46du3L7///vtZz8vOzua1117j/fffP+9gUglRLRzPWQch/7jLL3/3hQ0I9vViR1oO87emnf0DIiIibqBS3VK33HILN910E6GhofTr14/OnTsTFxeHn58fx48fZ8uWLfz666/MmjWLa665hjfeeKOqcwuAf5hj1lTmfkjfCg26u/Tyof7e9E9qwAeLdvP+wl1c2TIa03lu0ikiIlLVKlXc3Hfffdx999189913fPPNN3z00UdkZmYCjoXfWrZsSZ8+ffjjjz9o0aJFlQaWv4lq6Shu0ja7vLgBuPeihkxctpf1BzJZtCODy5pHufweIiIirlTpAcW+vr7cfffd3H333QBkZmaSn59PREQE3t7eVRZQziK6FeycUyXjbgAig3zpn9SAj5bsYcy8HfRsVletNyIi4tbOeUBxaGgoMTExKmyMFl11g4pLPXhJI/y9LY7Wm+0ZVXYfERERV9BsqZqudCG/9K3g/AbvlRIZ5MuApAYAjJm/g3PYSF5ERKTaqLip6SKbgtkbirLhRNXtBfWAWm9ERKSGUHFT01m8oW5zx+sq7JpS642IiNQUKm48QdlKxVVX3ED51puF29Or9F4iIiLnyuniZuDAgSxZsqQqssi5KttAs2qLm/Kt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7/Lhhx8anMxzrF69mvT0dDp27Fh2zGq1smTJEsaOHUthYSEWi8XAhJ4pLCyMZs2asWvXLkPurzE358nHx4dOnTqxYMGCsmM2m40FCxao71xqJLvdziOPPMK0adP45ZdfaNiwodGRag2bzUZhYaHRMTzKFVdcwcaNG1m3bl3Zo3Pnztx1112sW7dOhU0VycnJYffu3cTGxhpyf7XcuMDw4cMZOHAgnTt3pmvXrowZM4bc3FwGDRpkdDSPkpOTU+5fAcnJyaxbt47w8HDq169vYDLP8vDDDzN58mRmzJhBcHAwqampAISGhuLv729wOs8xcuRIrrrqKurXr092djaTJ09m0aJFzJkzx+hoHiU4OPiU8WKBgYFERERoHJkLPfHEE/Tr148GDRpw6NAhnnvuOSwWC3fccYcheVTcuMBtt91GRkYGo0aNIjU1lfbt2zN79uxTBhnL+Vm1ahWXXXZZ2Z+HDx8OwMCBA/nss88MSuV5xo0bB0DPnj3LHZ84cSL33HNP9QfyUOnp6QwYMIDDhw8TGhpK27ZtmTNnDldeeaXR0UScduDAAe644w6OHj1K3bp1ueiii/j999+pW7euIXm0zo2IiIh4FI25EREREY+i4kZEREQ8ioobERER8SgqbkRERMSjqLgRERERj6LiRkRERDyKihsRERHxKCpuRERExKOouBERERGPouJGRKpEz549GTp0qNExnHb06FGioqLYu3fveV/r9ttv56233jr/UCLiFG2/ICJOM5lMZ3z/ueee49FHH8Xb25vg4OBqSnV6PXv2pH379owZM+as5w4fPpzs7Gw+/vhj5syZQ9++fc94/pw5c+jdu3eF723atIlLLrmE5ORkQkNDzyW6iJwDbZwpIk47fPhw2etvvvmGUaNGsX379rJjQUFBBAUFGRHtvOTl5TFhwoSynbkvueSSct+1devWPPTQQzz00ENlx860MWDr1q1p3LgxX3zxBQ8//HDVBReRctQtJSJOi4mJKXuEhoZiMpnKHQsKCjqlW6pnz54MGTKEoUOHUqdOHaKjo/n444/Jzc1l0KBBBAcH06RJE37++eeyz9hsNkaPHk3Dhg3x9/enXbt2TJkyxams99xzD4sXL+bdd9/FZDJhMplO2+U0a9YsfH19ufDCCwHw9/cv+05Wq5WjR49y8cUXl/uuFovljPfv168fX3/9tVOZReT8qLgRkWozadIkIiMjWblyJUOGDGHw4MHccsstdO/enTVr1tC7d2/69+9PXl4eAKNHj+bzzz9n/PjxbN68mWHDhnH33XezePHiSt/z3XffJSkpiQceeIDDhw9z+PBhEhISKjx36dKldOrUqcL31q5dC0DHjh2d+s5du3Zl5cqVFBYWOvU5ETl3Km5EpNq0a9eOZ555hqZNmzJy5Ej8/PyIjIzkgQceoGnTpowaNYqjR4+yYcMGCgsLeeWVV/j000/p06cPjRo14p577uHuu+/mww8/rPQ9Q0ND8fHxISAg4KytLfv27SMuLq7C99asWUNCQgIRERHljt9www3UqVOHm2++ucLPxcXFUVRURGpqaqUzi8j50ZgbEak2bdu2LXttsViIiIigTZs2Zceio6MBSE9PZ9euXeTl5XHllVeWu0ZRUREdOnSoknz5+fn4+flV+N6aNWsqbLV57LHHuPfee5k0aVKFn/P39wcoa40Skaqn4kZEqo23t3e5P5tMpnLHSmdh2Ww2cnJyAJg5cyb16tUr9zlfX98qyRcZGcnx48crfG/NmjXcf//9pxzv2bMnixYtOu01jx07Bpx54LGIuJaKGxFxSy1btsTX15eUlBQuvfTS87qWj48PVqv1rOd16NCBL7744pTjR44cYf/+/U6PtwHHdPD4+HgiIyOd/qyInBsVNyLiloKDg3niiScYNmwYNpuNiy66iMzMTJYtW0ZISAgDBw6s9LUSExNZsWIFe/fuJSgoiPDwcMzmU4cc9unTh5EjR3L8+HHq1KlTdnzNmjWA84OJwTFI+XTr4IhI1dCAYhFxW//5z3949tlnGT16NC1atKBv377MnDmThg0blp3z2WefnXVRwSeeeAKLxULLli2pW7cuKSkpFZ7Xpk0bOnbsyLffflvu+Nq1a4mOjj7tYOPTKSgoYPr06TzwwANOfU5Ezo9WKBaRGu25555j8eLFZxz34oyZM2fy5JNPsmnTpgpbdyqyaNEixo4de8oaPOPGjWPatGnMnTvXJdlEpHLULSUiNdrPP//M2LFjXXa9a665hp07d3Lw4MHTrofzV7169WL9+vXk5uYSHx/Pd999R1JSEuAYQP3ee++5LJuIVI5abkRERMSjaMyNiIiIeBQVNyIiIuJRVNyIiIiIR1FxIyIiIh5FxY2IiIh4FBU3IiIi4lFU3IiIiIhHUXEjIiIiHkXFjYiIiHgUFTciIiLiUVTciIiIiEdRcSMiIiIe5f8B54rm7ivZyMIAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "source = Source.fock(1)\n", "p = Processor() // source // c\n", "source.plot_lifetime(start=0, end=5, label='source')\n", "p.plot_lifetime(port=0, start=0, end=5, label='mode 0')\n", "p.plot_lifetime(port=1, start=0, end=5, label='mode 1').show()" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.063544Z", "start_time": "2024-03-15T16:29:03.313674Z" } } }, { "cell_type": "markdown", "source": [ "## Loss" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "The loss component implements a non-unitary transformation on one mode that is defined by the matrix\n", "$$\n", "\\hat{S}_\\text{loss} = \\begin{pmatrix}\n", "\\sqrt{\\eta}\n", "\\end{pmatrix}.\n", "$$\n", "This is equivalent to a beam splitter (or linear) loss model where the amplitude of light dampened linearly. That is, a value of $\\eta=1/2$ will halve the average photon number of the light.\n", "\n", "\\begin{tabular}{c|l|l}\n", "\\text{Symbol}&\\text{Description}&\\text{ZPG Parameter}\\\\\\hline\n", "$\\eta & \\text{The transmission efficiency}& \\text{`efficiency'}\\\\\n", "\\end{tabular}" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "### Examples" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "By default, the loss component does nothing." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 117, "outputs": [ { "data": { "text/plain": "{'efficiency': 1}" }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = Circuit.loss()\n", "c.default_parameters" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.063658Z", "start_time": "2024-03-15T16:29:03.525859Z" } } }, { "cell_type": "markdown", "source": [ "By evaluating it, we can verify the underlying model." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 118, "outputs": [ { "data": { "text/plain": "Quantum object: dims = [[1], [1]], shape = (1, 1), type = bra\nQobj data =\n[[0.70710678]]", "text/latex": "Quantum object: dims = [[1], [1]], shape = (1, 1), type = bra $ \\\\ \\left(\\begin{matrix}0.707\\\\\\end{matrix}\\right)$" }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c.evaluate(t=0, parameters={'efficiency': 0.5})" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.063730Z", "start_time": "2024-03-15T16:29:03.530516Z" } } }, { "cell_type": "markdown", "source": [ "Using the 'modes' keyword, we can apply the same loss value to multiple modes simultaneously. We may also specify the default efficiency value when instantiating the object. This can be done through the 'efficiency' keyword or by passing a dictionary using the 'parameters' keyword." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 119, "outputs": [ { "data": { "text/plain": "Quantum object: dims = [[5], [5]], shape = (5, 5), type = oper, isherm = True\nQobj data =\n[[0.70710678 0. 0. 0. 0. ]\n [0. 0.70710678 0. 0. 0. ]\n [0. 0. 0.70710678 0. 0. ]\n [0. 0. 0. 0.70710678 0. ]\n [0. 0. 0. 0. 0.70710678]]", "text/latex": "Quantum object: dims = [[5], [5]], shape = (5, 5), type = oper, isherm = True $ \\\\ \\left(\\begin{matrix}0.707 & 0.0 & 0.0 & 0.0 & 0.0\\\\0.0 & 0.707 & 0.0 & 0.0 & 0.0\\\\0.0 & 0.0 & 0.707 & 0.0 & 0.0\\\\0.0 & 0.0 & 0.0 & 0.707 & 0.0\\\\0.0 & 0.0 & 0.0 & 0.0 & 0.707\\\\\\end{matrix}\\right)$" }, "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = Circuit.loss(efficiency=0.5, modes=5)\n", "c.evaluate(t=0)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.064521Z", "start_time": "2024-03-15T16:29:03.536813Z" } } }, { "cell_type": "markdown", "source": [ "## Gate" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "The gate component implements a piece-wise time-independent non-unitary transformation on one mode that is defined by the matrix\n", "$$\n", "\\hat{S}_\\text{gate}(t) = \\begin{pmatrix}\n", "\\sqrt{\\eta(t)}\n", "\\end{pmatrix}.\n", "$$\n", "where $\\eta(t)=1$ for $t$ within a specified interval of time and $\\eta(t)=0$ otherwise.\n", "This is equivalent to a switch where mode 1 is ignored and the function is a square pulse Like the switch, all parameters are user-defined." ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "### Examples" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "When instantiating, we can specify parameters directly as strings in the interval list. Similar to the loss component, we can also specify the number of modes that are impacted by the gate." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 120, "outputs": [ { "data": { "text/plain": "{'start': 0, 'end': 1}" }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = Circuit.gate(interval=['start', 'end'],\n", " parameters={'start': 0, 'end': 1},\n", " modes=3)\n", "c.default_parameters" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.064592Z", "start_time": "2024-03-15T16:29:03.542167Z" } } }, { "cell_type": "markdown", "source": [ "The value of the scattering matrix will depend on time." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 121, "outputs": [ { "data": { "text/plain": "Quantum object: dims = [[3], [3]], shape = (3, 3), type = oper, isherm = True\nQobj data =\n[[0. 0. 0.]\n [0. 0. 0.]\n [0. 0. 0.]]", "text/latex": "Quantum object: dims = [[3], [3]], shape = (3, 3), type = oper, isherm = True $ \\\\ \\left(\\begin{matrix}0.0 & 0.0 & 0.0\\\\0.0 & 0.0 & 0.0\\\\0.0 & 0.0 & 0.0\\\\\\end{matrix}\\right)$" }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c.evaluate(t=-1)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.066726Z", "start_time": "2024-03-15T16:29:03.562115Z" } } }, { "cell_type": "code", "execution_count": 122, "outputs": [ { "data": { "text/plain": "Quantum object: dims = [[3], [3]], shape = (3, 3), type = oper, isherm = True\nQobj data =\n[[1. 0. 0.]\n [0. 1. 0.]\n [0. 0. 1.]]", "text/latex": "Quantum object: dims = [[3], [3]], shape = (3, 3), type = oper, isherm = True $ \\\\ \\left(\\begin{matrix}1.0 & 0.0 & 0.0\\\\0.0 & 1.0 & 0.0\\\\0.0 & 0.0 & 1.0\\\\\\end{matrix}\\right)$" }, "execution_count": 122, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c.evaluate(t=0.5)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.066794Z", "start_time": "2024-03-15T16:29:03.568802Z" } } }, { "cell_type": "code", "execution_count": 123, "outputs": [ { "data": { "text/plain": "Quantum object: dims = [[3], [3]], shape = (3, 3), type = oper, isherm = True\nQobj data =\n[[0. 0. 0.]\n [0. 0. 0.]\n [0. 0. 0.]]", "text/latex": "Quantum object: dims = [[3], [3]], shape = (3, 3), type = oper, isherm = True $ \\\\ \\left(\\begin{matrix}0.0 & 0.0 & 0.0\\\\0.0 & 0.0 & 0.0\\\\0.0 & 0.0 & 0.0\\\\\\end{matrix}\\right)$" }, "execution_count": 123, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c.evaluate(t=2)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.066844Z", "start_time": "2024-03-15T16:29:03.573285Z" } } }, { "cell_type": "markdown", "source": [ "We can use this to truncate emission from a source, either to model a realistic protocol or to analyse its behaviour." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 124, "outputs": [ { "data": { "text/plain": "
", "image/png": "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uemmm057zsfHp1K1nQ+FGyfo0yqcict2s2BrOjabDVMlx3xFRFyOyVSpoSEjNWnSBE9PT1atWkXDhg0ByMzMZNu2bVx22WUAbNmyhSNHjvD6668TExMDwOrVq8u9TlmHo6SkxL6tTZs2eHt7s2/fPnun5+9at27NzJkzy237448/zlm3r68v/fv3p3///gwZMoRWrVqxfv16WrduTXFxMStWrLAPSx05coStW7fSpk0bAMLDw0lNTS33Oyo5Ofmc5+zQoQOffvopR48erbB707lzZ7Zu3VpuqMoZNCzlBN0a18XX00J6dgGbUrRKuIhITRYYGMigQYN45plnWLBgARs3buSBBx7AbDbbf/E3bNgQLy8v3n//fXbt2sXMmTN55ZVXyr1Oo0aNMJlM/PTTT2RkZJCTk0NgYCBPP/00Tz75JJMmTWLnzp0kJSXx/vvvM2nSJAD++c9/sn37dp555hm2bt3K5MmT+eKLL85a8xdffMFnn33Ghg0b2LVrF1999RW+vr40atSI5s2bc8MNNzB48GCWLl3KunXruPvuu6lfvz433HADAL179yYjI4M33niDnTt3Mn78eH7++edzflYDBgwgKiqKG2+8kWXLlrFr1y6+++47li9fDsDw4cP58ssvGTlyJBs3bmTz5s1MmTKFF154oar/WarG5mYyMzNtgC0zM9Op533gi1W2Rs/+ZBv323annldExEgnTpywbdq0yXbixAmjS6mSrKws25133mnz8/OzRUVF2d5++21bt27dbM8995x9n8mTJ9tiY2Nt3t7etvj4eNvMmTNtgG3t2rX2fV5++WVbVFSUzWQy2QYNGmSz2Ww2q9VqGzt2rK1ly5Y2T09PW3h4uC0hIcG2aNEi+3E//vijrVmzZjZvb29bz549bRMnTrQBtmPHjlVY7/Tp023du3e3BQUF2fz9/W0XX3yx7ddff7U/f/ToUds999xjCw4Otvn6+toSEhJs27ZtK/caH374oS0mJsbm7+9vGzhwoO3VV1+1NWrUyP78oEGDbDfccMNp596zZ4/t5ptvtgUFBdn8/PxsXbt2ta1YscL+/Jw5c2w9evSw+fr62oKCgmzdunWzffzxxxW+j7P9eanK72+TzeZet87NysoiODiYzMxMgoKCnHbeySv28fz09XRtVIdpD/dw2nlFRIyUn5/P7t27ady4sUPnWDha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k08+ITc3l/vuu4/AwECaNWvGzz//bD/GarUyatQoGjdujK+vLx07dmTatGlVqvXee+9l0aJFvPvuu5hMJkwm0xmHnGbPno23tzcXX3wxAL6+vvb3VFJSwpEjR+jZs2e592qxWM56/v79+zNlypQq1SwiF0bhRkScZtKkSYSFhbFy5Uoee+wxHn74YW699VZ69OhBUlIS/fr145577iEvLw+AUaNG8eWXXzJhwgQ2btzIk08+yd13382iRYsqfc53332X+Ph4Bg8eTEpKCikpKcTExFS475IlS+jSpUuFz61duxaAzp07V+k9d+vWjZUrV1JQUFCl40Tk/CnciIjTdOzYkRdeeIHmzZszbNgwfHx8CAsLY/DgwTRv3pzhw4dz5MgR/vzzTwoKCnjttdeYOHEiCQkJNGnShHvvvZe7776bjz76qNLnDA4OxsvLCz8/v3N2W/bu3Ut0dHSFzyUlJRETE0NoaGi57f/4xz+oU6cOt9xyS4XHRUdHU1hYSGpqaqVrFpELozk3IuI0HTp0sH9vsVgIDQ2lffv29m2RkZEApKens2PHDvLy8rjyyivLvUZhYSGdOnVySH0nTpzAx8enwueSkpIq7No88cQT3H///UyaNKnC43x9fQHs3SgRcTyFGxFxGk9Pz3I/m0ymctvKrsKyWq3k5OQAMGvWLOrXr1/uOG9vb4fUFxYWxrFjxyp8LikpiQcffPC07b1792bhwoVnfM2jR48CZ594LCLVS+FGRGqkNm3a4O3tzb59++jVq9cFvZaXlxclJSXn3K9Tp0589dVXp20/fPgw+/fvr/J8Gyi9HLxBgwaEhYVV+VgROT8KNyJSIwUGBvL000/z5JNPYrVaufTSS8nMzGTZsmUEBQUxaNCgSr9WbGwsK1asYM+ePQQEBFC3bl3M5tOnHCYkJDBs2DCOHTtGnTp17NuTkpKAqk8mhtJJyme6D46IOIYmFItIjfXKK6/w4osvMmrUKFq3bs1VV13FrFmzaNy4sX2fL7744pw3FXz66aexWCy0adOG8PBw9u3bV+F+7du3p3PnznzzzTfltq9du5bIyMgzTjY+k/z8fGbMmMHgwYOrdJyIXBjdoVhEarURI0awaNGis857qYpZs2bxzDPPsGHDhgq7OxVZuHAh48aNO+0ePB9++CHTp0/nl19+qZbaRKRyNCwlIrXazz//zLhx46rt9a699lq2b9/OwYMHz3g/nFP17duXdevWkZubS4MGDfj222+Jj48HSidQv//++9VWm4hUjjo3IiIi4lI050ZERERcisKNiIiIuBSFGxEREXEpCjciIiLiUhRuRERExKUo3IiIiIhLUbgRERERl6JwIyIiIi5F4UZERERcisKNiIiIuBSFGxEREXEpCjciIiLiUv4fMlmXdA6EXE0AAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "source = Source.fock(1)\n", "p = Processor() // source // c\n", "params = {'start': 0.5, 'end': 1.5}\n", "source.plot_lifetime(start=0, end=5, label='source', parameters=params)\n", "p.plot_lifetime(port=0, start=0, end=5, label='gated source', parameters=params).show()" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.069457Z", "start_time": "2024-03-15T16:29:03.590874Z" } } }, { "cell_type": "markdown", "source": [ "## Haar random" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "The Haar random component is simply a Haar random unitary transformation applied to a specified number of modes. The unitary matrix is generated randomly using the QuTiP function ['rand_unitary_haar'](https://qutip.org/docs/latest/apidoc/functions.html?highlight=haar%20random#qutip.random_objects.rand_unitary_haar). The Haar random component has no parameters." ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "### Examples" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "We can specify the number of modes when creating the object." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 125, "outputs": [ { "data": { "text/plain": "{}" }, "execution_count": 125, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = Circuit.haar_random(modes=5)\n", "c.default_parameters" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.069510Z", "start_time": "2024-03-15T16:29:03.706047Z" } } }, { "cell_type": "markdown", "source": [ "The circuit is not time dependent." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 126, "outputs": [ { "data": { "text/plain": "False" }, "execution_count": 126, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c.is_time_dependent()" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.069557Z", "start_time": "2024-03-15T16:29:03.709812Z" } } }, { "cell_type": "code", "execution_count": 127, "outputs": [ { "data": { "text/plain": "Quantum object: dims = [[5], [5]], shape = (5, 5), type = oper, isherm = False\nQobj data =\n[[ 0.47529502-0.20380677j 0.38674966-0.30090415j 0.37131736-0.19676133j\n -0.47613851+0.22163207j -0.19661291+0.03690448j]\n [ 0.0884647 -0.45515758j 0.22202716+0.30753634j -0.11973082+0.44220861j\n 0.01327397-0.01177125j 0.06036048+0.65367334j]\n [-0.16821876-0.5440274j -0.10322852-0.29626751j 0.03072306+0.26088215j\n -0.03894766-0.52366782j -0.35305916-0.32849201j]\n [-0.40286925+0.08416925j 0.60297588-0.01812731j -0.37130169+0.15911587j\n 0.00470222+0.36434267j -0.34976634-0.22003725j]\n [ 0.02535553+0.15254067j 0.02874116-0.39094961j -0.61666663-0.03256566j\n -0.48586694-0.28156226j 0.31558877+0.16168571j]]", "text/latex": "Quantum object: dims = [[5], [5]], shape = (5, 5), type = oper, isherm = False $ \\\\ \\left(\\begin{matrix}(0.475-0.204j) & (0.387-0.301j) & (0.371-0.197j) & (-0.476+0.222j) & (-0.197+0.037j)\\\\(0.088-0.455j) & (0.222+0.308j) & (-0.120+0.442j) & (0.013-0.012j) & (0.060+0.654j)\\\\(-0.168-0.544j) & (-0.103-0.296j) & (0.031+0.261j) & (-0.039-0.524j) & (-0.353-0.328j)\\\\(-0.403+0.084j) & (0.603-0.018j) & (-0.371+0.159j) & (0.005+0.364j) & (-0.350-0.220j)\\\\(0.025+0.153j) & (0.029-0.391j) & (-0.617-0.033j) & (-0.486-0.282j) & (0.316+0.162j)\\\\\\end{matrix}\\right)$" }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c.evaluate(t=0)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.069604Z", "start_time": "2024-03-15T16:29:03.714976Z" } } }, { "cell_type": "markdown", "source": [ "## Custom" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "To make a custom circuit component, one can use the 'custom' method and specify the desired scattering matrix directly. Note that it doesn't need to be a unitary matrix, but to obtain physically-meaningful results, it should at least be a scattering matrix with singular values between 0 and 1. For example, we can create a scattering matrix causing a loss of $0.5^2=0.25$ on the second mode of a two-mode circuit." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 128, "outputs": [ { "data": { "text/plain": "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = True\nQobj data =\n[[1. 0. ]\n [0. 0.5]]", "text/latex": "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = True $ \\\\ \\left(\\begin{matrix}1.0 & 0.0\\\\0.0 & 0.500\\\\\\end{matrix}\\right)$" }, "execution_count": 128, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = Circuit.custom(matrix=[[1.0, 0], [0, 0.5]])\n", "c.evaluate(t=0)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.070308Z", "start_time": "2024-03-15T16:29:03.746822Z" } } }, { "cell_type": "markdown", "source": [ "To ensure physically meaningful results, it is always recommended to build scattering matrices by combining diagonal loss matrices, as shown above, with unitary matrices." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 129, "outputs": [ { "data": { "text/plain": "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = False\nQobj data =\n[[0.70710678+0.j 0. +0.35355339j]\n [0. +0.70710678j 0.35355339+0.j ]]", "text/latex": "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = False $ \\\\ \\left(\\begin{matrix}0.707 & 0.354j\\\\0.707j & 0.354\\\\\\end{matrix}\\right)$" }, "execution_count": 129, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lossy_bs = Circuit.bs() // c\n", "lossy_bs.evaluate(t=0)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.070992Z", "start_time": "2024-03-15T16:29:03.769853Z" } } }, { "cell_type": "markdown", "source": [ "Parameters can be introduced by providing a function that returns a QuTiP Qobj, along with a corresponding dictionary of default parameters." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 130, "outputs": [ { "data": { "text/plain": "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = False\nQobj data =\n[[ 0.35355339 0.35355339]\n [ 0.56568542 -0.56568542]]", "text/latex": "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = False $ \\\\ \\left(\\begin{matrix}0.354 & 0.354\\\\0.566 & -0.566\\\\\\end{matrix}\\right)$" }, "execution_count": 130, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from numpy import sqrt\n", "c = Circuit.custom(matrix=lambda args: Qobj([[args['a'], 0], [0, args['b']]]) * Qobj([[1, 1], [1, -1]]) / sqrt(2),\n", " parameters={'a': 1, 'b': 1})\n", "c.evaluate(t=0, parameters={'a': 0.5, 'b': 0.8})" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.071669Z", "start_time": "2024-03-15T16:29:03.795964Z" } } }, { "cell_type": "markdown", "source": [ "## Conversion from Perceval" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "Perceval provides many tools for building photonic circuits and also has many catalogue circuits built to perform linear-optical gates. These circuits can be converted to ZPGenerator simply through their underlying unitary transformation. This conversion cannot account for any heralding or post-processing steps, nor non-unitary components in Perceval." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 131, "outputs": [], "source": [ "from perceval import BS, catalog" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.075382Z", "start_time": "2024-03-15T16:29:03.839512Z" } } }, { "cell_type": "markdown", "source": [ "### Examples" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "We can easily create a Hadamard variation of the beam splitter using the class method of BS in Perceval." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 132, "outputs": [ { "data": { "text/plain": "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = True\nQobj data =\n[[ 0.70710678 0.70710678]\n [ 0.70710678 -0.70710678]]", "text/latex": "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = True $ \\\\ \\left(\\begin{matrix}0.707 & 0.707\\\\0.707 & -0.707\\\\\\end{matrix}\\right)$" }, "execution_count": 132, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = Circuit.from_perceval(BS.H())\n", "c.evaluate(0)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.076294Z", "start_time": "2024-03-15T16:29:03.887498Z" } } }, { "cell_type": "markdown", "source": [ "We can also import complicated circuits such as a 12-mode post-processed Toffoli (CCZ) circuit." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 133, "outputs": [ { "data": { "text/plain": "Quantum object: dims = [[12], [12]], shape = (12, 12), type = oper, isherm = False\nQobj data =\n[[ 0.50982453+0.j 0. +0.j 0. +0.j\n 0. +0.j 0. +0.j 0. +0.j\n 0. +0.j 0. +0.j 0. +0.j\n 0.86027841+0.j 0. +0.j 0. +0.j ]\n [ 0. +0.j 0.50982453+0.j 0. +0.j\n 0.32116933+0.55628159j 0. +0.j 0. +0.j\n 0.33039371+0.j -0.16519685-0.28612934j -0.16519685+0.28612934j\n 0. +0.j 0. +0.j 0. +0.j ]\n [ 0. +0.j 0. +0.j 0.50982453+0.j\n 0. +0.j 0. +0.j 0. +0.j\n 0. +0.j 0. +0.j 0. +0.j\n 0. +0.j 0.86027841+0.j 0. +0.j ]\n [ 0. +0.j 0. +0.j 0. +0.j\n 0.50982453+0.j 0. +0.j 0.32116933+0.55628159j\n -0.16519685+0.28612934j 0.33039371+0.j -0.16519685-0.28612934j\n 0. +0.j 0. +0.j 0. +0.j ]\n [ 0. +0.j 0. +0.j 0. +0.j\n 0. +0.j 0.50982453+0.j 0. +0.j\n 0. +0.j 0. +0.j 0. +0.j\n 0. +0.j 0. +0.j 0.86027841+0.j ]\n [ 0. +0.j 0.32116933+0.55628159j 0. +0.j\n 0. +0.j 0. +0.j 0.50982453+0.j\n -0.16519685-0.28612934j -0.16519685+0.28612934j 0.33039371+0.j\n 0. +0.j 0. +0.j 0. +0.j ]\n [ 0. +0.j 0.33039371+0.j 0. +0.j\n -0.16519685-0.28612934j 0. +0.j -0.16519685+0.28612934j\n -0.50982453+0.j 0. +0.j -0.32116933+0.55628159j\n 0. +0.j 0. +0.j 0. +0.j ]\n [ 0. +0.j -0.16519685+0.28612934j 0. +0.j\n 0.33039371+0.j 0. +0.j -0.16519685-0.28612934j\n -0.32116933+0.55628159j -0.50982453+0.j 0. +0.j\n 0. +0.j 0. +0.j 0. +0.j ]\n [ 0. +0.j -0.16519685-0.28612934j 0. +0.j\n -0.16519685+0.28612934j 0. +0.j 0.33039371+0.j\n 0. +0.j -0.32116933+0.55628159j -0.50982453+0.j\n 0. +0.j 0. +0.j 0. +0.j ]\n [ 0.86027841+0.j 0. +0.j 0. +0.j\n 0. +0.j 0. +0.j 0. +0.j\n 0. +0.j 0. +0.j 0. +0.j\n -0.50982453+0.j 0. +0.j 0. +0.j ]\n [ 0. +0.j 0. +0.j 0.86027841+0.j\n 0. +0.j 0. +0.j 0. +0.j\n 0. +0.j 0. +0.j 0. +0.j\n 0. +0.j -0.50982453+0.j 0. +0.j ]\n [ 0. +0.j 0. +0.j 0. +0.j\n 0. +0.j 0.86027841+0.j 0. +0.j\n 0. +0.j 0. +0.j 0. +0.j\n 0. +0.j 0. +0.j -0.50982453+0.j ]]", "text/latex": "Quantum object: dims = [[12], [12]], shape = (12, 12), type = oper, isherm = False $ \\\\ \\left(\\begin{matrix}0.510 & 0.0 & 0.0 & 0.0 & 0.0 & \\cdots & 0.0 & 0.0 & 0.860 & 0.0 & 0.0\\\\0.0 & 0.510 & 0.0 & (0.321+0.556j) & 0.0 & \\cdots & (-0.165-0.286j) & (-0.165+0.286j) & 0.0 & 0.0 & 0.0\\\\0.0 & 0.0 & 0.510 & 0.0 & 0.0 & \\cdots & 0.0 & 0.0 & 0.0 & 0.860 & 0.0\\\\0.0 & 0.0 & 0.0 & 0.510 & 0.0 & \\cdots & 0.330 & (-0.165-0.286j) & 0.0 & 0.0 & 0.0\\\\0.0 & 0.0 & 0.0 & 0.0 & 0.510 & \\cdots & 0.0 & 0.0 & 0.0 & 0.0 & 0.860\\\\\\vdots & \\vdots & \\vdots & \\vdots & \\vdots & \\ddots & \\vdots & \\vdots & \\vdots & \\vdots & \\vdots\\\\0.0 & (-0.165+0.286j) & 0.0 & 0.330 & 0.0 & \\cdots & -0.510 & 0.0 & 0.0 & 0.0 & 0.0\\\\0.0 & (-0.165-0.286j) & 0.0 & (-0.165+0.286j) & 0.0 & \\cdots & (-0.321+0.556j) & -0.510 & 0.0 & 0.0 & 0.0\\\\0.860 & 0.0 & 0.0 & 0.0 & 0.0 & \\cdots & 0.0 & 0.0 & -0.510 & 0.0 & 0.0\\\\0.0 & 0.0 & 0.860 & 0.0 & 0.0 & \\cdots & 0.0 & 0.0 & 0.0 & -0.510 & 0.0\\\\0.0 & 0.0 & 0.0 & 0.0 & 0.860 & \\cdots & 0.0 & 0.0 & 0.0 & 0.0 & -0.510\\\\\\end{matrix}\\right)$" }, "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = Circuit.from_perceval(catalog['postprocessed ccz'].build_circuit())\n", "c.evaluate(0)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-03-15T16:29:04.077164Z", "start_time": "2024-03-15T16:29:03.911823Z" } } }, { "cell_type": "markdown", "source": [], "metadata": { "collapsed": false } } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 0 }