File size: 46,029 Bytes
4da8a9d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "9f3fb515-747d-4e93-bf07-de5553a6e958",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from quantum_perceptron.utils import plot_img_from_data, get_vector_from_int, get_int_from_vector\n",
    "from quantum_perceptron.train import generate_dataset, PerceptronTrainer\n",
    "from quantum_perceptron import Perceptron"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "681740ed-ea82-428e-a5c8-9d44cfe92b2e",
   "metadata": {},
   "source": [
    "# Generate Dataset\n",
    "\n",
    "Generate dataset to train 4 qubit perceptron."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "eba68da3-013e-4501-bdaa-67c82cef393d",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fixed_weight = 626\n",
    "num_qubits = 4\n",
    "plot_img_from_data(fixed_weight, num_qubits)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "18e6cc2b-51be-4d83-8e3a-4bbd4078bcf7",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 65536/65536 [19:38<00:00, 55.59it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of positive samples: 274\n",
      "Number of negative samples: 65262\n",
      "Saved data to ./data/sample_space_qubits_4_fweight_626.txt\n",
      "Saved training data to ./data/train_space_qubits_4_fweight_626.txt\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "generate_dataset(num_qubits=num_qubits, fixed_weight=fixed_weight)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ecd46307-eb53-46b4-809a-4493b1661d62",
   "metadata": {},
   "source": [
    "# Perceptron Training\n",
    "\n",
    "Train generated dataset with 4 qubit perceptron. We will initialize random weight and will train perceptron so that it gradually updates the weight to the `fixed_weight` with which the dataset is generated."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b6081742-8913-4d46-a6bc-d62bc2eb715b",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[34m\u001b[1mwandb\u001b[0m: Currently logged in as: \u001b[33mashutosh1919\u001b[0m. Use \u001b[1m`wandb login --relogin`\u001b[0m to force relogin\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "Tracking run with wandb version 0.14.2"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Run data is saved locally in <code>/Users/ashutosh1919/Documents/IUB/QuantumProgramming/quantum-perceptron/wandb/run-20230415_181130-p665sffu</code>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "Syncing run <strong><a href='https://wandb.ai/ashutosh1919/quantum-perceptron/runs/p665sffu' target=\"_blank\">vivid-lake-5</a></strong> to <a href='https://wandb.ai/ashutosh1919/quantum-perceptron' target=\"_blank\">Weights & Biases</a> (<a href='https://wandb.me/run' target=\"_blank\">docs</a>)<br/>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View project at <a href='https://wandb.ai/ashutosh1919/quantum-perceptron' target=\"_blank\">https://wandb.ai/ashutosh1919/quantum-perceptron</a>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       " View run at <a href='https://wandb.ai/ashutosh1919/quantum-perceptron/runs/p665sffu' target=\"_blank\">https://wandb.ai/ashutosh1919/quantum-perceptron/runs/p665sffu</a>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "trainer = PerceptronTrainer(\n",
    "    num_qubits=num_qubits,\n",
    "    fixed_weight=fixed_weight,\n",
    "    dataset_path=\"./data/train_space_qubits_4_fweight_626.txt\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "c07e3adf-43e8-4f70-9f53-4b7367d7df8f",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Randomly initialized weight before training:\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAGFCAYAAAASI+9IAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAFx0lEQVR4nO3ZsWobSwCG0VnhVlIvrPd/MIN6a3vNre5XhDjZgMSG+JzWi/mr+RjNMuecAwDGGIe9BwDw9xAFACIKAEQUAIgoABBRACCiAEDetnz0eDzG7XYbx+NxLMvy6k0APNmcc6zrOi6Xyzgcvr4PbIrC7XYb1+v1aeMA2MfHx8d4f3//8u+bonA8Hvtnp9PpOcv4pfP5vPcEeKnPz8+9J3wr9/t9XK/XzvOvbIrC/z8ZnU4nUQCewlmyj989AXhoBiCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoA5G3vAfzcnHPvCfBSy7LsPYGfcFMAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAvP3Jx+fz+VU7+MGcc+8J386yLHtPgN25KQAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEBEAYCIAgARBQAiCgBEFACIKAAQUQAgogBARAGAiAIAEQUAIgoARBQAiCgAEFEAIKIAQEQBgIgCABEFACIKAEQUAIgoABBRACCiAEDetnw053z1Dn5wv9/3ngD8g353nm+KwrquTxnDdufzee8JwD9oXddfni/L3HANeDwe43a7jePxOJZleepAAF5vzjnWdR2Xy2UcDl+/HGyKAgDfg4dmACIKAEQUAIgoABBRACCiAEBEAYD8B/mjS+1sJXdtAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(\"Randomly initialized weight before training:\")\n",
    "plot_img_from_data(trainer.weight_variable, num_qubits)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "92be5fcf-e82a-45a6-8e26-3b5bb89101c7",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3050/3050 [01:56<00:00, 26.25it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3050/3050 [01:57<00:00, 26.03it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3050/3050 [01:55<00:00, 26.41it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3050/3050 [01:52<00:00, 27.15it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3050/3050 [01:49<00:00, 27.81it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3050/3050 [01:56<00:00, 26.14it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3050/3050 [01:58<00:00, 25.78it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3050/3050 [01:48<00:00, 27.99it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3050/3050 [01:54<00:00, 26.72it/s]\n",
      " 32%|████████████████████████████████████▋                                                                               | 963/3050 [00:35<01:17, 26.77it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training converged at step: 28414\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "trainer.train(num_epochs=10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "84c72b42-e18c-456f-b5a4-f41b577cb50b",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Final weight after training:\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(\"Final weight after training:\")\n",
    "plot_img_from_data(trainer.weight_variable, num_qubits)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "fbecdf4f-68c8-4d4d-9a6f-9ef66bd182f0",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'Fidelity Similarity with Actual Weight')"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGwCAYAAABVdURTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABPzklEQVR4nO3deVxU5f4H8M/swzqA7IjgiuW+ImYuSaKVS9rNW91c6trV8lph3qRUyq6iXrcWyza17i0tu2pW5u96UW6aprngkoobhgugiDCssz6/P5DRiaUZmGFg+LxfL14y5zznzPecgPn0PM85RyKEECAiIiJyE1JXF0BERETkSAw3RERE5FYYboiIiMitMNwQERGRW2G4ISIiIrfCcENERERuheGGiIiI3Irc1QU0NLPZjKtXr8LHxwcSicTV5RAREZENhBAoKipCeHg4pNLa+2aaXbi5evUqIiMjXV0GERER1cGlS5fQsmXLWts0u3Dj4+MDoOLk+Pr6urgaIiIisoVWq0VkZKTlc7w2zS7cVA5F+fr6MtwQERE1MbZMKeGEYiIiInIrDDdERETkVhhuiIiIyK0w3BAREZFbYbghIiIit8JwQ0RERG6F4YaIiIjcCsMNERERuRWGGyIiInIrDDdERETkVlwabn744QeMHDkS4eHhkEgk2LJly+9uk5aWhp49e0KlUqFdu3ZYt26d0+skIiKipsOl4aakpATdunXDqlWrbGqfmZmJBx98EEOGDEF6ejpeeOEF/PnPf8b//d//OblSIiIiaipc+uDMESNGYMSIETa3X716NVq3bo1ly5YBAO666y7s2bMHK1asQEJCgrPKJCIiIhuU6U24UaKDUi5FsI/aZXU0qTk3+/btQ3x8vNWyhIQE7Nu3r8ZtdDodtFqt1RcRERE53g9nr2PA4l2Y9q/DLq2jSYWbnJwchISEWC0LCQmBVqtFWVlZtdukpKRAo9FYviIjIxuiVCIiInKRJhVu6iIpKQmFhYWWr0uXLrm6JCIiInIil865sVdoaChyc3OtluXm5sLX1xceHh7VbqNSqaBSqRqiPCIiImoEmlTPTVxcHFJTU62W7dixA3FxcS6qiIiIiBobl4ab4uJipKenIz09HUDFpd7p6enIysoCUDGkNGHCBEv7qVOn4sKFC/jb3/6G06dP491338WXX36JF1980RXlExERUSPk0nBz8OBB9OjRAz169AAAJCYmokePHpg3bx4AIDs72xJ0AKB169b47rvvsGPHDnTr1g3Lli3DRx99xMvAiYiIyMKlc24GDx4MIUSN66u7+/DgwYNx5MgRJ1ZFRERETVmTmnNDRERE9HsYboiIiMitMNwQERGRW2G4ISIiIrfCcENERERuheGGiIiI3ArDDREREbkVhhsiIiJyKww3RERE5FYYboiIiMitMNwQERGRQ9TyRKUGxXBDREREDiVx8fsz3BAREZFbYbghIiIit8JwQ0RERG6F4YaIiIjcCsMNERERuRWGGyIiInIrDDdERETkVhhuiIiIyK0w3BAREZFbYbghIiIit8JwQ0RERG6F4YaIiIjcCsMNERERuRWGGyIiInIrDDdERETkVhhuiIiIyK0w3BAREZFbYbghIiIiBxGuLgAAww0RERE5mETi2vdnuCEiIiK3wnBDREREboXhhoiIiNwKww0RERG5FbvDzaeffgqdTldluV6vx6effuqQooiIiIjqyu5wM3nyZBQWFlZZXlRUhMmTJzukKCIiIqK6sjvcCCEgqeYar8uXL0Oj0TikKCIiIqK6ktvasEePHpBIJJBIJBg6dCjk8tubmkwmZGZmYvjw4U4pkoiIiMhWNoebMWPGAADS09ORkJAAb29vyzqlUono6GiMGzfO4QUSERER2cPmcJOcnAwAiI6Oxvjx46FWq51WFBEREVFd2RxuKk2cOBFAxdVR165dg9lstlrfqlUrx1RGREREVAd2h5uzZ8/iqaeewt69e62WV040NplMDiuOiIiIyF52h5tJkyZBLpfj22+/RVhYWLVXThERERG5it3hJj09HYcOHULHjh2dUQ8RERFRvdh9n5u7774beXl5zqiFiIiIqN5sCjdardbytXjxYvztb39DWloabty4YbVOq9U6u14iIiKiWtk0LOXn52c1t0YIgaFDh1q14YRiIiKi5k0IV1dQwaZws2vXLmfXQURERG5CAtdebGRTuBk0aJCz6yAiIiJyCLuvljp27Fi1yyUSCdRqNVq1agWVSlXvwoiIiIjqwu5w071791rvbaNQKDB+/Hi8//77fEQDERERNTi7LwXfvHkz2rdvjw8++ADp6elIT0/HBx98gJiYGHz++ef4+OOPsXPnTsyZM8cZ9RIRERHVyu6emwULFuDNN99EQkKCZVmXLl3Q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/fs7vkIiIiJqMMINJt3YHG40Gg2AioP28fGBh4eHZZ1SqUS/fv0wZcoUx1dIREREDaYy2jThjhvbw83atWsBVDxbatasWfD09HRaUURERORaTflScLvn3EyYMAFXrlypsvzs2bO4ePGiI2oiIiIiV2n6o1L2h5tJkyZh7969VZbv378fkyZNckRNRERE5GJNt9+mDuHmyJEjuOeee6os79evH9LT0x1RExEREbmIOzxbyu5wI5FIUFRUVGV5YWEhTCaTQ4oiIiIi12rCU27sDzcDBw5ESkqKVZAxmUxISUnBgAEDHFocERERNSw3uBLc/scvLF68GAMHDkRMTAzuvfdeAMDu3buh1Wqxc+dOhxdIREREDed2tmm6XTd299zcfffdOHbsGB599FFcu3YNRUVFmDBhAk6fPo3OnTs7o0YiIiIim9XpMd7h4eFYuHCh1bKCggK88847mD59ukMKIyIiooZXOSzVrObc/FZqaioef/xxhIWFITk52RE1ERERkYs14WxTt3Bz6dIlzJ8/H61bt8awYcMAAJs3b0ZOTo7d+1q1ahWio6OhVqsRGxuLAwcO1Nq+oKAAzz33HMLCwqBSqdChQwds27atLodBREREv9GsLgU3GAzYuHEjEhISEBMTg/T0dPzjH/+AVCrFnDlzMHz4cCgUCrve/IsvvkBiYiKSk5Nx+PBhdOvWDQkJCbh27Vq17fV6Pe6//35cvHgRX331FTIyMvDhhx8iIiLCrvclIiKi2jXlYSmb59xERESgY8eO+NOf/oQNGzbA398fAPDYY4/V+c2XL1+OKVOmYPLkyQCA1atX47vvvsOaNWswe/bsKu3XrFmD/Px87N271xKkoqOja30PnU4HnU5nea3VautcLxERkbtzh0vBbe65MRqNkEgkkEgkkMlk9X5jvV6PQ4cOIT4+/nYxUini4+Oxb9++arfZunUr4uLi8NxzzyEkJASdO3fGwoULa715YEpKCjQajeUrMjKy3rUTERG5O0kTnnVjc7i5evUqnnnmGaxfvx6hoaEYN24cNm/eXOenhubl5cFkMiEkJMRqeUhISI1zdy5cuICvvvoKJpMJ27Ztw9y5c7Fs2TL8/e9/r/F9kpKSUFhYaPm6dOlSneolIiJqDtyg48b2cKNWq/HEE09g586dOH78OO666y7MmDEDRqMRCxYswI4dO5z++AWz2Yzg4GB88MEH6NWrF8aPH49XX30Vq1evrnEblUoFX19fqy8iIiKqwa1xqaY856ZOV0u1bdsWf//73/Hrr7/iu+++g06nw0MPPVSlF6Y2gYGBkMlkyM3NtVqem5uL0NDQarcJCwtDhw4drIbF7rrrLuTk5ECv19flUIiIiKgazS7cWDaWSjFixAh89dVXuHz5Ml555RWbt1UqlejVqxdSU1Mty8xmM1JTUxEXF1ftNvfccw/OnTsHs9lsWXbmzBmEhYVBqVTW/UCIiIgIQDMblvo9QUFBSExMtGubxMREfPjhh/jkk09w6tQpTJs2DSUlJZarpyZMmICkpCRL+2nTpiE/Px/PP/88zpw5g++++w4LFy7Ec88956jDICIiIjTtCcV1evyCo4wfPx7Xr1/HvHnzkJOTg+7du2P79u2W4a2srCxIpbfzV2RkJP7v//4PL774Irp27YqIiAg8//zzePnll111CERERG7FYKrou5FKm264kQjhDle0206r1UKj0aCwsJCTi4mIiH5j2X8y8PbOc3g8thUWPtzF1eVY2PP57bBhKSIiImrabhTrsPHgZQBAx1AfF1dTdy4dliIiIiLXMprMOJmtReqpa9jwcxZytToEeisxulvTfbSR3eHGZDJh3bp1SE1NxbVr16yuXAKAnTt3Oqw4IiIichyjyYxLN8twMa8Ex68U4kBmPo5eKkCRzmhpE+qrxvtP9oLG077nRTYmdoeb559/HuvWrcODDz6Izp071/kOxUREROQcxTojLlwvxpncYpzO1uJCXgnO5BbhakEZzNXMtPVSyhDXNhDDOoVgZNdweCjr/5glV7I73GzYsAFffvklHnjgAWfUQ0RERDYoN5iQlV+KC9dLkJFThLPXinCloAyX8kuRV1zzjW1VcimiW3ihXYg3erbyR59of9wd5gu5zH2m4dodbpRKJdq1a+eMWoiIiKgaBpMZxy4X4ODFm/jlqhanc7Q4d6242l6YSoHeSrQN8sZdYb5oF+yNtkHeaBPkhSBvVZO+zNsWdoebmTNn4s0338Q777zDISkiIiInEUIg9dQ1fHHwEvaey0OJvurzG31UckQHeqFdsDc6hvogMsATkf6eaNXCExqPpjtnpr5sCjdjx461er1z5058//336NSpExQK65O3adMmx1VHRETUDBlMZry08Si+Tr9qWearliO2TQt0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IOTk5FgFHEfem+ann36yfG80GnHo0CHcddddACo+zH/55RdER0ejXbt2Vl/2BBpfX1+Eh4dbXa4NAD/++CPuvvvueh/D3XffjZKSEstrhUIBk8lk1aZnz57IyMiochzt2rWz6vG683xUvq48H5XHMn78eHz44Yf44osv8O9//xv5+fn1PgYid8WeG6JmrEuXLnjiiSfw1ltvWS0fPHgwrl+/jiVLluCRRx7B9u3b8f3338PX19ch77tq1Sq0b98ed911F1asWIGbN2/iqaeeAgA899xz+PDDD/HYY4/hb3/7GwICAnDu3Dls2LABH330EWQymc3vM2vWLCQnJ6Nt27bo3r071q5di/T0dHz22Wc27+PGjRv4wx/+gKeeegpdu3aFj48PDh48iCVLlmD06NGWdtHR0UhNTcU999wDlUoFf39/zJs3Dw899BBatWqFRx55BFKpFEePHsWJEyfw97//3bLtxo0b0bt3bwwYMACfffYZDhw4gI8//hgAsHz5coSFhaFHjx6QSqXYuHEjQkND4efnZ/MxEDU37Lkhaubmz59fZdjorrvuwrvvvotVq1ahW7duOHDgQLVXEtXVokWLsGjRInTr1g179uzB1q1bERgYCACW3haTyYRhw4ahS5cueOGFF+Dn52fV22GLGTNmIDExETNnzkSXLl2wfft2bN26Fe3bt7d5H97e3oiNjcWKFSswcOBAdO7cGXPnzsWUKVPwzjvvWNotW7YMO3bsQGRkJHr06AEASEhIwLfffov//Oc/6NOnD/r164cVK1YgKirK6j1ef/11bNiwAV27dsWnn36K9evXW3qXfHx8sGTJEvTu3Rt9+vTBxYsXsW3bNrvPBVFzIhG/HVgnIqIGI5FIsHnzZowZM8bVpRC5DUZ/IiIicisMN0RERORWOKGYiMiFODOAyPHYc0NERERuheGGiIiI3ArDDREREbkVhhsiIiJyKww3RERE5FYYboiIiMitMNwQERGRW2G4ISIiIrfy/yibqvQU92b9AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.plot(list(range(trainer.num_steps)), sorted(trainer.accumulate_loss))\n",
    "plt.xlabel(\"Number of Steps\")\n",
    "plt.ylabel(\"Fidelity Similarity with Actual Weight\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "quantum",
   "language": "python",
   "name": "quantum"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.16"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}