MAXCUT_EN.ipynb 66.3 KB
Notebook
Newer Older
Q
Quleaf 已提交
1 2 3 4
{
 "cells": [
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
5 6 7 8 9 10
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-06T07:10:17.389768Z",
     "start_time": "2021-01-06T07:10:17.379639Z"
    }
   },
Q
Quleaf 已提交
11
   "source": [
Q
Quleaf 已提交
12
    "# Solving Max-Cut Problem with QAOA\n",
Q
Quleaf 已提交
13 14 15 16 17 18
    "\n",
    "<em> Copyright (c) 2021 Institute for Quantum Computing, Baidu Inc. All Rights Reserved. </em>"
   ]
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
19 20 21 22 23 24
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-06T07:12:18.621281Z",
     "start_time": "2021-01-06T07:12:18.308211Z"
    }
   },
Q
Quleaf 已提交
25
   "source": [
Q
Quleaf 已提交
26
    "## Overview\n",
Q
Quleaf 已提交
27
    "\n",
Q
Quleaf 已提交
28
    "In the [tutorial on Quantum Approximate Optimization Algorithm](./QAOA_EN.ipynb), we talked about how to encode a classical combinatorial optimization problem into a quantum optimization problem and slove it with Quantum Approximate Optimization Algorithm [1] (QAOA). In this tutorial, we will take the Max-Cut Problem as an example to further elaborate on QAOA.\n",
Q
Quleaf 已提交
29
    "\n",
Q
Quleaf 已提交
30
    "### Max-Cut Problem\n",
Q
Quleaf 已提交
31
    "\n",
Q
Quleaf 已提交
32
    "The Max-Cut Problem is a common combinatorial optimization problem in graph theory, and it has important applications in statistical physics and circuit design. The maximum cut problem is an NP-hard problem, so there is no efficient algorithm that can solve this problem perfectly.\n",
Q
Quleaf 已提交
33
    "\n",
Q
Quleaf 已提交
34
    "In graph theory, a graph is represented by a pair of sets $G=(V, E)$, where the elements in the set $V$ are the vertices of the graph, and each element in the set $E$ is a pair of vertices, representing an edge connecting these two vertices. For example, the graph in the figure below is represented by $V=\\{0,1,2,3\\}$ and $E=\\{(0,1),(1,2),(2,3),(3, 0)\\}$.\n",
Q
Quleaf 已提交
35
    "\n",
Q
Quleaf 已提交
36 37
    "![G](figures/maxcut-fig-maxcut_g.png \"Figure 1: A graph with four vertices and four edges\")\n",
    "<div style=\"text-align:center\">Figure 1: A graph with four vertices and four edges </div>\n",
Q
Quleaf 已提交
38
    "\n",
Q
Quleaf 已提交
39
    "A cut on a graph refers to a partition of the graph's vertex set $V$ into two disjoint sets. Each cut corresponds to a set of edges, in which the two vertices of each edge are divided into different sets. So we can define the size of this cut as the size of this set of edges, that is, the number of edges being cut. The Max-Cut Problem is to find a cut that maximizes the number of edges being cut. Figure 2 shows a maximum cut of the graph in Figure 1. The size of the maximum cut is $4$, which means that all edges in the graph are cut.\n",
Q
Quleaf 已提交
40
    "\n",
Q
Quleaf 已提交
41 42
    "![Max cut on G](figures/maxcut-fig-maxcut_cut.png \"Figure 2: A maximum cut of the graph in Figure 1\")\n",
    "<div style=\"text-align:center\">Figure 2: A maximum cut of the graph in Figure 1 </div>\n",
Q
Quleaf 已提交
43
    "\n",
Q
Quleaf 已提交
44
    "Assuming that the input graph $G=(V, E)$ has $n=|V|$ vertices and $m=|E|$ edges, we can describe the Max-Cut Problem as a combinatorial optimization problem with $n$ bits and $m$ clauses. Each bit corresponds to a vertex $v$ in the graph $G$, and its value $z_v$ is $0$ or $1$, corresponding to the vertex belonging to the set $S_{0}$ or $S_{1}$, respectively. Thus, each value $z$ of these $n$ bits corresponds to a distinct cut. Each clause corresponds to an edge $(u,v)$ in the graph $G$. A clause requires that the two vertices connected by its corresponding edge take different values, namely $z_u\\neq z_v$, which means the edge is cut. In other words, when the two vertices connected by the edge are divided into different sets, we say that the clause is satisfied. Therefore, for each edge $(u,v)$ in the graph $G$, we have\n",
Q
Quleaf 已提交
45 46 47
    "\n",
    "$$\n",
    "C_{(u,v)}(z) = z_u+z_v-2z_uz_v,\n",
Q
Quleaf 已提交
48
    "\\tag{1}\n",
Q
Quleaf 已提交
49 50
    "$$\n",
    "\n",
Q
Quleaf 已提交
51
    "where $C_{(u,v)}(z) = 1$ if and only if the edge is cut. Otherwise, the function is equal to $0$. The objective function of the entire combinatorial optimization problem is\n",
Q
Quleaf 已提交
52 53 54
    "\n",
    "$$\n",
    "C(z) = \\sum_{(u,v)\\in E}C_{(u,v)}(z) = \\sum_{(u,v)\\in E}z_u+z_v-2z_uz_v.\n",
Q
Quleaf 已提交
55
    "\\tag{2}\n",
Q
Quleaf 已提交
56 57
    "$$\n",
    "\n",
Q
Quleaf 已提交
58
    "Therefore, to solve the maximum cut problem is to find a value $z$ that maximizes the objective function in equation (2).\n",
Q
Quleaf 已提交
59
    "\n",
Q
Quleaf 已提交
60 61 62
    "### Encoding Max-Cut Problem\n",
    "\n",
    "Here we take the Max-Cut Problem as an example to further elaborate on QAOA. In order to transform the Max-Cut Problem into a quantum problem, we need to use $n$ qubits, where each qubit corresponds to a vertex in the graph $G$. A qubit being in a quantum state $|0\\rangle$ or $|1\\rangle$ indicates that its corresponding vertex belongs to the set $S_{0}$ or $S_{1}$, respectively. It is worth noting that $|0\\rangle$ and $|1\\rangle$ are the two eigenstates of Pauli $Z$ gate, and their eigenvalues are respectively $1$ and $-1$, namely\n",
Q
Quleaf 已提交
63 64 65
    "\n",
    "$$\n",
    "\\begin{align}\n",
Q
Quleaf 已提交
66 67
    "Z|0\\rangle&=|0\\rangle,\\tag{3}\\\\\n",
    "Z|1\\rangle&=-|1\\rangle.\\tag{4}\n",
Q
Quleaf 已提交
68 69 70
    "\\end{align}\n",
    "$$\n",
    "\n",
Q
Quleaf 已提交
71
    "Therefore, we can use Pauli $Z$ gate to construct the Hamiltonian $H_C$ of the Max-Cut Problem. Because mapping $f(x):x\\to(x+1)/2$ maps $-1$ to $0$ and $1$ to $1$, we can replace $z$ in equation (2) with $(Z+I)/2$ ($I$ is the identity matrix) to get the Hamiltonian corresponding to the objective function of the original problem:\n",
Q
Quleaf 已提交
72 73 74
    "\n",
    "$$\n",
    "\\begin{align}\n",
Q
Quleaf 已提交
75 76 77
    "H_C &= \\sum_{(u,v)\\in E} \\frac{Z_u+I}{2} + \\frac{Z_v+I}{2}-2\\cdot\\frac{Z_u+I}{2} \\frac{Z_v+I}{2}\\tag{5}\\\\\n",
    "&= \\sum_{(u,v)\\in E} \\frac{Z_u+Z_v+2I-(Z_uZ_v+Z_u+Z_v+I)}{2}\\tag{6}\\\\\n",
    "&= \\sum_{(u,v)\\in E} \\frac{I-Z_uZ_v}{2}.\\tag{7}\n",
Q
Quleaf 已提交
78 79 80
    "\\end{align}\n",
    "$$\n",
    "\n",
Q
Quleaf 已提交
81
    "The expected value of this Hamiltonian for a quantum state $|\\psi\\rangle$ is\n",
Q
Quleaf 已提交
82 83 84
    "\n",
    "$$\n",
    "\\begin{align}\n",
Q
Quleaf 已提交
85 86 87
    "\\langle\\psi|H_C|\\psi\\rangle &= \\langle\\psi|\\sum_{(u,v)\\in E} \\frac{I-Z_uZ_v}{2}|\\psi\\rangle\\tag{8} \\\\\n",
    "&= \\langle\\psi|\\sum_{(u,v)\\in E} \\frac{I}{2}|\\psi\\rangle-\\langle\\psi|\\sum_{(u,v)\\in E} \\frac{Z_uZ_v}{2}|\\psi\\rangle\\tag{9}\\\\\n",
    "&= \\frac{|E|}{2}-\\frac{1}{2}\\langle\\psi|\\sum_{(u,v)\\in E} Z_uZ_v|\\psi\\rangle.\\tag{10}\n",
Q
Quleaf 已提交
88 89 90
    "\\end{align}\n",
    "$$\n",
    "\n",
Q
Quleaf 已提交
91
    "If we define\n",
Q
Quleaf 已提交
92 93 94
    "\n",
    "$$\n",
    "H_D = -\\sum_{(u,v)\\in E} Z_uZ_v,\n",
Q
Quleaf 已提交
95
    "\\tag{11}\n",
Q
Quleaf 已提交
96 97
    "$$\n",
    "\n",
Q
Quleaf 已提交
98
    "then finding the quantum state $|\\psi\\rangle$ that maximizes $\\langle\\psi|H_C|\\psi\\rangle$ is equivalent to finding the quantum state $|\\psi\\rangle$ such that $\\langle\\psi|H_D|\\psi \\rangle$ is the largest."
Q
Quleaf 已提交
99 100 101 102 103 104
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Q
Quleaf 已提交
105
    "## Paddle Quantum Implementation\n",
Q
Quleaf 已提交
106
    "\n",
Q
Quleaf 已提交
107
    "Now, let's implement QAOA with Paddle Quantum to solve the Max-Cut Problem. There are many ways to find the parameters $\\vec{\\gamma},\\vec{\\beta}$. Here we use the gradient descent method in classical machine learning.\n",
Q
Quleaf 已提交
108
    "\n",
Q
Quleaf 已提交
109
    "To implement QAOA with Paddle Quantum, the first thing to do is to import the required packages. Among them, the `networkx` package can help us handle graphs conveniently."
Q
Quleaf 已提交
110 111 112 113 114 115 116
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
     "end_time": "2021-04-30T09:07:36.250220Z",
     "start_time": "2021-04-30T09:07:36.223934Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>pre { white-space: pre !important; }</style>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from IPython.core.display import HTML\n",
    "display(HTML(\"<style>pre { white-space: pre !important; }</style>\"))"
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
142
   "execution_count": 3,
Q
Quleaf 已提交
143 144 145 146
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-30T09:07:40.001750Z",
     "start_time": "2021-04-30T09:07:36.983994Z"
Q
Quleaf 已提交
147 148 149 150
    }
   },
   "outputs": [],
   "source": [
Q
Quleaf 已提交
151
    "# Import related modules from Paddle Quantum and PaddlePaddle\n",
Q
Quleaf 已提交
152
    "import paddle\n",
Q
Quleaf 已提交
153 154 155
    "from paddle_quantum.circuit import UAnsatz\n",
    "from paddle_quantum.utils import pauli_str_to_matrix\n",
    "\n",
Q
Quleaf 已提交
156
    "# Import additional packages needed\n",
Q
Quleaf 已提交
157
    "import numpy as np\n",
Q
Quleaf 已提交
158
    "from numpy import pi as PI\n",
Q
Quleaf 已提交
159
    "import matplotlib.pyplot as plt\n",
Q
Quleaf 已提交
160 161 162 163
    "import networkx as nx\n",
    "\n",
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")"
Q
Quleaf 已提交
164 165 166 167 168 169
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Q
Quleaf 已提交
170
    "Next, we generate the graph $G$ in the Max-Cut Problem. For the convenience of computation, the vertices here are labeled starting from $0$."
Q
Quleaf 已提交
171 172 173 174
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
175
   "execution_count": 4,
Q
Quleaf 已提交
176 177
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
178 179
     "end_time": "2021-04-30T09:07:40.192343Z",
     "start_time": "2021-04-30T09:07:40.007013Z"
Q
Quleaf 已提交
180 181 182 183 184
    }
   },
   "outputs": [
    {
     "data": {
Q
Quleaf 已提交
185
      "image/png": "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\n",
Q
Quleaf 已提交
186 187 188 189 190 191 192 193 194
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
Q
Quleaf 已提交
195
    "# n is the number of vertices in the graph G, which is also the number of qubits\n",
Q
Quleaf 已提交
196 197 198
    "n = 4\n",
    "G = nx.Graph()\n",
    "V = range(n)\n",
Q
Quleaf 已提交
199
    "G.add_nodes_from(V)\n",
Q
Quleaf 已提交
200
    "E = [(0, 1), (1, 2), (2, 3), (3, 0), (1, 3)]\n",
Q
Quleaf 已提交
201 202
    "G.add_edges_from(E)\n",
    "\n",
Q
Quleaf 已提交
203
    "# Print out the generated graph G\n",
Q
Quleaf 已提交
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
    "pos = nx.circular_layout(G)\n",
    "options = {\n",
    "    \"with_labels\": True,\n",
    "    \"font_size\": 20,\n",
    "    \"font_weight\": \"bold\",\n",
    "    \"font_color\": \"white\",\n",
    "    \"node_size\": 2000,\n",
    "    \"width\": 2\n",
    "}\n",
    "nx.draw_networkx(G, pos, **options)\n",
    "ax = plt.gca()\n",
    "ax.margins(0.20)\n",
    "plt.axis(\"off\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Q
Quleaf 已提交
224
    "### Encoding Hamiltonian\n",
Q
Quleaf 已提交
225
    "\n",
Q
Quleaf 已提交
226
    "In Paddle Quantum, a Hamiltonian can be input in the form of `list`. Here we construct the Hamiltonian $H_D$ in equation (11)."
Q
Quleaf 已提交
227 228 229 230
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
231
   "execution_count": 5,
Q
Quleaf 已提交
232 233
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
234 235
     "end_time": "2021-04-30T09:07:40.206426Z",
     "start_time": "2021-04-30T09:07:40.197339Z"
Q
Quleaf 已提交
236 237 238 239 240 241 242
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
Q
Quleaf 已提交
243
      "[[-1.0, 'z0,z1'], [-1.0, 'z1,z2'], [-1.0, 'z2,z3'], [-1.0, 'z3,z0'], [-1.0, 'z1,z3']]\n"
Q
Quleaf 已提交
244 245 246 247
     ]
    }
   ],
   "source": [
Q
Quleaf 已提交
248
    "# Construct the Hamiltonian H_D in the form of list\n",
Q
Quleaf 已提交
249 250
    "H_D_list = []\n",
    "for (u, v) in E:\n",
Q
Quleaf 已提交
251
    "    H_D_list.append([-1.0,'z'+str(u) +',z' + str(v)])\n",
Q
Quleaf 已提交
252 253 254 255 256 257 258
    "print(H_D_list)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Q
Quleaf 已提交
259
    "As you can see, in this example, the Hamiltonian $H_D$ is\n",
Q
Quleaf 已提交
260 261
    "\n",
    "$$\n",
Q
Quleaf 已提交
262 263
    "H_D = -Z_0Z_1-Z_1Z_2-Z_2Z_3-Z_3Z_0.\n",
    "\\tag{12}\n",
Q
Quleaf 已提交
264 265
    "$$\n",
    "\n",
Q
Quleaf 已提交
266
    "We can view the matrix form of the Hamiltonian $H_D$ and get information of its eigenvalues:"
Q
Quleaf 已提交
267 268 269 270
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
271
   "execution_count": 6,
Q
Quleaf 已提交
272 273
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
274 275
     "end_time": "2021-04-30T09:07:40.501135Z",
     "start_time": "2021-04-30T09:07:40.491760Z"
Q
Quleaf 已提交
276 277 278 279 280 281 282
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
Q
Quleaf 已提交
283 284
      "[-5.  1. -1.  1.  1.  3.  1. -1. -1.  1.  3.  1.  1. -1.  1. -5.]\n",
      "H_max: 3.0\n"
Q
Quleaf 已提交
285 286 287 288
     ]
    }
   ],
   "source": [
Q
Quleaf 已提交
289
    "# Convert Hamiltonian H_D from list form to matrix form\n",
Q
Quleaf 已提交
290
    "H_D_matrix = pauli_str_to_matrix(H_D_list, n)\n",
Q
Quleaf 已提交
291
    "# Take out the elements on the diagonal of H_D\n",
Q
Quleaf 已提交
292
    "H_D_diag = np.diag(H_D_matrix).real\n",
Q
Quleaf 已提交
293
    "# Get the maximum eigenvalue of H_D\n",
Q
Quleaf 已提交
294 295 296 297 298 299 300 301 302 303
    "H_max = np.max(H_D_diag)\n",
    "\n",
    "print(H_D_diag)\n",
    "print('H_max:', H_max)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Q
Quleaf 已提交
304
    "### Building the QAOA circuit\n",
Q
Quleaf 已提交
305
    "\n",
Q
Quleaf 已提交
306
    "Earlier we introduced that QAOA needs to apply two unitary transformations $U_C(\\gamma)$ and $U_B(\\beta)$ alternately on the initial state $|s\\rangle = |+\\rangle^{\\otimes n}$. Here, we use the quantum gates and quantum circuit templates provided in Paddle Quantum to build a quantum circuit to achieve this step. It should be noted that in the Max-Cut Problem, we simplify the problem of maximizing the expected value of the Hamiltonian $H_C$ to the problem of maximizing the expected value of the Hamiltonian $H_D$, so the unitary transformations to be used are $U_D(\\gamma)$ and $U_B(\\beta)$. By alternately placing two circuit modules with adjustable parameters, we are able to build a QAOA circuit\n",
Q
Quleaf 已提交
307 308 309
    "\n",
    "$$\n",
    "U_B(\\beta_p)U_D(\\gamma_p)\\cdots U_B(\\beta_1)U_D(\\gamma_1),\n",
Q
Quleaf 已提交
310
    "\\tag{13}\n",
Q
Quleaf 已提交
311 312
    "$$\n",
    "\n",
Q
Quleaf 已提交
313
    "where $U_D(\\gamma) = e^{-i\\gamma H_D}$ can be constructed with the circuit in the figure below. Another unitary transformation $U_B(\\beta)$ is equivalent to applying a $R_x$ gate to each qubit.\n",
Q
Quleaf 已提交
314
    "\n",
Q
Quleaf 已提交
315 316
    "![U_D circuit](figures/maxcut-fig-cir_ud.png \"Figure 3: Quantum circuit of unitary transformation $e^{i\\gamma Z\\otimes Z}$\")\n",
    "<div style=\"text-align:center\">Figure 3: Quantum circuit of unitary transformation $e^{i\\gamma Z\\otimes Z}$</div>\n",
Q
Quleaf 已提交
317
    "\n",
Q
Quleaf 已提交
318
    "Therefore, the quantum circuit that realizes a layer of unitary transformation $U_B(\\beta)U_D(\\gamma)$ is shown in Figure 4.\n",
Q
Quleaf 已提交
319
    "\n",
Q
Quleaf 已提交
320 321
    "![U_BU_D circuit](figures/maxcut-fig-cir_ubud.png \"Figure 4: Quantum circuit of unitary transformation $U_B(\\beta)U_D(\\gamma)$\")\n",
    "<div style=\"text-align:center\">Figure 4: Quantum circuit of unitary transformation $U_B(\\beta)U_D(\\gamma)$  </div>\n",
Q
Quleaf 已提交
322
    "\n",
Q
Quleaf 已提交
323
    "In Paddle Quantum, the default initial state of each qubit is $|0\\rangle$ (the initial state can be customized by input parameters). We can add a layer of Hadamard gates to change the state of each qubit from $|0\\rangle$ to $|+\\rangle$ so that we get the initial state $|s\\rangle = |+\\rangle^{\\otimes n}$ required by QAOA. In Paddle Quantum, we can add a layer of Hadamard gates to the quantum circuit by calling `superposition_layer()`."
Q
Quleaf 已提交
324 325 326 327
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
328
   "execution_count": 7,
Q
Quleaf 已提交
329 330
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
331 332
     "end_time": "2021-04-30T09:07:41.987233Z",
     "start_time": "2021-04-30T09:07:41.977734Z"
Q
Quleaf 已提交
333 334 335 336 337
    }
   },
   "outputs": [],
   "source": [
    "def circuit_QAOA(p, gamma, beta):\n",
Q
Quleaf 已提交
338
    "    # Initialize the quantum circuit of n qubits\n",
Q
Quleaf 已提交
339
    "    cir = UAnsatz(n)\n",
Q
Quleaf 已提交
340
    "    # Prepare quantum state |s>\n",
Q
Quleaf 已提交
341
    "    cir.superposition_layer()\n",
Q
Quleaf 已提交
342
    "    # Build a circuit with p layers\n",
Q
Quleaf 已提交
343
    "    for layer in range(p):\n",
Q
Quleaf 已提交
344
    "        # Build the circuit of U_D\n",
Q
Quleaf 已提交
345 346 347 348 349
    "        for (u, v) in E:\n",
    "            cir.cnot([u, v])\n",
    "            cir.rz(gamma[layer], v)\n",
    "            cir.cnot([u, v])\n",
    "\n",
Q
Quleaf 已提交
350
    "        # Build the circuit of U_B, that is, add a layer of R_x gates\n",
Q
Quleaf 已提交
351 352 353 354 355 356 357 358 359 360
    "        for v in V:\n",
    "            cir.rx(beta[layer], v)\n",
    "\n",
    "    return cir"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Q
Quleaf 已提交
361
    "After running the constructed QAOA quantum circuit, we obtain the output state\n",
Q
Quleaf 已提交
362 363 364
    "\n",
    "$$\n",
    "|\\vec{\\gamma},\\vec{\\beta}\\rangle = U_B(\\beta_p)U_D(\\gamma_p)\\cdots U_B(\\beta_1)U_D(\\gamma_1)|s\\rangle.\n",
Q
Quleaf 已提交
365 366 367 368 369 370 371 372 373
    "\\tag{14}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Calculating the loss function\n",
Q
Quleaf 已提交
374
    "\n",
Q
Quleaf 已提交
375
    "From the output state of the circuit built in the previous step, we can calculate the objective function of the maximum cut problem\n",
Q
Quleaf 已提交
376 377 378
    "\n",
    "$$\n",
    "F_p(\\vec{\\gamma},\\vec{\\beta}) = \\langle\\vec{\\gamma},\\vec{\\beta}|H_D|\\vec{\\gamma},\\vec{\\beta}\\rangle.\n",
Q
Quleaf 已提交
379
    "\\tag{15}\n",
Q
Quleaf 已提交
380 381
    "$$\n",
    "\n",
Q
Quleaf 已提交
382
    "To maximize the objective function is equivalent to minimizing $-F_p$. Therefore, we define $L(\\vec{\\gamma},\\vec{\\beta}) = -F_p(\\vec{\\gamma},\\vec{\\beta})$ as the loss function, that is, the function to be minimized. Then, we use a classical optimization algorithm to find the optimal parameters $\\vec{\\gamma},\\vec{\\beta}$. The following code shows a complete QAOA network built with Paddle Quantum and PaddlePaddle:"
Q
Quleaf 已提交
383 384 385 386
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
387
   "execution_count": 8,
Q
Quleaf 已提交
388 389
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
390 391
     "end_time": "2021-04-30T09:07:43.856891Z",
     "start_time": "2021-04-30T09:07:43.846753Z"
Q
Quleaf 已提交
392 393 394 395
    }
   },
   "outputs": [],
   "source": [
Q
Quleaf 已提交
396
    "class Net(paddle.nn.Layer):\n",
Q
Quleaf 已提交
397
    "    def __init__(self, p, dtype=\"float64\",):\n",
Q
Quleaf 已提交
398 399 400
    "        super(Net, self).__init__()\n",
    "\n",
    "        self.p = p\n",
Q
Quleaf 已提交
401
    "        self.gamma = self.create_parameter(shape=[self.p], \n",
Q
Quleaf 已提交
402
    "                                           default_initializer=paddle.nn.initializer.Uniform(low=0.0, high=2 * PI), \n",
Q
Quleaf 已提交
403 404
    "                                           dtype=dtype, is_bias=False)\n",
    "        self.beta = self.create_parameter(shape=[self.p], \n",
Q
Quleaf 已提交
405
    "                                          default_initializer=paddle.nn.initializer.Uniform(low=0.0, high=2 * PI), \n",
Q
Quleaf 已提交
406
    "                                          dtype=dtype, is_bias=False)\n",
Q
Quleaf 已提交
407 408
    "\n",
    "    def forward(self):\n",
Q
Quleaf 已提交
409
    "        # Define QAOA's quantum circuit\n",
Q
Quleaf 已提交
410
    "        cir = circuit_QAOA(self.p, self.gamma, self.beta)\n",
Q
Quleaf 已提交
411
    "        # Run the quantum circuit\n",
Q
Quleaf 已提交
412
    "        cir.run_state_vector()\n",
Q
Quleaf 已提交
413
    "        # Calculate the loss function\n",
Q
Quleaf 已提交
414 415 416 417 418 419 420 421 422
    "        loss = -cir.expecval(H_D_list)\n",
    "\n",
    "        return loss, cir"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Q
Quleaf 已提交
423 424 425
    "### Training quantum neural network\n",
    "\n",
    "After defining the quantum neural network for QAOA, we use the gradient descent method to update the parameters in the network to maximize the expected value in equation (15)."
Q
Quleaf 已提交
426 427 428 429
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
430
   "execution_count": 9,
Q
Quleaf 已提交
431 432
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
433 434
     "end_time": "2021-04-30T09:07:44.907375Z",
     "start_time": "2021-04-30T09:07:44.901678Z"
Q
Quleaf 已提交
435 436 437 438
    }
   },
   "outputs": [],
   "source": [
Q
Quleaf 已提交
439 440 441 442
    "p = 4      # Number of layers in the quantum circuit\n",
    "ITR = 120  # Number of training iterations\n",
    "LR = 0.1   # Learning rate of the optimization method based on gradient descent\n",
    "SEED = 1024 # Set global RNG seed "
Q
Quleaf 已提交
443 444 445 446 447 448
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Q
Quleaf 已提交
449
    "Here, we optimize the network defined above in PaddlePaddle."
Q
Quleaf 已提交
450 451 452 453
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
454
   "execution_count": 10,
Q
Quleaf 已提交
455 456
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
457 458
     "end_time": "2021-04-30T09:10:00.930860Z",
     "start_time": "2021-04-30T09:09:27.825635Z"
Q
Quleaf 已提交
459
    }
