{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# State Tomography\n",
"State tomography allows for analysis of the quantum state produced by a particular quantum process, through measurement of the density matrix of the state.\n",
"\n",
"This notebook demonstates utilisation of the StateTomography object, which enables automation of the process, requiring only an experiment function to be provided which can be used for collecting the data."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"import lightworks as lw\n",
"from lightworks import emulator, qubit\n",
"from lightworks.tomography import StateTomography, density_from_state"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Before starting, a general function is defined to quickly perform the plotting of density matrices. This takes a complex matrix and plots the real and imaginary parts separately."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def plot_density_matrix(rho: np.ndarray) -> tuple:\n",
" \"\"\"\n",
" General function for plotting a density matrix. It will split up and plot\n",
" the real and imaginary components using a common colorbar between them.\n",
" \"\"\"\n",
" # Find plot range\n",
" vmin = min(np.real(rho).min(), np.imag(rho).min())\n",
" vmax = max(np.real(rho).max(), np.imag(rho).max())\n",
"\n",
" # Create figure\n",
" fig, ax = plt.subplots(1, 2, figsize=(12, 5))\n",
" ax[0].imshow(np.real(rho), vmin=vmin, vmax=vmax)\n",
" ax[0].set_title(\"Re(\\u03c1)\")\n",
" im = ax[1].imshow(np.imag(rho), vmin=vmin, vmax=vmax)\n",
" ax[1].set_title(\"Im(\\u03c1)\")\n",
" fig.colorbar(im, ax=ax.ravel().tolist())\n",
"\n",
" # Set ticks as integer values and create state labels\n",
" ticks = range(rho.shape[0])\n",
" n_qubits = int(np.log2(len(ticks)))\n",
" basis = [\"0\", \"1\"]\n",
" labels = list(basis)\n",
" for _ in range(n_qubits - 1):\n",
" labels = [q1 + q2 for q1 in labels for q2 in basis]\n",
" for i in range(2):\n",
" ax[i].set_xticks(ticks, labels=labels)\n",
" ax[i].set_yticks(ticks, labels=labels)\n",
"\n",
" return (fig, ax)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Single Qubit\n",
"First, single qubit states are examined, starting with $\\ket{0}$. This is created by using an identity gate circuit and a photonic input state of $\\ket{10}$. The circuit defined below acts as a base circuit to use with the StateTomography, which is then modified as part of the algorithm.\n",
"\n",
".. note::\n",
" The input state is defined later on, in the experiment function below."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
""
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"identity_circ = qubit.I()\n",
"identity_circ.display()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then, a function must be defined which performs the state tomography experiments. This should take a list of experiments and return a list of results. Below it is defined for one qubit systems."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def experiment_1q(circuits: list[lw.PhotonicCircuit]) -> list:\n",
" \"\"\"\n",
" Experiment function which is required for performing state tomography on a\n",
" system. It takes a list of circuits and generates a corresponding list of\n",
" results for each of them. Only supports one qubit systems currently.\n",
" \"\"\"\n",
" # Post-select on 1 photon across each pair of qubit modes\n",
" post_select = lw.PostSelection()\n",
" post_select.add((0, 1), 1)\n",
"\n",
" backend = emulator.Backend(\"slos\")\n",
"\n",
" # Generate results and return\n",
" results = []\n",
" for circ in circuits:\n",
" sampler = lw.Sampler(\n",
" circ,\n",
" lw.State([1, 0]),\n",
" 10000,\n",
" post_selection=post_select,\n",
" random_seed=11,\n",
" )\n",
" results.append(backend.run(sampler))\n",
" return results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The state tomography can then be ran with the process method and the produced density matrix examined."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"n_qubits = 1\n",
"\n",
"tomo = StateTomography(n_qubits, identity_circ, experiment_1q)\n",
"\n",
"rho = tomo.process()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"From below, the density matrix is approximately\n",
"\n",
"$\\begin{equation}\\rho = \\begin{bmatrix} 1 & 0\\\\ 0 & 0 \\end{bmatrix}\\end{equation}$\n",
"\n",
"which is as expected using the equation\n",
"\n",
"$\\begin{equation}\\rho = \\ket{\\Psi}\\bra{\\Psi} = \\ket{0}\\bra{0} \\end{equation}$"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA3AAAAGfCAYAAAAeZzCpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAoW0lEQVR4nO3df5TXVZ0/8OdnUIYQB3XRIXCM7ZfG0UAhWMqO2neSrNjctpWyAinpWNJac2rVfjCpu1Gd4rDnRFEW0bddN6qT1h49dIzi+G1j1wViT3XS8lewFSNoCWIyOp/P9w90agKM4fOZH5d5PDz3HOc973vf9+MZuL7m9XrfW6nVarUAAAAw7DUN9QQAAAA4PAI4AACAQgjgAAAACiGAAwAAKIQADgAAoBACOAAAgEII4AAAAAohgAMAACiEAA4AAKAQAjgAAIBCCOAAAAD66Y477si8efMyadKkVCqV3HLLLX+2z4YNG3LOOeekubk5z3/+87NmzZp+P1cABwAA0E979+7NtGnTsnLlysO6//77789rXvOaXHDBBdm6dWve85735PLLL893vvOdfj23UqvVakcyYQAAAJJKpZKbb745F1988SHvufrqq3PrrbfmJz/5Se+1N77xjfnd736XdevWHfazjqlnogAAAEPl8ccfT3d3d0PGqtVqqVQqfa41Nzenubm5IeNv3Lgx7e3tfa7NnTs373nPe/o1jgAOAAAozuOPP56/fM647HiwpyHjjRs3Lo8++mifa52dnfnIRz7SkPF37NiR1tbWPtdaW1uze/fu/P73v8+znvWswxpHAAcAABSnu7s7Ox7syS83T0nL8fVt7bF7TzXPmfFAtm/fnpaWlt7rjcq+NZJNTOAQvva1r+Wkk0464Dcxh2PVqlU57bTTsm/fvgGYGQAlsq7AwBh3fKUhLUlaWlr6tEYGcBMnTkxXV1efa11dXWlpaTns7FsigOMosGbNmlQqld52zDHHZPLkybnsssvyq1/96ojG7OnpSWdnZ9797ndn3Lhx/e5/2WWXpbu7O5/73OeO6PkADJ2n15VNmzY1bEzrCgycnlq1IW2gzZkzJ+vXr+9z7fbbb8+cOXP6NY4AjqPG9ddfn6985StZtWpVLrroovzLv/xLzjvvvDz++OP9Huvf//3fc/fdd+cd73jHEc1lzJgxWbhwYZYvXx4bvQJgXYGjz6OPPpqtW7dm69atSfYfE7B169Zs27YtSXLttddmwYIFvfdfccUVue+++/IP//APueuuu/KZz3wmX/va1/Le9763X88VwHHUuOiii/KWt7wll19+eb7whS/kfe97X+699958+9vf7vdYX/rSl/Kyl70skydPPuL5XHLJJfnlL3+Z73//+0c8BgBHB+sKDJxqag1p/bVp06acffbZOfvss5MkHR0dOfvss7N06dIkyW9+85veYC5J/vIv/zK33nprbr/99kybNi2f+tSn8oUvfCFz587t13MFcBy1Xv7ylydJ7r333t5rd911V97whjfkpJNOypgxYzJz5swDArzHH38869atO2Cb16c99NBDef3rX59x48Zl9OjReclLXpIf/OAHB9w3Y8aMnHTSSfnWt77VwE8FwGC77LLLMm7cuGzbti2vfe1rM27cuEyePLn38N4f//jHecUrXpHjjjsuz3nOc3LTTTf16W9dgYFVbdA//XX++eenVqsd0NasWZNkfzn2hg0bDujzox/9KPv27cu9996byy67rN/PFcBx1HrggQeSJCeeeGKS5Kc//Wn+6q/+Kj/72c9yzTXX5FOf+lSOO+64XHzxxbn55pt7+23evDnd3d0555xzDhjzsccey3nnnZc77rgjV199df7xH/8xO3fuzIUXXtjnUMannXPOOfmP//iPgfmAAAyanp6eXHTRRWlra8snPvGJTJkyJUuWLMmaNWvyqle9KjNnzszHP/7xHH/88VmwYEHuv//+3r7WFaCRHCPAUeORRx7Jrl278vjjj+e//uu/ct1116W5uTmvfe1rkyRXXXVVTjvttPz3f/93745C73rXu3Luuefm6quvzt/8zd8k2Z+lS/anuf/UZz/72fz0pz/Npk2bMmPGjCTJG9/4xpx++ulZunRpvvnNb/a5/7nPfW6+8pWvDNhnBmBwPP7443nLW96Sa6+9Nkly6aWXZtKkSXnb296Wf/u3f8v8+fOTJK985Stzxhln5Mtf/nLv2VHWFRhYPbVaeup8N7Te/oNJBo6jRnt7e04++eS0tbXlDW94Q4477rh8+9vfzqmnnpqHH3443/ve93LJJZdkz5492bVrV3bt2pWHHnooc+fOzS9+8YveHSsfeuihJH/I3P2xtWvXZs6cOb2LbJKcdtpped3rXpfvfOc76enpe5DkiSeemN///vd5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1bnmmmsOuH/16tV5+OGH88Mf/jDHHntskmTKlCn9fq4SSgAAoFyNKJ/sZwlld3d3Nm/enPb29t5rTU1NaW9vz8aNGw/a59vf/nbmzJmTK6+8Mq2trTnzzDPz0Y9+ND09Pf16tgwcAABQrP0Hedc/RpLs3r27z/Xm5uY0NzcfcP+uXbvS09OT1tbWPtdbW1tz1113HfQZ9913X773ve/lzW9+c2677bbcc889ede73pUnnnginZ2dhz1XGTgAAIAkbW1tGT9+fG9btmxZw8auVqs55ZRT8vnPfz4zZszI/Pnz88EPfjCrVq3q1zgycAAAQLEaeZD39u3b09LS0nv9YNm3JJkwYUJGjRqVrq6uPte7uroyceLEg/Z59rOfnWOPPTajRo3qvfaiF70oO3bsSHd3d0aPHn1Yc5WBAwAAyvX0O2z1tiQtLS192qECuNGjR2fGjBlZv35977VqtZr169dnzpw5B+3zspe9LPfcc0+q1WrvtZ///Od59rOffdjBWyKAAwAA6LeOjo7ceOON+fKXv5yf/exneec735m9e/f27kq5YMGCXHvttb33v/Od78zDDz+cq666Kj//+c9z66235qMf/WiuvPLKfj1XCSUAAFCsRm5i0h/z58/Pzp07s3Tp0uzYsSPTp0/PunXrejc22bZtW5qa/pAva2try3e+8528973vzYtf/OJMnjw5V111Va6++up+PVcABwAAlGuIDvJOkiVLlmTJkiUH/d6GDRsOuDZnzpz853/+55E97ClKKAEAAAohAwcAABSrkbtQlkAABwAAlK3eEsqCKKEEAAAohAwcAABQLCWUAAAApRjCXSiHghJKAACAQsjAAQAABas81eodowwCOAAAoFxKKAEAABiOZOAAAIByjbAMnAAOAAAoV62yv9U7RiGUUAIAABRCBg4AAChWrba/1TtGKQRwAABAuUbYO3BKKAEAAAohAwcAAJRrhG1iIoADAACKVantb/WOUQollAAAAIWQgQMAAMo1wjYxEcABAADlGmHvwCmhBAAAKIQMHAAAUC4llAAAAIUYYQGcEkoAAIBCyMABAADlGmEZOAEcAABQLrtQAgAAMBzJwAEAAMWq1Pa3escohQAOAAAo1wh7B04JJQAAQCEEcAAAAIVQQgkAABSrkga8A9eQmQyOIQvgXn/WzBxTOXaoHg/PqPbEk0M9BTik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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_density_matrix(rho)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### $\\ket{+}$ tomography\n",
"Next we can perform tomography of the $\\ket{+}$ state, through creation of this with a hadamard gate. This is the case as the experiment_1q function uses the input $\\ket{0}$."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
""
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"h_circ = qubit.H()\n",
"h_circ.display()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This circuit is then used with the StateTomography object."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"tomo = StateTomography(n_qubits, h_circ, experiment_1q)\n",
"\n",
"rho = tomo.process()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Again the density matrix is as expected using:\n",
"\n",
"$\\begin{equation}\\rho = \\ket{+}\\bra{+} = \\frac{1}{2} (\\ket{0}\\bra{0} + \\ket{0}\\bra{1} + \\ket{1}\\bra{0} + \\ket{1}\\bra{1}) \\end{equation}$"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA3AAAAGWCAYAAAA5aGFhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAn4klEQVR4nO3de3Cc1Xk4/mdlkBRjS+C6SGMjUIAG4wFssLBjCsHkq+BwK+RSnKapjWjcSalSZjRkgGljhcuMuDiO26JiSuo4PyjFYSaXZibjTqPGw9Bo6toet5QCLcRgBSLZBmr5Ultkd39/GESEZeLVri7H+/kwZ4Z99b7nPauRdPzs87znZPL5fD4AAACY8CrGewAAAAAcGwEcAABAIgRwAAAAiRDAAQAAJEIABwAAkAgBHAAAQCIEcAAAAIkQwAEAACTihPEeAAAAwEgcPHgwBgYGStJXZWVlVFdXl6Sv0SSAAwAAknPw4MH48BlTondntiT91dfXx/bt2yd8EKeEEo7iO9/5TkybNi327dtX8LVr1qyJ008/PQ4dOjQKIwMgReYVKK2BgYHo3ZmN7VvOiDf++8NFte1bzoje3t6SZfNGkwCO5K1bty4ymcxgO+GEE2LmzJlx0003xWuvvTaiPrPZbLS3t8eXv/zlmDJlSsHX33TTTTEwMBCPPPLIiO4PwPh5d17ZvHlzyfo0r8DoqZlaUZKWinRGCr/G3XffHY899lisWbMmrrrqqnj88cfj8ssvj4MHDxbc1w9/+MN48cUX44/+6I9GNJbq6upYtmxZrFq1KvL5/Ij6AOD4YV6B0ZPN50rSRqKzszMaGxujuro6FixYEJs2bTrque9POmQymRGVawrgOG5cddVV8YUvfCG++MUvxje/+c247bbb4uWXX45/+Id/KLivb33rW/Hbv/3bMXPmzBGP58Ybb4xXX301fvKTn4y4DwCOD+YVGD25yJekFWr9+vXR1tYW7e3tsXXr1pgzZ04sXrw4du7cedRrampq4he/+MVge/XVVwu+rwCO49Zll10WEREvv/zy4LEXXnghPvvZz8a0adOiuro6mpqajgjwDh48GBs2bIjm5uZh+33jjTfi05/+dEyZMiUqKyvj4osvjmeeeeaI8+bNmxfTpk2LH/zgByV8VwCMtZtuuimmTJkSO3bsiGuvvTamTJkSM2fOjM7OzoiIePbZZ+PjH/94nHTSSXHGGWfEE088MeR68wocn1atWhXLly+PlpaWmD17dqxZsyYmT54ca9euPeo1mUwm6uvrB1tdXV3B9xXAcdx65ZVXIiLilFNOiYiI5557Lj760Y/G888/H3fccUd8/etfj5NOOiluuOGG+N73vjd43ZYtW2JgYCAuuuiiI/o8cOBAXH755fH000/H7bffHvfee2/s2rUrrrzyyvjP//zPI86/6KKL4l/+5V9G5w0CMGay2WxcddVV0dDQEA888EA0NjZGa2trrFu3Lj75yU9GU1NT3H///TF16tRYunRpbN++ffBa8wqMrlyJ/ouI6O/vH9KOtnDQwMBAbNmyZcgHMxUVFdHc3Bzd3d1HHeu+ffvijDPOiIaGhrj++uvjueeeK/j92kaA48aePXti9+7dcfDgwfjXf/3XuOuuu6KqqiquvfbaiIi49dZb4/TTT49/+7d/i6qqqoiIuOWWW+LSSy+N22+/PT71qU9FxOEsXUTEhz/84SPu8fDDD8dzzz0Xmzdvjnnz5kVExOc+97k455xzYsWKFfHd7353yPlnnnlmPPbYY6P2ngEYGwcPHowvfOELceedd0ZExOc///mYMWNG3HzzzfH3f//3sWTJkoiI+MQnPhGzZs2Kb3/72/G1r30tIswrMNqy+Xxki3w29N3rGxoahhxvb28f/F3+Vbt3745sNntEBq2urm7wd/79zjnnnFi7dm1ccMEFsWfPnli5cmVccskl8dxzz8Vpp512zGMVwHHceH9pSmNjYzz++ONx2mmnxZtvvhn//M//HHfffXfs3bs39u7dO3je4sWLo729PV577bWYOXNmvPHGGxHxXubuV61fvz4WLlw4OMlGRJx++ulx/fXXxw9/+MPIZrMxadKkwa+dcsop8X//939x4MCBmDx5cqnfMgBj6Itf/OLg/5988slxzjnnxEsvvRQ33njj4PFzzjknTj755PjZz342eMy8Auno6emJmpqawdfvfuhfCgsXLoyFCxcOvr7kkkvi3HPPjUceeSTuueeeY+5HAMdxo7OzMz7ykY/Enj17Yu3atfH0008P/tK99NJLkc/n46tf/Wp89atfHfb6nTt3Dnm4fLhVvn72s5/FNddcc8Txj3zkI3HgwIHYtWtX1NfXH9FHJpMp6r0BML6qq6vjN3/zN4ccq62tjdNOO+2Iv/G1tbXx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7bFt27bYsWPH+A4MGJY5hYnOvMJR5XOlaRFRU1MzpA1XPhkxsg++Fi5cOOT8iIh/+qd/KviDMs/AJWzJkiWxa9euWLFiRfT29sbcuXNjw4YNR9TWwnjYvHlzXHHFFYOv29raIiJi2bJlsW7dunEaFXA05hQmOvMKE01bW1ssW7YsmpqaYv78+bF69eohH3wtXbo0Zs6cOViGeeutt8bll18eX//61+Oaa66JJ598MjZv3hx/8zd/U9B97QMHAAAk59194BZlPhUnZE4sqq9f5t+OjfnvFbQPXETEQw89FA8++ODgB19/+Zd/GQsWLIiIiEWLFkVjY+OQDxieeuqp+PM///N45ZVX4rd+67figQceiKuvvrqgsQrgAACA5AwGcHF9aQK4+EHBAdx4UEIJAAAk65fxdkSRKalfxtulGcwYEMABAADJqaysjPr6+nim90cl6a++vj4qKytL0tdoUkIJAAAk6eDBgzEwMFCSviorK6O6urokfY0mARwAAEAi7AMHAACQCAEcAABAIgRwAAAAiRDAAQAAJEIABwAAkAgBHAAAQCIEcAAAAIkQwAEAACTi/wcidME2ISvulQAAAABJRU5ErkJggg==",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_density_matrix(rho)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Two Qubit\n",
"StateTomography also supports multi-qubit states. Below, a circuit to create a bell state is defined using a hadamard and CNOT gate. This will produce the output $\\ket{\\Phi^+} = \\frac{1}{\\sqrt{2}}(\\ket{00} + \\ket{11})$."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
""
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"n_qubits = 2\n",
"\n",
"bell_circuit = lw.PhotonicCircuit(2 * n_qubits)\n",
"bell_circuit.add(qubit.H())\n",
"bell_circuit.add(qubit.CNOT())\n",
"\n",
"bell_circuit.display()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The above experiment function is then redefined into a more general version within a class, which supports any number of qubits and can include features such as variable single photon source quality."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"class SamplerExperiment:\n",
" \"\"\"\n",
" Runs experiment using the emulator Sampler for a given n_qubits with an\n",
" optional imperfect single photon source.\n",
" \"\"\"\n",
"\n",
" def __init__(\n",
" self, n_qubits: int, source: emulator.Source | None = None\n",
" ) -> None:\n",
" self.n_qubits = n_qubits\n",
" self.source = source\n",
" self.n_samples = 10000\n",
" self.random_seed = 22\n",
" self.backend = emulator.Backend(\"slos\")\n",
"\n",
" def experiment(self, circuits: list[lw.PhotonicCircuit]) -> list:\n",
" \"\"\"\n",
" Generalised version of experiment function above, designed for any\n",
" number of qubits. It is assumes the provided circuits contain dual-rail\n",
" encoded qubits across pairs of adjacent modes.\n",
" \"\"\"\n",
" # Post-select on 1 photon across each pair of qubit modes\n",
" post_select = lw.PostSelection()\n",
" for i in range(self.n_qubits):\n",
" post_select.add((2 * i, 2 * i + 1), 1)\n",
"\n",
" # Generate results and return\n",
" results = []\n",
" for circ in circuits:\n",
" sampler = lw.Sampler(\n",
" circ,\n",
" lw.State([1, 0] * self.n_qubits),\n",
" self.n_samples,\n",
" source=self.source,\n",
" post_selection=post_select,\n",
" random_seed=self.random_seed,\n",
" )\n",
" results.append(self.backend.run(sampler))\n",
" return results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"An experiment can then be created using the above SamplerExperiment, and the tomography run on the system by providing the experiment method of this object."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"ideal_exp = SamplerExperiment(n_qubits)\n",
"\n",
"tomo = StateTomography(n_qubits, bell_circuit, ideal_exp.experiment)\n",
"\n",
"rho = tomo.process()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Again, this density matrix matches that which would be expected with $\\rho = \\ket{\\Phi^+}\\bra{\\Phi^+}$."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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jo4O1dbWatu2bcFK3b59+2TbtpYuXaqlS5f2efzBgwdDHn7va5WyDz/8ULfccstp2y+77DIdP35chw4dCinL957DsqyIvhsAILqSkpJ0/vnnh2xLTU3V5MmTT/s3PjU1VZ999tlp52BeAQZHQLb8A0jQvnqOcJWWlurQoUOqqKiQ1+tVXl6etmzZElx4paWlRXFxX9bcPvvsMy1evFher1fjxo1Tfn6+3n33XU2bNq3f1yTBQ0wpLCxUQUGBJGnevHmaOXOmvv3tb2vv3r0KBE4+OPvII4+opKSkz+MvueQSSdL48eMlnfxLOHny5JB9Dh8+HFZMn332mZKTk3XeeeeFdRwAYHiJj48Pa/upyRzzCmCu8vLyM7Zkbt26NeTn5557Ts8991xE1yPBQ8yKj49XVVWVbrzxRj3//PO69957JZ18mPVMq5j1mjp1qiSpublZV111Vchntm3r/fffP+2Y//u//1NycvJpv91tbm7WFVdcEclXAQC4HPMKMLgG2mL51XO4Ac/gIabNnj1bhYWFWrNmjVJSUjR79mz9/Oc/1yeffHLavocOHQr+//z8fCUkJGjnzp19nre+vl6NjY3Bn1tbW/XGG29ozpw5p/0mt7GxUddff71D3wgA4EbMK8DgcnIVzeGOBA8x79FHH1VbW5vWr1+v6upq2batq666SkuWLNHatWu1fPly3XLLLSFVvaSkJM2ZM0f/+Z//2ec5r7zySpWUlOjpp5/WypUrg+/bW7ZsWch+DQ0NOnz4sG677bbB+4IAgGGPeQWAU2jRRMy74447dPHFF2vVqlVavHixdu7cqWXLlmn9+vX69NNPNXHiRE2fPl0VFRUhx917772aP3++WltblZWVFfLZrFmzVFRUpGXLlqmlpUXTpk3T+vXrdfXVV4fst3HjRmVnZ+umm24a9O8JABjemFeAwRP4YkR6Djew7L6WawJwTn6/X9OmTdNdd92lp59+Orjdsiw98MADev755896fE9Pj3JycvT444/roYceGuxwAQDDHPMK4LzOzk6lpqbqvd0TNWZMZM2LR48G9P9dcVAdHR1KSUlxKELn0aIJDFB8fLyeeuopVVdX69ixY2Efv27dOo0cOVLf//73ByE6AIDbMK8AcAIJHhCB0tJSHT58WKNHjw772O9///tqaWkJvocPAADmFWBw+G1nhhvwDB4AAAAA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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_density_matrix(rho)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"After calculation, it is also possible to calculate the fidelity with respect to the expected matrix using the fidelity method. The tomography module contains a density_from_state function which enables the density matrix to be calculated from the expected state.\n",
"\n",
"No imperfections were included within the system, so as expected the fidelity is 1."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fidelity = 100.0 %\n"
]
}
],
"source": [
"rho_exp = density_from_state([2**-0.5, 0, 0, 2**-0.5])\n",
"\n",
"print(f\"Fidelity = {round(tomo.fidelity(rho_exp) * 100, 4)} %\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Imperfect SPS\n",
"It is also possible to include the error sources from the emulator to view how these change fidelity. Below, the SamplerExperiment is initalised to include a single photon source with indistinguishability of 95% and purity of 99%."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"source = emulator.Source(indistinguishability=0.95, purity=0.99)\n",
"\n",
"imperfect_exp = SamplerExperiment(2, source=source)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"When re-running the state tomography, it can be seen how the denisty matrix begins to vary from ideal and the fidelity drops to ~96.2%."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fidelity = 96.3872 %\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA3gAAAGVCAYAAACsK1M7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAve0lEQVR4nO3df5SWdZkA/OsZdGbkx4wgNSM4hJpFvBUQBNJaok0SlRtpK9aWOBmdjuJqc9pN24Q0z5n8EcuppuiXsmtrsXaMat899NZs5nGbdIGldd1itTAomgFUGBhiRue53z+IqYlBGJ575pnnns+n8z3HuZ/7x/XcIV+vua77e+eSJEkCAACAkldW7AAAAABIhwQPAAAgIyR4AAAAGSHBAwAAyAgJHgAAQEZI8AAAADJCggcAAJAREjwAAICMOKXYAQAAAAyWQ4cORXd3dyrnKi8vj8rKylTONVgkeAAAQCYdOnQozn7Z2Gjb1ZPK+Wpra2Pbtm3DOsnTogkF+Jd/+ZeYMGFCHDhwYMDHrlmzJqZMmRJdXV2DEBkApci8Aunq7u6Otl09sW3Ty+KZ/zu7oLFt08uira0ttWrgYJHgMSKsXbs2crlc7zjllFNi8uTJcfXVV8dvf/vbkzpnT09PrFy5Mq6//voYO3bsgI+/+uqro7u7O770pS+d1PUBKJ4j88rGjRtTO6d5BQZP1biyVEYpKI0oISW33XZb3HfffbFmzZpYtGhRfP3rX48LL7wwDh06NOBzfe9734utW7fGhz70oZOKpbKyMpYuXRqrVq2KJElO6hwAZId5BQZPT5JPZZQCCR4jyqJFi+J973tffPCDH4yvfvWr8dGPfjR++ctfxne/+90Bn+vee++Nv/iLv4jJkyefdDxXXHFF/PrXv44f/ehHJ30OALLBvAKDJx9JKqMUSPAY0d74xjdGRMQvf/nL3m2/+MUv4t3vfndMmDAhKisrY86cOUclgIcOHYoNGzZEfX19v+d95pln4rLLLouxY8dGeXl5vP71r49HHnnkqP1mz54dEyZMiO985zspfisAhtrVV18dY8eOje3bt8c73vGOGDt2bEyePDmam5sjIuLxxx+Piy++OMaMGRMve9nL4v777+9zvHkFSIsEjxHt6aefjoiI8ePHR0TEE088Eeeff378/Oc/j5tuuik+85nPxJgxY2Lx4sXx7W9/u/e4TZs2RXd3d7zuda876pwHDx6MCy+8MB5++OH42Mc+Frfffnvs3r07Lrnkkvif//mfo/Z/3eteF//xH/8xOF8QgCHT09MTixYtirq6urjzzjtj6tSpsXz58li7dm289a1vjTlz5sQdd9wR48aNi6uuuiq2bdvWe6x5BQZXPqX/lQKvSWBE2bdvX+zZsycOHToUjz76aNx6661RUVER73jHOyIi4oYbbogpU6bEf/7nf0ZFRUVERFx77bVxwQUXxMc+9rF417veFRGHq3wREWefffZR1/jiF78YTzzxRGzcuDFmz54dERFXXnllvPKVr4wVK1bEgw8+2Gf/c845J+67775B+84ADI1Dhw7F+973vrj55psjIuK9731vTJo0KT7wgQ/EN77xjViyZElERLzlLW+JadOmxT/+4z/GJz/5yYgwr8Bg60mS6Cnw2dRCjx8qKniMKPX19fGSl7wk6urq4t3vfneMGTMmvvvd78ZZZ50Vzz77bPz7v/97XHHFFbF///7Ys2dP7NmzJ5555plYuHBhPPnkk70rbj7zzDMR8cfK359at25dzJ8/v3cSjoiYMmVKvPOd74zvf//70dPT9z0s48ePj9///vdx8ODBQfzmAAyFD37wg73/fPrpp8crX/nKGDNmTFxxxRW921/5ylfG6aefHr/61a96t5lXgLRI8BhRmpub4wc/+EF861vfire97W2xZ8+e3krdU089FUmSxC233BIveclL+oyVK1dGRMSuXbv6nK+/Vcp+9atfxXnnnXfU9le84hVx8ODB2L17d7/nyOVyqXxHAIqjsrIyXvKSl/TZVl1dHWedddZRf8dXV1fHc889d9Q5zCswOEbSIitaNBlR5s6dG3PmzImIiMWLF8cFF1wQ733ve2Pr1q2Rzx/uq/7oRz8aCxcu7Pf4l7/85RERccYZZ0RExHPPPRdnnXVWn32effbZAcX03HPPxejRo+O0004b0HEADC+jRo0a0PY/TebMKzC48pFET4EJmgQPhrlRo0ZFU1NTXHTRRfH5z38+PvCBD0RExKmnnnrMVcyOmDZtWkREbNu2LV7zmtf0+SxJknjyySePOub//u//YvTo0Uf9dnfbtm3xqle9qpCvAkCJM68AadGiyYi2YMGCmDt3bqxevTqqqqpiwYIF8aUvfSl+97vfHbXvn7bAzJ49O8rLy2Pjxo39nre1tTU2b97c+/OOHTviO9/5TlxyySVH/SZ38+bN8YY3vCGlbwRAKTKvwODSogkjyN/+7d/GX/3VX8XatWujubk5LrjggnjNa14Ty5Yti3POOSfa29ujtbU1fvOb38TPfvaziDj8nMUll1wSP/zhD+O222476pyvfvWrY+HChfE3f/M3UVFREV/4whciIuLWW2/ts9+mTZvi2WefjXe+852D/0UBGLbMKzC4RtIqmhI8RrzLLrsszj333Lj77rtj2bJlsXHjxrj11ltj7dq18cwzz8RLX/rSmDVrVqxYsaLPcR/4wAfi8ssvjx07dkRdXV2fzy688MKYP39+3HrrrbF9+/aYPn16rF27Nl772tf22e+BBx6IKVOmxMUXXzzo3xOA4c28AqQhl/S3XBNwXD09PTF9+vS44oor4lOf+lTv9lwuF9ddd118/vOff9Hju7q6YurUqXHTTTfFDTfcMNjhAjDMmVcgfR0dHVFdXR2/+HlNjBtX2NNp+/fnY9qr2mPfvn1RVVWVUoTp8wwenKRRo0bFbbfdFs3NzXHgwIEBH3/vvffGqaeeGh/+8IcHIToASo15BQZPzx9W0Sx0lAIJHhRgyZIl8eyzz8bYsWMHfOyHP/zh2L59e+97+ADAvAIUyjN4AABApvUkh0eh5ygFEjxImcdaAUiTeQUKl//DKPQcpUCLJgAAQEao4AEAAJmWj1z0RK7gc5SCYZfg5fP52LlzZ4wbNy5yudK4iQDDTZIksX///pg0aVKUlY3sZg3zCkBhsjCn5JPDo9BzlIJhl+Dt3LnzqJd7AnByduzYEWeddVaxwygq8wpAOswppWHYJXjjxo2LiIjHN9bEuLGl+RuC4eiaC95W7BAypWfPnmKHkDl3PfHTYoeQKQcO5OOiebt7/04dyY7cgwtPf0+ckisvcjTZkbzwQrFDyJRcuT+bqcuXypIYw98LSXf8eO83SnpO6UmhRbPQ44fKsEvwjrTPjBtbFlUFvm2ePzqlzMSRplzu1GKHkDlj/fs+KLQk/vEenJIrl+ClKMn5dzZNOfN0+hIJXtpKeU4ZSQmev50BAAAyYthV8AAAANKUT3KRTwpcRbPA44eKBA8AAMg0LZoAAACUHBU8AAAg03qiLHoKrG31pBTLYJPgAQAAmZak8AxeUiLP4GnRBAAAyAgVPAAAINNG0iIrEjwAACDTepKy6EkKfAYvSSmYQaZFEwAAICNU8AAAgEzLRy7yBda28lEaJTwJHgAAkGkj6Rk8LZoAAAAZoYIHAABkWjqLrGjRBAAAKLrDz+AV1mJZ6PFDRYsmAABARqjgAQAAmZaPsuixiiYAAEDpG0nP4GnRBAAAyAgVPAAAINPyUeZF5wAAAFnQk+SiJynwRecFHj9UtGgCAABkhAoeAACQaT0prKLZo0UTAACg+PJJWeQLXEUzbxVNAAAAhpIKHgAAkGlaNAEAADIiH4WvgplPJ5RBp0UTAAAgI1TwAACATEvnReelURuT4AEAAJnWk5RFT4GraBZ6/FApjSgBAAA4LhU8AAAg0/KRi3wUushKYccPFRU8AAAg0460aBY6TkZzc3NMnTo1KisrY968efHYY4+d0HHf/OY3I5fLxeLFiwd0PQkeAADAIFi3bl00NjbGypUrY/PmzTFjxoxYuHBh7Nq160WPe/rpp+OjH/1ovPGNbxzwNSV4AABAph150XmhY6BWrVoVy5Yti4aGhpg+fXqsWbMmRo8eHffcc8+xY+3pib/+67+OW2+9Nc4555wBX/OkErwXKzMeOnQorrvuujjjjDNi7Nixcfnll0d7e/vJXAaAEcK8AsBgyie5VMZAdHd3x6ZNm6K+vr53W1lZWdTX10dra+sxj7vtttvipS99aVxzzTUn9V0HnOAdr8z4kY98JL73ve/FAw88ED/+8Y9j586dcdlll51UcABkn3kFgFLS0dHRZ3R1dfW73549e6Knpydqamr6bK+pqYm2trZ+j3nkkUfia1/7WnzlK1856fgGnOC9WJlx37598bWvfS1WrVoVF198ccyePTvuvffe+MlPfhI//elPTzpIALLLvALAYMun0J555EXndXV1UV1d3TuamppSiXH//v3x/ve/P77yla/ExIkTT/o8A3pNwpEy480339y77U/LjHPnzo3nn3++Txly2rRpMWXKlGhtbY3zzz//qHN2dXX1yXo7OjpO5nsAUILMKwAMhXxSFvkCX1R+5PgdO3ZEVVVV7/aKiop+9584cWKMGjXqqMcK2tvbo7a29qj9f/nLX8bTTz8dl1566R+vmc9HRMQpp5wSW7dujXPPPfe4cQ7oWx6vzNjW1hbl5eVx+umn9/t5f5qamvpkwHV1dQMJCYASZl4BoNRUVVX1GcdK8MrLy2P27NnR0tLSuy2fz0dLS0vMnz//qP2nTZsWjz/+eGzZsqV3/OVf/mVcdNFFsWXLlhOez4r+ovObb745Ghsbe3/u6OgwGQNw0swrAPy5nshFT4EvKj+Z4xsbG2Pp0qUxZ86cmDt3bqxevTo6OzujoaEhIiKuuuqqmDx5cjQ1NUVlZWW8+tWv7nP8kV9w/vn2FzOgBO94Zcba2tro7u6OvXv39vlt67HKkBGHS5rHynoByDbzCgBDIc0WzYFYsmRJ7N69O1asWBFtbW0xc+bM2LBhQ2/nyvbt26OsLN031w3obMcrM86ePTtOPfXUPp9v3bo1tm/f3m8ZEoCRzbwCQNYtX748fv3rX0dXV1c8+uijMW/evN7PHnrooVi7du0xj127dm2sX79+QNcbcIvmi5UZq6ur45prronGxsaYMGFCVFVVxfXXXx/z58/v90F4ADCvADDYeuLkWiz//BylYMAJ3vHKjP/wD/8QZWVlcfnll0dXV1csXLgwvvCFL6QeOADZYF4BYLAVq0WzGHJJkiTFDuJPdXR0RHV1dTz9izOjalxp3MRS8J5Zf1nsEDKlZ/fuYoeQOZ/79X8UO4RMObA/H6//f9pj3759fZZyHomOzCtvHr80TsmVFzuczEheeKHYIWRKrsKfzdT15IsdQWa8kHRHy3P/WJJzypE54BM/vSQqx55a0LkOHXg+bj///xv296Hoq2gCAAAMpp6kLHoKrMAVevxQkeABAACZlkQu8gU+g5cUePxQKY00FAAAgONSwQMAADJNiyYAAEBG5JNc5JPCWiwLPX6olEYaCgAAwHGp4AEAAJnWE2XRU2Btq9Djh4oEDwAAyDQtmgAAAJQcFTwAACDT8lEW+QJrW4UeP1QkeAAAQKb1JLnoKbDFstDjh0pppKEAAAAclwoeAACQaSNpkRUJHgAAkGlJUhb5pLDmxaTA44dKaUQJAADAcangAQAAmdYTueiJAhdZKfD4oSLBAwAAMi2fFP4MXT5JKZhBpkUTAAAgI1TwAACATMunsMhKoccPFQkeAACQafnIRb7AZ+gKPX6olEYaCgAAwHGp4AEAAJnWk+Sip8BFVgo9fqhI8AAAgEwbSc/glUaUAAAAHJcKHgAAkGn5yBX+HrwSWWRFggcAAGRaksIqmkmJJHhaNAEAADJCBQ8AAMi0fJJCi6ZVNAEAAIrPKpoAAACUHBU8AAAg07RoAgAAZEQ+hVU0S+U1CVo0AQAAMkIFDwAAyDQtmgAAABkhwRsGrrngbXFKWXmxw8iOF14odgSZMmr8+GKHkDk3vmZRsUPIlBeS7oj4erHDGF5GnRJRNmynvZJTGv+ZU0J68sWOIHtGeRIpNXn3spSY6QAAgExTwQMAAMiIkZTgqbcCAABkhAoeAACQaUkU/h67JJ1QBp0EDwAAyDQtmgAAAJQcFTwAACDTRlIFT4IHAABk2khK8LRoAgAAZIQKHgAAkGkjqYInwQMAADItSXKRFJigFXr8UNGiCQAAkBEqeAAAQKblI1fwi84LPX6oqOABAABkhAoeAACQaRZZAQAAyAiLrAAAAFByVPAAAIBM06IJAACQEVo0AQAAKDkqeAAAQKYlKbRolkoFT4IHAABkWhIRSVL4OUqBFk0AAICMUMEDAAAyLR+5yEWBq2gWePxQkeABAACZZhVNAAAASo4EDwAAyLQjLzovdJyM5ubmmDp1alRWVsa8efPiscceO+a+Dz74YMyZMydOP/30GDNmTMycOTPuu+++AV1PggcAAGRakqQzBmrdunXR2NgYK1eujM2bN8eMGTNi4cKFsWvXrn73nzBhQvz93/99tLa2xn//939HQ0NDNDQ0xPe///0TvqYEDwAAYBCsWrUqli1bFg0NDTF9+vRYs2ZNjB49Ou65555+91+wYEG8613vile96lVx7rnnxg033BCvfe1r45FHHjnha0rwAACATDuyyEqhIyKio6Ojz+jq6ur3mt3d3bFp06aor6/v3VZWVhb19fXR2tp6AjEn0dLSElu3bo03velNJ/xdJXgAAECmpZng1dXVRXV1de9oamrq95p79uyJnp6eqKmp6bO9pqYm2trajhnrvn37YuzYsVFeXh5vf/vb43Of+1y85S1vOeHv6jUJAAAAJ2jHjh1RVVXV+3NFRUWq5x83blxs2bIlDhw4EC0tLdHY2BjnnHNOLFiw4ISOl+ABAACZlk9ykSvwPXZHVtGsqqrqk+Ady8SJE2PUqFHR3t7eZ3t7e3vU1tYe87iysrJ4+ctfHhERM2fOjJ///OfR1NR0wgmeFk0AACDTirGKZnl5ecyePTtaWlp6t+Xz+WhpaYn58+ef8Hny+fwxn/PrjwoeAADAIGhsbIylS5fGnDlzYu7cubF69ero7OyMhoaGiIi46qqrYvLkyb3P8TU1NcWcOXPi3HPPja6urvi3f/u3uO++++KLX/ziCV9TggcAAGTa4QpcYS2aJ/MevCVLlsTu3btjxYoV0dbWFjNnzowNGzb0Lryyffv2KCv7Y1NlZ2dnXHvttfGb3/wmTjvttJg2bVp8/etfjyVLlpzwNSV4AABApv3pKpiFnONkLF++PJYvX97vZw899FCfn2+//fa4/fbbT+o6R3gGDwAAICNOKsFrbm6OqVOnRmVlZcybNy8ee+yx3s++/OUvx4IFC6KqqipyuVzs3bs3rVgByCjzCgCDKUlplIIBJ3jr1q2LxsbGWLlyZWzevDlmzJgRCxcujF27dkVExMGDB+Otb31rfPzjH089WACyx7wCwGBL80Xnw92AE7xVq1bFsmXLoqGhIaZPnx5r1qyJ0aNHxz333BMRETfeeGPcdNNNcf7556ceLADZY14BgPQMKMHr7u6OTZs2RX19/R9PUFYW9fX10draelIBdHV1RUdHR58BwMhgXgFgSIygHs0BJXh79uyJnp6e3mU9j6ipqYm2traTCqCpqSmqq6t7R11d3UmdB4DSY14BYEik0Z6Z1RbNtN18882xb9++3rFjx45ihwRACTOvADCSDeg9eBMnToxRo0ZFe3t7n+3t7e1RW1t7UgFUVFRERUXFSR0LQGkzrwAwFA6/6Lzwc5SCAVXwysvLY/bs2dHS0tK7LZ/PR0tLS8yfPz/14ADINvMKAENhJK2iOaAKXkREY2NjLF26NObMmRNz586N1atXR2dnZzQ0NERERFtbW7S1tcVTTz0VERGPP/54jBs3LqZMmRITJkxIN3oASp55BQDSM+AEb8mSJbF79+5YsWJFtLW1xcyZM2PDhg29D8ivWbMmbr311t793/SmN0VExL333htXX311OlEDkBnmFQAGXRqLpJRIBS+XJMOrm7SjoyOqq6vjzROviVPKyosdTna88EKxI4AX19NT7Agy5YWkO1o6vh779u2LqqqqYodTVOaVQWJeYbgbVfS1BDPjhXx3tDxzb0nOKUfmgJd99ZYoG11Z0LnyBw/Frz/4qWF/H/zJBwAAyIgBt2gCAACUlDReVD6s+h6PTYIHAABkWhqrYJbKKppaNAEAADJCBQ8AAMi+EmmxLJQEDwAAyDQtmgAAAJQcFTwAACDbrKIJAACQFbk/jELPMfxp0QQAAMgIFTwAACDbtGgCAABkxAhK8LRoAgAAZIQKHgAAkG1J7vAo9BwlQIIHAABkWpIcHoWeoxRo0QQAAMgIFTwAACDbRtAiKxI8AAAg20bQM3haNAEAADJCBQ8AAMi0XHJ4FHqOUiDBAwAAsm0EPYOnRRMAACAjVPAAAIBsG0GLrEjwAACAbNOiCQAAQKlRwQMAALJtBFXwJHgAAEC2jaAET4smAABARqjgAQAA2WYVTQAAgGzIJYdHoecoBVo0AQAAMkIFDwAAyDaLrAAAAFBqJHgAAAAZMWxbNHv27Ilc7tRih5EZo8aPL3YImZK87Mxih5A5ZR0Hix1CpuTyXREdxY5imHmhO6I0FkArDTm/I2Z4S7q6ix1CZiRJ6d/LXKSwyEoqkQy+YZvgAQAApGIEvSbBr98AAAAyQgUPAADIthG0iqYEDwAAyLYRlOBp0QQAAMgIFTwAACDTckkKq2iWSAVPggcAAGSbFk0AAABKjQoeAACQbSOogifBAwAAMm0kPYOnRRMAACAjVPAAAIBsS3KHR6HnKAESPAAAINtG0DN4WjQBAAAyQgUPAADItJG0yIoEDwAAyDYtmgAAAJQaFTwAACDbUmjRVMEDAAAYDpKUxklobm6OqVOnRmVlZcybNy8ee+yxY+77la98Jd74xjfG+PHjY/z48VFfX/+i+/dHggcAADAI1q1bF42NjbFy5crYvHlzzJgxIxYuXBi7du3qd/+HHnoo3vOe98SPfvSjaG1tjbq6urjkkkvit7/97QlfU4IHAABkW5EqeKtWrYply5ZFQ0NDTJ8+PdasWROjR4+Oe+65p9/9//mf/zmuvfbamDlzZkybNi2++tWvRj6fj5aWlhO+pgQPAADItCOvSSh0RER0dHT0GV1dXf1es7u7OzZt2hT19fW928rKyqK+vj5aW1tPKO6DBw/G888/HxMmTDjh7yrBAwAAOEF1dXVRXV3dO5qamvrdb8+ePdHT0xM1NTV9ttfU1ERbW9sJXetjH/tYTJo0qU+SeDxW0QQAADhBO3bsiKqqqt6fKyoqBuU6n/70p+Ob3/xmPPTQQ1FZWXnCx0nwAACAbEvxRedVVVV9ErxjmThxYowaNSra29v7bG9vb4/a2toXPfbuu++OT3/60/HDH/4wXvva1w4oTC2aAAAAKSsvL4/Zs2f3WSDlyIIp8+fPP+Zxd955Z3zqU5+KDRs2xJw5cwZ8XRU8AAAg0/50kZRCzjFQjY2NsXTp0pgzZ07MnTs3Vq9eHZ2dndHQ0BAREVdddVVMnjy59zm+O+64I1asWBH3339/TJ06tfdZvbFjx8bYsWNP6JoSPAAAIPsKbdE8CUuWLIndu3fHihUroq2tLWbOnBkbNmzoXXhl+/btUVb2x6bKL37xi9Hd3R3vfve7+5xn5cqV8clPfvKErinBAwAAGCTLly+P5cuX9/vZQw891Ofnp59+uuDrSfAAAIBsS3GRleFOggcAAGRasZ7BKwaraAIAAGSECh4AAJBtWjQBAACyQYsmAAAAJUcFDwAAyDYtmgAAABkxghI8LZoAAAAZMeAE7+GHH45LL700Jk2aFLlcLtavX9/n8yRJYsWKFXHmmWfGaaedFvX19fHkk0+mFS8AGWNeAWCwHVlkpdBRCgac4HV2dsaMGTOiubm538/vvPPO+OxnPxtr1qyJRx99NMaMGRMLFy6MQ4cOFRwsANljXgFg0CUpjRIw4GfwFi1aFIsWLer3syRJYvXq1fGJT3wi3vnOd0ZExD/90z9FTU1NrF+/Pq688srCogUgc8wrAJCeVJ/B27ZtW7S1tUV9fX3vturq6pg3b160trb2e0xXV1d0dHT0GQAQYV4BICUjqIKXaoLX1tYWERE1NTV9ttfU1PR+9ueampqiurq6d9TV1aUZEgAlzLwCQBo8gzeEbr755ti3b1/v2LFjR7FDAqCEmVcAGMlSfQ9ebW1tRES0t7fHmWee2bu9vb09Zs6c2e8xFRUVUVFRkWYYAGSEeQWAVHgP3sk5++yzo7a2NlpaWnq3dXR0xKOPPhrz589P81IAjADmFQDSMJJaNAdcwTtw4EA89dRTvT9v27YttmzZEhMmTIgpU6bEjTfeGLfffnucd955cfbZZ8ctt9wSkyZNisWLF6cZNwAZYV4BgPQMOMHbuHFjXHTRRb0/NzY2RkTE0qVLY+3atfF3f/d30dnZGR/60Idi7969ccEFF8SGDRuisrIyvagByAzzCgCDbgS1aA44wVuwYEEkybG/XS6Xi9tuuy1uu+22ggIDYGQwrwAw6EZQglf0VTQBAABIR6qraAIAAAw3uT+MQs9RCiR4AABAtmnRBAAAoNSo4AEAAJmWxnvsMvsePAAAgJKiRRMAAIBSo4IHAABkX4lU4AolwQMAADJtJD2Dp0UTAAAgI1TwAACAbBtBi6xI8AAAgEzTogkAAEDJUcEDAACyTYsmAABANmjRBAAAoOSo4AEAANmmRRMAACAjRlCCp0UTAAAgI1TwAACATBtJi6xI8AAAgGzTogkAAECpUcEDAAAyLZckkUsKK8EVevxQkeABAADZpkUTAACAUqOCBwAAZJpVNAEAALJCiyYAAAClRgUPAADINC2aAAAAWaFFEwAAgFKjggcAAGSaFk0AAICs0KIJAABAqVHBAwAAMq9UWiwLNWwTvLue+GmMHafAmJYbX7Oo2CFkSlnHwWKHkDn/7yPrix1CpnTsz8f4VxQ7imEmV3Z4kI6enmJHkC2nVRY7gszJFTuADMkl+WKHULgkOTwKPUcJMNMBAABkxLCt4AEAAKTBKpoAAABZYRVNAAAASo0KHgAAkGm5/OFR6DlKgQQPAADINi2aAAAAlBoVPAAAINOsogkAAJAVXnQOAABAoZqbm2Pq1KlRWVkZ8+bNi8cee+yY+z7xxBNx+eWXx9SpUyOXy8Xq1asHfD0JHgAAkGlHWjQLHQO1bt26aGxsjJUrV8bmzZtjxowZsXDhwti1a1e/+x88eDDOOeec+PSnPx21tbUn9V0leAAAQLYlKY0BWrVqVSxbtiwaGhpi+vTpsWbNmhg9enTcc889/e7/+te/Pu6666648soro6KiYuAXDAkeAADACevo6Ogzurq6+t2vu7s7Nm3aFPX19b3bysrKor6+PlpbWwctPgkeAACQaWm2aNbV1UV1dXXvaGpq6veae/bsiZ6enqipqemzvaamJtra2gbtu1pFEwAAyLYUV9HcsWNHVFVV9W4+2VbKwSLBAwAAOEFVVVV9ErxjmThxYowaNSra29v7bG9vbz/pBVROhBZNAAAg04qximZ5eXnMnj07Wlpaerfl8/loaWmJ+fPnp/wN/0gFDwAAyLaTXAXzqHMMUGNjYyxdujTmzJkTc+fOjdWrV0dnZ2c0NDRERMRVV10VkydP7n2Or7u7O/73f/+3959/+9vfxpYtW2Ls2LHx8pe//ISuKcEDAAAYBEuWLIndu3fHihUroq2tLWbOnBkbNmzoXXhl+/btUVb2x6bKnTt3xqxZs3p/vvvuu+Puu++OCy+8MB566KETuqYEDwAAyLSTfVH5n5/jZCxfvjyWL1/e72d/nrRNnTo1kgIXg5HgAQAA2ZZPDo9Cz1ECLLICAACQESp4AABAthVpkZVikOABAACZlosUnsFLJZLBp0UTAAAgI1TwAACAbEuSw6PQc5QACR4AAJBpxXxNwlDTogkAAJARKngAAEC2WUUTAAAgG3JJErkCn6Er9PihokUTAAAgI1TwAACAbMv/YRR6jhIgwQMAADJNiyYAAAAlRwUPAADINqtoAgAAZESSHB6FnqMEaNEEAADICBU8AAAg03LJ4VHoOUrBgCt4Dz/8cFx66aUxadKkyOVysX79+j6fP/jgg3HJJZfEGWecEblcLrZs2ZJSqABkjTkFANI14ASvs7MzZsyYEc3Nzcf8/IILLog77rij4OAAyDZzCgBD4sgzeIWOEjDgFs1FixbFokWLjvn5+9///oiIePrpp086KABGBnMKAEMhlz88Cj1HKSj6M3hdXV3R1dXV+3NHR0cRowGg1JlXABjJir6KZlNTU1RXV/eOurq6YocEQAkzrwBwlBHUoln0BO/mm2+Offv29Y4dO3YUOyQASph5BYCjJCmNElD0Fs2KioqoqKgodhgAZIR5BYCRrOgJHgAAwGDKJUnkCmyxLPT4oTLgBO/AgQPx1FNP9f68bdu22LJlS0yYMCGmTJkSzz77bGzfvj127twZERFbt26NiIja2tqora1NKWwAssCcAsCQSOMZuhJJ8Ab8DN7GjRtj1qxZMWvWrIiIaGxsjFmzZsWKFSsiIuK73/1uzJo1K97+9rdHRMSVV14Zs2bNijVr1qQYNgBZYE4BgHQNuIK3YMGCSF4ke7366qvj6quvLiQmAEYIcwoAQyKJiELfY1caBTzP4AEAANk2kp7BK/prEgAAAEiHCh4AAJBtSaSwyEoqkQw6CR4AAJBtVtEEAACg1KjgAQAA2ZaPiFwK5ygBEjwAACDTrKIJAABAyVHBAwAAsm0ELbIiwQMAALJtBCV4WjQBAAAyQgUPAADIthFUwZPgAQAA2TaCXpOgRRMAACAjVPAAAIBMG0nvwZPgAQAA2TaCnsHTogkAAJARKngAAEC25ZOIXIEVuHxpVPAkeAAAQLZp0QQAAKDUqOABAAAZl0IFL0qjgifBAwAAsk2LJgAAAKVGBQ8AAMi2fBIFt1haRRMAAGAYSPKHR6HnKAFaNAEAADJCBQ8AAMi2EbTIigQPAADIthH0DJ4WTQAAgIxQwQMAALJNiyYAAEBGJJFCgpdKJINOiyYAAEBGqOABAADZpkUTAAAgI/L5iCjwReX50njR+bBL8JI/ZMYHDpTGDSwVLyTdxQ4hU3L5rmKHkDkd+/07n6aOP/wdmpTIbxsH05F74O/BlCU9xY4gW/Kemkld8nyxI8iMI39/mlNKw7BL8Pbv3x8RERfN213kSLLm68UOIFs6ih1A9ox/RbEjyKb9+/dHdXV1scMoqiPzyo/3fqPIkcCLMK9QAkp6Tilii2Zzc3Pcdddd0dbWFjNmzIjPfe5zMXfu3GPu/8ADD8Qtt9wSTz/9dJx33nlxxx13xNve9rYTvt6wS/AmTZoUO3bsiHHjxkUulyt2OC+qo6Mj6urqYseOHVFVVVXscEqe+5k+9zRdpXQ/kySJ/fv3x6RJk4odStGZV0Yu9zN97mm6SuV+ZmJOKVKCt27dumhsbIw1a9bEvHnzYvXq1bFw4cLYunVrvPSlLz1q/5/85Cfxnve8J5qamuId73hH3H///bF48eLYvHlzvPrVrz6ha+YStdaT1tHREdXV1bFv375h/S9lqXA/0+eepsv9ZLD5M5Yu9zN97mm63M/Bd+Qe10/8QJxSVl7QuV7Id8cP99wzoP+/5s2bF69//evj85//fERE5PP5qKuri+uvvz5uuummo/ZfsmRJdHZ2xr/+67/2bjv//PNj5syZsWbNmhO6poZvAAAg2/JJOmMAuru7Y9OmTVFfX9+7raysLOrr66O1tbXfY1pbW/vsHxGxcOHCY+7fn2HXogkAAJCmJMlHkhS2oNuR4zs6+j40W1FRERUVFUftv2fPnujp6Ymampo+22tqauIXv/hFv9doa2vrd/+2trYTjlMFrwAVFRWxcuXKfv8PZeDcz/S5p+lyPxls/oyly/1Mn3uaLvezNNXV1UV1dXXvaGpqKnZIfXgGDwAAyKQjz+C9+fSr4pRcgc/gJd3RsvefjloU51gVvO7u7hg9enR861vfisWLF/duX7p0aezduze+853vHHXMlClTorGxMW688cbebStXroz169fHz372sxOKUwUPAADItiOraBY6IqKqqqrPOFYFtry8PGbPnh0tLS292/L5fLS0tMT8+fP7PWb+/Pl99o+I+MEPfnDM/fvjGTwAAIBB0NjYGEuXLo05c+bE3LlzY/Xq1dHZ2RkNDQ0REXHVVVfF5MmTe9s8b7jhhrjwwgvjM5/5TLz97W+Pb37zm7Fx48b48pe/fMLXlOABAADZls9H5ApbZCVOYpGWJUuWxO7du2PFihXR1tYWM2fOjA0bNvQupLJ9+/YoK/tjU+Ub3vCGuP/+++MTn/hEfPzjH4/zzjsv1q9ff8LvwIvwDB4AAJBRvc/gjX1vOs/gHbh/2L+30DN4J6i5uTmmTp0alZWVMW/evHjsscd6Pzt06FBcd911ccYZZ8TYsWPj8ssvj/b29iJGO/y92P388pe/HAsWLIiqqqrI5XKxd+/e4gVaIh5++OG49NJLY9KkSZHL5WL9+vV9Pk+SJFasWBFnnnlmnHbaaVFfXx9PPvlkcYItAce7nw8++GBccsklccYZZ0Qul4stW7YUJU5Km3klXeaV9JhT0mdeYShJ8E7AunXrorGxMVauXBmbN2+OGTNmxMKFC2PXrl0REfGRj3wkvve978UDDzwQP/7xj2Pnzp1x2WWXFTnq4et49/PgwYPx1re+NT7+8Y8XOdLS0dnZGTNmzIjm5uZ+P7/zzjvjs5/9bKxZsyYeffTRGDNmTCxcuDAOHTo0xJGWhuPdz87OzrjgggvijjvuGOLIyArzSrrMK+kyp6TPvFJ8ST6fyigJCcc1d+7c5Lrrruv9uaenJ5k0aVLS1NSU7N27Nzn11FOTBx54oPfzn//850lEJK2trcUId9h7sfv5p370ox8lEZE899xzQxxhaYuI5Nvf/nbvz/l8PqmtrU3uuuuu3m179+5NKioqkm984xtFiLC0/Pn9/FPbtm1LIiL5r//6ryGNidJnXkmXeWXwmFPSZ14ZWvv27UsiIrn4tCXJJaPfX9C4+LQlSUQk+/btK/bXelEqeMfR3d0dmzZtivr6+t5tZWVlUV9fH62trbFp06Z4/vnn+3w+bdq0mDJlSrS2thYj5GHtePeT9G3bti3a2tr63PPq6uqYN2+eew5FYF5Jl3llaJlTYPiT4B3Hnj17oqenp3elmyNqamqira0t2traory8PE4//fR+P6ev491P0nfkvrrnMDyYV9JlXhla5hRKVj5JZ5QAr0kAAACyLUkiotDXJJRGgqeCdxwTJ06MUaNGHbV6WXt7e9TW1kZtbW10d3cftSLXkc/p63j3k/Qdua/uOQwP5pV0mVeGljkFhj8J3nGUl5fH7Nmzo6WlpXdbPp+PlpaWmD9/fsyePTtOPfXUPp9v3bo1tm/fHvPnzy9GyMPa8e4n6Tv77LOjtra2zz3v6OiIRx991D2HIjCvpMu8MrTMKZSqJJ+kMkqBFs0T0NjYGEuXLo05c+bE3LlzY/Xq1dHZ2RkNDQ1RXV0d11xzTTQ2NsaECROiqqoqrr/++pg/f36cf/75xQ59WHqx+xkRvc+gPPXUUxER8fjjj8e4ceNiypQpMWHChGKGPmwdOHCg935FHH4IfsuWLTFhwoSYMmVK3HjjjXH77bfHeeedF2effXbccsstMWnSpFi8eHHxgh7Gjnc/n3322di+fXvs3LkzIg7/x3dE9FZf4HjMK+kyr6TLnJI+88owkOSj8BZNr0nIlM997nPJlClTkvLy8mTu3LnJT3/6097Pfv/73yfXXnttMn78+GT06NHJu971ruR3v/tdEaMd/l7sfq5cuTKJiKPGvffeW7yAh7kjS3//+Vi6dGmSJIeXtb7llluSmpqapKKiInnzm9+cbN26tbhBD2PHu5/33ntvv5+vXLmyqHFTWswr6TKvpMeckj7zSvEceU3CRaMuS95yypKCxkWjLiuJ1yTkkqREnhYEAAAYgI6Ojqiuro4FuXfFKblTCzrXC8nz8VDy7di3b19UVVWlFGH6tGgCAADZNoJaNCV4AABApr0Qzx9ufC30HCVAggcAAGRSeXl51NbWxiNt/5bK+Wpra6O8vDyVcw0Wz+ABAACZdejQoeju7k7lXOXl5VFZWZnKuQaLBA8AACAjvOgcAAAgIyR4AAAAGSHBAwAAyAgJHgAAQEZI8AAAADJCggcAAJAREjwAAICM+P8BfRBjUTsLYzoAAAAASUVORK5CYII=",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"tomo = StateTomography(2, bell_circuit, imperfect_exp.experiment)\n",
"\n",
"rho = tomo.process()\n",
"\n",
"print(f\"Fidelity = {round(tomo.fidelity(rho_exp) * 100, 4)} %\")\n",
"\n",
"plot_density_matrix(rho)\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "venv",
"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.11.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}