File size: 216,885 Bytes
f7a584f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "982e76f5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T19:40:14.686730Z",
     "iopub.status.busy": "2024-03-22T19:40:14.686341Z",
     "iopub.status.idle": "2024-03-22T19:40:14.721946Z",
     "shell.execute_reply": "2024-03-22T19:40:14.721015Z"
    },
    "papermill": {
     "duration": 0.052769,
     "end_time": "2024-03-22T19:40:14.724162",
     "exception": false,
     "start_time": "2024-03-22T19:40:14.671393",
     "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:40:14.752739Z",
     "iopub.status.busy": "2024-03-22T19:40:14.752339Z",
     "iopub.status.idle": "2024-03-22T19:40:14.760219Z",
     "shell.execute_reply": "2024-03-22T19:40:14.759294Z"
    },
    "papermill": {
     "duration": 0.025385,
     "end_time": "2024-03-22T19:40:14.762717",
     "exception": false,
     "start_time": "2024-03-22T19:40:14.737332",
     "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:40:14.788860Z",
     "iopub.status.busy": "2024-03-22T19:40:14.788607Z",
     "iopub.status.idle": "2024-03-22T19:40:14.792716Z",
     "shell.execute_reply": "2024-03-22T19:40:14.791871Z"
    },
    "papermill": {
     "duration": 0.019374,
     "end_time": "2024-03-22T19:40:14.794678",
     "exception": false,
     "start_time": "2024-03-22T19:40:14.775304",
     "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:40:14.820786Z",
     "iopub.status.busy": "2024-03-22T19:40:14.820487Z",
     "iopub.status.idle": "2024-03-22T19:40:14.825085Z",
     "shell.execute_reply": "2024-03-22T19:40:14.824184Z"
    },
    "executionInfo": {
     "elapsed": 678,
     "status": "ok",
     "timestamp": 1696841022168,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "ns5hFcVL2yvs",
    "papermill": {
     "duration": 0.019954,
     "end_time": "2024-03-22T19:40:14.827258",
     "exception": false,
     "start_time": "2024-03-22T19:40:14.807304",
     "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:40:14.853649Z",
     "iopub.status.busy": "2024-03-22T19:40:14.853326Z",
     "iopub.status.idle": "2024-03-22T19:40:14.859023Z",
     "shell.execute_reply": "2024-03-22T19:40:14.858209Z"
    },
    "papermill": {
     "duration": 0.021566,
     "end_time": "2024-03-22T19:40:14.860965",
     "exception": false,
     "start_time": "2024-03-22T19:40:14.839399",
     "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": "dbf0f552",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T19:40:14.884790Z",
     "iopub.status.busy": "2024-03-22T19:40:14.884530Z",
     "iopub.status.idle": "2024-03-22T19:40:14.889911Z",
     "shell.execute_reply": "2024-03-22T19:40:14.888448Z"
    },
    "papermill": {
     "duration": 0.019283,
     "end_time": "2024-03-22T19:40:14.891787",
     "exception": false,
     "start_time": "2024-03-22T19:40:14.872504",
     "status": "completed"
    },
    "tags": [
     "injected-parameters"
    ]
   },
   "outputs": [],
   "source": [
    "# Parameters\n",
    "dataset = \"contraceptive\"\n",
    "dataset_name = \"contraceptive\"\n",
    "single_model = \"lct_gan\"\n",
    "gp = True\n",
    "gp_multiply = True\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.011443,
     "end_time": "2024-03-22T19:40:14.914601",
     "exception": false,
     "start_time": "2024-03-22T19:40:14.903158",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "5f45b1d0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T19:40:14.938314Z",
     "iopub.status.busy": "2024-03-22T19:40:14.938007Z",
     "iopub.status.idle": "2024-03-22T19:40:14.947168Z",
     "shell.execute_reply": "2024-03-22T19:40:14.946392Z"
    },
    "executionInfo": {
     "elapsed": 7,
     "status": "ok",
     "timestamp": 1696841022169,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "UdvXYv3c3LXy",
    "papermill": {
     "duration": 0.023214,
     "end_time": "2024-03-22T19:40:14.949039",
     "exception": false,
     "start_time": "2024-03-22T19:40:14.925825",
     "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:40:14.974444Z",
     "iopub.status.busy": "2024-03-22T19:40:14.974141Z",
     "iopub.status.idle": "2024-03-22T19:40:17.011622Z",
     "shell.execute_reply": "2024-03-22T19:40:17.010604Z"
    },
    "papermill": {
     "duration": 2.052564,
     "end_time": "2024-03-22T19:40:17.013629",
     "exception": false,
     "start_time": "2024-03-22T19:40:14.961065",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Set seed to <function seed at 0x7a99ed023370>\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:40:17.038360Z",
     "iopub.status.busy": "2024-03-22T19:40:17.037936Z",
     "iopub.status.idle": "2024-03-22T19:40:17.050479Z",
     "shell.execute_reply": "2024-03-22T19:40:17.049537Z"
    },
    "papermill": {
     "duration": 0.027111,
     "end_time": "2024-03-22T19:40:17.052563",
     "exception": false,
     "start_time": "2024-03-22T19:40:17.025452",
     "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:40:17.077482Z",
     "iopub.status.busy": "2024-03-22T19:40:17.077181Z",
     "iopub.status.idle": "2024-03-22T19:40:17.084578Z",
     "shell.execute_reply": "2024-03-22T19:40:17.083643Z"
    },
    "executionInfo": {
     "elapsed": 6,
     "status": "ok",
     "timestamp": 1696841022169,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "Vrl2QkoV3o_8",
    "papermill": {
     "duration": 0.022091,
     "end_time": "2024-03-22T19:40:17.086602",
     "exception": false,
     "start_time": "2024-03-22T19:40:17.064511",
     "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:40:17.112737Z",
     "iopub.status.busy": "2024-03-22T19:40:17.112453Z",
     "iopub.status.idle": "2024-03-22T19:40:17.206554Z",
     "shell.execute_reply": "2024-03-22T19:40:17.205788Z"
    },
    "executionInfo": {
     "elapsed": 6,
     "status": "ok",
     "timestamp": 1696841022169,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "TilUuFk9vqMb",
    "papermill": {
     "duration": 0.110426,
     "end_time": "2024-03-22T19:40:17.209013",
     "exception": false,
     "start_time": "2024-03-22T19:40:17.098587",
     "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:40:17.236406Z",
     "iopub.status.busy": "2024-03-22T19:40:17.236082Z",
     "iopub.status.idle": "2024-03-22T19:40:21.821006Z",
     "shell.execute_reply": "2024-03-22T19:40:21.820265Z"
    },
    "executionInfo": {
     "elapsed": 3113,
     "status": "ok",
     "timestamp": 1696841025277,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "7Abt8nStvr9Z",
    "papermill": {
     "duration": 4.601926,
     "end_time": "2024-03-22T19:40:21.823508",
     "exception": false,
     "start_time": "2024-03-22T19:40:17.221582",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2024-03-22 19:40:19.417436: 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:40:19.417493: 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:40:19.419102: 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:40:21.853178Z",
     "iopub.status.busy": "2024-03-22T19:40:21.852629Z",
     "iopub.status.idle": "2024-03-22T19:40:21.858956Z",
     "shell.execute_reply": "2024-03-22T19:40:21.857989Z"
    },
    "papermill": {
     "duration": 0.022425,
     "end_time": "2024-03-22T19:40:21.861204",
     "exception": false,
     "start_time": "2024-03-22T19:40:21.838779",
     "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:40:21.886820Z",
     "iopub.status.busy": "2024-03-22T19:40:21.885986Z",
     "iopub.status.idle": "2024-03-22T19:40:30.509485Z",
     "shell.execute_reply": "2024-03-22T19:40:30.508402Z"
    },
    "executionInfo": {
     "elapsed": 20137,
     "status": "ok",
     "timestamp": 1696841045408,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "tbaguWxAvtPi",
    "papermill": {
     "duration": 8.639029,
     "end_time": "2024-03-22T19:40:30.512044",
     "exception": false,
     "start_time": "2024-03-22T19:40:21.873015",
     "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:40:30.541861Z",
     "iopub.status.busy": "2024-03-22T19:40:30.541424Z",
     "iopub.status.idle": "2024-03-22T19:40:30.549638Z",
     "shell.execute_reply": "2024-03-22T19:40:30.548702Z"
    },
    "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.025563,
     "end_time": "2024-03-22T19:40:30.551664",
     "exception": false,
     "start_time": "2024-03-22T19:40:30.526101",
     "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:40:30.578204Z",
     "iopub.status.busy": "2024-03-22T19:40:30.577937Z",
     "iopub.status.idle": "2024-03-22T19:40:30.582780Z",
     "shell.execute_reply": "2024-03-22T19:40:30.581947Z"
    },
    "papermill": {
     "duration": 0.020255,
     "end_time": "2024-03-22T19:40:30.584737",
     "exception": false,
     "start_time": "2024-03-22T19:40:30.564482",
     "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:40:30.610675Z",
     "iopub.status.busy": "2024-03-22T19:40:30.610118Z",
     "iopub.status.idle": "2024-03-22T19:40:31.126454Z",
     "shell.execute_reply": "2024-03-22T19:40:31.125416Z"
    },
    "papermill": {
     "duration": 0.531769,
     "end_time": "2024-03-22T19:40:31.128570",
     "exception": false,
     "start_time": "2024-03-22T19:40:30.596801",
     "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:40:31.157774Z",
     "iopub.status.busy": "2024-03-22T19:40:31.157137Z",
     "iopub.status.idle": "2024-03-22T19:40:31.488158Z",
     "shell.execute_reply": "2024-03-22T19:40:31.487052Z"
    },
    "executionInfo": {
     "elapsed": 588,
     "status": "ok",
     "timestamp": 1696841049215,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "NgahtU1q9uLO",
    "papermill": {
     "duration": 0.348027,
     "end_time": "2024-03-22T19:40:31.490454",
     "exception": false,
     "start_time": "2024-03-22T19:40:31.142427",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'Body': 'twin_encoder',\n",
       " 'loss_balancer_meta': True,\n",
       " 'loss_balancer_log': False,\n",
       " 'loss_balancer_lbtw': False,\n",
       " 'pma_skip_small': False,\n",
       " 'isab_skip_small': False,\n",
       " 'layer_norm': False,\n",
       " 'pma_layer_norm': False,\n",
       " 'attn_residual': True,\n",
       " 'tf_n_layers_dec': False,\n",
       " 'tf_isab_rank': 0,\n",
       " 'tf_layer_norm': False,\n",
       " 'tf_pma_start': -1,\n",
       " 'head_n_seeds': 0,\n",
       " 'tf_pma_low': 16,\n",
       " 'dropout': 0,\n",
       " 'combine_mode': 'diff_left',\n",
       " 'tf_isab_mode': 'separate',\n",
       " 'grad_loss_fn': <function torch.nn.functional.l1_loss(input: torch.Tensor, target: torch.Tensor, size_average: Optional[bool] = None, reduce: Optional[bool] = None, reduction: str = 'mean') -> torch.Tensor>,\n",
       " 'single_model': True,\n",
       " 'bias': True,\n",
       " 'bias_final': True,\n",
       " 'pma_ffn_mode': 'none',\n",
       " 'patience': 10,\n",
       " 'inds_init_mode': 'fixnorm',\n",
       " 'grad_clip': 0.73,\n",
       " 'gradient_penalty_mode': {'gradient_penalty': True,\n",
       "  'forward_once': False,\n",
       "  'calc_grad_m': False,\n",
       "  'avg_non_role_model_m': False,\n",
       "  'inverse_avg_non_role_model_m': False},\n",
       " 'synth_data': 2,\n",
       " 'bias_lr_mul': 1.0,\n",
       " 'bias_weight_decay': 0.05,\n",
       " 'head_activation': torch.nn.modules.activation.Softsign,\n",
       " 'loss_balancer_beta': 0.67,\n",
       " 'loss_balancer_r': 0.943,\n",
       " 'tf_activation': torch.nn.modules.activation.Tanh,\n",
       " 'dataset_size': 2048,\n",
       " 'batch_size': 4,\n",
       " 'epochs': 100,\n",
       " 'lr_mul': 0.09,\n",
       " 'n_warmup_steps': 100,\n",
       " 'Optim': functools.partial(<class 'torch.optim.adamw.AdamW'>, amsgrad=True),\n",
       " 'fixed_role_model': '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': True,\n",
       "  'mag_corr': False,\n",
       "  'seq_mag': False,\n",
       "  'cos_loss': False,\n",
       "  'mag_corr_kwargs': {'only_sign': False},\n",
       "  'cos_loss_kwargs': {'only_sign': True, 'cos_matrix': False},\n",
       "  'mse_mag_kwargs': {'target': 0.65, 'multiply': True, 'forgive_over': True}}}"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import ml_utility_loss.loss_learning.estimator.params2 as PARAMS\n",
    "from ml_utility_loss.tuning import map_parameters\n",
    "from ml_utility_loss.loss_learning.estimator.params.default import update_param_space, update_param_space_2\n",
    "import wandb\n",
    "\n",
    "#\"\"\"\n",
    "param_space = {\n",
    "    **getattr(PARAMS, dataset_name).PARAM_SPACE,\n",
    "}\n",
    "params = {\n",
    "    **getattr(PARAMS, dataset_name).BESTS[param_index],\n",
    "}\n",
    "if gp:\n",
    "    params[\"gradient_penalty_mode\"] = \"ALL\"\n",
    "    params[\"mse_mag\"] = True\n",
    "    if gp_multiply:\n",
    "        params[\"mse_mag_multiply\"] = True\n",
    "        #params[\"mse_mag_target\"] = 1.0\n",
    "    else:\n",
    "        params[\"mse_mag_multiply\"] = False\n",
    "        #params[\"mse_mag_target\"] = 0.1\n",
    "else:\n",
    "    params[\"gradient_penalty_mode\"] = \"NONE\"\n",
    "    params[\"mse_mag\"] = False\n",
    "params[\"single_model\"] = False\n",
    "if models:\n",
    "    params[\"models\"] = models\n",
    "if single_model:\n",
    "    params[\"fixed_role_model\"] = single_model\n",
    "    params[\"single_model\"] = True\n",
    "    params[\"models\"] = [single_model]\n",
    "if params[\"fixed_role_model\"] == \"realtabformer\" and dataset_name == \"treatment\":\n",
    "    params[\"batch_size\"] = 2\n",
    "params[\"max_seconds\"] = 3600\n",
    "params[\"patience\"] = 10\n",
    "params[\"epochs\"] = 100\n",
    "if debug:\n",
    "    params[\"epochs\"] = 2\n",
    "with open(\"params.json\", \"w\") as f:\n",
    "    json.dump(params, f)\n",
    "params = map_parameters(params, param_space=param_space)\n",
    "params"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "a48bd9e9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T19:40:31.519124Z",
     "iopub.status.busy": "2024-03-22T19:40:31.518699Z",
     "iopub.status.idle": "2024-03-22T19:40:31.627077Z",
     "shell.execute_reply": "2024-03-22T19:40:31.626131Z"
    },
    "papermill": {
     "duration": 0.125528,
     "end_time": "2024-03-22T19:40:31.629325",
     "exception": false,
     "start_time": "2024-03-22T19:40:31.503797",
     "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:40:31.658594Z",
     "iopub.status.busy": "2024-03-22T19:40:31.658305Z",
     "iopub.status.idle": "2024-03-22T19:40:32.106194Z",
     "shell.execute_reply": "2024-03-22T19:40:32.105218Z"
    },
    "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.464659,
     "end_time": "2024-03-22T19:40:32.108592",
     "exception": false,
     "start_time": "2024-03-22T19:40:31.643933",
     "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:40:32.140112Z",
     "iopub.status.busy": "2024-03-22T19:40:32.139297Z",
     "iopub.status.idle": "2024-03-22T19:40:32.144553Z",
     "shell.execute_reply": "2024-03-22T19:40:32.143580Z"
    },
    "papermill": {
     "duration": 0.023298,
     "end_time": "2024-03-22T19:40:32.146774",
     "exception": false,
     "start_time": "2024-03-22T19:40:32.123476",
     "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:40:32.174755Z",
     "iopub.status.busy": "2024-03-22T19:40:32.174472Z",
     "iopub.status.idle": "2024-03-22T19:40:32.181541Z",
     "shell.execute_reply": "2024-03-22T19:40:32.180624Z"
    },
    "papermill": {
     "duration": 0.023501,
     "end_time": "2024-03-22T19:40:32.183627",
     "exception": false,
     "start_time": "2024-03-22T19:40:32.160126",
     "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:40:32.211912Z",
     "iopub.status.busy": "2024-03-22T19:40:32.211585Z",
     "iopub.status.idle": "2024-03-22T19:40:32.297306Z",
     "shell.execute_reply": "2024-03-22T19:40:32.296393Z"
    },
    "papermill": {
     "duration": 0.102372,
     "end_time": "2024-03-22T19:40:32.299408",
     "exception": false,
     "start_time": "2024-03-22T19:40:32.197036",
     "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:40:32.330193Z",
     "iopub.status.busy": "2024-03-22T19:40:32.329920Z",
     "iopub.status.idle": "2024-03-22T20:47:39.843051Z",
     "shell.execute_reply": "2024-03-22T20:47:39.841995Z"
    },
    "papermill": {
     "duration": 4027.546289,
     "end_time": "2024-03-22T20:47:39.860643",
     "exception": false,
     "start_time": "2024-03-22T19:40:32.314354",
     "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.017401078423782666, 'avg_role_model_std_loss': 1.0339260609464513, 'avg_role_model_mean_pred_loss': 0.0010806548900643828, 'avg_role_model_g_mag_loss': 0.16402181821875275, '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.01764664788174236, 'n_size': 900, 'n_batch': 225, 'duration': 261.55655670166016, 'duration_batch': 1.1624735853407118, 'duration_size': 0.29061839633517794, 'avg_pred_std': 0.1123641776252124}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.016450096456747915, 'avg_role_model_std_loss': 1.6555652437911634, 'avg_role_model_mean_pred_loss': 0.0006544369515005302, '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.016450096456747915, 'n_size': 450, 'n_batch': 113, 'duration': 90.59106540679932, 'duration_batch': 0.8016908443079586, 'duration_size': 0.20131347868177626, 'avg_pred_std': 0.10719071906595697}\n",
      "Epoch 1\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.007544516106006793, 'avg_role_model_std_loss': 0.805866371501884, 'avg_role_model_mean_pred_loss': 0.00011455891246516556, 'avg_role_model_g_mag_loss': 0.05731394776852944, '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.007670205862442446, 'n_size': 900, 'n_batch': 225, 'duration': 262.5022921562195, 'duration_batch': 1.1666768540276422, 'duration_size': 0.29166921350691055, 'avg_pred_std': 0.08921317261954148}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.004202535958288031, 'avg_role_model_std_loss': 0.7761073129848487, 'avg_role_model_mean_pred_loss': 4.496906836265167e-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.004202535958288031, 'n_size': 450, 'n_batch': 113, 'duration': 90.03428149223328, 'duration_batch': 0.796763553028613, 'duration_size': 0.20007618109385172, 'avg_pred_std': 0.058546484567521685}\n",
      "Epoch 2\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.006512888989463035, 'avg_role_model_std_loss': 0.7518540992810281, 'avg_role_model_mean_pred_loss': 0.0001415838299930615, 'avg_role_model_g_mag_loss': 0.049427424324288344, '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.0066497801841857536, 'n_size': 900, 'n_batch': 225, 'duration': 262.3658037185669, 'duration_batch': 1.1660702387491861, 'duration_size': 0.29151755968729653, 'avg_pred_std': 0.09130782820491327}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0055336219292237525, 'avg_role_model_std_loss': 1.1570013584530916, 'avg_role_model_mean_pred_loss': 6.174433674384281e-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.0055336219292237525, 'n_size': 450, 'n_batch': 113, 'duration': 89.11512207984924, 'duration_batch': 0.788629398936719, 'duration_size': 0.1980336046218872, 'avg_pred_std': 0.04651118999973467}\n",
      "Epoch 3\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.006024511704712899, 'avg_role_model_std_loss': 0.4761890591268285, 'avg_role_model_mean_pred_loss': 0.0002143375033454278, 'avg_role_model_g_mag_loss': 0.06465743926004507, '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.0061261716642830935, 'n_size': 900, 'n_batch': 225, 'duration': 260.4550771713257, 'duration_batch': 1.1575781207614475, 'duration_size': 0.2893945301903619, 'avg_pred_std': 0.09767564491679272}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.004724722134932462, 'avg_role_model_std_loss': 0.7707038955945308, 'avg_role_model_mean_pred_loss': 5.621562246012167e-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.004724722134932462, 'n_size': 450, 'n_batch': 113, 'duration': 87.9228572845459, 'duration_batch': 0.7780783830490787, 'duration_size': 0.19538412729899088, 'avg_pred_std': 0.056170098961586444}\n",
      "Epoch 4\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.005286015553380518, 'avg_role_model_std_loss': 0.3363608939476823, 'avg_role_model_mean_pred_loss': 7.321617665753689e-05, 'avg_role_model_g_mag_loss': 0.045423433695816334, '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.005374089340039063, 'n_size': 900, 'n_batch': 225, 'duration': 260.1741499900818, 'duration_batch': 1.1563295555114745, 'duration_size': 0.28908238887786863, 'avg_pred_std': 0.09759037269486322}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.007981064757849607, 'avg_role_model_std_loss': 1.2652324522273108, 'avg_role_model_mean_pred_loss': 9.855836417115466e-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.007981064757849607, 'n_size': 450, 'n_batch': 113, 'duration': 88.88254165649414, 'duration_batch': 0.7865711651017181, 'duration_size': 0.19751675923665366, 'avg_pred_std': 0.04572650106969924}\n",
      "Epoch 5\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.00576256091059703, 'avg_role_model_std_loss': 0.5418789782114618, 'avg_role_model_mean_pred_loss': 7.038583156805957e-05, 'avg_role_model_g_mag_loss': 0.02929313911823556, '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.005917770875255681, 'n_size': 900, 'n_batch': 225, 'duration': 262.8189432621002, 'duration_batch': 1.168084192276001, 'duration_size': 0.29202104806900026, 'avg_pred_std': 0.09744484349257417}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0038669909037222774, 'avg_role_model_std_loss': 1.1829836725373764, 'avg_role_model_mean_pred_loss': 2.4478697872928952e-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.0038669909037222774, 'n_size': 450, 'n_batch': 113, 'duration': 90.46491193771362, 'duration_batch': 0.8005744419266693, 'duration_size': 0.20103313763936362, 'avg_pred_std': 0.047730479976656824}\n",
      "Epoch 6\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0038541355246626253, 'avg_role_model_std_loss': 0.3181302580921152, 'avg_role_model_mean_pred_loss': 2.260195795584597e-05, 'avg_role_model_g_mag_loss': 0.02967498921504658, '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.003917783604055229, 'n_size': 900, 'n_batch': 225, 'duration': 261.9046974182129, 'duration_batch': 1.1640208774142795, 'duration_size': 0.2910052193535699, 'avg_pred_std': 0.10003261071940263}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0038603629919493365, 'avg_role_model_std_loss': 1.908042863952322, 'avg_role_model_mean_pred_loss': 1.606306340802302e-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.0038603629919493365, 'n_size': 450, 'n_batch': 113, 'duration': 90.71723699569702, 'duration_batch': 0.8028074070415666, 'duration_size': 0.20159385999043783, 'avg_pred_std': 0.05183640702017706}\n",
      "Epoch 7\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.003702066924338902, 'avg_role_model_std_loss': 0.2994743646377197, 'avg_role_model_mean_pred_loss': 2.3150445486223394e-05, 'avg_role_model_g_mag_loss': 0.018106737517001523, '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.0037678834933709974, 'n_size': 900, 'n_batch': 225, 'duration': 260.3814172744751, 'duration_batch': 1.1572507434421115, 'duration_size': 0.2893126858605279, 'avg_pred_std': 0.10073738541454076}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0028049794745553906, 'avg_role_model_std_loss': 1.4249755061280251, 'avg_role_model_mean_pred_loss': 1.3086192913582816e-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.0028049794745553906, 'n_size': 450, 'n_batch': 113, 'duration': 90.54383492469788, 'duration_batch': 0.8012728754398042, 'duration_size': 0.20120852205488418, 'avg_pred_std': 0.054640445479117665}\n",
      "Epoch 8\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0033579401259905555, 'avg_role_model_std_loss': 0.3882562007228762, 'avg_role_model_mean_pred_loss': 1.8571260889600453e-05, 'avg_role_model_g_mag_loss': 0.031065790198707772, '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.0034128941754655293, 'n_size': 900, 'n_batch': 225, 'duration': 261.0693860054016, 'duration_batch': 1.1603083822462295, 'duration_size': 0.29007709556155736, 'avg_pred_std': 0.10073215851146314}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.004292678962616871, 'avg_role_model_std_loss': 2.506649698973513, 'avg_role_model_mean_pred_loss': 4.666494623541402e-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.004292678962616871, 'n_size': 450, 'n_batch': 113, 'duration': 89.04813385009766, 'duration_batch': 0.788036582744227, 'duration_size': 0.1978847418891059, 'avg_pred_std': 0.05573896699857}\n",
      "Epoch 9\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0032293959062533557, 'avg_role_model_std_loss': 0.4635296431291696, 'avg_role_model_mean_pred_loss': 1.8672718882848967e-05, 'avg_role_model_g_mag_loss': 0.023970585422034167, '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.003291322695731651, 'n_size': 900, 'n_batch': 225, 'duration': 260.9506549835205, 'duration_batch': 1.1597806888156468, 'duration_size': 0.2899451722039117, 'avg_pred_std': 0.10359380051907566}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.002744582254672423, 'avg_role_model_std_loss': 2.2099234429464625, 'avg_role_model_mean_pred_loss': 2.5944116722460305e-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.002744582254672423, 'n_size': 450, 'n_batch': 113, 'duration': 89.43556237220764, 'duration_batch': 0.7914651537363508, 'duration_size': 0.19874569416046142, 'avg_pred_std': 0.05300469076635926}\n",
      "Epoch 10\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0026384538486470574, 'avg_role_model_std_loss': 0.23855205940207644, 'avg_role_model_mean_pred_loss': 1.205315517315884e-05, 'avg_role_model_g_mag_loss': 0.024326985160069953, '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.0026762135176815922, 'n_size': 900, 'n_batch': 225, 'duration': 263.52970361709595, 'duration_batch': 1.1712431271870931, 'duration_size': 0.2928107817967733, 'avg_pred_std': 0.10776877377182245}\n",
      "Time out: 3785.1640882492065/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.002836061065248768, 'avg_g_mag_loss': 0.04869947255703835, 'avg_g_cos_loss': 0.010633710139164967, 'pred_duration': 4.068113565444946, 'grad_duration': 12.533695220947266, 'total_duration': 16.601808786392212, 'pred_std': 0.1082986444234848, 'std_loss': 0.0010494085727259517, 'mean_pred_loss': 9.070246051123831e-06, 'pred_rmse': 0.05325468257069588, 'pred_mae': 0.04161286726593971, 'pred_mape': 0.12254984676837921, 'grad_rmse': 0.1400071233510971, 'grad_mae': 0.03379097580909729, 'grad_mape': 0.8471567034721375}, '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.002836061065248768, 'avg_g_mag_loss': 0.04869947255703835, 'avg_g_cos_loss': 0.010633710139164967, 'avg_pred_duration': 4.068113565444946, 'avg_grad_duration': 12.533695220947266, 'avg_total_duration': 16.601808786392212, 'avg_pred_std': 0.1082986444234848, 'avg_std_loss': 0.0010494085727259517, 'avg_mean_pred_loss': 9.070246051123831e-06}, 'min_metrics': {'avg_loss': 0.002836061065248768, 'avg_g_mag_loss': 0.04869947255703835, 'avg_g_cos_loss': 0.010633710139164967, 'pred_duration': 4.068113565444946, 'grad_duration': 12.533695220947266, 'total_duration': 16.601808786392212, 'pred_std': 0.1082986444234848, 'std_loss': 0.0010494085727259517, 'mean_pred_loss': 9.070246051123831e-06, 'pred_rmse': 0.05325468257069588, 'pred_mae': 0.04161286726593971, 'pred_mape': 0.12254984676837921, 'grad_rmse': 0.1400071233510971, 'grad_mae': 0.03379097580909729, 'grad_mape': 0.8471567034721375}, 'model_metrics': {'lct_gan': {'avg_loss': 0.002836061065248768, 'avg_g_mag_loss': 0.04869947255703835, 'avg_g_cos_loss': 0.010633710139164967, 'pred_duration': 4.068113565444946, 'grad_duration': 12.533695220947266, 'total_duration': 16.601808786392212, 'pred_std': 0.1082986444234848, 'std_loss': 0.0010494085727259517, 'mean_pred_loss': 9.070246051123831e-06, 'pred_rmse': 0.05325468257069588, 'pred_mae': 0.04161286726593971, 'pred_mape': 0.12254984676837921, 'grad_rmse': 0.1400071233510971, 'grad_mae': 0.03379097580909729, 'grad_mape': 0.8471567034721375}}}\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:47:39.896618Z",
     "iopub.status.busy": "2024-03-22T20:47:39.896258Z",
     "iopub.status.idle": "2024-03-22T20:47:39.900756Z",
     "shell.execute_reply": "2024-03-22T20:47:39.899964Z"
    },
    "papermill": {
     "duration": 0.024824,
     "end_time": "2024-03-22T20:47:39.902718",
     "exception": false,
     "start_time": "2024-03-22T20:47:39.877894",
     "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:47:39.935797Z",
     "iopub.status.busy": "2024-03-22T20:47:39.934952Z",
     "iopub.status.idle": "2024-03-22T20:47:40.035705Z",
     "shell.execute_reply": "2024-03-22T20:47:40.034557Z"
    },
    "papermill": {
     "duration": 0.119826,
     "end_time": "2024-03-22T20:47:40.038220",
     "exception": false,
     "start_time": "2024-03-22T20:47:39.918394",
     "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:47:40.073678Z",
     "iopub.status.busy": "2024-03-22T20:47:40.073343Z",
     "iopub.status.idle": "2024-03-22T20:47:40.372089Z",
     "shell.execute_reply": "2024-03-22T20:47:40.371184Z"
    },
    "papermill": {
     "duration": 0.319285,
     "end_time": "2024-03-22T20:47:40.374396",
     "exception": false,
     "start_time": "2024-03-22T20:47:40.055111",
     "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:47:40.411928Z",
     "iopub.status.busy": "2024-03-22T20:47:40.411581Z",
     "iopub.status.idle": "2024-03-22T20:51:46.581079Z",
     "shell.execute_reply": "2024-03-22T20:51:46.579998Z"
    },
    "papermill": {
     "duration": 246.190558,
     "end_time": "2024-03-22T20:51:46.583679",
     "exception": false,
     "start_time": "2024-03-22T20:47:40.393121",
     "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:51:46.621064Z",
     "iopub.status.busy": "2024-03-22T20:51:46.620162Z",
     "iopub.status.idle": "2024-03-22T20:51:46.642273Z",
     "shell.execute_reply": "2024-03-22T20:51:46.641271Z"
    },
    "papermill": {
     "duration": 0.042627,
     "end_time": "2024-03-22T20:51:46.644305",
     "exception": false,
     "start_time": "2024-03-22T20:51:46.601678",
     "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.005347</td>\n",
       "      <td>0.080971</td>\n",
       "      <td>0.002836</td>\n",
       "      <td>12.467301</td>\n",
       "      <td>0.033791</td>\n",
       "      <td>0.847157</td>\n",
       "      <td>0.140007</td>\n",
       "      <td>0.000009</td>\n",
       "      <td>4.109843</td>\n",
       "      <td>0.041613</td>\n",
       "      <td>0.12255</td>\n",
       "      <td>0.053255</td>\n",
       "      <td>0.108299</td>\n",
       "      <td>0.001049</td>\n",
       "      <td>16.577143</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.005347        0.080971  0.002836      12.467301  0.033791   \n",
       "\n",
       "         grad_mape  grad_rmse  mean_pred_loss  pred_duration  pred_mae  \\\n",
       "lct_gan   0.847157   0.140007        0.000009       4.109843  0.041613   \n",
       "\n",
       "         pred_mape  pred_rmse  pred_std  std_loss  total_duration  \n",
       "lct_gan    0.12255   0.053255  0.108299  0.001049       16.577143  "
      ]
     },
     "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:51:46.679178Z",
     "iopub.status.busy": "2024-03-22T20:51:46.678852Z",
     "iopub.status.idle": "2024-03-22T20:51:47.043914Z",
     "shell.execute_reply": "2024-03-22T20:51:47.043067Z"
    },
    "papermill": {
     "duration": 0.384847,
     "end_time": "2024-03-22T20:51:47.046035",
     "exception": false,
     "start_time": "2024-03-22T20:51:46.661188",
     "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:51:47.083119Z",
     "iopub.status.busy": "2024-03-22T20:51:47.082278Z",
     "iopub.status.idle": "2024-03-22T20:55:57.990842Z",
     "shell.execute_reply": "2024-03-22T20:55:57.989788Z"
    },
    "papermill": {
     "duration": 250.930339,
     "end_time": "2024-03-22T20:55:57.993924",
     "exception": false,
     "start_time": "2024-03-22T20:51:47.063585",
     "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:55:58.031362Z",
     "iopub.status.busy": "2024-03-22T20:55:58.031011Z",
     "iopub.status.idle": "2024-03-22T20:55:58.057419Z",
     "shell.execute_reply": "2024-03-22T20:55:58.056562Z"
    },
    "papermill": {
     "duration": 0.047546,
     "end_time": "2024-03-22T20:55:58.059612",
     "exception": false,
     "start_time": "2024-03-22T20:55:58.012066",
     "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:55:58.094102Z",
     "iopub.status.busy": "2024-03-22T20:55:58.093810Z",
     "iopub.status.idle": "2024-03-22T20:55:58.099460Z",
     "shell.execute_reply": "2024-03-22T20:55:58.098484Z"
    },
    "papermill": {
     "duration": 0.0258,
     "end_time": "2024-03-22T20:55:58.101597",
     "exception": false,
     "start_time": "2024-03-22T20:55:58.075797",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'lct_gan': 0.3770567048447473}\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:55:58.139403Z",
     "iopub.status.busy": "2024-03-22T20:55:58.138694Z",
     "iopub.status.idle": "2024-03-22T20:55:58.530094Z",
     "shell.execute_reply": "2024-03-22T20:55:58.529245Z"
    },
    "papermill": {
     "duration": 0.412474,
     "end_time": "2024-03-22T20:55:58.532159",
     "exception": false,
     "start_time": "2024-03-22T20:55:58.119685",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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R1FRETQaTYyiHVzUajXkcjmqq6vhdru77WWWjM40deJorRnleXqMG2IUOxziJ2oi6ujowPXXX485c+Zg69atyM7OxtmzZ7vtYdUf9Fe8f1Lp59dhc+PzY43w8QyX2u3I0SuRY0j+5JoKRE1Ezz//PIqKilBRURE81nUbGUJi6WidGT7+8mITh2pMuHlsnogRkQBR/9z97W9/w7XXXos77rgDOTk5mDx5Mt54441ez3e5XLBYLCEfhITrXLMVADCpOA0AUNVqow0WBwhRE9GFCxewceNGlJWVYdu2bfjZz36GRx99NLgtzZXWr18Po9EY/KAJr/1XUlISXBM6lTHGMK00A2MKDPheaSay9EqMyNHB46NENBCIWjXjeR7XXnstfv/73wMAJk+ejGPHjuG//uu/sGzZsm7nr127FqtXrw5+HZhQR8jVcByHcUOMwQbqe783VOSISFeilojy8/MxZsyYkGOjR4/GpUuXejxfqVQGJ7jSRNfL3G632CEQ0i+iJqLrr78ep0+fDjl25syZ4B7o8eL28r1+eH182Od6wjg3GrNnz8YjjzyCRx55BEajEVlZWfjNb34TbM8oKSnBc889h/vuuw8GgwEPPfQQAOBf//oXZs6cCbVajaKiIjz66KOw2WzB6zY3N2Px4sVQq9UoLS3FO++8E1V8yehiqw2NZmfI++vjGTpslMQHAlGrZr/85S9x3XXX4fe//z1+9KMf4ZtvvsFf/vIX/OUvf4nr6/75i3O9PleapcXSyUOCX/9l9/le2xEK09W449rLVcNNe6rgcIdOJfnl90dGFeNbb72FBx54AN988w2+/fZbPPTQQyguLsaDDz4IAHjxxRfx1FNP4emnnwYAnD9/HvPnz8dvf/tbbNq0CS0tLcFkFuiVXL58Oerr6/HFF19ALpfj0UcfRXNzc1TxJZsdJ5pgdXlx59QiFKSpYbZ78NbXFyGVcPj57OE02FVkoiaiqVOn4uOPP8batWvx7LPPorS0FK+++iruueceMcMaEIqKivDKK6+A4ziUl5fj6NGjeOWVV4KJ6KabbsKvfvWr4PkrV67EPffcg8cffxwAUFZWhj/84Q+YNWsWNm7ciEuXLmHr1q345ptvMHXqVADAm2++idGjRyf83hLN6fHB6vICADJ1wlQVrVIKnjH4vAx2tw9apehjewc10X/6t956K2699daEvuaqOSN6fU5yxR/Gh24c3uu5V/4RXXF97MZAfe973wv5Kz1jxgy89NJLwcm7V448P3z4MI4cORJS3WKMBae6nDlzBjKZLGTLnlGjRiEtLS1mMQ9UrVYXAMCglkMpkwIAZFIJ9Co5LA4PTA4PJSKRDcqfvkIWftNYvM7tL61WG/K11WrFww8/jEcffbTbucXFxThz5kyiQhtwTHYPACBdIw85nqYWElGHzY0haWoxQiN+gzIRJYN9+/aFfL13716UlZVBKpX2eP6UKVNw4sQJjBjRc2lv1KhR8Hq9OHDgQLBqdvr0aZhMppjGPRBZHEIiMqpDE1G6Vo5L7YDZ/zwRT+pMJEoxly5dwurVq3H69Gm89957+OMf/4jHHnus1/OfeOIJ/N///R8eeeQRHDp0CGfPnsWnn36KRx55BABQXl6O+fPn4+GHH8a+fftw4MABrFy5Emp16pcEzL0kIqNaaC8KlJiIeCgRDVD33XcfHA4Hpk2bhlWrVuGxxx4LdtP3ZMKECfjyyy9x5swZzJw5E5MnT8ZTTz2FgoKC4DkVFRUoKCjArFmzcPvtt+Ohhx5CTk5OIm5HVBankGgM3RKRPOR5Ip6k3nLaYrHAaDTCbDZ3G9zodDpRVVWF0tLSpFu+Yvbs2Zg0adKAmHqRzD/HgJp2O9psbgzL1sKgupyM2m1u7L/YjkytAteWZIgYYerq63e0K2ojIimvKEODoozua1JlaBW4hWbfDwhUNSOEiI5KRAPQrl27xA4hZZjtHjRanEjXyHtcBM3r42Fz+aCUS6CS99wjSeKPSkQkpV1qt+PvRxvw9YW2Hp//+Ls6bNpTheo22mBBTJSISEoLTO3QKnou/OtVwvFO6jkTFSUiktICiUin6jkR6ZRCL1qn/zwiDkpEJKXZAomol7lkgQRldVIiEhMlIpLSglWz3hKRUmigtrspEYmJEhFJaVcrEan9bUc2F21JLiZKRCRleX087P6F6npLRFqFUCJyeCgRiYnGEZGUxXEcFk8sgM3lhUre899cjUKGsQUGaJUy8DyD5MoFqUhCUCIiKUsq4TAiR9fnOQqZhDZZHAAGV9WMMcDrTvxHBPOKN2/ejMzMTLhcrpDjS5cuxb333hvrnwghA8LgKhH5PMBXLyX+dWf+CpApwjr1jjvuwKOPPoq//e1vuOOOOwAIu2989tln2L59ezyjTDnNFic67B5k6RTI1Cl7Pc/j42GnaR6iGlwloiSgVqtx9913B3feAIC3334bxcXFmD17tniBJaFTjZ34+9EGHK0z93ne1mON2LSnCmeaOhMUGbnS4CoRSeVC6USM143Agw8+iKlTp6Kurg5DhgxBZWUlli9fTlveRCgwNqi3HrOAQM8ZdeGLZ3AlIo4Lu4okpsmTJ2PixInYvHkzbr75Zhw/fhyfffaZ2GElnUDXvVrRd3Ur8DwNahTP4EpESWTlypV49dVXUVdXh3nz5qGoqOjq30RCBBKRppcJrwGBCbF2N5WIxEJtRAPU3XffjdraWrzxxhtYsWKF2OEkpcCuu9qrlIi0NM1DdKImomeeeQYcx4V8jBo1SsyQBgyj0Ygf/vCH0Ol0WLp0qdjhJB3GWARVM5rmITbRq2Zjx47FP/7xj+DXMpnoIQ0YdXV1uOeee6BU9t71THrm8vLg/eO31Ffpkg887/RSIhKL6L/1MpkMeXk0srWrjo4O7Nq1C7t27cJ//ud/ih1OUpJJhOkdTo8PMmnfBX+NQopxQ4xQy6VgjFHvpAhET0Rnz55FQUEBVCoVZsyYgfXr16O4uLjHc10uV8iIY4vFkqgwE2ry5Mno6OjA888/j/LycrHDSUoyqeSq0zsCVHIpvj8mN84Rkb6ImoimT5+OyspKlJeXo6GhAevWrcPMmTNx7Ngx6PX6buevX78e69atEyHSxLp48aLYIRCSUANqg0WTyYShQ4fi5ZdfxgMPPNDt+Z5KREVFRSm3weJAkqw/x5ZOF9ptbmRoFcjWX72NzeX1wenmoVJIoJTRNI9YScoNFtPS0jBy5EicO3eux+eVSmXEDbcDKM8mpWT9+Z1rtmLvhTZMKDRi7uirV7s+/a4edSYHbp2Qj7Lc7qVxEl8DahyR1WrF+fPnkZ+f3+9ryeXCtAq7nbaJ6Y/Azy/w80wWDo8wJuhqXfcBKlogTVSilojWrFmDxYsXY+jQoaivr8fTTz8NqVSKH//4x/2+tlQqRVpaGpqbmwEAGo2GekMiwBiD3W5Hc3Mz0tLSIJUmV3Ul3FHVASqZ8DfZQaOrRSFqIqqtrcWPf/xjtLW1ITs7GzfccAP27t2L7OzsmFw/MCwgkIxI5NLS0pJyeMXlRBReAlVTiUhUoiaiLVu2xPX6HMchPz8fOTk58HhoA71IyeXypCsJBQRKNlcbzBgQHNTo4eMWE+ndgGqsjhepVJq0v1AkOpGWiFTBREQlIjEMqMZqQmLBx7NgQgm3jYiqZuIaFCUiMvjcNqkAdpev1907rpSuUWD8ECPStcnVO5gqKBGRlCOVcBie3cv0DsYAUzXgsgKZIwC5MEgzQ6vAPJrmIRpKRGTwYAw49w+g9lvha5UBmHIfoKQBjGKjNiKSctptbpxqtKDZ4gx9ovWMkIQ4DpCrAacFOPX34NMurw9muwc+PjlHkyczSkQk5VS12rD1aCMOVHdcPsjzwPkvhM+LvyeUhCRSoP0CYK4FAFTsuYhNe6rQbnOLEPXgRomIpBxHTysztl8AHB1Cm1DxDECTAeSOFZ6rPyScT134oqFERFJOYO3pkK77hkPCY954QOafOJ03QXhsPQ34PJSIRESJiKQch+eKwYxel1AiAoC8iZdPNBYCKqOwLXj7BSj9Xf00ujrxKBGRlNNt0fz2KoD3CdUxXZd5jBwHZJUFz1HR2tWioUREUk636R1tZ4XHzOHdT04vER47LtI0DxFRIiIphTEGR6CNSC4Txg4FqmWZZd2/Ia0Y4CSAowNa3gqAqmZioAGNJOUsGJ8Ph9snbJxobwPcdkAqE9qEriRTAvpcwNKAAkk7xg8pxJB0deKDHuQoEZGUwnFXTO8wXRIeDUOEcUM90RcIiYjrQMGYa+IfJOmGqmYktZlrhEdjUe/nGAqEx876+MdDekSJiKQUk92Nkw0WNJr90zv8o6Z7rJYF+BMR62yE0+WG2UGL6CUaJSKSUmo7HPj8WCP2VbUBDpMwn4yTCFWz3qjTAbkKLpcbm3fsx9t7qxMWLxFQIiIpxd51idjOBuGgLgeQKXr/Jo4DdLmQSTloPO1we3l4fdRzlkiUiEhKCZneEUhE+jC2p9JmQyrhoPW2AwBcXkpEiUSJiKSUkAmvnU3CQX0YC55ps8CBg8FnAkCDGhONEhFJKcFR1XIJYG0UDoZVIsoRTg0kIioRJRQlIpJSAlUzHbMCHqcwdkgbxj552iwAgJo5IPM5qUSUYAMmEW3YsAEcx+Hxxx8XOxSSxIIlIneLcECb3ftAxq5kSkBlDDZYUyJKrAExsnr//v14/fXXMWHCBLFDIUnu+2NyYXf7oLf516XWR7BLrS4HaepGTEh3I03TRy8biTnRS0RWqxX33HMP3njjDaSnp4sdDklyw7J1GDfECIXDXyKKJBFpMpFvVGNqDjAkjeabJZLoiWjVqlVYtGgR5s2bd9VzXS4XLBZLyAchPbK1Co/htA8FaDKER0d77OMhfRK1arZlyxYcPHgQ+/fvD+v89evXY926dXGOiiQri9ODug4HjHIfClydwkFNVvgXUGeAgcFrbYXH7Q17l1jSf6KViGpqavDYY4/hnXfegUqlCut71q5dC7PZHPyoqamJc5QkmTSYnPj8WCMOnjwnHFDqghsohkWTgZZOF749VY3tR2vjEyTpkWgp/8CBA2hubsaUKVOCx3w+H3bv3o0//elPcLlckEpDezuUSiWUSmWiQyVJwubvujfyZuFAJNUyAJBrIFWoANjA200xjY30TbRENHfuXBw9ejTk2P33349Ro0bhiSee6JaECLmawKhqQyARRVItAwCOg0SbCaCN2okSTLREpNfrMW7cuJBjWq0WmZmZ3Y4TEo7AGCKtzwRIAWgzI76GTCs0WHOOjqucSWJJ9F4zQmIlOOHVYxIORFoiAiDTCd8jdbaDMdp6OlEGVLfArl27xA6BJDGH2wcp74bKZwWgCE7biIRcJ5SilB4zXF4+uLMHiS8qEZGUYXP7oPZ0QC7l/D1mkQ9KlOkyIeUAtdcMF+3mkTADqkRESH/MHZUDb1091K3SqKplAAB1BrL0SgA8JMwNQB7LEEkvKBGRlFGSpQVMTqBdElW1DAAgV2FYXqawTTWzA9DGNEbSs6iqZhcuXIh1HITEhr1NeNRE3mMWpE4THp3mfodDwhNVIhoxYgTmzJmDt99+G06nM9YxERIxq8uLkw0WmFr9y8NGWyICwJRGeHkebltbjKIjVxNVIjp48CAmTJiA1atXIy8vDw8//DC++eabWMdGSNgazU5sP1KDmnp/Ioq2jQjAwRZg/8UOXLhE+5wlSlSJaNKkSXjttddQX1+PTZs2oaGhATfccAPGjRuHl19+GS0tLbGOk5A+Obr2mCm0gEIT9bUkaiMAgHeYYhQduZp+dd/LZDLcfvvt+OCDD/D888/j3LlzWLNmDYqKinDfffehoaEhVnES0ie72wuNpwNyaT8aqv2kWv+6WE4aXZ0o/UpE3377LX7+858jPz8fL7/8MtasWYPz589jx44dqK+vx5IlS2IVJyF9snt8UHtNQiLqR7UMAKTBxmoLQKOrEyKq7vuXX34ZFRUVOH36NBYuXIjNmzdj4cKFkEiEvFZaWorKykqUlJTEMlZCemV3+atmGi6qOWZdyf0lIuZxAh5Hv6p5JDxRJaKNGzdixYoVWL58OfLze96qJScnB2+++Wa/giMkXHa3F9mBqlk/S0QqpQpuqQZe3iV04VMiiruoEtGOHTtQXFwcLAEFMMZQU1OD4uJiKBQKLFu2LCZBEnI1LpcTSm8n5FJD5OsQXUEll8Al08PrdQJOE2AIY1800i9RtRENHz4cra2t3Y63t7ejtLS030EREqk5hVIMz9ZCrdP3uwSjVcqQmZmDDJ2CBjUmSFQlot6WR7BarWEv+0pILA1R2gC9CtDn9PtaWqUM15SXANX1AHXhJ0REiWj16tUAAI7j8NRTT0GjufyXx+fzYd++fZg0aVJMAyQkLMFdO/rXPhRE0zwSKqJE9N133wEQSkRHjx6FQnF5EzqFQoGJEydizZo1sY2QkKuwurzoqKuB0emBoZ8N1QFMaYCP58HZO0ArEsVfRInoiy++ACCsLf3aa6/BYDDEJShCItFkcaKmqgqZUgfGx6hEtOVYJ0oudmDMEMDIGMBxMbku6VlUbUQVFRWxjoOQqNkcDii9VsgVsphVzaQqIxg4eL0ewG0FlPqYXJf0LOxEdPvtt6OyshIGgwG33357n+d+9NFH/Q6MkHC5zC0AGKRKLSCPzZgfpUIGt0wLr48J7USUiOIq7ERkNBrB+YunRqMxbgEREilfpzDJWqLLilkVSiWXwiXVw8ubhURkLIzJdUnPwk5EXatjVDUjA4nP1gIJAKmufwMZu1LJpTDL9PDyHdRzlgBRDWh0OByw2+3Br6urq/Hqq69i+/btMQuMkHAxq9B1L9fHMBHJ/KOrA1UzEldRJaIlS5Zg8+bNAACTyYRp06bhpZdewpIlS7Bx48aYBkjI1XB2IREp03Jjdk2haqaDl6dElAhRr9A4c+ZMAMCHH36IvLw8VFdXY/PmzfjDH/4Q0wAJ6ZPPg7HpPIZna6HPzIvZZTO0ChTk5UGvklEiSoCoEpHdbodeL/QibN++HbfffjskEgm+973vobq6OuzrbNy4ERMmTIDBYIDBYMCMGTOwdevWaEIig5W9DWlqOXIy0qBUx25cW1GGBjdNKkOBUU3rEiVA1Ivnf/LJJ6ipqcG2bdtw8803AwCam5sjGuRYWFiIDRs24MCBA/j2229x0003YcmSJTh+/Hg0YZHBKDi1Izv2gw6VBoCTALxXGEtE4iaqRPTUU09hzZo1KCkpwfTp0zFjxgwAQulo8uTJYV9n8eLFWLhwIcrKyjBy5Ej87ne/g06nw969e6MJiwxCnW0NaO50oh2xH+XPOA4euX9fM6qexVVUI6v/7d/+DTfccAMaGhowceLE4PG5c+fiBz/4QVSB+Hw+fPDBB7DZbMHEdiWXywWXyxX82mKxRPVaJHV0tNSjrsUGt16OWTG8rsvrw8Zd5zG60YV5BQxSGksUV1Hv9JqXl4e8vNDGwWnTpkV8naNHj2LGjBlwOp3Q6XT4+OOPMWbMmB7PXb9+PdatWxdVvCQ1+azCYEaprv/Lf3SlkErAgYNLpoePdwqJiMRNVInIZrNhw4YN2LlzJ5qbm8HzfMjzkewEW15ejkOHDsFsNuPDDz/EsmXL8OWXX/aYjNauXRtcigQQSkRFRUXR3AJJBV43eLuw04bCENtExHFccKVGj68JCkpEcRVVIlq5ciW+/PJL3HvvvcjPzw9O/YiGQqHAiBEjAADXXHMN9u/fj9deew2vv/56t3OVSiWUSmXUr0VSjL0Vbi8Pj0QNgz72bUTBsUQ0qDHuokpEW7duxWeffYbrr78+1vGA5/mQdiBCemVrhcvLw6FIh0Elj/nlVXIJrDI9fDxPiSjOokpE6enpyMjI6PeLr127FgsWLEBxcTE6Ozvx7rvvYteuXdi2bVu/r01SH7O1wO31wa5MFwYexphKLkWbTAevh10eS0TrEsVFVN33zz33HJ566qmQ+WbRaG5uxn333Yfy8nLMnTsX+/fvx7Zt2/D973+/X9clg4PH0gwfAxzydOiUsU9ESpkUbqkWHh40lijOonr3XnrpJZw/fx65ubkoKSmBXB5aLD548GBY16F9z0h/SB1tGJ2vR9aIkZBJ+7VpcY/yjSr4+DQomowAXLQuURxFlYiWLl0a4zAIiZDXBam7E2lqBdLitIXVxKI0TCxKA77LAUw1tC5RHEWViJ5++ulYx0FIZKzNwqNSB8jV8X0tlRFADTVYx1HU5VmTyYT//u//xtq1a9He3g5AqJLV1dXFLDhCemVthtnhQa3XgHabO24vw/MMbrm/OkaJKG6iKhEdOXIE8+bNg9FoxMWLF/Hggw8iIyMDH330ES5duhRcq4iQuLE2obnTicM2GUpbrcjQ9r8X90qX2uz46LtalPFOLJKDElEcRVUiWr16NZYvX46zZ8+G7Oy6cOFC7N69O2bBEdIraxNcXh42RSb0cRhDBABKuQSMAZ2gia/xFlUi2r9/Px5++OFux4cMGYLGxsZ+B0VIn3gfYGuBy8PDJs+My2BGAFDJhK0VrcFEROsSxUtUiUipVPY48/3MmTPIzo7dusGE9MjeBp/PCweTwiUzwKiOX4kIAKxQw8dAY4niKKpEdNttt+HZZ5+Fx+MBIEwQvHTpEp544gn88Ic/jGmAhHRjbYLL44NNngmlQgqVPPZjiABAKZOA4wDGSeGV64SDTlp6Jh6iegdfeuklWK1WZGdnw+FwYNasWRgxYgT0ej1+97vfxTpGkmBv763GP040wccP0GqItQlODw+7IhNpakW/Jl33RZiBL1TP3DLqOYunqHrNjEYjduzYgT179uDw4cOwWq2YMmUK5s2bF+v4iAicHh+O1pkhkQA3jYrdzhgxY22G0+uDTZ6F9DhVywJUMgkcbh9cMh30ACWiOIk4EfE8j8rKSnz00Ue4ePEiOI5DaWkp8vLywBiL218nkjg3jszGZ0cacLjGjDH5RuQZVVf/pkRhDOhsQLZOiVkjx0FuTI/ryw3N1CJb74NUmgZYQYkoTiKqmjHGcNttt2HlypWoq6vD+PHjMXbsWFRXV2P58uVRLxNLxPf1+TbUmRxgjGFkrh6j84X1ffZVtYkc2RXsbYDXDblCgaLCoXFPknNG5WDRhHykZ/g7YSgRxUVEJaLKykrs3r0bO3fuxJw5c0Ke++c//4mlS5di8+bNuO+++2IaJImvlk4X9l5ow/6L7XjoxmFQyaWYVpqBU40WXGixwWR3I02jEDtMgcU/cl+fD0ji00jdI5VReKREFBcRvZPvvfce/v3f/71bEgKAm266CU8++STeeeedmAVHEuNcs9AlXZKlDTbOZmgVGJqpAQCcqB9APUWWejDGcNyqw4l6S0Ia1HmewSP3rwDpNNNYojiIKBEdOXIE8+fP7/X5BQsW4PDhw/0OiiRWTbuwrlRppjbk+NgCoRRwosECNlB++Sz1cHl5fNuuxs6TTZDEuUnyQHUH/vDPs/jiokNYFI33Am5bfF90EIqoatbe3o7c3N57UXJzc9HR0dHvoEjiuLw+NJidAIDiDE3Ic8OytJhVno3h2bqB0QnhdQO2Fjg8PlgV2UjTxq/rPkAhFaZ5OLwQ1iJyWvzrEuni+rqDTUQlIp/PB5ms99wllUrh9Xr7HRRJnAaTEzxjMKrlMGpCu8JlUgmmFKfHbeRyxDobAMZghRpumQ6Z2vi3W6kVwq+I0+OjdqI4iqhExBjD8uXLe91Jgxa9Tz5NFqE0lD+Quuh7Y7oEAGiTCVsHZSQkEQm/Ina3D9DRukTxElEiWrZs2VXPoR6z5NJqFdbyyQ0kIt4HXPwX0NkIZJcD+RNxqqkTpxs7MWNYJnIMIiYsfyJq4oTmgYSUiPyN9w4qEcVVRImooqIiXnEQkSwcn4cZwzOhlPlr6Sf/B2g+KXzefgHwOnHOVIwLLTZk6ZTiJSKfV+gxA0MtsgAkqETkT0QuDw+fwgApQIkoDhI4EIMMRBzHIUOrgFYpA9rOC0mIkwC5Y4UTqnZjpE4oNV1oEXHmuaUO4L1wSTSwwAAJxyVkbJNKLgnuIOSk+WZxE/s9WEjyqt0vPA65BhgxF/A6gbbzKLEfgYQbjVarW7zBjaZqAIAyqwQrSofB4vRAGu++ewiJeni2DlIJB6b0N9oHxhINhJ7EFEGJaBA7Xm/GpTY7RubpMVznAdqrhF+uwmuEx5IbgLbzULSdwlB9OaosHM632HDNUBESUds5AACXMQxGTfcevnhaPLFA+IT3hY4loi78mBG1arZ+/XpMnToVer0eOTk5WLp0KU6fPi1mSINKTbsdpxo70WZ1Ay3+n3vaUEDtn0hqKBC2z+F9GC0RGorPi1E9c1qAziYhCWQOT/zrB0ikl/c1o+pZTImaiL788kusWrUKe/fuxY4dO+DxeHDzzTfDZqORq4kQ6DHL1CmCJQ5kjww9KW8cAKDYcwEAUG9ywOH2JSxGAJdjMxRg53kr9l5oS3gMPM/g9fHUcxYnolbNPv/885CvKysrkZOTgwMHDuDGG28UKarBgecZOvzb8GQqfIC5Vngi44oSR/Yo4OwOqF3tKFJawWuyYXd7oVZIExesPxG50objyHkhAUwqSkvYy395pgXfXerA9NJMzKA9zuJiQLURmc3Cm5uR0fPWMC6XK2TQZE/rZpPwmB0eeHkGuZSD0d0oNL5qMgF1WuiJcjWQMQxoPYsfFNogHTYlsYG6bULbFYBWZTEABwxqeXBybiLIJZwwzcPjpRJRnAyY7nue5/H444/j+uuvx7hx43o8Z/369TAajcGPoqKiBEeZOtpsQkLP0CrBBUpDab38PLPKAADS9nOJCC1U0wmA8YAhH41eoXE4R9/zyP54CZT+HG6qmsXLgElEq1atwrFjx7Bly5Zez1m7di3MZnPwo6amJoERppY2f/tQhlZxuVrW277uGcOFhuLORsDVCYfbB4vTE/8gGQMajwif544PTkcRLRHR6Oq4GRBVs0ceeQT/+7//i927d6OwsJdfBgjbGPU2z41ExunlIeE4ZKo5oK1JONhbIlLqhIXILPU4eew7bOvIw7gCI+aNifN61qZqYY97qQzIGY36KmHPvHxjnPe6v0Jwmof7iqoZjSWKGVFLRIwxPPLII/j444/xz3/+E6WlpWKGM6jMGpmNR24agYlGhzA+RqkDVGm9f4O/epbtqgZjwIVWa/zXKKr5RnjMmwALL0en0wsJxyV8De2Q+WZKA61LFAeiJqJVq1bh7bffxrvvvgu9Xo/GxkY0NjbC4XCIGdagIZVwUDhahC/0+X3/dc8cAQDIcDdAJfHB5vKh0V9ViouOi8KUE44DCqfCbPdALuWQrVdCIUvsf9uubUSMk9BYojgQNRFt3LgRZrMZs2fPRn5+fvDj/fffFzOswcXqr5bprlLN0mYDKgMkzIcxamHxu/PNcSoR+LzA2R3C5wVTAE0GijI0+NnsEVg8MT8+r9kHtVyK4gwNynJ1wtK01E4Uc6K2EQ2Y5UcHmeZOJ/55shl5RhVmW4V2F+jz+v4mjhNKRXUHMUzaiIPIwoVWK24oy4ptcIwB53YAtlZh6EDJDcGnpBIO+jjtc98XmVSCH17Tpf2MxhLF3IDpNSOJ025zo8HsRIvJBtj82wVdrUQEBAc75nnqIIHQ8xYYFBkTPA+c3wnUHxIS35jbAIVm4P3BohJRzFEiGoRMdqHrPUdqEcboyNWX2z36kj4UkMog91gxQissuH+mqTM2QVmbgYNvATX+FQBGfF8YSAngbLMVFXuqsP9ie2xeK0o+muYRNwOi+54kViARZcIkHNDnhdcNLZUDaSVA2zlM0bWjuLgUZbn9nIHO+4DqPUD110JSlCmBkbdcXg8JQHWbHSa7R1iuVSQ7TjTheL0ZN47MxhQ9JaJYo0Q0CJkdQnUq3ecvYYRTLQvIHAa0nUO+tw75hTf1LxB7O3DiU2GgJCBMuC27OaR0xhhDdZvQKH7lLiOJJJcK0zzsLh+QTWOJYo0S0SAUKBHpvRG0DwVkjgCwXVgx0W0HFFEmB0s9cHgL4HUBchUwcr4wwfaKX2qT3YNOpxdSCYchaYkdyNiVVin8qtjcXkCZTusSxRi1EQ0yTo9PqOIwHhqPv0R0tR6zrlRGQJcNMAZf23kcqjHhg29r4Pby4V/D2gwcfk9IQoYC4NoHgJzRPZYsLvpLQ/lGVcLHD3Wl8Y8lsru9tC5RHFAiGmQcbh+MajkypXbImE+YPtHXiOqe+HvPJO3ncehSB2o7HDjREOZKCG47cOz/EzZLTCsCJv4YUBl6Pf18i5CIhmWLW+rQ+rcVsrn87VSBn5mDNhSNBUpEg0y6VoEVN5TiJ+P81RxNFiCJ8L+Bf5Q111GFiYVCEjl0qSO8bvaz2wGHSVhuZNwPAVnvy846PT7UdQij7Idna3s9LxE0yi4lIgDQ+JeqcYjbk5cqKBENUhJ7q/CJLifybzYMEbr8PU6M0ZigkEnQYffgYpu97+8L7hLCAWOWCtfog5dnGF9oQEmWRpwF+7vQdtlokecZoPYnIjsloligRDRY2ZqFR2125N8rkQibLwJQtp3C2AKhVPTtxfbeS0VeN3Bmm/B54VTAcPWpGjqlDDeNysUPJve+IkOiBKZ5jMrTw8uzyyUie5u4gaUISkSDzKeH6vDX/TWwtDYIB6JJRMDlcT4tpzClUNhup7bDgZr2XiYsX/xKaNhVGYGSmdG9pogkEg4/vKYQ88flC43mmkzhCUe70IVP+oUS0SDTaHaiob0TEpdJOBBtIjIWCY3MXjcM1osYXyiMrfn6Qmv3UlFnE1D7rfD5yFv6bBcKaDA7UNNuH3jTOwJURmEjSp8XcMVodPkgRoloEHF5ha57tacDKhknjAGKdgwMxwG5/iV96w5gakkGSrO0uKEsG1zXbnieB85sFUZN54wKezugfRfa8eGBWnxbPbB6pXw8g8fHC134gfW9qXrWb5SIBhGzfyBjBkyQSSTRl4YChkwRfiHNtdC5WrB08pDugw5r9wOWBmHqxoh5YV3W7vai2t/wPULkbvuu/nmqCX/YeRaHakzCga7VM9IvlIgGEZNDSETZEn9VQhtFj1lXSr0wGhoAqr4MaStxenxCj1LVbuHAiLnhTawFcKqxEzxjyDOqkK4Vt7esK4VU6MK3uvxd+IGNKO0Dq9SWjCgRDSKBqR0ZzCQc0MZgLaGSG4RSUXsV0HoGPM+w51wrKnafgfXgX4VpEBmlQN6EsC7HGMOxOmG08pj83gc6ikHrH0tkdV4xloiqZv1GiWgQMdmFya4G3iQciGYM0ZU0GUJ3PACc+l9wllp0mNoxrOHvuFBVBV6uBcoXhD0xtLbDgTarGwqZBKPywytBJUpgUbbLJSIa1BgrlIgGEYVMgnS5B1o4hcSgidHqiiUzhR1AvG5w372Nm00fINPbCItXgm91sy+v3xOGQPvL6Hw9lLIE7iYbBr1KGNTYGdhKKdBG5DQLvWckapSIBpHZ5TlYPlGLLJ1SmCsVRjd6WKQyYMKPgLxxAMdBIZWguGQEjufchv9rVeFia3hrW3t9fHC/tAmFabGJLYYCicju9glrVyu0ws+QMZpz1k+0DMhgY/Xv2hGL9qGuZEpg9GKg7BaA9yJHocHwE004WmfG34814O5pxVedpiGTSnD3tGI0WpxCshxg1HIppBIOPp7B6vLCqJYLpUpLPWBvFVYlIFGhEtFgY/Mnoli0D/VEpgiuUTS7PBv5RhVcHh7/c6RBKEVcBcdxCd9AMVwcx6EsR4fRXRvRA0MgrM3iBJUiKBENEueaO/HG7gs4ec6/f31/xxCFQSaV4NaJBdCrZJhSnAappOcGa4+Px/6L7ZGtaSSSBePzMX9cnlAaAi7/HAMJnkSFqmaDRIfdA6vTDamjDdCq+j+GKEw6pQz3zSgJWdSMMRYcfc3zDNuPN+FMUyfONlnx42lFoSOzB7pAdczWKm4cSY4S0SBhsnug9pqhlvLCIviBMTAJ0DUJWV1efHywFsNzdDCo5DhRb0GdyQEJx2FmWVZSJKHANA+VXHq5ROQ0CSsMxKoDYJARtWq2e/duLF68GAUFBeA4Dp988omY4aQ0k90NrbtV+OXR5Yq24Pu+C21otbqx70I7dpxoQp3JAbmUw60T81Ek4uL44TpWZ8Yfdp7F9hP+HXIVWqFNjDEa2NgPopaIbDYbJk6ciBUrVuD2228XM5SUZ3Z4kOFuhcogiWyN6hibU56DIelqnG+2weX1IVuvxMSiNBhE2ME1GmrFFaOrAaFU5K4W2onCWGeJdCdqIlqwYAEWLFggZgiDgsfHo9PpRZG7BSqZNLJdO2JMIuEwKs+AUXkDa/pGuAJjiQLjnQAIiaijmhqs+yGp2ohcLhdcLlfwa4slzAXbBzmT3QMwBqOvHTKpTtQSUbIL9JY53D64vD5h9HdgTBYloqglVff9+vXrYTQagx9FRUVih5QUGGMYpnMjTcHASeSxm9oxCCll0mD1zOxfzSDYA0ljiaKWVIlo7dq1MJvNwY+amhqxQ0oKOQYVlgyXCtUhXXbku3aQEGn+UlFgfSfocoTGf7eNVmuMUlJVzZRKJZTKgTf0PylY6oRHwxBx40gBRrUcDWbn5RKRVC5MgLW1Cttnh7nuErmM/jQOAl4fD5j9pUdKRP1WlKHB6HwDMrou2qb395Z1NogTVJITtURktVpxLjDlAEBVVRUOHTqEjIwMFBcXixhZ6uB5hr98cQrT605j/BADFEbxt+ZJduOGGDFuyBVLm+jzgcajwkYBJGKiJqJvv/0Wc+bMCX69evVqAMCyZctQWVkpUlSpxeL0QOlogtfng0xj7HN7Z9IPev+QiM4GYXBjEowQH0hETUSzZ88euNvFpIh2mxt6VyNUcikkVBqKGR/PYLK7ka5RQCLh/KPVJZcbrCnhR4TaiFJcu80No6sBGoVU2IuM9BtjDG98dQGbv65Gh3/5XUjlgNa/YmNno3jBJSlKRCmuvdMaLBEho1TscFICx3HBgY3tNvflJ/QFwqOlVoSokhslohTnbKkCx3io9BmXt78h/RboMWvrmogCVV8zJaJIUSJKYT6egbVVAQA0uWXUgBpDWTp/IrJ2SURp/qpvZyPg8/TwXaQ3lIhSmMfrw2hZI4xqOTT5ZWKHk1IytMLA2nbb5bmPUKUJW3jzPmEdaxI2SkQpTOVowsg0hjGFmeAyhokdTkoJVM067J7La3FzHFXPokSJKJW1nBQes8qEXh0SMwaVDAqZJNiNHxTomaREFJGkmmtGIuDzwnbpMNRgkGSPFjualMNxHCYWpkEu5aCUd9kIMs0/I8B8Sdh0UUq/YuGgn1KK4ptP4Xh1I1wSDcZPL0aa2AGloBvKelhORZsttBO5rML8PhoyERaqmqUixmC98DV8PEOrYQyMGlqxIGE4Dgi0x7VfEDeWJEKJKBW1nYe9tRY8J4NkyKSk2BkjGTHGYHF6cLapM3TzSEpEEaNElGp4H1C1C1anB436scjJpNUY4+ntvdX43yMNaLN26cZPLxFKRrZWwNEhWmzJhBJRqqn5BrC2oMMjQ71+IgrSVGJHlLI4jkOeQfj51pkcl5+Qqy83WjefEiGy5EOJKJVY6oGLX8Hp8eGUbhp4mRp5RkpE8RTYi62mwxH6RI6/p7L5RIIjSk6UiFKFqxM4/jHA+9CkHIpWTRkK0lTCLhMkborShURU22EH37WdKKtcWBbE2gzYaOPFq6FElAo8DuDwFsBpATQZSJv8A9xYno0JhWliR5bycvRKKOUSuDw8mjqdl59QaC533TceESe4JEKJKNl5XcCRvwoNo0odMOFHMBp0uGZoBsrzaBH3eJNIOBT7q2fnm22hT+ZPEh4bDguDG0mvKBElM48DOPye0DYkVwET7qKlPkQwMldI+OdbrKFPZI4QVmr0OKit6CooESUrtw049C5gabichHTZ2HehDSfqLXB7ebEjHDRKMrX4/phc/OjaK1bAlEiAgsnC55f2Ajy9J72hRJSMXJ1CErI2AwotMOkewJCPTqcHey+0Y9vxxtC92UlcKWQSjBtiDO4AG2LINUJ3vr2N2or6QIko2dhage/e9rcJ6YUkpBO2PD5cYwbPGArT1cjS0bQOMTDGQkdZy5TA0OuEzy9+JVTTSDeUiJJJx0Xg4GbAYRLagibfE1yw3eby4nCtCQAwuZjaicRQ1WrDu99cwldnW0KfKJgCaDKEibBndwjbDZEQlIiSAWNCG8Ph94VeMuMQYMq9IQ3TX51tgdvLI8+owvBsrYjBDl4SDmi2uHC4xozmrl35UhkwapEw7aPpuPBekhADIhH9+c9/RklJCVQqFaZPn45vvvlG7JAGDlub0DN2/guA8UDuGGDi3ULbkN+xOjNONnSC44DZ5dk0yVUkQzO1GJ6jA88YPjvSAIfbd/lJYyEwYp7w+YVdwMU9VDLqQvRE9P7772P16tV4+umncfDgQUycOBG33HILmpubxQ5NXNYW4PRWYP9/Ax3Vwl/V8gXA6NtCFttyenz46mwrAGDGsEzkG9ViRUwAfH90LvQqGUx2Dz44UIOWzi6TYQuvBYbOED6v2i0MQqUtqgEAHBN5q9Xp06dj6tSp+NOf/gQA4HkeRUVF+MUvfoEnn3yyz++1WCwwGo0wm80wGJJ0Z02eB7wOoTve1iLsANF+QWiMDsgqA4bfBKZOh8vLw+zwQK2QwqASln+t7bDjXLMVs0ZSaWggaLe58dHBWnQ6vZBwHCYUGTGnPOfyCXUHgXM7Ad4/yNFQICwdYigQqttKPSCRpcSuK+H+joq6QqPb7caBAwewdu3a4DGJRIJ58+bh66+/7na+y+WCy3X5L4zFYgnvhdqrgPM7ey4KhxxjfR/v4Viny4PTDZbL3xk4hwn/DElXo8A/8dTm8uJ4vbnLJXhIeQ84MDAG5BlVGJImlGicXoavTOloMoyDtb0ArK0DPr4NHp9w/e8Ny8SM4UJDdWG6BoX+OU9EfBlaBe6aVowvTjXjXLMVLs/l8UNeH4+/nDVA45uHYtN+pNsvgGMmACeENdU0CmEirUQKLyfHobpOMEgAjgPjJAA4MHAAB2RqFRiRrQMA8AzYX90OABg/xAiNPAFzDCfcGbOttUVNRK2trfD5fMjNzQ05npubi1Onui+fsH79eqxbty7yF/K6hKpOPDg98Nh7T4i80weo/f8RPV74XPaQ5wOtCF6JEnZ1PlBQCqQVw6EcgmP7/cX2rm0NANQKKXhqXxjQdEoZFk8sQLPFCV+X96rT6YXLw8MFLToMsyHXTEW68xKMznqoPR3QMP8fWt4H8H3/32JMAWiERnGOMfCdQiKC1Q0oEvCrzWI3QDOp1qxeu3YtVq9eHfzaYrGgqCiM/dzTioCJdwmfhxR3ud6PhXlc7uVR3OkWnu5yPFBF0qtkgErYekbh4zHM7gbX9XVlakCmAiRSaJQyQCm8JXofj3tnqLq+KmQSCTRKKeRS0Zv2SJhyDKHLsOhVMiy/rgQenofXx/x/UMqDBWmtQgqoAHhdkHicKC6zCqVsxgNg/s8ZAAaVXAL4tzUCgOISISnJ9EpAmoBqnSJ2vbOiJqKsrCxIpVI0NYU22DU1NSEvL6/b+UqlEkplFAP1FNq4LWKuAjAkI7xz5QByjeGdK5NKaFBiCpJJJUjvkjx6P1EJicqAIfqcq58L4e9guP8PByJR/7QqFApcc8012LlzZ/AYz/PYuXMnZsyYIWJkhJBEEr1qtnr1aixbtgzXXnstpk2bhldffRU2mw3333+/2KERQhJE9ER05513oqWlBU899RQaGxsxadIkfP75590asAkhqUv0cUT9kRLjiAhJYeH+jlL3CyFEdJSICCGio0RECBGd6I3V/RFo3gp7qgchJKECv5tXa4pO6kTU2dkJAOGNriaEiKazsxNGY++jeZO614znedTX10Ov1w/IWeeBKSg1NTUp2auXyveXyvcGJO7+GGPo7OxEQUEBJJLeW4KSukQkkUhQWFgodhhXZTAYUvI/c0Aq318q3xuQmPvrqyQUQI3VhBDRUSIihIiOElEcKZVKPP3009GtGJAEUvn+UvnegIF3f0ndWE0ISQ1UIiKEiI4SESFEdJSICCGio0RECBEdJaIIRbor7QcffIBRo0ZBpVJh/Pjx+Pvf/x7yPGMMTz31FPLz86FWqzFv3jycPXs2nrfQq0ju7Y033sDMmTORnp6O9PR0zJs3r9v5y5cvB8dxIR/z58+P9230KpL7q6ys7Ba7ShW6EH6yvnezZ8/udm8cx2HRokXBcxL+3jESti1btjCFQsE2bdrEjh8/zh588EGWlpbGmpqaejx/z549TCqVshdeeIGdOHGC/b//9/+YXC5nR48eDZ6zYcMGZjQa2SeffMIOHz7MbrvtNlZaWsocDkeibosxFvm93X333ezPf/4z++6779jJkyfZ8uXLmdFoZLW1tcFzli1bxubPn88aGhqCH+3t7Ym6pRCR3l9FRQUzGAwhsTc2Noack6zvXVtbW8h9HTt2jEmlUlZRURE8J9HvHSWiCEybNo2tWrUq+LXP52MFBQVs/fr1PZ7/ox/9iC1atCjk2PTp09nDDz/MGGOM53mWl5fH/uM//iP4vMlkYkqlkr333ntxuIPeRXpvV/J6vUyv17O33noreGzZsmVsyZIlsQ41KpHeX0VFBTMajb1eL5Xeu1deeYXp9XpmtVqDxxL93lHVLEyBXWnnzZsXPNbXrrQA8PXXX4ecDwC33HJL8Pyqqio0NjaGnGM0GjF9+vRerxkP0dzblex2OzweDzIyQve02bVrF3JyclBeXo6f/exnaGtri2ns4Yj2/qxWK4YOHYqioiIsWbIEx48fDz6XSu/dm2++ibvuugtabeg+ZYl87ygRhamvXWkbGxt7/J7GxsY+zw88RnLNeIjm3q70xBNPoKCgIOQXYv78+di8eTN27tyJ559/Hl9++SUWLFgAn8/Xx5ViL5r7Ky8vx6ZNm/Dpp5/i7bffBs/zuO6661BbWwsgdd67b775BseOHcPKlStDjif6vUvq2fdkYNiwYQO2bNmCXbt2hTTo3nXXXcHPx48fjwkTJmD48OHYtWsX5s6dK0aoYZsxY0bI3nrXXXcdRo8ejddffx3PPfeciJHF1ptvvonx48dj2rRpIccT/d5RiShMke5KCwB5eXl9nh94jOSa8RDNvQW8+OKL2LBhA7Zv344JEyb0ee6wYcOQlZWFc+fO9TvmSPTn/gLkcjkmT54cjD0V3jubzYYtW7bggQceuOrrxPu9o0QUpmh2pZ0xY0bI+QCwY8eO4PmlpaXIy8sLOcdisWDfvn0J3ek22h13X3jhBTz33HP4/PPPce211171dWpra9HW1ob8/PyYxB2uWOwo7PP5cPTo0WDsyf7eAcLQEpfLhZ/85CdXfZ24v3cJaxZPAVu2bGFKpZJVVlayEydOsIceeoilpaUFu3Xvvfde9uSTTwbP37NnD5PJZOzFF19kJ0+eZE8//XSP3fdpaWns008/ZUeOHGFLliwRrQs4knvbsGEDUygU7MMPPwzp4u3s7GSMMdbZ2cnWrFnDvv76a1ZVVcX+8Y9/sClTprCysjLmdDoTem/R3N+6devYtm3b2Pnz59mBAwfYXXfdxVQqFTt+/HjwnGR97wJuuOEGduedd3Y7LsZ7R4koQn/84x9ZcXExUygUbNq0aWzv3r3B52bNmsWWLVsWcv5f//pXNnLkSKZQKNjYsWPZZ599FvI8z/PsN7/5DcvNzWVKpZLNnTuXnT59OhG30k0k9zZ06FAGoNvH008/zRhjzG63s5tvvpllZ2czuVzOhg4dyh588MFuY3ESKZL7e/zxx4Pn5ubmsoULF7KDBw+GXC9Z3zvGGDt16hQDwLZv397tWmK8d7QMCCFEdNRGRAgRHSUiQojoKBERQkRHiYgQIjpKRIQQ0VEiIoSIjhIRIUR0lIgIIaKjRESSSmVlJdLS0oJfP/PMM5g0aVLw6+XLl2Pp0qUJj4v0DyUi0qPAmsU//elPuz23atUqcByH5cuXh5wf6wRQUlKCV199NeTYnXfeiTNnzvT6Pa+99hoqKyuDX8+ePRuPP/54TOMisUeJiPSqqKgIW7ZsgcPhCB5zOp149913UVxcLEpMarUaOTk5vT5vNBpDSkwkOVAiIr2aMmUKioqK8NFHHwWPffTRRyguLsbkyZP7de2eSipLly4NlrJmz56N6upq/PKXvwzuIgF0r5pdqWvJbPny5fjyyy/x2muvBa9RVVWFESNG4MUXXwz5vkOHDoHjuISvlUQElIhIn1asWIGKiorg15s2bcL9998f99f96KOPUFhYiGeffRYNDQ1oaGiI+BqvvfYaZsyYgQcffDB4jeLi4m73BAAVFRW48cYbMWLEiFjdAokAJSLSp5/85Cf417/+herqalRXV2PPnj1hLaTVXxkZGZBKpdDr9cjLy4tq1UOj0QiFQgGNRhO8hlQqxfLly3H69Ong3l8ejwfvvvsuVqxYEevbIGGiNatJn7Kzs7Fo0SJUVlaCMYZFixYhKytL7LD6paCgAIsWLcKmTZswbdo0/M///A9cLhfuuOMOsUMbtKhERK5qxYoVqKysxFtvvRWzUoNEIsGVS2F5PJ6YXDscK1euDDbEV1RU4M4774RGo0nY65NQlIjIVc2fPx9utxsejwe33HJLTK6ZnZ0d0u7j8/lw7NixkHMUCkW/t6/p7RoLFy6EVqvFxo0b8fnnn1O1TGRUNSNXJZVKcfLkyeDnvTGbzTh06FDIsczMTBQVFXU796abbsLq1avx2WefYfjw4Xj55ZdhMplCzikpKcHu3btx1113QalURlUlLCkpwb59+3Dx4kXodDpkZGRAIpEE24rWrl2LsrKyhC54T7qjEhEJi8FggMFg6POcXbt2YfLkySEf69at6/HcFStWYNmyZbjvvvswa9YsDBs2DHPmzAk559lnn8XFixcxfPhwZGdnRxX3mjVrIJVKMWbMGGRnZ+PSpUvB5x544AG43e6E9AKSvtGa1WTQ+uqrrzB37lzU1NR02ymVJBYlIjLouFwutLS0YNmyZcjLy8M777wjdkiDHlXNyKDz3nvvYejQoTCZTHjhhRfEDoeASkSEkAGASkSEENFRIiKEiI4SESFEdJSICCGio0RECBEdJSJCiOgoERFCREeJiBAiuv8frr9ZwG5NpJsAAAAASUVORK5CYII=",
      "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:55:58.568796Z",
     "iopub.status.busy": "2024-03-22T20:55:58.568507Z",
     "iopub.status.idle": "2024-03-22T20:55:58.924783Z",
     "shell.execute_reply": "2024-03-22T20:55:58.923874Z"
    },
    "papermill": {
     "duration": 0.377324,
     "end_time": "2024-03-22T20:55:58.927085",
     "exception": false,
     "start_time": "2024-03-22T20:55:58.549761",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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oiiyLCt5eXnKz3/+88j+pqYmxWw2K7///e/jcAVd09NrO5dgMKjYbDblxRdfjGxbvHixsmjRolib2it6en3r169XHA5Hl8dLpnv3i1/8QrHZbIrT6YxsS/S9E12zbhKuSjt//vzItvNVpQXYuXNnVHuAa665JtK+rKyM6urqqDYOh4NZs2Z1ecx40JtrOxe3200gECAzM7qmzdatW8nJyWHs2LF8//vfp76+Pqa2d4feXp/T6WT48OEUFhayaNEivvjii8i+ZLp3L7zwArfeeitWa3SdskTeOyFE3eR8VWmrq6s7/Ux1dfV524efe3LMeNCbazuXBx54gIKCgqgvxLXXXstLL73Eli1bePzxx9m2bRvXXXcdoVDoPEeKPb25vrFjx7Ju3Tr+/Oc/8/LLLyPLMpdeeiknT54Ekufeffzxx+zfv5+77747anui792AXn0v6B+sWbOGjRs3snXr1qgB3VtvvTXyetKkSUyePJmRI0eydetW5s2bp4Wp3Wb27NlRtfUuvfRSxo8fz29+8xseffRRDS2LLS+88AKTJk1i5syZUdsTfe+ER9RNelqVFiAvL++87cPPPTlmPOjNtYV54oknWLNmDe+++y6TJ08+b9sRI0YwZMgQjh071mebe0Jfri+M0Whk2rRpEduT4d65XC42btzIXXfddcHzxPveCSHqJr2pSjt79uyo9gCbN2+OtC8pKSEvLy+qTUtLCx999FFCK932tuLuz372Mx599FHeeecdZsyYccHznDx5kvr6evLz82Nid3eJRUXhUCjE559/HrF9oN87UENLfD4f3/nOdy54nrjfu4QNiycBGzduVMxms7JhwwblwIEDyr333qukp6dHpnVvv/125cEHH4y037Fjh2IwGJQnnnhCOXjwoPLQQw91On2fnp6u/PnPf1Y+++wzZdGiRZpNAffk2tasWaOYTCblj3/8Y9QUb2trq6IoitLa2qosX75c2blzp1JWVqb885//VKZPn66MHj1a8Xq9Cb223lzfqlWrlE2bNimlpaXK7t27lVtvvVWxWCzKF198EWkzUO9dmMsvv1y55ZZbOmzX4t4JIeohv/zlL5WioiLFZDIpM2fOVD788MPIviuvvFJZvHhxVPvXXntNGTNmjGIymZSLLrpI+fvf/x61X5Zl5Sc/+YmSm5urmM1mZd68ecrhw4cTcSkd6Mm1DR8+XAE6PB566CFFURTF7XYrV199tZKdna0YjUZl+PDhyj333NMhFieR9OT67r///kjb3NxcZcGCBcqePXuijjdQ752iKMqhQ4cUQHn33Xc7HEuLeyfSgAgEAs0RY0QCgUBzhBAJBALNEUIkEAg0RwiRQCDQHCFEAoFAc4QQCQQCzRFCJBAINEcIkWBAsWHDBtLT0yPvH374YaZOnRp5v2TJEm688caE2yXoG0KIBJ0SThX6ve99r8O+++67D0mSWLJkSVT7WAtAcXExTz/9dNS2W265hSNHjnT5mbVr17Jhw4bI+zlz5nD//ffH1C5B7BFCJOiSwsJCNm7ciMfjiWzzer28+uqrFBUVaWJTSkoKOTk5Xe53OBxRHpNgYCCESNAl06dPp7CwkDfeeCOy7Y033qCoqIhp06b16dideSo33nhjxMuaM2cOFRUV/OhHP4okb4eOXbNzae+ZLVmyhG3btrF27drIMcrKyhg1ahRPPPFE1Of27t2LJEkJT1EiUBFCJDgvS5cuZf369ZH369at484774z7ed944w2GDRvGI488QlVVFVVVVT0+xtq1a5k9ezb33HNP5BhFRUUdrglg/fr1fPnLX2bUqFGxugRBDxBCJDgv3/nOd/jXv/5FRUUFFRUV7Nixo1v5a/pKZmYmer0em81GXl5er5KNORwOTCYTqampkWPo9XqWLFnC4cOHIyV3AoEAr776KkuXLo31ZQi6iUgVKzgv2dnZLFy4kA0bNqAoCgsXLmTIkCFam9UnCgoKWLhwIevWrWPmzJn89a9/xefz8c1vflNr0wYtwiMSXJClS5eyYcMGXnzxxZh5DTqdjnMz0AQCgZgcuzvcfffdkYH49evXc8stt5Campqw8wuiEUIkuCDXXnstfr+fQCDANddcE5NjZmdnR437hEIh9u/fH9XGZDL1uWpEV8dYsGABVquV5557jnfeeUd0yzRGdM0EF0Sv13Pw4MHI665obm5m7969UduysrIoLCzs0Paqq65i2bJl/P3vf2fkyJE89dRTNDU1RbUpLi5m+/bt3HrrrZjN5l51CYuLi/noo48oLy8nLS2NzMxMdDpdZKxoxYoVjB49OqF5pgUdER6RoFvY7Xbsdvt522zdupVp06ZFPVatWtVp26VLl7J48WLuuOMOrrzySkaMGMHcuXOj2jzyyCOUl5czcuRIsrOze2X38uXL0ev1TJgwgezsbE6cOBHZd9ddd+H3+xMyCyg4PyJVrGDQ8sEHHzBv3jwqKys7FCgUJBYhRIJBh8/no7a2lsWLF5OXl8crr7yitUmDHtE1Eww6fv/73zN8+HCampr42c9+prU5AoRHJBAI+gHCIxIIBJojhEggEGiOECKBQKA5QogEAoHmCCESCASaI4RIIBBojhAigUCgOUKIBAKB5gghEggEmvP/Aaq811wy81CFAAAAAElFTkSuQmCC",
      "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:55:58.966193Z",
     "iopub.status.busy": "2024-03-22T20:55:58.965464Z",
     "iopub.status.idle": "2024-03-22T20:55:59.192408Z",
     "shell.execute_reply": "2024-03-22T20:55:59.191390Z"
    },
    "papermill": {
     "duration": 0.248328,
     "end_time": "2024-03-22T20:55:59.194679",
     "exception": false,
     "start_time": "2024-03-22T20:55:58.946351",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 300x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from ml_utility_loss.loss_learning.visualization import plot_box_3\n",
    "\n",
    "_ = plot_box_3(y2[\"pred\"], next(iter(y2[\"y\"].values())))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "eabe1bab",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T20:55:59.232725Z",
     "iopub.status.busy": "2024-03-22T20:55:59.232388Z",
     "iopub.status.idle": "2024-03-22T20:55:59.521439Z",
     "shell.execute_reply": "2024-03-22T20:55:59.520399Z"
    },
    "papermill": {
     "duration": 0.310375,
     "end_time": "2024-03-22T20:55:59.523531",
     "exception": false,
     "start_time": "2024-03-22T20:55:59.213156",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAS8AAAEmCAYAAAAz0RYQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABCGElEQVR4nO3deVxU5f4H8M9hmWHflFUG3EFcEBcMvaUWhmaL1S0zc2/xppWZJVppaoXdNP2lpde8SnUzszQ1MwtxX1MWRRAURVlkU2SHmWHm/P4YOMzADMwZZuf7fr3mpXPmnDPfAzNfnuc5z8KwLMuCEEIsjI2pAyCEEF1Q8iKEWCRKXoQQi0TJixBikSh5EUIsEiUvQohFouRFCLFIlLwIIRbJztQBGJtcLsedO3fg6uoKhmFMHQ4hpAWWZVFVVYWAgADY2GguX3W65HXnzh2IRCJTh0EIaUdeXh4CAwM1vt7pkperqysAxQ/Gzc3NxNEQQlqqrKyESCTivquadLrk1VRVdHNzo+RFiBlrr1mHGuwJIRaJkhchxCJR8iKEWKRO1+ZFDItlWTQ0NEAmk5k6FGKmbG1tYWdn1+GuSpS8iN5IJBIUFhaitrbW1KEQM+fk5AR/f38IBAKdz0HJi+iFXC5HTk4ObG1tERAQAIFAQJ2ASSssy0IikaC0tBQ5OTno06dPmx1R20LJy4qJG2RYsDMV/+jTFVNHBBv0vSQSCeRyOUQiEZycnAz6XsSyOTo6wt7eHrdv34ZEIoGDg4NO56EGeyv2S1I+/rhShPd/vWK099T1ryjpXPTxOaFPmhWrrGswdQiEGAwlL0KIRaLkRTq9MWPGYMGCBaYOw2ocO3YMDMOgvLzcoO9DycuK0c0+/TLWl5Joh5IXIaQViURi6hDaRcmLGAzLsqiVNJjkoetC8GKxGIsXL4ZIJIJQKETv3r3x3//+F7du3cLYsWMBAJ6enmAYBjNnzmz3fFVVVZg6dSqcnZ3h7++PdevWtaqmfv/99xg2bBhcXV3h5+eHF198ESUlJdzrTSW+xMREDBs2DE5OThg5ciSysrK0vq6PP/4YPj4+cHV1xcsvv4zY2FgMHjyYe33mzJmYNGkSPvnkEwQEBCAkJESr2ADg4MGD6Nu3LxwdHTF27FjcunVL67g6gvp5WTFT1xrrpDKELfvTJO+dsTIGTgL+H+/p06fj7Nmz+PLLLxEeHo6cnBzcvXsXIpEIu3fvxrPPPousrCy4ubnB0dGx3fMtXLgQp0+fxv79++Hr64tly5YhOTlZJXFIpVKsWrUKISEhKCkpwcKFCzFz5kwcPHhQ5Vzvv/8+1q5dC29vb8ydOxezZ8/G6dOn243hhx9+wCeffIKvv/4ao0aNws6dO7F27Vr06NFDZb/ExES4ubkhISFB69jy8vLwzDPPYN68eXj11Vdx8eJFvPPOO+3GpA+UvAhpdO3aNezatQsJCQmIjo4GAPTs2ZN73cvLCwDg4+MDDw+Pds9XVVWFb7/9Fjt27MAjjzwCANi+fTsCAgJU9ps9ezb3/549e+LLL7/E8OHDUV1dDRcXF+61Tz75BKNHjwYAxMbGYuLEiaivr2+3k+eGDRswZ84czJo1CwCwbNky/PXXX6iurlbZz9nZGVu3blUZstNebJs2bUKvXr2wdu1aAEBISAjS0tLw2Weftfvz6SiTJq+4uDjs2bMHmZmZcHR0xMiRI/HZZ59xRVZ14uPjuV9CE6FQiPr6ekOHS3hytLdFxsoYk703X6mpqbC1teUSREfdvHkTUqkUkZGR3DZ3d/dWn++kpCR89NFHuHTpEu7fvw+5XA4AyM3NRVhYGLffoEGDuP/7+/sDAEpKShAUFNRmHFlZWXj99ddVtkVGRuLIkSMq2wYOHNhqrGF7sV29ehUjRoxQOSYqKqrNePTFpMnr+PHjmDdvHoYPH46GhgYsXboUjz76KDIyMuDs7KzxODc3N5X6Po2hM08Mw+hUdTMVbaqB+lZTU4OYmBjExMTghx9+gLe3N3JzcxETE9Oq0dze3p77f9NnvimZ6EPL7xyf2EzBpJ+sQ4cOqTyPj4+Hj48PkpKS8NBDD2k8jmEY+Pn5GTo8i0c5nZ+BAwdCLpfj+PHjXLVRWVOpRNvpfnr27Al7e3tcuHCBKx1VVFTg2rVr3Oc7MzMT9+7dw+rVq7mFYS5evKiPy+GEhITgwoULmD59OrftwoUL7R6nTWz9+vXD/v37VbadO3dOD1G3z6zuNlZUVABoblvQpLq6GsHBwRCJRHjqqaeQnp6ucV+xWIzKykqVByHqdO/eHTNmzMDs2bOxd+9e5OTk4NixY9i1axcAIDg4GAzD4MCBAygtLW3VZtSSq6srZsyYgXfffRdHjx5Feno65syZAxsbG67kFBQUBIFAgA0bNuDmzZvYv38/Vq1apdfreuONN/Df//4X3377La5fv46PP/4Yly9fbrfGok1sc+fOxfXr1/Huu+8iKysLO3bsQHx8vF7j18RskpdcLseCBQswatQoDBgwQON+ISEh2LZtG/bt24f//e9/kMvlGDlyJPLz89XuHxcXB3d3d+5By56RtmzatAn//Oc/8frrryM0NBSvvPIKampqAADdunXDihUrEBsbC19fX8yfP7/d833xxReIiorC448/jujoaIwaNQr9+vXjGtm9vb0RHx+Pn3/+GWFhYVi9ejXWrFmj12uaOnUqlixZgkWLFmHIkCHIycnBzJkz223o1ya2oKAg7N69G3v37kV4eDg2b96MTz/9VK/xa8Saiblz57LBwcFsXl4er+MkEgnbq1cv9oMPPlD7en19PVtRUcE98vLyWABsRUWFPsI2a1uO32CDFx9ggxcfMPh71dXVsRkZGWxdXZ3B38uSVVdXs+7u7uzWrVtNGkd0dDT70ksvmez92/q8VFRUaPUdNYvW1Pnz5+PAgQM4ceJEm4tMqmNvb4+IiAhkZ2erfV0oFEIoFOojTEJ4S0lJQWZmJiIjI1FRUYGVK1cCAJ566imjxVBbW4vNmzcjJiYGtra2+PHHH3H48GGV/lyWyKTVRpZlMX/+fPz66684cuRIq05z2pDJZEhLS+NuHRNiLLm5uXBxcdH4yM3NBQCsWbMG4eHhiI6ORk1NDU6ePImuXbvqLY7+/ftrjOGHH34AwzA4ePAgHnroIQwdOhS//fYbdu/erfamhCUxaclr3rx52LFjB/bt2wdXV1cUFRUBUPSFabptPX36dHTr1g1xcXEAgJUrV+KBBx5A7969UV5ejs8//xy3b9/Gyy+/bLLrMFd0t9GwAgICkJqa2ubrQUFBSEpKMmgcBw8ehFQqVfuar68vHB0dcfjwYYPGYAomTV6bNm0CoJiSRNn27du5cWO5ubkqsy7ev38fr7zyCoqKiuDp6YmhQ4fizJkzKp35CDEGOzs79O7d29RhIDjYsFN8myuTJi9Wi8Gzx44dU3m+bt06rFu3zkAREUIshdl0lSCEED4oeRFCLBIlL0KIRaLkRQixSJS8rBjNtmEc3bt3x/r167nnDMNg7969JounszCLHvaEWJPCwkJ4enqaOgyrR8mLED0zh+maWJaFTCaDnZ31fsWp2mjFTF5pZFlAUmOaB88FOLRZKENbytXGW7dugWEY7NmzB2PHjoWTkxPCw8Nx9uxZlWNOnTqFBx98EI6OjhCJRHjzzTe52SwA7Rfp+OOPPzB06FAIhUKcOnWKd+yWxHrTMjE9aS3waUD7+xnC0juAQPNsvC1ps1BGR7z//vtYs2YN+vTpg/fffx9TpkxBdnY27OzscOPGDYwfPx4ff/wxtm3bhtLSUsyfPx/z58/H9u3bAWi/SEdsbCzWrFmDnj17Wn3VlZIX6fS0XSijIxYtWoSJEycCAFasWIH+/fsjOzsboaGhiIuLw9SpU7lSXp8+ffDll19i9OjR2LRpExwcHLRepGPlypUYN26c3uI2Z5S8iOHYOylKQKZ6by1pu1BGR2haPCM0NBSXLl3C5cuX8cMPP3D7sCwLuVyOnJwc9OvXT+tFOoYNG6a3mM0dJS8rZvKeEgzDq+pmzdpaPKO6uhqvvfYa3nzzzVbHBQUF8VoIo62Fa6wNJS/S6WmzUIYhDRkyBBkZGRpnqEhLSzP4Ih2WiO42kk5Pm4UyDGnx4sU4c+YM5s+fj9TUVFy/fh379u3j5sg3xiIdloiSFwEAfH0sG5P/cxb1Uu2W9bI27S2UYUiDBg3C8ePHce3aNTz44IOIiIjAsmXLuBsGxlikwxIxrDaTalmRyspKuLu7o6KiAm5ubqYOx6C2n87Bit8yAAC3Vk9sc9/usb8DAFZNGoBpD/Cf3K6+vh45OTno0aOHUb7whlZTU4Nu3bph7dq1mDNnjqnDsTptfV60/Y5SmxdRIe6kJS9zWCiD8EPJy4qZ+majpVmzZg2ysrIgEAgwdOhQnDx5ElevXsWECRM0HtPewrPEcCh5EQIgIiJC7UIZdXV1bS6yQUyHkhdR0blaQNvn6OhoFotskNbobiPRq052/4foSB+fE0peVkyXPkosdPtQNfUgr62t1el40rk0fU6URx7wRdVGohe2trbw8PDgpmlxcnKimVxJKyzLora2FiUlJfDw8ICtra3O56LkRfSmaRI+5XmmCFHHw8Ojw5M2UvKyYroUfDrSFMEwDPz9/eHj46Nx+XlC7O3tO1TiakLJi+idra2tXj6chLSFGuyJCrpXSCwFJS8rRs3lxJqZNHnFxcVh+PDhcHV1hY+PDyZNmoSsrKx2j/v5558RGhoKBwcHDBw4sNU83kR31E2LWAqTJq/jx49j3rx5OHfuHBISEiCVSvHoo4+qrJrS0pkzZzBlyhTMmTMHKSkpmDRpEiZNmoQrV64YMXJCiKmZtMH+0KFDKs/j4+Ph4+ODpKQkjTNY/t///R/Gjx+Pd999FwCwatUqJCQkYOPGjdi8ebPBY7Z2unZSJcTYzKrNq6KiAgDg5eWlcZ+zZ88iOjpaZVtMTEyrdfCaiMViVFZWqjw6DeokSqyY2SQvuVyOBQsWYNSoURgwYIDG/YqKiuDr66uyzdfXF0VFRWr3j4uLg7u7O/domgOcqEdtXsRSmE3ymjdvHq5cuYKdO3fq9bxLlixBRUUF98jLy9Pr+QkhpmEWnVTnz5+PAwcO4MSJEwgMDGxzXz8/PxQXF6tsKy4u1jjUQCgUQigU6i1WS0KVRmLNTFryYlkW8+fPx6+//oojR46gR48e7R4TFRWFxMRElW0JCQmIiooyVJiEEDPUoZJXdXU1t3BmEz6LWsybNw87duzAvn374OrqyrVbubu7w9HREQAwffp0dOvWDXFxcQCAt956C6NHj8batWsxceJE7Ny5ExcvXsSWLVs6cimEEAvDu+SVk5ODiRMnwtnZGe7u7vD09ISnpyc8PDzg6enJ61ybNm1CRUUFxowZA39/f+7x008/cfvk5uaisLCQez5y5Ejs2LEDW7ZsQXh4OH755Rfs3bu3zUb+zkq3gdnUYk8sA++S10svvQSWZbFt2zb4+vp2aM4mbb4ox44da7Xtueeew3PPPafz+xJCLB/v5HXp0iUkJSUhJCTEEPEQQohWeFcbhw8fTt0NCCEmx7vktXXrVsydOxcFBQUYMGBAqzmoBw0apLfgSMcwOnSWoCYvYil4J6/S0lLcuHEDs2bN4rYxDAOWZcEwDGSyzrniMiHEuHgnr9mzZyMiIgI//vhjhxvsCSFEV7yT1+3bt7F//35aiNMC6NRVQv9hEGIQvBvsH374YVy6dMkQsRBCiNZ4l7yeeOIJvP3220hLS8PAgQNbNdg/+eSTeguOGB812BNLwTt5zZ07FwCwcuXKVq9Rg715odZIYs14J6+WYxmJdaGZVIml4NXmJZVKYWdnR/PFWwhKQ8Sa8Upe9vb2CAoKoqqhFaM2L2IpeN9tfP/997F06VKUlZUZIh6iR9TmRawZ7zavjRs3Ijs7GwEBAQgODoazs7PK68nJyXoLjhgfFbyIpeCdvCZNmmSAMAghhB/eyWv58uWGiIMYAI3cItZM52mgk5KScPXqVQBA//79ERERobegiAlRiz2xELyTV0lJCV544QUcO3YMHh4eAIDy8nKMHTsWO3fuhLe3t75jJISQVnjfbXzjjTdQVVWF9PR0lJWVoaysDFeuXEFlZSXefPNNQ8RIdKTTfF4GiIMQQ+Bd8jp06BAOHz6Mfv36cdvCwsLw1Vdf4dFHH9VrcIQQognvkpdcLm81GBtQdGCloUOWj5q8iKXQaUqct956C3fu3OG2FRQU4O2338Yjjzyi1+AIIUQT3slr48aNqKysRPfu3dGrVy/06tULPXr0QGVlJTZs2GCIGImudJqMkIpexDLwbvMSiURITk7G4cOHkZmZCQDo168foqOj9R4cIYRoolM/L4ZhMG7cOIwbN07f8RBCiFZ0Sl6JiYlITExESUlJq0b6bdu26SUw0nHUwZ5YM97Ja8WKFVi5ciWGDRsGf39/Wj2IEGISvJPX5s2bER8fj2nTphkiHmJi1FWCWAredxslEglGjhxpiFiInlGpmFgz3snr5Zdfxo4dO/Ty5idOnMATTzyBgIAAMAyDvXv3trn/sWPHwDBMq0dRUZFe4iE0PIhYDt7Vxvr6emzZsgWHDx/GoEGDWvW2/+KLL7Q+V01NDcLDwzF79mw888wzWh+XlZUFNzc37rmPj4/WxxJCrAPv5HX58mUMHjwYAFotxMG3mjJhwgRMmDCBbwjw8fHhZrQg+kVtXsRS8E5eR48eNUQcvAwePBhisRgDBgzARx99hFGjRmncVywWQywWc88rKyuNEaJZoBYvYs14t3mZkr+/PzZv3ozdu3dj9+7dEIlEGDNmTJvz5sfFxcHd3Z17iEQiI0ZseWh4ELEUOs+kagohISEICQnhno8cORI3btzAunXr8P3336s9ZsmSJVi4cCH3vLKykhIYIVbAopKXOpGRkTh16pTG14VCIYRCoREjMh/UU4JYM4uqNqqTmpoKf39/U4dhPSyw1phZVImEjGJTh0GMjHfJ68SJExg5ciTs7FQPbWhowJkzZ/DQQw9pfa7q6mpkZ2dzz3NycpCamgovLy8EBQVhyZIlKCgowHfffQcAWL9+PXr06IH+/fujvr4eW7duxZEjR/DXX3/xvQxiRcavPwkA+PX1kYgI8jRxNMRYeCevsWPHorCwsFXfqoqKCowdOxYymUzrc128eBFjx47lnje1Tc2YMQPx8fEoLCxEbm4u97pEIsE777yDgoICODk5YdCgQTh8+LDKOUgzbauNUlnz4HoLLHhxrhVXUfLqRHgnL5Zl1fbnunfvXqvVs9szZswYsG10LIqPj1d5/t577+G9997j9R6kfc9uOmPqEAjhTevk1dQDnmEYzJw5U6URXCaT4fLlyzTm0UJdzq/g/t/WHxNCzInWycvd3R2A4sPt6uoKR0dH7jWBQIAHHngAr7zyiv4jJIQQNbROXtu3bwcAdO/eHYsWLeJdRSTGp9O6jVTwIhaCd5vX8uXLDREHIYTwwrufV3FxMaZNm4aAgADY2dnB1tZW5UEIIcbAu+Q1c+ZM5Obm4sMPP6RpoK0Q1RqJpeCdvE6dOoWTJ09y0+IQYi50aeMjlot3tVEkEtHtdCtmyb9amhGjc+GdvNavX4/Y2FjcunXLAOEQfaIaPbFmvKuNkydPRm1tLXr16gUnJ6dW00CXlZXpLThifJZceqFqY+fCO3mtX7/eAGEQQgg/vJPXjBkzDBEHIYTwotN8Xjdu3MAHH3yAKVOmoKSkBADwxx9/ID09Xa/BEUKIJryT1/HjxzFw4ECcP38ee/bsQXV1NQDg0qVL1PveCljy3UbSufBOXrGxsfj444+RkJAAgUDAbX/44Ydx7tw5vQZHCCGa8E5eaWlpePrpp1tt9/Hxwd27d/USFNEPGv1ArBnv5OXh4YHCwsJW21NSUtCtWze9BEUIIe3hnbxeeOEFLF68GEVFRWAYBnK5HKdPn8aiRYswffp0Q8RICCGt8E5en376KUJDQyESiVBdXY2wsDA89NBDGDlyJD744ANDxEh0pEulkYZ+EUvBu5+XQCDAN998gw8//BBXrlxBdXU1IiIi0KdPH0PERwhvdRIZhHY2sLGhNj9rpvOis0FBQQgKCtJnLMQMWHS5iwHKayUYvDIBgwLdsX/+P0wdETEgrZLXwoULsWrVKjg7O3PLk2nyxRdf6CUwQnRx/FopANVFRYh10ip5paSkQCqVcv/XhG7Nmxddfh0W3eRlybET3rRKXkePHlX7f0IIMRWdxjYSYpao4N+paFXyalpwVht79uzRORiiXzotfUZ1L2IhtCp5ubu7cw83NzckJibi4sWL3OtJSUlITEzkFqYlhBBD06rk1bTgLAAsXrwYzz//PDZv3swtdSaTyfD666/Dzc3NMFESo7HoBnvSqfBu89q2bRsWLVqkskajra0tFi5ciG3btvE614kTJ/DEE08gICAADMNg79697R5z7NgxDBkyBEKhEL1790Z8fDzPK+g86OYvsWa8k1dDQwMyMzNbbc/MzIRcLud1rpqaGoSHh+Orr77Sav+cnBxMnDgRY8eORWpqKhYsWICXX34Zf/75J6/37Yy0HfZDBS9iKXj3sJ81axbmzJmDGzduIDIyEgBw/vx5rF69GrNmzeJ1rgkTJmDChAla779582b06NEDa9euBQD069cPp06dwrp16xATE8PrvQkhlo138lqzZg38/Pywdu1abmocf39/vPvuu3jnnXf0HqCys2fPIjo6WmVbTEwMFixYoPEYsVgMsVjMPa+srDRUeFaB2ryIpeBdbbSxscF7772HgoIClJeXo7y8HAUFBXjvvfdU2sEMoaioCL6+virbfH19UVlZibq6OrXHxMXFqdwtFYlEBo3RnFCTF7FmHeqk6ubmZvZ3GJcsWYKKigrukZeXZ+qQTEL7EhUVvYhl0GlWiV9++QW7du1Cbm4uJBKJymvJycl6CUwdPz8/FBcXq2wrLi6Gm5sbHB0d1R4jFAohFAoNFhMhxDR4l7y+/PJLzJo1C76+vkhJSUFkZCS6dOmCmzdv8mp810VUVBQSExNVtiUkJCAqKsqg72upOltXiU52uZ0e7+T19ddfY8uWLdiwYQMEAgHee+89JCQk4M0330RFBb9pSKqrq5GamorU1FQAiq4QqampyM3NBaCo8ilPLT137lzcvHkT7733HjIzM/H1119j165dePvtt/leRqdDlUFibXgnr9zcXIwcORIA4OjoiKqqKgDAtGnT8OOPP/I618WLFxEREYGIiAgAinnDIiIisGzZMgBAYWEhl8gAoEePHvj999+RkJCA8PBwrF27Flu3bqVuEgQAJejOhnebl5+fH8rKyhAcHIygoCCcO3cO4eHhyMnJ4T3/+ZgxY9o8Rl3v+TFjxrQ5p5gpVdRJIbC1gaPAsHddtafDwGzKAMRC8C55Pfzww9i/fz8ARYfVt99+G+PGjcPkyZPVrufYWVSLGzD686N4+uvTpg5FSefKRNTm1bnwLnlt2bKFGwY0b948dOnSBWfOnMGTTz6J1157Te8BWor0ggqU10pRXisFy7JmN6usooTbfkxU8iKWglfyamhowKef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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.018137,
     "end_time": "2024-03-22T20:55:59.560151",
     "exception": false,
     "start_time": "2024-03-22T20:55:59.542014",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "celltoolbar": "Tags",
  "colab": {
   "authorship_tag": "ABX9TyOOVfelovKP9fLGU7SvvRie",
   "gpuType": "T4",
   "mount_file_id": "17POSGAvge8y9DW9WGs2jLkibaRjToayg",
   "provenance": []
  },
  "kaggle": {
   "accelerator": "gpu",
   "dataSources": [],
   "dockerImageVersionId": 30648,
   "isGpuEnabled": true,
   "isInternetEnabled": true,
   "language": "python",
   "sourceType": "notebook"
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  },
  "papermill": {
   "default_parameters": {},
   "duration": 4549.120128,
   "end_time": "2024-03-22T20:56:02.301034",
   "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": true,
    "gp_multiply": true,
    "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:40:13.180906",
   "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
}