Q
Quleaf 已提交
460 461 462 463 464 465
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
Q
Quleaf 已提交
466 467 468 469 470 471 472 473 474 475 476 477
      "iter: 10 loss: -1.8359\n",
      "iter: 20 loss: -2.5392\n",
      "iter: 30 loss: -2.7250\n",
      "iter: 40 loss: -2.8061\n",
      "iter: 50 loss: -2.8748\n",
      "iter: 60 loss: -2.9134\n",
      "iter: 70 loss: -2.9302\n",
      "iter: 80 loss: -2.9321\n",
      "iter: 90 loss: -2.9321\n",
      "iter: 100 loss: -2.9325\n",
      "iter: 110 loss: -2.9327\n",
      "iter: 120 loss: -2.9328\n",
Q
Quleaf 已提交
478 479
      "\n",
      "The trained circuit:\n",
Q
Quleaf 已提交
480 481 482 483 484 485 486 487
      "--H----*-----------------*--------------------------------------------------x----Rz(2.379)----x----Rx(2.503)-----------------------------------*-----------------*--------------------------------------------------x----Rz(1.230)----x----Rx(0.792)-----------------------------------*-----------------*--------------------------------------------------x----Rz(4.375)----x----Rx(5.180)-----------------------------------*-----------------*--------------------------------------------------x----Rz(0.711)----x----Rx(2.353)---------------------------------\n",
      "       |                 |                                                  |                 |                                                |                 |                                                  |                 |                                                |                 |                                                  |                 |                                                |                 |                                                  |                 |                                              \n",
      "--H----x----Rz(2.379)----x----*-----------------*---------------------------|-----------------|--------*---------------------*----Rx(2.503)----x----Rz(1.230)----x----*-----------------*---------------------------|-----------------|--------*---------------------*----Rx(0.792)----x----Rz(4.375)----x----*-----------------*---------------------------|-----------------|--------*---------------------*----Rx(5.180)----x----Rz(0.711)----x----*-----------------*---------------------------|-----------------|--------*---------------------*----Rx(2.353)--\n",
      "                              |                 |                           |                 |        |                     |                                        |                 |                           |                 |        |                     |                                        |                 |                           |                 |        |                     |                                        |                 |                           |                 |        |                     |               \n",
      "--H---------------------------x----Rz(2.379)----x----*-----------------*----|-----------------|--------|---------------------|----Rx(2.503)---------------------------x----Rz(1.230)----x----*-----------------*----|-----------------|--------|---------------------|----Rx(0.792)---------------------------x----Rz(4.375)----x----*-----------------*----|-----------------|--------|---------------------|----Rx(5.180)---------------------------x----Rz(0.711)----x----*-----------------*----|-----------------|--------|---------------------|----Rx(2.353)--\n",
      "                                                     |                 |    |                 |        |                     |                                                               |                 |    |                 |        |                     |                                                               |                 |    |                 |        |                     |                                                               |                 |    |                 |        |                     |               \n",
      "--H--------------------------------------------------x----Rz(2.379)----x----*-----------------*--------x--------Rz(2.379)----x----Rx(2.503)--------------------------------------------------x----Rz(1.230)----x----*-----------------*--------x--------Rz(1.230)----x----Rx(0.792)--------------------------------------------------x----Rz(4.375)----x----*-----------------*--------x--------Rz(4.375)----x----Rx(5.180)--------------------------------------------------x----Rz(0.711)----x----*-----------------*--------x--------Rz(0.711)----x----Rx(2.353)--\n",
      "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     \n",
