File size: 148,135 Bytes
4ca4e4c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
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
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 810,
   "id": "62c170c5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The autoreload extension is already loaded. To reload it, use:\n",
      "  %reload_ext autoreload\n"
     ]
    }
   ],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 811,
   "id": "9dc62fbc",
   "metadata": {},
   "outputs": [],
   "source": [
    "from data_utils import get_tokenizer, get_train_dataset\n",
    "# from model_utils import get_model\n",
    "from generate import force_args\n",
    "from generate import generate_seq\n",
    "\n",
    "import math\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "from model_utils import SSMTransformer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 812,
   "id": "60f94b8e",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Args:\n",
    "    def __init__(self):\n",
    "        self.model = \"hybrid\"\n",
    "        self.num_vocab = 32\n",
    "        self.train_task = \"decode-recall\"\n",
    "        self.num_numbers = 2\n",
    "        self.nope = False\n",
    "        self.layers = ['SSM', 'SSM', 'TF']\n",
    "        self.hidden_size = 12\n",
    "        self.heads = 1\n",
    "        self.state_dim = 1\n",
    "        self.sequence_length = 100\n",
    "\n",
    "        self.pack_examples = False\n",
    "        self.min_train_length = 97\n",
    "        self.max_train_length = 98\n",
    "        self.min_test_length = 97\n",
    "        self.max_test_length = 98\n",
    "\n",
    "        self.num_examples = 1000\n",
    "\n",
    "        self.train_batch_size = 4\n",
    "        self.test_batch_size = 4\n",
    "\n",
    "        self.p = 0.2\n",
    "\n",
    "args = Args()\n",
    "force_args(args)\n",
    "\n",
    "tokenizer = get_tokenizer(args)\n",
    "train_dataset = get_train_dataset(args, tokenizer) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 813,
   "id": "1c70350b",
   "metadata": {},
   "outputs": [],
   "source": [
    "batch = 2\n",
    "seq_len = 100\n",
    "size_vocab = 34\n",
    "\n",
    "l = max(int(math.log2(seq_len)), int(math.log2(size_vocab))) + 2\n",
    "d_model = 3 * l + 1 + 5 + 5 + 2 * l\n",
    "\n",
    "# x = torch.randn(batch, seq_len, d_model)\n",
    "\n",
    "model = SSMTransformer(\n",
    "    num_vocab=size_vocab,\n",
    "    d_model=d_model,\n",
    "    d_state=5,\n",
    "    n_heads=1,\n",
    "    d_ff=-1,\n",
    "    layers=['SSM', 'SSM', 'TF'],\n",
    ")\n",
    "\n",
    "# y = model(x)\n",
    "# print(y.shape)  # (2, 64, 128)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 814,
   "id": "06d6245a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "51"
      ]
     },
     "execution_count": 814,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d_model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 815,
   "id": "232bd737",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SSMTransformer(\n",
       "  (embedding): Embedding(34, 51)\n",
       "  (layers): ModuleList(\n",
       "    (0-1): 2 x SSMTransformerBlock(\n",
       "      (layer): SimpleSSM(\n",
       "        (Wo): Linear(in_features=51, out_features=51, bias=False)\n",
       "      )\n",
       "    )\n",
       "    (2): SSMTransformerBlock(\n",
       "      (layer): CausalSelfAttention(\n",
       "        (qkv): Linear(in_features=51, out_features=153, bias=False)\n",
       "        (out): Linear(in_features=51, out_features=51, bias=False)\n",
       "      )\n",
       "    )\n",
       "  )\n",
       "  (lm_head): Linear(in_features=51, out_features=34, bias=True)\n",
       ")"
      ]
     },
     "execution_count": 815,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 816,
   "id": "9e0d58a8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "emb = torch.zeros((34, d_model))\n",
    "for i in range(34):\n",
    "    t = i\n",
    "    if tokenizer.TO_STR[i][0] == \"#\":\n",
    "        t = int(tokenizer.TO_STR[i][1:]) #+ 1\n",
    "\n",
    "    for j in range(l-1, 0, -1):\n",
    "        # emb[i,j] = t % 2 # 0/1 binary\n",
    "        emb[i,j] = 2*(t % 2) - 1 # -1/1 binary encoding\n",
    "        t //= 2\n",
    "\n",
    "    if tokenizer.TO_STR[i][0] == \"#\": # If the token is a number token\n",
    "        emb[i,2*l:3*l] = emb[i,:l]\n",
    "\n",
    "        emb[i,0] = 1 # Indicator for being a number token\n",
    "        emb[i,2*l] = 1 # Indicator for being a number token\n",
    "        if tokenizer.TO_STR[i][1] == \"0\":\n",
    "            emb[i,3*l+1:3*l+6] = -1 # Indicators for being a number token\n",
    "        else:\n",
    "            emb[i,3*l+1:3*l+6] = 1 # Indicators for being a number token\n",
    "\n",
    "emb[:,3*l] = 1 # For bias terms\n",
    "\n",
    "model.embedding.weight.data.copy_(emb)\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 817,
   "id": "3f928dce",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "pos_emb = torch.zeros_like(model.pos_emb.data)\n",
    "for i in range(seq_len):\n",
    "    t = i + 1\n",
    "    # t = seq_len - i\n",
    "    # t = seq_len - i - 1\n",
    "    for j in range(-1, -l-1, -1):\n",
    "        # pos_emb[0,i,j] = t % 2 # 0/1 binary\n",
    "        pos_emb[0,i,j] = 2*(t % 2) - 1 # -1/1 binary encoding\n",
    "        t //= 2\n",
    "    pos_emb[0,i,-l] = 1.0 * i / seq_len # Bias term\n",
    "\n",
    "model.pos_emb.data.copy_(pos_emb)\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 818,
   "id": "13dccb09",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "h0 = torch.zeros_like(model.layers[0].layer.h0.data)\n",
    "\n",
    "h0[:, 3*l+1:3*l+6] = -1 # Indicators for no numbers stored\n",
    "\n",
    "model.layers[0].layer.h0.data.copy_(h0)\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 819,
   "id": "b991bd89",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "A = torch.zeros_like(model.layers[0].layer.A.data)\n",
    "d = A.shape[1]\n",
    "assert d == 5\n",
    "# A[3*l+1:3*l+6,1:,:-1] += 10 * torch.eye(d-1)  # M = 10\n",
    "A[3*l+1:3*l+6,:-1,1:] += 1 * torch.eye(d-1)  # M = 10\n",
    "\n",
    "model.layers[0].layer.A.data.copy_(A)\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 820,
   "id": "ddc28110",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor(1.)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "B = torch.zeros_like(model.layers[0].layer.B.data)\n",
    "# B[3*l+1:3*l+6, -1] = 1 # Identity\n",
    "# B[3*l+5, :] = 1 # Identity\n",
    "B[3*l, -1] = 1 # Identity\n",
    "print(torch.sum(B))\n",
    "\n",
    "model.layers[0].layer.B.data.copy_(B)\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 821,
   "id": "79ed41af",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "C = torch.zeros_like(model.layers[0].layer.C.data)\n",
    "\n",
    "model.layers[0].layer.C.data.copy_(C)\n",
    "\n",
    "Cb = torch.zeros_like(model.layers[0].layer.Cb.data)\n",
    "Cb[3*l+1:3*l+6, :] = torch.eye(5)\n",
    "\n",
    "model.layers[0].layer.Cb.data.copy_(Cb)\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 822,
   "id": "1d9a5b92",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "Delta = torch.zeros_like(model.layers[0].layer.Delta.data)\n",
    "Delta[2*l] = 1 # Position of the number token\n",
    "\n",
    "model.layers[0].layer.Delta.data.copy_(Delta)\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 823,
   "id": "b5d941f6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "Wo = torch.zeros_like(model.layers[0].layer.Wo.weight.data)\n",
    "# Wo[3*l+1:3*l+6, 3*l+6:3*l+11] = torch.eye(5)  \n",
    "Wo[3*l+6:3*l+11, 3*l+1:3*l+6] = torch.eye(5)  \n",
    "\n",
    "model.layers[0].layer.Wo.weight.data.copy_(Wo)\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 824,
   "id": "4b2f081f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "A = torch.zeros_like(model.layers[1].layer.A.data)\n",
    "d = A.shape[1]\n",
    "assert d == 5\n",
    "# A[:l,-2,-1] = 1  # M = 10\n",
    "A[:l,:-1,1:] += 1 * torch.eye(d-1)  # M = 10\n",
    "\n",
    "model.layers[1].layer.A.data.copy_(A)\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 825,
   "id": "b6783e5c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor(1.)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "B = torch.zeros_like(model.layers[1].layer.B.data)\n",
    "# B[3*l+1:3*l+6, -1] = 1 # Identity\n",
    "# B[3*l+5, :] = 1 # Identity\n",
    "B[3*l, -1] = 1 # Identity\n",
    "print(torch.sum(B))\n",
    "\n",
    "model.layers[1].layer.B.data.copy_(B)\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 826,
   "id": "88fc3f9d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "C = torch.zeros_like(model.layers[1].layer.C.data)\n",
    "\n",
    "model.layers[1].layer.C.data.copy_(C)\n",
    "\n",
    "Cb = torch.zeros_like(model.layers[1].layer.Cb.data)\n",
    "Cb[:l, -2] = 1\n",
    "\n",
    "model.layers[1].layer.Cb.data.copy_(Cb)\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 827,
   "id": "66d478f5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "Delta = torch.zeros_like(model.layers[1].layer.Delta.data)\n",
    "Delta[3*l] = 1 # Always one\n",
    "\n",
    "model.layers[1].layer.Delta.data.copy_(Delta)\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 828,
   "id": "2191cbc5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "Wo = torch.zeros_like(model.layers[1].layer.Wo.weight.data)\n",
    "# Wo[3*l+1:3*l+6, 3*l+6:3*l+11] = torch.eye(5)  \n",
    "Wo[l:2*l, :l] = torch.eye(l)  \n",
    "\n",
    "model.layers[1].layer.Wo.weight.data.copy_(Wo)\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 829,
   "id": "829db9d3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "Wq = torch.zeros((d_model, d_model))\n",
    "Wk = torch.zeros((d_model, d_model))\n",
    "Wv = torch.zeros((d_model, d_model))\n",
    "\n",
    "# Wk[:5, l-5:l] = torch.eye(5)\n",
    "Wk[:5, 2*l-5:2*l] = torch.eye(5)\n",
    "Wk[5, -l] = 1\n",
    "\n",
    "Wq[:5, 3*l+6:3*l+11] = 10000 * torch.eye(5)\n",
    "Wq[5, 3*l] = 10000\n",
    "\n",
    "Wv[:l, :l] = torch.eye(l)\n",
    "# Wv[:l, l:2*l] = torch.eye(l)\n",
    "\n",
    "model.layers[2].layer.qkv.weight.data.copy_(torch.concat([Wq, Wk, Wv], dim=0))\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 830,
   "id": "d2d1e4b0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "out = torch.zeros_like(model.layers[2].layer.out.weight.data)\n",
    "# Wo = torch.eye(model.layers[0].ssm.Wo.weight.data.shape[0])\n",
    "# out[3*l+2:4*l+2, :l] = torch.eye(l)  \n",
    "out[-2*l:-l, :l] = torch.eye(l)  \n",
    "\n",
    "model.layers[2].layer.out.weight.data.copy_(out)\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 831,
   "id": "345188a4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "lm_head = torch.zeros_like(model.lm_head.weight.data)\n",
    "lm_head[:,-2*l:-l] = model.embedding.weight.data[:,:l]\n",
    "\n",
    "model.lm_head.weight.data.copy_(lm_head)\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 832,
   "id": "d023b30d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'V9 V1 V18 V28 V16 V0 V0 V17 V23 V3 #1 V10 #1 #1 V20 V30 V0 #0 V23 V9 V31 V4 V14 V21 #1 V16 V1 V13 V22 V15 #0 #0 V5 V17 V25 V7 V8 V1 V2 V30 V11 #1 V25 V13 V21 #0 V20 V6 #0 V12 V26 V27 #1 #1 V8 V6 V18 #1 #0 V17 V16 V15 V7 V20 V5 V19 #0 V25 V4 V25 V20 V9 V20 V3 V10 V10 #1 V12 V15 V13 V25 V7 V22 V10 V29 V30 V0 #0 V6 V11 V15 V25 V7 V24 V6 V1 V10 V29 V14 #0'"
      ]
     },
     "execution_count": 832,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "first_data = train_dataset[0]\n",
    "x = first_data['input_ids']\n",
    "y = first_data['output_ids']\n",
    "\n",
    "' '.join(first_data['input'][0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 833,
   "id": "ccca0a63",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'TO_TOKEN': {'V0': 0,\n",
       "  'V1': 1,\n",
       "  'V2': 2,\n",
       "  'V3': 3,\n",
       "  'V4': 4,\n",
       "  'V5': 5,\n",
       "  'V6': 6,\n",
       "  'V7': 7,\n",
       "  'V8': 8,\n",
       "  'V9': 9,\n",
       "  'V10': 10,\n",
       "  'V11': 11,\n",
       "  'V12': 12,\n",
       "  'V13': 13,\n",
       "  'V14': 14,\n",
       "  'V15': 15,\n",
       "  'V16': 16,\n",
       "  'V17': 17,\n",
       "  'V18': 18,\n",
       "  'V19': 19,\n",
       "  'V20': 20,\n",
       "  'V21': 21,\n",
       "  'V22': 22,\n",
       "  'V23': 23,\n",
       "  'V24': 24,\n",
       "  'V25': 25,\n",
       "  'V26': 26,\n",
       "  'V27': 27,\n",
       "  'V28': 28,\n",
       "  'V29': 29,\n",
       "  'V30': 30,\n",
       "  'V31': 31,\n",
       "  '#0': 32,\n",
       "  '#1': 33,\n",
       "  '<bos>': 34,\n",
       "  '<eos>': 35,\n",
       "  '<null>': 36},\n",
       " 'TO_STR': {0: 'V0',\n",
       "  1: 'V1',\n",
       "  2: 'V2',\n",
       "  3: 'V3',\n",
       "  4: 'V4',\n",
       "  5: 'V5',\n",
       "  6: 'V6',\n",
       "  7: 'V7',\n",
       "  8: 'V8',\n",
       "  9: 'V9',\n",
       "  10: 'V10',\n",
       "  11: 'V11',\n",
       "  12: 'V12',\n",
       "  13: 'V13',\n",
       "  14: 'V14',\n",
       "  15: 'V15',\n",
       "  16: 'V16',\n",
       "  17: 'V17',\n",
       "  18: 'V18',\n",
       "  19: 'V19',\n",
       "  20: 'V20',\n",
       "  21: 'V21',\n",
       "  22: 'V22',\n",
       "  23: 'V23',\n",
       "  24: 'V24',\n",
       "  25: 'V25',\n",
       "  26: 'V26',\n",
       "  27: 'V27',\n",
       "  28: 'V28',\n",
       "  29: 'V29',\n",
       "  30: 'V30',\n",
       "  31: 'V31',\n",
       "  32: '#0',\n",
       "  33: '#1',\n",
       "  34: '<bos>',\n",
       "  35: '<eos>',\n",
       "  36: '<null>'},\n",
       " 'vocab': array(['V0', 'V1', 'V2', 'V3', 'V4', 'V5', 'V6', 'V7', 'V8', 'V9', 'V10',\n",
       "        'V11', 'V12', 'V13', 'V14', 'V15', 'V16', 'V17', 'V18', 'V19',\n",
       "        'V20', 'V21', 'V22', 'V23', 'V24', 'V25', 'V26', 'V27', 'V28',\n",
       "        'V29', 'V30', 'V31', '#0', '#1', '<bos>', '<eos>', '<null>'],\n",
       "       dtype='<U6'),\n",
       " 'vocab_tokens': ['V0',\n",
       "  'V1',\n",
       "  'V2',\n",
       "  'V3',\n",
       "  'V4',\n",
       "  'V5',\n",
       "  'V6',\n",
       "  'V7',\n",
       "  'V8',\n",
       "  'V9',\n",
       "  'V10',\n",
       "  'V11',\n",
       "  'V12',\n",
       "  'V13',\n",
       "  'V14',\n",
       "  'V15',\n",
       "  'V16',\n",
       "  'V17',\n",
       "  'V18',\n",
       "  'V19',\n",
       "  'V20',\n",
       "  'V21',\n",
       "  'V22',\n",
       "  'V23',\n",
       "  'V24',\n",
       "  'V25',\n",
       "  'V26',\n",
       "  'V27',\n",
       "  'V28',\n",
       "  'V29',\n",
       "  'V30',\n",
       "  'V31'],\n",
       " 'number_tokens': ['#0', '#1'],\n",
       " 'num_vocab': 32,\n",
       " 'num_numbers': 2,\n",
       " 'bos_token': 34,\n",
       " 'eos_token': 35,\n",
       " 'null': '<null>',\n",
       " 'TO_STRING': {0: 'a',\n",
       "  1: 'b',\n",
       "  2: 'c',\n",
       "  3: 'd',\n",
       "  4: 'e',\n",
       "  5: 'f',\n",
       "  6: 'g',\n",
       "  7: 'h',\n",
       "  8: 'i',\n",
       "  9: 'j',\n",
       "  10: 'k',\n",
       "  11: 'l',\n",
       "  12: 'm',\n",
       "  13: 'n',\n",
       "  14: 'o',\n",
       "  15: 'p',\n",
       "  16: 'q',\n",
       "  17: 'r',\n",
       "  18: 's',\n",
       "  19: 't',\n",
       "  20: 'u',\n",
       "  21: 'v',\n",
       "  22: 'w',\n",
       "  23: 'x',\n",
       "  24: 'y',\n",
       "  25: 'z',\n",
       "  32: '0',\n",
       "  33: '1',\n",
       "  34: '$',\n",
       "  35: '.',\n",
       "  36: '_'}}"
      ]
     },
     "execution_count": 833,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vars(tokenizer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 834,
   "id": "7278ad14",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 9,  1, 18, 28, 16,  0,  0, 17, 23,  3, 33, 10, 33, 33, 20, 30,  0, 32,\n",
       "         23,  9, 31,  4, 14, 21, 33, 16,  1, 13, 22, 15, 32, 32,  5, 17, 25,  7,\n",
       "          8,  1,  2, 30, 11, 33, 25, 13, 21, 32, 20,  6, 32, 12, 26, 27, 33, 33,\n",
       "          8,  6, 18, 33, 32, 17, 16, 15,  7, 20,  5, 19, 32, 25,  4, 25, 20,  9,\n",
       "         20,  3, 10, 10, 33, 12, 15, 13, 25,  7, 22, 10, 29, 30,  0, 32,  6, 11,\n",
       "         15, 25,  7, 24,  6,  1, 10, 29, 14, 32]])"
      ]
     },
     "execution_count": 834,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x, y = x[:1], y[:1]\n",
    "x"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "761fe746",
   "metadata": {},
   "source": [
    "### The Below Should Agree Except For 36, The Null Token"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 835,
   "id": "2f365ad7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[36, 36, 36, 36, 36, 36,  0, 17, 17, 17, 18, 18, 33, 36, 36, 36, 36, 36,\n",
       "         36, 36, 36, 36, 36, 21, 36, 36, 36, 36, 36, 36, 36, 30, 30, 30, 30, 30,\n",
       "         30, 30, 30, 30, 30, 31, 31, 31, 31, 28, 28, 28, 14, 14, 14, 14, 31, 36,\n",
       "         36, 36, 36,  8, 21, 21, 21, 21, 21, 21, 21, 21, 16, 16, 16, 16, 16, 16,\n",
       "         16, 16, 16, 16, 20, 20, 20, 20, 20,  7,  7,  7,  7,  7,  7, 33, 33, 33,\n",
       "         33, 33, 33, 33, 33, 33, 33, 33, 33, 25]])"
      ]
     },
     "execution_count": 835,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 836,
   "id": "55d55593",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 9, 33, 18, 18, 18, 32, 32, 17, 17, 17, 18, 10, 33, 33, 33, 33, 33, 32,\n",
       "         32, 32, 32, 32, 32, 21, 33, 33, 33, 33, 22, 22, 32, 30, 30, 30, 30, 30,\n",
       "         30, 30, 30, 30, 30, 31, 31, 31, 31, 28, 28, 28, 14, 14, 14, 14, 31, 33,\n",
       "         33, 33, 33,  8, 21, 21, 21, 21, 21, 21, 21, 21, 16, 16, 16, 16, 16, 16,\n",
       "         16, 16, 16, 16, 20, 20, 20, 20, 20,  7,  7,  7,  7,  7,  7, 33, 33, 33,\n",
       "         33, 33, 33, 33, 33, 33, 33, 33, 33, 25]])"
      ]
     },
     "execution_count": 836,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.argmax(model(x), dim=-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 837,
   "id": "ca772c02",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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l8rNzZXT6dTq1avVsWNHSWdC9S233KK4uDiffc2YMcM6tvr27StJXvtFku655x7VqlVLmZmZ2rRpk/75z3+qcuXK1jF7se6//34tXbpUy5Yt03XXXWfV07t3b6Wnp2vMmDE6duyYpkyZohYtWujzzz+3juUvv/xSaWlpioyMVN++fVWzZk3t2rVLCxcu1AsvvCDpzLGTlpYml8uloUOHKjIyUlOnTtXtt9+ulStXWtd+ZmVlqXXr1jp9+rR1jL3yyiuKjY294NcyevRoOZ1OPfHEE8rNzdXYsWPVs2dPrVu3zmozZcoU9e/fX2lpaRo8eLC+//57de7cWRUqVFC1atUuej/OmjVL+fn56tevnxwOh8aOHauuXbvqu+++U2RkpNWusLBQd955p5o1a6axY8dq8eLFGjFihE6fPq1Ro0YFtM1A3u+4whnABjZs2GAkmWXLlhljjPF4PKZatWpm4MCBXu0GDhxoXC6XOX36tN++br75ZtOxY8dzbq9BgwamcuXK5siRI9a6L774wjidTtOrVy9rXa9evYzT6TTr168v1ofH4zHGGPPhhx8aSebDDz+0Hjt27Fix9pmZmcbhcJgffvjBWpeRkWH8vQ0lmREjRlj/vu+++0zlypW9XvuBAweM0+k0o0aNsta1bdvW1KtXz5w4ccKr1ttuu81ce+21Prf16+0+9NBD5tChQ+bgwYNmw4YN5s477zSSzLhx46x2M2bMME6n06xatcrr+S+//LKRZFavXm2MMWbHjh3G6XSaLl26mMLCQq+2RfvQGN/7rF+/fqZs2bJer6V3796mRo0axWo+e1/5Mm7cOFOmTBmTl5dnjDFmwoQJpkaNGqZJkybmySefNMYYU1hYaOLj483gwYOt540YMaLYGJUrV8707t272DaK2j744INe67t06WISEhLOWV/RaytXrpzfxz///HMjyaovPz/fxMfHm0ceecSrXVZWlnG73V7rW7ZsacqXL+91/BnjPQadO3c2UVFRZteuXda6/fv3m/Lly5uWLVta6wYNGmQkmXXr1lnrDh48aNxut5Fkdu/eba1v1aqVadWqlfXvovdL3bp1TUFBgbX+pZdeMpLMV199ZYwxpqCgwCQkJJjGjRubU6dOWe2mT59uJHn16U+NGjW8Pgt2795tJJmEhATz008/WesXLFhgJJmFCxda63r37m0kmQEDBnjtq44dO5qoqChz6NAhr9dz9vv/7G1NmzbNWneu9ztQhK8yYQszZ85UUlKSWrduLenMGY4ePXpo9uzZXl9lxcfH6+jRo8W+ljxbfHy8vv76a+3YscPn4wcOHNDmzZvVp08fVaxY0Vpfv3593XHHHXrvvfcknTkj9Pbbb6tTp05q1KhRsX7O9TXE2WcOjh49qsOHD+u2226TMUaff/653+edS48ePXTw4EGvr0zmz58vj8ejHj16SJJ++uknrVixQvfcc4/y8/N1+PBhHT58WEeOHFF6erp27Nihffv2nXdbr732mhITE1W5cmU1atRIy5cv19ChQ72+Cpw3b57q1q2rlJQUazuHDx9WmzZtJEkffvihJOntt9+Wx+PRM888I6fT+yPn7H149j4rqj0tLU3Hjh3Ttm3bAt9hv5KWlqbCwkJ9+umnks6cGUtLS1NaWppWrVolSdqyZYtycnKUlpZ2Sdt69NFHi237yJEjl3zhftFZvPz8fElnziDn5OTovvvu8xqDMmXKqGnTptYYHDp0SB9//LEefPBBJScne/VZNAaFhYVaunSpOnfurNq1a1uPX3XVVfr973+vTz75xKr/vffeU7NmzdSkSROrXWJionr27HnBr+WBBx7wOuNctM+/++47SdKGDRt05MgRPfLII17X+PXs2VMVKlS44O340qNHD68+fr3ts/Xv39/6b4fDof79++vkyZP64IMPLqkGwB+CGcKusLBQs2fPVuvWrbV7927t3LlTO3fuVNOmTZWdna3ly5dbbR9//HFdd9116tChg6pVq6YHH3xQixcv9upv1KhRysnJ0XXXXad69erpT3/6k7788kvr8R9++EGSdP311xerpW7dujp8+LCOHj2qQ4cOKS8vz/qKMBB79uyxgl9cXJwSExOtryBzc3MD7k+S7rzzTrndbq8Lv+fMmaMGDRpYX2vt3LlTxhg9/fTTSkxM9FqKJlIcPHjwvNu66667tGzZMi1atMi6xurYsWNewWrHjh36+uuvi22nqJai7ezatUtOp1M33HDDObf59ddfq0uXLnK73XK5XEpMTLQugr/YfXa2W2+9VWXLlrVCWFEwa9mypTZs2KATJ05Yj7Vo0eKStvXr8FMUAn7++edL6rfourfy5ctLkvU/H23atCk2DkuXLrXGoChwnOtYPnTokI4dO+b3feHxeLR3715JZ95D1157bbF2vp7rz/n2UdH79JprrvFqFxERUew+doG60PFxOp1eIVWSdXyffa82IJi4xgxht2LFCh04cECzZ8/W7Nmziz0+c+ZM6zqkypUra/PmzVqyZInef/99vf/++5o2bZp69eqlN954Q9KZ21fs2rVLCxYs0NKlS/XPf/5T48eP18svv6yHH3445K+nsLBQd9xxh3766Sc9+eSTSklJUbly5bRv3z716dPnou9FFR0drc6dO+utt97S5MmTlZ2drdWrV+vFF1+02hT1/cQTT/idPfnrP3S+VKtWTe3atZMk/eY3v1GlSpXUv39/tW7dWl27drW2Va9ePf3tb3/z2Uf16tUv+LXl5OSoVatWcrlcGjVqlOrUqaOYmBht2rRJTz75ZFDu3xUZGammTZvq448/1s6dO5WVlaW0tDQlJSXp1KlTWrdunVatWqWUlBQlJiZe0rbKlCnjc70566Lxi1E0waNoDIv2y4wZM1SlSpVi7S/nbNJAhWofXe5t+ztzHoxJK7gy2fddiyvGzJkzVblyZWvG0tnefPNNvfXWW3r55Zetr7qioqLUqVMnderUSR6PR48//rimTp2qp59+2vqDVbFiRT3wwAN64IEH9Msvv6hly5YaOXKkHn74YdWoUUOStH379mLb27ZtmypVqqRy5copNjZWLpfLa7bjhfjqq6/07bff6o033lCvXr2s9b6+fg10VlaPHj30xhtvaPny5frmm29kjLG+xpRk/d99ZGSkFayCoV+/fho/fryeeuopdenSRQ6HQ3Xq1NEXX3yhtm3bnvN11KlTRx6PR1u3blWDBg18tvnoo4905MgRvfnmm173g9u9e3fQXoN05iurMWPG6IMPPlClSpWUkpIih8OhG2+8UatWrdKqVasu6Iak4ZpNN2PGDDkcDmsSS9Gkg8qVK59zvIuOi3Mdy4mJiSpbtqzf94XT6bTCdo0aNXxeKuDruRer6H26c+dO6xIHSTp9+rS+//571a9fP2jb8sfj8ei7776zzpJJsmbEFp21KzrbdvbMXum/Z/zOxixMXAi+ykRYHT9+XG+++aZ++9vfqnv37sWW/v37Kz8/37rVw5EjR7ye73Q6rQ/ools0/LpNXFycrrnmGuvxq666Sg0aNNAbb7zh9WG6ZcsWLV26VL/5zW+svjt37qyFCxdqw4YNxWr393/XRf83fvbj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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "m = model.embedding(x) + model.pos_emb\n",
    "\n",
    "plt.title(\"Associative Recall with Decoding Input\")\n",
    "plt.tight_layout()\n",
    "\n",
    "plt.imshow(m.detach().numpy()[0].T)\n",
    "\n",
    "plt.savefig(\"fig/decode_recall_input.pdf\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 838,
   "id": "555ea9f3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "m = m + model.layers[0].layer(m)\n",
    "# print(\"After\")\n",
    "plt.imshow(m.detach().numpy()[0])\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 839,
   "id": "b0296fe2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "m = m + model.layers[1].layer(m)\n",
    "plt.imshow(m.detach().numpy()[0])\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 840,
   "id": "e919b4e6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7d03926b3dd0>"
      ]
     },
     "execution_count": 840,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "out, scores = model.layers[2].layer(m)\n",
    "# plt.imshow((m+out).detach().numpy()[0])\n",
    "plt.imshow((out).detach().numpy()[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 841,
   "id": "233a68cf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmYAAAFjCAYAAACXCcekAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAPNBJREFUeJzt3Xl0FFX6//FPN1kh6Q5LCCIEAcWgoGhYjOybkWEYWVR0GAHFDYMijIPycwFXQL4zKA6L4zCgiAPCqOi4AIKgIiCLuLOKgkKCqFlkCSG5vz846aFNN6ST7vRN8n6dU+eQ6tu3nrq3qvuh+t4qhzHGCAAAAGHnDHcAAAAAOInEDAAAwBIkZgAAAJYgMQMAALAEiRkAAIAlSMwAAAAsQWIGAABgCRIzAAAAS5CYAQAAWILEDCiF1atXy+FwaPXq1UGt1+FwaOLEiUGtsyoYPny4zjnnHK91oWyriRMnyuFwBFT20KFDIYnFdvPmzZPD4dC3337rWdetWzd169YtbDEBVQmJGSrczJkz5XA41KFDh3CHUiHeeust65Ivh8PhtbhcLnXt2lVvvvlmuEOzxhNPPKHXXnst6PUOHz7cq+3j4uLUrFkzXX311frPf/6joqKioG+zqisoKND06dPVrl07xcfHKy4uTu3atdP06dNVUFBQ5no/+ugjTZw4UdnZ2cEL9jRCdcyhciExQ4VbsGCBzjnnHH388cfatWtXuMMplS5duujo0aPq0qVLwO9966239PDDD/t87ejRo3rggQfKG16Z9O7dW/Pnz9cLL7ygcePGadeuXerXr5+WLVsWlnjC6YEHHtDRo0e91oXySzI6Olrz58/X/PnzNW3aNP3xj3/Uzp07dfXVV6tnz57Kzc0NyXZDZfny5Vq+fHlYtn348GH17t1bo0ePVoMGDTR58mRNnTpVDRs21OjRo9W7d28dPny4THV/9NFHevjhh0nMUKEiwh0Aqpc9e/boo48+0iuvvKLbbrtNCxYs0IQJE8Id1hk5nU7FxMQEvd5Q1FlaLVq00J/+9CfP34MGDdIFF1ygp59+Wunp6WGLKxwiIiIUEVFxH4cRERFebS9Jjz32mCZPnqzx48frlltu0aJFiyosnvKKiooK27bHjh2rNWvW6JlnntGoUaM860eOHKkZM2Zo1KhRuueeezRr1qywxQgEgitmqFALFixQ7dq11bdvX1199dVasGCBz3ILFy5Uamqq4uPj5XK51Lp1az399NOe1wsKCvTwww/rvPPOU0xMjOrWratOnTppxYoVXvWsWrVKnTt3Vq1atZSQkKCrrrpKX3/9dYnt/fDDDxoxYoQaNmyo6OhoNW3aVCNHjtTx48cl+R5j9sEHH+iaa65RcnKyoqOj1bhxY40ZM8brysvw4cM1Y8YMSd4/HxY7ddzUkiVL5HA4tGbNmhLxPfvss3I4HPriiy8867Zt26arr75aderUUUxMjNq2bavXX3/dX9OfUcuWLVWvXj3t3r3ba31+fr4mTJigc88917Of48aNU35+fok6XnzxRbVv3141a9ZU7dq11aVLF68rKUuXLlXfvn097dy8eXM9+uijKiwsLHPcxYwxqlevnsaOHetZV1RUpISEBNWoUcPrqseUKVMUERGhX3/9VVLJMWYOh0OHDx/W888/7+mz4cOHe20vOztbw4cPV0JCgtxut2688UYdOXKkXPtw33336YorrtDixYu1Y8cOr9fefvttz7EcHx+vvn376ssvvyxRx7Zt23TttdcqMTFRsbGxOv/883X//fd7lfnkk0/Up08fuVwuxcXFqWfPnlq/fn2Jur788kv16NFDsbGxatSokR577DGfP7X+doxZ8fny8ssv6/HHH1ejRo0UExOjnj17+rxKPmPGDDVr1kyxsbFq3769Pvjgg1KNW/v+++81Z84c9ejRwyspK5aRkaHu3bvrn//8p77//ntJ0rfffiuHw6F58+aVKH/q+Thx4kT95S9/kSQ1bdrUcxwUj61zOBwaNWqUFixYoPPPP18xMTFKTU3V+++/71Wnr/GSxfUHesyheuCKGSrUggULNHDgQEVFRen666/XrFmztHHjRrVr185TZsWKFbr++uvVs2dPTZkyRZL09ddfa+3atRo9erSkkx9qkyZN0s0336z27dsrNzdXmzZt0pYtW9S7d29J0rvvvqs+ffqoWbNmmjhxoo4ePapnnnlGHTt21JYtWzwflvv371f79u2VnZ2tW2+9VSkpKfrhhx+0ZMkSHTlyxO/VgMWLF+vIkSMaOXKk6tatq48//ljPPPOMvv/+ey1evFiSdNttt2n//v1asWKF5s+ff9q26du3r+Li4vTyyy+ra9euXq8tWrRIF154oVq1aiXp5Bdmx44ddfbZZ+u+++5TrVq19PLLL6t///76z3/+owEDBgTYM1JOTo5++eUXNW/e3LOuqKhIf/jDH/Thhx/q1ltvVcuWLfX5559r2rRp2rFjh9fPLg8//LAmTpyoyy+/XI888oiioqK0YcMGrVq1SldccYWkkwPH4+LiNHbsWMXFxWnVqlV66KGHlJubq6lTpwYc86kcDoc6duzo9cX42WefKScnR06nU2vXrlXfvn0lnUyqL7nkEsXFxfmsa/78+Z5j69Zbb5Ukr3aRpGuvvVZNmzbVpEmTtGXLFv3zn/9U/fr1PcdsWd1www1avny5VqxYoRYtWnjiGTZsmNLT0zVlyhQdOXJEs2bNUqdOnfTJJ594juXPPvtMnTt3VmRkpG699Vadc8452r17t9544w09/vjjkk4eO507d5bL5dK4ceMUGRmpZ599Vt26ddOaNWs8Yz8zMzPVvXt3nThxwnOM/eMf/1BsbGyp92Xy5MlyOp265557lJOToyeffFJDhgzRhg0bPGVmzZqlUaNGqXPnzhozZoy+/fZb9e/fX7Vr11ajRo1OW//bb7+twsJCDR061G+ZoUOH6r333tM777yjm2++udSxDxw4UDt27NC///1vTZs2TfXq1ZMkJSYmesqsWbNGixYt0l133aXo6GjNnDlTV155pT7++GPPuVpapTnmUE0YoIJs2rTJSDIrVqwwxhhTVFRkGjVqZEaPHu1VbvTo0cblcpkTJ074reviiy82ffv2Pe322rRpY+rXr29++uknz7pPP/3UOJ1OM3ToUM+6oUOHGqfTaTZu3FiijqKiImOMMe+9956RZN577z3Pa0eOHClRftKkScbhcJjvvvvOsy4jI8P4O9UkmQkTJnj+vv766039+vW99v3AgQPG6XSaRx55xLOuZ8+epnXr1ubYsWNesV5++eXmvPPO87mt3253xIgR5scffzQHDx40mzZtMldeeaWRZKZOneopN3/+fON0Os0HH3zg9f7Zs2cbSWbt2rXGGGN27txpnE6nGTBggCksLPQqW9yGxvhus9tuu83UrFnTa1+GDRtmmjRpUiLmU9vKl6lTp5oaNWqY3NxcY4wx06dPN02aNDHt27c39957rzHGmMLCQpOQkGDGjBnjed+ECRNK9FGtWrXMsGHDSmyjuOxNN93ktX7AgAGmbt26p42veN9q1arl9/VPPvnESPLEl5eXZxISEswtt9ziVS4z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KR4AXr9+/dP2d/FxcbpjOTExUTVr1vR7XjidTk+y3aRJE59DBXy9t6yKz9Ndu3Z5hjhI0okTJ/Ttt9/qoosuOu37+/Tpoxo1amj+/Pl+JwC88MILioiI0JVXXinpf1ftfntvsuKrd6c60zHgq3127NihmjVrehL/2rVr+7wPWlm2h+qBnzIRckePHtUrr7yi3//+97r66qtLLKNGjVJeXp7nVg8//fST1/udTqfnA7r4Fg2/LRMXF6dzzz3X8/pZZ52lNm3a6Pnnn/f6UPziiy+0fPly/e53v/PU3b9/f73xxhvatGlTidj9/c+++ErAqa8bY7xu6VGsVq1akkp+EfjTq1cv1alTR4sWLdKiRYvUvn17NW3a1PN6/fr11a1bNz377LM6cOBAifeX9SeUiIgI/fnPf9bXX3+tpUuXSjo58/CHH37Qc889V6L80aNHPTfu7N+/v5xOpx555JESV76K28hXmx0/flwzZ84sU7z+dO7cWfn5+XrqqafUqVMnz5dd586dNX/+fO3fv79U48tq1apVYTcWLTZ58mQtX75cgwcP9vxMlp6eLpfLpSeeeMLnXeyL+zsxMVFdunTRv/71L+3du9erzKl9cMUVV2jp0qVej1TKysrSSy+9pE6dOsnlckk6eRV1/fr1+vjjj7225e8WN2XRtm1b1a1bV88995xOnDjhWb9gwYJS/STcuHFj3XjjjXr33Xd93qds9uzZWrVqlUaMGOGZ4elyuVSvXr0St7XwdRye6dxdt26dtmzZ4vl73759Wrp0qa644grP8d68eXPl5OR4DbU4cOCAXn31VZ/bq+hjDvbhihlC7vXXX1deXp7+8Ic/+Hz9sssuU2JiohYsWKDBgwfr5ptv1s8//6wePXqoUaNG+u677/TMM8+oTZs2np8uLrjgAnXr1k2pqamqU6eONm3apCVLlnjdy2jq1Knq06eP0tLSNGLECM/tMtxut9cjkp544gktX75cXbt29dwS4sCBA1q8eLE+/PBDJSQklIg5JSVFzZs31z333KMffvhBLpdL//nPf3x+mRQPDr7rrruUnp6uGjVq6LrrrvPbXpGRkRo4cKAWLlyow4cP6//+7/9KlJkxY4Y6deqk1q1b65ZbblGzZs2UlZWldevW6fvvv9enn37qt/7TGT58uB566CFNmTJF/fv31w033KCXX35Zt99+u9577z117NhRhYWF2rZtm15++WUtW7ZMbdu21bnnnqv7779fjz76qDp37qyBAwcqOjpaGzduVMOGDTVp0iRdfvnlql27toYNG6a77rpLDodD8+fPD9rPWsXS0tIUERGh7du3e247IJ38+bv4y7s0iVlqaqreffdd/e1vf1PDhg3VtGnToD1G7MSJE3rxxRclSceOHdN3332n119/XZ999pm6d++uf/zjH56yLpdLs2bN0g033KBLL71U1113nRITE7V37169+eab6tixo/7+979LkqZPn65OnTrp0ksv1a233qqmTZvq22+/1ZtvvqmtW7dKOnkj2xUrVqhTp0664447FBERoWeffVb5+fl68sknPdsdN26c5s+fryuvvFKjR4/23C6jSZMmXklGeURFRWnixIm688471aNHD1177bX69ttvNW/ePDVv3rxUV5CmTZumbdu26Y477tA777zjuTK2bNkyLV26VF27dtVf//pXr/fcfPPNmjx5sm6++Wa1bdtW77//fon7xkn/O3fvv/9+XXfddYqMjFS/fv08CVurVq2Unp7udbsMSV5P+rjuuut07733asCAAbrrrrs8tzpp0aKFV1JXvL1QHXOoRMIzGRTVSb9+/UxMTIw5fPiw3zLDhw83kZGR5tChQ2bJkiXmiiuuMPXr1zdRUVEmOTnZ3HbbbebAgQOe8o899php3769SUhIMLGxsSYlJcU8/vjj5vjx4171vvvuu6Zjx44mNjbWuFwu069fP/PVV1+V2P53331nhg4dahITE010dLRp1qyZycjI8Ez193W7jK+++sr06tXLxMXFmXr16plbbrnFfPrppyWm4p84ccLceeedJjEx0TgcDq8p8vJzC4gVK1YYScbhcJh9+/b5bLPdu3eboUOHmgYNGpjIyEhz9tlnm9///vdmyZIlftv51O1mZGT4fG3ixIle+3r8+HEzZcoUc+GFF5ro6GhTu3Ztk5qaah5++GGTk5Pj9d5//etf5pJLLvGU69q1q+f2KMYYs3btWnPZZZeZ2NhY07BhQzNu3DizbNmyEm1b1ttlFGvXrl2JWz18//33RpJp3LhxifK+bl2wbds206VLFxMbG2skeW5jUFz2xx9/9Co/d+5cv7dWONWwYcM8t1qQZGrWrGnOOeccM2jQILNkyZIStxsp9t5775n09HTjdrtNTEyMad68uRk+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044AAABUdgH9lNmnTx/Pvy+66CJ16NBBTZo00csvv6zY2NgyBTB+/HiNHTvW83dubi7JGQAAqJbKdef/hIQEtWjRQrt27VLv3r11/PhxZWdne101y8rK8jkmrVh0dLSio6M9fxtjJEm5vxaVKHvyrrnecvNKlvNX1l/5QMraHkco6yaOqhtHKOsmjqobRyjrJo6qG0co67Y5jhM6ua44z/HLlENeXp6pXbu2efrpp012draJjIw0S5Ys8by+bds2I8msW7eu1HXu27fPSGJhYWFhYWFhqXLLvn37TpsHOYw5U+r2P/fcc4/69eunJk2aaP/+/ZowYYK2bt2qr776SomJiRo5cqTeeustzZs3Ty6XS3feeack6aOPPirtJlRUVKT9+/crPj5eeXl5aty4sfbt2yeXy1XqOmCX4p+n6cfKiz6sGujHyo8+rLyMMcrLy1PDhg3ldPof4h/QT5nff/+9rr/+ev30009KTExUp06dtH79eiUmJkqSpk2bJqfTqUGDBik/P1/p6emaOXNmQIE7nU41atRIkuRwOCRJLpeLA7AKoB8rP/qwaqAfKz/6sHJyu91nLBPQFbOKlpubK7fbrZycHA7ASox+rPzow6qBfqz86MOqj2dlAgAAWMLqxCw6OloTJkzwmrWJyod+rPzow6qBfqz86MOqz+qfMgEAAKoTq6+YAQAAVCckZgAAAJYgMQMAALAEiRkAAIAlrE7MZsyYoXPOOUcxMTHq0KGDPv7443CHBD8mTZqkdu3aKT4+XvXr11f//v21fft2rzLHjh1TRkaG6tatq7i4OA0aNEhZWVlhihhnMnnyZDkcDt19992edfRh5fDDDz/oT3/6k+rWravY2Fi1bt1amzZt8rxujNFDDz2ks846S7GxserVq5d27twZxohxqsLCQj344INq2rSpYmNj1bx5cz366KNez1ikD6suaxOzRYsWaezYsZowYYK2bNmiiy++WOnp6Tp48GC4Q4MPa9asUUZGhtavX68VK1aooKBAV1xxhQ4fPuwpM2bMGL3xxhtavHix1qxZo/3792vgwIFhjBr+bNy4Uc8++6wuuugir/X0of1++eUXdezYUZGRkXr77bf11Vdf6a9//atq167tKfPkk09q+vTpmj17tjZs2KBatWopPT1dx44dC2PkKDZlyhTNmjVLf//73/X1119rypQpevLJJ/XMM894ytCHVViAzy2vMO3btzcZGRmevwsLC03Dhg3NpEmTwhgVSuvgwYNGklmzZo0xxngecr948WJPma+//tpIgT3kHqGXl5dnzjvvPLNixQrTtWtXM3r0aGMMfVhZ3HvvvaZTp05+Xy8qKjINGjQwU6dO9azLzs420dHR5t///ndFhIgz6Nu3r7npppu81g0cONAMGTLEGEMfVnVWXjE7fvy4Nm/erF69ennWOZ1O9erVS+vWrQtjZCitnJwcSVKdOnUkSZs3b1ZBQYFXn6akpCg5OZk+tUxGRob69u3r1VcSfVhZvP7662rbtq2uueYa1a9fX5dccomee+45z+t79uxRZmamVz+63W516NCBfrTE5ZdfrpUrV2rHjh2SpE8//VQffvih+vTpI4k+rOoCeoh5RTl06JAKCwuVlJTktT4pKUnbtm0LU1QoraKiIt19993q2LGjWrVqJUnKzMxUVFSUEhISvMomJSUpMzMzDFHCl4ULF2rLli3auHFjidfow8rhm2++0axZszR27Fj9v//3/7Rx40bdddddioqK0rBhwzx95evzlX60w3333afc3FylpKSoRo0aKiws1OOPP64hQ4ZIEn1YxVmZmKFyy8jI0BdffKEPP/ww3KEgAPv27dPo0aO1YsUKxcTEhDsclFFRUZHatm2rJ554QpJ0ySWX6IsvvtDs2bM1bNiwMEeH0nj55Ze1YMECvfTSS7rwwgu1detW3X333WrYsCF9WA1Y+VNmvXr1VKNGjRKzvbKystSgQYMwRYXSGDVqlP773//qvffeU6NGjTzrGzRooOPHjys7O9urPH1qj82bN+vgwYO69NJLFRERoYiICK1Zs0bTp09XRESEkpKS6MNK4KyzztIFF1zgta5ly5bau3evJHn6is9Xe/3lL3/Rfffdp+uuu06tW7fWDTfcoDFjxmjSpEmS6MOqzsrELCoqSqmpqVq5cqVnXVFRkVauXKm0tLQwRgZ/jDEaNWqUXn31Va1atUpNmzb1ej01NVWRkZFefbp9+3bt3buXPrVEz5499fnnn2vr1q2epW3bthoyZIjn3/Sh/Tp27FjiVjU7duxQkyZNJElNmzZVgwYNvPoxNzdXGzZsoB8tceTIETmd3l/PNWrUUFFRkST6sMoL9+wDfxYuXGiio6PNvHnzzFdffWVuvfVWk5CQYDIzM8MdGnwYOXKkcbvdZvXq1ebAgQOe5ciRI54yt99+u0lOTjarVq0ymzZtMmlpaSYtLS2MUeNMTp2VaQx9WBl8/PHHJiIiwjz++ONm586dZsGCBaZmzZrmxRdf9JSZPHmySUhIMEuXLjWfffaZueqqq0zTpk3N0aNHwxg5ig0bNsycffbZ5r///a/Zs2ePeeWVV0y9evXMuHHjPGXow6rL2sTMGGOeeeYZk5ycbKKiokz79u3N+vXrwx0S/JDkc5k7d66nzNGjR80dd9xhateubWrWrGkGDBhgDhw4EL6gcUa/Tczow8rhjTfeMK1atTLR0dEmJSXF/OMf//B6vaioyDz44IMmKSnJREdHm549e5rt27eHKVr8Vm5urhk9erRJTk42MTExplmzZub+++83+fn5njL0YdXlMOaUWwkDAAAgbKwcYwYAAFAdkZgBAABYgsQMAADAEiRmAAAAliAxAwAAsASJGQAAgCVIzAAAACxBYgYAAGAJEjMAAABLkJgBAABYgsQMAADAEiRmAAAAlvj/PZdG7+2tomgAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"Associative Recall with Decoding Output\")\n",
    "plt.tight_layout()\n",
    "\n",
    "plt.imshow((m+out).detach().numpy()[0].T)\n",
    "\n",
    "plt.savefig(\"fig/decode_recall_output.pdf\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 842,
   "id": "9125a8cd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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s2TJEt16663q0qWLJk2aJEnaunWrVq1apaFDh0o6cyA8KSlJd911l1q2bKnMzEytX79eGzdu1JVXXilJ+vTTT3XNNdeoTp06Gjt2rI4fP66XX35Z8fHx2rhxo3MCyb59+9SyZUulp6dr4MCBio2N1d69ezV//nwdO3Ys32/N8+bN07FjxzRo0CBVqVJFa9eu1csvv6xffvlF8+bNkyTdfffd2rdvn5YsWaJZs2adt2+6deum4OBgzZ07Vx06dPCYNmfOHDVs2FCNGjWSJH377beKj4/XJZdcokceeUQVKlTQ3Llz1aNHD/3nP/9Rz549C/nOSBkZGfrtt99Ut25dp8ztduuGG27Q559/roEDB6p+/fr65ptv9OKLL+qHH37wOKb35JNPauzYsWrTpo3GjRsnf39/rVmzRkuXLtVVV10l6czJIcHBwRoxYoSCg4O1dOlSjRkzRpmZmXr22WcL3eazuVwuxcfHa8WKFU7Z119/rYyMDPn4+GjVqlXq1q2bJGnlypVq2rSpgoOD85zXrFmznHVr4MCBkuTRL5J08803KyYmRklJSdq4caP++c9/KiIiwllni+q2227T4sWLtWTJEtWrV89pT2JiohISEjRp0iQdO3ZMU6dOVdu2bfXVV1856/LXX3+tdu3ayc/PTwMHDlTt2rX1448/6oMPPtD48eMlnVl32rVrp5CQEI0cOVJ+fn567bXX1LFjRy1fvtw5lyA1NVWdOnXS6dOnnXVs+vTpCgoKKvBrmThxonx8fPTggw8qIyNDzzzzjPr27as1a9Y4daZOnaohQ4aoXbt2Gj58uH7++Wf16NFDlSpVUvXq1Qu0nPfff1+///67brnlFkVFRaljx45KTk7W3/72N6fO5MmTdd999yk4OFiPPfaYJCkyMlJ169bV/fffrylTpujRRx9V/fr1Jcn5t6B9L505bpqQkKBWrVrpueee06effqrnn39edevW1aBBgxQeHq6pU6dq0KBB6tmzp3r16iVJuvzyy/N9bXfddZdmzpypG2+8UQ888IDWrFmjpKQkbd26Ve+9955H3R07dujGG2/UnXfeqcTERL355pvq37+/4uLi1LBhwwL15dl+++03/fbbb7r00kslFW+bZ3vthd2m3XvvvQoPD9eYMWN09OhRjzZfffXV6tWrl26++WbNnz9fDz/8sBo3bly40XGh47UErV+/3kgyS5YsMcacGQlUr17dDB061KPe0KFDTUhISK7Rxtn++te/mm7dup13eU2aNDERERHm119/dco2b95sfHx8TL9+/Zyyfv36GR8fH7Nu3bpc83C73caYvEeWZ3+bypGUlGRcLpfZtWuXU3a+Y5Y655vVrbfeaiIiIjxee8435XHjxjllXbp0MY0bN/b4dul2u02bNm3yHa2fu9w777zTHDx40Bw4cMCsX7/eXH311UaSefbZZ516s2bNMj4+PmblypUez88Z6a5atcoYY8z27duNj4+P6dmzZ67jujl9aEzefXb33Xeb8uXLe7yWoh6zfPbZZ025cuVMZmamMcaYKVOmmFq1apmWLVuahx9+2BhzZrQZFhbmMQLN6xu97ZjlHXfc4VHes2dPU6VKlfO2L+e1nW9k+dVXXxlJTvuOHDliwsLCzIABAzzqpaammtDQUI/y9u3bm4oVK3qsf8Z4vgc9evQw/v7+5scff3TK9u3bZypWrGjat2/vlA0bNsxIMmvWrHHKDhw4YEJDQws8sqxfv77HscyXXnrJYw9JVlaWqVKlimnRooXHsfu33nrLGfkVxHXXXWfi4+Odv6dPn258fX3NgQMHPOoV9phlYfo+Z0R19ufUGGOaNm1q4uLinL/Pd9zu3PVw06ZNRpK56667POo9+OCDRpJZunSpU5Yzcl6xYoVTduDAARMQEGAeeOCBXMs617nbhDVr1pguXboYSeb55583xhR/m3e+117QbVrOyLJt27a5MqJDhw5Gknn77bedsqysLBMVFWV69+5t7YOzefVs2OTkZEVGRqpTp06SzowE+vTpo9mzZys7O9upFxYWpqNHj2rJkiX5zissLEzffvuttm/fnuf0/fv3a9OmTerfv78qV67slF9++eW68sor9dFHH0k6M3JasGCBrr/+ejVv3jzXfM53GvfZ37CPHj2qQ4cOqU2bNjLG6Kuvvsr3eefTp08fHThwwONssfnz58vtdqtPnz6SpMOHD2vp0qW6+eabdeTIER06dEiHDh3Sr7/+qoSEBG3fvl179+61LuuNN95QeHi4IiIi1Lx5c6WkpGjkyJEaMWKEU2fevHmqX7++YmNjneUcOnRInTt3liR99tlnkqQFCxbI7XZrzJgx8vHxXM3O7sOz+yyn7e3atdOxY8f0/fffF77DztGuXTtlZ2friy++kHRmBNmuXTu1a9dOK1eulCRt2bJF6enpateuXbGWdc899+Ra9q+//qrMzMxizTdntHvkyBFJZ/a0pKen69Zbb/V4D8qVK6dWrVo578HBgwe1YsUK3XHHHapZs6bHPHPeg+zsbC1evFg9evRQnTp1nOnVqlXT3/72N33++edO+z/66CNdccUVatmypVMvPDxcffv2LfBruf322z32zOT0+U8//SRJWr9+vX799VcNGDDA41hd3759ValSpQIt49dff9WiRYt06623OmW9e/eWy+XS3LlzC9zWvBS078+W13qR83oLK2c7dfZnUpIeeOABScp19nqDBg081uvw8HD95S9/KfDyz94mtGrVSqtWrdKIESM0bNgwSaWzzZOKtk0bMGCAypUrl2tewcHBHsdd/f391bJly0K/B14Ly+zsbM2ePVudOnXSzp07tWPHDu3YsUOtWrVSWlqaUlJSnLr33nuv6tWrp2uuuUbVq1fXHXfcoU8++cRjfuPGjVN6errq1aunxo0b66GHHtLXX3/tTN+1a5ck6S9/+UuuttSvX1+HDh3S0aNHdfDgQWVmZjq7Nwtj9+7dThgHBwcrPDzc2X2akZFR6PlJ0tVXX63Q0FCPkzvmzJmjJk2aOLvkduzYIWOMRo8erfDwcI9HzslSBw4csC6re/fuWrJkiT788EPn+q5jx455hN327dv17bff5lpOTltylvPjjz/Kx8dHDRo0OO8yv/32W/Xs2VOhoaEKCQlReHi4s2IXtc/O1qxZM5UvX94JxpywbN++vdavX68TJ04409q2bVusZZ0bSDkb999++61Y8/39998lSRUrVpQk5wth586dc70Pixcvdt6DnI3B+dblgwcP6tixY/l+Ltxut/bs2SPpzGfosssuy1Uvr+fmx9ZHOZ/TnN18OXx9fXNdZ5ufOXPm6NSpU2ratKmzXTl8+LBatWql5OTkArc1LwXt+xyBgYEKDw/3KKtUqVKR14ldu3bJx8cnV/9ERUUpLCzM6b8c5/Z3YZefs0349NNPtWbNGh06dEjPP/+8s00ojW2eVLRtWkxMTJ7zql69eq5BTlHeA68ds1y6dKn279+v2bNna/bs2bmmJycnO8e1IiIitGnTJi1atEgff/yxPv74Y82YMUP9+vXTzJkzJUnt27fXjz/+qIULF2rx4sX65z//qRdffFHTpk3TXXfdVeqvJzs7W1deeaUOHz6shx9+WLGxsapQoYL27t2r/v37F/lauYCAAPXo0UPvvfeeXn31VaWlpWnVqlWaMGGCUydn3g8++GC+Z62e++HKS/Xq1dW1a1dJ0rXXXquqVatqyJAh6tSpk3M8we12q3HjxnrhhRfynEeNGjUK/NrS09PVoUMHhYSEaNy4capbt64CAwO1ceNGPfzwwyVyfaGfn59atWqlFStWaMeOHUpNTVW7du0UGRmpU6dOac2aNVq5cqViY2NzbdQKK69vtZJkjCnWfLds2SLpf+9hTr/MmjVLUVFRuep78+xJm9Lqo7PlBGJ8fHye03/66SePUXRhFLbv83u9xVXQGxUUt7/P3iacq7S2eVLRtmn5HTsvqXXOa5+q5ORkRURE6JVXXsk17d1339V7772nadOmOR3g7++v66+/Xtdff73cbrfuvfdevfbaaxo9erTTaZUrV9btt9+u22+/Xb///rvat2+vsWPH6q677lKtWrUkSdu2bcu1vO+//15Vq1ZVhQoVFBQUpJCQEGcDVVDffPONfvjhB82cOVP9+vVzyvPadVzYO3L06dNHM2fOVEpKirZu3SpjjLMLVpLzwffz88t3xS6Ku+++Wy+++KIef/xx9ezZUy6XS3Xr1tXmzZvVpUuX876OunXryu1267vvvlOTJk3yrLNs2TL9+uuvevfdd9W+fXunfOfOnSX2GqQzu70mTZqkTz/9VFWrVlVsbKxcLpcaNmyolStXauXKlbruuuus8/HWnVRmzZoll8vlnKiWc2JRRETEed/vnPXifOtyeHi4ypcvn+/nwsfHx/kCVKtWrTwPc+T13KLK+Zzu2LHDOTwjSadPn9bPP/983hNfpP9dijZkyJBcJ8W53W7ddttteuedd/T4449Lyv89za+8oH1fGIVZr2rVqiW3263t27c7JxxJUlpamtLT053+uxBKYpuXX3lpbdOKwyu7YY8fP653331X1113nW688cZcjyFDhujIkSN6//33JZ05BuHRaB8f50OTlZWVZ53g4GBdeumlzvRq1aqpSZMmmjlzptLT0516W7Zs0eLFi3Xttdc68+7Ro4c++OADrV+/Plfb8/s2kvPt5ezpxhi99NJLuermXP9zdjvOp2vXrqpcubLmzJmjOXPmqGXLlh67HCIiItSxY0e99tpr2r9/f67nHzx4sEDLOZevr68eeOABbd26VQsXLpR05ozPvXv36vXXX89V//jx485ZaD169JCPj4/GjRuX6xtmTh/l1WcnT57Uq6++WqT25qddu3bKysrS5MmT1bZtW+cD2q5dO82aNUv79u0r0PHKChUqFPg9KykTJ07U4sWL1adPH2cXaEJCgkJCQjRhwgSdOnUq13Ny3u/w8HC1b99eb775pnbv3u1R5+z34KqrrtLChQs97laTlpamd955R23btlVISIikM3sbvvzyS61du9ZjWcXdtXm25s2bq0qVKnr99dd1+vRppzw5OblAu81y2jJy5Mhc25Wbb75ZHTp08Ghvfu9pfp/RgvZ9YZQvXz7PZeUlZzs1efJkj/KcPT05Z3dfCCWxzcvvtZfWNq04vDKyfP/993XkyBHdcMMNeU6/4oorFB4eruTkZPXp00d33XWXDh8+rM6dO6t69eratWuXXn75ZTVp0sT5dtWgQQN17NhRcXFxqly5stavX6/58+dryJAhznyfffZZXXPNNWrdurXuvPNO59KR0NBQj1sxTZgwQYsXL1aHDh2cyyP279+vefPm6fPPP1dYWFiuNsfGxqpu3bp68MEHtXfvXoWEhOg///lPnh/wuLg4SdL999+vhIQElStXTrfccku+/eXn56devXpp9uzZOnr0qJ577rlcdV555RW1bdtWjRs31oABA1SnTh2lpaVp9erV+uWXX7R58+Z8538+/fv315gxYzRp0iT16NFDt912m+bOnat77rlHn332meLj45Wdna3vv/9ec+fO1aJFi9S8eXNdeumleuyxx/TUU0+pXbt26tWrlwICArRu3TpFR0crKSlJbdq0UaVKlZSYmKj7779fLpdLs2bNKtFdcpLUunVr+fr6atu2bc5lH9KZXfdTp06VpAKFZVxcnD799FO98MILio6OVkxMTIndovH06dP617/+JUk6ceKEdu3apffff19ff/21OnXqpOnTpzt1Q0JCNHXqVN12221q1qyZbrnlFoWHh2v37t368MMPFR8fr3/84x+SpClTpqht27Zq1qyZBg4cqJiYGP3888/68MMPtWnTJklnbn6wZMkStW3bVvfee698fX312muvKSsrS88884yz3JEjR2rWrFm6+uqrNXToUOfSkVq1anmcH1Ac/v7+Gjt2rO677z517txZN998s37++We99dZbqlu3rnUUlpycrCZNmuR7OOCGG27Qfffdp40bN6pZs2aKi4vT1KlT9fTTT+vSSy9VRESEOnfurCZNmqhcuXKaNGmSMjIyFBAQoM6dOysiIqLAfV9QQUFBatCggebMmaN69eqpcuXKatSoUZ7Hmv/6178qMTFR06dPdw5jrF27VjNnzlSPHj08RuOlrSS2eed77aW1TSuyQp07W0Kuv/56ExgYeN4Ltvv372/8/PzMoUOHzPz5881VV11lIiIijL+/v6lZs6a5++67zf79+536Tz/9tGnZsqUJCwszQUFBJjY21owfP96cPHnSY76ffvqpiY+PN0FBQSYkJMRcf/31ed6UYNeuXaZfv34mPDzcBAQEmDp16pjBgwef96YE3333nenatasJDg42VatWNQMGDDCbN282ksyMGTOceqdPnzb33XefCQ8PNy6XK9+bEpxtyZIlRpJxuVxmz549efbZjz/+aPr162eioqKMn5+fueSSS8x1111n5s+fn28/n73cvC5ANsaYsWPHerzWkydPmkmTJpmGDRuagIAAU6lSJRMXF2eefPLJXLdle/PNN03Tpk2deh06dHAuFTLGmFWrVpkrrrjCuVh45MiRZtGiRbn6tri3u2vRokWuyx5++eUXI8nUqFEjV/28Lh35/vvvTfv27U1QUFCeNyU493Z3ed0GLi/nXrRdvnx5U7t2bdO7d28zf/78fG+p+Nlnn5mEhAQTGhpqAgMDTd26dU3//v3N+vXrPept2bLF9OzZ04SFhZnAwEDzl7/8xYwePdqjzsaNG01CQoIJDg425cuXN506dTJffPFFrmV+/fXXpkOHDkW+KcG8efM85pdzYfrZnw9j/neJT0BAgGnZsqVZtWqViYuLM1dffXW+/bhhwwYjKddrO9vPP//scRlOamqq6datm6lYsWKuS1Nef/11U6dOHVOuXLlc62NB+j6/S4LyWre++OILExcXZ/z9/Qt0U4Inn3zSxMTEGD8/P1OjRo3z3pTgXAW9ucP5tgk5SmKbl99rN6Zg27Scz1lel/rl3JTgXHltT2xcxpTw13gAKGFut1vh4eHq1atXnocAgNJWJn51BABynDhxIteu+LfffluHDx/mZ7/gNYwsAZQpy5Yt0/Dhw3XTTTepSpUq2rhxo9544w3Vr19fGzZsKBM3acefT9m9IAvAn1Lt2rVVo0YNTZkyRYcPH1blypXVr18/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++9OnXvuucfUqFHDpKSkmPXr15srrrjCtGnTxoutLrvWrl1rateubS6//HIzdOhQp5w+PL/Dhw+bWrVqmf79+5s1a9aYn376ySxatMjs2LHDqTNx4kQTGhpqFixYYDZv3mxuuOEGExMTY44fP+7Flpcd48ePN1WqVDH//e9/zc6dO828efNMcHCweemll5w69KH3lMmwbNmypRk8eLDzd3Z2tomOjjZJSUlebNXF4cCBA0aSWb58uTHGmPT0dOPn52fmzZvn1Nm6dauRZFavXu2tZpZJR44cMZdddplZsmSJ6dChgxOW9KHdww8/bNq2bZvvdLfbbaKiosyzzz7rlKWnp5uAgADz73//+0I0sczr1q2bueOOOzzKevXqZfr27WuMoQ+9rczthj158qQ2bNigrl27OmU+Pj7q2rWrVq9e7cWWXRwyMjIkSZUrV5YkbdiwQadOnfLoz9jYWNWsWZP+PMfgwYPVrVs3j76S6MOCeP/999W8eXPddNNNioiIUNOmTfX6668703fu3KnU1FSPPgwNDVWrVq3ow//Xpk0bpaSk6IcffpAkbd68WZ9//rmuueYaSfSht5W5G6kfOnRI2dnZioyM9CiPjIzU999/76VWXRzcbreGDRum+Ph4NWrUSJKUmpoqf39/hYWFedSNjIxUamqqF1pZNs2ePVsbN27UunXrck2jD+1++uknTZ06VSNGjNCjjz6qdevW6f7775e/v78SExOdfsrrc00fnvHII48oMzNTsbGxKleunLKzszV+/Hj17dtXkuhDLytzYYmiGzx4sLZs2aLPP//c2025qOzZs0dDhw7VkiVLFBgY6O3mXJTcbreaN2+uCRMmSJKaNm2qLVu2aNq0aUpMTPRy6y4Oc+fOVXJyst555x01bNhQmzZt0rBhwxQdHU0flgFlbjds1apVVa5cuVxnGqalpSkqKspLrSr7hgwZov/+97/67LPPPH7kNCoqSidPnlR6erpHffrzfzZs2KADBw6oWbNm8vX1la+vr5YvX64pU6bI19dXkZGR9KFFtWrV1KBBA4+y+vXra/fu3ZLk9BOf6/w99NBDeuSRR3TLLbeocePGuu222zR8+HAlJSVJog+9rcyFpb+/v+Li4pSSkuKUud1upaSkqHXr1l5sWdlkjNGQIUP03nvvaenSpYqJifGYHhcXJz8/P4/+3LZtm3bv3k1//r8uXbrom2++0aZNm5xH8+bN1bdvX+f/9OH5xcfH57pk6YcfflCtWrUkSTExMYqKivLow8zMTK1Zs4Y+/H/Hjh3L9QPF5cqVk9vtlkQfep23zzDKy+zZs01AQIB56623zHfffWcGDhxowsLCTGpqqrebVuYMGjTIhIaGmmXLlpn9+/c7j2PHjjl17rnnHlOzZk2zdOlSs379etO6dWvTunVrL7a67Dv7bFhj6EObtWvXGl9fXzN+/Hizfft2k5ycbMqXL2/+9a9/OXUmTpxowsLCzMKFC83XX39tunfvzmUPZ0lMTDSXXHKJc+nIu+++a6pWrWpGjhzp1KEPvadMhqUxxrz88sumZs2axt/f37Rs2dJ8+eWX3m5SmSQpz8eMGTOcOsePHzf33nuvqVSpkilfvrzp2bOn2b9/v/cafRE4NyzpQ7sPPvjANGrUyAQEBJjY2Fgzffp0j+lut9uMHj3aREZGmoCAANOlSxezbds2L7W27MnMzDRDhw41NWvWNIGBgaZOnTrmscceM1lZWU4d+tB7+IkuAAAsytwxSwAAyhrCEgAAC8ISAAALwhIAAAvCEgAAC8ISAAALwhIAAAvCEgAAC8ISAAALwhIAAAvCEgAAC8ISAACL/wOG8/wAEqW82gAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"Associative Recall with Decoding Attention Pattern\")\n",
    "plt.tight_layout()\n",
    "\n",
    "plt.imshow(scores.detach().numpy()[0,0])\n",
    "\n",
    "plt.savefig(\"fig/decode_recall_attention_pattern.pdf\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 843,
   "id": "0f3fbf55",
   "metadata": {},
   "outputs": [],
   "source": [
    "qkv = model.layers[2].layer.qkv(m)\n",
    "q, k, v = qkv.chunk(3, dim=-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 844,
   "id": "b14d0fed",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7d03926f11c0>"
      ]
     },
     "execution_count": 844,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(q.detach().numpy()[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 845,
   "id": "19f589dc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7d03925b6600>"
      ]
     },
     "execution_count": 845,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(k.detach().numpy()[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 846,
   "id": "5c2de9b5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7d03926df650>"
      ]
     },
     "execution_count": 846,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(v.detach().numpy()[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 847,
   "id": "8039708e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7d039240e300>"
      ]
     },
     "execution_count": 847,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(out.detach().numpy()[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 848,
   "id": "0b02c404",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[36, 36, 36, 36, 36, 36,  0, 17, 17, 17, 18, 18, 33, 36, 36, 36, 36, 36,\n",
       "         36, 36, 36, 36, 36, 21, 36, 36, 36, 36, 36, 36, 36, 30, 30, 30, 30, 30,\n",
       "         30, 30, 30, 30, 30, 31, 31, 31, 31, 28, 28, 28, 14, 14, 14, 14, 31, 36,\n",
       "         36, 36, 36,  8, 21, 21, 21, 21, 21, 21, 21, 21, 16, 16, 16, 16, 16, 16,\n",
       "         16, 16, 16, 16, 20, 20, 20, 20, 20,  7,  7,  7,  7,  7,  7, 33, 33, 33,\n",
       "         33, 33, 33, 33, 33, 33, 33, 33, 33, 25]])"
      ]
     },
     "execution_count": 848,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 849,
   "id": "343dacd7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([-1., -1., -1., -1., -1., -1.,  1., -1.], grad_fn=<SliceBackward0>)"
      ]
     },
     "execution_count": 849,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(m+out)[0,-1, 3*l+2:4*l+2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 850,
   "id": "b093612d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[36, 36, 36, 36, 36, 36,  0, 17, 17, 17, 18, 18, 33, 36, 36, 36, 36, 36,\n",
       "         36, 36, 36, 36, 36, 21, 36, 36, 36, 36, 36, 36, 36, 30, 30, 30, 30, 30,\n",
       "         30, 30, 30, 30, 30, 31, 31, 31, 31, 28, 28, 28, 14, 14, 14, 14, 31, 36,\n",
       "         36, 36, 36,  8, 21, 21, 21, 21, 21, 21, 21, 21, 16, 16, 16, 16, 16, 16,\n",
       "         16, 16, 16, 16, 20, 20, 20, 20, 20,  7,  7,  7,  7,  7,  7, 33, 33, 33,\n",
       "         33, 33, 33, 33, 33, 33, 33, 33, 33, 25]])"
      ]
     },
     "execution_count": 850,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "hybrid",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}