File size: 211,729 Bytes
83586b8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "982e76f5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T19:36:59.926982Z",
     "iopub.status.busy": "2024-03-22T19:36:59.926612Z",
     "iopub.status.idle": "2024-03-22T19:36:59.959766Z",
     "shell.execute_reply": "2024-03-22T19:36:59.959082Z"
    },
    "papermill": {
     "duration": 0.048315,
     "end_time": "2024-03-22T19:36:59.961821",
     "exception": false,
     "start_time": "2024-03-22T19:36:59.913506",
     "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-22T19:36:59.986986Z",
     "iopub.status.busy": "2024-03-22T19:36:59.986611Z",
     "iopub.status.idle": "2024-03-22T19:36:59.993605Z",
     "shell.execute_reply": "2024-03-22T19:36:59.992766Z"
    },
    "papermill": {
     "duration": 0.021906,
     "end_time": "2024-03-22T19:36:59.995635",
     "exception": false,
     "start_time": "2024-03-22T19:36:59.973729",
     "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-22T19:37:00.019438Z",
     "iopub.status.busy": "2024-03-22T19:37:00.018936Z",
     "iopub.status.idle": "2024-03-22T19:37:00.022856Z",
     "shell.execute_reply": "2024-03-22T19:37:00.021963Z"
    },
    "papermill": {
     "duration": 0.018194,
     "end_time": "2024-03-22T19:37:00.024950",
     "exception": false,
     "start_time": "2024-03-22T19:37:00.006756",
     "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-22T19:37:00.048617Z",
     "iopub.status.busy": "2024-03-22T19:37:00.048315Z",
     "iopub.status.idle": "2024-03-22T19:37:00.052533Z",
     "shell.execute_reply": "2024-03-22T19:37:00.051690Z"
    },
    "executionInfo": {
     "elapsed": 678,
     "status": "ok",
     "timestamp": 1696841022168,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "ns5hFcVL2yvs",
    "papermill": {
     "duration": 0.018212,
     "end_time": "2024-03-22T19:37:00.054427",
     "exception": false,
     "start_time": "2024-03-22T19:37:00.036215",
     "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-22T19:37:00.077831Z",
     "iopub.status.busy": "2024-03-22T19:37:00.077295Z",
     "iopub.status.idle": "2024-03-22T19:37:00.082918Z",
     "shell.execute_reply": "2024-03-22T19:37:00.082045Z"
    },
    "papermill": {
     "duration": 0.019446,
     "end_time": "2024-03-22T19:37:00.084750",
     "exception": false,
     "start_time": "2024-03-22T19:37:00.065304",
     "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": "f4f0a115",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T19:37:00.111051Z",
     "iopub.status.busy": "2024-03-22T19:37:00.110431Z",
     "iopub.status.idle": "2024-03-22T19:37:00.115765Z",
     "shell.execute_reply": "2024-03-22T19:37:00.114973Z"
    },
    "papermill": {
     "duration": 0.020918,
     "end_time": "2024-03-22T19:37:00.117637",
     "exception": false,
     "start_time": "2024-03-22T19:37:00.096719",
     "status": "completed"
    },
    "tags": [
     "injected-parameters"
    ]
   },
   "outputs": [],
   "source": [
    "# Parameters\n",
    "dataset = \"contraceptive\"\n",
    "dataset_name = \"contraceptive\"\n",
    "single_model = \"lct_gan\"\n",
    "gp = False\n",
    "gp_multiply = False\n",
    "random_seed = 1\n",
    "debug = False\n",
    "folder = \"eval\"\n",
    "path_prefix = \"../../../../\"\n",
    "path = \"eval/contraceptive/lct_gan/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.010803,
     "end_time": "2024-03-22T19:37:00.139438",
     "exception": false,
     "start_time": "2024-03-22T19:37:00.128635",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "5f45b1d0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T19:37:00.162833Z",
     "iopub.status.busy": "2024-03-22T19:37:00.162271Z",
     "iopub.status.idle": "2024-03-22T19:37:00.171358Z",
     "shell.execute_reply": "2024-03-22T19:37:00.170598Z"
    },
    "executionInfo": {
     "elapsed": 7,
     "status": "ok",
     "timestamp": 1696841022169,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "UdvXYv3c3LXy",
    "papermill": {
     "duration": 0.022705,
     "end_time": "2024-03-22T19:37:00.173192",
     "exception": false,
     "start_time": "2024-03-22T19:37:00.150487",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/kaggle/working\n",
      "/kaggle/working/eval/contraceptive/lct_gan/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-22T19:37:00.196567Z",
     "iopub.status.busy": "2024-03-22T19:37:00.196330Z",
     "iopub.status.idle": "2024-03-22T19:37:02.274147Z",
     "shell.execute_reply": "2024-03-22T19:37:02.273085Z"
    },
    "papermill": {
     "duration": 2.091878,
     "end_time": "2024-03-22T19:37:02.276201",
     "exception": false,
     "start_time": "2024-03-22T19:37:00.184323",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Set seed to <function seed at 0x78a890c5f370>\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-22T19:37:02.303841Z",
     "iopub.status.busy": "2024-03-22T19:37:02.303357Z",
     "iopub.status.idle": "2024-03-22T19:37:02.316110Z",
     "shell.execute_reply": "2024-03-22T19:37:02.315206Z"
    },
    "papermill": {
     "duration": 0.02929,
     "end_time": "2024-03-22T19:37:02.318006",
     "exception": false,
     "start_time": "2024-03-22T19:37:02.288716",
     "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-22T19:37:02.342193Z",
     "iopub.status.busy": "2024-03-22T19:37:02.341909Z",
     "iopub.status.idle": "2024-03-22T19:37:02.349491Z",
     "shell.execute_reply": "2024-03-22T19:37:02.348614Z"
    },
    "executionInfo": {
     "elapsed": 6,
     "status": "ok",
     "timestamp": 1696841022169,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "Vrl2QkoV3o_8",
    "papermill": {
     "duration": 0.021752,
     "end_time": "2024-03-22T19:37:02.351453",
     "exception": false,
     "start_time": "2024-03-22T19:37:02.329701",
     "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-22T19:37:02.375787Z",
     "iopub.status.busy": "2024-03-22T19:37:02.375495Z",
     "iopub.status.idle": "2024-03-22T19:37:02.474933Z",
     "shell.execute_reply": "2024-03-22T19:37:02.474086Z"
    },
    "executionInfo": {
     "elapsed": 6,
     "status": "ok",
     "timestamp": 1696841022169,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "TilUuFk9vqMb",
    "papermill": {
     "duration": 0.114926,
     "end_time": "2024-03-22T19:37:02.477611",
     "exception": false,
     "start_time": "2024-03-22T19:37:02.362685",
     "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-22T19:37:02.504711Z",
     "iopub.status.busy": "2024-03-22T19:37:02.504080Z",
     "iopub.status.idle": "2024-03-22T19:37:07.156105Z",
     "shell.execute_reply": "2024-03-22T19:37:07.155324Z"
    },
    "executionInfo": {
     "elapsed": 3113,
     "status": "ok",
     "timestamp": 1696841025277,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "7Abt8nStvr9Z",
    "papermill": {
     "duration": 4.668007,
     "end_time": "2024-03-22T19:37:07.158408",
     "exception": false,
     "start_time": "2024-03-22T19:37:02.490401",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2024-03-22 19:37:04.751058: 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 19:37:04.751112: 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 19:37:04.752906: 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-22T19:37:07.183123Z",
     "iopub.status.busy": "2024-03-22T19:37:07.182562Z",
     "iopub.status.idle": "2024-03-22T19:37:07.188539Z",
     "shell.execute_reply": "2024-03-22T19:37:07.187524Z"
    },
    "papermill": {
     "duration": 0.020379,
     "end_time": "2024-03-22T19:37:07.190540",
     "exception": false,
     "start_time": "2024-03-22T19:37:07.170161",
     "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-22T19:37:07.215777Z",
     "iopub.status.busy": "2024-03-22T19:37:07.215511Z",
     "iopub.status.idle": "2024-03-22T19:37:15.361034Z",
     "shell.execute_reply": "2024-03-22T19:37:15.359853Z"
    },
    "executionInfo": {
     "elapsed": 20137,
     "status": "ok",
     "timestamp": 1696841045408,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "tbaguWxAvtPi",
    "papermill": {
     "duration": 8.161045,
     "end_time": "2024-03-22T19:37:15.363624",
     "exception": false,
     "start_time": "2024-03-22T19:37:07.202579",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:274: ConvergenceWarning: Initialization 1 did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.\n",
      "  warnings.warn(\n",
      "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:119: ConvergenceWarning: Number of distinct clusters (4) found smaller than n_clusters (10). Possibly due to duplicate points in X.\n",
      "  .fit(X)\n",
      "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:119: ConvergenceWarning: Number of distinct clusters (4) found smaller than n_clusters (10). Possibly due to duplicate points in X.\n",
      "  .fit(X)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:274: ConvergenceWarning: Initialization 1 did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.\n",
      "  warnings.warn(\n",
      "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:119: ConvergenceWarning: Number of distinct clusters (4) found smaller than n_clusters (10). Possibly due to duplicate points in X.\n",
      "  .fit(X)\n"
     ]
    }
   ],
   "source": [
    "from ml_utility_loss.loss_learning.estimator.preprocessing import DataPreprocessor\n",
    "\n",
    "preprocessor = DataPreprocessor(\n",
    "    task,\n",
    "    target=target,\n",
    "    cat_features=cat_features,\n",
    "    mixed_features=mixed_features,\n",
    "    longtail_features=longtail_features,\n",
    "    integer_features=integer_features,\n",
    "    lct_ae_embedding_size=lct_ae_embedding_size,\n",
    "    lct_ae_params=lct_ae_params,\n",
    "    lct_ae=lct_ae,\n",
    "    tab_ddpm_normalization=tab_ddpm_normalization,\n",
    "    tab_ddpm_cat_encoding=tab_ddpm_cat_encoding,\n",
    "    tab_ddpm_y_policy=tab_ddpm_y_policy,\n",
    "    tab_ddpm_is_y_cond=tab_ddpm_is_y_cond,\n",
    "    realtabformer_embedding=rtf_embed,\n",
    "    realtabformer_params=rtf_params,\n",
    ")\n",
    "preprocessor.fit(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "a9c9b110",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2024-03-22T19:37:15.390983Z",
     "iopub.status.busy": "2024-03-22T19:37:15.390664Z",
     "iopub.status.idle": "2024-03-22T19:37:15.397343Z",
     "shell.execute_reply": "2024-03-22T19:37:15.396543Z"
    },
    "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.022416,
     "end_time": "2024-03-22T19:37:15.399240",
     "exception": false,
     "start_time": "2024-03-22T19:37:15.376824",
     "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-22T19:37:15.423691Z",
     "iopub.status.busy": "2024-03-22T19:37:15.423432Z",
     "iopub.status.idle": "2024-03-22T19:37:15.427872Z",
     "shell.execute_reply": "2024-03-22T19:37:15.427059Z"
    },
    "papermill": {
     "duration": 0.018915,
     "end_time": "2024-03-22T19:37:15.429769",
     "exception": false,
     "start_time": "2024-03-22T19:37:15.410854",
     "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-22T19:37:15.454450Z",
     "iopub.status.busy": "2024-03-22T19:37:15.454193Z",
     "iopub.status.idle": "2024-03-22T19:37:15.967529Z",
     "shell.execute_reply": "2024-03-22T19:37:15.966629Z"
    },
    "papermill": {
     "duration": 0.528118,
     "end_time": "2024-03-22T19:37:15.969855",
     "exception": false,
     "start_time": "2024-03-22T19:37:15.441737",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Caching in ../../../../contraceptive/_cache_aug_test/lct_gan/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/lct_gan/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/lct_gan/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-22T19:37:15.998281Z",
     "iopub.status.busy": "2024-03-22T19:37:15.997971Z",
     "iopub.status.idle": "2024-03-22T19:37:16.319621Z",
     "shell.execute_reply": "2024-03-22T19:37:16.318764Z"
    },
    "executionInfo": {
     "elapsed": 588,
     "status": "ok",
     "timestamp": 1696841049215,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "NgahtU1q9uLO",
    "papermill": {
     "duration": 0.338255,
     "end_time": "2024-03-22T19:37:16.321610",
     "exception": false,
     "start_time": "2024-03-22T19:37:15.983355",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'Body': 'twin_encoder',\n",
       " 'loss_balancer_meta': True,\n",
       " 'loss_balancer_log': False,\n",
       " 'loss_balancer_lbtw': False,\n",
       " 'pma_skip_small': False,\n",
       " 'isab_skip_small': False,\n",
       " 'layer_norm': False,\n",
       " 'pma_layer_norm': False,\n",
       " 'attn_residual': True,\n",
       " 'tf_n_layers_dec': False,\n",
       " 'tf_isab_rank': 0,\n",
       " 'tf_layer_norm': False,\n",
       " 'tf_pma_start': -1,\n",
       " 'head_n_seeds': 0,\n",
       " 'tf_pma_low': 16,\n",
       " 'dropout': 0,\n",
       " 'combine_mode': 'diff_left',\n",
       " 'tf_isab_mode': 'separate',\n",
       " 'grad_loss_fn': <function torch.nn.functional.l1_loss(input: torch.Tensor, target: torch.Tensor, size_average: Optional[bool] = None, reduce: Optional[bool] = None, reduction: str = 'mean') -> torch.Tensor>,\n",
       " 'single_model': True,\n",
       " 'bias': True,\n",
       " 'bias_final': True,\n",
       " 'pma_ffn_mode': 'none',\n",
       " 'patience': 10,\n",
       " 'inds_init_mode': 'fixnorm',\n",
       " 'grad_clip': 0.73,\n",
       " 'gradient_penalty_mode': {'gradient_penalty': False,\n",
       "  'calc_grad_m': False,\n",
       "  'avg_non_role_model_m': False,\n",
       "  'inverse_avg_non_role_model_m': False},\n",
       " 'synth_data': 2,\n",
       " 'bias_lr_mul': 1.0,\n",
       " 'bias_weight_decay': 0.05,\n",
       " 'head_activation': torch.nn.modules.activation.Softsign,\n",
       " 'loss_balancer_beta': 0.67,\n",
       " 'loss_balancer_r': 0.943,\n",
       " 'tf_activation': torch.nn.modules.activation.Tanh,\n",
       " 'dataset_size': 2048,\n",
       " 'batch_size': 4,\n",
       " 'epochs': 100,\n",
       " 'lr_mul': 0.09,\n",
       " 'n_warmup_steps': 100,\n",
       " 'Optim': functools.partial(<class 'torch.optim.adamw.AdamW'>, amsgrad=True),\n",
       " 'fixed_role_model': 'lct_gan',\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': ['lct_gan'],\n",
       " 'max_seconds': 3600,\n",
       " 'tf_lora': False,\n",
       " 'tf_num_inds': 128,\n",
       " 'ada_n_seeds': 0,\n",
       " 'gradient_penalty_kwargs': {'mag_loss': True,\n",
       "  'mse_mag': False,\n",
       "  'mag_corr': False,\n",
       "  'seq_mag': False,\n",
       "  'cos_loss': False,\n",
       "  'mag_corr_kwargs': {'only_sign': False},\n",
       "  'cos_loss_kwargs': {'only_sign': True, 'cos_matrix': False},\n",
       "  'mse_mag_kwargs': {'target': 0.65, 'multiply': True, 'forgive_over': True}}}"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import ml_utility_loss.loss_learning.estimator.params2 as PARAMS\n",
    "from ml_utility_loss.tuning import map_parameters\n",
    "from ml_utility_loss.loss_learning.estimator.params.default import update_param_space, update_param_space_2\n",
    "import wandb\n",
    "\n",
    "#\"\"\"\n",
    "param_space = {\n",
    "    **getattr(PARAMS, dataset_name).PARAM_SPACE,\n",
    "}\n",
    "params = {\n",
    "    **getattr(PARAMS, dataset_name).BESTS[param_index],\n",
    "}\n",
    "if gp:\n",
    "    params[\"gradient_penalty_mode\"] = \"ALL\"\n",
    "    params[\"mse_mag\"] = True\n",
    "    if gp_multiply:\n",
    "        params[\"mse_mag_multiply\"] = True\n",
    "        #params[\"mse_mag_target\"] = 1.0\n",
    "    else:\n",
    "        params[\"mse_mag_multiply\"] = False\n",
    "        #params[\"mse_mag_target\"] = 0.1\n",
    "else:\n",
    "    params[\"gradient_penalty_mode\"] = \"NONE\"\n",
    "    params[\"mse_mag\"] = False\n",
    "params[\"single_model\"] = False\n",
    "if models:\n",
    "    params[\"models\"] = models\n",
    "if single_model:\n",
    "    params[\"fixed_role_model\"] = single_model\n",
    "    params[\"single_model\"] = True\n",
    "    params[\"models\"] = [single_model]\n",
    "if params[\"fixed_role_model\"] == \"realtabformer\" and dataset_name == \"treatment\":\n",
    "    params[\"batch_size\"] = 2\n",
    "params[\"max_seconds\"] = 3600\n",
    "params[\"patience\"] = 10\n",
    "params[\"epochs\"] = 100\n",
    "if debug:\n",
    "    params[\"epochs\"] = 2\n",
    "with open(\"params.json\", \"w\") as f:\n",
    "    json.dump(params, f)\n",
    "params = map_parameters(params, param_space=param_space)\n",
    "params"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "a48bd9e9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T19:37:16.350046Z",
     "iopub.status.busy": "2024-03-22T19:37:16.349720Z",
     "iopub.status.idle": "2024-03-22T19:37:16.457775Z",
     "shell.execute_reply": "2024-03-22T19:37:16.456979Z"
    },
    "papermill": {
     "duration": 0.125285,
     "end_time": "2024-03-22T19:37:16.460059",
     "exception": false,
     "start_time": "2024-03-22T19:37:16.334774",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Caching in ../../../../contraceptive/_cache_aug_train/lct_gan/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/lct_gan/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/lct_gan/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/lct_gan/all inf False\n",
      "split df ratio is 1\n",
      "../../../../ml-utility-loss/bs_val/contraceptive [0, 50]\n",
      "Caching in ../../../../contraceptive/_cache_synth/lct_gan/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-22T19:37:16.488607Z",
     "iopub.status.busy": "2024-03-22T19:37:16.487899Z",
     "iopub.status.idle": "2024-03-22T19:37:16.945681Z",
     "shell.execute_reply": "2024-03-22T19:37:16.944677Z"
    },
    "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.474366,
     "end_time": "2024-03-22T19:37:16.947922",
     "exception": false,
     "start_time": "2024-03-22T19:37:16.473556",
     "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",
      "['lct_gan'] 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-22T19:37:16.976131Z",
     "iopub.status.busy": "2024-03-22T19:37:16.975778Z",
     "iopub.status.idle": "2024-03-22T19:37:16.979707Z",
     "shell.execute_reply": "2024-03-22T19:37:16.979026Z"
    },
    "papermill": {
     "duration": 0.020246,
     "end_time": "2024-03-22T19:37:16.981682",
     "exception": false,
     "start_time": "2024-03-22T19:37:16.961436",
     "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-22T19:37:17.007348Z",
     "iopub.status.busy": "2024-03-22T19:37:17.007080Z",
     "iopub.status.idle": "2024-03-22T19:37:17.014104Z",
     "shell.execute_reply": "2024-03-22T19:37:17.013253Z"
    },
    "papermill": {
     "duration": 0.021998,
     "end_time": "2024-03-22T19:37:17.015955",
     "exception": false,
     "start_time": "2024-03-22T19:37:16.993957",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "11889160"
      ]
     },
     "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-22T19:37:17.041708Z",
     "iopub.status.busy": "2024-03-22T19:37:17.041437Z",
     "iopub.status.idle": "2024-03-22T19:37:17.120909Z",
     "shell.execute_reply": "2024-03-22T19:37:17.120024Z"
    },
    "papermill": {
     "duration": 0.094727,
     "end_time": "2024-03-22T19:37:17.122862",
     "exception": false,
     "start_time": "2024-03-22T19:37:17.028135",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "========================================================================================================================\n",
       "Layer (type:depth-idx)                                                 Output Shape              Param #\n",
       "========================================================================================================================\n",
       "MLUtilitySingle                                                        [2, 1179, 40]             --\n",
       "├─Adapter: 1-1                                                         [2, 1179, 40]             --\n",
       "│    └─Sequential: 2-1                                                 [2, 1179, 256]            --\n",
       "│    │    └─FeedForward: 3-1                                           [2, 1179, 1024]           --\n",
       "│    │    │    └─Linear: 4-1                                           [2, 1179, 1024]           41,984\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, 40]              (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,889,160\n",
       "Trainable params: 11,889,160\n",
       "Non-trainable params: 0\n",
       "Total mult-adds (M): 44.13\n",
       "========================================================================================================================\n",
       "Input size (MB): 0.47\n",
       "Forward/backward pass size (MB): 375.40\n",
       "Params size (MB): 47.56\n",
       "Estimated Total Size (MB): 423.43\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-22T19:37:17.152093Z",
     "iopub.status.busy": "2024-03-22T19:37:17.151777Z",
     "iopub.status.idle": "2024-03-22T20:44:11.433524Z",
     "shell.execute_reply": "2024-03-22T20:44:11.432528Z"
    },
    "papermill": {
     "duration": 4014.314032,
     "end_time": "2024-03-22T20:44:11.450901",
     "exception": false,
     "start_time": "2024-03-22T19:37:17.136869",
     "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.017055697603565123, 'avg_role_model_std_loss': 0.7837836365105371, 'avg_role_model_mean_pred_loss': 0.000854024517475194, '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.017055697603565123, 'n_size': 900, 'n_batch': 225, 'duration': 209.5561990737915, 'duration_batch': 0.9313608847724066, 'duration_size': 0.23284022119310166, 'avg_pred_std': 0.11550631119145287}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.02723778669618898, 'avg_role_model_std_loss': 0.35535829481002906, 'avg_role_model_mean_pred_loss': 0.0011922009129072346, '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.02723778669618898, 'n_size': 450, 'n_batch': 113, 'duration': 91.00356817245483, 'duration_batch': 0.8053413112606622, 'duration_size': 0.20223015149434406, 'avg_pred_std': 0.12002328037391458}\n",
      "Epoch 1\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.007602974076354359, 'avg_role_model_std_loss': 0.6694789405275434, 'avg_role_model_mean_pred_loss': 0.00012108089975418718, '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.007602974076354359, 'n_size': 900, 'n_batch': 225, 'duration': 209.41460299491882, 'duration_batch': 0.9307315688663059, 'duration_size': 0.23268289221657648, 'avg_pred_std': 0.0941959698839734}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.004413039641092635, 'avg_role_model_std_loss': 0.45001505491487465, 'avg_role_model_mean_pred_loss': 4.256673724010495e-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.004413039641092635, 'n_size': 450, 'n_batch': 113, 'duration': 91.49867558479309, 'duration_batch': 0.8097227927857795, 'duration_size': 0.20333039018842908, 'avg_pred_std': 0.06237377326902563}\n",
      "Epoch 2\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.005956742855616742, 'avg_role_model_std_loss': 0.6394465912903183, 'avg_role_model_mean_pred_loss': 6.889980071151411e-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.005956742855616742, 'n_size': 900, 'n_batch': 225, 'duration': 209.05843949317932, 'duration_batch': 0.9291486199696859, 'duration_size': 0.23228715499242147, 'avg_pred_std': 0.09135436112475064}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.004399605713939915, 'avg_role_model_std_loss': 1.215607570140407, 'avg_role_model_mean_pred_loss': 2.922537710473547e-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.004399605713939915, 'n_size': 450, 'n_batch': 113, 'duration': 88.99790143966675, 'duration_batch': 0.7875920481386438, 'duration_size': 0.19777311431037056, 'avg_pred_std': 0.04754088749589844}\n",
      "Epoch 3\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.005293925739824772, 'avg_role_model_std_loss': 0.6930031799355281, 'avg_role_model_mean_pred_loss': 5.091876555952298e-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.005293925739824772, 'n_size': 900, 'n_batch': 225, 'duration': 209.8546106815338, 'duration_batch': 0.9326871585845947, 'duration_size': 0.23317178964614868, 'avg_pred_std': 0.09368091402575374}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.005122498869895935, 'avg_role_model_std_loss': 0.6850604875349726, 'avg_role_model_mean_pred_loss': 0.0001063596828682662, '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.005122498869895935, 'n_size': 450, 'n_batch': 113, 'duration': 90.19163846969604, 'duration_batch': 0.7981560926521774, 'duration_size': 0.2004258632659912, 'avg_pred_std': 0.06673125488749515}\n",
      "Epoch 4\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.004406307417407839, 'avg_role_model_std_loss': 0.5391749190130491, 'avg_role_model_mean_pred_loss': 3.865118440087487e-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.004406307417407839, 'n_size': 900, 'n_batch': 225, 'duration': 208.6917781829834, 'duration_batch': 0.9275190141465929, 'duration_size': 0.23187975353664822, 'avg_pred_std': 0.0995840290437142}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.005340991177492671, 'avg_role_model_std_loss': 0.6295711460246051, 'avg_role_model_mean_pred_loss': 7.291253590576869e-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.005340991177492671, 'n_size': 450, 'n_batch': 113, 'duration': 91.7313449382782, 'duration_batch': 0.8117818136130814, 'duration_size': 0.20384743319617377, 'avg_pred_std': 0.06550657832418132}\n",
      "Epoch 5\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.00469050889802424, 'avg_role_model_std_loss': 0.9336842445089064, 'avg_role_model_mean_pred_loss': 3.8414434089242215e-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.00469050889802424, 'n_size': 900, 'n_batch': 225, 'duration': 208.08384490013123, 'duration_batch': 0.9248170884450276, 'duration_size': 0.2312042721112569, 'avg_pred_std': 0.09579447591263388}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.004810444195496125, 'avg_role_model_std_loss': 0.3487526955594519, 'avg_role_model_mean_pred_loss': 8.624510295827805e-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.004810444195496125, 'n_size': 450, 'n_batch': 113, 'duration': 90.39807367324829, 'duration_batch': 0.7999829528606044, 'duration_size': 0.20088460816277398, 'avg_pred_std': 0.0735004077937487}\n",
      "Epoch 6\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.005119060436975107, 'avg_role_model_std_loss': 0.6433215488478984, 'avg_role_model_mean_pred_loss': 6.873547569881813e-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.005119060436975107, 'n_size': 900, 'n_batch': 225, 'duration': 207.70152282714844, 'duration_batch': 0.9231178792317708, 'duration_size': 0.2307794698079427, 'avg_pred_std': 0.09771538318652245}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.004957494798161659, 'avg_role_model_std_loss': 1.346057123426031, 'avg_role_model_mean_pred_loss': 5.000207313663115e-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.004957494798161659, 'n_size': 450, 'n_batch': 113, 'duration': 90.1600124835968, 'duration_batch': 0.7978762166689982, 'duration_size': 0.20035558329688177, 'avg_pred_std': 0.06382843967428249}\n",
      "Epoch 7\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.00532732381252572, 'avg_role_model_std_loss': 0.4333305762650606, 'avg_role_model_mean_pred_loss': 5.976084272669491e-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.00532732381252572, 'n_size': 900, 'n_batch': 225, 'duration': 207.5520989894867, 'duration_batch': 0.9224537732866075, 'duration_size': 0.23061344332165187, 'avg_pred_std': 0.09995691900038058}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0050655570465864405, 'avg_role_model_std_loss': 1.4249071690357547, 'avg_role_model_mean_pred_loss': 4.881459755913574e-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.0050655570465864405, 'n_size': 450, 'n_batch': 113, 'duration': 90.09133553504944, 'duration_batch': 0.7972684560623844, 'duration_size': 0.2002029678556654, 'avg_pred_std': 0.05493936902612646}\n",
      "Epoch 8\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.004071665801651155, 'avg_role_model_std_loss': 0.3260331416654134, 'avg_role_model_mean_pred_loss': 2.1085142560956504e-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.004071665801651155, 'n_size': 900, 'n_batch': 225, 'duration': 209.66889786720276, 'duration_batch': 0.931861768298679, 'duration_size': 0.23296544207466974, 'avg_pred_std': 0.10195785622629855}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.005279655439727422, 'avg_role_model_std_loss': 0.9929788724251226, 'avg_role_model_mean_pred_loss': 6.48734679797379e-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.005279655439727422, 'n_size': 450, 'n_batch': 113, 'duration': 91.38696694374084, 'duration_batch': 0.8087342207410694, 'duration_size': 0.20308214876386854, 'avg_pred_std': 0.06704739362940984}\n",
      "Epoch 9\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.004601976428077453, 'avg_role_model_std_loss': 0.3923278355509547, 'avg_role_model_mean_pred_loss': 4.1437573981469074e-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.004601976428077453, 'n_size': 900, 'n_batch': 225, 'duration': 202.2607822418213, 'duration_batch': 0.8989368099636502, 'duration_size': 0.22473420249091255, 'avg_pred_std': 0.1009762748144567}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.003612730009287285, 'avg_role_model_std_loss': 1.519655740890833, 'avg_role_model_mean_pred_loss': 3.1731855463335754e-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.003612730009287285, 'n_size': 450, 'n_batch': 113, 'duration': 86.41371130943298, 'duration_batch': 0.7647231089330353, 'duration_size': 0.19203046957651773, 'avg_pred_std': 0.05825823241436805}\n",
      "Epoch 10\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.003639938447223459, 'avg_role_model_std_loss': 0.2671018096537945, 'avg_role_model_mean_pred_loss': 2.6972246297165055e-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.003639938447223459, 'n_size': 900, 'n_batch': 225, 'duration': 204.09564805030823, 'duration_batch': 0.907091769112481, 'duration_size': 0.22677294227812025, 'avg_pred_std': 0.10696077811221281}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.002935796806381808, 'avg_role_model_std_loss': 1.918275244656198, 'avg_role_model_mean_pred_loss': 1.3822624714984066e-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.002935796806381808, 'n_size': 450, 'n_batch': 113, 'duration': 87.83020257949829, 'duration_batch': 0.7772584299070645, 'duration_size': 0.19517822795444065, 'avg_pred_std': 0.04963276007591821}\n",
      "Epoch 11\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0033298865797243907, 'avg_role_model_std_loss': 0.48618020502341713, 'avg_role_model_mean_pred_loss': 2.140108548165483e-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.0033298865797243907, 'n_size': 900, 'n_batch': 225, 'duration': 201.81425046920776, 'duration_batch': 0.89695222430759, 'duration_size': 0.2242380560768975, 'avg_pred_std': 0.10155585827512874}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.002946255624992773, 'avg_role_model_std_loss': 1.365417978676351, 'avg_role_model_mean_pred_loss': 1.4400359725914503e-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.002946255624992773, 'n_size': 450, 'n_batch': 113, 'duration': 87.90818929672241, 'duration_batch': 0.777948577847101, 'duration_size': 0.19535153177049425, 'avg_pred_std': 0.05489195802813577}\n",
      "Epoch 12\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.003180694187467452, 'avg_role_model_std_loss': 0.5309610087041662, 'avg_role_model_mean_pred_loss': 1.2343771629586152e-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.003180694187467452, 'n_size': 900, 'n_batch': 225, 'duration': 202.47150707244873, 'duration_batch': 0.8998733647664388, 'duration_size': 0.2249683411916097, 'avg_pred_std': 0.09903836669710775}\n",
      "Time out: 3780.621705532074/3600\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Eval loss {'role_model': 'lct_gan', 'n_size': 1050, 'n_batch': 263, 'role_model_metrics': {'avg_loss': 0.003139846928090611, 'avg_g_mag_loss': 0.10179269966281267, 'avg_g_cos_loss': 0.03099184789007441, 'pred_duration': 3.9727766513824463, 'grad_duration': 12.556280612945557, 'total_duration': 16.529057264328003, 'pred_std': 0.09302742779254913, 'std_loss': 0.02486800216138363, 'mean_pred_loss': 3.833626033156179e-05, 'pred_rmse': 0.05603433772921562, 'pred_mae': 0.04172290489077568, 'pred_mape': 0.13467051088809967, 'grad_rmse': 0.15034998953342438, 'grad_mae': 0.04181426018476486, 'grad_mape': 1.1387050151824951}, '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.003139846928090611, 'avg_g_mag_loss': 0.10179269966281267, 'avg_g_cos_loss': 0.03099184789007441, 'avg_pred_duration': 3.9727766513824463, 'avg_grad_duration': 12.556280612945557, 'avg_total_duration': 16.529057264328003, 'avg_pred_std': 0.09302742779254913, 'avg_std_loss': 0.02486800216138363, 'avg_mean_pred_loss': 3.833626033156179e-05}, 'min_metrics': {'avg_loss': 0.003139846928090611, 'avg_g_mag_loss': 0.10179269966281267, 'avg_g_cos_loss': 0.03099184789007441, 'pred_duration': 3.9727766513824463, 'grad_duration': 12.556280612945557, 'total_duration': 16.529057264328003, 'pred_std': 0.09302742779254913, 'std_loss': 0.02486800216138363, 'mean_pred_loss': 3.833626033156179e-05, 'pred_rmse': 0.05603433772921562, 'pred_mae': 0.04172290489077568, 'pred_mape': 0.13467051088809967, 'grad_rmse': 0.15034998953342438, 'grad_mae': 0.04181426018476486, 'grad_mape': 1.1387050151824951}, 'model_metrics': {'lct_gan': {'avg_loss': 0.003139846928090611, 'avg_g_mag_loss': 0.10179269966281267, 'avg_g_cos_loss': 0.03099184789007441, 'pred_duration': 3.9727766513824463, 'grad_duration': 12.556280612945557, 'total_duration': 16.529057264328003, 'pred_std': 0.09302742779254913, 'std_loss': 0.02486800216138363, 'mean_pred_loss': 3.833626033156179e-05, 'pred_rmse': 0.05603433772921562, 'pred_mae': 0.04172290489077568, 'pred_mape': 0.13467051088809967, 'grad_rmse': 0.15034998953342438, 'grad_mae': 0.04181426018476486, 'grad_mape': 1.1387050151824951}}}\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-22T20:44:11.484448Z",
     "iopub.status.busy": "2024-03-22T20:44:11.484132Z",
     "iopub.status.idle": "2024-03-22T20:44:11.488584Z",
     "shell.execute_reply": "2024-03-22T20:44:11.487707Z"
    },
    "papermill": {
     "duration": 0.023713,
     "end_time": "2024-03-22T20:44:11.490684",
     "exception": false,
     "start_time": "2024-03-22T20:44:11.466971",
     "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-22T20:44:11.522326Z",
     "iopub.status.busy": "2024-03-22T20:44:11.522055Z",
     "iopub.status.idle": "2024-03-22T20:44:11.619261Z",
     "shell.execute_reply": "2024-03-22T20:44:11.618274Z"
    },
    "papermill": {
     "duration": 0.115695,
     "end_time": "2024-03-22T20:44:11.621500",
     "exception": false,
     "start_time": "2024-03-22T20:44:11.505805",
     "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-22T20:44:11.655717Z",
     "iopub.status.busy": "2024-03-22T20:44:11.655043Z",
     "iopub.status.idle": "2024-03-22T20:44:11.931221Z",
     "shell.execute_reply": "2024-03-22T20:44:11.930263Z"
    },
    "papermill": {
     "duration": 0.295167,
     "end_time": "2024-03-22T20:44:11.933247",
     "exception": false,
     "start_time": "2024-03-22T20:44:11.638080",
     "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-22T20:44:11.968723Z",
     "iopub.status.busy": "2024-03-22T20:44:11.968034Z",
     "iopub.status.idle": "2024-03-22T20:48:05.896124Z",
     "shell.execute_reply": "2024-03-22T20:48:05.895337Z"
    },
    "papermill": {
     "duration": 233.948452,
     "end_time": "2024-03-22T20:48:05.898722",
     "exception": false,
     "start_time": "2024-03-22T20:44:11.950270",
     "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-22T20:48:05.934156Z",
     "iopub.status.busy": "2024-03-22T20:48:05.933853Z",
     "iopub.status.idle": "2024-03-22T20:48:05.952653Z",
     "shell.execute_reply": "2024-03-22T20:48:05.951833Z"
    },
    "papermill": {
     "duration": 0.038451,
     "end_time": "2024-03-22T20:48:05.954486",
     "exception": false,
     "start_time": "2024-03-22T20:48:05.916035",
     "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>lct_gan</th>\n",
       "      <td>0.031092</td>\n",
       "      <td>0.090557</td>\n",
       "      <td>0.00314</td>\n",
       "      <td>12.489086</td>\n",
       "      <td>0.041814</td>\n",
       "      <td>1.138705</td>\n",
       "      <td>0.15035</td>\n",
       "      <td>0.000038</td>\n",
       "      <td>3.991713</td>\n",
       "      <td>0.041723</td>\n",
       "      <td>0.134671</td>\n",
       "      <td>0.056034</td>\n",
       "      <td>0.093027</td>\n",
       "      <td>0.024868</td>\n",
       "      <td>16.480799</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",
       "lct_gan        0.031092        0.090557   0.00314      12.489086  0.041814   \n",
       "\n",
       "         grad_mape  grad_rmse  mean_pred_loss  pred_duration  pred_mae  \\\n",
       "lct_gan   1.138705    0.15035        0.000038       3.991713  0.041723   \n",
       "\n",
       "         pred_mape  pred_rmse  pred_std  std_loss  total_duration  \n",
       "lct_gan   0.134671   0.056034  0.093027  0.024868       16.480799  "
      ]
     },
     "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-22T20:48:05.987875Z",
     "iopub.status.busy": "2024-03-22T20:48:05.987334Z",
     "iopub.status.idle": "2024-03-22T20:48:06.323344Z",
     "shell.execute_reply": "2024-03-22T20:48:06.322430Z"
    },
    "papermill": {
     "duration": 0.354866,
     "end_time": "2024-03-22T20:48:06.325490",
     "exception": false,
     "start_time": "2024-03-22T20:48:05.970624",
     "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-22T20:48:06.360856Z",
     "iopub.status.busy": "2024-03-22T20:48:06.360522Z",
     "iopub.status.idle": "2024-03-22T20:52:09.563033Z",
     "shell.execute_reply": "2024-03-22T20:52:09.562228Z"
    },
    "papermill": {
     "duration": 243.222766,
     "end_time": "2024-03-22T20:52:09.565475",
     "exception": false,
     "start_time": "2024-03-22T20:48:06.342709",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Caching in ../../../../contraceptive/_cache_aug_test/lct_gan/all inf False\n",
      "Caching in ../../../../contraceptive/_cache_bs_test/lct_gan/all inf False\n",
      "Caching in ../../../../contraceptive/_cache_synth_test/lct_gan/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-22T20:52:09.602257Z",
     "iopub.status.busy": "2024-03-22T20:52:09.601874Z",
     "iopub.status.idle": "2024-03-22T20:52:09.628172Z",
     "shell.execute_reply": "2024-03-22T20:52:09.627453Z"
    },
    "papermill": {
     "duration": 0.046497,
     "end_time": "2024-03-22T20:52:09.630047",
     "exception": false,
     "start_time": "2024-03-22T20:52:09.583550",
     "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-22T20:52:09.663146Z",
     "iopub.status.busy": "2024-03-22T20:52:09.662872Z",
     "iopub.status.idle": "2024-03-22T20:52:09.668072Z",
     "shell.execute_reply": "2024-03-22T20:52:09.667239Z"
    },
    "papermill": {
     "duration": 0.023904,
     "end_time": "2024-03-22T20:52:09.670018",
     "exception": false,
     "start_time": "2024-03-22T20:52:09.646114",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'lct_gan': 0.38558200279871624}\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-22T20:52:09.706391Z",
     "iopub.status.busy": "2024-03-22T20:52:09.705913Z",
     "iopub.status.idle": "2024-03-22T20:52:10.051187Z",
     "shell.execute_reply": "2024-03-22T20:52:10.050352Z"
    },
    "papermill": {
     "duration": 0.366373,
     "end_time": "2024-03-22T20:52:10.053189",
     "exception": false,
     "start_time": "2024-03-22T20:52:09.686816",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 300x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from ml_utility_loss.loss_learning.visualization import plot_pred_density_2\n",
    "\n",
    "_ = plot_pred_density_2(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "e79e4b0f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T20:52:10.087766Z",
     "iopub.status.busy": "2024-03-22T20:52:10.087487Z",
     "iopub.status.idle": "2024-03-22T20:52:10.406559Z",
     "shell.execute_reply": "2024-03-22T20:52:10.405809Z"
    },
    "papermill": {
     "duration": 0.338846,
     "end_time": "2024-03-22T20:52:10.408588",
     "exception": false,
     "start_time": "2024-03-22T20:52:10.069742",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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dWs3uzUa74UUB+p9mzt3brdr4zgOixYtEttIct8YETA7duxgKpWKbd68mZ05c4Y9+OCDLCkpidXV1flsv3//fiaXy9nvfvc79u2337Jf//rXTKlUslOnToltNmzYwPR6PXv33XfZiRMn2K233soKCgqY1WqN1GUxxvp+bXfddRd75ZVX2LFjx9jZs2dZcXEx0+v17PLly2KbZcuWsRtvvJHV1NSIj+bm5khdkkhfr23Lli0sMTHRy+7a2lqvNgP1vjU1NXld1+nTp5lcLmdbtmwR20hx30iI+sCMGTPYypUrxb/dbjfLzs5m69ev99n+jjvuYIsWLfLaNnPmTPbwww8zxhjjeZ5lZmay3//+9+L+1tZWplar2VtvvRWGK/BPX6+tKy6Xi+l0OrZt2zZx27Jly9jixYtDbWqf6eu1bdmyhen1er/ni6X79oc//IHpdDpmMpnEbVLcNxqaBYhnVdoFCxaI23palRYAvvrqK6/2ALBw4UKxfXl5OWpra73a6PV6zJw50+85w0Ew19YVi8UCp9OJlBTvZa337NmD9PR0jBo1Cj/5yU/Q1NTk5wzhIdhrM5lMGDZsGHJzc7F48WKcOXNG3BdL9+21117DnXfeCa3WexmjSN83EqIA6WlV2traWp/H1NbW9tje89yXc4aDYK6tK48//jiys7O9vhQ33ngjXn/9dezevRvPPfcc9u7di5tuuglut+9Va8NBMNc2atQobN68Ge+99x7eeOMN8DyP2bNn4/LlywBi574dOnQIp0+fxgMPPOC1XYr7NqCz74noYMOGDdixYwf27Nnj5dS98847xdcTJkzAxIkTMXz4cOzZswfz58+XwtSAmDVrlte6erNnz8aYMWPwl7/8Bc8884yEloWW1157DRMmTMCMGTO8tktx36hHFCB9XZUWADIzM3ts73nuyznDQTDX5uH555/Hhg0b8Mknn2DixIk9ti0sLERqaiouXLjQb5sDpT/X5kGpVGLKlCmi3bFw38xmM3bs2IH777+/1/eJxH0jIQqQYFalnTVrlld7ANi1a5fYvqCgAJmZmV5tDAYDDh48GNGVboNdcfd3v/sdnnnmGXz00UeYNm1ar+9z+fJlNDU1ISsrKyR2B0IoVhN2u904deqUaPdAv2+AEFZit9txzz339Po+EblvEXWND3B27NjB1Go127p1K/v222/ZQw89xJKSksSp3XvvvZc98cQTYvv9+/czhULBnn/+eXb27Fn25JNP+py+T0pKYu+99x47efIkW7x4sWTTwH25tg0bNjCVSsX+8Y9/eE3zGo1GxhhjRqORrV69mn311VesvLycffrpp2zq1KlsxIgRzGazRfW1rVu3jn388cesrKyMHTlyhN15551Mo9GwM2fOeF3/QLxvHq6++mq2dOnSbtulum8kRH3kj3/8I8vLy2MqlYrNmDGDff311+K+6667ji1btsyr/dtvv81GjhzJVCoVGzduHPvggw+89vM8z37zm9+wjIwMplar2fz581lJSUkkLqUbfbm2YcOGMQDdHk8++SRjjDGLxcJuuOEGlpaWxpRKJRs2bBh78MEHu8XjRIq+XNtjjz0mts3IyGA333wzO3r0qNf5Bup9Y4yxc+fOMQDsk08+6XYuqe4blQEhCEJyyEdEEITkkBARBCE5JEQEQUgOCRFBEJJDQkQQhOSQEBEEITkkRARBSA4JETGg2Lp1K5KSksS/n3rqKUyePFn8u7i4GEuWLIm4XUT/ICEifOIpF/rjH/+4276VK1eC4zgUFxd7tQ+1AOTn5+Oll17y2rZ06VKUlpb6PWbjxo3YunWr+PfcuXPx2GOPhdQuIvSQEBF+yc3NxY4dO2C1WsVtNpsN27dvR15eniQ2xcXFIT093e9+vV7v1WMiBgYkRIRfpk6ditzcXOzcuVPctnPnTuTl5WHKlCn9OrevnsqSJUvEXtbcuXNRWVmJn//852IBd6D70KwrnXtmxcXF2Lt3LzZu3Cieo7y8HEVFRXj++ee9jjt+/Dg4jotoiRKiAxIiokdWrFiBLVu2iH9v3rwZy5cvD/v77ty5Ezk5OXj66adRU1ODmpqaPp9j48aNmDVrFh588EHxHHl5ed2uCQC2bNmCa6+9FkVFRaG6BKIPkBARPXLPPffgyy+/RGVlJSorK7F///6Aatj0l5SUFMjlcuh0OmRmZgZVcEyv10OlUiE+Pl48h1wuR3FxMUpKSsRld5xOJ7Zv344VK1aE+jKIAKFSsUSPpKWlYdGiRdi6dSsYY1i0aBFSU1OlNqtfZGdnY9GiRdi8eTNmzJiBf//737Db7bj99tulNm3QQj0ioldWrFiBrVu3Ytu2bSHrNchkMnStQON0OkNy7kB44IEHREf8li1bsHTpUsTHx0fs/QlvSIiIXrnxxhvhcDjgdDqxcOHCkJwzLS3Ny+/jdrtx+vRprzYqlarfK0f4O8fNN98MrVaLTZs24aOPPqJhmcTQ0IzoFblcjrNnz4qv/dHW1objx497bRsyZAhyc3O7tb3++uuxatUqfPDBBxg+fDhefPFFtLa2erXJz8/Hvn37cOedd0KtVgc1JMzPz8fBgwdRUVGBhIQEpKSkQCaTib6iNWvWYMSIERGtNU10h3pEREAkJiYiMTGxxzZ79uzBlClTvB7r1q3z2XbFihVYtmwZ7rvvPlx33XUoLCzEvHnzvNo8/fTTqKiowPDhw5GWlhaU3atXr4ZcLsfYsWORlpaGS5cuifvuv/9+OByOiMwCEj1DpWKJQcsXX3yB+fPno6qqqtsihURkISEiBh12ux0NDQ1YtmwZMjMz8eabb0pt0qCHhmbEoOOtt97CsGHD0Nrait/97ndSm0OAekQEQUQB1CMiCEJySIgIgpAcEiKCICSHhIggCMkhISIIQnJIiAiCkBwSIoIgJIeEiCAIySEhIghCcv4/dxPYPI7V8kYAAAAASUVORK5CYII=",
      "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-22T20:52:10.445970Z",
     "iopub.status.busy": "2024-03-22T20:52:10.445338Z",
     "iopub.status.idle": "2024-03-22T20:52:10.657820Z",
     "shell.execute_reply": "2024-03-22T20:52:10.656962Z"
    },
    "papermill": {
     "duration": 0.233183,
     "end_time": "2024-03-22T20:52:10.659660",
     "exception": false,
     "start_time": "2024-03-22T20:52:10.426477",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAS8AAAEmCAYAAAAz0RYQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAnOElEQVR4nO3dfVQU970/8PcuDwsI+AQsSND1oRFNVBR+ICbexBYhaUxtzQNHrRBi6anKrcnWxtCcQoltSBpFbErk1opGk1ZuGmNyo/WJSK5GfMJgfQIPKGIUEFRAIC4L+/394WWadRdYzMIwu+/XORycme/MfoaBtzPfmf2uSgghQESkMGq5CyAiuh8MLyJSJIYXESkSw4uIFInhRUSKxPAiIkVieBGRIjG8iEiRXOUuoL+ZTCZcu3YNPj4+UKlUcpdDRPcQQuD27dsYMWIE1Oquz6+cLryuXbuGkJAQucsgoh5cuXIFDzzwQJfLnS68fHx8ANz9wfj6+spcTd8xGo3Yu3cvYmNj4ebmJnc5ZAfOckybmpoQEhIi/a12xenCq/NS0dfX1+HDy8vLC76+vg79i+5MnO2Y9tStww57IlIkhhcRKRLDi4gUieFFRIoke3jl5ORAp9PBw8MDUVFROHbsWLftGxoasGzZMgQFBUGj0eDBBx/Erl27+qlaIhooZL3bmJ+fD71ej9zcXERFRSE7OxtxcXEoKytDQECARfu2tjbMnj0bAQEB+Mc//oHg4GBcvnwZQ4YM6f/iiUhWsoZXVlYWkpOTkZSUBADIzc3Fzp07kZeXh1dffdWifV5eHm7evInDhw9Lt4p1Ol1/ljxgtba2orS0VJpu/saAw6crMNTvBLw9NWZtQ0ND4eXl1d8lEtmVbOHV1taG4uJipKamSvPUajViYmJQVFRkdZ1PP/0U0dHRWLZsGT755BP4+/tjwYIFWLlyJVxcXKyuYzAYYDAYpOmmpiYAd5+ZMRqNdtwjeZ05cwZRUVEW8/9ope3Ro0cxderUvi+K7Krz99WRfm+tsXX/ZAuv+vp6dHR0QKvVms3XarVmZxDfdvHiRXz++edYuHAhdu3ahfLycixduhRGoxHp6elW18nMzERGRobF/L179zrU2YfBYMCaNWuk6dpWYEu5CxLGdUB7z25WVlaiurq6nyske9m3b5/cJfSp1tZWm9op6gl7k8mEgIAA/OUvf4GLiwvCw8Nx9epVvP32212GV2pqKvR6vTTd+daD2NhYh37C/lTVTeRvOIHn5kdgyshhcpdDdmA0GrFv3z7Mnj3boZ+w77w66ols4eXn5wcXFxfU1taaza+trUVgYKDVdYKCguDm5mZ2iThhwgTU1NSgra0N7u7uFutoNBpoNBqL+W5ubg79C+Dq6ip9d+T9dEaO/rtr677J9qiEu7s7wsPDUVBQIM0zmUwoKChAdHS01XUeeeQRlJeXw2QySfMuXLiAoKAgq8FFRI5L1ue89Ho9NmzYgPfeew/nz5/HkiVL0NLSIt19TEhIMOvQX7JkCW7evInly5fjwoUL2LlzJ9544w0sW7ZMrl0gIpnI2ucVHx+Puro6pKWloaamBmFhYdi9e7fUiV9VVWU2GFlISAj27NmDl19+GZMnT0ZwcDCWL1+OlStXyrULRCQT2TvsU1JSkJKSYnVZYWGhxbzo6GgcOXKkj6siooFO9vAiIkv3PnQMdP3gsbM+dMzwIhqASktLER4ebnXZvQ8eFxcXY9q0aX1f1ADD8CIagEJDQ1FcXGw2r6y6AfoPTyPruUkYHzTErK0zYngRDUBeXl4WZ1PqyzegOfgNJjw8BWGjhstU2cAh+5A4RET3g+FFRIrE8CIiRWJ4EZEiMbyISJEYXkSkSAwvIlIkhhcRKRLDi4gUieFFRIrE8CIiRWJ4EZEiMbyISJEYXkSkSAwvIlIkhhcRKRLDi4gUieFFRIrE8CIiRWJ4EZEiMbyISJEYXkSkSAwvIlIkhhcRKRLDi4gUieFFRIrE8CIiRRoQ4ZWTkwOdTgcPDw9ERUXh2LFjXbbdvHkzVCqV2ZeHh0c/VktEA4Hs4ZWfnw+9Xo/09HScPHkSU6ZMQVxcHK5fv97lOr6+vqiurpa+Ll++3I8VE9FAIHt4ZWVlITk5GUlJSZg4cSJyc3Ph5eWFvLy8LtdRqVQIDAyUvrRabT9WTEQDgaucL97W1obi4mKkpqZK89RqNWJiYlBUVNTles3NzRg1ahRMJhOmTZuGN954Aw899JDVtgaDAQaDQZpuamoCABiNRhiNRjvtycDT3t4ufXfk/XQmznJMbd03WcOrvr4eHR0dFmdOWq0WpaWlVtcZP3488vLyMHnyZDQ2NmL16tWYMWMGzp49iwceeMCifWZmJjIyMizm7927F15eXvbZkQHoSjMAuOLIkSO4ekbuasgenOWYtra22tRO1vC6H9HR0YiOjpamZ8yYgQkTJuC//uu/sGrVKov2qamp0Ov10nRTUxNCQkIQGxsLX1/ffqlZDqeqbgKnT2D69OmYMnKY3OWQHTjLMe28OuqJrOHl5+cHFxcX1NbWms2vra1FYGCgTdtwc3PD1KlTUV5ebnW5RqOBRqOxup6bm1vvi1YIV1dX6bsj76czcZZjauu+ydph7+7ujvDwcBQUFEjzTCYTCgoKzM6uutPR0YHTp08jKCior8okogFI9stGvV6PxMREREREIDIyEtnZ2WhpaUFSUhIAICEhAcHBwcjMzAQAvP7665g+fTrGjRuHhoYGvP3227h8+TJ+9rOfybkbRNTPZA+v+Ph41NXVIS0tDTU1NQgLC8Pu3bulTvyqqiqo1f8+Qbx16xaSk5NRU1ODoUOHIjw8HIcPH8bEiRPl2gUikoHs4QUAKSkpSElJsbqssLDQbHrt2rVYu3ZtP1RFRAOZ7A+pEhHdD4YXESkSw4uIFInhRUSKNCA67IkIuFTfghZDe5fLK+papO+dD6zea5DGFaP9BvVJfQMNw4toALhU34JZqwttavurf5zudvmBFY87RYAxvIgGgM4zruz4MIwL8Lbe5hsDPisswpzHozHI0/Itb+XXm/FSfkm3Z2+OhOFFNICMC/DGw8GDrS4zGo2o8QemjRrq0O9ttBU77IlIkXjmpWDddfDa0rkLOFcHLzkWhpdC2drB21PnLuA8HbzkWBheCtVTB29PnbuA83XwkmNheClcVx287NwlR8cOeyJSJIYXESkSw4uIFInhRUSKxPAiIkVieBGRIjG8iEiR+JyXQhk67kDtcRWXmsqg9rB8SLW9vR3X2q/h/M3zXb496FJTM9QeV2HouAPA+puBiQYqhpdCXWu5jEGj38FvjnXf7t3d73a7fNBo4FpLGMKhtWN1RH2P4aVQIwaNQsul/8S6+DCMtfL2oPb2dnx56Es88ugjXZ55VVxvxvL8EoyYNaqvyyWyO4aXQmlcPGC6E4zRvuMxcbj1twddcr2ECcMmdPn2INOdRpju1EHj4tHX5RLZXa877C9evNgXdRAR9Uqvw2vcuHGYNWsW3n//fdy5c6cvaiIi6lGvLxtPnjyJTZs2Qa/XIyUlBfHx8Vi8eDEiIyP7oj4ip9DT3WOg5zvIznb3uNfhFRYWhnXr1mHNmjX49NNPsXnzZjz66KN48MEH8eKLL2LRokXw9/fvi1qJHJatd4+B7u8gO9Pd4/vusHd1dcW8efPw1FNP4d1330VqaipWrFiB3/zmN3j++efx1ltvISgoyJ61Ejmsnu4eAz3fQXa2u8f3HV4nTpxAXl4etm3bhkGDBmHFihVYvHgxvv76a2RkZGDu3Lk4dsyG/0aIqMe7x0DPd5Cd7e5xr8MrKysLmzZtQllZGX74wx9iy5Yt+OEPfwi1+m7f/+jRo7F582bodDp710pEJOn13cb169djwYIFuHz5Mnbs2IE5c+ZIwdUpICAAGzdutHmbOTk50Ol08PDwQFRUlM1nbNu2bYNKpcKPf/zj3uwCETmAXofXvn37sHLlSov+LCEEqqqqAADu7u5ITEy0aXv5+fnQ6/VIT0/HyZMnMWXKFMTFxeH69evdrldZWYkVK1Zg5syZvd0FInIAvQ6vsWPHor6+3mL+zZs3MXr06F4XkJWVheTkZCQlJWHixInIzc2Fl5cX8vLyulyno6MDCxcuREZGBsaMGdPr1yQi5et1n5cQwur85uZmeHj0rqOwra0NxcXFSE1Nleap1WrExMSgqKioy/Vef/11BAQEYPHixTh48GC3r2EwGGAwGKTppqYmAHc7P41GY6/qHUja29ul79b2o3Ned/vY0zao/9hyLHo6po5yPG2t3ebw0uv1AACVSoW0tDR4eXlJyzo6OnD06FGEhYX1qsj6+np0dHRAqzV/JkWr1aK0tNTqOocOHcLGjRtRUlJi02tkZmYiIyPDYv7evXvN9kFprjQDgCsOHTqEy9bvrAO4e5n/XbdBfa83x6KrY+oox7O1tdWmdjaH11dffQXg7pnX6dOn4e7uLi1zd3fHlClTsGLFil6W2Tu3b9/GokWLsGHDBvj5+dm0TmpqqhS8wN0zr5CQEMTGxsLX17evSu1zZ681YfXpI3j00Ufx0AjL/TAajdi3bx9mz57d5Ruze9oG9R9bjkVPx9RRjmfn1VFPbA6vAwcOAACSkpKwbt06u/zh+/n5wcXFBbW1tWbza2trERgYaNG+oqIClZWVePrpp6V5JpMJwN2HZsvKyjB27FizdTQaDTQay0+MdnNzU/SHsXY+pOjq6trtfnS3n7Zug/peb45FV8fUUY6nrbX3usN+06ZNdjtjcXd3R3h4OAoKCqR5JpMJBQUFiI6OtmgfGhqK06dPo6SkRPr60Y9+hFmzZqGkpAQhISF2qYuIBj6bzrzmzZuHzZs3w9fXF/Pmzeu27fbt23tVgF6vR2JiIiIiIhAZGYns7Gy0tLQgKSkJAJCQkIDg4GBkZmbCw8MDDz/8sNn6Q4YMAQCL+UTk2GwKr8GDB0OlUkn/tqf4+HjU1dUhLS0NNTU1CAsLw+7du6VO/KqqKouHYImIbAqvTZs2Wf23vaSkpCAlJcXqssLCwm7X3bx5s93rIaKBj6c0RKRINp15TZ06Vbps7MnJkye/U0FERLawKbz4xmciGmhsCq/09PS+roOIqFfY50VEimTTmdewYcNw4cIF+Pn5YejQod32f928edNuxRERdcWm8Fq7di18fHykf9vaeU9E1FdsCq9vDyz4wgsv9FUtREQ263Wfl4uLi9VRTm/cuAEXFxe7FEVE1JNeh1dXgxEaDAazYXKIiPqSzUPi/OlPfwJwdzDCv/71r/D2/vdoZx0dHfjf//1fhIaG2r9CIiIrbA6vtWvXArh75pWbm2t2ieju7g6dTofc3Fz7V0hEZIXN4XXp0iUAwKxZs7B9+3YMHTq0z4oiIupJrz+Ao3NEVSIiOfU6vF588cVul3f3kWVERPbS6/C6deuW2bTRaMSZM2fQ0NCA73//+3YrjIioO70Or48//thinslkwpIlSyw+/IKIqK/Y5Y3ZarUaer1euiNJRNTX7DaqREVFhfSJvUREfa3Xl43f/gBX4O5zX9XV1di5c6fZeyCJiPpSr8Or85OzO6nVavj7+2PNmjU93okkIrIXPudFRIrEkVSJSJEYXkSkSAwvIlIkhhcRKZLdwuvrr7/Gz3/+c3ttjoioW3YLrxs3bmDjxo322hwRUbd42UhEisTwIiJFYngRkSLZ/IT9vHnzul3e0NDwXWshIrKZzeE1ePDgHpcnJCTcVxE5OTl4++23UVNTgylTpuCdd95BZGSk1bbbt2/HG2+8gfLychiNRnzve9/Dr371KyxatOi+XlupvjF2AADOXG20urzlGwNO1AGBl29hkKfGapvy6819Vh9RX7M5vDZt2tQnBeTn50Ov1yM3NxdRUVHIzs5GXFwcysrKEBAQYNF+2LBheO211xAaGgp3d3d89tlnSEpKQkBAAOLi4vqkxoGo4v+C59Xtp7tp5Yqt5cd73NYgTa/f4kokO9l/a7OyspCcnIykpCQAQG5uLnbu3Im8vDy8+uqrFu0ff/xxs+nly5fjvffew6FDh5wqvGIfCgQAjA3whqeb5SeVl1U34lf/OI01z07C+KCuz5oHaVwx2m9Qn9VJ1FdsDi9bh7vpzQdwtLW1obi4GKmpqdI8tVqNmJgYFBUV9bi+EAKff/45ysrK8NZbb1ltYzAYYDAYpOmmpiYAd8feNxqNNtc60Pi4q/DM1KAul9+5cwcAMGqoBuMDvLrdlpJ/Do7i9jd3f0dPVd3sclDPljt3uwL8LtZhkIdlV0B5XQsAoL29XdHH1NbabQ6vzZs3Y9SoUZg6dSqEEPdd2LfV19ejo6MDWq3WbL5Wq0VpaWmX6zU2NiI4OBgGgwEuLi549913MXv2bKttMzMzkZGRYTF/79698PLq/o9aya40A4Arjhw5gqtn5K6GelJUqwLggtc+OddDS1dsLf+q2xbHiw7hsqfdSut3ra2tNrWzObyWLFmCv//977h06RKSkpLw05/+FMOGDbvvAr8LHx8flJSUoLm5GQUFBdDr9RgzZozFJSUApKammo3+2tTUhJCQEMTGxsLX17cfq+5fp6puAqdPYPr06ZgyUp7jRLab3tKGSeevY4z/IKvdAABwoaYRr3x8Hn/8yQQ8GGi9K2CQxgW64cruBui8OuqJzeGVk5ODrKwsbN++HXl5eUhNTcVTTz2FxYsXIzY2FiqVqtdF+vn5wcXFBbW1tWbza2trERgY2OV6arUa48aNAwCEhYXh/PnzyMzMtBpeGo0GGo3lKbabmxvc3Nx6XbNSuLq6St8deT8dhXaIGxZGj7ap7YOBgxE2angfVyQfW39fe/WQqkajwfz587Fv3z6cO3cODz30EJYuXQqdTofm5t7fdnd3d0d4eDgKCgqkeSaTCQUFBYiOjrZ5OyaTyaxfi4gc333fbVSr1VCpVBBCoKOj474L0Ov1SExMREREBCIjI5GdnY2Wlhbp7mNCQgKCg4ORmZkJ4G4fVkREBMaOHQuDwYBdu3Zh69atWL9+/X3XQETK06vwMhgM0mXjoUOHMGfOHPz5z3/GE088AbX6/t5pFB8fj7q6OqSlpaGmpgZhYWHYvXu31IlfVVVltu2WlhYsXboUX3/9NTw9PREaGor3338f8fHx9/X6RKRMNofX0qVLsW3bNoSEhODFF1/E3//+d/j5+dmliJSUFKSkpFhdVlhYaDb9+9//Hr///e/t8rpEpFw2h1dubi5GjhyJMWPG4IsvvsAXX3xhtd327dvtVhwRUVdsDq+EhIT7uqNIRNQXevWQKhHRQMHxvIhIkRheRKRIDC8iUiSGFxEpEsOLiBSJ4UVEisTwIiJFYngRkSIxvIhIkRheRKRIDC8iUiSGFxEpEsOLiBSJ4UVEisTwIiJFYngRkSIxvIhIkRheRKRIDC8iUiSGFxEpEsOLiBSJ4UVEisTwIiJFYngRkSIxvIhIkRheRKRIDC8iUiSGFxEp0oAIr5ycHOh0Onh4eCAqKgrHjh3rsu2GDRswc+ZMDB06FEOHDkVMTEy37YnIMckeXvn5+dDr9UhPT8fJkycxZcoUxMXF4fr161bbFxYWYv78+Thw4ACKiooQEhKC2NhYXL16tZ8rJyI5yR5eWVlZSE5ORlJSEiZOnIjc3Fx4eXkhLy/PavsPPvgAS5cuRVhYGEJDQ/HXv/4VJpMJBQUF/Vw5EcnJVc4Xb2trQ3FxMVJTU6V5arUaMTExKCoqsmkbra2tMBqNGDZsmNXlBoMBBoNBmm5qagIAGI1GGI3G71D9wNbe3i59d+T9dCbOckxt3TdZw6u+vh4dHR3QarVm87VaLUpLS23axsqVKzFixAjExMRYXZ6ZmYmMjAyL+Xv37oWXl1fvi1aIK80A4IojR47g6hm5qyF7cJZj2traalM7WcPru3rzzTexbds2FBYWwsPDw2qb1NRU6PV6abqpqUnqJ/P19e2vUvvdqaqbwOkTmD59OqaMtH5WSsriLMe08+qoJ7KGl5+fH1xcXFBbW2s2v7a2FoGBgd2uu3r1arz55pvYv38/Jk+e3GU7jUYDjUZjMd/NzQ1ubm73V7gCuLq6St8deT+dibMcU1v3TdYOe3d3d4SHh5t1tnd2vkdHR3e53h//+EesWrUKu3fvRkRERH+USkQDjOyXjXq9HomJiYiIiEBkZCSys7PR0tKCpKQkAEBCQgKCg4ORmZkJAHjrrbeQlpaGv/3tb9DpdKipqQEAeHt7w9vbW7b9IKL+JXt4xcfHo66uDmlpaaipqUFYWBh2794tdeJXVVVBrf73CeL69evR1taGZ5991mw76enp+N3vftefpRORjGQPLwBISUlBSkqK1WWFhYVm05WVlX1fEBENeLI/pEpEdD8YXkSkSAwvIlIkhhcRKRLDi4gUieFFRIrE8CIiRWJ4EZEiMbyISJEYXkSkSAwvIlIkhhcRKRLDi4gUaUCMKkHfXWtrq9m4/2XVDTDUlOP8GU+YbgwxaxsaGurQ4/eTc2B4OYjS0lKEh4dbzF/wnmXb4uJiTJs2rR+qIuo7DC8HERoaiuLiYmm6+RsDdh4owlOzouHtqbFoS6R0DC8H4eXlZXY2ZTQacav+OqIjIxz6wxrIebHDnogUieFFRIrE8CIiRWJ4EZEiMbyISJEYXkSkSAwvIlIkhhcRKRLDi4gUieFFRIrE8CIiRWJ4EZEiMbyISJEYXkSkSLKHV05ODnQ6HTw8PBAVFYVjx4512fbs2bN45plnoNPpoFKpkJ2d3X+FEtGAIut4Xvn5+dDr9cjNzUVUVBSys7MRFxeHsrIyBAQEWLRvbW3FmDFj8Nxzz+Hll1+WoWKi/nHvsN5A10N7O+2w3kJGkZGRYtmyZdJ0R0eHGDFihMjMzOxx3VGjRom1a9f2+jUbGxsFANHY2NjrdZWkra1N7NixQ7S1tcldCt2H4uJiAcCmr+LiYrnLtStb/0ZlO/Nqa2tDcXExUlNTpXlqtRoxMTEoKiqy2+sYDAYYDAZpuqmpCcDdkUaNRqPdXmeg6dw3R95HRzZ27FgcPXrUbF7zNwbsOXgccTP/n9nQ3mPHjnWo42zrvsgWXvX19ejo6IBWqzWbr9VqLU6Xv4vMzExkZGRYzN+7d69TnGrv27dP7hLIjmZMGovbDTdxu+Hf86qrq2Wrpy+0trba1M7hx7BPTU2FXq+XppuamhASEoLY2Fj4+vrKWFnfMhqN2LdvH2bPns0x7B2EsxzTzqujnsgWXn5+fnBxcUFtba3Z/NraWgQGBtrtdTQaDTQajcV8Nzc3h/4F6OQs++lMHP2Y2rpvsj0q4e7ujvDwcBQUFEjzTCYTCgoKEB0dLVdZRKQQsl426vV6JCYmIiIiApGRkcjOzkZLSwuSkpIAAAkJCQgODkZmZiaAu538586dk/599epVlJSUwNvbG+PGjZNtP4io/8kaXvHx8airq0NaWhpqamoQFhaG3bt3S534VVVVUKv/fXJ47do1TJ06VZpevXo1Vq9ejcceewyFhYX9XT4RyUj2DvuUlBSkpKRYXXZvIOl0Oggh+qEqIhroZH97EBHR/ZD9zKu/dZ652Xo7VqmMRiNaW1vR1NTk0HemnImzHNPOv82errKcLrxu374NAAgJCZG5EiLqzu3btzF48OAul6uEk3UimUwmXLt2DT4+PlCpVHKX02c6H8a9cuWKQz+M60yc5ZgKIXD79m2MGDHC7IbdvZzuzEutVuOBBx6Qu4x+4+vr69C/6M7IGY5pd2dcndhhT0SKxPAiIkVieDkojUaD9PR0q+/rJGXiMTXndB32ROQYeOZFRIrE8CIiRWJ4EZEiMbxk9vjjj+Oll16SuwwixWF4KURhYSFUKhUaGhrkLoV6YaD95zTQ6vkuGF5EA1xbW5vcJQxIDK8BxGAwYOXKlQgJCYFGo8G4ceOwceNGVFZWYtasWQCAoUOHQqVS4YUXXuhxe7dv38bChQsxaNAgBAUFYe3atRb/827duhURERHw8fFBYGAgFixYgOvXr0vLO8/4CgoKEBERAS8vL8yYMQNlZWX23n2H88ILL+CLL77AunXroFKpoFKpUFFRgcWLF2P06NHw9PTE+PHjsW7dOov1fvzjH+MPf/gDRowYgfHjxwMADh8+jLCwMHh4eCAiIgI7duyASqVCSUmJtO6ZM2fw5JNPwtvbG1qtFosWLUJ9fX2X9VRWVvbXj8P++vjzI6kHjz32mFi+fLkQQojnn39ehISEiO3bt4uKigqxf/9+sW3bNtHe3i4++ugjAUCUlZWJ6upq0dDQ0OO2f/azn4lRo0aJ/fv3i9OnT4uf/OQnwsfHR3o9IYTYuHGj2LVrl6ioqBBFRUUiOjpaPPnkk9LyAwcOCAAiKipKFBYWirNnz4qZM2eKGTNm2PtH4XAaGhpEdHS0SE5OFtXV1aK6ulrcuXNHpKWliePHj4uLFy+K999/X3h5eYn8/HxpvcTEROHt7S0WLVokzpw5I86cOSMaGxvFsGHDxE9/+lNx9uxZsWvXLvHggw8KAOKrr74SQghx69Yt4e/vL1JTU8X58+fFyZMnxezZs8WsWbO6rKe9vV2OH41dMLxk1hleZWVlAoDYt2+f1XadIXLr1i2bttvU1CTc3NzEhx9+KM1raGgQXl5eZuF1r+PHjwsA4vbt22avu3//fqnNzp07BQDxzTff2FSLM/v2f05dWbZsmXjmmWek6cTERKHVaoXBYJDmrV+/XgwfPtzsZ75hwwaz8Fq1apWIjY012/aVK1ek//RsrUcpeNk4QJSUlMDFxQWPPfaYXbZ38eJFGI1GREZGSvMGDx4sXYJ0Ki4uxtNPP42RI0fCx8dHev2qqiqzdpMnT5b+HRQUBABml5dku5ycHISHh8Pf3x/e3t74y1/+YvHznjRpEtzd3aXpsrIyTJ48GR4eHtK8bx9bADh16hQOHDgAb29v6Ss0NBQAUFFR0Yd7JA+nGxJnoPL09Oz312xpaUFcXBzi4uLwwQcfwN/fH1VVVYiLi7PoJP72yJ2d46CZTKZ+rdcRbNu2DStWrMCaNWsQHR0NHx8fvP322zh69KhZu0GDBvV6283NzXj66afx1ltvWSzr/A/HkTC8BohJkybBZDLhiy++QExMjMXyzv+FOzo6bNremDFj4ObmhuPHj2PkyJEAgMbGRly4cAH/8R//AQAoLS3FjRs38Oabb0ojy544ccIeu0P/x93d3eyYffnll5gxYwaWLl0qzbPlrGj8+PF4//33YTAYpDdmHz9+3KzNtGnT8NFHH0Gn08HV1fqf9r31KBkvGwcInU6HxMREvPjii9ixYwcuXbqEwsJC/Pd//zcAYNSoUVCpVPjss89QV1eH5ubmbrfn4+ODxMRE/PrXv8aBAwdw9uxZLF68GGq1WjpzGjlyJNzd3fHOO+/g4sWL+PTTT7Fq1ao+31dnotPpcPToUVRWVqK+vh7f+973cOLECezZswcXLlzAb3/7W4sQsmbBggUwmUz4+c9/jvPnz2PPnj1YvXo1gH+fCS9btgw3b97E/Pnzcfz4cVRUVGDPnj1ISkqSAuveepR89szwGkDWr1+PZ599FkuXLkVoaCiSk5PR0tICAAgODkZGRgZeffVVaLXaLj8u7tuysrIQHR2NOXPmICYmBo888ggmTJgg9Zv4+/tj8+bN+PDDDzFx4kS8+eab0h8E2ceKFSvg4uKCiRMnwt/fH3FxcZg3bx7i4+MRFRWFGzdumJ2FdcXX1xf/8z//g5KSEoSFheG1115DWloaAEjHc8SIEfjyyy/R0dGB2NhYTJo0CS+99BKGDBkiDad8bz339rUpCYfEcSItLS0IDg7GmjVrsHjxYrnLoe/ogw8+QFJSEhobG2XpM5Ub+7wc2FdffYXS0lJERkaisbERr7/+OgBg7ty5MldG92PLli0YM2YMgoODcerUKaxcuRLPP/+8UwYXwPBSrKqqKkycOLHL5efOnQMArF69GmVlZXB3d0d4eDgOHjwIPz+//iqT7KimpgZpaWmoqalBUFAQnnvuOfzhD3+QuyzZ8LJRodrb27t9a0d3d5yIHAHDi4gUiXcbiUiRGF5EpEgMLyJSJIYXESkSw4v61AsvvCANfOfm5gatVovZs2cjLy+vV29N2bx5M4YMGdJ3hXahc2BAGngYXtTnnnjiCVRXV6OyshL//Oc/MWvWLCxfvhxz5sxBe3u73OWRUsk5mBg5vsTERDF37lyL+QUFBQKA2LBhgxBCiDVr1oiHH35YeHl5iQceeEAsWbLEYkDEb3+lp6cLIYTYsmWLCA8PF97e3kKr1Yr58+eL2tpa6XVu3rwpFixYIPz8/ISHh4cYN26cyMvLk5ZXVVWJ5557TgwePFgMHTpU/OhHPxKXLl0SQgiRnp5u8boHDhzok58T9R7PvEgW3//+9zFlyhRs374dAKBWq/GnP/0JZ8+exXvvvYfPP/8cr7zyCgBgxowZyM7Ohq+vL6qrq1FdXY0VK1YAAIxGI1atWoVTp05hx44dqKysNBvf/7e//S3OnTuHf/7znzh//jzWr18vvcPAaDQiLi4OPj4+OHjwIL788kt4e3vjiSeeQFtbG1asWIHnn39eOnOsrq7GjBkz+vcHRV2TOz3JsXV15iWEEPHx8WLChAlWl3344Ydi+PDh0vSmTZvE4MGDe3y9e4exfvrpp0VSUpLVtlu3bhXjx48XJpNJmmcwGISnp6fYs2dPj/WTvHjmRbIRQkhjUe3fvx8/+MEPEBwcDB8fHyxatAg3btxAa2trt9voaRjrJUuWYNu2bQgLC8Mrr7yCw4cPS+ueOnUK5eXl8PHxkYZNHjZsGO7cueOQwyY7GoYXyeb8+fMYPXo0KisrMWfOHEyePBkfffQRiouLkZOTA6D7zyzsHMba19cXH3zwAY4fP46PP/7YbL0nn3wSly9fxssvv4xr167hBz/4gXTJ2dzcjPDwcJSUlJh9XbhwAQsWLOjjvafviu/cJVl8/vnnOH36NF5++WUUFxfDZDJhzZo10qB5nSPIdrI2fLGtw1j7+/sjMTERiYmJmDlzJn79619j9erVmDZtGvLz8xEQEABfX1+rdTrSsMmOhmde1OcMBgNqampw9epVnDx5Em+88Qbmzp2LOXPmICEhAePGjYPRaJSGo966dStyc3PNtqHT6dDc3IyCggLU19ejtbXVpmGs09LS8Mknn6C8vBxnz57FZ599hgkTJgAAFi5cCD8/P8ydOxcHDx6Uht7+5S9/ia+//lp63X/9618oKytDfX09jEZj//zQqGdyd7qRY0tMTJQeM3B1dRX+/v4iJiZG5OXliY6ODqldVlaWCAoKEp6eniIuLk5s2bLF4nMqf/GLX4jhw4ebPSrxt7/9Teh0OqHRaER0dLT49NNPLT7LcMKECcLT01MMGzZMzJ07V1y8eFHaZnV1tUhISBB+fn5Co9GIMWPGiOTkZNHY2CiEEOL69eti9uzZwtvbm49KDDAcEoeIFImXjUSkSAwvIlIkhhcRKRLDi4gUieFFRIrE8CIiRWJ4EZEiMbyISJEYXkSkSAwvIlIkhhcRKRLDi4gU6f8DGQKm1bQ9fUUAAAAASUVORK5CYII=",
      "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-22T20:52:10.696552Z",
     "iopub.status.busy": "2024-03-22T20:52:10.696267Z",
     "iopub.status.idle": "2024-03-22T20:52:10.902785Z",
     "shell.execute_reply": "2024-03-22T20:52:10.901904Z"
    },
    "papermill": {
     "duration": 0.22726,
     "end_time": "2024-03-22T20:52:10.904698",
     "exception": false,
     "start_time": "2024-03-22T20:52:10.677438",
     "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.01794,
     "end_time": "2024-03-22T20:52:10.940967",
     "exception": false,
     "start_time": "2024-03-22T20:52:10.923027",
     "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": 4515.294993,
   "end_time": "2024-03-22T20:52:13.681599",
   "environment_variables": {},
   "exception": null,
   "input_path": "eval/contraceptive/lct_gan/1/mlu-eval.ipynb",
   "output_path": "eval/contraceptive/lct_gan/1/mlu-eval.ipynb",
   "parameters": {
    "allow_same_prediction": true,
    "dataset": "contraceptive",
    "dataset_name": "contraceptive",
    "debug": false,
    "folder": "eval",
    "gp": false,
    "gp_multiply": false,
    "log_wandb": false,
    "param_index": 0,
    "path": "eval/contraceptive/lct_gan/1",
    "path_prefix": "../../../../",
    "random_seed": 1,
    "single_model": "lct_gan"
   },
   "start_time": "2024-03-22T19:36:58.386606",
   "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
}