Q
Quleaf 已提交
488
      "Optimized parameters gamma:\n",
Q
Quleaf 已提交
489
      " [2.37918879 1.22914743 4.37582352 0.71142941]\n",
Q
Quleaf 已提交
490
      "Optimized parameters beta:\n",
Q
Quleaf 已提交
491
      " [2.50287593 0.79179726 5.17941547 2.35294027]\n"
Q
Quleaf 已提交
492 493 494 495
     ]
    }
   ],
   "source": [
Q
Quleaf 已提交
496 497 498
    "paddle.seed(SEED)\n",
    "\n",
    "net = Net(p)\n",
Q
Quleaf 已提交
499
    "# Use Adam optimizer\n",
Q
Quleaf 已提交
500
    "opt = paddle.optimizer.Adam(learning_rate=LR, parameters=net.parameters())\n",
Q
Quleaf 已提交
501
    "# Gradient descent iteration\n",
Q
Quleaf 已提交
502
    "for itr in range(1, ITR + 1):\n",
Q
Quleaf 已提交
503
    "    # Run the network defined above\n",
Q
Quleaf 已提交
504
    "    loss, cir = net()\n",
Q
Quleaf 已提交
505 506
    "    # Calculate the gradient and optimize\n",
    "    loss.backward()\n",
Q
Quleaf 已提交
507 508
    "    opt.minimize(loss)\n",
    "    opt.clear_grad()\n",
Q
Quleaf 已提交
509 510 511 512 513
    "    if itr% 10 == 0:\n",
    "        print(\"iter:\", itr, \"loss:\", \"%.4f\"% loss.numpy())\n",
    "    if itr == ITR:\n",
    "        print(\"\\nThe trained circuit:\") \n",
    "        print(cir)\n",
Q
Quleaf 已提交
514 515
    "\n",
    "gamma_opt = net.gamma.numpy()\n",
Q
Quleaf 已提交
516
    "print(\"Optimized parameters gamma:\\n\", gamma_opt)\n",
Q
Quleaf 已提交
517
    "beta_opt = net.beta.numpy()\n",
Q
Quleaf 已提交
518
    "print(\"Optimized parameters beta:\\n\", beta_opt)"
Q
Quleaf 已提交
519 520 521 522 523 524
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Q
Quleaf 已提交
525 526 527
    "### Decoding the quantum solution\n",
    "\n",
    "After obtaining the minimum value of the loss function and the corresponding set of parameters $\\vec{\\gamma}^*,\\vec{\\beta}^*$, our task has not been completed. In order to obtain an approximate solution to the Max-Cut Problem, it is necessary to decode the solution to the classical optimization problem from the quantum state $|\\vec{\\gamma}^*,\\vec{\\beta}^*\\rangle$ output by QAOA. Physically, to decode a quantum state, we need to measure it and then calculate the probability distribution of the measurement results:\n",
Q
Quleaf 已提交
528 529 530
    "\n",
    "$$\n",
    "p(z)=|\\langle z|\\vec{\\gamma}^*,\\vec{\\beta}^*\\rangle|^2.\n",
Q
Quleaf 已提交
531
    "\\tag{16}\n",
Q
Quleaf 已提交
532 533
    "$$\n",
    "\n",
Q
Quleaf 已提交
534
    "Usually, the greater the probability of a certain bit string, the greater the probability that it corresponds to an optimal solution of the Max-Cut problem.\n",
Q
Quleaf 已提交
535
    "\n",
Q
Quleaf 已提交
536
    "Paddle Quantum provides a function to view the probability distribution of the measurement results of the state output by the QAOA quantum circuit:"
Q
Quleaf 已提交
537 538 539 540
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
541
   "execution_count": 11,
Q
Quleaf 已提交
542 543
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
544 545
     "end_time": "2021-04-30T09:10:21.794006Z",
     "start_time": "2021-04-30T09:10:21.392963Z"
Q
Quleaf 已提交
546 547 548 549 550
    }
   },
   "outputs": [
    {
     "data": {
Q
Quleaf 已提交
551
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAbU0lEQVR4nO3de9hcZX3u8e+dcBRQQSJaEgzVoOIB1IDs2npAsGGrHCoqCIoKja2kwqWthG2LinZvxMpu3YDbWES0W4JnU42AVbFbu8UERCDBSESQoGgQEZSNGrn7x1qBYTLvvGved62Zybvuz3XNlVmH+c1vQpjfrOd51vPINhER0V6zRp1ARESMVgpBRETLpRBERLRcCkFERMulEEREtFwKQUREy20z6gQGtfvuu3v+/PmjTiMiYqty1VVX3WF7Tq9jW10hmD9/PqtXrx51GhERWxVJt0x0LE1DEREtl0IQEdFyKQQRES3XaCGQtEjSOknrJS3tcfy1kjZKuqZ8nNRkPhERsaXGOoslzQbOAw4FNgCrJK2wvbbr1EtsL2kqj4iI6K/JK4IDgfW2b7L9W2A5cESD7xcREVPQZCHYE7i1Y3tDua/byyRdK+lTkuY1mE9ERPQw6s7ifwXm23468GXgol4nSVosabWk1Rs3bhxqghERM12TN5TdBnT+wp9b7nuA7Z93bP4zcHavQLaXAcsAFi5cmJV0tmLzl35xyq+9+awX15hJRGzW5BXBKmCBpL0lbQccA6zoPEHSYzs2DwduaDCfiIjoobErAtubJC0BLgNmAx+2vUbSmcBq2yuAN0k6HNgE3Am8tql8IiKit0bnGrK9EljZte+MjuenA6c3mUNERPS31U06FxFTlz6a6GXUo4YiImLEUggiIlouhSAiouVSCCIiWi6FICKi5VIIIiJaLoUgIqLlUggiIlouhSAiouVSCCIiWi6FICKi5VIIIiJaLoUgIqLlUggiIlouhSAiouVSCCIiWi6FICKi5VIIIiJaLoUgIqLlUggiIlouhSAiouVSCCIiWi6FICKi5VIIIiJaLoUgIqLlUggiIlouhSAiouVSCCIiWi6FICKi5VIIIiJaLoUgIqLlUggiIlqu0UIgaZGkdZLWS1ra57yXSbKkhU3mExERW2qsEEiaDZwHHAbsCxwrad8e5+0CnAJc2VQuERExsSavCA4E1tu+yfZvgeXAET3OexfwHuC+BnOJiIgJNFkI9gRu7djeUO57gKRnAvNsf7HBPCIioo+RdRZLmgWcA7ylwrmLJa2WtHrjxo3NJxcR0SJNFoLbgHkd23PLfZvtAjwVuELSzcBBwIpeHca2l9leaHvhnDlzGkw5IqJ9Ji0Ekp4jaafy+fGSzpH0uAqxVwELJO0taTvgGGDF5oO2f2l7d9vzbc8HvgUcbnv1lD5JRERMSZUrgg8A90raj6IZ5wfARyd7ke1NwBLgMuAG4BO210g6U9Lh08g5IiJqtE2FczbZtqQjgHNtXyDpxCrBba8EVnbtO2OCc59fJWZERNSrSiG4R9LpwKuBPyk7ebdtNq2IiBiWKk1DrwR+A7ze9u0Unb7vbTSriIgYmkkLQfnl/2lg+3LXHcBnm0wqIiKGp8qooT8HPgV8sNy1J/C5BnOKiIghqtI0dDLwHOBuANs3Ao9uMqmIiBieKoXgN+VcQQBI2gZwcylFRMQwVSkEX5f034AdJR0KfBL412bTioiIYalSCJYCG4HrgDdQ3Bfwt00mFRERwzPpfQS27wc+VD4iImKGmbAQSPqE7VdIuo4efQK2n95oZhERMRT9rghOKf98yTASiYiI0Ziwj8D2T8qnb7R9S+cDeONw0ouIiKZV6Sw+tMe+w+pOJCIiRqNfH8FfUvzy/0NJ13Yc2gX4ZtOJRUTEcPTrI/g48CXgf1AMId3sHtt3NppVREQMTb9CYNs3Szq5+4Ck3VIMIiJmhsmuCF4CXEUxfFQdxwz8YYN5RUTEkExYCGy/pPxz7+GlExERw9avs/iZ/V5o++r604mIiGHr1zT0vj7HDBxccy4RETEC/ZqGXjDMRCIiYjT6NQ0dbPurkv6s13Hbn2kurYiIGJZ+TUPPA74KvLTHMQMpBBERM0C/pqG3l3++bnjpRETEsFVZvP5Rkt4v6WpJV0n6J0mPGkZyERHRvCqTzi2nWKHsZcDR5fNLmkwqIiKGZ9IVyoDH2n5Xx/a7Jb2yqYQiImK4qlwRXC7pGEmzyscrgMuaTiwiIoaj3/DRe3hwjqFTgX8pD80CfgX8ddPJRURE8/qNGtplmIlERMRoVOkjQNKuwAJgh837bP97U0lFRMTwTFoIJJ1EsZD9XOAa4CDg/5G5hiIiZoQqncWnAAcAt5TzDz0DuKvJpCIiYniqFIL7bN8HIGl7298DnlgluKRFktZJWi9paY/jfyHpOknXSPqGpH0HSz8iIqarSiHYIOmRwOeAL0v6PHDLZC+SNBs4DzgM2Bc4tscX/cdtP832/sDZwDnVU4+IiDpM2kdg+6jy6TskfQ14BHBphdgHAutt3wQgaTlwBLC2I/bdHefvRDFcNSIihqjqqKFnAn9M8UX9Tdu/rfCyPYFbO7Y3AM/uEftk4M3AdkzQAS1pMbAYYK+99qqSckREVFRl0rkzgIuARwG7AxdK+tu6ErB9nu3HA6cBPePaXmZ7oe2Fc+bMqeutIyKCalcExwH7dXQYn0UxjPTdk7zuNmBex/bcct9ElgMfqJBPRETUqEpn8Y/puJEM2J7+X+ibrQIWSNpb0nbAMcCKzhMkLejYfDFwY4W4ERFRo35zDf0vij6BXwJrJH253D4U+PZkgW1vkrSEYoK62cCHba+RdCaw2vYKYImkQ4DfAb8ATpjuB4qIiMH0axpaXf55FfDZjv1XVA1ueyWwsmvfGR3PT6kaKyIimtFv0rmLNj8vm3b2KTfX2f5d04lFRMRwVJlr6PkUo4ZuppiSep6kEzLpXETEzFBl1ND7gBfZXgcgaR/gYuBZTSYWERHDUWXU0LabiwCA7e8D2zaXUkREDFOVK4KrJP0zD65QdhwPdiRHRMRWrkoh+AvgZOBN5fb/Bc5vLKOIiBiqvoWgnEH0u7afRGYGjYiYkfr2Edj+PbBOUmZ6i4iYoao0De1KcWfxt4Ffb95p+/DGsoqIiKGpUgj+rvEsIiJiZPrNNbQDRUfxE4DrgAtsbxpWYhERMRz9+gguAhZSFIHDKG4si4iIGaZf09C+tp8GIOkCKsw4GhERW59+VwQPTCyXJqGIiJmr3xXBfpI2Ly4vYMdyW4BtP7zx7CIionH9pqGePcxEIiJiNKpMOhcRETNYCkFERMulEEREtFwKQUREy/W7s/gewBMdz6ihiIiZod+ooV0AJL0L+AnwMYqho8cBjx1KdhER0bgqTUOH2z7f9j2277b9AeCIphOLiIjhqFIIfi3pOEmzJc2SdBwd01FHRMTWrUoheBXwCuCn5ePl5b6IiJgBJl2PwPbNpCkoImLGmvSKQNI+kr4i6fpy++mS/rb51CIiYhiqNA19CDidcjZS29cCxzSZVEREDE+VQvAw291rEWRa6oiIGaJKIbhD0uMpby6TdDTFfQURETEDVFm8/mRgGfAkSbcBP6S4qSwiImaAvoVA0mzgjbYPkbQTMMv2PcNJLSIihqFv05Dt3wN/XD7/9aBFQNIiSeskrZe0tMfxN0taK+nacmTS4wbKPiIipq1K09B3JK0APknHHcW2P9PvReXVxHnAocAGYJWkFbbXdsYGFtq+V9JfAmcDrxzwM0RExDRUKQQ7AD8HDu7YZ6BvIQAOBNbbvglA0nKKG9MeKAS2v9Zx/reA4yvkExERNapyZ/Hrphh7T+DWju0NwLP7nH8i8KUpvldEREzRpIVA0oX0WJfA9uvrSkLS8cBC4HkTHF8MLAbYa6+96nrbiIigWtPQFzqe7wAcBfy4wutuA+Z1bM8t9z2EpEOAtwHPs/2bXoFsL6MYwsrChQsnXCwnIiIGV6Vp6NOd25IuBr5RIfYqYIGkvSkKwDF0zVoq6RnAB4FFtn9WNemIiKjPVNYsXgA8erKTbG8ClgCXATcAn7C9RtKZkg4vT3svsDPwSUnXlKOTIiJiiKr0EXSvXXw7cFqV4LZXAiu79p3R8fyQamlGRERTqjQN7TKMRCIiYjSqrEfwnHJ6CSQdL+mc3AEcETFzVOkj+ABwr6T9gLcAPwA+2mhWERExNFUKwSbbprgr+Fzb5wFpLoqImCGq3Edwj6TTKaZ/eK6kWcC2zaYVERHDUuWK4JXAb4ATbd9OcWPYexvNKiIihqbKqKHbgXM6tn9E+ggiImaMKqOGDpK0StKvJP1W0u8l/XIYyUVERPOqNA2dCxwL3AjsCJwEnN9kUhERMTyVppiwvR6Ybfv3ti8EFjWbVkREDEuVUUP3StoOuEbS2cBPmNocRRERMYaqfKG/ujxvCcVSlfOAlzWZVEREDE+VUUO3SNoReKztdw4hp4iIGKIqo4ZeClwDXFpu75/poiMiZo4qTUPvoFiI/i4A29cAezeWUUREDFWVQvA72933DWS5yIiIGaLKqKE1kl4FzJa0AHgT8B/NphUREcNS5Yrgr4CnUMw3dDFwN3BqgzlFRMQQVRk1dC/wtvIREREzzISFYLKRQbYP73c8IiK2Dv2uCP4LcCtFc9CVgIaSUUREDFW/QvAY4FCKCedeBXwRuNj2mmEkFhERwzFhZ3E5wdyltk8ADgLWA1dIWjK07CIionF9O4slbQ+8mOKqYD7wfuCzzacVERHD0q+z+KPAU4GVwDttXz+0rCIiYmj6XREcTzHb6CnAm6QH+ooF2PbDG84tIiKGYMJCYDtrDkREtEC+7CMiWi6FICKi5VIIIiJaLoUgIqLlUggiIlouhSAiouUaLQSSFklaJ2m9pKU9jj9X0tWSNkk6uslcIiKit8YKgaTZwHnAYcC+wLGS9u067UfAa4GPN5VHRET0V2Wpyqk6EFhv+yYAScuBI4C1m0+wfXN57P4G84iIiD6abBrak2I9g802lPsiImKMbBWdxZIWS1otafXGjRtHnU5ExIzSZCG4DZjXsT233Dcw28tsL7S9cM6cObUkFxERhSYLwSpggaS9JW0HHAP0XQc5IiKGr7FCYHsTsAS4DLgB+ITtNZLOlHQ4gKQDJG0AXg58UFKWwYyIGLImRw1heyXFwjad+87oeL6KoskoIiJGZKvoLI6IiOakEEREtFwKQUREy6UQRES0XApBRETLpRBERLRcCkFERMulEEREtFwKQUREy6UQRES0XApBRETLpRBERLRcCkFERMulEEREtFwKQUREy6UQRES0XApBRETLpRBERLRcCkFERMulEEREtFwKQUREy6UQRES0XApBRETLpRBERLRcCkFERMulEEREtFwKQUREy6UQRES0XApBRETLpRBERLRcCkFERMulEEREtFwKQUREyzVaCCQtkrRO0npJS3sc317SJeXxKyXNbzKfiIjYUmOFQNJs4DzgMGBf4FhJ+3addiLwC9tPAP4n8J6m8omIiN62aTD2gcB62zcBSFoOHAGs7TjnCOAd5fNPAedKkm03mFfMEPOXfnHKr735rBfXmEmz2vA5p/MZIZ9zutTUd66ko4FFtk8qt18NPNv2ko5zri/P2VBu/6A8546uWIuBxeXmE4F1jSQNuwN3THrW8GPVHa8NseqO14ZYdcdrQ6y649WdW6fH2Z7T60CTVwS1sb0MWNb0+0habXvhuMWqO14bYtUdrw2x6o7Xhlh1x6s7t6qa7Cy+DZjXsT233NfzHEnbAI8Aft5gThER0aXJQrAKWCBpb0nbAccAK7rOWQGcUD4/Gvhq+gciIoarsaYh25skLQEuA2YDH7a9RtKZwGrbK4ALgI9JWg/cSVEsRqnO5qe6m7LGNbdxjVV3vDbEqjteG2LVHa/xJvBeGussjoiIrUPuLI6IaLkUgoiIlkshiIhouRSCiIiW2ypuKGuKJFFMhbFnues24Nt1DmGV9CTb3xvwNY8AFnXldZntu2rM61DbX57C68YyN0lPopiypDOvFbZvqDGv19m+sK54EeOitaOGJL0IOB+4kQdvdJsLPAF4o+3La3qfH9nea4DzXwO8Hbi8K69DgXfa/ugo8hrn3CSdBhwLLAc2dOR1DLDc9lmjyKvjdWNZPMvXjWUBHUZe08jtT4Eju3L7vO1La8zrDNtn1hVv0vdrcSG4ATjM9s1d+/cGVtp+8gCx3j/RIeAE2w8fINY6ivmW7uravytwpe19BojVfQNfZ14H296paqxxzk3S94Gn2P5d1/7tgDW2FwwQ69o+ee1je/uqscp4Y1k8y9eMZQEdVl5TzO0fgX2Aj3bl9hrgRtunjCKv6Wpz09A2PPgfstNtwLYDxnod8BbgNz2OHTtgLAG9qvP95bFB/AlwPPCrHu9x4ICxNr9uHHO7H/gD4Jau/Y8tjw1iD+BPgV/0yOs/BowF8DbgWRMVT4ovlEomKZ6PmkJuJ9K7gJ4DrAEqf+FOUkD3GFVeDeT2X3v94JF0CfB9oHIhkHR3n7x2HDCvaWlzIfgwsKqcHvvWct88il8dFwwYaxVwve0tvigkvWPAWH8PXC3p8o689qL4BfmuAWN9C7jX9td75DWVGVzHNbdTga9IurErrycASyZ60QS+AOxs+5oeeV0xYCwY3+K5OYdxLKB15lV3bvdJOsD2qq79BwD3DRjrLuAA2z/tPiDp1i1Pb05rm4YAyoVyDmfLdsi1E7+qZ5zdgPts31tTXrtS/MPtblPu/oc8dOOam6RZbNnxv8r270eXFUg6ATiDomloi+Jp+yMDxPoScLbtr/U49u+2nztgbouAcyn6ybYooIO0eUu6ALjQ9jd6HPu47VeNIq8Gcnsm8AFgFx5sUZgH/BI42fZVA8R6N8X3zbd7HHuP7dOqxpquVheCzcovcmzfOU6xxpWkPej4wu31i2YUsSaIv7Pt7l/QQ401rsUTxrqAjmVem0l6DA/9d3v7KPOZrtYWAkl7AWcDB1NUcwEPB74KLO3uRK4Y64UUl3tTjjXJ+1xn+2mjiiVpf+B/U0wXvoHic86l+MxvtH31ALGeQfHL6hE8tBN14FiTvE9tnW7TibU1Fc/yPUZaQOse2j2uQ8WHEauKNvcRXAL8I3Dc5l8ZKtZZfjnFaIWDRhFL0p9NdAh4zAA51Rqr9BHgDbav7Hqfg4ALgf0GiHVhXbEkvXmiQ8DOA+RUa6wy3v70KJ6S7qKm4jmVWBWspWiOGXqsfkO7JQ08tLvueH1cTn1/Z3XGmlSbC8Huti/p3FF+iS+XNGjHZ52xLgH+D707GHcYYSyAnbq/uAFsf0vSQENRa47134H3Apt6HBv07vk6Y8GYFs/ydeNaQP8JOGSiod1A5aHddcebZKj4IwdJqs5Y09XmQnCVpPOBi3joqKETgO+MMNa1wD/Yvr77gKRDRhgL4EuSvkgx5LHzc74GGPRmmjpjXQ18rldHnaSTRhgLxrd4wvgW0DqHdtcdr86h4nXGmpY2F4LXUIxXfiddo4YYfPhonbFOBSYaX3zUCGNh+02SDmPLOz7Ps71yVLEo/oeaaInTQdd/rTMWjG/xhPEtoHUO7a47Xp1DxeuMNS2t7SyOGJYJCt6KKRS8umM9EbjT9sYex/YYpBO6zljla55M78850NDuuuPVOVS87mHn08qlrYVA0jYUv+KPpGvOEOCC7rsaRxDrKIqbasYiVoX3WmZ7cWJFbH3aXAguphiqeBEPnTPkBGA3269MrC3i7TbRIeC7tucm1hbxHgGcTvFrdA+KjvufURTjs7qnnhhWrK54RwKPrim3acea5H2+ZPuwOmLVHW9cY1XR5j6CZ3nLOUM2AN9SMYlZYm1pI8Vt/51TI7jcfnRi9fQJivtJXrD5pqPyZqTXlsdeNKJYnfGe3xXvhGnkNu1Y5d27PQ8B+w+QU+3xxjXWdLW5ENwp6eXAp23fDw/czfhytpyTJLEKNwEvtP2j7gMafG6UNsQCmG/7PZ07yi/KsyS9boSx+sV7j6TXjzDWKuDrPLQYb/bIAWPVHW9cY02P7VY+gPkU4+x/RjFr4PfL55cAeydWz3gnA/tNcOyvEqvnay4H3grs0bFvD+A04N9GFWuccwOuBxZMcOzWKXzO2uKNa6zpPlrbRwATjiT4vKew+EUbYpXxalswpCWxdgWWlvE2Ny39lGJo8VkeYL6hOmONc26Sjgaus73FLLSSjrT9uaqx6o43rrGmq7VrFqtY/OLjFO2/V5YPgIslLU2snvHeSjFlhoBvlw9NMbcZHwvA9i9sn2b7SbZ3Kx9PdjGz5JGjijXOudn+VK8vx9Kug8SqO964xpq2YV5+jNODoplk2x77t6NYaSixtpLcxjVWhff60TjGGufc8jmbebS5s7jOxS/aEGuccxvXWKjG1bHqjFV3vHGNVXe8cY01XW0uBKdS36pWbYg1zrmNayyod3WsupfRHNfc8jmn9jmnrLWFwPalkvahhsUv2hBrnHMb11ilOpe+rHsZzXHNLZ9zap9zylo9aigiIlo8aigiIgopBBERLZdCEDOapLmSPi/pRkk3STpX0vYVXtdzjV1JZ6pc1EfSqZIeNsF5L5H0HUnflbRW0hvK/UdK2rfC+1c6L6IOKQQxY0kS8BmKBVMWAAuAHYGzpxrT9hm2/63cPBXYohBI2hZYBrzU9n7AM4ArysNHAlW+4KueFzFt6SyOGUvSC4G3235ux76HU9wjMA84Glhoe0l57AsUS3teUV4RfIhi1szbgWNsb5T0EYrRHn8A/AOwDrjD9gs63mM34HvA42z//479f1S+9pfl42XAwcBiihvW1gOvpph5svs8gPOAOcC9wJ/b/l4tf1HRerkiiJnsKcBDlk60fTdwM8V9Af3sBKy2/RSKGSLf3hXn/cCPKaaEfkHXsTsp5ti5RdLFko6TNMvFkoQrgL+xvb/tHwCfsX1AeeVwA3DiBOcto5j07lnAXwPnD/y3ETGB1t5HEDGJ+ylmaQX4F4ompspsnyTpacAhFF/ch1KsG9DtqZLeTTHt8M7AZd0nSNoZ+CPgk0VrFwCT9nNEVJVCEDPZWormnweUTUOPoWjSeSoPvSreoU+sgdtQbV8HXCfpY8AP6V0IPgIcafu7kl4LPL/HObOAu2zvP2gOEVWkaShmsq8AD5P0GgBJs4H3AeeWbfc3A/tLmiVpHsXdxJvN4sEi8irgGz3i3wPs0r1T0s6Snt+xa38enLuo+zW7AD8pO5iP6xW7bM76oYpFhlBhv34fPGIQKQQxY7kYCXEUcHQ5d9DPgftt/315yjcpfqmvBd4PXN3x8l8DB0q6nqJD98web7EMuFTS17r2C3irpHWSrgHeyYNXA8uBvymHlj4e+DuK6cG/SdHBzATnHQecKOm7wBqKef8japFRQ9Ea5aidi4GjbF892fkRbZFCEBHRcmkaiohouRSCiIiWSyGIiGi5FIKIiJZLIYiIaLkUgoiIlkshiIhouf8EGy3OhSONuGIAAAAASUVORK5CYII=\n",
Q
Quleaf 已提交
552 553 554 555 556 557 558 559 560 561 562
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
Q
Quleaf 已提交
563
    "# Repeat the simulated measurement of the circuit output state 1024 times\n",
Q
Quleaf 已提交
564
    "prob_measure = cir.measure(plot=True)"
Q
Quleaf 已提交
565 566 567 568 569 570
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Q
Quleaf 已提交
571
    "After measurement, we can find the bit string with the highest probability of occurrence. Let the vertices whose bit values are $0$ in the bit string belong to the set $S_0$ and the vertices whose bit values are $1$ belong to the set $S_1$. The set of edges between these two vertex sets is a possible maximum cut of the graph.\n",
Q
Quleaf 已提交
572
    "\n",
Q
Quleaf 已提交
573 574 575 576
    "The following code selects the bit string with the greatest chance of appearing in the measurement result, then maps it back to the classic solution, and draws the corresponding maximum cut:\n",
    "- The red vertex belongs to the set $S_0$,\n",
    "- The blue vertex belongs to the set $S_1$,\n",
    "- The dashed line indicates the edge being cut."
Q
Quleaf 已提交
577 578 579 580
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
581
   "execution_count": 12,
Q
Quleaf 已提交
582 583
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
584 585
     "end_time": "2021-04-30T09:10:36.652097Z",
     "start_time": "2021-04-30T09:10:36.465888Z"
Q
Quleaf 已提交
586 587 588 589 590 591 592
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
Q
Quleaf 已提交
593
      "The bit string form of the cut found: 0101\n"
Q
Quleaf 已提交
594 595 596 597
     ]
    },
    {
     "data": {
Q
Quleaf 已提交
598
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAb4AAAEuCAYAAADx63eqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAArzElEQVR4nO3deXQUVdoG8Kc7a3cIaTYhCYu4gEMQUEA0AuHzIAok4AwDqOxRNh0QEcUZFJhx/BQEZHFkU3YVhHEhyOIoiElw2D6RTRIiIAaiYCCRLJ2t7/fHtZskZK/qruqu53dOzkl3kqpXTPrpW/ete01CCAEiIiKDMGtdABERkScx+IiIyFAYfEREZCgMPiIiMhQGHxERGQqDj4iIDIXBR0REhsLgIyIiQ2HwERGRoTD4iIjIUBh8RERkKAw+IiIyFAYfEREZCoOPiIgMhcFHRESGwuAjIiJDYfAREZGhMPiIiMhQGHxERGQoDD4iIjIUBh8RERkKg4+IiAyFwUdERIbC4CMiIkNh8BERkaEw+IiIyFAYfEREZCgMPiIiMhQGHxERGQqDj4iIDIXBR0REhsLgIyIiQ2HwERGRofhrXQCREdjtwNGjwOHDwIULwLVrQHExEBICNGgAdOwIdO4MNG2qdaVEvo/BR+QmR44Ab70F7N4N/PQTYLXKsMvLK/t9/v4yAO12+T133QXExwN//jMQFKRJ6UQ+zSSEEFoXQeQr7HZgyxZgzhzgzBmgoAAoKan9cerVA0wmYPx44C9/AVq1Ur9WIqNi8BGpZNs2YNQooLAQyMlR55iBgYDZDIweDcybJ0eGRKQMg49IoatXgXHjgO3bb7yMqRaLBbDZgE2bgB493HMOIqNg8BEp8OWXwODBMvAKCtx/PotFzv8tWgT4+bn/fES+iMFHVEdbtgAjRwL5+Z49r9UK9OoFfPQRm1+I6oLBR1QHH34o5908HXpOFgsQHQ3s2AEEBGhTA5G3YvAR1dLnnwOPPKJd6DlZLEDfvnLkaTJpWwuRN+HKLUS1cPkyMGSI9qEHyBp27QJWrtS6EiLvwhEfUS3ExgL/+Y+8ZUEvQkKAkyeBli21roTIO3DER1RDmzcDe/boK/QA2U362GMA38IS1QyDj6gGrl0Dxo513316ShQXA999B6xbp3UlRN6BwUdUA+vWyYDRq9xc4JVXOOojqgnO8RFVQwigdWvgxx+1rqRqISFy/vG++7SuhEjfOOIjqkZiIvDrr8qP07s3sGAB8NVXQHa2DFTnR0yM8uPn5cn1PImoatyWiKgaCxaoM7f39NPy/j93EUKuF3rlCtCwofvOQ+TtOOIjqkZiojpzZ0LITWgTEoD33lN+vIoEBgIHDrjn2ES+gsFHVIVLl2TjiBqGDQOaNwcGDHDfTed5ecDBg+45NpGvYPARVeHwYSA4WJ1jeWK1l+JiYO9e95+HyJsx+IiqcPCgeiM+TzlyROsKiPSNwUdUhdRUfd+/V5HMTMDh0LoKIv1i8BFVwdtGe4DcoNYTm+ISeSsGH1EVioq0rqD2zGbvrJvIUxh8RFWwWLSuoPaKi72zbiJPYfARVaFBA60rqD2zGfDn0hREleKfB1EVOneWN5ursXLLkCFA167y8xYtyn5t4kS51x8gO0k//LDu52ndmjuyE1WFwUdUhc6d1Rs99e0LjB5d8deGDr3++Zo1yoKPi1QTVY2XOomqcOednrnxXC1WK9C9u9ZVEOkbtyUiqsbttwNpaVpXUTOhoXKX+M6dta6ESL844iOqxvDh6i1b5m5BQUCnTlpXQaRvDD6iaowf7x07m1sswJQp8gZ2Iqocg4+oGs2aAQ8+qP9OSYcDGDtW6yqI9I/BR1QDzz8vG0f0ymwG+vUDbrpJ60qI9I/NLUQ1IATQo4fAN9844HDo71qixQJ8+y3Qtq3WlRDpH0d8RDVw+nQq7PY/weHQ370NISHAjBnFOHp0M/g+lqh6DD6iKpSUlGDBggXo2LEjDh/+BPXrz0JwsH72KTKbgVtvBXJyZmPIkCGIjY3FhQsXtC6LSNcYfESVSElJQc+ePfHcc8/Bbrdj1KhROHv2Jdxzjz+CgrSuTgoOlqu8tG//B9hsNmzfvh1RUVFYs2YNR39EleAcH1EFCgoK0Lp1a2RkZCAiIgIrVqxA//79AQDZ2cA99wBnz2q7/Y/FAnz0EfDww/LxxYsXMX78eGzbtg0A0K9fP6xYsQKRkZHaFUmkQww+okqsXbsWe/bswZtvvokG5bZpuHQJuPdeID1dm/CzWIC1a4HBg8s+L4TAhg0bMHnyZGRlZSEsLAyHDh3Cbbfd5vkiiXSKwUcEOZe3aNEiBAQEYNKkSTX6mStXgJgY4IcfPLeep8kkQ2/zZnn7QmWco7+SkhJ89tlnMOn9JkQiD2LwkeGlpqZizJgx2LdvH4KDg3HmzBmEh4fX6Gfz84EXXgDefdf94We1yu2MNm+Wi2dXRwiBvLw8hISEAJBzlvv27cPo0aMZhGRobG4hwyrdsblv3z6Eh4dj8+bNNQ49QI6+liwBvvgCiIx0z87nzlHeCy8Ax47VLPTkz5lcoVdSUoL4+HjEx8ez85MMj8FHhpSamlqmY3PkyJE4ceIEYp27wdZSdDRw+jQwebLcIaFePeU1BgbKrs1evYD9+4FZs4CAgLody2w2Y8KECez8JAIvdZJB9e7dG19++SXCw8OxYsWKOgdeRQoKgC1bgDlz5PwfUPMd3P395SVNIYAJE4CnnwZatVKtNHZ+EoHBRwYihHDNbaWmpmLu3Ll44403bujYVNPJk0ByMpCUBHzzDXDunAy3/PwcAAJWayiKioCwMOCuu+TorksX2TTjrnsFy3d+NmvWDGfOnIHFHddpiXSIwUc+z9mxmZycjC1btmja2FFYCGRmAhERtwDww/nzp1G/vgw+T3OO/nr16oXnnnvO8wUQaYTBRz6tdMcmAHz11VeIiYnRuCq4wlfrPz8hBIQQMJvldP8HH3wAu93Ozk/yaWxuIZ9UUcdmQkKCLkJPT0wmkyv0Ll++jIkTJ7Lzk3weg498jtodm0bRuHFjLFmypEzn5+rVqzUflRKpjcFHPmfDhg1lRnlr1651awOLrzCZTBgxYgROnjyJuLg4ZGdnc/RHPolzfOQTCgsLERgYCEAuMP2Pf/wD06ZN023g6WWOrzLlOz/vv/9+JCUlaV0WkSoYfOTVnB2bb731Fg4dOoSGDRtqXVKN6D34nDIyMvDUU09hxowZ6NKli9blEKmCwUdeq3zH5vLlyzFu3DiNq6oZbwm+ikyaNAmdO3fGqFGj2PlJXonBR17HOcqbMWMG7Ha7W1ZfcTdvDb5vvvkG0dHRALjqC3kvNreQV2HHprbuvfderFu3jmt+kldj8JFXSU9PZ8emhpydn843G9nZ2RgzZgw7P8mr8FIn6V5mZiYaNWrkerx+/XrExsZ6deB566XO0sp3fk6ePBmLFi3SuiyiajH4SLecc3kvv/wyduzYgZ49e2pdkmp8IficMjIyMGvWLMybNw/169cHUHZBcCK94aVO0qXSc3l5eXnYtWuX1iVRJZzNRc7Qy8vLQ7du3Tj3R7rF4CNdqWyNzVdffVXr0qiG3nvvPRw8eJBzf6RbvNRJunHu3DkMGzbMdV/eyJEjsXDhQq+ey6uML13qLK/83F9YWBgWLlzI+/5INxh8pBuXL19GVFQU/P39ve6+vNry5eBz4m7vpFcMPtJUWloaWrVqhYCAAADA/v370aZNG58c5ZVmhOADbhz9bdq0CUOGDNG6LDI4zvGRJpxzeXfeeSdee+011/PdunXz+dAzktL3/c2dOxeDBw92fS0/P1/DysjIGHzkceVXX/npp598fuRjdBEREXj++eddI92jR4+iVatW3O+PNMHgI4+prGNz5cqVbHowmPfeew+XL1/mfn+kCc7xkUdcvXoVsbGxhujYrAmjzPFVpqLOzzfffBOjR4/mmyByO474yCNsNhssFgvX2CQAVe/2fvHiRa3LIx/HER+5TWpqKgIDA3HzzTcDkO3tFouFgQeO+EorPforKirCsWPH0Lp1a63LIh/G4CPVld4vr1u3bti9ezfMZl5cKI3Bd6OMjAwcOXIEffv2BQA4HA5cunQJzZo107gy8jV8NSJVle/YbNWqFex2u9ZlkRcIDw93hR4ALF26FHfccQc7P0l1DD5SRWUdm2vXroXVatW6PPJCycnJZeb+2PlJauGlTlLM4XCgd+/e2LNnDwB2bNYEL3VWj52f5C4c8ZFiZrMZvXv3Zscmqaqyzs/+/fvjypUrWpdHXowjPqqT1NRUnDt3Dn369AEAFBcX49q1awy8GuKIr3ZKj/5uueUW/Pe//3Wt70pUWww+qpXSHZtWqxUnTpxg110dMPjqJiMjAzk5Obj99tsBAJcuXUJRURF3fKBa4aVOqrHyHZuxsbEICgrSuiwykPDwcFfoCSEwceJEREVFcbd3qhUGH1Wrqo5NXtokrdjtdhQWFiI7O5u7vVOtMPioWvHx8a5R3siRI3HixAmf3iSWvIPFYsHWrVuxbt062Gw2bN++HVFRUbzvj6rFOT6q1r59+zB06FAsXbqUgacSzvGpq/xu7/3798enn34KPz8/jSsjPeKIj26QkpKCefPmuR5HR0cjLS2NoUe6FRERUWb016ZNG4YeVYojPnIpKSnBwoUL8dJLL8Fut2PXrl2u2xVIXRzxuU9GRgbCwsJcKwYdPHgQERER7PwkF474CIAc5fXs2RPTpk2D3W7HqFGj0LVrV63LIqq18PBwV+j99ttvGDRoEDs/qQwGn8GVlJRg/vz56NSpE/bt24eIiAhs27YNa9asYccmeb2CggJ07NiRnZ9UBoPP4F5//fUyo7zjx4+jf//+WpdFpIomTZpU2PnJ0Z+xcY7P4LKystCnTx/MmjWLgedBnOPzvPKdn0888QTeeecdjasiLXDEZzCpqakYPXq0a488m82G/fv3M/TI55Xv/PzjH/+odUmkEQafQZSUlODNN99Ex44dsXbtWsyZM8f1NW7xQkbh3PHh7NmzZd7srV+/nnN/BsLgM4DU1FTExMRg6tSprtVXJk+erHVZRJqx2Wyuzw8cOIDRo0dz7s9AGHw+rPQoLzk5GeHh4di6dSvX2CQqpUWLFujfvz87Pw2EzS0+bNu2bYiLiwPAXdH1hs0t+lLRbu8LFy7EqFGjOBXggxh8PkwIgfHjxyMuLs4VgKQPDD59Kt/5+corr+Cll17SuCpSG4NPDcXFQH4+YDIBFgug0RqBqampmDhxIpYsWYJ27dppUgPVDINPv5yjv9mzZyMxMRERERFaFwTY7UBhIRAUJD84ClWEwVdbp08DBw4A33wDJCUBp07JX0hn2BUXA1YrEBUF9OwJdOsmP1q2dFtJpXdFt9vtGDhwID755BO3nY+UY/DpX3FxMfz9/QHIv7EXX3wRzzzzDJo3b+6+k+bmAgcPAocOAV99BRw+DPzyC2A2yw+HQ35ERgJduwIxMUDnzkCXLkBwsPvq8jWCqpeXJ8Tq1ULccYcQFosQ9eoJId+HVf1hNgsRGipEcLAQXbsKsWWLEIWFqpaWkpIioqOjBQABQIwcOVJcuXJF1XOQ+pz/v8g7LFiwQAAQYWFhYtWqVcLhcKh7ghMnhBg7Vr6+1K8vRGBgzV5jgoLk99erJ8Qzzwjxww/q1uWj+JdXlStXhJg8Wf5S1TTsqvoIDRXCZhNi5kwZpgoUFxeL+fPni+DgYAFAhIeHi4SEBJX+w8ndGHze5eLFiyIuLs71/61fv34iPT1d+YF37RKic2cZeP7+yl5fAgLkm+wePYRISlJemw/jX15ltm4VokED+Y5KaeCV/7BYhIiMFCI5uc7lnT17VlgsFo7yvBSDz/s4HA6xbt06YbPZlI/+rl4VYuhQIaxW9V9fnK8xEyYIkZur+r+DL+AcX3lXrwLjxgHbtwN5ee49l8UCxMcDb7whP69GSUkJzGaza35o9erVaNKkCTeI9UKc4/NeGRkZGD9+PBISEgAAW7ZswaBBg2p+gO3bgREj5HxeQYGbqoR8TbHZgE2bgB493HceL8TgKy0tDbj/fiA7272/kKVZLECLFkBiInDTTZV+W2pqKsaMGYMxY8bgySef9Ext5DYMPu8mfu/83Lx5Mz7++OOa7fYuBPDyy8Cbb7r/TXVpFgvw+usAV2tyYfA5HT8u3xVlZ8tfUE8KCACaNgX++1/ZrVVK+Y7NO+64A8ePH6/ZHxrpFoPP96Snp2PatGmYP3/+jbu9CwH85S/AmjWeDT0nqxWYPh2YOdPz59YhLlkGAD/8IG89yMryfOgBQFERkJEBREcDly+7nk5NTUXPnj3x3HPPudbY3LdvH0OPSIemTZuGTZs2Vbzm5/Tp2oUeIM87Zw4wb54259cbjeYW9ePaNSEiIuStB+6YZK5tV1aHDqLYbmfHpo8Dm1t8zoULF0RsbOyNnZ8rVriviaW2H1arEB9/rPU/leZ4qTM+HvjgA7kygh6EhKB4+nR03rIFR48e5RqbPoqXOn2TEGXX/GwfGor/KyhAQGGh1qVdZ7PJfoZGjbSuRDPGDr7du4G4OO0uP1TGYsH3Gzbgh8BAdmz6KAafb8vIyMD4cePw4rZt6AogQOuCSgsMBPr2BQy8upNxg+/aNeC224BLl7Su5EYmE9CuHXDkCPD7kknkWxh8vk8sXYriZ59FgKc6xGvDagU2bAAMugu9cZtbliyR4adHQgDnzgFbtmhdCRHVhd0O0/Tp+gw9QF7levppue6nARkz+EpKgIUL5Y4KepWbC8ydq3UVRFQXW7Zo0yFeG9euAV98oXUVmjBm8O3cqZ9mlqqcOiXvLyQi7zJnDpCTo3UVVcvJMeyba2MG39y5yi9z2mzAyJHAO+/IrUMuXJCrvWRnyy1F/v53QGknZmGhXOWBiLzHt98CZ84oP07DhsCrrwJHj8rXq2vX5Oevvqr8tcUpORk4f16dY3kR4zW3XLsm23iLipQdZ9Cg6ufgLl4EHngASEmp+3nq1QN++40bT/oYNrf4sOnTgfnz5ZRKXUVFAZ9/DlS2Ce7Fi0CfPsCJE3U/ByD38Pvf/wWefVbZcbyM8UZ8334rO5rUkpUFbNwo1+CbN0/+QjpFRADLlys7fkmJId+REXmtvXuVhV5wMPDRR9dD7+pVeZVqzhz5OSC/9u9/y93YlbDbZb0GY7xe+cOH1Znfu3IFeOYZYOXKsk0yc+bIebmmTeXjHj3kqK2u1/sDAmTNrVopr5mI3EsI5fPyw4YBbdpcf/z447IvAZAhtX27/LxtW/m9q1YpO9+hQ8p+3gsZb8S3d686Oy/s2QMsXnxjZ+ivv8qdFpzMZnnDaF3l5MjFq4lI/86fV36LQOl767Kzr4ceID//7bfrj//0J2XnAuS9zHq9tctNjBd8337r/nPcccf1z9PS5OiwrhwO4JtvlNdERO733XfyKo0SnTpd//zs2bJfE6Lscx07KjsXIKd+DNY9brzgc3eL8cyZQPv2ZR8rlZ2t/BhE5H7Z2cpHfKXX0Cw9uqvoucaNlZ2rqvP4MOPN8blrsViTSTa3TJ16/bnZs+UC2ErpdfUHIirLbld3NZSKurnV7vAWwjvua1aR8YLP7IZBbr16MuCcC0o7HMALL8iWZjVw/z0i7+DnpzyYMjOvb0hdv/6NXy/93K+/KjsXIOs12GuM8YJPaftveS1bAgkJQIcO8nFuLjBiBPDxx+qdIzhYvWMRkftYLMrfXB85cj34WreWweS839Nkks85ffedsnM5WSzqHMdLGG+Or1kz9Y7VrRuwf//10PvpJ6B7d3VDD5DhSkT6FxmpfMRXerug+vXlFkJOffsCoaHXH6vxWlNSUvmN8j7KeCu3PPUUsHSp8uPcdx/w5ZfX3ykVF8uFr3/++cbv3bQJSE+v23mCgoDXXjPcygq+jiu3+Cg1VoYKDpYjOee9fFlZ1xfCGDfu+nJlqamyq1Pp/FxQkLxSZaDLnca71HnffcD69cq7O9u0KXt5wN8fmDat4u89dKjuwRccDHTuXLefJSLPCg0FmjQpu4JTbdnt8v68//wHCA+X6wJPn172ezIy5Peo0ZTSpo2hQg8w4qVObwuRvDzgrru0roKIaqpLF+XHOHFC3hb12mvy89xc+XHihHyufXvl63Q6de+uznG8iPEudZaUyHdQet8yxOnWW+VN8ORTeKnThy1dKq/+5OVpXUn1QkPlkmd//rPWlXiU8UZ8fn7AE08oX13BE0JCOLdH5G0ee8x7djY3mYC4OK2r8DjjBR8ATJrkHde0HQ55awQReQ+bTW5bpvfXmMBAYPx49W/x8gLGDL5bbwW6dtW6iqr5+wOPPlrxDaxEpG9Tp+o/UMxm4Omnta5CE8YMPgCYMUNeStSrgADguee0roKI6uLuu4G2bSH0uoG0vz/Qq5dhtzszbvA99BDQu7eyLYPcJA/AyZgYiHbttC6FiOrox1dfRYFegy84WO4lalDGDT4AeOcd3S3V4wBwCcBdO3diwIABuKjkfiAi8jiHw4FFixbhD4MG4R8OB3K1Lqi8kBC52Ebz5lpXohljB1/jxsDq1XI/Kp0wWSw4/vLLsISFYdu2bYiKisL69evZ9k7kBdLS0tCrVy9MmTIF+fn5SH/sMQTdcYf6OyrUlb+/vJc5Pl7rSrQlSIgxY4SwWoWQS8Fq92G1CvHKK0IIIdLT00W/fv0EAAFAxMbGiszMTI3/oUgtzv+v5DvefvttYbFYBADRtGlT8cknn8gvpKQIUb++9q8vJpMQjRsLkZ6u7T+UDhh7xOe0ciXw4IPaXva0WuX9hTNmAAAiIyOxbds2rF69GmFhYTh37hxC9NyMQ2RweXl5yM/Px7Bhw3Dy5EkMHDhQfqFNG2D3bm2b6UwmICwMSE6+vvODgRlv5ZbKFBXJ2wd27vT8igtWKzBhgtzItoJLIhcuXEB2djba/d7scuXKFRQUFCA8PNyzdZJquHKL93M4HDh16pTr77KkpAR79+7FAw88UPEPHDgg32B7erdzs1neW5iYCLBhDoDR5/hKCwgANm8GnnzScyM/k0mea/ZsuWltJfMAkZGRrj8uAJg0aRLatWvHuT8ijaSlpSEmJgbR0dG4cOECAMDPz6/y0AOAe+65PuLy1GuM1Qrccgtw+DBDrxQGX2lmM7BokRz1hYe795fTapWXQPbvB55/vsY/VlBQgKtXryIrKwsjR47EwIED2flJ5CHOjs0OHTogKSkJwcHBOHfuXM0P0L693E4oPt69ry/ON9VTpwInTwI33+y+c3kjbacYdSw3V4gJE4SwWIQICFBvgjkoSB5z9mwhCgvrVJrD4RCrVq0SYWFhAoCw2Wxi3bp1wuFwqPyPQO4CNrd4ndOnT4vu3bu7/t8NGzZMWcNZcrIQkZFC1KunbhNLvXpC3H67EEeOqPcf72P4l1edlBQhnnpKiJAQ+VHXX8bQUCFsNiH+9jchfvpJldJ++ukn0bdvX9cfYlxcnCgqKlLl2OReDD7v8v7771fcsalUQYEQGzcKcddd8g2xn1/dXl8CAoQIDhYiOlqITz8Vgq8DVeKlzuq0aQP861/ApUvyMujdd8s1+EJC5JYeFc3Lmc1yjU2rVX7cf7+8Wf7SJeDVV1W7cbR58+b47LPPsGrVKoSFhaF58+bw9zfe3sJE7nb77bejsLDwxo5NpQIDgaFDgf/7P9n8MmqUnGYJCJBdmJWt9xkcLF9j/P2BFi3kYtNHj8o5xAED5PNUKXZ11oXDAZw+LSeMDxwAfvlFbhJpMslAbN5cTmR37iyvrXvg5tX09HTYbDbUq1cPAHDkyBHcdNNNiIiIcPu5qfbY1alvDocDn3/+OR5++GHXcykpKWjbtq1nCsjOBr79Vr7GHD0q9w8tKLgeeB07yteXTp2A3//mqeYYfD4oNzcXHTp0wJUrV7B48WIMHz7c9UJL+sDg06+0tDTEx8cjMTERW7duRZwB96vzdbzU6YPy8vLQtm3bMp2fGRkZWpdFpGulOzYTExPRtGlTTh34KAafD2rSpEmZub+EhATe90dUhfJrbDrn8vr27at1aeQGvNTp49LT0zFu3Djs2LEDABAfH493331X46qIlzr1Y/fu3YiNjUV+fj6aNm2K5cuXq9e8QrrEEZ+PK9/52a9fP61LItKVLl26oEmTJup3bJJuccRnIJmZmWjUqJHr8Ycffoju3buz81MDHPFpx+FwYNWqVXj88cdh/X1LsvJ/G+TbOOIzkNJ/2EeOHMGwYcO43x8ZinMub+zYsZjx+04oABh6BsPgM6gmTZrgwQcfZOcnGUJFHZu9evXSuizSCIPPoCIjI9n5SYZQWccm5/KMi3N8dEPn59///nfMnDlT46p8G+f4POOHH37AnXfeyY5NKoPBRwDkC/CaNWswa9YsJCYmolWrVlqX5NMYfJ4zePBgBAUFYfHixWjYsKHW5ZAOMPiojMLCQgQGBgKQ8yKzZs3CxIkT2fmpMgafezgcDrz11luIiYlBx44dAZT9nSYCOMdH5ZR+gVi2bBn++c9/svOTvIJzLu+ZZ57BmDFjUFJSAgAMPboBg48qNXDgQPTr18/V+TlgwADu9k66U1HH5qxZs+Dn56d1aaRTvNRJVRJCYO3atZgyZQqys7Nhs9m444MKeKlTHaV3UgCAYcOGcS6PqsXgoxq5cOECxo0bh+3btwMANm7ciKFDh2pclfdi8CmXn5+Pm2++GZcuXWLHJtUKg49qzDn6e//997F9+3Zu2aIAg08dS5cuRXJyMkd5VCsMPqo1IYTrhfvnn3/GtGnTMHfuXHZ+1gKDr/YcDgeWLFkCq9WKsWPHAij7u0hUUww+UmTEiBHYsGED5/5qicFXO2lpaRgzZgySkpIQEhKCM2fO4KabbtK6LPJS7OokRV5//XV2fpLblO7YTEpKQrNmzfD+++8z9EgRjvhIMXZ+1h5HfNUrPcoDgOHDh2PRokWcyyPFGHykmtKdn2azGceOHUO7du20LkuXGHzV69mzJxITE9GsWTMsX74cAwYM0Lok8hEMPlKVc/R3/vx5LnRdBQZf9Y4dO4b58+djwYIFHOWRqhh85HY7d+7E22+/jWXLlrHz83cMvrKca2wePHgQ69at4yVycisGH7mVEAIdOnTA8ePHOfdXCoPvuvKrryQnJyM6OlrjqsiXsauT3MpkMmHHjh3o27cvOz+pjIrW2Pz4448ZeuR2HPGRRzj3+3v22WfZ+QmO+MqP8h5//HEsXrwYjRo10rgyMgIGH3lU6d3eIyMj8f333yM0NFTrsjzO6MH3wgsv4I033kDTpk2xbNkyPPLII1qXRAbC4COPc3Z+hoeH46GHHgIAFBcXw8/PzzCjPyMGX3FxsWt917y8PMycORN//etfOcojj2PwkS688MILOHXqFJYvX47w8HCty3E7IwWfc43NpUuXYv/+/QgLC9O6JDI4NreQ5rKysvDuu+8iISEB7dq1427vPsS5K/qUKVOQkpKCLVu2aF0SEYOPtGez2fDdd9+V6fwcOHAgMjIytC6N6qiijs1PPvkETzzxhNalEfFSJ+mHkTo/fflSJ3dFJ73jiI90w2QyYcyYMTh+/Lhr9MdLY94nJSWlzChvw4YNDD3SFY74SJeEEFi3bh369OnjanbJyspCWFiYT4z+fG3El5WVBZvN5nq8cuVKDBo0iIFHusTgI69QXFyM6Oho10r93t756SvB5+zYfPnll/HFF1/gnnvu0bokomrxUid5hZMnTyI1NZWdnzpSumPz2rVrSEhI0Lokohph8JFXcC50zc5P7VXWsfnKK69oXRpRjfBSJ3mVijo/3377bTz22GNal1Yr3nqp88cff8SIESPYsUlejSM+8ioVdX5evnxZ67IMIyAgAMeOHWPHJnk1jvjIawkhkJCQgNjYWJjN8j1cWloabr31Vt13fnrTiO/s2bNo2bIl/Pz8AABff/012rdvz8Ajr8URH3ktk8mEAQMGuELv/PnzuPvuu7nfn0qcc3lRUVFYsGCB6/mePXsy9MirMfjIZ5w6dQpmsxnbtm1DVFQUOz8VSEtLQ0xMDKZMmYL8/HykpqZqXRKRahh85DP69OmDEydOoF+/ftztvY5Kd2wmJSWhWbNm+PTTT7Fy5UqtSyNSDef4yOc49/ubMmWKq/Nz/fr1iI2N1bo0Fz3O8WVmZuKRRx5BUlISAGD48OFYtGgRL2uSz+GIj3yOyWTC6NGjXaO/nJwcNG/eXOuydM9ms0EI4RrlrV+/nqFHPokjPvJpQggcPXoUHTt2dD339ddfo0ePHpp2fuplxJeWlgaLxYLIyEgAskGoXr16DDzyaRzxkU8zmUxlQu+jjz5CTEyMx1d9KSgADh8GVqwAZs8GgDcALMTf/gbMnQvs2gX8+qvHyikzl/fkk0+6Arhly5YMPfJ5/loXQORJRUVFCAsLQ0JCAhITE92639+xY8C//gV8+SXw449AcDBQUgLk5QHANADAa68BAQGAxQLY7UBoKHD33cATTwB//CMQGKh6WTfsl9eoUSPY7XZYLBb1T0akQ7zUSYaTnp6OcePGYceOHQCA2NhYLF++HBEREYqPXVgIfPQRMGcOkJIiH5eU1P44oaGA2QxMmAA8/TTQooXi0lw7Kfz1r39Ffn4+mjZtiuXLl2PgwIHKD07kRRh8ZEgVdX7u2LED9957b52PuX07MHKkDLtr19SpMygIMJnkCHDuXMBqrdtxSkpK8OCDD2LPnj0A2LFJxsY5PjKk8p2fDRs2xJ133lmnY2VlAY8+CgweDGRmqhd6gJwbtNuBVauANm2A5OS6HcfPzw/3338/OzaJwBEfEYQQ+OWXX9CsWTMAQE5ODj777DMMGTKk2rm/r74CBg0CcnNlSLmbxQKMHQssWAD8vnRmpdLS0nDhwgXExMQAAAoLC5GTk8PAI8PjiI8Mz2QyuUIPAF588UU8+uij1XZ+fvwx0K8fcOWKZ0IPAPLzgXfekY0vhYUVf0/pjs2hQ4ciMzMTABAYGMjQIwKDj+gGXbt2dXV+Vrbb+7//DQwbJoPI0/LygC++AOLigOLisl8rvSt6fn4+evfurfudKog8jZc6iSpQvvMzLi4Oy5cvR3h4OL78EhgwwHlbgnasVqB/f2DTJkAIdmwS1RSDj6gS5Xd7b9CgAfbuPYEePcKRna11dVJICLBwIbB37whs2LABAHdFJ6oOg4+oGs7Rn81mQ27u+9i5s/L5NS2EhADvvJOMqVMHY+nSpRzlEVWDwUdUA0IIbNxYiCefDNL8Emd5/v7AvfcCu3blw2rl6itE1WHwEdXAtWtAy5bynj09CgkBli0Dhg/XuhIi/WNXJ1ENbNgAFBVpXUXlcnPl4td8G0tUPY74iKohBHDLLcC5c1pXUrWQEHmbg4JV14gMgSM+omokJQGXLys/zuzZwNatwOnT8qb3oiIgOxs4ehR4+22gfXtlx8/PB+bNU14nka/jiI+oGn/6E/DJJ8ovI1b384WFcr3PrVvrfo7gYODiRaBBg7ofg8jXMfiIqtGokRyhKfXzz3L0eOaMPF69ekCfPkDXrte/5+RJICqq7ucIC5M3tD/0kPJ6iXwVg4+oCpcvA82bu+++PZMJ+P57oG1b+Tg/v+5bDwFyU9uZM4GXXlKnPiJfxDk+oiocPix3RFCbyQQ0bCi3M2rZ8vrzx44pO25Rkdwxgogq5691AUR6duCAvFVALa1aVd4d+uuvwOTJys9x5IjyYxD5Mo74iKqQmnrjDgjucPIk8D//A+zfr/xYmZmAw6H8OES+iiM+oiqoOdoDZFPLtGlymbFmzYDYWOC224B27eToMj4e2LhR2Tn8/OT+gO64REvkC9jcQlSF2Fjgs8/cd3w/P2DnTqB3b/k4Nxe49Vbgl1/qfsyAAHnZtH59dWok8jW81ElUheBg9x6/pARISLj+OCQE6NZN2TGLi91fN5E3Y/ARVUGtLe169Kj4pnKTCejbt+xzSq/BmM1y1EdEFeMcH1EV7r5b3lendCui+HjgscfkrQbffit3eWjcGOjXT87vOWVnA3v3KjvXzTfLQCWiijH4iKrQubNsRFFDUJBcUaWyVVV++03e1/fbb8rOc999yn6eyNcx+Iiq0KGDXE1FqXfflYF2771yJZhGjeTzV68CKSlyV4UVK4BLl5Sdx2oFundXXi+RL2NXJ1E1brsN+OEHrauomdBQYPduoEsXrSsh0i82txBV4/HHvadLMigIuOsurasg0jcGH1E1Jk70jp3Ng4OBZ56R9wYSUeUYfETVCA+XN5h7Q6fkuHFaV0Ckfww+ohp4/nll2wW5m9kMPPwwcNNNWldCpH9sbiGqASFkt+SBA55ZtLq2LBa5hdIf/qB1JUT6xxEfUQ2YTMAHH8jmEb0JCZEbzzL0iGqGwUdUQy1bAvPmyaDRC5MJaN0amD5d60qIvAcvdRLVghBy3c2DB4HCQq2rkfOOhw5xtEdUGxzxEdWCySR3U2jRQr2lzOrKYgE+/JChR1RbDD6iWmrQAEhOBiIjtdsFwWKRy6D176/N+Ym8GS91EtXRr78CMTHAmTOA3e6Zc5pMMvQ2bgTi4jxzTiJfwxEfUR01bixvbxg9WoaRu1mtct3QffsYekRKcMRHpIKvv5ZbCmVlqbObQ2kmk1yObOpUYNYsbjJLpBSDj0gleXkymJYtk49zcpQdLzBQrsjStSuweDHQqZPiEokIDD4i1eXnA5s3A3PmAOfOyVsgajoK9PeXlzQdDmDsWGDSJHmfHhGph8FH5EZHj8oO0KQkYP9+4Px5eanSbJaXMB0OoKhI3hTfqZNslunaFXjgAe/ZConI2zD4iDyooAC4fFmOAEtKZLjVrw80bKh1ZUTGweAjIiJD4e0MRERkKAw+IiIyFAYfEREZCoOPiIgMhcFHRESGwuAjIiJDYfAREZGhMPiIiMhQGHxERGQoDD4iIjIUBh8RERkKg4+IiAyFwUdERIbC4CMiIkNh8BERkaEw+IiIyFAYfEREZCgMPiIiMhQGHxERGQqDj4iIDIXBR0REhsLgIyIiQ2HwERGRoTD4iIjIUBh8RERkKAw+IiIyFAYfEREZCoOPiIgMhcFHRESGwuAjIiJDYfAREZGhMPiIiMhQGHxERGQo/w9aFCJRiVNAFQAAAABJRU5ErkJggg==\n",
Q
Quleaf 已提交
599 600 601 602 603 604 605 606 607
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
Q
Quleaf 已提交
608
    "# Find the most frequent bit string in the measurement results\n",
Q
Quleaf 已提交
609
    "cut_bitstring = max(prob_measure, key=prob_measure.get)\n",
Q
Quleaf 已提交
610
    "print(\"The bit string form of the cut found:\", cut_bitstring)\n",
Q
Quleaf 已提交
611
    "\n",
Q
Quleaf 已提交
612
    "# Draw the cut corresponding to the bit string obtained above on the graph\n",
Q
Quleaf 已提交
613 614
    "node_cut = [\"blue\" if cut_bitstring[v] == \"1\" else \"red\" for v in V]\n",
    "\n",
Q
Quleaf 已提交
615 616 617 618 619 620 621 622
    "edge_cut = []\n",
    "for u in range(n):\n",
    "    for v in range(u+1,n):\n",
    "        if (u, v) in E or (v, u) in E:\n",
    "            if cut_bitstring[u] == cut_bitstring[v]:\n",
    "                edge_cut.append(\"solid\")\n",
    "            else:\n",
    "                edge_cut.append(\"dashed\")\n",
Q
Quleaf 已提交
623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639
    "nx.draw(\n",
    "        G,\n",
    "        pos,\n",
    "        node_color=node_cut,\n",
    "        style=edge_cut,\n",
    "        **options\n",
    ")\n",
    "ax = plt.gca()\n",
    "ax.margins(0.20)\n",
    "plt.axis(\"off\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Q
Quleaf 已提交
640
    "As you can see, in this example, QAOA has found a maximum cut on the graph."
Q
Quleaf 已提交
641 642 643 644 645 646 647 648
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "_______\n",
    "\n",
Q
Quleaf 已提交
649
    "## References\n",
Q
Quleaf 已提交
650
    "\n",
Q
Quleaf 已提交
651
    "[1] Farhi, E., Goldstone, J. & Gutmann, S. A Quantum Approximate Optimization Algorithm. [arXiv:1411.4028 (2014).](https://arxiv.org/abs/1411.4028)"
Q
Quleaf 已提交
652 653 654 655
   ]
  }
 ],
 "metadata": {
Q
Quleaf 已提交
656 657 658
  "interpreter": {
   "hash": "3b61f83e8397e1c9fcea57a3d9915794102e67724879b24295f8014f41a14d85"
  },
Q
Quleaf 已提交
659 660 661 662 663 664 665 666 667 668 669 670 671 672 673
  "kernelspec": {
   "display_name": "Python 3",
   "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",
Q
Quleaf 已提交
674
   "version": "3.7.11"
Q
Quleaf 已提交
675 676 677 678 679 680 681 682 683 684
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
Q
Quleaf 已提交
685 686 687 688 689 690
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "426.667px"
   },
Q
Quleaf 已提交
691
   "toc_section_display": true,
Q
Quleaf 已提交
692
   "toc_window_display": false
Q
Quleaf 已提交
693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
Q
Quleaf 已提交
722 723 724 725 726
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}