Switch to unified view

a b/Code/All Qiskit ML Demos/07 Pegasos QSVM 22.5s kkawchak.ipynb
1
{
2
 "cells": [
3
  {
4
   "cell_type": "markdown",
5
   "id": "opened-florist",
6
   "metadata": {},
7
   "source": [
8
    "import time\n",
9
    "seconds = time.time()\n",
10
    "print(\"Time in seconds since beginning of run:\", seconds)\n",
11
    "local_time = time.ctime(seconds)\n",
12
    "print(local_time)\n",
13
    "# Pegasos Quantum Support Vector Classifier\n",
14
    "\n",
15
    "There's another SVM based algorithm that benefits from the quantum kernel method. Here, we introduce an implementation of a another classification algorithm, which is an alternative version to the `QSVC` available in Qiskit Machine Learning and shown in the [\"Quantum Kernel Machine Learning\"](./03_quantum_kernel.ipynb) tutorial. This classification algorithm implements the Pegasos algorithm from the paper \"Pegasos: Primal Estimated sub-GrAdient SOlver for SVM\" by Shalev-Shwartz et al., see: https://home.ttic.edu/~nati/Publications/PegasosMPB.pdf.\n",
16
    "\n",
17
    "This algorithm is an alternative to the dual optimization from the `scikit-learn` package, benefits from the kernel trick, and yields a training complexity that is independent of the size of the training set. Thus, the `PegasosQSVC` is expected to train faster than QSVC for sufficiently large training sets.\n",
18
    "\n",
19
    "The algorithm can be used as direct replacement of `QSVC` with some hyper-parameterization."
20
   ]
21
  },
22
  {
23
   "cell_type": "code",
24
   "execution_count": 12,
25
   "id": "759a01c7-b426-4ebe-8a4e-c9b9a1104603",
26
   "metadata": {},
27
   "outputs": [
28
    {
29
     "name": "stdout",
30
     "output_type": "stream",
31
     "text": [
32
      "Time in seconds since beginning of run: 1696472962.5317466\n",
33
      "Thu Oct  5 02:29:22 2023\n"
34
     ]
35
    }
36
   ],
37
   "source": [
38
    "import time\n",
39
    "seconds = time.time()\n",
40
    "print(\"Time in seconds since beginning of run:\", seconds)\n",
41
    "local_time = time.ctime(seconds)\n",
42
    "print(local_time)"
43
   ]
44
  },
45
  {
46
   "cell_type": "markdown",
47
   "id": "thirty-painting",
48
   "metadata": {},
49
   "source": [
50
    "Let's generate some data:"
51
   ]
52
  },
53
  {
54
   "cell_type": "code",
55
   "execution_count": 13,
56
   "id": "impressed-laser",
57
   "metadata": {},
58
   "outputs": [],
59
   "source": [
60
    "from sklearn.datasets import make_blobs\n",
61
    "\n",
62
    "# example dataset\n",
63
    "features, labels = make_blobs(n_samples=20, n_features=2, centers=2, random_state=3, shuffle=True)"
64
   ]
65
  },
66
  {
67
   "cell_type": "markdown",
68
   "id": "moderate-yugoslavia",
69
   "metadata": {},
70
   "source": [
71
    "We pre-process the data to ensure compatibility with the rotation encoding and split it into the training and test datasets."
72
   ]
73
  },
74
  {
75
   "cell_type": "code",
76
   "execution_count": 14,
77
   "id": "adolescent-composer",
78
   "metadata": {},
79
   "outputs": [],
80
   "source": [
81
    "import numpy as np\n",
82
    "\n",
83
    "from sklearn.model_selection import train_test_split\n",
84
    "from sklearn.preprocessing import MinMaxScaler\n",
85
    "\n",
86
    "features = MinMaxScaler(feature_range=(0, np.pi)).fit_transform(features)\n",
87
    "\n",
88
    "train_features, test_features, train_labels, test_labels = train_test_split(\n",
89
    "    features, labels, train_size=15, shuffle=False\n",
90
    ")"
91
   ]
92
  },
93
  {
94
   "cell_type": "markdown",
95
   "id": "central-poverty",
96
   "metadata": {},
97
   "source": [
98
    "We have two features in the dataset, so we set a number of qubits to the number of features in the dataset.\n",
99
    "\n",
100
    "Then we set $\\tau$ to the number of steps performed during the training procedure. Please note that, there is no early stopping criterion in the algorithm. The algorithm iterates over all $\\tau$ steps.\n",
101
    "\n",
102
    "And the last one is the hyperparameter $C$. This is a positive regularization parameter. The strength of the regularization is inversely proportional to $C$. Smaller $C$ induce smaller weights which generally helps preventing overfitting. However, due to the nature of this algorithm, some of the computation steps become trivial for larger $C$. Thus, larger $C$ improve the performance of the algorithm drastically. If the data is linearly separable in feature space, $C$ should be chosen to be large. If the separation is not perfect, $C$ should be chosen smaller to prevent overfitting."
103
   ]
104
  },
105
  {
106
   "cell_type": "code",
107
   "execution_count": 15,
108
   "id": "dying-dispatch",
109
   "metadata": {},
110
   "outputs": [],
111
   "source": [
112
    "# number of qubits is equal to the number of features\n",
113
    "num_qubits = 2\n",
114
    "\n",
115
    "# number of steps performed during the training procedure\n",
116
    "tau = 50\n",
117
    "\n",
118
    "# regularization parameter\n",
119
    "C = 1000"
120
   ]
121
  },
122
  {
123
   "cell_type": "markdown",
124
   "id": "improving-wilderness",
125
   "metadata": {},
126
   "source": [
127
    "The algorithm will run using:\n",
128
    "\n",
129
    "- The default fidelity instantiated in `FidelityQuantumKernel`\n",
130
    "- A quantum kernel created from `ZFeatureMap`"
131
   ]
132
  },
133
  {
134
   "cell_type": "code",
135
   "execution_count": 16,
136
   "id": "automated-allergy",
137
   "metadata": {},
138
   "outputs": [],
139
   "source": [
140
    "from qiskit import BasicAer\n",
141
    "from qiskit.circuit.library import ZFeatureMap\n",
142
    "from qiskit.utils import algorithm_globals\n",
143
    "\n",
144
    "from qiskit_machine_learning.kernels import FidelityQuantumKernel\n",
145
    "\n",
146
    "algorithm_globals.random_seed = 12345\n",
147
    "\n",
148
    "feature_map = ZFeatureMap(feature_dimension=num_qubits, reps=1)\n",
149
    "\n",
150
    "qkernel = FidelityQuantumKernel(feature_map=feature_map)"
151
   ]
152
  },
153
  {
154
   "cell_type": "markdown",
155
   "id": "attractive-stationery",
156
   "metadata": {},
157
   "source": [
158
    "The implementation `PegasosQSVC` is compatible with the `scikit-learn` interfaces and has a pretty standard way of training a model. In the constructor we pass parameters of the algorithm, in this case there are a regularization hyper-parameter $C$ and a number of steps.\n",
159
    "\n",
160
    "Then we pass training features and labels to the `fit` method, which trains a models and returns a fitted classifier.\n",
161
    "\n",
162
    "Afterwards, we score our model using test features and labels."
163
   ]
164
  },
165
  {
166
   "cell_type": "code",
167
   "execution_count": 17,
168
   "id": "representative-thumb",
169
   "metadata": {},
170
   "outputs": [
171
    {
172
     "name": "stdout",
173
     "output_type": "stream",
174
     "text": [
175
      "PegasosQSVC classification test score: 1.0\n"
176
     ]
177
    }
178
   ],
179
   "source": [
180
    "from qiskit_machine_learning.algorithms import PegasosQSVC\n",
181
    "\n",
182
    "pegasos_qsvc = PegasosQSVC(quantum_kernel=qkernel, C=C, num_steps=tau)\n",
183
    "\n",
184
    "# training\n",
185
    "pegasos_qsvc.fit(train_features, train_labels)\n",
186
    "\n",
187
    "# testing\n",
188
    "pegasos_score = pegasos_qsvc.score(test_features, test_labels)\n",
189
    "print(f\"PegasosQSVC classification test score: {pegasos_score}\")"
190
   ]
191
  },
192
  {
193
   "cell_type": "markdown",
194
   "id": "sustainable-empire",
195
   "metadata": {},
196
   "source": [
197
    "For visualization purposes we create a mesh grid of a predefined step that spans our minimum and maximum values we applied in MinMaxScaler. We also add some margin to the grid for better representation of the training and test samples."
198
   ]
199
  },
200
  {
201
   "cell_type": "code",
202
   "execution_count": 18,
203
   "id": "judicial-pottery",
204
   "metadata": {},
205
   "outputs": [],
206
   "source": [
207
    "grid_step = 0.2\n",
208
    "margin = 0.2\n",
209
    "grid_x, grid_y = np.meshgrid(\n",
210
    "    np.arange(-margin, np.pi + margin, grid_step), np.arange(-margin, np.pi + margin, grid_step)\n",
211
    ")"
212
   ]
213
  },
214
  {
215
   "cell_type": "markdown",
216
   "id": "marine-constitution",
217
   "metadata": {},
218
   "source": [
219
    "We convert the grid to the shape compatible with the model, the shape should be `(n_samples, n_features)`.\n",
220
    "Then for each grid point we predict a label. In our case predicted labels will be used for coloring the grid."
221
   ]
222
  },
223
  {
224
   "cell_type": "code",
225
   "execution_count": 19,
226
   "id": "competitive-outdoors",
227
   "metadata": {},
228
   "outputs": [],
229
   "source": [
230
    "meshgrid_features = np.column_stack((grid_x.ravel(), grid_y.ravel()))\n",
231
    "meshgrid_colors = pegasos_qsvc.predict(meshgrid_features)"
232
   ]
233
  },
234
  {
235
   "cell_type": "markdown",
236
   "id": "former-constraint",
237
   "metadata": {},
238
   "source": [
239
    "Finally, we plot our grid according to the labels/colors we obtained from the model. We also plot training and test samples."
240
   ]
241
  },
242
  {
243
   "cell_type": "code",
244
   "execution_count": 20,
245
   "id": "monetary-knife",
246
   "metadata": {
247
    "tags": [
248
     "nbsphinx-thumbnail"
249
    ]
250
   },
251
   "outputs": [
252
    {
253
     "data": {
254
      "image/png": "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jBYUFIR58+Y1yrmMCiufffYZOnfuDBcXF7i4uCAqKgr/+c9/6tzn22+/Rbt27eDg4IBOnTphy5Yt91VhIiIiWzZmzBhIkqRbPD090bdvX4PvBKoWExODiRMnmqweBw4cwIsvvmiy49XFqLDi7++PDz74AIcOHcLBgwcRGxuLJ598EsePH6+1/N69ezFs2DC88MILOHz4MBITE5GYmIhjx46ZpPJERESWptEAmZnAqlVVf2o05j9n3759kZ+fj/z8fGzfvh12dnYYMGDAfR9XCIHKysp6lfXy8kKzZs3u+5z1YVRYGThwIPr374/g4GC0bdsWs2fPhpOTE3766aday8+fPx99+/bFm2++idDQULz77ruIiIjAggULTFJ5IiIiS0pLA9q0AXr3BoYPr/qzTZuq9eakVqvh6+sLX19fhIeHY8qUKTh//jwuXrxYa/kxY8Zg586dmD9/vq5HJi8vD5mZmZAkCf/5z38QGRkJtVqN3bt34/Tp03jyySfh4+MDJycnPPzww/j+++/1jnn3bSBJkrB06VI89dRTaNasGYKDg7Fp0yaTtLfBY1Y0Gg1Wr16N8vJyREVF1VomKysLcXFxeuvi4+ORlZVV57ErKipQWlqqtxAREclJWhowZAjQqROQlVX1TsOsrKrPQ4aYP7BUKysrw4oVK9CmTRt4enrWWmb+/PmIiorC+PHjdT0yAQEBuu1TpkzBBx98gNzcXHTu3BllZWXo378/tm/fjsOHD6Nv374YOHAgzp07V2ddZs6ciWeffRZHjhxB//798be//Q2XL1++7zYaPSnc0aNHERUVhRs3bsDJyQnr169H+/btay1bUFAAHx8fvXU+Pj4oKCio8xzJycmYOXOmsVUjIiJqFBoN8I9/AAMGABs2AIrbv/p37171OTERmDwZePJJQKk0/fk3b94MJycnAEB5eTn8/PywefNmKBS190G4urpCpVKhWbNm8PX1rbF91qxZeOKJJ3SfPTw8EBYWpvv87rvvYv369di0aRMmTJhgsF5jxozBsGHDAADvv/8+PvnkE+zfvx99+/ZtUDurGd2zEhISgpycHOzbtw+vvPIKRo8ejRMnTtxXJe42depUlJSU6Jbz58+b9PhERET348cfgbw84O23/woq1RQKYOpU4MyZqnLm0Lt3b+Tk5CAnJwf79+9HfHw8+vXrh7NnzzboeF27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ERGRrDGsEBERkawxrBAREZGsMawQERGRrDGsEBERkawxrBAREZGsMawQERGRrDGsEBERkawxrBAREZGsMawQERGRrDGsEBERkawxrBAREZGsMawQERGRrDGsEBERkawxrBAREZGs2Vm6Asb4ulNPSEqVpatB1KQsC481y3HH5uwwy3HJ9Mz1b4DIVNizQkRERLLGsEJERESyxrBCREREssawQkRERLLGsEJERESyxrBCREREsmZVjy5bghASRFlboNINsCuG5HQKkiQsXS0iIiKbwbBSB21xBKTC4dBc99Cts3O8DK3PSijcsi1YMyIiItvB20AGaIsjoMlLQt/H3ZGVBVy9CmRlAfGxbtDkJUFbHGHpKhIREdkEhpVaCCFBKhyOAQOAjRsldO8OODkB3bsDmzYpkJAgIBUOgxCSpatKRETU5DGs1EKUtUXldQ9MmyZBcddXSKEApk1ToPK6Z9VYFiIiIjIrhpXaVLoBADp2rH2zbv3tckRERGQ+DCu1sSsGABw7Vvtm3frb5YiIiMh8GFZqITmdgp3jZbz3nhZarf42rRaYPVsLO8c/ITmdskwFiYiIbAjDSi0kSUD4rER6uoRBg7R6TwMNGqRFeroE4bOK860QERE1As6zYoDCLRsIWohtO4YjPf3OeVauQBm0ivOsEBERNRKGlToo3LIhXA9DeccMtnA6BQV7VIiIiBoNw8o9SJKA5HzS0tUgIiKyWRyzQkRERLLGsEJERESyxrBCREREssYxK0RkFsvCY01+zLE5O0x+THMxR/uJbBV7VoiIiEjWGFaIiIhI1hhWiIiISNYYVoiIiEjWGFaIiIhI1owOK7t27cLAgQPRokULSJKEDRs23HOfzMxMREREQK1Wo02bNkhNTW1AVYmIiMgWGR1WysvLERYWhoULF9ar/JkzZ5CQkIDevXsjJycHEydOxLhx47Bt2zajK0tERES2x+h5Vvr164d+/frVu/zixYvRqlUrzJkzBwAQGhqK3bt34+OPP0Z8fLyxpyciIiIbY/YxK1lZWYiLi9NbFx8fj6ysLIP7VFRUoLS0VG8hIiIi22T2sFJQUAAfHx+9dT4+PigtLcX169dr3Sc5ORmurq66JSAgwNzVJCIiIpmS5dNAU6dORUlJiW45f/68patEREREFmL2dwP5+vqisLBQb11hYSFcXFzg6OhY6z5qtRpq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xh9//GHwPBUVFSgtLdVbmjqFWzaUQQsB+2L9DfZXoAxayHlWiIjIZpl9UrioqChERUXpPkdHRyM0NBSff/453n333Vr3SU5OxsyZM81dNdlRuGVDcj3MGWypUY3N2WHpKlicOb4Gy8JjTX5MIltlVM/KAw88AKVSicLCQr31hYWF8PX1rdcx7O3t0aVLF/z2228Gy0ydOhUlJSW65fz588ZU06pJkoDC+SQU7vugcD7JoEJERDbPqLCiUqkQGRmJ7du369ZptVps375dr/ekLhqNBkePHoWfn5/BMmq1Gi4uLnoLERER2SajbwNNmjQJo0ePRteuXdGtWzfMmzcP5eXleP755wEAo0aNQsuWLZGcnAwAmDVrFrp37442bdqguLgYH330Ec6ePYtx48aZtiVERETUJBkdVoYOHYqLFy9i+vTpKCgoQHh4OLZu3aobdHvu3DkoFH912Fy5cgXjx49HQUEB3N3dERkZib1796J9+/amawURERE1WZIQQvaDIkpLS+Hq6gq7Tn+DpFRZujpETQoH2JoHB9iantDcROXRf6OkpITDA2wM3w1EREREssawQkRERLLGsEJERESyxrBCREREssawQkRERLLGsEJERESyxrBCREREssawQkRERLLGsEJERESyxrBCREREssawQkRERLLGsEJERESyxrBCREREssawQkRERLJmZ+kKUOMSQoIoawtUugF2xZCcTkGShKWrRUREZBDDig3RFkdAKhwOzXUP3To7x8vQ+qyEwi3bgjWj+hibs8PSVSAjWNP1WhYea+kqENWJt4FshLY4Apq8JPR93B1ZWcDVq0BWFhAf6wZNXhK0xRGWriIREVGtGFZsgBASpMLhGDAA2LhRQvfugJMT0L07sGmTAgkJAlLhMAghWbqqRERENTCs2ABR1haV1z0wbZoExV1XXKEApk1ToPK6Z9VYFiIiIplhWLEFlW4AgI4da9+sW3+7HBERkZwwrNgCu2IAwLFjtW/Wrb9djoiISE4YVmyA5HQKdo6X8d57Wmi1+tu0WmD2bC3sHP+E5HTKMhUkIiKqA8OKDZAkAeGzEunpEgYN0uo9DTRokBbp6RKEzyrOt0JERLLEeVZshMItGwhaiG07hiM9/c55Vq5AGbSK86wQEZFsMazYEIVbNoTrYSjvmMEWTqegYI8KERHJGMOKjZEkAcn5pKWr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hw6J5557Tjg4OIjjx49bqgk1XL16VRw+fFgcPnxYABBz584Vhw8fFmfPnhVCCDFlyhQxcuRIXfnff/9dNGvWTLz55psiNzdXLFy4UCiVSrF161ZLNaFWxrbr448/Fhs2bBC//vqrOHr0qHj99deFQqEQ33//vaWaUMMrr7wiXF1dRWZmpsjPz9ct165d05Wxxu+thrTLGr63pkyZInbu3CnOnDkjjhw5IqZMmSIkSRLfffedEMI6rxU1HQwrt3366afiwQcfFCqVSnTr1k389NNPum29evUSo0eP1iv/zTffiLZt2wqVSiU6dOgg0tPTG7nG9WNMuyZOnKgr6+PjI/r37y+ys7MtUGvDqh/ZvXupbsfo0aNFr169auwTHh4uVCqVeOihh8Ty5csbvd73Ymy7PvzwQ9G6dWvh4OAgPDw8RExMjNixY4dlKm9Abe0BoPf1t8bvrYa0yxq+t8aOHSsCAwOFSqUSXl5e4vHHH9cFFSGs81pR0yEJIUTj9eMQERERGcfmx6wQERGRvDGsEBERkawxrBAREZGsMawQERGRrDGsEBERkawxrBAREZGsMawQERGRrDGsEBERkawxrBAREZGsMawQERGRrDGsEBERkawxrBAREZGs/X9iAnoyZwKRMAAAAABJRU5ErkJggg==\n",
255
      "text/plain": [
256
       "<Figure size 500x500 with 1 Axes>"
257
      ]
258
     },
259
     "metadata": {},
260
     "output_type": "display_data"
261
    }
262
   ],
263
   "source": [
264
    "import matplotlib.pyplot as plt\n",
265
    "\n",
266
    "plt.figure(figsize=(5, 5))\n",
267
    "meshgrid_colors = meshgrid_colors.reshape(grid_x.shape)\n",
268
    "plt.pcolormesh(grid_x, grid_y, meshgrid_colors, cmap=\"RdBu\", shading=\"auto\")\n",
269
    "\n",
270
    "plt.scatter(\n",
271
    "    train_features[:, 0][train_labels == 0],\n",
272
    "    train_features[:, 1][train_labels == 0],\n",
273
    "    marker=\"s\",\n",
274
    "    facecolors=\"w\",\n",
275
    "    edgecolors=\"r\",\n",
276
    "    label=\"A train\",\n",
277
    ")\n",
278
    "plt.scatter(\n",
279
    "    train_features[:, 0][train_labels == 1],\n",
280
    "    train_features[:, 1][train_labels == 1],\n",
281
    "    marker=\"o\",\n",
282
    "    facecolors=\"w\",\n",
283
    "    edgecolors=\"b\",\n",
284
    "    label=\"B train\",\n",
285
    ")\n",
286
    "\n",
287
    "plt.scatter(\n",
288
    "    test_features[:, 0][test_labels == 0],\n",
289
    "    test_features[:, 1][test_labels == 0],\n",
290
    "    marker=\"s\",\n",
291
    "    facecolors=\"r\",\n",
292
    "    edgecolors=\"r\",\n",
293
    "    label=\"A test\",\n",
294
    ")\n",
295
    "plt.scatter(\n",
296
    "    test_features[:, 0][test_labels == 1],\n",
297
    "    test_features[:, 1][test_labels == 1],\n",
298
    "    marker=\"o\",\n",
299
    "    facecolors=\"b\",\n",
300
    "    edgecolors=\"b\",\n",
301
    "    label=\"B test\",\n",
302
    ")\n",
303
    "\n",
304
    "plt.legend(bbox_to_anchor=(1.05, 1), loc=\"upper left\", borderaxespad=0.0)\n",
305
    "plt.title(\"Pegasos Classification\")\n",
306
    "plt.show()"
307
   ]
308
  },
309
  {
310
   "cell_type": "code",
311
   "execution_count": 21,
312
   "id": "fddca436-0531-4f77-9c54-71a0ed4dc462",
313
   "metadata": {},
314
   "outputs": [
315
    {
316
     "name": "stdout",
317
     "output_type": "stream",
318
     "text": [
319
      "Time in seconds since end of run: 1696472984.9916549\n",
320
      "Thu Oct  5 02:29:44 2023\n"
321
     ]
322
    }
323
   ],
324
   "source": [
325
    "seconds = time.time()\n",
326
    "print(\"Time in seconds since end of run:\", seconds)\n",
327
    "local_time = time.ctime(seconds)\n",
328
    "print(local_time)"
329
   ]
330
  },
331
  {
332
   "cell_type": "code",
333
   "execution_count": 22,
334
   "id": "imperial-promise",
335
   "metadata": {
336
    "tags": []
337
   },
338
   "outputs": [
339
    {
340
     "data": {
341
      "text/html": [
342
       "<h3>Version Information</h3><table><tr><th>Software</th><th>Version</th></tr><tr><td><code>qiskit</code></td><td>0.44.1</td></tr><tr><td><code>qiskit-terra</code></td><td>0.25.1</td></tr><tr><td><code>qiskit_machine_learning</code></td><td>0.6.1</td></tr><tr><th colspan='2'>System information</th></tr><tr><td>Python version</td><td>3.10.8</td></tr><tr><td>Python compiler</td><td>GCC 10.4.0</td></tr><tr><td>Python build</td><td>main, Nov 22 2022 08:26:04</td></tr><tr><td>OS</td><td>Linux</td></tr><tr><td>CPUs</td><td>8</td></tr><tr><td>Memory (Gb)</td><td>31.142810821533203</td></tr><tr><td colspan='2'>Thu Oct 05 02:29:45 2023 UTC</td></tr></table>"
343
      ],
344
      "text/plain": [
345
       "<IPython.core.display.HTML object>"
346
      ]
347
     },
348
     "metadata": {},
349
     "output_type": "display_data"
350
    },
351
    {
352
     "data": {
353
      "text/html": [
354
       "<div style='width: 100%; background-color:#d5d9e0;padding-left: 10px; padding-bottom: 10px; padding-right: 10px; padding-top: 5px'><h3>This code is a part of Qiskit</h3><p>&copy; Copyright IBM 2017, 2023.</p><p>This code is licensed under the Apache License, Version 2.0. You may<br>obtain a copy of this license in the LICENSE.txt file in the root directory<br> of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.<p>Any modifications or derivative works of this code must retain this<br>copyright notice, and modified files need to carry a notice indicating<br>that they have been altered from the originals.</p></div>"
355
      ],
356
      "text/plain": [
357
       "<IPython.core.display.HTML object>"
358
      ]
359
     },
360
     "metadata": {},
361
     "output_type": "display_data"
362
    }
363
   ],
364
   "source": [
365
    "import qiskit.tools.jupyter\n",
366
    "\n",
367
    "%qiskit_version_table\n",
368
    "%qiskit_copyright"
369
   ]
370
  }
371
 ],
372
 "metadata": {
373
  "celltoolbar": "Tags",
374
  "kernelspec": {
375
   "display_name": "Python 3 (ipykernel)",
376
   "language": "python",
377
   "name": "python3"
378
  },
379
  "language_info": {
380
   "codemirror_mode": {
381
    "name": "ipython",
382
    "version": 3
383
   },
384
   "file_extension": ".py",
385
   "mimetype": "text/x-python",
386
   "name": "python",
387
   "nbconvert_exporter": "python",
388
   "pygments_lexer": "ipython3",
389
   "version": "3.10.8"
390
  },
391
  "widgets": {
392
   "application/vnd.jupyter.widget-state+json": {
393
    "state": {
394
     "2510a0810f054a83b7c0d998a97d6f05": {
395
      "model_module": "@jupyter-widgets/base",
396
      "model_module_version": "2.0.0",
397
      "model_name": "LayoutModel",
398
      "state": {
399
       "margin": "0px 0px 0px 37px",
400
       "width": "600px"
401
      }
402
     },
403
     "2740f9e368094ddf98713e368606e5f9": {
404
      "model_module": "@jupyter-widgets/controls",
405
      "model_module_version": "2.0.0",
406
      "model_name": "HTMLModel",
407
      "state": {
408
       "layout": "IPY_MODEL_c42f4a3190a24cf79347ef34f4635f42",
409
       "style": "IPY_MODEL_ca2882c4b08e4b7ebfd2d306273683ed",
410
       "value": "<p style='font-family: IBM Plex Sans, Arial, Helvetica, sans-serif; font-size: 20px; font-weight: medium;'>Circuit Properties</p>"
411
      }
412
     },
413
     "2a0d392e012645c6839339470dfa6884": {
414
      "model_module": "@jupyter-widgets/base",
415
      "model_module_version": "2.0.0",
416
      "model_name": "LayoutModel",
417
      "state": {
418
       "width": "145px"
419
      }
420
     },
421
     "2d92f0f334dc4378a343209cfa2a469a": {
422
      "model_module": "@jupyter-widgets/base",
423
      "model_module_version": "2.0.0",
424
      "model_name": "LayoutModel",
425
      "state": {
426
       "width": "70px"
427
      }
428
     },
429
     "2f4cd6604b2248a6b96e62aa082ecb0f": {
430
      "model_module": "@jupyter-widgets/controls",
431
      "model_module_version": "2.0.0",
432
      "model_name": "HTMLStyleModel",
433
      "state": {
434
       "description_width": "",
435
       "font_size": null,
436
       "text_color": null
437
      }
438
     },
439
     "3feaf14105224daa86f60ecd97a917e0": {
440
      "model_module": "@jupyter-widgets/controls",
441
      "model_module_version": "2.0.0",
442
      "model_name": "HTMLModel",
443
      "state": {
444
       "layout": "IPY_MODEL_f706d41b232847ec8ec859bddaf6d042",
445
       "style": "IPY_MODEL_2f4cd6604b2248a6b96e62aa082ecb0f",
446
       "value": "<h5>Job ID</h5>"
447
      }
448
     },
449
     "451d96f883ec485eb878bf073a80c757": {
450
      "model_module": "@jupyter-widgets/base",
451
      "model_module_version": "2.0.0",
452
      "model_name": "LayoutModel",
453
      "state": {
454
       "width": "95px"
455
      }
456
     },
457
     "4ee2dbaaa0d94460a34155eaaefa3ec2": {
458
      "model_module": "@jupyter-widgets/controls",
459
      "model_module_version": "2.0.0",
460
      "model_name": "HTMLStyleModel",
461
      "state": {
462
       "description_width": "",
463
       "font_size": null,
464
       "text_color": null
465
      }
466
     },
467
     "4fe0dc0453a944688c52221fa3ebafa0": {
468
      "model_module": "@jupyter-widgets/controls",
469
      "model_module_version": "2.0.0",
470
      "model_name": "HTMLModel",
471
      "state": {
472
       "layout": "IPY_MODEL_2d92f0f334dc4378a343209cfa2a469a",
473
       "style": "IPY_MODEL_deb18161679c4081b7847b87a971fb94",
474
       "value": "<h5>Queue</h5>"
475
      }
476
     },
477
     "720cdfcaccfa4a4dbb6108650fed055d": {
478
      "model_module": "@jupyter-widgets/controls",
479
      "model_module_version": "2.0.0",
480
      "model_name": "HTMLModel",
481
      "state": {
482
       "layout": "IPY_MODEL_2a0d392e012645c6839339470dfa6884",
483
       "style": "IPY_MODEL_f8ac1f3c5bef413f918761ac97fc3c34",
484
       "value": "<h5>Backend</h5>"
485
      }
486
     },
487
     "82953adfc54e47b4994b3521cc3ffe9d": {
488
      "model_module": "@jupyter-widgets/controls",
489
      "model_module_version": "2.0.0",
490
      "model_name": "HBoxModel",
491
      "state": {
492
       "children": [
493
        "IPY_MODEL_3feaf14105224daa86f60ecd97a917e0",
494
        "IPY_MODEL_720cdfcaccfa4a4dbb6108650fed055d",
495
        "IPY_MODEL_fd818b923dc345a98ca5dc7962c53b06",
496
        "IPY_MODEL_4fe0dc0453a944688c52221fa3ebafa0",
497
        "IPY_MODEL_ad2e5f0edf2a46c6910033225943f815"
498
       ],
499
       "layout": "IPY_MODEL_2510a0810f054a83b7c0d998a97d6f05"
500
      }
501
     },
502
     "90d2312724fd410eaad8198b3a54f96f": {
503
      "model_module": "@jupyter-widgets/base",
504
      "model_module_version": "2.0.0",
505
      "model_name": "LayoutModel",
506
      "state": {}
507
     },
508
     "985109d9783b4f4a8e8081b1c6a04908": {
509
      "model_module": "@jupyter-widgets/controls",
510
      "model_module_version": "2.0.0",
511
      "model_name": "ButtonModel",
512
      "state": {
513
       "button_style": "primary",
514
       "description": "Clear",
515
       "layout": "IPY_MODEL_b75cad7cf5af4c42beb45a611609d402",
516
       "style": "IPY_MODEL_cd92bb39ee01487c9d9dda7c9c52e086",
517
       "tooltip": null
518
      }
519
     },
520
     "9f7158bd25844ec9bb05603ca29c1d51": {
521
      "model_module": "@jupyter-widgets/controls",
522
      "model_module_version": "2.0.0",
523
      "model_name": "HTMLStyleModel",
524
      "state": {
525
       "description_width": "",
526
       "font_size": null,
527
       "text_color": null
528
      }
529
     },
530
     "ad2e5f0edf2a46c6910033225943f815": {
531
      "model_module": "@jupyter-widgets/controls",
532
      "model_module_version": "2.0.0",
533
      "model_name": "HTMLModel",
534
      "state": {
535
       "layout": "IPY_MODEL_90d2312724fd410eaad8198b3a54f96f",
536
       "style": "IPY_MODEL_4ee2dbaaa0d94460a34155eaaefa3ec2",
537
       "value": "<h5>Message</h5>"
538
      }
539
     },
540
     "b75cad7cf5af4c42beb45a611609d402": {
541
      "model_module": "@jupyter-widgets/base",
542
      "model_module_version": "2.0.0",
543
      "model_name": "LayoutModel",
544
      "state": {
545
       "grid_area": "right",
546
       "padding": "0px 0px 0px 0px",
547
       "width": "70px"
548
      }
549
     },
550
     "bcb1e868bcbc46fba7efe94ef6b00cae": {
551
      "model_module": "@jupyter-widgets/base",
552
      "model_module_version": "2.0.0",
553
      "model_name": "LayoutModel",
554
      "state": {
555
       "grid_template_areas": "\n                                       \". . . . right \"\n                                        ",
556
       "grid_template_columns": "20% 20% 20% 20% 20%",
557
       "width": "100%"
558
      }
559
     },
560
     "c42f4a3190a24cf79347ef34f4635f42": {
561
      "model_module": "@jupyter-widgets/base",
562
      "model_module_version": "2.0.0",
563
      "model_name": "LayoutModel",
564
      "state": {
565
       "margin": "0px 0px 10px 0px"
566
      }
567
     },
568
     "ca2882c4b08e4b7ebfd2d306273683ed": {
569
      "model_module": "@jupyter-widgets/controls",
570
      "model_module_version": "2.0.0",
571
      "model_name": "HTMLStyleModel",
572
      "state": {
573
       "description_width": "",
574
       "font_size": null,
575
       "text_color": null
576
      }
577
     },
578
     "cd92bb39ee01487c9d9dda7c9c52e086": {
579
      "model_module": "@jupyter-widgets/controls",
580
      "model_module_version": "2.0.0",
581
      "model_name": "ButtonStyleModel",
582
      "state": {
583
       "font_family": null,
584
       "font_size": null,
585
       "font_style": null,
586
       "font_variant": null,
587
       "font_weight": null,
588
       "text_color": null,
589
       "text_decoration": null
590
      }
591
     },
592
     "deb18161679c4081b7847b87a971fb94": {
593
      "model_module": "@jupyter-widgets/controls",
594
      "model_module_version": "2.0.0",
595
      "model_name": "HTMLStyleModel",
596
      "state": {
597
       "description_width": "",
598
       "font_size": null,
599
       "text_color": null
600
      }
601
     },
602
     "efadc7c52eec46dda395572abb432fba": {
603
      "model_module": "@jupyter-widgets/controls",
604
      "model_module_version": "2.0.0",
605
      "model_name": "GridBoxModel",
606
      "state": {
607
       "children": [
608
        "IPY_MODEL_985109d9783b4f4a8e8081b1c6a04908"
609
       ],
610
       "layout": "IPY_MODEL_bcb1e868bcbc46fba7efe94ef6b00cae"
611
      }
612
     },
613
     "f706d41b232847ec8ec859bddaf6d042": {
614
      "model_module": "@jupyter-widgets/base",
615
      "model_module_version": "2.0.0",
616
      "model_name": "LayoutModel",
617
      "state": {
618
       "width": "190px"
619
      }
620
     },
621
     "f8ac1f3c5bef413f918761ac97fc3c34": {
622
      "model_module": "@jupyter-widgets/controls",
623
      "model_module_version": "2.0.0",
624
      "model_name": "HTMLStyleModel",
625
      "state": {
626
       "description_width": "",
627
       "font_size": null,
628
       "text_color": null
629
      }
630
     },
631
     "fd818b923dc345a98ca5dc7962c53b06": {
632
      "model_module": "@jupyter-widgets/controls",
633
      "model_module_version": "2.0.0",
634
      "model_name": "HTMLModel",
635
      "state": {
636
       "layout": "IPY_MODEL_451d96f883ec485eb878bf073a80c757",
637
       "style": "IPY_MODEL_9f7158bd25844ec9bb05603ca29c1d51",
638
       "value": "<h5>Status</h5>"
639
      }
640
     }
641
    },
642
    "version_major": 2,
643
    "version_minor": 0
644
   }
645
  }
646
 },
647
 "nbformat": 4,
648
 "nbformat_minor": 5
649
}