{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "xLOXFOT5Q40E" }, "source": [ "##### Copyright 2020 The TensorFlow Authors." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "cellView": "form", "execution": { "iopub.execute_input": "2024-05-18T11:48:04.298418Z", "iopub.status.busy": "2024-05-18T11:48:04.297925Z", "iopub.status.idle": "2024-05-18T11:48:04.302069Z", "shell.execute_reply": "2024-05-18T11:48:04.301396Z" }, "id": "iiQkM5ZgQ8r2" }, "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", "# You may obtain a copy of the License at\n", "#\n", "# https://www.apache.org/licenses/LICENSE-2.0\n", "#\n", "# Unless required by applicable law or agreed to in writing, software\n", "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", "# See the License for the specific language governing permissions and\n", "# limitations under the License." ] }, { "cell_type": "markdown", "metadata": { "id": "UndbWF_UpN-X" }, "source": [ "# Noise" ] }, { "cell_type": "markdown", "metadata": { "id": "i9Jcnb8bQQyd" }, "source": [ "
\n",
" ![]() | \n",
" \n",
" ![]() | \n",
" \n",
" ![]() | \n",
" \n",
" ![]() | \n",
"
(0, 0): ───X───\n", "\n", "(0, 1): ───X───" ], "text/plain": [ "(0, 0): ───X───\n", "\n", "(0, 1): ───X───" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def x_circuit(qubits):\n", " \"\"\"Produces an X wall circuit on `qubits`.\"\"\"\n", " return cirq.Circuit(cirq.X.on_each(*qubits))\n", "\n", "def make_noisy(circuit, p):\n", " \"\"\"Add a depolarization channel to all qubits in `circuit` before measurement.\"\"\"\n", " return circuit + cirq.Circuit(cirq.depolarize(p).on_each(*circuit.all_qubits()))\n", "\n", "my_qubits = cirq.GridQubit.rect(1, 2)\n", "my_circuit = x_circuit(my_qubits)\n", "my_noisy_circuit = make_noisy(my_circuit, 0.5)\n", "my_circuit" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2024-05-18T11:48:49.836307Z", "iopub.status.busy": "2024-05-18T11:48:49.835855Z", "iopub.status.idle": "2024-05-18T11:48:49.841774Z", "shell.execute_reply": "2024-05-18T11:48:49.841093Z" }, "id": "1B7vmyPm_TQ7" }, "outputs": [ { "data": { "text/html": [ "
(0, 0): ───X───D(0.5)───\n", "\n", "(0, 1): ───X───D(0.5)───" ], "text/plain": [ "(0, 0): ───X───D(0.5)───\n", "\n", "(0, 1): ───X───D(0.5)───" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "my_noisy_circuit" ] }, { "cell_type": "markdown", "metadata": { "id": "EejhXc2e9Cl8" }, "source": [ "You can examine the noiseless density matrix $\\rho$ with:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2024-05-18T11:48:49.845080Z", "iopub.status.busy": "2024-05-18T11:48:49.844621Z", "iopub.status.idle": "2024-05-18T11:48:49.853022Z", "shell.execute_reply": "2024-05-18T11:48:49.852326Z" }, "id": "0QN9W69U8v_V" }, "outputs": [ { "data": { "text/plain": [ "array([[0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],\n", " [0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],\n", " [0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],\n", " [0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j]], dtype=complex64)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rho = cirq.final_density_matrix(my_circuit)\n", "np.round(rho, 3)" ] }, { "cell_type": "markdown", "metadata": { "id": "RHHBeizr-DEo" }, "source": [ "And the noisy density matrix $\\rho$ with:\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2024-05-18T11:48:49.856370Z", "iopub.status.busy": "2024-05-18T11:48:49.855912Z", "iopub.status.idle": "2024-05-18T11:48:49.864848Z", "shell.execute_reply": "2024-05-18T11:48:49.864182Z" }, "id": "zSD9H8SC9IJ1" }, "outputs": [ { "data": { "text/plain": [ "array([[0.111+0.j, 0. +0.j, 0. +0.j, 0. +0.j],\n", " [0. +0.j, 0.222+0.j, 0. +0.j, 0. +0.j],\n", " [0. +0.j, 0. +0.j, 0.222+0.j, 0. +0.j],\n", " [0. +0.j, 0. +0.j, 0. +0.j, 0.444+0.j]], dtype=complex64)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rho = cirq.final_density_matrix(my_noisy_circuit)\n", "np.round(rho, 3)" ] }, { "cell_type": "markdown", "metadata": { "id": "2YWiejLl-a0Z" }, "source": [ "Comparing the two different $ \\rho $ 's you can see that the noise has impacted the amplitudes of the state (and consequently sampling probabilities). In the noiseless case you would always expect to sample the $ |11\\rangle $ state. But in the noisy state there is now a nonzero probability of sampling $ |00\\rangle $ or $ |01\\rangle $ or $ |10\\rangle $ as well:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2024-05-18T11:48:49.868162Z", "iopub.status.busy": "2024-05-18T11:48:49.867731Z", "iopub.status.idle": "2024-05-18T11:48:50.073890Z", "shell.execute_reply": "2024-05-18T11:48:50.073239Z" }, "id": "Z4uj-Zs0AE3n" }, "outputs": [ { "data": { "image/png": "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vffesy0rLCy0hoeHW2+44Qbbsqrf8+bNm23Lfvk7qponODjYeurUKdvyv//971ZJ1nXr1tmWdenSxXrttddaz5w5Y1u2ZcsWq6Rqv3cAqG/4ah8A1AOtW7fWPffco7feeks5OTk1bvOPf/xDkpSSkmK3/JFHHpH009WB82natKm+++67Gr+aVWXMmDEqLS3V3/72N9uylStXqqKiQqNHj77g/EVFRWrSpMkFt6mNpKQk+fj42F7v2bNHx44d06RJk6o9CMJisVzy8Rwxc+ZMLV++XDfccIM2btyoxx9/XLGxsbrxxht14MAB23bu7u62e8EqKyt16tQpVVRUqFu3btq9e3e1/f7mN79RQECA7XX37t0lSaNHj7Z7OEb37t1VVlZW7UmPERERdlcT/f39NWbMGO3Zs0e5ubnGn3PkyJEKDAy0vb7lllskSd98840kKTs7W/v379eYMWPUuHFj23a9e/dWly5djI8HAK6GkAKAemLatGmqqKg4771S3377rdzc3NS2bVu75WFhYWratKm+/fbb8+77scceU+PGjXXzzTerXbt2Gj9+vP71r3/ZbdOxY0fddNNNWrZsmW3ZsmXL1KNHj2rH/CV/f3+dOXPmYh/xoqKiouxeHz16VJJc7jHwd955pz799FOdPn1aH330ke666y7t2bNHgwcP1tmzZ23bLV68WNdff728vb0VHBys5s2b64MPPlBhYWG1fbZo0cLudVVURUZG1rj89OnTdsvbtm1bLS7bt28vSee95+tCfjlPVVRVHbfqfKvp3LjY+QIA9QEhBQD1ROvWrTV69OgLXpWSHLsS06lTJx06dEgrVqxQr1699N5776lXr16aMWOG3XZjxozR1q1b9d133+no0aP67LPPLno1Svopwg4fPqyysjLj2X7u51ejTJzvd3Lu3LlLGeei/P39ddttt2nZsmVKSkrS0aNHlZmZKUlaunSpxo4dqzZt2mjRokXasGGDNm3apFtvvbXGx427u7vXeIzzLbdarXX3QVzouADgKggpAKhHqq5KPfvss9XWtWzZUpWVlfr666/tlufl5amgoEAtW7a84L79/Pw0cuRIpaamKisrS4mJiXrmmWfsrqCMGjVK7u7uevfdd7Vs2TI1atRII0eOvOjcgwcP1o8//qj33nuvlp+0dtq0aSNJ+vLLLy+4XWBgYI1/UPdCV+mq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XTk6evSoKioqNHz4cLVs2VKS1KVLF9v7fHx8VFpaqrCwsGrHnjRpkoYPH37B+SorK5WWlqYmTZpIku655x6lp6frmWee0ZkzZ7R48WItX75c/fr1kySlpqYqIiLCgd8EAMCVcEUKAODS+vbtq71792rv3r3asWOHEhISNHDgQH377be1en/Xrl3Vr18/denSRb/5zW+0cOFCnT59ulbv7dat20W3adWqlS2iJCk8PFz5+fmSpG+++Ubl5eW6+eabbesDAgLUoUOHWh0fAOC6CCkAgEvz8/NT27Zt1bZtW9100016++23VVJSooULF9bq/e7u7tq0aZM+/PBDRUdH69VXX1WHDh107NixWh37Yho1amT32mKxqLKyslazAQDqL0IKAFCvWCwWubm56ccff6y2ztPTU5J07ty5au/p2bOnZs6cqT179sjT01Nr1qyxveeX29eV1q1bq1GjRtq5c6dtWWFhIY9QB4AGgHukAAAurbS0VLm5uZKk06dP67XXXlNxcbEGDx5cbduWLVvKYrFo/fr1GjRokHx8fPTVV18pPT1d/fv3V0hIiDIzM3Xy5El16tRJ0k9fzdu4caMOHTqk4OBgBQQE1NnsTZo0UVJSkh599FEFBQUpJCREM2bMkJubmywWS50dBwBw5XFFCgDg0jZs2KDw8HCFh4ere/fu2rlzp1atWqU+ffpU2/aaa67RzJkzNWXKFIWGhurBBx+Uv7+/tm3bpkGDBql9+/aaNm2aXnjhBQ0cOFCSdN9996lDhw7q1q2bmjdvrn/96191Ov+8efMUFxen22+/XfHx8erZs6c6deokb2/vOj0OAODKslitVquzhwAA4GpRUlKia665Ri+88IKSk5OdPQ4AwEF8tQ8AgMtoz549OnjwoG6++WYVFhbqqaeekiQNGTLEyZMBAC4FIQUAwGX2/PPP69ChQ/L09FRsbKw+/fRTNWvWzNljAQAuAV/tAwAAAABDPGwCAAAAAAwRUgAAAABgiJACAAAAAEOEFAAAAAAYIqQAAAAAwBAhBQAAAACGCCkAAAAAMERIAQAAAICh/wOXPNAGTVo4uAAAAABJRU5ErkJggg==", "text/plain": [ "
┌──────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐\n", "(0, 0): ───X───H───@─────────────ZZ───────────────────────YY─────────────────────────XX─────────────ZZ──────────YY──────────XX────────────────────ZZ─────────────────────YY─────────────────────XX───────────ZZ─────────YY───────────XX─────────────────────ZZ─────────────────────YY─────────────────────XX───────────ZZ─────────YY───────────XX─────────────────────ZZ─────────────────────YY─────────────────────XX───────────ZZ──────────YY──────────XX──────────\n", " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │\n", "(0, 1): ───X───────X────ZZ───────┼─────────────YY─────────┼───────────────XX─────────┼──────────────ZZ^-0.941───YY^-0.767───XX^-0.767────ZZ───────┼─────────────YY───────┼─────────────XX───────┼────────────ZZ^-0.98───YY^(-9/11)───XX^(-9/11)────ZZ───────┼─────────────YY───────┼─────────────XX───────┼────────────ZZ^-0.98───YY^(-9/11)───XX^(-9/11)────ZZ───────┼─────────────YY───────┼─────────────XX───────┼────────────ZZ^-0.985───YY^-0.901───XX^-0.901───\n", " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │\n", "(0, 2): ───X───H───@────ZZ^-0.977┼─────────────YY^(-10/11)┼───────────────XX^(-10/11)┼──────────────ZZ──────────YY──────────XX───────────ZZ^-0.968┼─────────────YY^-0.898┼─────────────XX^-0.898┼────────────ZZ─────────YY───────────XX────────────ZZ^-0.962┼─────────────YY^-0.869┼─────────────XX^-0.869┼────────────ZZ─────────YY───────────XX────────────ZZ^-0.954┼─────────────YY^-0.904┼─────────────XX^-0.904┼────────────ZZ──────────YY──────────XX──────────\n", " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │\n", "(0, 3): ───X───────X────ZZ───────┼─────────────YY─────────┼───────────────XX─────────┼──────────────ZZ^-0.941───YY^-0.767───XX^-0.767────ZZ───────┼─────────────YY───────┼─────────────XX───────┼────────────ZZ^-0.98───YY^(-9/11)───XX^(-9/11)────ZZ───────┼─────────────YY───────┼─────────────XX───────┼────────────ZZ^-0.98───YY^(-9/11)───XX^(-9/11)────ZZ───────┼─────────────YY───────┼─────────────XX───────┼────────────ZZ^-0.985───YY^-0.901───XX^-0.901───\n", " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │\n", "(0, 4): ───X───H───@────ZZ^-0.977┼─────────────YY^(-10/11)┼───────────────XX^(-10/11)┼──────────────ZZ──────────YY──────────XX───────────ZZ^-0.968┼─────────────YY^-0.898┼─────────────XX^-0.898┼────────────ZZ─────────YY───────────XX────────────ZZ^-0.962┼─────────────YY^-0.869┼─────────────XX^-0.869┼────────────ZZ─────────YY───────────XX────────────ZZ^-0.954┼─────────────YY^-0.904┼─────────────XX^-0.904┼────────────ZZ──────────YY──────────XX──────────\n", " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │\n", "(0, 5): ───X───────X────ZZ───────┼─────────────YY─────────┼───────────────XX─────────┼──────────────ZZ^-0.941───YY^-0.767───XX^-0.767────ZZ───────┼─────────────YY───────┼─────────────XX───────┼────────────ZZ^-0.98───YY^(-9/11)───XX^(-9/11)────ZZ───────┼─────────────YY───────┼─────────────XX───────┼────────────ZZ^-0.98───YY^(-9/11)───XX^(-9/11)────ZZ───────┼─────────────YY───────┼─────────────XX───────┼────────────ZZ^-0.985───YY^-0.901───XX^-0.901───\n", " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │\n", "(0, 6): ───X───H───@────ZZ^-0.977┼─────────────YY^(-10/11)┼───────────────XX^(-10/11)┼──────────────ZZ──────────YY──────────XX───────────ZZ^-0.968┼─────────────YY^-0.898┼─────────────XX^-0.898┼────────────ZZ─────────YY───────────XX────────────ZZ^-0.962┼─────────────YY^-0.869┼─────────────XX^-0.869┼────────────ZZ─────────YY───────────XX────────────ZZ^-0.954┼─────────────YY^-0.904┼─────────────XX^-0.904┼────────────ZZ──────────YY──────────XX──────────\n", " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │\n", "(0, 7): ───X───────X─────────────ZZ^-0.977────────────────YY^(-10/11)────────────────XX^(-10/11)────ZZ^-0.941───YY^-0.767───XX^-0.767─────────────ZZ^-0.968──────────────YY^-0.898──────────────XX^-0.898────ZZ^-0.98───YY^(-9/11)───XX^(-9/11)─────────────ZZ^-0.962──────────────YY^-0.869──────────────XX^-0.869────ZZ^-0.98───YY^(-9/11)───XX^(-9/11)─────────────ZZ^-0.954──────────────YY^-0.904──────────────XX^-0.904────ZZ^-0.985───YY^-0.901───XX^-0.901───\n", " └──────────────────┘ └──────────────────────┘ └──────────────────────┘ └──────────────────┘ └──────────────────┘ └──────────────────┘ └──────────────────┘ └──────────────────┘ └──────────────────┘ └──────────────────┘ └──────────────────┘ └──────────────────┘" ], "text/plain": [ " ┌──────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐\n", "(0, 0): ───X───H───@─────────────ZZ───────────────────────YY─────────────────────────XX─────────────ZZ──────────YY──────────XX────────────────────ZZ─────────────────────YY─────────────────────XX───────────ZZ─────────YY───────────XX─────────────────────ZZ─────────────────────YY─────────────────────XX───────────ZZ─────────YY───────────XX─────────────────────ZZ─────────────────────YY─────────────────────XX───────────ZZ──────────YY──────────XX──────────\n", " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │\n", "(0, 1): ───X───────X────ZZ───────┼─────────────YY─────────┼───────────────XX─────────┼──────────────ZZ^-0.941───YY^-0.767───XX^-0.767────ZZ───────┼─────────────YY───────┼─────────────XX───────┼────────────ZZ^-0.98───YY^(-9/11)───XX^(-9/11)────ZZ───────┼─────────────YY───────┼─────────────XX───────┼────────────ZZ^-0.98───YY^(-9/11)───XX^(-9/11)────ZZ───────┼─────────────YY───────┼─────────────XX───────┼────────────ZZ^-0.985───YY^-0.901───XX^-0.901───\n", " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │\n", "(0, 2): ───X───H───@────ZZ^-0.977┼─────────────YY^(-10/11)┼───────────────XX^(-10/11)┼──────────────ZZ──────────YY──────────XX───────────ZZ^-0.968┼─────────────YY^-0.898┼─────────────XX^-0.898┼────────────ZZ─────────YY───────────XX────────────ZZ^-0.962┼─────────────YY^-0.869┼─────────────XX^-0.869┼────────────ZZ─────────YY───────────XX────────────ZZ^-0.954┼─────────────YY^-0.904┼─────────────XX^-0.904┼────────────ZZ──────────YY──────────XX──────────\n", " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │\n", "(0, 3): ───X───────X────ZZ───────┼─────────────YY─────────┼───────────────XX─────────┼──────────────ZZ^-0.941───YY^-0.767───XX^-0.767────ZZ───────┼─────────────YY───────┼─────────────XX───────┼────────────ZZ^-0.98───YY^(-9/11)───XX^(-9/11)────ZZ───────┼─────────────YY───────┼─────────────XX───────┼────────────ZZ^-0.98───YY^(-9/11)───XX^(-9/11)────ZZ───────┼─────────────YY───────┼─────────────XX───────┼────────────ZZ^-0.985───YY^-0.901───XX^-0.901───\n", " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │\n", "(0, 4): ───X───H───@────ZZ^-0.977┼─────────────YY^(-10/11)┼───────────────XX^(-10/11)┼──────────────ZZ──────────YY──────────XX───────────ZZ^-0.968┼─────────────YY^-0.898┼─────────────XX^-0.898┼────────────ZZ─────────YY───────────XX────────────ZZ^-0.962┼─────────────YY^-0.869┼─────────────XX^-0.869┼────────────ZZ─────────YY───────────XX────────────ZZ^-0.954┼─────────────YY^-0.904┼─────────────XX^-0.904┼────────────ZZ──────────YY──────────XX──────────\n", " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │\n", "(0, 5): ───X───────X────ZZ───────┼─────────────YY─────────┼───────────────XX─────────┼──────────────ZZ^-0.941───YY^-0.767───XX^-0.767────ZZ───────┼─────────────YY───────┼─────────────XX───────┼────────────ZZ^-0.98───YY^(-9/11)───XX^(-9/11)────ZZ───────┼─────────────YY───────┼─────────────XX───────┼────────────ZZ^-0.98───YY^(-9/11)───XX^(-9/11)────ZZ───────┼─────────────YY───────┼─────────────XX───────┼────────────ZZ^-0.985───YY^-0.901───XX^-0.901───\n", " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │\n", "(0, 6): ───X───H───@────ZZ^-0.977┼─────────────YY^(-10/11)┼───────────────XX^(-10/11)┼──────────────ZZ──────────YY──────────XX───────────ZZ^-0.968┼─────────────YY^-0.898┼─────────────XX^-0.898┼────────────ZZ─────────YY───────────XX────────────ZZ^-0.962┼─────────────YY^-0.869┼─────────────XX^-0.869┼────────────ZZ─────────YY───────────XX────────────ZZ^-0.954┼─────────────YY^-0.904┼─────────────XX^-0.904┼────────────ZZ──────────YY──────────XX──────────\n", " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │\n", "(0, 7): ───X───────X─────────────ZZ^-0.977────────────────YY^(-10/11)────────────────XX^(-10/11)────ZZ^-0.941───YY^-0.767───XX^-0.767─────────────ZZ^-0.968──────────────YY^-0.898──────────────XX^-0.898────ZZ^-0.98───YY^(-9/11)───XX^(-9/11)─────────────ZZ^-0.962──────────────YY^-0.869──────────────XX^-0.869────ZZ^-0.98───YY^(-9/11)───XX^(-9/11)─────────────ZZ^-0.954──────────────YY^-0.904──────────────XX^-0.904────ZZ^-0.985───YY^-0.901───XX^-0.901───\n", " └──────────────────┘ └──────────────────────┘ └──────────────────────┘ └──────────────────┘ └──────────────────┘ └──────────────────┘ └──────────────────┘ └──────────────────┘ └──────────────────┘ └──────────────────┘ └──────────────────┘ └──────────────────┘" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "qubits = cirq.GridQubit.rect(1, 8)\n", "circuits, labels, pauli_sums, _ = tfq.datasets.xxz_chain(qubits, 'closed')\n", "circuits[0]" ] }, { "cell_type": "markdown", "metadata": { "id": "MFgNU_nBGeTm" }, "source": [ "Writing a small helper function will help to generate the data for the noisy vs noiseless case:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "execution": { "iopub.execute_input": "2024-05-18T11:48:55.777006Z", "iopub.status.busy": "2024-05-18T11:48:55.776358Z", "iopub.status.idle": "2024-05-18T11:48:55.781754Z", "shell.execute_reply": "2024-05-18T11:48:55.781078Z" }, "id": "zkQofAqqGibQ" }, "outputs": [], "source": [ "def get_data(qubits, depolarize_p=0.):\n", " \"\"\"Return quantum data circuits and labels in `tf.Tensor` form.\"\"\"\n", " circuits, labels, pauli_sums, _ = tfq.datasets.xxz_chain(qubits, 'closed')\n", " if depolarize_p >= 1e-5:\n", " circuits = [circuit.with_noise(cirq.depolarize(depolarize_p)) for circuit in circuits]\n", " tmp = list(zip(circuits, labels))\n", " random.shuffle(tmp)\n", " circuits_tensor = tfq.convert_to_tensor([x[0] for x in tmp])\n", " labels_tensor = tf.convert_to_tensor([x[1] for x in tmp])\n", "\n", " return circuits_tensor, labels_tensor" ] }, { "cell_type": "markdown", "metadata": { "id": "FtJrfsLCF9Z3" }, "source": [ "### 3.2 Define a model circuit\n", "Now that you have quantum data in the form of circuits, you will need a circuit to model this data, like with the data you can write a helper function to generate this circuit optionally containing noise:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "execution": { "iopub.execute_input": "2024-05-18T11:48:55.785230Z", "iopub.status.busy": "2024-05-18T11:48:55.784662Z", "iopub.status.idle": "2024-05-18T11:48:55.808296Z", "shell.execute_reply": "2024-05-18T11:48:55.807647Z" }, "id": "TwryFaFIG2Ya" }, "outputs": [ { "data": { "text/html": [ "
(0, 0): ───H───@───────X^(layer-0)───@───────Y^(layer-1)───@───────X^(layer-2)───\n", " │ │ │\n", "(0, 1): ───H───X───@───X^(layer-0)───X───@───Y^(layer-1)───X───@───X^(layer-2)───\n", " │ │ │\n", "(0, 2): ───H───@───X───X^(layer-0)───@───X───Y^(layer-1)───@───X───X^(layer-2)───\n", " │ │ │\n", "(0, 3): ───H───X───@───X^(layer-0)───X───@───Y^(layer-1)───X───@───X^(layer-2)───\n", " │ │ │\n", "(0, 4): ───H───@───X───X^(layer-0)───@───X───Y^(layer-1)───@───X───X^(layer-2)───\n", " │ │ │\n", "(0, 5): ───H───X───@───X^(layer-0)───X───@───Y^(layer-1)───X───@───X^(layer-2)───\n", " │ │ │\n", "(0, 6): ───H───@───X───X^(layer-0)───@───X───Y^(layer-1)───@───X───X^(layer-2)───\n", " │ │ │\n", "(0, 7): ───H───X───────X^(layer-0)───X───────Y^(layer-1)───X───────X^(layer-2)───" ], "text/plain": [ "(0, 0): ───H───@───────X^(layer-0)───@───────Y^(layer-1)───@───────X^(layer-2)───\n", " │ │ │\n", "(0, 1): ───H───X───@───X^(layer-0)───X───@───Y^(layer-1)───X───@───X^(layer-2)───\n", " │ │ │\n", "(0, 2): ───H───@───X───X^(layer-0)───@───X───Y^(layer-1)───@───X───X^(layer-2)───\n", " │ │ │\n", "(0, 3): ───H───X───@───X^(layer-0)───X───@───Y^(layer-1)───X───@───X^(layer-2)───\n", " │ │ │\n", "(0, 4): ───H───@───X───X^(layer-0)───@───X───Y^(layer-1)───@───X───X^(layer-2)───\n", " │ │ │\n", "(0, 5): ───H───X───@───X^(layer-0)───X───@───Y^(layer-1)───X───@───X^(layer-2)───\n", " │ │ │\n", "(0, 6): ───H───@───X───X^(layer-0)───@───X───Y^(layer-1)───@───X───X^(layer-2)───\n", " │ │ │\n", "(0, 7): ───H───X───────X^(layer-0)───X───────Y^(layer-1)───X───────X^(layer-2)───" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def modelling_circuit(qubits, depth, depolarize_p=0.):\n", " \"\"\"A simple classifier circuit.\"\"\"\n", " dim = len(qubits)\n", " ret = cirq.Circuit(cirq.H.on_each(*qubits))\n", "\n", " for i in range(depth):\n", " # Entangle layer.\n", " ret += cirq.Circuit(cirq.CX(q1, q2) for (q1, q2) in zip(qubits[::2], qubits[1::2]))\n", " ret += cirq.Circuit(cirq.CX(q1, q2) for (q1, q2) in zip(qubits[1::2], qubits[2::2]))\n", " # Learnable rotation layer.\n", " # i_params = sympy.symbols(f'layer-{i}-0:{dim}')\n", " param = sympy.Symbol(f'layer-{i}')\n", " single_qb = cirq.X\n", " if i % 2 == 1:\n", " single_qb = cirq.Y\n", " ret += cirq.Circuit(single_qb(q) ** param for q in qubits)\n", " \n", " if depolarize_p >= 1e-5:\n", " ret = ret.with_noise(cirq.depolarize(depolarize_p))\n", "\n", " return ret, [op(q) for q in qubits for op in [cirq.X, cirq.Y, cirq.Z]]\n", "\n", "modelling_circuit(qubits, 3)[0]" ] }, { "cell_type": "markdown", "metadata": { "id": "U-ZMaCpJI9TH" }, "source": [ "### 3.3 Model building and training\n", "With your data and model circuit built, the final helper function you will need is one that can assemble both a noisy or a noiseless hybrid quantum `tf.keras.Model`:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "execution": { "iopub.execute_input": "2024-05-18T11:48:55.811681Z", "iopub.status.busy": "2024-05-18T11:48:55.811144Z", "iopub.status.idle": "2024-05-18T11:48:55.816494Z", "shell.execute_reply": "2024-05-18T11:48:55.815851Z" }, "id": "r09CT5N9DWa_" }, "outputs": [], "source": [ "def build_keras_model(qubits, depolarize_p=0.):\n", " \"\"\"Prepare a noisy hybrid quantum classical Keras model.\"\"\"\n", " spin_input = tf.keras.Input(shape=(), dtype=tf.dtypes.string)\n", "\n", " circuit_and_readout = modelling_circuit(qubits, 4, depolarize_p)\n", " if depolarize_p >= 1e-5:\n", " quantum_model = tfq.layers.NoisyPQC(*circuit_and_readout, sample_based=False, repetitions=10)(spin_input)\n", " else:\n", " quantum_model = tfq.layers.PQC(*circuit_and_readout)(spin_input)\n", "\n", " intermediate = tf.keras.layers.Dense(4, activation='sigmoid')(quantum_model)\n", " post_process = tf.keras.layers.Dense(1)(intermediate)\n", "\n", " return tf.keras.Model(inputs=[spin_input], outputs=[post_process])" ] }, { "cell_type": "markdown", "metadata": { "id": "QbMtT7BZmhfm" }, "source": [ "## 4. Compare performance\n", "\n", "### 4.1 Noiseless baseline\n", "\n", "With your data generation and model building code, you can now compare and contrast model performance in the noiseless and noisy settings, first you can run a reference noiseless training:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "execution": { "iopub.execute_input": "2024-05-18T11:48:55.819755Z", "iopub.status.busy": "2024-05-18T11:48:55.819313Z", "iopub.status.idle": "2024-05-18T11:48:56.977630Z", "shell.execute_reply": "2024-05-18T11:48:56.976666Z" }, "id": "QAgpq9c-EakW" }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "