File size: 216,230 Bytes
f7a584f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "982e76f5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T18:24:02.940942Z",
     "iopub.status.busy": "2024-03-22T18:24:02.940605Z",
     "iopub.status.idle": "2024-03-22T18:24:02.974127Z",
     "shell.execute_reply": "2024-03-22T18:24:02.973246Z"
    },
    "papermill": {
     "duration": 0.048631,
     "end_time": "2024-03-22T18:24:02.976269",
     "exception": false,
     "start_time": "2024-03-22T18:24:02.927638",
     "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-22T18:24:03.003179Z",
     "iopub.status.busy": "2024-03-22T18:24:03.002821Z",
     "iopub.status.idle": "2024-03-22T18:24:03.009533Z",
     "shell.execute_reply": "2024-03-22T18:24:03.008703Z"
    },
    "papermill": {
     "duration": 0.022249,
     "end_time": "2024-03-22T18:24:03.011518",
     "exception": false,
     "start_time": "2024-03-22T18:24:02.989269",
     "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-22T18:24:03.034982Z",
     "iopub.status.busy": "2024-03-22T18:24:03.034720Z",
     "iopub.status.idle": "2024-03-22T18:24:03.038779Z",
     "shell.execute_reply": "2024-03-22T18:24:03.037972Z"
    },
    "papermill": {
     "duration": 0.018138,
     "end_time": "2024-03-22T18:24:03.040841",
     "exception": false,
     "start_time": "2024-03-22T18:24:03.022703",
     "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-22T18:24:03.064726Z",
     "iopub.status.busy": "2024-03-22T18:24:03.064446Z",
     "iopub.status.idle": "2024-03-22T18:24:03.068482Z",
     "shell.execute_reply": "2024-03-22T18:24:03.067689Z"
    },
    "executionInfo": {
     "elapsed": 678,
     "status": "ok",
     "timestamp": 1696841022168,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "ns5hFcVL2yvs",
    "papermill": {
     "duration": 0.018191,
     "end_time": "2024-03-22T18:24:03.070313",
     "exception": false,
     "start_time": "2024-03-22T18:24:03.052122",
     "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-22T18:24:03.094148Z",
     "iopub.status.busy": "2024-03-22T18:24:03.093890Z",
     "iopub.status.idle": "2024-03-22T18:24:03.099456Z",
     "shell.execute_reply": "2024-03-22T18:24:03.098647Z"
    },
    "papermill": {
     "duration": 0.019665,
     "end_time": "2024-03-22T18:24:03.101336",
     "exception": false,
     "start_time": "2024-03-22T18:24:03.081671",
     "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": "1a5dc951",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T18:24:03.127355Z",
     "iopub.status.busy": "2024-03-22T18:24:03.127077Z",
     "iopub.status.idle": "2024-03-22T18:24:03.131879Z",
     "shell.execute_reply": "2024-03-22T18:24:03.131076Z"
    },
    "papermill": {
     "duration": 0.020354,
     "end_time": "2024-03-22T18:24:03.133762",
     "exception": false,
     "start_time": "2024-03-22T18:24:03.113408",
     "status": "completed"
    },
    "tags": [
     "injected-parameters"
    ]
   },
   "outputs": [],
   "source": [
    "# Parameters\n",
    "dataset = \"contraceptive\"\n",
    "dataset_name = \"contraceptive\"\n",
    "single_model = \"tvae\"\n",
    "gp = True\n",
    "gp_multiply = True\n",
    "random_seed = 1\n",
    "debug = False\n",
    "folder = \"eval\"\n",
    "path_prefix = \"../../../../\"\n",
    "path = \"eval/contraceptive/tvae/1\"\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.011105,
     "end_time": "2024-03-22T18:24:03.156067",
     "exception": false,
     "start_time": "2024-03-22T18:24:03.144962",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "5f45b1d0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T18:24:03.179681Z",
     "iopub.status.busy": "2024-03-22T18:24:03.179174Z",
     "iopub.status.idle": "2024-03-22T18:24:03.188041Z",
     "shell.execute_reply": "2024-03-22T18:24:03.187211Z"
    },
    "executionInfo": {
     "elapsed": 7,
     "status": "ok",
     "timestamp": 1696841022169,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "UdvXYv3c3LXy",
    "papermill": {
     "duration": 0.022732,
     "end_time": "2024-03-22T18:24:03.189956",
     "exception": false,
     "start_time": "2024-03-22T18:24:03.167224",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/kaggle/working\n",
      "/kaggle/working/eval/contraceptive/tvae/1\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-22T18:24:03.213790Z",
     "iopub.status.busy": "2024-03-22T18:24:03.213530Z",
     "iopub.status.idle": "2024-03-22T18:24:05.212106Z",
     "shell.execute_reply": "2024-03-22T18:24:05.211109Z"
    },
    "papermill": {
     "duration": 2.012769,
     "end_time": "2024-03-22T18:24:05.214125",
     "exception": false,
     "start_time": "2024-03-22T18:24:03.201356",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Set seed to <function seed at 0x7cce33b27370>\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-22T18:24:05.242305Z",
     "iopub.status.busy": "2024-03-22T18:24:05.241844Z",
     "iopub.status.idle": "2024-03-22T18:24:05.254590Z",
     "shell.execute_reply": "2024-03-22T18:24:05.253855Z"
    },
    "papermill": {
     "duration": 0.029051,
     "end_time": "2024-03-22T18:24:05.256688",
     "exception": false,
     "start_time": "2024-03-22T18:24:05.227637",
     "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-22T18:24:05.281449Z",
     "iopub.status.busy": "2024-03-22T18:24:05.280934Z",
     "iopub.status.idle": "2024-03-22T18:24:05.288363Z",
     "shell.execute_reply": "2024-03-22T18:24:05.287666Z"
    },
    "executionInfo": {
     "elapsed": 6,
     "status": "ok",
     "timestamp": 1696841022169,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "Vrl2QkoV3o_8",
    "papermill": {
     "duration": 0.021749,
     "end_time": "2024-03-22T18:24:05.290199",
     "exception": false,
     "start_time": "2024-03-22T18:24:05.268450",
     "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-22T18:24:05.314864Z",
     "iopub.status.busy": "2024-03-22T18:24:05.314602Z",
     "iopub.status.idle": "2024-03-22T18:24:05.411455Z",
     "shell.execute_reply": "2024-03-22T18:24:05.410650Z"
    },
    "executionInfo": {
     "elapsed": 6,
     "status": "ok",
     "timestamp": 1696841022169,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "TilUuFk9vqMb",
    "papermill": {
     "duration": 0.111724,
     "end_time": "2024-03-22T18:24:05.413655",
     "exception": false,
     "start_time": "2024-03-22T18:24:05.301931",
     "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-22T18:24:05.441068Z",
     "iopub.status.busy": "2024-03-22T18:24:05.440695Z",
     "iopub.status.idle": "2024-03-22T18:24:10.140482Z",
     "shell.execute_reply": "2024-03-22T18:24:10.139521Z"
    },
    "executionInfo": {
     "elapsed": 3113,
     "status": "ok",
     "timestamp": 1696841025277,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "7Abt8nStvr9Z",
    "papermill": {
     "duration": 4.716252,
     "end_time": "2024-03-22T18:24:10.142843",
     "exception": false,
     "start_time": "2024-03-22T18:24:05.426591",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2024-03-22 18:24:07.693870: 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 18:24:07.693938: 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 18:24:07.695597: 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-22T18:24:10.167560Z",
     "iopub.status.busy": "2024-03-22T18:24:10.167007Z",
     "iopub.status.idle": "2024-03-22T18:24:10.172801Z",
     "shell.execute_reply": "2024-03-22T18:24:10.171934Z"
    },
    "papermill": {
     "duration": 0.020077,
     "end_time": "2024-03-22T18:24:10.174683",
     "exception": false,
     "start_time": "2024-03-22T18:24:10.154606",
     "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-22T18:24:10.201405Z",
     "iopub.status.busy": "2024-03-22T18:24:10.201109Z",
     "iopub.status.idle": "2024-03-22T18:24:19.205995Z",
     "shell.execute_reply": "2024-03-22T18:24:19.204935Z"
    },
    "executionInfo": {
     "elapsed": 20137,
     "status": "ok",
     "timestamp": 1696841045408,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "tbaguWxAvtPi",
    "papermill": {
     "duration": 9.021688,
     "end_time": "2024-03-22T18:24:19.208711",
     "exception": false,
     "start_time": "2024-03-22T18:24:10.187023",
     "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"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/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-22T18:24:19.237135Z",
     "iopub.status.busy": "2024-03-22T18:24:19.236780Z",
     "iopub.status.idle": "2024-03-22T18:24:19.243528Z",
     "shell.execute_reply": "2024-03-22T18:24:19.242662Z"
    },
    "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.023498,
     "end_time": "2024-03-22T18:24:19.245747",
     "exception": false,
     "start_time": "2024-03-22T18:24:19.222249",
     "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-22T18:24:19.271717Z",
     "iopub.status.busy": "2024-03-22T18:24:19.271449Z",
     "iopub.status.idle": "2024-03-22T18:24:19.276110Z",
     "shell.execute_reply": "2024-03-22T18:24:19.275293Z"
    },
    "papermill": {
     "duration": 0.019869,
     "end_time": "2024-03-22T18:24:19.277993",
     "exception": false,
     "start_time": "2024-03-22T18:24:19.258124",
     "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-22T18:24:19.302520Z",
     "iopub.status.busy": "2024-03-22T18:24:19.302224Z",
     "iopub.status.idle": "2024-03-22T18:24:19.869747Z",
     "shell.execute_reply": "2024-03-22T18:24:19.868753Z"
    },
    "papermill": {
     "duration": 0.582657,
     "end_time": "2024-03-22T18:24:19.872198",
     "exception": false,
     "start_time": "2024-03-22T18:24:19.289541",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Caching in ../../../../contraceptive/_cache_aug_test/tvae/all inf False\n",
      "../../../../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",
      "../../../../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-22T18:24:19.901865Z",
     "iopub.status.busy": "2024-03-22T18:24:19.901564Z",
     "iopub.status.idle": "2024-03-22T18:24:20.224677Z",
     "shell.execute_reply": "2024-03-22T18:24:20.223796Z"
    },
    "executionInfo": {
     "elapsed": 588,
     "status": "ok",
     "timestamp": 1696841049215,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "NgahtU1q9uLO",
    "papermill": {
     "duration": 0.340084,
     "end_time": "2024-03-22T18:24:20.226791",
     "exception": false,
     "start_time": "2024-03-22T18:24:19.886707",
     "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': True,\n",
       "  'forward_once': 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': True,\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-22T18:24:20.254943Z",
     "iopub.status.busy": "2024-03-22T18:24:20.254652Z",
     "iopub.status.idle": "2024-03-22T18:24:20.363030Z",
     "shell.execute_reply": "2024-03-22T18:24:20.362116Z"
    },
    "papermill": {
     "duration": 0.125241,
     "end_time": "2024-03-22T18:24:20.365312",
     "exception": false,
     "start_time": "2024-03-22T18:24:20.240071",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Caching in ../../../../contraceptive/_cache_aug_train/tvae/all inf False\n",
      "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",
      "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",
      "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",
      "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",
      "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-22T18:24:20.395222Z",
     "iopub.status.busy": "2024-03-22T18:24:20.394907Z",
     "iopub.status.idle": "2024-03-22T18:24:20.850984Z",
     "shell.execute_reply": "2024-03-22T18:24:20.850027Z"
    },
    "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.472973,
     "end_time": "2024-03-22T18:24:20.853026",
     "exception": false,
     "start_time": "2024-03-22T18:24:20.380053",
     "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-22T18:24:20.883359Z",
     "iopub.status.busy": "2024-03-22T18:24:20.883030Z",
     "iopub.status.idle": "2024-03-22T18:24:20.887066Z",
     "shell.execute_reply": "2024-03-22T18:24:20.886243Z"
    },
    "papermill": {
     "duration": 0.022094,
     "end_time": "2024-03-22T18:24:20.889070",
     "exception": false,
     "start_time": "2024-03-22T18:24:20.866976",
     "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-22T18:24:20.915312Z",
     "iopub.status.busy": "2024-03-22T18:24:20.915025Z",
     "iopub.status.idle": "2024-03-22T18:24:20.921808Z",
     "shell.execute_reply": "2024-03-22T18:24:20.921016Z"
    },
    "papermill": {
     "duration": 0.022203,
     "end_time": "2024-03-22T18:24:20.923743",
     "exception": false,
     "start_time": "2024-03-22T18:24:20.901540",
     "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-22T18:24:20.950779Z",
     "iopub.status.busy": "2024-03-22T18:24:20.950516Z",
     "iopub.status.idle": "2024-03-22T18:24:21.031109Z",
     "shell.execute_reply": "2024-03-22T18:24:21.030301Z"
    },
    "papermill": {
     "duration": 0.096946,
     "end_time": "2024-03-22T18:24:21.033405",
     "exception": false,
     "start_time": "2024-03-22T18:24:20.936459",
     "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-22T18:24:21.065187Z",
     "iopub.status.busy": "2024-03-22T18:24:21.064897Z",
     "iopub.status.idle": "2024-03-22T19:31:29.310852Z",
     "shell.execute_reply": "2024-03-22T19:31:29.309758Z"
    },
    "papermill": {
     "duration": 4028.279722,
     "end_time": "2024-03-22T19:31:29.328132",
     "exception": false,
     "start_time": "2024-03-22T18:24:21.048410",
     "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.02038899842772581, 'avg_role_model_std_loss': 0.7097008107104881, 'avg_role_model_mean_pred_loss': 0.0013612247566806238, 'avg_role_model_g_mag_loss': 0.2463153438932366, '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.020629282327491737, 'n_size': 900, 'n_batch': 225, 'duration': 260.0577940940857, 'duration_batch': 1.1558124181959364, 'duration_size': 0.2889531045489841, 'avg_pred_std': 0.1322056857123971}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.013955928831257755, 'avg_role_model_std_loss': 0.32679080615364564, 'avg_role_model_mean_pred_loss': 0.0004168977530578862, '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.013955928831257755, 'n_size': 450, 'n_batch': 113, 'duration': 87.91127800941467, 'duration_batch': 0.7779759115877405, 'duration_size': 0.19535839557647705, 'avg_pred_std': 0.10100915132964079}\n",
      "Epoch 1\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0060118012685173505, 'avg_role_model_std_loss': 0.5180407320536465, 'avg_role_model_mean_pred_loss': 8.332759030961423e-05, 'avg_role_model_g_mag_loss': 0.06306991064869281, '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.00608574254250723, 'n_size': 900, 'n_batch': 225, 'duration': 260.53746366500854, 'duration_batch': 1.1579442829555935, 'duration_size': 0.28948607073889837, 'avg_pred_std': 0.09532983317143387}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.004431044542773937, 'avg_role_model_std_loss': 4.37402327783609, 'avg_role_model_mean_pred_loss': 5.788037800186684e-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.004431044542773937, 'n_size': 450, 'n_batch': 113, 'duration': 90.43914699554443, 'duration_batch': 0.8003464335888888, 'duration_size': 0.20097588221232096, 'avg_pred_std': 0.04492716361002057}\n",
      "Epoch 2\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.003981401668424951, 'avg_role_model_std_loss': 0.5578023322469762, 'avg_role_model_mean_pred_loss': 3.4067052916835076e-05, 'avg_role_model_g_mag_loss': 0.02774549509638746, '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.004037349244463258, 'n_size': 900, 'n_batch': 225, 'duration': 259.8459405899048, 'duration_batch': 1.1548708470662434, 'duration_size': 0.28871771176656086, 'avg_pred_std': 0.09886109303269121}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.005920900385180074, 'avg_role_model_std_loss': 3.167294240776193, 'avg_role_model_mean_pred_loss': 6.510238445815651e-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.005920900385180074, 'n_size': 450, 'n_batch': 113, 'duration': 88.16130113601685, 'duration_batch': 0.7801885056284676, 'duration_size': 0.19591400252448188, 'avg_pred_std': 0.04382448092585149}\n",
      "Epoch 3\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.003003391056942443, 'avg_role_model_std_loss': 0.5015569428249138, 'avg_role_model_mean_pred_loss': 1.917405674469519e-05, 'avg_role_model_g_mag_loss': 0.019288771962617628, '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.003044349568921866, 'n_size': 900, 'n_batch': 225, 'duration': 258.8182637691498, 'duration_batch': 1.1503033945295547, 'duration_size': 0.28757584863238866, 'avg_pred_std': 0.09951512091689639}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0036749178177625354, 'avg_role_model_std_loss': 5.0160115570675385, 'avg_role_model_mean_pred_loss': 3.591052332840726e-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.0036749178177625354, 'n_size': 450, 'n_batch': 113, 'duration': 88.94795989990234, 'duration_batch': 0.7871500876097552, 'duration_size': 0.1976621331108941, 'avg_pred_std': 0.050722146361439895}\n",
      "Epoch 4\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0026951473932907296, 'avg_role_model_std_loss': 0.46114019461917133, 'avg_role_model_mean_pred_loss': 1.2756809318339692e-05, 'avg_role_model_g_mag_loss': 0.018491813861118214, '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.0027525624157472826, 'n_size': 900, 'n_batch': 225, 'duration': 260.7371289730072, 'duration_batch': 1.1588316843244764, 'duration_size': 0.2897079210811191, 'avg_pred_std': 0.09791627071694367}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0032899318864413846, 'avg_role_model_std_loss': 2.2600422874186443, 'avg_role_model_mean_pred_loss': 1.737884139242202e-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.0032899318864413846, 'n_size': 450, 'n_batch': 113, 'duration': 89.44571375846863, 'duration_batch': 0.7915549890129967, 'duration_size': 0.19876825279659696, 'avg_pred_std': 0.05520178424967123}\n",
      "Epoch 5\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.002675653763451717, 'avg_role_model_std_loss': 0.38926185907018096, 'avg_role_model_mean_pred_loss': 1.1465693117683688e-05, 'avg_role_model_g_mag_loss': 0.018026919938856734, '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.002713999592718513, 'n_size': 900, 'n_batch': 225, 'duration': 261.18925762176514, 'duration_batch': 1.1608411449856229, 'duration_size': 0.2902102862464057, 'avg_pred_std': 0.10430583260332545}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.00328355419371898, 'avg_role_model_std_loss': 3.905635658147522, 'avg_role_model_mean_pred_loss': 2.2026288097660226e-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.00328355419371898, 'n_size': 450, 'n_batch': 113, 'duration': 89.86624097824097, 'duration_batch': 0.7952764688339908, 'duration_size': 0.19970275772942436, 'avg_pred_std': 0.047640036822469756}\n",
      "Epoch 6\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.002428213983172706, 'avg_role_model_std_loss': 0.4563769066303573, 'avg_role_model_mean_pred_loss': 1.070831390430716e-05, 'avg_role_model_g_mag_loss': 0.01809621533375725, '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.0024591475264686678, 'n_size': 900, 'n_batch': 225, 'duration': 262.2440469264984, 'duration_batch': 1.1655290974511041, 'duration_size': 0.29138227436277603, 'avg_pred_std': 0.10204424848676556}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.003275549128625749, 'avg_role_model_std_loss': 3.9855575082005594, 'avg_role_model_mean_pred_loss': 1.929245272713863e-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.003275549128625749, 'n_size': 450, 'n_batch': 113, 'duration': 90.92798852920532, 'duration_batch': 0.8046724648602241, 'duration_size': 0.2020621967315674, 'avg_pred_std': 0.04646150635676953}\n",
      "Epoch 7\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0023822973380447365, 'avg_role_model_std_loss': 0.44478256372083136, 'avg_role_model_mean_pred_loss': 9.005847006119572e-06, 'avg_role_model_g_mag_loss': 0.01762347323496619, '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.002411980113861824, 'n_size': 900, 'n_batch': 225, 'duration': 263.1176962852478, 'duration_batch': 1.1694119834899903, 'duration_size': 0.2923529958724976, 'avg_pred_std': 0.10207737949159411}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0031462487001489435, 'avg_role_model_std_loss': 3.1703384120910294, 'avg_role_model_mean_pred_loss': 2.179660826174649e-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.0031462487001489435, 'n_size': 450, 'n_batch': 113, 'duration': 88.3796284198761, 'duration_batch': 0.7821206054856292, 'duration_size': 0.19639917426639134, 'avg_pred_std': 0.047558308290564906}\n",
      "Epoch 8\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0021461909939373275, 'avg_role_model_std_loss': 0.3496849273867641, 'avg_role_model_mean_pred_loss': 8.150395166715502e-06, 'avg_role_model_g_mag_loss': 0.016793633546072266, '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.0021742351456487084, 'n_size': 900, 'n_batch': 225, 'duration': 264.955197095871, 'duration_batch': 1.1775786537594266, 'duration_size': 0.29439466343985665, 'avg_pred_std': 0.10324391664730179}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.00289536593284639, 'avg_role_model_std_loss': 3.853903681079736, 'avg_role_model_mean_pred_loss': 2.701310116102227e-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.00289536593284639, 'n_size': 450, 'n_batch': 113, 'duration': 92.01904273033142, 'duration_batch': 0.8143278117728444, 'duration_size': 0.2044867616229587, 'avg_pred_std': 0.05265144564250517}\n",
      "Epoch 9\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.002258309722690481, 'avg_role_model_std_loss': 0.5195468653853743, 'avg_role_model_mean_pred_loss': 7.549715697529972e-06, 'avg_role_model_g_mag_loss': 0.019823850064721128, '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.0022869745167554355, 'n_size': 900, 'n_batch': 225, 'duration': 265.574116230011, 'duration_batch': 1.1803294054667155, 'duration_size': 0.2950823513666789, 'avg_pred_std': 0.10302899842564431}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0032758567545291347, 'avg_role_model_std_loss': 1.3863763298404954, 'avg_role_model_mean_pred_loss': 4.0907979645609235e-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.0032758567545291347, 'n_size': 450, 'n_batch': 113, 'duration': 89.21779704093933, 'duration_batch': 0.7895380269109675, 'duration_size': 0.1982617712020874, 'avg_pred_std': 0.0622333479762918}\n",
      "Epoch 10\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0021910814406065683, 'avg_role_model_std_loss': 0.2070099846257626, 'avg_role_model_mean_pred_loss': 8.39444046341834e-06, 'avg_role_model_g_mag_loss': 0.017909487343212176, '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.002219982292638936, 'n_size': 900, 'n_batch': 225, 'duration': 260.76630783081055, 'duration_batch': 1.1589613681369357, 'duration_size': 0.28974034203423393, 'avg_pred_std': 0.10706099790003565}\n",
      "Time out: 3783.828666448593/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.0026995842230168082, 'avg_g_mag_loss': 0.019575848251313577, 'avg_g_cos_loss': 0.035776930846345964, 'pred_duration': 4.142037391662598, 'grad_duration': 12.572051525115967, 'total_duration': 16.714088916778564, 'pred_std': 0.0932064801454544, 'std_loss': 0.02437058463692665, 'mean_pred_loss': 4.6931305405450985e-05, 'pred_rmse': 0.051957521587610245, 'pred_mae': 0.037075866013765335, 'pred_mape': 0.11939958482980728, 'grad_rmse': 0.033828798681497574, 'grad_mae': 0.01925434172153473, 'grad_mape': 0.510366678237915}, '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.0026995842230168082, 'avg_g_mag_loss': 0.019575848251313577, 'avg_g_cos_loss': 0.035776930846345964, 'avg_pred_duration': 4.142037391662598, 'avg_grad_duration': 12.572051525115967, 'avg_total_duration': 16.714088916778564, 'avg_pred_std': 0.0932064801454544, 'avg_std_loss': 0.02437058463692665, 'avg_mean_pred_loss': 4.6931305405450985e-05}, 'min_metrics': {'avg_loss': 0.0026995842230168082, 'avg_g_mag_loss': 0.019575848251313577, 'avg_g_cos_loss': 0.035776930846345964, 'pred_duration': 4.142037391662598, 'grad_duration': 12.572051525115967, 'total_duration': 16.714088916778564, 'pred_std': 0.0932064801454544, 'std_loss': 0.02437058463692665, 'mean_pred_loss': 4.6931305405450985e-05, 'pred_rmse': 0.051957521587610245, 'pred_mae': 0.037075866013765335, 'pred_mape': 0.11939958482980728, 'grad_rmse': 0.033828798681497574, 'grad_mae': 0.01925434172153473, 'grad_mape': 0.510366678237915}, 'model_metrics': {'tvae': {'avg_loss': 0.0026995842230168082, 'avg_g_mag_loss': 0.019575848251313577, 'avg_g_cos_loss': 0.035776930846345964, 'pred_duration': 4.142037391662598, 'grad_duration': 12.572051525115967, 'total_duration': 16.714088916778564, 'pred_std': 0.0932064801454544, 'std_loss': 0.02437058463692665, 'mean_pred_loss': 4.6931305405450985e-05, 'pred_rmse': 0.051957521587610245, 'pred_mae': 0.037075866013765335, 'pred_mape': 0.11939958482980728, 'grad_rmse': 0.033828798681497574, 'grad_mae': 0.01925434172153473, 'grad_mape': 0.510366678237915}}}\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-22T19:31:29.361660Z",
     "iopub.status.busy": "2024-03-22T19:31:29.361330Z",
     "iopub.status.idle": "2024-03-22T19:31:29.365755Z",
     "shell.execute_reply": "2024-03-22T19:31:29.364986Z"
    },
    "papermill": {
     "duration": 0.023195,
     "end_time": "2024-03-22T19:31:29.367546",
     "exception": false,
     "start_time": "2024-03-22T19:31:29.344351",
     "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-22T19:31:29.398613Z",
     "iopub.status.busy": "2024-03-22T19:31:29.398328Z",
     "iopub.status.idle": "2024-03-22T19:31:29.489852Z",
     "shell.execute_reply": "2024-03-22T19:31:29.488974Z"
    },
    "papermill": {
     "duration": 0.110023,
     "end_time": "2024-03-22T19:31:29.492433",
     "exception": false,
     "start_time": "2024-03-22T19:31:29.382410",
     "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-22T19:31:29.529036Z",
     "iopub.status.busy": "2024-03-22T19:31:29.528298Z",
     "iopub.status.idle": "2024-03-22T19:31:29.800678Z",
     "shell.execute_reply": "2024-03-22T19:31:29.799685Z"
    },
    "papermill": {
     "duration": 0.292892,
     "end_time": "2024-03-22T19:31:29.802904",
     "exception": false,
     "start_time": "2024-03-22T19:31:29.510012",
     "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-22T19:31:29.838480Z",
     "iopub.status.busy": "2024-03-22T19:31:29.837985Z",
     "iopub.status.idle": "2024-03-22T19:35:32.709073Z",
     "shell.execute_reply": "2024-03-22T19:35:32.708051Z"
    },
    "papermill": {
     "duration": 242.891902,
     "end_time": "2024-03-22T19:35:32.711706",
     "exception": false,
     "start_time": "2024-03-22T19:31:29.819804",
     "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-22T19:35:32.748889Z",
     "iopub.status.busy": "2024-03-22T19:35:32.748580Z",
     "iopub.status.idle": "2024-03-22T19:35:32.770477Z",
     "shell.execute_reply": "2024-03-22T19:35:32.769593Z"
    },
    "papermill": {
     "duration": 0.04302,
     "end_time": "2024-03-22T19:35:32.772721",
     "exception": false,
     "start_time": "2024-03-22T19:35:32.729701",
     "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.029584</td>\n",
       "      <td>0.028765</td>\n",
       "      <td>0.0027</td>\n",
       "      <td>12.484405</td>\n",
       "      <td>0.019254</td>\n",
       "      <td>0.510366</td>\n",
       "      <td>0.033829</td>\n",
       "      <td>0.000047</td>\n",
       "      <td>4.136843</td>\n",
       "      <td>0.037076</td>\n",
       "      <td>0.1194</td>\n",
       "      <td>0.051958</td>\n",
       "      <td>0.093206</td>\n",
       "      <td>0.024371</td>\n",
       "      <td>16.621248</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.029584        0.028765    0.0027      12.484405  0.019254   \n",
       "\n",
       "      grad_mape  grad_rmse  mean_pred_loss  pred_duration  pred_mae  \\\n",
       "tvae   0.510366   0.033829        0.000047       4.136843  0.037076   \n",
       "\n",
       "      pred_mape  pred_rmse  pred_std  std_loss  total_duration  \n",
       "tvae     0.1194   0.051958  0.093206  0.024371       16.621248  "
      ]
     },
     "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-22T19:35:32.808159Z",
     "iopub.status.busy": "2024-03-22T19:35:32.807431Z",
     "iopub.status.idle": "2024-03-22T19:35:33.154322Z",
     "shell.execute_reply": "2024-03-22T19:35:33.153206Z"
    },
    "papermill": {
     "duration": 0.365867,
     "end_time": "2024-03-22T19:35:33.156318",
     "exception": false,
     "start_time": "2024-03-22T19:35:32.790451",
     "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-22T19:35:33.192853Z",
     "iopub.status.busy": "2024-03-22T19:35:33.192556Z",
     "iopub.status.idle": "2024-03-22T19:39:46.938700Z",
     "shell.execute_reply": "2024-03-22T19:39:46.937596Z"
    },
    "papermill": {
     "duration": 253.767885,
     "end_time": "2024-03-22T19:39:46.941488",
     "exception": false,
     "start_time": "2024-03-22T19:35:33.173603",
     "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-22T19:39:46.979157Z",
     "iopub.status.busy": "2024-03-22T19:39:46.978304Z",
     "iopub.status.idle": "2024-03-22T19:39:47.004942Z",
     "shell.execute_reply": "2024-03-22T19:39:47.004246Z"
    },
    "papermill": {
     "duration": 0.047363,
     "end_time": "2024-03-22T19:39:47.006828",
     "exception": false,
     "start_time": "2024-03-22T19:39:46.959465",
     "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-22T19:39:47.039712Z",
     "iopub.status.busy": "2024-03-22T19:39:47.039439Z",
     "iopub.status.idle": "2024-03-22T19:39:47.044859Z",
     "shell.execute_reply": "2024-03-22T19:39:47.043967Z"
    },
    "papermill": {
     "duration": 0.02409,
     "end_time": "2024-03-22T19:39:47.046909",
     "exception": false,
     "start_time": "2024-03-22T19:39:47.022819",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'tvae': 0.383920996813547}\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-22T19:39:47.081866Z",
     "iopub.status.busy": "2024-03-22T19:39:47.081333Z",
     "iopub.status.idle": "2024-03-22T19:39:47.474641Z",
     "shell.execute_reply": "2024-03-22T19:39:47.473717Z"
    },
    "papermill": {
     "duration": 0.413249,
     "end_time": "2024-03-22T19:39:47.476838",
     "exception": false,
     "start_time": "2024-03-22T19:39:47.063589",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAASIAAAE8CAYAAABkYrxdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABAQElEQVR4nO3deXxTZb4/8M/JvjRL9720lLKDgFAFRFAYRVBhnFF4uVER9M7AdZTLvJS5P2HQccAZFxzH4c54pcBVwdFBnavjwkURRWXfl7J13/c0TZvtPL8/TpMS2rRJmuS06ff9evWV9JwnyXOa5ptnfzjGGAMhhIhIInYGCCGEAhEhRHQUiAghoqNARAgRHQUiQojoKBARQkRHgYgQIjoKRIQQ0VEgIoSIjgIRIUR0FIhIUH3//ff47W9/i6amJrGzQgYQCkQkqL7//nusX7+eAhHxCwUiQojoKBCRoPntb3+LX//61wCArKwscBwHjuMQFRWFW265pUt6nueRmpqKn//85+5jL730EqZNm4bY2Fio1Wpcf/31+OCDD7p9vbfffhvXX3891Go1YmJisHjxYpSWlobm4khIcbQMCAmWkydPYuPGjdixYwdeffVVxMXFAQAuX76M5557DuXl5UhKSnKn37dvH2bOnIn333/fHYzS09Nx9913Y/To0bDZbNi5cycOHjyITz75BPPnz3c/9oUXXsCzzz6L++67DzNnzkRtbS1ef/11REVF4dixYzAajWG9dtJHjJAg+uMf/8gAsMLCQvexgoICBoC9/vrrHml/+ctfsqioKGaxWNzHrr7PGGM2m42NHTuW3Xrrre5jRUVFTCqVshdeeMEj7alTp5hMJutynPR/VDUjITd8+HBMmDAB7733nvuY0+nEBx98gLvuugtqtdp9/Or7jY2NaG5uxowZM3D06FH38V27doHnedx3332oq6tz/yQlJSEnJwdff/11eC6MBI1M7AyQwWHRokX4zW9+g/LycqSmpmLv3r2oqanBokWLPNJ98skn+N3vfofjx4/DarW6j3Mc575/8eJFMMaQk5PT7WvJ5fLQXAQJGQpEJCwWLVqENWvW4P3338eTTz6Jv//97zAYDJg7d647zbfffou7774bN998M/7yl78gOTkZcrkc+fn5ePfdd93peJ4Hx3H47LPPIJVKu7xWVFRUWK6JBA8FIhJUV5dc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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-22T19:39:47.511883Z",
     "iopub.status.busy": "2024-03-22T19:39:47.511612Z",
     "iopub.status.idle": "2024-03-22T19:39:47.873180Z",
     "shell.execute_reply": "2024-03-22T19:39:47.872271Z"
    },
    "papermill": {
     "duration": 0.381365,
     "end_time": "2024-03-22T19:39:47.875111",
     "exception": false,
     "start_time": "2024-03-22T19:39:47.493746",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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bbf50peUlKCmpsYvjcFgwJQpU7p9zmgI59quZrVa4XK5kJTkvzfN3r17kZaWhpEjR+KJJ55AY2NjRPMejHCvz2KxID8/H7m5uZg3bx5Onz7tOxdP792f/vQn3H///dBq/fcpi+V7R4EoSD3tSltTU9PlY2pqanpM770N5TmjIZxru9ozzzyDrKwsvw/E7NmzsXXrVuzZswevvvoq9u3bh9tvvx0eT9c7kEZLONc3cuRIbNy4ER999BHeeecd8DyPadOmobKyEkD8vHfffvstTp06hUcffdTveKzfuwE9+570D6+88gp27NiBvXv3+jXo3n///b7748aNw/jx4zF06FDs3bsXM2fOFCOrQZs6darf3nrTpk3D6NGj8Yc//AEvvfSSiDmLrD/96U8YN24cJk+e7Hc81u8dlYiCFOqutACQkZHRY3rvbSjPGQ3hXJvXa6+9hldeeQWffvopxo8f32PaIUOGICUlBZcuXepznkPRl+vzksvlmDBhgi/v8fDetbW1YceOHXjkkUd6fZ1ov3cUiIIUzq60U6dO9UsPALt37/alLywsREZGhl8as9mMgwcPxnSn23B33P3Vr36Fl156CZ988gkmTZrU6+tUVlaisbERmZmZEcl3sCKxo7DH48HJkyd9eR/o7x0gDC1xOBx48MEHe32dqL93MWsWjwM7duxgSqWSbd68mZ05c4Y99thjzGg0+rp1H3roIfbss8/60u/fv5/JZDL22muvsbNnz7Lnn3++y+57o9HIPvroI3bixAk2b9480bqAQ7m2V155hSkUCvbBBx/4dfG2trYyxhhrbW1lK1euZAcOHGAlJSXsX//6F5s4cSIbPnw4s9vtMb22cK7vhRdeYLt27WLFxcXsyJEj7P7772cqlYqdPn3al2agvnde119/PVuwYEHAcTHeOwpEIXrjjTdYXl4eUygUbPLkyeybb77xnbvpppvYokWL/NK/9957bMSIEUyhULBrrrmGffzxx37neZ5nzz33HEtPT2dKpZLNnDmTnT9/PhaXEiCUa8vPz2cAAn6ef/55xhhjVquV3XrrrSw1NZXJ5XKWn5/Pli5dGjAWJ5ZCub7ly5f70qanp7M5c+awo0eP+j3fQH3vGGPs3LlzDAD79NNPA55LjPeOlgEhhIiO2ogIIaKjQEQIER0FIkKI6CgQEUJER4GIECI6CkSEENFRICKEiI4CERlQNm/eDKPR6Pv9v//7v1FUVOT7ffHixZg/f37M80X6hgIR6ZJ3qdB///d/Dzi3bNkycByHxYsX+6WPdAAoKCjA66+/7ndswYIFuHDhQrePWb9+PTZv3uz7fcaMGVi+fHlE80UijwIR6VZubi527NgBm83mO2a327F9+3bk5eWJkie1Wo20tLRuzxsMBr8SExkYKBCRbk2cOBG5ubnYuXOn79jOnTuRl5eHCRMm9Om5uyqpzJ8/31fKmjFjBsrKyvDTn/7Ut3g7EFg1u1rnktnixYuxb98+rF+/3vccJSUlGDZsGF577TW/xx07dgwcx8V8iRIioEBEevTwww9j06ZNvt83btyIJUuWRP11d+7ciZycHLz44ouorq5GdXV1yM+xfv16TJ06FUuXLvU9R15eXsA1AcCmTZtw4403YtiwYZG6BBICCkSkRw8++CC++uorlJWVoaysDPv37w9q/Zq+SkpKglQqhU6nQ0ZGRliLjRkMBigUCmg0Gt9zSKVSLF68GOfPn/dtueNyubB9+3Y8/PDDkb4MEiRaKpb0KDU1FXPnzsXmzZvBGMPcuXORkpIidrb6JCsrC3PnzsXGjRsxefJk/O1vf4PD4cC9994rdtYGLSoRkV49/PDD2Lx5M7Zs2RKxUoNEIsHVK9C4XK6IPHcwHn30UV9D/KZNm7BgwQJoNJqYvT7xR4GI9Gr27NlwOp1wuVy47bbbIvKcqampfu0+Ho8Hp06d8kujUCj6vGtEd88xZ84caLVabNiwAZ988glVy0RGVTPSK6lUirNnz/rud8dkMuHYsWN+x5KTk5GbmxuQ9pZbbsGKFSvw8ccfY+jQoVi3bh1aWlr80hQUFOCLL77A/fffD6VSGVaVsKCgAAcPHkRpaSkSEhKQlJQEiUTiaytatWoVhg8fHtN1pkkgKhGRoOj1euj1+h7T7N27FxMmTPD7eeGFF7pM+/DDD2PRokX48Y9/jJtuuglDhgzBzTff7JfmxRdfRGlpKYYOHYrU1NSw8r1y5UpIpVKMGTMGqampKC8v95175JFH4HQ6Y9ILSHpGS8WSQevLL7/EzJkzUVFREbBBIYktCkRk0HE4HKivr8eiRYuQkZGBbdu2iZ2lQY+qZmTQeffdd5Gfn4+Wlhb86le/Ejs7BFQiIoT0A1QiIoSIjgIRIUR0FIgIIaKjQEQIER0FIkKI6CgQEUJER4GIECI6CkSEENFRICKEiO7/A9uS0aQenSxWAAAAAElFTkSuQmCC",
      "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-22T19:39:47.912480Z",
     "iopub.status.busy": "2024-03-22T19:39:47.911777Z",
     "iopub.status.idle": "2024-03-22T19:39:48.135371Z",
     "shell.execute_reply": "2024-03-22T19:39:48.134453Z"
    },
    "papermill": {
     "duration": 0.244727,
     "end_time": "2024-03-22T19:39:48.137641",
     "exception": false,
     "start_time": "2024-03-22T19:39:47.892914",
     "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-22T19:39:48.175632Z",
     "iopub.status.busy": "2024-03-22T19:39:48.175312Z",
     "iopub.status.idle": "2024-03-22T19:39:48.479425Z",
     "shell.execute_reply": "2024-03-22T19:39:48.478436Z"
    },
    "papermill": {
     "duration": 0.325609,
     "end_time": "2024-03-22T19:39:48.481640",
     "exception": false,
     "start_time": "2024-03-22T19:39:48.156031",
     "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": [
    "#\"\"\"\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.018928,
     "end_time": "2024-03-22T19:39:48.519433",
     "exception": false,
     "start_time": "2024-03-22T19:39:48.500505",
     "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": 4549.760739,
   "end_time": "2024-03-22T19:39:51.260347",
   "environment_variables": {},
   "exception": null,
   "input_path": "eval/contraceptive/tvae/1/mlu-eval.ipynb",
   "output_path": "eval/contraceptive/tvae/1/mlu-eval.ipynb",
   "parameters": {
    "allow_same_prediction": true,
    "dataset": "contraceptive",
    "dataset_name": "contraceptive",
    "debug": false,
    "folder": "eval",
    "gp": true,
    "gp_multiply": true,
    "log_wandb": false,
    "param_index": 0,
    "path": "eval/contraceptive/tvae/1",
    "path_prefix": "../../../../",
    "random_seed": 1,
    "single_model": "tvae"
   },
   "start_time": "2024-03-22T18:24:01.499608",
   "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
}