File size: 216,093 Bytes
83586b8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "982e76f5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T16:54:38.420949Z",
     "iopub.status.busy": "2024-03-22T16:54:38.420627Z",
     "iopub.status.idle": "2024-03-22T16:54:38.453783Z",
     "shell.execute_reply": "2024-03-22T16:54:38.452888Z"
    },
    "papermill": {
     "duration": 0.04789,
     "end_time": "2024-03-22T16:54:38.455806",
     "exception": false,
     "start_time": "2024-03-22T16:54:38.407916",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import joblib\n",
    "\n",
    "#joblib.parallel_backend(\"threading\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "675f0b41",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T16:54:38.481275Z",
     "iopub.status.busy": "2024-03-22T16:54:38.480905Z",
     "iopub.status.idle": "2024-03-22T16:54:38.487727Z",
     "shell.execute_reply": "2024-03-22T16:54:38.486854Z"
    },
    "papermill": {
     "duration": 0.021698,
     "end_time": "2024-03-22T16:54:38.489673",
     "exception": false,
     "start_time": "2024-03-22T16:54:38.467975",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'\\n%cd /kaggle/working\\n#!git clone https://github.com/R-N/ml-utility-loss --depth=1 --single-branch --branch=main\\n%cd ml-utility-loss\\n!git pull\\n#!pip install .\\n!pip install . --no-deps --force-reinstall --upgrade\\n#'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"\"\"\n",
    "%cd /kaggle/working\n",
    "#!git clone https://github.com/R-N/ml-utility-loss --depth=1 --single-branch --branch=main\n",
    "%cd ml-utility-loss\n",
    "!git pull\n",
    "#!pip install .\n",
    "!pip install . --no-deps --force-reinstall --upgrade\n",
    "#\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "5ae30f5c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T16:54:38.512890Z",
     "iopub.status.busy": "2024-03-22T16:54:38.512651Z",
     "iopub.status.idle": "2024-03-22T16:54:38.516571Z",
     "shell.execute_reply": "2024-03-22T16:54:38.515766Z"
    },
    "papermill": {
     "duration": 0.017861,
     "end_time": "2024-03-22T16:54:38.518464",
     "exception": false,
     "start_time": "2024-03-22T16:54:38.500603",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['figure.figsize'] = [3,3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "9f42c810",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T16:54:38.541803Z",
     "iopub.status.busy": "2024-03-22T16:54:38.541370Z",
     "iopub.status.idle": "2024-03-22T16:54:38.545217Z",
     "shell.execute_reply": "2024-03-22T16:54:38.544371Z"
    },
    "executionInfo": {
     "elapsed": 678,
     "status": "ok",
     "timestamp": 1696841022168,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "ns5hFcVL2yvs",
    "papermill": {
     "duration": 0.017736,
     "end_time": "2024-03-22T16:54:38.547270",
     "exception": false,
     "start_time": "2024-03-22T16:54:38.529534",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "datasets = [\n",
    "    \"insurance\",\n",
    "    \"treatment\",\n",
    "    \"contraceptive\"\n",
    "]\n",
    "\n",
    "study_dir = \"./\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "85d0c8ce",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T16:54:38.571177Z",
     "iopub.status.busy": "2024-03-22T16:54:38.570870Z",
     "iopub.status.idle": "2024-03-22T16:54:38.576291Z",
     "shell.execute_reply": "2024-03-22T16:54:38.575410Z"
    },
    "papermill": {
     "duration": 0.019685,
     "end_time": "2024-03-22T16:54:38.578251",
     "exception": false,
     "start_time": "2024-03-22T16:54:38.558566",
     "status": "completed"
    },
    "tags": [
     "parameters"
    ]
   },
   "outputs": [],
   "source": [
    "#Parameters\n",
    "import os\n",
    "\n",
    "path_prefix = \"../../../../\"\n",
    "\n",
    "dataset_dir = os.path.join(path_prefix, \"ml-utility-loss/datasets\")\n",
    "dataset_name = \"treatment\"\n",
    "model_name=\"ml_utility_2\"\n",
    "models = [\"tvae\", \"realtabformer\", \"lct_gan\", \"tab_ddpm_concat\"]\n",
    "single_model = \"lct_gan\"\n",
    "random_seed = 42\n",
    "gp = True\n",
    "gp_multiply = True\n",
    "folder = \"eval\"\n",
    "debug = False\n",
    "path = None\n",
    "param_index = 0\n",
    "allow_same_prediction = True\n",
    "log_wandb = False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "e2d3d897",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T16:54:38.603452Z",
     "iopub.status.busy": "2024-03-22T16:54:38.603196Z",
     "iopub.status.idle": "2024-03-22T16:54:38.608013Z",
     "shell.execute_reply": "2024-03-22T16:54:38.607193Z"
    },
    "papermill": {
     "duration": 0.019844,
     "end_time": "2024-03-22T16:54:38.609908",
     "exception": false,
     "start_time": "2024-03-22T16:54:38.590064",
     "status": "completed"
    },
    "tags": [
     "injected-parameters"
    ]
   },
   "outputs": [],
   "source": [
    "# Parameters\n",
    "dataset = \"contraceptive\"\n",
    "dataset_name = \"contraceptive\"\n",
    "single_model = \"tvae\"\n",
    "gp = False\n",
    "gp_multiply = False\n",
    "random_seed = 42\n",
    "debug = False\n",
    "folder = \"eval\"\n",
    "path_prefix = \"../../../../\"\n",
    "path = \"eval/contraceptive/tvae/42\"\n",
    "param_index = 0\n",
    "allow_same_prediction = True\n",
    "log_wandb = False\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bd7c02d6",
   "metadata": {
    "papermill": {
     "duration": 0.011211,
     "end_time": "2024-03-22T16:54:38.632439",
     "exception": false,
     "start_time": "2024-03-22T16:54:38.621228",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "5f45b1d0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T16:54:38.655861Z",
     "iopub.status.busy": "2024-03-22T16:54:38.655594Z",
     "iopub.status.idle": "2024-03-22T16:54:38.664480Z",
     "shell.execute_reply": "2024-03-22T16:54:38.663684Z"
    },
    "executionInfo": {
     "elapsed": 7,
     "status": "ok",
     "timestamp": 1696841022169,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "UdvXYv3c3LXy",
    "papermill": {
     "duration": 0.022742,
     "end_time": "2024-03-22T16:54:38.666331",
     "exception": false,
     "start_time": "2024-03-22T16:54:38.643589",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/kaggle/working\n",
      "/kaggle/working/eval/contraceptive/tvae/42\n"
     ]
    }
   ],
   "source": [
    "from pathlib import Path\n",
    "import os\n",
    "\n",
    "%cd /kaggle/working/\n",
    "\n",
    "if path is None:\n",
    "    path = os.path.join(folder, dataset_name, single_model, random_seed)\n",
    "Path(path).mkdir(parents=True, exist_ok=True)\n",
    "\n",
    "%cd {path}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "f85bf540",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T16:54:38.690470Z",
     "iopub.status.busy": "2024-03-22T16:54:38.690185Z",
     "iopub.status.idle": "2024-03-22T16:54:40.726590Z",
     "shell.execute_reply": "2024-03-22T16:54:40.725650Z"
    },
    "papermill": {
     "duration": 2.050871,
     "end_time": "2024-03-22T16:54:40.728604",
     "exception": false,
     "start_time": "2024-03-22T16:54:38.677733",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Set seed to <function seed at 0x7c41c3d1b370>\n"
     ]
    }
   ],
   "source": [
    "from ml_utility_loss.util import seed\n",
    "if single_model:\n",
    "    model_name=f\"{model_name}_{single_model}\"\n",
    "if random_seed is not None:\n",
    "    seed(random_seed)\n",
    "    print(\"Set seed to\", seed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "8489feae",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T16:54:40.760710Z",
     "iopub.status.busy": "2024-03-22T16:54:40.760306Z",
     "iopub.status.idle": "2024-03-22T16:54:40.772850Z",
     "shell.execute_reply": "2024-03-22T16:54:40.771812Z"
    },
    "papermill": {
     "duration": 0.03277,
     "end_time": "2024-03-22T16:54:40.774761",
     "exception": false,
     "start_time": "2024-03-22T16:54:40.741991",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import json\n",
    "import os\n",
    "\n",
    "df = pd.read_csv(os.path.join(dataset_dir, f\"{dataset_name}.csv\"))\n",
    "with open(os.path.join(dataset_dir, f\"{dataset_name}.json\")) as f:\n",
    "    info = json.load(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "debcc684",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T16:54:40.799242Z",
     "iopub.status.busy": "2024-03-22T16:54:40.798929Z",
     "iopub.status.idle": "2024-03-22T16:54:40.806026Z",
     "shell.execute_reply": "2024-03-22T16:54:40.805321Z"
    },
    "executionInfo": {
     "elapsed": 6,
     "status": "ok",
     "timestamp": 1696841022169,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "Vrl2QkoV3o_8",
    "papermill": {
     "duration": 0.021718,
     "end_time": "2024-03-22T16:54:40.808141",
     "exception": false,
     "start_time": "2024-03-22T16:54:40.786423",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "task = info[\"task\"]\n",
    "target = info[\"target\"]\n",
    "cat_features = info[\"cat_features\"]\n",
    "mixed_features = info[\"mixed_features\"]\n",
    "longtail_features = info[\"longtail_features\"]\n",
    "integer_features = info[\"integer_features\"]\n",
    "\n",
    "test = df.sample(frac=0.2, random_state=42)\n",
    "train = df[~df.index.isin(test.index)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "7538184a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T16:54:40.833629Z",
     "iopub.status.busy": "2024-03-22T16:54:40.833384Z",
     "iopub.status.idle": "2024-03-22T16:54:40.928573Z",
     "shell.execute_reply": "2024-03-22T16:54:40.927760Z"
    },
    "executionInfo": {
     "elapsed": 6,
     "status": "ok",
     "timestamp": 1696841022169,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "TilUuFk9vqMb",
    "papermill": {
     "duration": 0.110635,
     "end_time": "2024-03-22T16:54:40.930702",
     "exception": false,
     "start_time": "2024-03-22T16:54:40.820067",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import ml_utility_loss.synthesizers.tab_ddpm.params as TAB_DDPM_PARAMS\n",
    "import ml_utility_loss.synthesizers.lct_gan.params as LCT_GAN_PARAMS\n",
    "import ml_utility_loss.synthesizers.realtabformer.params as RTF_PARAMS\n",
    "from ml_utility_loss.synthesizers.realtabformer.params.default import GPT2_PARAMS, REALTABFORMER_PARAMS\n",
    "from ml_utility_loss.util import filter_dict_2, filter_dict\n",
    "\n",
    "tab_ddpm_params = getattr(TAB_DDPM_PARAMS, dataset_name).BEST\n",
    "lct_gan_params = getattr(LCT_GAN_PARAMS, dataset_name).BEST\n",
    "lct_ae_params = filter_dict_2(lct_gan_params, LCT_GAN_PARAMS.default.AE_PARAMS)\n",
    "rtf_params = getattr(RTF_PARAMS, dataset_name).BEST\n",
    "rtf_params = filter_dict(rtf_params, REALTABFORMER_PARAMS)\n",
    "\n",
    "lct_ae_embedding_size=lct_gan_params[\"embedding_size\"]\n",
    "tab_ddpm_normalization=\"quantile\"\n",
    "tab_ddpm_cat_encoding=tab_ddpm_params[\"cat_encoding\"]\n",
    "#tab_ddpm_cat_encoding=\"one-hot\"\n",
    "tab_ddpm_y_policy=\"default\"\n",
    "tab_ddpm_is_y_cond=True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "cca61838",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T16:54:40.958708Z",
     "iopub.status.busy": "2024-03-22T16:54:40.958059Z",
     "iopub.status.idle": "2024-03-22T16:54:45.689430Z",
     "shell.execute_reply": "2024-03-22T16:54:45.688570Z"
    },
    "executionInfo": {
     "elapsed": 3113,
     "status": "ok",
     "timestamp": 1696841025277,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "7Abt8nStvr9Z",
    "papermill": {
     "duration": 4.747577,
     "end_time": "2024-03-22T16:54:45.691899",
     "exception": false,
     "start_time": "2024-03-22T16:54:40.944322",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2024-03-22 16:54:43.265606: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:9261] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
      "2024-03-22 16:54:43.265666: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:607] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
      "2024-03-22 16:54:43.267291: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1515] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n"
     ]
    }
   ],
   "source": [
    "from ml_utility_loss.loss_learning.estimator.pipeline import load_lct_ae\n",
    "\n",
    "lct_ae = load_lct_ae(\n",
    "    dataset_name=dataset_name,\n",
    "    model_dir=os.path.join(path_prefix, \"ml-utility-loss/models\"),\n",
    "    model_name=\"lct_ae\",\n",
    "    df_name=\"df\",\n",
    ")\n",
    "lct_ae = None"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "6f83b7b6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T16:54:45.718090Z",
     "iopub.status.busy": "2024-03-22T16:54:45.716978Z",
     "iopub.status.idle": "2024-03-22T16:54:45.722995Z",
     "shell.execute_reply": "2024-03-22T16:54:45.722101Z"
    },
    "papermill": {
     "duration": 0.020744,
     "end_time": "2024-03-22T16:54:45.725071",
     "exception": false,
     "start_time": "2024-03-22T16:54:45.704327",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "from ml_utility_loss.loss_learning.estimator.pipeline import load_rtf_embed\n",
    "\n",
    "rtf_embed = load_rtf_embed(\n",
    "    dataset_name=dataset_name,\n",
    "    model_dir=os.path.join(path_prefix, \"ml-utility-loss/models\"),\n",
    "    model_name=\"realtabformer\",\n",
    "    df_name=\"df\",\n",
    "    ckpt_type=\"best-disc-model\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "0026de74",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T16:54:45.751786Z",
     "iopub.status.busy": "2024-03-22T16:54:45.751472Z",
     "iopub.status.idle": "2024-03-22T16:54:54.134274Z",
     "shell.execute_reply": "2024-03-22T16:54:54.133246Z"
    },
    "executionInfo": {
     "elapsed": 20137,
     "status": "ok",
     "timestamp": 1696841045408,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "tbaguWxAvtPi",
    "papermill": {
     "duration": 8.399093,
     "end_time": "2024-03-22T16:54:54.136682",
     "exception": false,
     "start_time": "2024-03-22T16:54:45.737589",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:274: ConvergenceWarning: Initialization 1 did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.\n",
      "  warnings.warn(\n",
      "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:119: ConvergenceWarning: Number of distinct clusters (4) found smaller than n_clusters (10). Possibly due to duplicate points in X.\n",
      "  .fit(X)\n",
      "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:119: ConvergenceWarning: Number of distinct clusters (4) found smaller than n_clusters (10). Possibly due to duplicate points in X.\n",
      "  .fit(X)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:274: ConvergenceWarning: Initialization 1 did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.\n",
      "  warnings.warn(\n",
      "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:119: ConvergenceWarning: Number of distinct clusters (4) found smaller than n_clusters (10). Possibly due to duplicate points in X.\n",
      "  .fit(X)\n"
     ]
    }
   ],
   "source": [
    "from ml_utility_loss.loss_learning.estimator.preprocessing import DataPreprocessor\n",
    "\n",
    "preprocessor = DataPreprocessor(\n",
    "    task,\n",
    "    target=target,\n",
    "    cat_features=cat_features,\n",
    "    mixed_features=mixed_features,\n",
    "    longtail_features=longtail_features,\n",
    "    integer_features=integer_features,\n",
    "    lct_ae_embedding_size=lct_ae_embedding_size,\n",
    "    lct_ae_params=lct_ae_params,\n",
    "    lct_ae=lct_ae,\n",
    "    tab_ddpm_normalization=tab_ddpm_normalization,\n",
    "    tab_ddpm_cat_encoding=tab_ddpm_cat_encoding,\n",
    "    tab_ddpm_y_policy=tab_ddpm_y_policy,\n",
    "    tab_ddpm_is_y_cond=tab_ddpm_is_y_cond,\n",
    "    realtabformer_embedding=rtf_embed,\n",
    "    realtabformer_params=rtf_params,\n",
    ")\n",
    "preprocessor.fit(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "a9c9b110",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2024-03-22T16:54:54.164061Z",
     "iopub.status.busy": "2024-03-22T16:54:54.163711Z",
     "iopub.status.idle": "2024-03-22T16:54:54.171531Z",
     "shell.execute_reply": "2024-03-22T16:54:54.170687Z"
    },
    "executionInfo": {
     "elapsed": 13,
     "status": "ok",
     "timestamp": 1696841045411,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "OxUH_GBEv2qK",
    "outputId": "76464c90-3baf-4bdc-a955-6f4fddc16b9c",
    "papermill": {
     "duration": 0.023874,
     "end_time": "2024-03-22T16:54:54.173518",
     "exception": false,
     "start_time": "2024-03-22T16:54:54.149644",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'tvae': 46,\n",
       " 'realtabformer': (24, 72, Embedding(72, 672), True),\n",
       " 'lct_gan': 40,\n",
       " 'tab_ddpm_concat': 10}"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "preprocessor.adapter_sizes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "3cb9ed90",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T16:54:54.198629Z",
     "iopub.status.busy": "2024-03-22T16:54:54.198356Z",
     "iopub.status.idle": "2024-03-22T16:54:54.203955Z",
     "shell.execute_reply": "2024-03-22T16:54:54.203117Z"
    },
    "papermill": {
     "duration": 0.020638,
     "end_time": "2024-03-22T16:54:54.205880",
     "exception": false,
     "start_time": "2024-03-22T16:54:54.185242",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "from ml_utility_loss.loss_learning.estimator.pipeline import load_dataset_3_factory\n",
    "\n",
    "datasetsn = load_dataset_3_factory(\n",
    "    dataset_dir=os.path.join(path_prefix, \"ml-utility-loss/\"),\n",
    "    dataset_name=dataset_name,\n",
    "    preprocessor=preprocessor,\n",
    "    cache_dir=path_prefix,\n",
    ")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "ad1eb833",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T16:54:54.230490Z",
     "iopub.status.busy": "2024-03-22T16:54:54.230224Z",
     "iopub.status.idle": "2024-03-22T17:02:21.663470Z",
     "shell.execute_reply": "2024-03-22T17:02:21.662503Z"
    },
    "papermill": {
     "duration": 447.460222,
     "end_time": "2024-03-22T17:02:21.677822",
     "exception": false,
     "start_time": "2024-03-22T16:54:54.217600",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Caching in ../../../../contraceptive/_cache_aug_test/tvae/all inf False\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "../../../../ml-utility-loss/aug_test/contraceptive [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n",
      "Caching in ../../../../contraceptive/_cache_bs_test/tvae/all inf False\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "../../../../ml-utility-loss/bs_test/contraceptive [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n",
      "Caching in ../../../../contraceptive/_cache_synth_test/tvae/all inf False\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "../../../../ml-utility-loss/synthetics/contraceptive [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n",
      "1050\n"
     ]
    }
   ],
   "source": [
    "from ml_utility_loss.loss_learning.estimator.pipeline import load_dataset_4\n",
    "\n",
    "test_set = load_dataset_4(\n",
    "    dataset_dir=os.path.join(path_prefix, \"ml-utility-loss/\"),\n",
    "    dataset_name=dataset_name,\n",
    "    preprocessor=preprocessor,\n",
    "    model=single_model,\n",
    "    cache_dir=path_prefix,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "14ff8b40",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T17:02:21.706111Z",
     "iopub.status.busy": "2024-03-22T17:02:21.705309Z",
     "iopub.status.idle": "2024-03-22T17:02:22.031100Z",
     "shell.execute_reply": "2024-03-22T17:02:22.030076Z"
    },
    "executionInfo": {
     "elapsed": 588,
     "status": "ok",
     "timestamp": 1696841049215,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "NgahtU1q9uLO",
    "papermill": {
     "duration": 0.342422,
     "end_time": "2024-03-22T17:02:22.033338",
     "exception": false,
     "start_time": "2024-03-22T17:02:21.690916",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'Body': 'twin_encoder',\n",
       " 'loss_balancer_meta': True,\n",
       " 'loss_balancer_log': False,\n",
       " 'loss_balancer_lbtw': False,\n",
       " 'pma_skip_small': False,\n",
       " 'isab_skip_small': False,\n",
       " 'layer_norm': False,\n",
       " 'pma_layer_norm': False,\n",
       " 'attn_residual': True,\n",
       " 'tf_n_layers_dec': False,\n",
       " 'tf_isab_rank': 0,\n",
       " 'tf_layer_norm': False,\n",
       " 'tf_pma_start': -1,\n",
       " 'head_n_seeds': 0,\n",
       " 'tf_pma_low': 16,\n",
       " 'dropout': 0,\n",
       " 'combine_mode': 'diff_left',\n",
       " 'tf_isab_mode': 'separate',\n",
       " 'grad_loss_fn': <function torch.nn.functional.l1_loss(input: torch.Tensor, target: torch.Tensor, size_average: Optional[bool] = None, reduce: Optional[bool] = None, reduction: str = 'mean') -> torch.Tensor>,\n",
       " 'single_model': True,\n",
       " 'bias': True,\n",
       " 'bias_final': True,\n",
       " 'pma_ffn_mode': 'none',\n",
       " 'patience': 10,\n",
       " 'inds_init_mode': 'fixnorm',\n",
       " 'grad_clip': 0.73,\n",
       " 'gradient_penalty_mode': {'gradient_penalty': False,\n",
       "  'calc_grad_m': False,\n",
       "  'avg_non_role_model_m': False,\n",
       "  'inverse_avg_non_role_model_m': False},\n",
       " 'synth_data': 2,\n",
       " 'bias_lr_mul': 1.0,\n",
       " 'bias_weight_decay': 0.05,\n",
       " 'head_activation': torch.nn.modules.activation.Softsign,\n",
       " 'loss_balancer_beta': 0.67,\n",
       " 'loss_balancer_r': 0.943,\n",
       " 'tf_activation': torch.nn.modules.activation.Tanh,\n",
       " 'dataset_size': 2048,\n",
       " 'batch_size': 4,\n",
       " 'epochs': 100,\n",
       " 'lr_mul': 0.09,\n",
       " 'n_warmup_steps': 100,\n",
       " 'Optim': functools.partial(<class 'torch.optim.adamw.AdamW'>, amsgrad=True),\n",
       " 'fixed_role_model': 'tvae',\n",
       " 'd_model': 256,\n",
       " 'attn_activation': torch.nn.modules.activation.PReLU,\n",
       " 'tf_d_inner': 512,\n",
       " 'tf_n_layers_enc': 3,\n",
       " 'tf_n_head': 32,\n",
       " 'tf_activation_final': ml_utility_loss.activations.LeakyHardtanh,\n",
       " 'ada_d_hid': 1024,\n",
       " 'ada_n_layers': 9,\n",
       " 'ada_activation': torch.nn.modules.activation.Softsign,\n",
       " 'ada_activation_final': ml_utility_loss.activations.LeakyHardsigmoid,\n",
       " 'head_d_hid': 256,\n",
       " 'head_n_layers': 9,\n",
       " 'head_n_head': 32,\n",
       " 'head_activation_final': ml_utility_loss.activations.LeakyHardsigmoid,\n",
       " 'models': ['tvae'],\n",
       " 'max_seconds': 3600,\n",
       " 'tf_lora': False,\n",
       " 'tf_num_inds': 128,\n",
       " 'ada_n_seeds': 0,\n",
       " 'gradient_penalty_kwargs': {'mag_loss': True,\n",
       "  'mse_mag': False,\n",
       "  'mag_corr': False,\n",
       "  'seq_mag': False,\n",
       "  'cos_loss': False,\n",
       "  'mag_corr_kwargs': {'only_sign': False},\n",
       "  'cos_loss_kwargs': {'only_sign': True, 'cos_matrix': False},\n",
       "  'mse_mag_kwargs': {'target': 0.65, 'multiply': True, 'forgive_over': True}}}"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import ml_utility_loss.loss_learning.estimator.params2 as PARAMS\n",
    "from ml_utility_loss.tuning import map_parameters\n",
    "from ml_utility_loss.loss_learning.estimator.params.default import update_param_space, update_param_space_2\n",
    "import wandb\n",
    "\n",
    "#\"\"\"\n",
    "param_space = {\n",
    "    **getattr(PARAMS, dataset_name).PARAM_SPACE,\n",
    "}\n",
    "params = {\n",
    "    **getattr(PARAMS, dataset_name).BESTS[param_index],\n",
    "}\n",
    "if gp:\n",
    "    params[\"gradient_penalty_mode\"] = \"ALL\"\n",
    "    params[\"mse_mag\"] = True\n",
    "    if gp_multiply:\n",
    "        params[\"mse_mag_multiply\"] = True\n",
    "        #params[\"mse_mag_target\"] = 1.0\n",
    "    else:\n",
    "        params[\"mse_mag_multiply\"] = False\n",
    "        #params[\"mse_mag_target\"] = 0.1\n",
    "else:\n",
    "    params[\"gradient_penalty_mode\"] = \"NONE\"\n",
    "    params[\"mse_mag\"] = False\n",
    "params[\"single_model\"] = False\n",
    "if models:\n",
    "    params[\"models\"] = models\n",
    "if single_model:\n",
    "    params[\"fixed_role_model\"] = single_model\n",
    "    params[\"single_model\"] = True\n",
    "    params[\"models\"] = [single_model]\n",
    "if params[\"fixed_role_model\"] == \"realtabformer\" and dataset_name == \"treatment\":\n",
    "    params[\"batch_size\"] = 2\n",
    "params[\"max_seconds\"] = 3600\n",
    "params[\"patience\"] = 10\n",
    "params[\"epochs\"] = 100\n",
    "if debug:\n",
    "    params[\"epochs\"] = 2\n",
    "with open(\"params.json\", \"w\") as f:\n",
    "    json.dump(params, f)\n",
    "params = map_parameters(params, param_space=param_space)\n",
    "params"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "a48bd9e9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T17:02:22.061219Z",
     "iopub.status.busy": "2024-03-22T17:02:22.060881Z",
     "iopub.status.idle": "2024-03-22T17:12:00.661298Z",
     "shell.execute_reply": "2024-03-22T17:12:00.660201Z"
    },
    "papermill": {
     "duration": 578.632009,
     "end_time": "2024-03-22T17:12:00.678673",
     "exception": false,
     "start_time": "2024-03-22T17:02:22.046664",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Caching in ../../../../contraceptive/_cache_aug_train/tvae/all inf False\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "split df ratio is 0\n",
      "../../../../ml-utility-loss/aug_train/contraceptive [400, 0]\n",
      "Caching in ../../../../contraceptive/_cache_aug_val/tvae/all inf False\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "split df ratio is 1\n",
      "../../../../ml-utility-loss/aug_val/contraceptive [0, 200]\n",
      "Caching in ../../../../contraceptive/_cache_bs_train/tvae/all inf False\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "split df ratio is 0\n",
      "../../../../ml-utility-loss/bs_train/contraceptive [100, 0]\n",
      "Caching in ../../../../contraceptive/_cache_bs_val/tvae/all inf False\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "split df ratio is 1\n",
      "../../../../ml-utility-loss/bs_val/contraceptive [0, 50]\n",
      "Caching in ../../../../contraceptive/_cache_synth/tvae/all inf False\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Splitting without random!\n",
      "Split with reverse index!\n",
      "../../../../ml-utility-loss/synthetics/contraceptive [400, 200]\n",
      "[900, 450]\n",
      "[900, 450]\n"
     ]
    }
   ],
   "source": [
    "train_set, val_set = datasetsn(model=params[\"fixed_role_model\"], synth_data=params[\"synth_data\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "2fcb1418",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "execution": {
     "iopub.execute_input": "2024-03-22T17:12:00.708438Z",
     "iopub.status.busy": "2024-03-22T17:12:00.708106Z",
     "iopub.status.idle": "2024-03-22T17:12:01.197733Z",
     "shell.execute_reply": "2024-03-22T17:12:01.196772Z"
    },
    "executionInfo": {
     "elapsed": 396850,
     "status": "error",
     "timestamp": 1696841446059,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "_bt1MQc5kpSk",
    "outputId": "01c1d3e5-ac64-461d-835a-b76f4a66e6d6",
    "papermill": {
     "duration": 0.506346,
     "end_time": "2024-03-22T17:12:01.199915",
     "exception": false,
     "start_time": "2024-03-22T17:12:00.693569",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Creating model of type <class 'ml_utility_loss.loss_learning.estimator.model.models.TwinEncoder'>\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[*] Embedding False True\n",
      "['tvae'] 1\n"
     ]
    }
   ],
   "source": [
    "from ml_utility_loss.loss_learning.estimator.model.pipeline import remove_non_model_params\n",
    "from ml_utility_loss.loss_learning.estimator.pipeline import create_model\n",
    "from ml_utility_loss.util import filter_dict, clear_memory\n",
    "\n",
    "clear_memory()\n",
    "\n",
    "params2 = remove_non_model_params(params)\n",
    "adapters = filter_dict(preprocessor.adapter_sizes, params[\"models\"])\n",
    "\n",
    "model = create_model(\n",
    "    adapters=adapters,\n",
    "    #Body=\"twin_encoder\",\n",
    "    **params2,\n",
    ")\n",
    "#cf.apply_weight_standardization(model, n_last_layers_ignore=0)\n",
    "print(model.models, len(model.adapters))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "938f94fc",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T17:12:01.229980Z",
     "iopub.status.busy": "2024-03-22T17:12:01.229573Z",
     "iopub.status.idle": "2024-03-22T17:12:01.234682Z",
     "shell.execute_reply": "2024-03-22T17:12:01.233844Z"
    },
    "papermill": {
     "duration": 0.022181,
     "end_time": "2024-03-22T17:12:01.236594",
     "exception": false,
     "start_time": "2024-03-22T17:12:01.214413",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "study_name=f\"{model_name}_{dataset_name}\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "12fb613e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T17:12:01.264684Z",
     "iopub.status.busy": "2024-03-22T17:12:01.264409Z",
     "iopub.status.idle": "2024-03-22T17:12:01.271364Z",
     "shell.execute_reply": "2024-03-22T17:12:01.270425Z"
    },
    "papermill": {
     "duration": 0.023683,
     "end_time": "2024-03-22T17:12:01.273479",
     "exception": false,
     "start_time": "2024-03-22T17:12:01.249796",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "11895304"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def count_parameters(model):\n",
    "    return sum(p.numel() for p in model.parameters() if p.requires_grad)\n",
    "\n",
    "count_parameters(model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "bd386e57",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T17:12:01.303569Z",
     "iopub.status.busy": "2024-03-22T17:12:01.302995Z",
     "iopub.status.idle": "2024-03-22T17:12:01.383209Z",
     "shell.execute_reply": "2024-03-22T17:12:01.382160Z"
    },
    "papermill": {
     "duration": 0.096944,
     "end_time": "2024-03-22T17:12:01.385367",
     "exception": false,
     "start_time": "2024-03-22T17:12:01.288423",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "========================================================================================================================\n",
       "Layer (type:depth-idx)                                                 Output Shape              Param #\n",
       "========================================================================================================================\n",
       "MLUtilitySingle                                                        [2, 1179, 46]             --\n",
       "├─Adapter: 1-1                                                         [2, 1179, 46]             --\n",
       "│    └─Sequential: 2-1                                                 [2, 1179, 256]            --\n",
       "│    │    └─FeedForward: 3-1                                           [2, 1179, 1024]           --\n",
       "│    │    │    └─Linear: 4-1                                           [2, 1179, 1024]           48,128\n",
       "│    │    │    └─Softsign: 4-2                                         [2, 1179, 1024]           --\n",
       "│    │    └─FeedForward: 3-2                                           [2, 1179, 1024]           --\n",
       "│    │    │    └─Linear: 4-3                                           [2, 1179, 1024]           1,049,600\n",
       "│    │    │    └─Softsign: 4-4                                         [2, 1179, 1024]           --\n",
       "│    │    └─FeedForward: 3-3                                           [2, 1179, 1024]           --\n",
       "│    │    │    └─Linear: 4-5                                           [2, 1179, 1024]           1,049,600\n",
       "│    │    │    └─Softsign: 4-6                                         [2, 1179, 1024]           --\n",
       "│    │    └─FeedForward: 3-4                                           [2, 1179, 1024]           --\n",
       "│    │    │    └─Linear: 4-7                                           [2, 1179, 1024]           1,049,600\n",
       "│    │    │    └─Softsign: 4-8                                         [2, 1179, 1024]           --\n",
       "│    │    └─FeedForward: 3-5                                           [2, 1179, 1024]           --\n",
       "│    │    │    └─Linear: 4-9                                           [2, 1179, 1024]           1,049,600\n",
       "│    │    │    └─Softsign: 4-10                                        [2, 1179, 1024]           --\n",
       "│    │    └─FeedForward: 3-6                                           [2, 1179, 1024]           --\n",
       "│    │    │    └─Linear: 4-11                                          [2, 1179, 1024]           1,049,600\n",
       "│    │    │    └─Softsign: 4-12                                        [2, 1179, 1024]           --\n",
       "│    │    └─FeedForward: 3-7                                           [2, 1179, 1024]           --\n",
       "│    │    │    └─Linear: 4-13                                          [2, 1179, 1024]           1,049,600\n",
       "│    │    │    └─Softsign: 4-14                                        [2, 1179, 1024]           --\n",
       "│    │    └─FeedForward: 3-8                                           [2, 1179, 1024]           --\n",
       "│    │    │    └─Linear: 4-15                                          [2, 1179, 1024]           1,049,600\n",
       "│    │    │    └─Softsign: 4-16                                        [2, 1179, 1024]           --\n",
       "│    │    └─FeedForward: 3-9                                           [2, 1179, 256]            --\n",
       "│    │    │    └─Linear: 4-17                                          [2, 1179, 256]            262,400\n",
       "│    │    │    └─LeakyHardsigmoid: 4-18                                [2, 1179, 256]            --\n",
       "├─Adapter: 1-2                                                         [2, 294, 46]              (recursive)\n",
       "│    └─Sequential: 2-2                                                 [2, 294, 256]             (recursive)\n",
       "│    │    └─FeedForward: 3-10                                          [2, 294, 1024]            (recursive)\n",
       "│    │    │    └─Linear: 4-19                                          [2, 294, 1024]            (recursive)\n",
       "│    │    │    └─Softsign: 4-20                                        [2, 294, 1024]            --\n",
       "│    │    └─FeedForward: 3-11                                          [2, 294, 1024]            (recursive)\n",
       "│    │    │    └─Linear: 4-21                                          [2, 294, 1024]            (recursive)\n",
       "│    │    │    └─Softsign: 4-22                                        [2, 294, 1024]            --\n",
       "│    │    └─FeedForward: 3-12                                          [2, 294, 1024]            (recursive)\n",
       "│    │    │    └─Linear: 4-23                                          [2, 294, 1024]            (recursive)\n",
       "│    │    │    └─Softsign: 4-24                                        [2, 294, 1024]            --\n",
       "│    │    └─FeedForward: 3-13                                          [2, 294, 1024]            (recursive)\n",
       "│    │    │    └─Linear: 4-25                                          [2, 294, 1024]            (recursive)\n",
       "│    │    │    └─Softsign: 4-26                                        [2, 294, 1024]            --\n",
       "│    │    └─FeedForward: 3-14                                          [2, 294, 1024]            (recursive)\n",
       "│    │    │    └─Linear: 4-27                                          [2, 294, 1024]            (recursive)\n",
       "│    │    │    └─Softsign: 4-28                                        [2, 294, 1024]            --\n",
       "│    │    └─FeedForward: 3-15                                          [2, 294, 1024]            (recursive)\n",
       "│    │    │    └─Linear: 4-29                                          [2, 294, 1024]            (recursive)\n",
       "│    │    │    └─Softsign: 4-30                                        [2, 294, 1024]            --\n",
       "│    │    └─FeedForward: 3-16                                          [2, 294, 1024]            (recursive)\n",
       "│    │    │    └─Linear: 4-31                                          [2, 294, 1024]            (recursive)\n",
       "│    │    │    └─Softsign: 4-32                                        [2, 294, 1024]            --\n",
       "│    │    └─FeedForward: 3-17                                          [2, 294, 1024]            (recursive)\n",
       "│    │    │    └─Linear: 4-33                                          [2, 294, 1024]            (recursive)\n",
       "│    │    │    └─Softsign: 4-34                                        [2, 294, 1024]            --\n",
       "│    │    └─FeedForward: 3-18                                          [2, 294, 256]             (recursive)\n",
       "│    │    │    └─Linear: 4-35                                          [2, 294, 256]             (recursive)\n",
       "│    │    │    └─LeakyHardsigmoid: 4-36                                [2, 294, 256]             --\n",
       "├─TwinEncoder: 1-3                                                     [2, 4096]                 --\n",
       "│    └─Encoder: 2-3                                                    [2, 16, 256]              --\n",
       "│    │    └─ModuleList: 3-20                                           --                        (recursive)\n",
       "│    │    │    └─EncoderLayer: 4-37                                    [2, 1179, 256]            --\n",
       "│    │    │    │    └─SimpleInducedSetAttention: 5-1                   [2, 1179, 256]            --\n",
       "│    │    │    │    │    └─TensorInductionPoint: 6-1                   [2, 128, 256]             32,768\n",
       "│    │    │    │    │    └─MultiHeadAttention: 6-2                     [2, 128, 256]             --\n",
       "│    │    │    │    │    │    └─Linear: 7-1                            [2, 128, 256]             65,536\n",
       "│    │    │    │    │    │    └─Linear: 7-2                            [2, 1179, 256]            65,536\n",
       "│    │    │    │    │    │    └─Linear: 7-3                            [2, 1179, 256]            65,536\n",
       "│    │    │    │    │    │    └─ScaledDotProductAttention: 7-4         [2, 32, 128, 8]           --\n",
       "│    │    │    │    │    │    │    └─Softmax: 8-1                      [2, 32, 128, 1179]        --\n",
       "│    │    │    │    │    │    └─Linear: 7-5                            [2, 128, 256]             65,792\n",
       "│    │    │    │    │    │    └─PReLU: 7-6                             [2, 128, 256]             1\n",
       "│    │    │    │    │    └─MultiHeadAttention: 6-3                     [2, 1179, 256]            --\n",
       "│    │    │    │    │    │    └─Linear: 7-7                            [2, 1179, 256]            65,536\n",
       "│    │    │    │    │    │    └─Linear: 7-8                            [2, 128, 256]             65,536\n",
       "│    │    │    │    │    │    └─Linear: 7-9                            [2, 128, 256]             65,536\n",
       "│    │    │    │    │    │    └─ScaledDotProductAttention: 7-10        [2, 32, 1179, 8]          --\n",
       "│    │    │    │    │    │    │    └─Softmax: 8-2                      [2, 32, 1179, 128]        --\n",
       "│    │    │    │    │    │    └─Linear: 7-11                           [2, 1179, 256]            65,792\n",
       "│    │    │    │    │    │    └─PReLU: 7-12                            [2, 1179, 256]            1\n",
       "│    │    │    │    └─DoubleFeedForward: 5-2                           [2, 1179, 256]            --\n",
       "│    │    │    │    │    └─Linear: 6-4                                 [2, 1179, 512]            131,584\n",
       "│    │    │    │    │    └─Tanh: 6-5                                   [2, 1179, 512]            --\n",
       "│    │    │    │    │    └─Linear: 6-6                                 [2, 1179, 256]            131,328\n",
       "│    │    │    └─EncoderLayer: 4-38                                    [2, 1179, 256]            --\n",
       "│    │    │    │    └─SimpleInducedSetAttention: 5-3                   [2, 1179, 256]            --\n",
       "│    │    │    │    │    └─TensorInductionPoint: 6-7                   [2, 128, 256]             32,768\n",
       "│    │    │    │    │    └─MultiHeadAttention: 6-8                     [2, 128, 256]             --\n",
       "│    │    │    │    │    │    └─Linear: 7-13                           [2, 128, 256]             65,536\n",
       "│    │    │    │    │    │    └─Linear: 7-14                           [2, 1179, 256]            65,536\n",
       "│    │    │    │    │    │    └─Linear: 7-15                           [2, 1179, 256]            65,536\n",
       "│    │    │    │    │    │    └─ScaledDotProductAttention: 7-16        [2, 32, 128, 8]           --\n",
       "│    │    │    │    │    │    │    └─Softmax: 8-3                      [2, 32, 128, 1179]        --\n",
       "│    │    │    │    │    │    └─Linear: 7-17                           [2, 128, 256]             65,792\n",
       "│    │    │    │    │    │    └─PReLU: 7-18                            [2, 128, 256]             1\n",
       "│    │    │    │    │    └─MultiHeadAttention: 6-9                     [2, 1179, 256]            --\n",
       "│    │    │    │    │    │    └─Linear: 7-19                           [2, 1179, 256]            65,536\n",
       "│    │    │    │    │    │    └─Linear: 7-20                           [2, 128, 256]             65,536\n",
       "│    │    │    │    │    │    └─Linear: 7-21                           [2, 128, 256]             65,536\n",
       "│    │    │    │    │    │    └─ScaledDotProductAttention: 7-22        [2, 32, 1179, 8]          --\n",
       "│    │    │    │    │    │    │    └─Softmax: 8-4                      [2, 32, 1179, 128]        --\n",
       "│    │    │    │    │    │    └─Linear: 7-23                           [2, 1179, 256]            65,792\n",
       "│    │    │    │    │    │    └─PReLU: 7-24                            [2, 1179, 256]            1\n",
       "│    │    │    │    └─DoubleFeedForward: 5-4                           [2, 1179, 256]            --\n",
       "│    │    │    │    │    └─Linear: 6-10                                [2, 1179, 512]            131,584\n",
       "│    │    │    │    │    └─Tanh: 6-11                                  [2, 1179, 512]            --\n",
       "│    │    │    │    │    └─Linear: 6-12                                [2, 1179, 256]            131,328\n",
       "│    │    │    └─EncoderLayer: 4-39                                    [2, 16, 256]              --\n",
       "│    │    │    │    └─SimpleInducedSetAttention: 5-5                   [2, 1179, 256]            --\n",
       "│    │    │    │    │    └─TensorInductionPoint: 6-13                  [2, 128, 256]             32,768\n",
       "│    │    │    │    │    └─MultiHeadAttention: 6-14                    [2, 128, 256]             --\n",
       "│    │    │    │    │    │    └─Linear: 7-25                           [2, 128, 256]             65,536\n",
       "│    │    │    │    │    │    └─Linear: 7-26                           [2, 1179, 256]            65,536\n",
       "│    │    │    │    │    │    └─Linear: 7-27                           [2, 1179, 256]            65,536\n",
       "│    │    │    │    │    │    └─ScaledDotProductAttention: 7-28        [2, 32, 128, 8]           --\n",
       "│    │    │    │    │    │    │    └─Softmax: 8-5                      [2, 32, 128, 1179]        --\n",
       "│    │    │    │    │    │    └─Linear: 7-29                           [2, 128, 256]             65,792\n",
       "│    │    │    │    │    │    └─PReLU: 7-30                            [2, 128, 256]             1\n",
       "│    │    │    │    │    └─MultiHeadAttention: 6-15                    [2, 1179, 256]            --\n",
       "│    │    │    │    │    │    └─Linear: 7-31                           [2, 1179, 256]            65,536\n",
       "│    │    │    │    │    │    └─Linear: 7-32                           [2, 128, 256]             65,536\n",
       "│    │    │    │    │    │    └─Linear: 7-33                           [2, 128, 256]             65,536\n",
       "│    │    │    │    │    │    └─ScaledDotProductAttention: 7-34        [2, 32, 1179, 8]          --\n",
       "│    │    │    │    │    │    │    └─Softmax: 8-6                      [2, 32, 1179, 128]        --\n",
       "│    │    │    │    │    │    └─Linear: 7-35                           [2, 1179, 256]            65,792\n",
       "│    │    │    │    │    │    └─PReLU: 7-36                            [2, 1179, 256]            1\n",
       "│    │    │    │    └─DoubleFeedForward: 5-6                           [2, 1179, 256]            --\n",
       "│    │    │    │    │    └─Linear: 6-16                                [2, 1179, 512]            131,584\n",
       "│    │    │    │    │    └─LeakyHardtanh: 6-17                         [2, 1179, 512]            --\n",
       "│    │    │    │    │    └─Linear: 6-18                                [2, 1179, 256]            131,328\n",
       "│    │    │    │    └─PoolingByMultiheadAttention: 5-7                 [2, 16, 256]              --\n",
       "│    │    │    │    │    └─TensorInductionPoint: 6-19                  [2, 16, 256]              4,096\n",
       "│    │    │    │    │    └─SimpleMultiHeadAttention: 6-20              [2, 16, 256]              --\n",
       "│    │    │    │    │    │    └─Linear: 7-37                           [2, 16, 256]              65,536\n",
       "│    │    │    │    │    │    └─Linear: 7-38                           [2, 1179, 256]            65,536\n",
       "│    │    │    │    │    │    └─Linear: 7-39                           [2, 1179, 256]            65,536\n",
       "│    │    │    │    │    │    └─ScaledDotProductAttention: 7-40        [2, 32, 16, 8]            --\n",
       "│    │    │    │    │    │    │    └─Softmax: 8-7                      [2, 32, 16, 1179]         --\n",
       "│    │    │    │    │    │    └─Linear: 7-41                           [2, 16, 256]              65,792\n",
       "│    │    │    │    │    │    └─PReLU: 7-42                            [2, 16, 256]              1\n",
       "│    └─Encoder: 2-4                                                    [2, 16, 256]              (recursive)\n",
       "│    │    └─ModuleList: 3-20                                           --                        (recursive)\n",
       "│    │    │    └─EncoderLayer: 4-40                                    [2, 294, 256]             (recursive)\n",
       "│    │    │    │    └─SimpleInducedSetAttention: 5-8                   [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    └─TensorInductionPoint: 6-21                  [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    └─MultiHeadAttention: 6-22                    [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-43                           [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-44                           [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-45                           [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─ScaledDotProductAttention: 7-46        [2, 32, 128, 8]           --\n",
       "│    │    │    │    │    │    │    └─Softmax: 8-8                      [2, 32, 128, 294]         --\n",
       "│    │    │    │    │    │    └─Linear: 7-47                           [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─PReLU: 7-48                            [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    └─MultiHeadAttention: 6-23                    [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-49                           [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-50                           [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-51                           [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─ScaledDotProductAttention: 7-52        [2, 32, 294, 8]           --\n",
       "│    │    │    │    │    │    │    └─Softmax: 8-9                      [2, 32, 294, 128]         --\n",
       "│    │    │    │    │    │    └─Linear: 7-53                           [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─PReLU: 7-54                            [2, 294, 256]             (recursive)\n",
       "│    │    │    │    └─DoubleFeedForward: 5-9                           [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    └─Linear: 6-24                                [2, 294, 512]             (recursive)\n",
       "│    │    │    │    │    └─Tanh: 6-25                                  [2, 294, 512]             --\n",
       "│    │    │    │    │    └─Linear: 6-26                                [2, 294, 256]             (recursive)\n",
       "│    │    │    └─EncoderLayer: 4-41                                    [2, 294, 256]             (recursive)\n",
       "│    │    │    │    └─SimpleInducedSetAttention: 5-10                  [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    └─TensorInductionPoint: 6-27                  [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    └─MultiHeadAttention: 6-28                    [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-55                           [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-56                           [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-57                           [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─ScaledDotProductAttention: 7-58        [2, 32, 128, 8]           --\n",
       "│    │    │    │    │    │    │    └─Softmax: 8-10                     [2, 32, 128, 294]         --\n",
       "│    │    │    │    │    │    └─Linear: 7-59                           [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─PReLU: 7-60                            [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    └─MultiHeadAttention: 6-29                    [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-61                           [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-62                           [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-63                           [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─ScaledDotProductAttention: 7-64        [2, 32, 294, 8]           --\n",
       "│    │    │    │    │    │    │    └─Softmax: 8-11                     [2, 32, 294, 128]         --\n",
       "│    │    │    │    │    │    └─Linear: 7-65                           [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─PReLU: 7-66                            [2, 294, 256]             (recursive)\n",
       "│    │    │    │    └─DoubleFeedForward: 5-11                          [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    └─Linear: 6-30                                [2, 294, 512]             (recursive)\n",
       "│    │    │    │    │    └─Tanh: 6-31                                  [2, 294, 512]             --\n",
       "│    │    │    │    │    └─Linear: 6-32                                [2, 294, 256]             (recursive)\n",
       "│    │    │    └─EncoderLayer: 4-42                                    [2, 16, 256]              (recursive)\n",
       "│    │    │    │    └─SimpleInducedSetAttention: 5-12                  [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    └─TensorInductionPoint: 6-33                  [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    └─MultiHeadAttention: 6-34                    [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-67                           [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-68                           [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-69                           [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─ScaledDotProductAttention: 7-70        [2, 32, 128, 8]           --\n",
       "│    │    │    │    │    │    │    └─Softmax: 8-12                     [2, 32, 128, 294]         --\n",
       "│    │    │    │    │    │    └─Linear: 7-71                           [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─PReLU: 7-72                            [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    └─MultiHeadAttention: 6-35                    [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-73                           [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-74                           [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-75                           [2, 128, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─ScaledDotProductAttention: 7-76        [2, 32, 294, 8]           --\n",
       "│    │    │    │    │    │    │    └─Softmax: 8-13                     [2, 32, 294, 128]         --\n",
       "│    │    │    │    │    │    └─Linear: 7-77                           [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─PReLU: 7-78                            [2, 294, 256]             (recursive)\n",
       "│    │    │    │    └─DoubleFeedForward: 5-13                          [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    └─Linear: 6-36                                [2, 294, 512]             (recursive)\n",
       "│    │    │    │    │    └─LeakyHardtanh: 6-37                         [2, 294, 512]             --\n",
       "│    │    │    │    │    └─Linear: 6-38                                [2, 294, 256]             (recursive)\n",
       "│    │    │    │    └─PoolingByMultiheadAttention: 5-14                [2, 16, 256]              (recursive)\n",
       "│    │    │    │    │    └─TensorInductionPoint: 6-39                  [2, 16, 256]              (recursive)\n",
       "│    │    │    │    │    └─SimpleMultiHeadAttention: 6-40              [2, 16, 256]              (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-79                           [2, 16, 256]              (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-80                           [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─Linear: 7-81                           [2, 294, 256]             (recursive)\n",
       "│    │    │    │    │    │    └─ScaledDotProductAttention: 7-82        [2, 32, 16, 8]            --\n",
       "│    │    │    │    │    │    │    └─Softmax: 8-14                     [2, 32, 16, 294]          --\n",
       "│    │    │    │    │    │    └─Linear: 7-83                           [2, 16, 256]              (recursive)\n",
       "│    │    │    │    │    │    └─PReLU: 7-84                            [2, 16, 256]              (recursive)\n",
       "├─Head: 1-4                                                            [2]                       --\n",
       "│    └─Sequential: 2-5                                                 [2, 1]                    --\n",
       "│    │    └─FeedForward: 3-21                                          [2, 256]                  --\n",
       "│    │    │    └─Linear: 4-43                                          [2, 256]                  1,048,832\n",
       "│    │    │    └─Softsign: 4-44                                        [2, 256]                  --\n",
       "│    │    └─FeedForward: 3-22                                          [2, 256]                  --\n",
       "│    │    │    └─Linear: 4-45                                          [2, 256]                  65,792\n",
       "│    │    │    └─Softsign: 4-46                                        [2, 256]                  --\n",
       "│    │    └─FeedForward: 3-23                                          [2, 256]                  --\n",
       "│    │    │    └─Linear: 4-47                                          [2, 256]                  65,792\n",
       "│    │    │    └─Softsign: 4-48                                        [2, 256]                  --\n",
       "│    │    └─FeedForward: 3-24                                          [2, 256]                  --\n",
       "│    │    │    └─Linear: 4-49                                          [2, 256]                  65,792\n",
       "│    │    │    └─Softsign: 4-50                                        [2, 256]                  --\n",
       "│    │    └─FeedForward: 3-25                                          [2, 256]                  --\n",
       "│    │    │    └─Linear: 4-51                                          [2, 256]                  65,792\n",
       "│    │    │    └─Softsign: 4-52                                        [2, 256]                  --\n",
       "│    │    └─FeedForward: 3-26                                          [2, 256]                  --\n",
       "│    │    │    └─Linear: 4-53                                          [2, 256]                  65,792\n",
       "│    │    │    └─Softsign: 4-54                                        [2, 256]                  --\n",
       "│    │    └─FeedForward: 3-27                                          [2, 256]                  --\n",
       "│    │    │    └─Linear: 4-55                                          [2, 256]                  65,792\n",
       "│    │    │    └─Softsign: 4-56                                        [2, 256]                  --\n",
       "│    │    └─FeedForward: 3-28                                          [2, 256]                  --\n",
       "│    │    │    └─Linear: 4-57                                          [2, 256]                  65,792\n",
       "│    │    │    └─Softsign: 4-58                                        [2, 256]                  --\n",
       "│    │    └─FeedForward: 3-29                                          [2, 1]                    --\n",
       "│    │    │    └─Linear: 4-59                                          [2, 1]                    257\n",
       "│    │    │    └─LeakyHardsigmoid: 4-60                                [2, 1]                    --\n",
       "========================================================================================================================\n",
       "Total params: 11,895,304\n",
       "Trainable params: 11,895,304\n",
       "Non-trainable params: 0\n",
       "Total mult-adds (M): 44.15\n",
       "========================================================================================================================\n",
       "Input size (MB): 0.54\n",
       "Forward/backward pass size (MB): 375.40\n",
       "Params size (MB): 47.58\n",
       "Estimated Total Size (MB): 423.53\n",
       "========================================================================================================================"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from torchinfo import summary\n",
    "\n",
    "role_model = params[\"fixed_role_model\"]\n",
    "s = train_set[0][role_model]\n",
    "summary(model[role_model], input_size=((2, *s[0].shape), (2, *s[1].shape)), depth=9) # 8 max"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "0f42c4d1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T17:12:01.417191Z",
     "iopub.status.busy": "2024-03-22T17:12:01.416837Z",
     "iopub.status.idle": "2024-03-22T18:16:21.301787Z",
     "shell.execute_reply": "2024-03-22T18:16:21.300655Z"
    },
    "papermill": {
     "duration": 3859.922538,
     "end_time": "2024-03-22T18:16:21.323259",
     "exception": false,
     "start_time": "2024-03-22T17:12:01.400721",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3 datasets [900, 450, 1050]\n",
      "Creating model of type <class 'ml_utility_loss.loss_learning.estimator.model.models.TwinEncoder'>\n",
      "[*] Embedding False True\n",
      "g_loss_mul 0.1\n",
      "Epoch 0\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.020646917774962883, 'avg_role_model_std_loss': 0.7029616862738138, 'avg_role_model_mean_pred_loss': 0.0014198488189189598, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.020646917774962883, 'n_size': 900, 'n_batch': 225, 'duration': 211.21505284309387, 'duration_batch': 0.9387335681915283, 'duration_size': 0.23468339204788208, 'avg_pred_std': 0.12668553197549448}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.00800067097414285, 'avg_role_model_std_loss': 0.8323721770502058, 'avg_role_model_mean_pred_loss': 0.00025833536566152146, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.00800067097414285, 'n_size': 450, 'n_batch': 113, 'duration': 91.81465721130371, 'duration_batch': 0.8125190903655196, 'duration_size': 0.20403257158067492, 'avg_pred_std': 0.07484065717399384}\n",
      "Epoch 1\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.007335189075060447, 'avg_role_model_std_loss': 0.5605360431658958, 'avg_role_model_mean_pred_loss': 0.00016509135985034204, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.007335189075060447, 'n_size': 900, 'n_batch': 225, 'duration': 211.18131518363953, 'duration_batch': 0.9385836230383979, 'duration_size': 0.23464590575959948, 'avg_pred_std': 0.09665914196934965}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.005770373049502572, 'avg_role_model_std_loss': 1.328719814272311, 'avg_role_model_mean_pred_loss': 0.0001455103024895009, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.005770373049502572, 'n_size': 450, 'n_batch': 113, 'duration': 92.31423711776733, 'duration_batch': 0.8169401514846667, 'duration_size': 0.20514274915059408, 'avg_pred_std': 0.06159803802889269}\n",
      "Epoch 2\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.004101434572932905, 'avg_role_model_std_loss': 0.40740934907574267, 'avg_role_model_mean_pred_loss': 4.4437185304309564e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.004101434572932905, 'n_size': 900, 'n_batch': 225, 'duration': 211.43363165855408, 'duration_batch': 0.9397050295935737, 'duration_size': 0.23492625739839343, 'avg_pred_std': 0.10036693361898263}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.005793615489771279, 'avg_role_model_std_loss': 2.93090469723272, 'avg_role_model_mean_pred_loss': 7.996645985781352e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.005793615489771279, 'n_size': 450, 'n_batch': 113, 'duration': 92.21822166442871, 'duration_batch': 0.8160904572073338, 'duration_size': 0.20492938147650824, 'avg_pred_std': 0.0686845871407654}\n",
      "Epoch 3\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0032525908350200753, 'avg_role_model_std_loss': 0.45932424604433697, 'avg_role_model_mean_pred_loss': 1.5064653623929553e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0032525908350200753, 'n_size': 900, 'n_batch': 225, 'duration': 210.6352882385254, 'duration_batch': 0.9361568366156684, 'duration_size': 0.2340392091539171, 'avg_pred_std': 0.09941185830367937}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0025840073977209006, 'avg_role_model_std_loss': 2.9610207560058215, 'avg_role_model_mean_pred_loss': 8.98458365437745e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0025840073977209006, 'n_size': 450, 'n_batch': 113, 'duration': 91.6226761341095, 'duration_batch': 0.81082014277973, 'duration_size': 0.20360594696468778, 'avg_pred_std': 0.04679510168797147}\n",
      "Epoch 4\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0028994390259807308, 'avg_role_model_std_loss': 0.27792873476118807, 'avg_role_model_mean_pred_loss': 1.2238399814356409e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0028994390259807308, 'n_size': 900, 'n_batch': 225, 'duration': 210.90299940109253, 'duration_batch': 0.9373466640048557, 'duration_size': 0.23433666600121392, 'avg_pred_std': 0.10629830273903078}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.004226378290137897, 'avg_role_model_std_loss': 3.139442252464839, 'avg_role_model_mean_pred_loss': 2.8896792241464515e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.004226378290137897, 'n_size': 450, 'n_batch': 113, 'duration': 92.30420923233032, 'duration_batch': 0.8168514091356666, 'duration_size': 0.20512046496073405, 'avg_pred_std': 0.04041025609363167}\n",
      "Epoch 5\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0029357373788823477, 'avg_role_model_std_loss': 0.35013624048834924, 'avg_role_model_mean_pred_loss': 1.5252040759503315e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0029357373788823477, 'n_size': 900, 'n_batch': 225, 'duration': 210.8098328113556, 'duration_batch': 0.9369325902726915, 'duration_size': 0.23423314756817287, 'avg_pred_std': 0.10065761231092943}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.003366937771077371, 'avg_role_model_std_loss': 2.7330855187934775, 'avg_role_model_mean_pred_loss': 2.1526505657937356e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.003366937771077371, 'n_size': 450, 'n_batch': 113, 'duration': 92.45483732223511, 'duration_batch': 0.8181844010817266, 'duration_size': 0.20545519404941134, 'avg_pred_std': 0.048643345435137604}\n",
      "Epoch 6\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0025804581021010463, 'avg_role_model_std_loss': 0.33193543293685124, 'avg_role_model_mean_pred_loss': 1.1130432750345e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0025804581021010463, 'n_size': 900, 'n_batch': 225, 'duration': 210.82577991485596, 'duration_batch': 0.9370034662882487, 'duration_size': 0.23425086657206218, 'avg_pred_std': 0.10346181529677577}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0029045950072920986, 'avg_role_model_std_loss': 4.791847205054414, 'avg_role_model_mean_pred_loss': 1.7926797626652248e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0029045950072920986, 'n_size': 450, 'n_batch': 113, 'duration': 92.71966814994812, 'duration_batch': 0.8205280367252046, 'duration_size': 0.20604370699988472, 'avg_pred_std': 0.04583418705378066}\n",
      "Epoch 7\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0024444010488999385, 'avg_role_model_std_loss': 0.27924930442016427, 'avg_role_model_mean_pred_loss': 1.0806890312169106e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0024444010488999385, 'n_size': 900, 'n_batch': 225, 'duration': 211.59207558631897, 'duration_batch': 0.9404092248280843, 'duration_size': 0.23510230620702108, 'avg_pred_std': 0.10225464255238573}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.002720622533104486, 'avg_role_model_std_loss': 3.2791891266000865, 'avg_role_model_mean_pred_loss': 1.838483538128186e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.002720622533104486, 'n_size': 450, 'n_batch': 113, 'duration': 96.57148313522339, 'duration_batch': 0.8546148950019768, 'duration_size': 0.21460329585605198, 'avg_pred_std': 0.04418732333965435}\n",
      "Epoch 8\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.00242780985414154, 'avg_role_model_std_loss': 0.25769682647126535, 'avg_role_model_mean_pred_loss': 1.037415603605397e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.00242780985414154, 'n_size': 900, 'n_batch': 225, 'duration': 213.52410340309143, 'duration_batch': 0.9489960151248508, 'duration_size': 0.2372490037812127, 'avg_pred_std': 0.10494643683855732}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.002887863010659607, 'avg_role_model_std_loss': 1.8791022815315657, 'avg_role_model_mean_pred_loss': 2.555802672021092e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.002887863010659607, 'n_size': 450, 'n_batch': 113, 'duration': 92.99426054954529, 'duration_batch': 0.8229580579605777, 'duration_size': 0.20665391233232286, 'avg_pred_std': 0.059518284711418096}\n",
      "Epoch 9\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.002208985082106665, 'avg_role_model_std_loss': 0.42546326303130916, 'avg_role_model_mean_pred_loss': 7.684016633753033e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.002208985082106665, 'n_size': 900, 'n_batch': 225, 'duration': 213.6311333179474, 'duration_batch': 0.9494717036353217, 'duration_size': 0.23736792590883043, 'avg_pred_std': 0.10293637524772849}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0024638745025731624, 'avg_role_model_std_loss': 3.782287786237916, 'avg_role_model_mean_pred_loss': 1.655159604749657e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0024638745025731624, 'n_size': 450, 'n_batch': 113, 'duration': 97.28867506980896, 'duration_batch': 0.8609617262814953, 'duration_size': 0.21619705571068656, 'avg_pred_std': 0.04808065608046965}\n",
      "Epoch 10\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0020764596655175813, 'avg_role_model_std_loss': 0.3896139937922279, 'avg_role_model_mean_pred_loss': 7.334516867581215e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0020764596655175813, 'n_size': 900, 'n_batch': 225, 'duration': 221.03631401062012, 'duration_batch': 0.9823836178249783, 'duration_size': 0.24559590445624457, 'avg_pred_std': 0.10016421435814765}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0025203956082178692, 'avg_role_model_std_loss': 2.2354346593865277, 'avg_role_model_mean_pred_loss': 2.0540576969837897e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0025203956082178692, 'n_size': 450, 'n_batch': 113, 'duration': 97.72019529342651, 'duration_batch': 0.8647804893223585, 'duration_size': 0.2171559895409478, 'avg_pred_std': 0.057214381701758014}\n",
      "Epoch 11\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0019838308382329867, 'avg_role_model_std_loss': 0.26038020301704434, 'avg_role_model_mean_pred_loss': 7.2093371565769966e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0019838308382329867, 'n_size': 900, 'n_batch': 225, 'duration': 221.59594750404358, 'duration_batch': 0.9848708777957492, 'duration_size': 0.2462177194489373, 'avg_pred_std': 0.1044646823985709}\n",
      "Time out: 3600.622545480728/3600\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Eval loss {'role_model': 'tvae', 'n_size': 1050, 'n_batch': 263, 'role_model_metrics': {'avg_loss': 0.0027671898508283663, 'avg_g_mag_loss': 0.06750814222799723, 'avg_g_cos_loss': 0.031209569611071075, 'pred_duration': 4.135732650756836, 'grad_duration': 12.466698169708252, 'total_duration': 16.602430820465088, 'pred_std': 0.10057252645492554, 'std_loss': 0.008725129999220371, 'mean_pred_loss': 2.4340070012840442e-05, 'pred_rmse': 0.05260408669710159, 'pred_mae': 0.03820032626390457, 'pred_mape': 0.1258891075849533, 'grad_rmse': 0.04161679372191429, 'grad_mae': 0.021082276478409767, 'grad_mape': 0.4825449585914612}, 'non_role_model_metrics': {'avg_loss': 0, 'avg_g_mag_loss': 0, 'avg_g_cos_loss': 0, 'avg_pred_duration': 0, 'avg_grad_duration': 0, 'avg_total_duration': 0, 'avg_pred_std': 0, 'avg_std_loss': 0, 'avg_mean_pred_loss': 0}, 'avg_metrics': {'avg_loss': 0.0027671898508283663, 'avg_g_mag_loss': 0.06750814222799723, 'avg_g_cos_loss': 0.031209569611071075, 'avg_pred_duration': 4.135732650756836, 'avg_grad_duration': 12.466698169708252, 'avg_total_duration': 16.602430820465088, 'avg_pred_std': 0.10057252645492554, 'avg_std_loss': 0.008725129999220371, 'avg_mean_pred_loss': 2.4340070012840442e-05}, 'min_metrics': {'avg_loss': 0.0027671898508283663, 'avg_g_mag_loss': 0.06750814222799723, 'avg_g_cos_loss': 0.031209569611071075, 'pred_duration': 4.135732650756836, 'grad_duration': 12.466698169708252, 'total_duration': 16.602430820465088, 'pred_std': 0.10057252645492554, 'std_loss': 0.008725129999220371, 'mean_pred_loss': 2.4340070012840442e-05, 'pred_rmse': 0.05260408669710159, 'pred_mae': 0.03820032626390457, 'pred_mape': 0.1258891075849533, 'grad_rmse': 0.04161679372191429, 'grad_mae': 0.021082276478409767, 'grad_mape': 0.4825449585914612}, 'model_metrics': {'tvae': {'avg_loss': 0.0027671898508283663, 'avg_g_mag_loss': 0.06750814222799723, 'avg_g_cos_loss': 0.031209569611071075, 'pred_duration': 4.135732650756836, 'grad_duration': 12.466698169708252, 'total_duration': 16.602430820465088, 'pred_std': 0.10057252645492554, 'std_loss': 0.008725129999220371, 'mean_pred_loss': 2.4340070012840442e-05, 'pred_rmse': 0.05260408669710159, 'pred_mae': 0.03820032626390457, 'pred_mape': 0.1258891075849533, 'grad_rmse': 0.04161679372191429, 'grad_mae': 0.021082276478409767, 'grad_mape': 0.4825449585914612}}}\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "from ml_utility_loss.loss_learning.estimator.pipeline import train, train_2\n",
    "from ml_utility_loss.loss_learning.estimator.process_simple import train_epoch, eval as _eval\n",
    "from ml_utility_loss.params import GradientPenaltyMode\n",
    "from ml_utility_loss.util import clear_memory\n",
    "import time\n",
    "#torch.autograd.set_detect_anomaly(True)\n",
    "\n",
    "del model\n",
    "clear_memory()\n",
    "\n",
    "#opt = params[\"Optim\"](model.parameters())\n",
    "loss = train_2(\n",
    "    [train_set, val_set, test_set],\n",
    "    preprocessor=preprocessor,\n",
    "    #whole_model=model,\n",
    "    #optim=opt,\n",
    "    log_dir=\"logs\",\n",
    "    checkpoint_dir=\"checkpoints\",\n",
    "    verbose=True,\n",
    "    allow_same_prediction=allow_same_prediction,\n",
    "    wandb=wandb if log_wandb else None,\n",
    "    study_name=study_name,\n",
    "    **params\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "9b514a07",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T18:16:21.365486Z",
     "iopub.status.busy": "2024-03-22T18:16:21.365041Z",
     "iopub.status.idle": "2024-03-22T18:16:21.370168Z",
     "shell.execute_reply": "2024-03-22T18:16:21.369073Z"
    },
    "papermill": {
     "duration": 0.028958,
     "end_time": "2024-03-22T18:16:21.372457",
     "exception": false,
     "start_time": "2024-03-22T18:16:21.343499",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "model = loss[\"whole_model\"]\n",
    "opt = loss[\"optim\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "331a49e1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T18:16:21.409276Z",
     "iopub.status.busy": "2024-03-22T18:16:21.408968Z",
     "iopub.status.idle": "2024-03-22T18:16:21.506071Z",
     "shell.execute_reply": "2024-03-22T18:16:21.505164Z"
    },
    "papermill": {
     "duration": 0.117463,
     "end_time": "2024-03-22T18:16:21.508351",
     "exception": false,
     "start_time": "2024-03-22T18:16:21.390888",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "from copy import deepcopy\n",
    "\n",
    "torch.save(deepcopy(model.state_dict()), \"model.pt\")\n",
    "#torch.save(deepcopy(opt.state_dict()), \"optim.pt\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "123b4b17",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T18:16:21.544277Z",
     "iopub.status.busy": "2024-03-22T18:16:21.543923Z",
     "iopub.status.idle": "2024-03-22T18:16:21.818454Z",
     "shell.execute_reply": "2024-03-22T18:16:21.817370Z"
    },
    "papermill": {
     "duration": 0.295571,
     "end_time": "2024-03-22T18:16:21.820671",
     "exception": false,
     "start_time": "2024-03-22T18:16:21.525100",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 300x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "history = loss[\"history\"]\n",
    "history.to_csv(\"history.csv\")\n",
    "history[[\"avg_loss_train\", \"avg_loss_test\"]].plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "2586ba0a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T18:16:21.858143Z",
     "iopub.status.busy": "2024-03-22T18:16:21.857786Z",
     "iopub.status.idle": "2024-03-22T18:20:40.954647Z",
     "shell.execute_reply": "2024-03-22T18:20:40.953627Z"
    },
    "papermill": {
     "duration": 259.118235,
     "end_time": "2024-03-22T18:20:40.957108",
     "exception": false,
     "start_time": "2024-03-22T18:16:21.838873",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "\n",
    "from ml_utility_loss.loss_learning.estimator.pipeline import eval\n",
    "#eval_loss = loss[\"eval_loss\"]\n",
    "\n",
    "batch_size = params[\"batch_size_low\"] if \"batch_size_low\" in params else params[\"batch_size\"]\n",
    "\n",
    "eval_loss = eval(\n",
    "    test_set, model,\n",
    "    batch_size=batch_size,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "187137f6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T18:20:40.994176Z",
     "iopub.status.busy": "2024-03-22T18:20:40.993823Z",
     "iopub.status.idle": "2024-03-22T18:20:41.015411Z",
     "shell.execute_reply": "2024-03-22T18:20:41.014472Z"
    },
    "papermill": {
     "duration": 0.04219,
     "end_time": "2024-03-22T18:20:41.017464",
     "exception": false,
     "start_time": "2024-03-22T18:20:40.975274",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>avg_g_cos_loss</th>\n",
       "      <th>avg_g_mag_loss</th>\n",
       "      <th>avg_loss</th>\n",
       "      <th>grad_duration</th>\n",
       "      <th>grad_mae</th>\n",
       "      <th>grad_mape</th>\n",
       "      <th>grad_rmse</th>\n",
       "      <th>mean_pred_loss</th>\n",
       "      <th>pred_duration</th>\n",
       "      <th>pred_mae</th>\n",
       "      <th>pred_mape</th>\n",
       "      <th>pred_rmse</th>\n",
       "      <th>pred_std</th>\n",
       "      <th>std_loss</th>\n",
       "      <th>total_duration</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>tvae</th>\n",
       "      <td>0.030277</td>\n",
       "      <td>0.045636</td>\n",
       "      <td>0.002767</td>\n",
       "      <td>12.488235</td>\n",
       "      <td>0.021082</td>\n",
       "      <td>0.482545</td>\n",
       "      <td>0.041617</td>\n",
       "      <td>0.000024</td>\n",
       "      <td>4.115197</td>\n",
       "      <td>0.0382</td>\n",
       "      <td>0.125889</td>\n",
       "      <td>0.052604</td>\n",
       "      <td>0.100573</td>\n",
       "      <td>0.008725</td>\n",
       "      <td>16.603431</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      avg_g_cos_loss  avg_g_mag_loss  avg_loss  grad_duration  grad_mae  \\\n",
       "tvae        0.030277        0.045636  0.002767      12.488235  0.021082   \n",
       "\n",
       "      grad_mape  grad_rmse  mean_pred_loss  pred_duration  pred_mae  \\\n",
       "tvae   0.482545   0.041617        0.000024       4.115197    0.0382   \n",
       "\n",
       "      pred_mape  pred_rmse  pred_std  std_loss  total_duration  \n",
       "tvae   0.125889   0.052604  0.100573  0.008725       16.603431  "
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "metrics = pd.DataFrame(eval_loss[\"model_metrics\"]).T\n",
    "metrics.to_csv(\"eval.csv\")\n",
    "metrics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "123d305b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T18:20:41.051948Z",
     "iopub.status.busy": "2024-03-22T18:20:41.051665Z",
     "iopub.status.idle": "2024-03-22T18:20:41.424283Z",
     "shell.execute_reply": "2024-03-22T18:20:41.423284Z"
    },
    "papermill": {
     "duration": 0.392558,
     "end_time": "2024-03-22T18:20:41.426797",
     "exception": false,
     "start_time": "2024-03-22T18:20:41.034239",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "from ml_utility_loss.util import clear_memory\n",
    "clear_memory()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "a3eecc2a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T18:20:41.464627Z",
     "iopub.status.busy": "2024-03-22T18:20:41.464010Z",
     "iopub.status.idle": "2024-03-22T18:25:10.980556Z",
     "shell.execute_reply": "2024-03-22T18:25:10.979659Z"
    },
    "papermill": {
     "duration": 269.538205,
     "end_time": "2024-03-22T18:25:10.983174",
     "exception": false,
     "start_time": "2024-03-22T18:20:41.444969",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Caching in ../../../../contraceptive/_cache_aug_test/tvae/all inf False\n",
      "Caching in ../../../../contraceptive/_cache_bs_test/tvae/all inf False\n",
      "Caching in ../../../../contraceptive/_cache_synth_test/tvae/all inf False\n"
     ]
    }
   ],
   "source": [
    "#\"\"\"\n",
    "from ml_utility_loss.loss_learning.estimator.process import pred, pred_2\n",
    "from ml_utility_loss.util import stack_samples\n",
    "\n",
    "#samples = test_set[list(range(len(test_set)))]\n",
    "#y = {m: pred(model[m], s) for m, s in samples.items()}\n",
    "y = pred_2(model, test_set, batch_size=batch_size)\n",
    "#\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "6ab51db8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T18:25:11.021429Z",
     "iopub.status.busy": "2024-03-22T18:25:11.021082Z",
     "iopub.status.idle": "2024-03-22T18:25:11.048484Z",
     "shell.execute_reply": "2024-03-22T18:25:11.047685Z"
    },
    "papermill": {
     "duration": 0.049077,
     "end_time": "2024-03-22T18:25:11.050646",
     "exception": false,
     "start_time": "2024-03-22T18:25:11.001569",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import os\n",
    "import pandas as pd\n",
    "from ml_utility_loss.util import transpose_dict\n",
    "\n",
    "os.makedirs(\"pred\", exist_ok=True)\n",
    "y2 = transpose_dict(y)\n",
    "for k, v in y2.items():\n",
    "    df = pd.DataFrame(v)\n",
    "    df.to_csv(f\"pred/{k}.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "d81a30f1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T18:25:11.085900Z",
     "iopub.status.busy": "2024-03-22T18:25:11.085593Z",
     "iopub.status.idle": "2024-03-22T18:25:11.091285Z",
     "shell.execute_reply": "2024-03-22T18:25:11.090350Z"
    },
    "papermill": {
     "duration": 0.025923,
     "end_time": "2024-03-22T18:25:11.093469",
     "exception": false,
     "start_time": "2024-03-22T18:25:11.067546",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'tvae': 0.3965440729686192}\n"
     ]
    }
   ],
   "source": [
    "print({k: sum(v[\"pred\"])/len(v[\"pred\"]) for k, v in y.items()})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "3b3ff322",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T18:25:11.130756Z",
     "iopub.status.busy": "2024-03-22T18:25:11.130471Z",
     "iopub.status.idle": "2024-03-22T18:25:11.518772Z",
     "shell.execute_reply": "2024-03-22T18:25:11.517773Z"
    },
    "papermill": {
     "duration": 0.409639,
     "end_time": "2024-03-22T18:25:11.520956",
     "exception": false,
     "start_time": "2024-03-22T18:25:11.111317",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 300x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from ml_utility_loss.loss_learning.visualization import plot_pred_density_2\n",
    "\n",
    "_ = plot_pred_density_2(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "e79e4b0f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T18:25:11.558170Z",
     "iopub.status.busy": "2024-03-22T18:25:11.557829Z",
     "iopub.status.idle": "2024-03-22T18:25:11.910037Z",
     "shell.execute_reply": "2024-03-22T18:25:11.908917Z"
    },
    "papermill": {
     "duration": 0.37333,
     "end_time": "2024-03-22T18:25:11.912313",
     "exception": false,
     "start_time": "2024-03-22T18:25:11.538983",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 300x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from ml_utility_loss.loss_learning.visualization import plot_density_3\n",
    "\n",
    "_ = plot_density_3(y2[\"pred\"], next(iter(y2[\"y\"].values())))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "745adde1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T18:25:11.954190Z",
     "iopub.status.busy": "2024-03-22T18:25:11.953310Z",
     "iopub.status.idle": "2024-03-22T18:25:12.111585Z",
     "shell.execute_reply": "2024-03-22T18:25:12.110496Z"
    },
    "papermill": {
     "duration": 0.182951,
     "end_time": "2024-03-22T18:25:12.114578",
     "exception": false,
     "start_time": "2024-03-22T18:25:11.931627",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 300x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from ml_utility_loss.loss_learning.visualization import plot_box_3\n",
    "\n",
    "_ = plot_box_3(y2[\"pred\"], next(iter(y2[\"y\"].values())))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "eabe1bab",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T18:25:12.154928Z",
     "iopub.status.busy": "2024-03-22T18:25:12.154594Z",
     "iopub.status.idle": "2024-03-22T18:25:12.439272Z",
     "shell.execute_reply": "2024-03-22T18:25:12.438355Z"
    },
    "papermill": {
     "duration": 0.306768,
     "end_time": "2024-03-22T18:25:12.441359",
     "exception": false,
     "start_time": "2024-03-22T18:25:12.134591",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAATAAAAEmCAYAAADldMx1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABUz0lEQVR4nO2dd3hU1daH3zMtDZJQEwKB0KQ3wSB4EZEgKorYQEBKRCyIormIYAEBFa6UGwuCggh6QYpX0WtBJZ8gKIqE3qUGSQEE0pNp5/tjMpOpSWYyk8kk+32eeWDOnHNmzZmc36y99tprSbIsywgEAkEAovC3AQKBQOApQsAEAkHAIgRMIBAELELABAJBwCIETCAQBCxCwAQCQcAiBEwgEAQsQsAEAkHAovK3AVWN0WgkPT2dunXrIkmSv80RCAR2yLJMbm4uMTExKBRl+1i1TsDS09OJjY31txkCgaAczp8/T7Nmzcrcp9YJWN26dQHTxQkPD/ezNQKBwJ6cnBxiY2Mt92pZ1DoBMw8bw8PDhYAJBNWYioR4RBBfIBAELELABAJBwCIETCAQBCy1LgZWEWRZRq/XYzAY/G2KwEsolUpUKpVInalhCAGzQ6vVkpGRQUFBgb9NEXiZ0NBQmjRpgkaj8bcpAi8hBMwKo9HImTNnUCqVxMTEoNFoxC92DUCWZbRaLZcuXeLMmTO0bdu23ARJQWAgBMwKrVaL0WgkNjaW0NBQf5sj8AC9wchfVwuJDFUTGVrqaYWEhKBWqzl37hxarZbg4GA/WinwFuJnyAni1zlwydcayCnS8Xee1uE18b3WPMQ3KqhZlPSokRG9amoDQsAENRLRa6t2IARMUGMYP348o0Y8ACD8r1pCtRCwJUuWEBcXR3BwML1792bXrl0u9121ahWSJNk8REAWbrnlFp599ll/m1FtEB5Y7cDvArZ+/XqSkpKYNWsWe/bsoVu3bgwePJiLFy+6PCY8PJyMjAzL49y5c1VoscCX6HQ6r5xHxMBqB34XsMWLFzNx4kQSExPp2LEjy5YtIzQ0lJUrV7o8RpIkoqOjLY+oqCif2SfLMgVavV8eFW2aPn78eLZt28Zbb71l8UqbNWvG0qVLbfbbu3cvCoXCIviLFy+mS5cuhIWFERsby6RJk8jLy7M5ZseOHfTr14+QkBBiY2N55plnyM/Pr5BdGRkZDBkyhJCQEFq2bMnatWuJi4sjOTnZso8kSSxdupShQ4cSFhbG66+/jsFgYMKECbRs2ZKQkBDatWvHW2+9ZXNug8FAUlISkZGRNGjQgGnTptleL6FftQK/5oFptVpSU1OZMWOGZZtCoSAhIYGdO3e6PC4vL48WLVpgNBq5/vrreeONN+jUqZPTfYuLiykuLrY8z8nJccvGQp2BjjO/d+sYb3FkzmBCNeV/RW+99RYnTpygc+fOzJkzB4BFixaxdu1annzySct+a9as4aabbqJFixaA6Vq//fbbtGzZktOnTzNp0iSmTZvGe++9B8CpU6e4/fbbee2111i5ciWXLl1i8uTJTJ48mY8++qhcu8aOHcvly5fZunUrarWapKQkp571q6++yvz580lOTkalUmE0GmnWrBkbN26kQYMG/Prrrzz22GM0adKE4cOHWz7fqlWrWLlyJR06dGDRokV88cUX9Ot/CyD0q7bgVwG7fPkyBoPBwYOKiori2LFjTo9p164dK1eupGvXrmRnZ7Nw4UL69u3L4cOHnVZvnDdvHrNnz/aJ/dWFiIgINBoNoaGhREdHAzB69GgWLVpEWloazZs3x2g0sm7dOl5++WXLcdYxs7i4OF577TWeeOIJi4DNmzeP0aNHW/Zr27Ytb7/9Nv3792fp0qVlxh6PHTvGli1b+OOPP+jVqxcAK1asoG3btg77jho1isTERJtt1t9Zy5Yt2blzJxs2bLAIWHJyMjNmzOC+++4DYNmyZXz/fekPjYiB1Q4CLhO/T58+9OnTx/K8b9++dOjQgffff5+5c+c67D9jxgySkpIsz83VHitKiFrJkTmDK2e0h4SolR4f2717dzp06MDatWuZPn0627Zt4+LFizz44IOWfbZs2cK8efM4duwYOTk56PV6ioqKKCgoIDQ0lP3793PgwAHWrFljOUaWZcuSqw4dOrh8/+PHj6NSqbj++ust29q0aUO9evUc9jULnDVLlixh5cqVpKWlUVhYiFarpXv37gBkZ2eTkZFB7969LfurVCp69eqFVm9agC9iYLUDvwpYw4YNUSqVZGVl2WzPysqyeBLloVar6dGjBydPnnT6elBQEEFBQR7bKElShYZx1ZHRo0dbBGzt2rXcfvvtNGjQAICzZ89y11138eSTT/L6669Tv359duzYwYQJE9BqtYSGhpKXl8fjjz/OM88843Du5s2b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",
      "text/plain": [
       "<Figure size 300x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#\"\"\"\n",
    "from ml_utility_loss.loss_learning.visualization import plot_grad, plot_grad_2, plot_grad_3\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "#plot_grad_2(y, model.models)\n",
    "for m in model.models:\n",
    "    ym = y[m]\n",
    "    fig, ax = plt.subplots()\n",
    "    plot_grad_3(ym[\"error\"], ym[\"grad\"], name=f\"{m}_grad\", fig=fig, ax=ax)\n",
    "#\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "54c0e9f3",
   "metadata": {
    "papermill": {
     "duration": 0.019727,
     "end_time": "2024-03-22T18:25:12.481176",
     "exception": false,
     "start_time": "2024-03-22T18:25:12.461449",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "celltoolbar": "Tags",
  "colab": {
   "authorship_tag": "ABX9TyOOVfelovKP9fLGU7SvvRie",
   "gpuType": "T4",
   "mount_file_id": "17POSGAvge8y9DW9WGs2jLkibaRjToayg",
   "provenance": []
  },
  "kaggle": {
   "accelerator": "gpu",
   "dataSources": [],
   "dockerImageVersionId": 30648,
   "isGpuEnabled": true,
   "isInternetEnabled": true,
   "language": "python",
   "sourceType": "notebook"
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.10.13"
  },
  "papermill": {
   "default_parameters": {},
   "duration": 5438.254231,
   "end_time": "2024-03-22T18:25:15.223561",
   "environment_variables": {},
   "exception": null,
   "input_path": "eval/contraceptive/tvae/42/mlu-eval.ipynb",
   "output_path": "eval/contraceptive/tvae/42/mlu-eval.ipynb",
   "parameters": {
    "allow_same_prediction": true,
    "dataset": "contraceptive",
    "dataset_name": "contraceptive",
    "debug": false,
    "folder": "eval",
    "gp": false,
    "gp_multiply": false,
    "log_wandb": false,
    "param_index": 0,
    "path": "eval/contraceptive/tvae/42",
    "path_prefix": "../../../../",
    "random_seed": 42,
    "single_model": "tvae"
   },
   "start_time": "2024-03-22T16:54:36.969330",
   "version": "2.5.0"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}