File size: 225,781 Bytes
83586b8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "982e76f5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T12:35:43.605195Z",
     "iopub.status.busy": "2024-03-22T12:35:43.604819Z",
     "iopub.status.idle": "2024-03-22T12:35:43.644853Z",
     "shell.execute_reply": "2024-03-22T12:35:43.644072Z"
    },
    "papermill": {
     "duration": 0.055356,
     "end_time": "2024-03-22T12:35:43.646922",
     "exception": false,
     "start_time": "2024-03-22T12:35:43.591566",
     "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-22T12:35:43.674064Z",
     "iopub.status.busy": "2024-03-22T12:35:43.673215Z",
     "iopub.status.idle": "2024-03-22T12:35:43.680255Z",
     "shell.execute_reply": "2024-03-22T12:35:43.679294Z"
    },
    "papermill": {
     "duration": 0.023112,
     "end_time": "2024-03-22T12:35:43.682214",
     "exception": false,
     "start_time": "2024-03-22T12:35:43.659102",
     "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-22T12:35:43.706766Z",
     "iopub.status.busy": "2024-03-22T12:35:43.706033Z",
     "iopub.status.idle": "2024-03-22T12:35:43.710392Z",
     "shell.execute_reply": "2024-03-22T12:35:43.709503Z"
    },
    "papermill": {
     "duration": 0.018857,
     "end_time": "2024-03-22T12:35:43.712298",
     "exception": false,
     "start_time": "2024-03-22T12:35:43.693441",
     "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-22T12:35:43.736920Z",
     "iopub.status.busy": "2024-03-22T12:35:43.736376Z",
     "iopub.status.idle": "2024-03-22T12:35:43.740389Z",
     "shell.execute_reply": "2024-03-22T12:35:43.739499Z"
    },
    "executionInfo": {
     "elapsed": 678,
     "status": "ok",
     "timestamp": 1696841022168,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "ns5hFcVL2yvs",
    "papermill": {
     "duration": 0.018587,
     "end_time": "2024-03-22T12:35:43.742294",
     "exception": false,
     "start_time": "2024-03-22T12:35:43.723707",
     "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-22T12:35:43.765878Z",
     "iopub.status.busy": "2024-03-22T12:35:43.765618Z",
     "iopub.status.idle": "2024-03-22T12:35:43.771408Z",
     "shell.execute_reply": "2024-03-22T12:35:43.770490Z"
    },
    "papermill": {
     "duration": 0.019878,
     "end_time": "2024-03-22T12:35:43.773220",
     "exception": false,
     "start_time": "2024-03-22T12:35:43.753342",
     "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": "dab922fa",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T12:35:43.800275Z",
     "iopub.status.busy": "2024-03-22T12:35:43.799948Z",
     "iopub.status.idle": "2024-03-22T12:35:43.805639Z",
     "shell.execute_reply": "2024-03-22T12:35:43.804690Z"
    },
    "papermill": {
     "duration": 0.022128,
     "end_time": "2024-03-22T12:35:43.807576",
     "exception": false,
     "start_time": "2024-03-22T12:35:43.785448",
     "status": "completed"
    },
    "tags": [
     "injected-parameters"
    ]
   },
   "outputs": [],
   "source": [
    "# Parameters\n",
    "dataset = \"contraceptive\"\n",
    "dataset_name = \"contraceptive\"\n",
    "single_model = \"realtabformer\"\n",
    "gp = False\n",
    "gp_multiply = False\n",
    "random_seed = 42\n",
    "debug = False\n",
    "folder = \"eval\"\n",
    "path_prefix = \"../../../../\"\n",
    "path = \"eval/contraceptive/realtabformer/42\"\n",
    "param_index = 0\n",
    "allow_same_prediction = True\n",
    "log_wandb = False\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bd7c02d6",
   "metadata": {
    "papermill": {
     "duration": 0.011418,
     "end_time": "2024-03-22T12:35:43.830446",
     "exception": false,
     "start_time": "2024-03-22T12:35:43.819028",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "5f45b1d0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T12:35:43.854762Z",
     "iopub.status.busy": "2024-03-22T12:35:43.854452Z",
     "iopub.status.idle": "2024-03-22T12:35:43.864057Z",
     "shell.execute_reply": "2024-03-22T12:35:43.863192Z"
    },
    "executionInfo": {
     "elapsed": 7,
     "status": "ok",
     "timestamp": 1696841022169,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "UdvXYv3c3LXy",
    "papermill": {
     "duration": 0.024153,
     "end_time": "2024-03-22T12:35:43.866019",
     "exception": false,
     "start_time": "2024-03-22T12:35:43.841866",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/kaggle/working\n",
      "/kaggle/working/eval/contraceptive/realtabformer/42\n"
     ]
    }
   ],
   "source": [
    "from pathlib import Path\n",
    "import os\n",
    "\n",
    "%cd /kaggle/working/\n",
    "\n",
    "if path is None:\n",
    "    path = os.path.join(folder, dataset_name, single_model, random_seed)\n",
    "Path(path).mkdir(parents=True, exist_ok=True)\n",
    "\n",
    "%cd {path}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "f85bf540",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T12:35:43.890548Z",
     "iopub.status.busy": "2024-03-22T12:35:43.890224Z",
     "iopub.status.idle": "2024-03-22T12:35:45.938938Z",
     "shell.execute_reply": "2024-03-22T12:35:45.937941Z"
    },
    "papermill": {
     "duration": 2.063269,
     "end_time": "2024-03-22T12:35:45.941053",
     "exception": false,
     "start_time": "2024-03-22T12:35:43.877784",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Set seed to <function seed at 0x7b059a9eb370>\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-22T12:35:45.967664Z",
     "iopub.status.busy": "2024-03-22T12:35:45.967217Z",
     "iopub.status.idle": "2024-03-22T12:35:45.979942Z",
     "shell.execute_reply": "2024-03-22T12:35:45.979099Z"
    },
    "papermill": {
     "duration": 0.028225,
     "end_time": "2024-03-22T12:35:45.981873",
     "exception": false,
     "start_time": "2024-03-22T12:35:45.953648",
     "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-22T12:35:46.006585Z",
     "iopub.status.busy": "2024-03-22T12:35:46.006026Z",
     "iopub.status.idle": "2024-03-22T12:35:46.015973Z",
     "shell.execute_reply": "2024-03-22T12:35:46.015048Z"
    },
    "executionInfo": {
     "elapsed": 6,
     "status": "ok",
     "timestamp": 1696841022169,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "Vrl2QkoV3o_8",
    "papermill": {
     "duration": 0.024645,
     "end_time": "2024-03-22T12:35:46.018227",
     "exception": false,
     "start_time": "2024-03-22T12:35:45.993582",
     "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-22T12:35:46.045285Z",
     "iopub.status.busy": "2024-03-22T12:35:46.044964Z",
     "iopub.status.idle": "2024-03-22T12:35:46.557585Z",
     "shell.execute_reply": "2024-03-22T12:35:46.556639Z"
    },
    "executionInfo": {
     "elapsed": 6,
     "status": "ok",
     "timestamp": 1696841022169,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "TilUuFk9vqMb",
    "papermill": {
     "duration": 0.528712,
     "end_time": "2024-03-22T12:35:46.559974",
     "exception": false,
     "start_time": "2024-03-22T12:35:46.031262",
     "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-22T12:35:46.587265Z",
     "iopub.status.busy": "2024-03-22T12:35:46.586890Z",
     "iopub.status.idle": "2024-03-22T12:36:00.550837Z",
     "shell.execute_reply": "2024-03-22T12:36:00.549914Z"
    },
    "executionInfo": {
     "elapsed": 3113,
     "status": "ok",
     "timestamp": 1696841025277,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "7Abt8nStvr9Z",
    "papermill": {
     "duration": 13.980286,
     "end_time": "2024-03-22T12:36:00.553228",
     "exception": false,
     "start_time": "2024-03-22T12:35:46.572942",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2024-03-22 12:35:51.446205: 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 12:35:51.446341: 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 12:35:51.596074: 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-22T12:36:00.581350Z",
     "iopub.status.busy": "2024-03-22T12:36:00.580701Z",
     "iopub.status.idle": "2024-03-22T12:36:00.587040Z",
     "shell.execute_reply": "2024-03-22T12:36:00.586192Z"
    },
    "papermill": {
     "duration": 0.022543,
     "end_time": "2024-03-22T12:36:00.589119",
     "exception": false,
     "start_time": "2024-03-22T12:36:00.566576",
     "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-22T12:36:00.613610Z",
     "iopub.status.busy": "2024-03-22T12:36:00.612976Z",
     "iopub.status.idle": "2024-03-22T12:36:09.140045Z",
     "shell.execute_reply": "2024-03-22T12:36:09.138949Z"
    },
    "executionInfo": {
     "elapsed": 20137,
     "status": "ok",
     "timestamp": 1696841045408,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "tbaguWxAvtPi",
    "papermill": {
     "duration": 8.542098,
     "end_time": "2024-03-22T12:36:09.142632",
     "exception": false,
     "start_time": "2024-03-22T12:36:00.600534",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:274: ConvergenceWarning: Initialization 1 did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.\n",
      "  warnings.warn(\n",
      "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:119: ConvergenceWarning: Number of distinct clusters (4) found smaller than n_clusters (10). Possibly due to duplicate points in X.\n",
      "  .fit(X)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:119: ConvergenceWarning: Number of distinct clusters (4) found smaller than n_clusters (10). Possibly due to duplicate points in X.\n",
      "  .fit(X)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:274: ConvergenceWarning: Initialization 1 did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.\n",
      "  warnings.warn(\n",
      "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:119: ConvergenceWarning: Number of distinct clusters (4) found smaller than n_clusters (10). Possibly due to duplicate points in X.\n",
      "  .fit(X)\n"
     ]
    }
   ],
   "source": [
    "from ml_utility_loss.loss_learning.estimator.preprocessing import DataPreprocessor\n",
    "\n",
    "preprocessor = DataPreprocessor(\n",
    "    task,\n",
    "    target=target,\n",
    "    cat_features=cat_features,\n",
    "    mixed_features=mixed_features,\n",
    "    longtail_features=longtail_features,\n",
    "    integer_features=integer_features,\n",
    "    lct_ae_embedding_size=lct_ae_embedding_size,\n",
    "    lct_ae_params=lct_ae_params,\n",
    "    lct_ae=lct_ae,\n",
    "    tab_ddpm_normalization=tab_ddpm_normalization,\n",
    "    tab_ddpm_cat_encoding=tab_ddpm_cat_encoding,\n",
    "    tab_ddpm_y_policy=tab_ddpm_y_policy,\n",
    "    tab_ddpm_is_y_cond=tab_ddpm_is_y_cond,\n",
    "    realtabformer_embedding=rtf_embed,\n",
    "    realtabformer_params=rtf_params,\n",
    ")\n",
    "preprocessor.fit(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "a9c9b110",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2024-03-22T12:36:09.171331Z",
     "iopub.status.busy": "2024-03-22T12:36:09.170391Z",
     "iopub.status.idle": "2024-03-22T12:36:09.178157Z",
     "shell.execute_reply": "2024-03-22T12:36:09.177162Z"
    },
    "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.024242,
     "end_time": "2024-03-22T12:36:09.180261",
     "exception": false,
     "start_time": "2024-03-22T12:36:09.156019",
     "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-22T12:36:09.206025Z",
     "iopub.status.busy": "2024-03-22T12:36:09.205673Z",
     "iopub.status.idle": "2024-03-22T12:36:09.210792Z",
     "shell.execute_reply": "2024-03-22T12:36:09.209904Z"
    },
    "papermill": {
     "duration": 0.020501,
     "end_time": "2024-03-22T12:36:09.212728",
     "exception": false,
     "start_time": "2024-03-22T12:36:09.192227",
     "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-22T12:36:09.237797Z",
     "iopub.status.busy": "2024-03-22T12:36:09.237481Z",
     "iopub.status.idle": "2024-03-22T12:44:37.517411Z",
     "shell.execute_reply": "2024-03-22T12:44:37.516303Z"
    },
    "papermill": {
     "duration": 508.308484,
     "end_time": "2024-03-22T12:44:37.533155",
     "exception": false,
     "start_time": "2024-03-22T12:36:09.224671",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Caching in ../../../../contraceptive/_cache_aug_test/realtabformer/all inf False\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "../../../../ml-utility-loss/aug_test/contraceptive [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n",
      "Caching in ../../../../contraceptive/_cache_bs_test/realtabformer/all inf False\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "../../../../ml-utility-loss/bs_test/contraceptive [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n",
      "Caching in ../../../../contraceptive/_cache_synth_test/realtabformer/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-22T12:44:37.561052Z",
     "iopub.status.busy": "2024-03-22T12:44:37.560681Z",
     "iopub.status.idle": "2024-03-22T12:44:38.165582Z",
     "shell.execute_reply": "2024-03-22T12:44:38.164523Z"
    },
    "executionInfo": {
     "elapsed": 588,
     "status": "ok",
     "timestamp": 1696841049215,
     "user": {
      "displayName": "Rizqi Nur",
      "userId": "09644007964068789560"
     },
     "user_tz": -420
    },
    "id": "NgahtU1q9uLO",
    "papermill": {
     "duration": 0.621448,
     "end_time": "2024-03-22T12:44:38.167853",
     "exception": false,
     "start_time": "2024-03-22T12:44:37.546405",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'Body': 'twin_encoder',\n",
       " 'loss_balancer_meta': True,\n",
       " 'loss_balancer_log': False,\n",
       " 'loss_balancer_lbtw': False,\n",
       " 'pma_skip_small': False,\n",
       " 'isab_skip_small': False,\n",
       " 'layer_norm': False,\n",
       " 'pma_layer_norm': False,\n",
       " 'attn_residual': True,\n",
       " 'tf_n_layers_dec': False,\n",
       " 'tf_isab_rank': 0,\n",
       " 'tf_layer_norm': False,\n",
       " 'tf_pma_start': -1,\n",
       " 'head_n_seeds': 0,\n",
       " 'tf_pma_low': 16,\n",
       " 'dropout': 0,\n",
       " 'combine_mode': 'diff_left',\n",
       " 'tf_isab_mode': 'separate',\n",
       " 'grad_loss_fn': <function torch.nn.functional.l1_loss(input: torch.Tensor, target: torch.Tensor, size_average: Optional[bool] = None, reduce: Optional[bool] = None, reduction: str = 'mean') -> torch.Tensor>,\n",
       " 'single_model': True,\n",
       " 'bias': True,\n",
       " 'bias_final': True,\n",
       " 'pma_ffn_mode': 'none',\n",
       " 'patience': 10,\n",
       " 'inds_init_mode': 'fixnorm',\n",
       " 'grad_clip': 0.73,\n",
       " 'gradient_penalty_mode': {'gradient_penalty': False,\n",
       "  'calc_grad_m': False,\n",
       "  'avg_non_role_model_m': False,\n",
       "  'inverse_avg_non_role_model_m': False},\n",
       " 'synth_data': 2,\n",
       " 'bias_lr_mul': 1.0,\n",
       " 'bias_weight_decay': 0.05,\n",
       " 'head_activation': torch.nn.modules.activation.Softsign,\n",
       " 'loss_balancer_beta': 0.67,\n",
       " 'loss_balancer_r': 0.943,\n",
       " 'tf_activation': torch.nn.modules.activation.Tanh,\n",
       " 'dataset_size': 2048,\n",
       " 'batch_size': 4,\n",
       " 'epochs': 100,\n",
       " 'lr_mul': 0.09,\n",
       " 'n_warmup_steps': 100,\n",
       " 'Optim': functools.partial(<class 'torch.optim.adamw.AdamW'>, amsgrad=True),\n",
       " 'fixed_role_model': 'realtabformer',\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': ['realtabformer'],\n",
       " 'max_seconds': 3600,\n",
       " 'tf_lora': False,\n",
       " 'tf_num_inds': 128,\n",
       " 'ada_n_seeds': 0,\n",
       " 'gradient_penalty_kwargs': {'mag_loss': True,\n",
       "  'mse_mag': False,\n",
       "  'mag_corr': False,\n",
       "  'seq_mag': False,\n",
       "  'cos_loss': False,\n",
       "  'mag_corr_kwargs': {'only_sign': False},\n",
       "  'cos_loss_kwargs': {'only_sign': True, 'cos_matrix': False},\n",
       "  'mse_mag_kwargs': {'target': 0.65, 'multiply': True, 'forgive_over': True}}}"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import ml_utility_loss.loss_learning.estimator.params2 as PARAMS\n",
    "from ml_utility_loss.tuning import map_parameters\n",
    "from ml_utility_loss.loss_learning.estimator.params.default import update_param_space, update_param_space_2\n",
    "import wandb\n",
    "\n",
    "#\"\"\"\n",
    "param_space = {\n",
    "    **getattr(PARAMS, dataset_name).PARAM_SPACE,\n",
    "}\n",
    "params = {\n",
    "    **getattr(PARAMS, dataset_name).BESTS[param_index],\n",
    "}\n",
    "if gp:\n",
    "    params[\"gradient_penalty_mode\"] = \"ALL\"\n",
    "    params[\"mse_mag\"] = True\n",
    "    if gp_multiply:\n",
    "        params[\"mse_mag_multiply\"] = True\n",
    "        #params[\"mse_mag_target\"] = 1.0\n",
    "    else:\n",
    "        params[\"mse_mag_multiply\"] = False\n",
    "        #params[\"mse_mag_target\"] = 0.1\n",
    "else:\n",
    "    params[\"gradient_penalty_mode\"] = \"NONE\"\n",
    "    params[\"mse_mag\"] = False\n",
    "params[\"single_model\"] = False\n",
    "if models:\n",
    "    params[\"models\"] = models\n",
    "if single_model:\n",
    "    params[\"fixed_role_model\"] = single_model\n",
    "    params[\"single_model\"] = True\n",
    "    params[\"models\"] = [single_model]\n",
    "if params[\"fixed_role_model\"] == \"realtabformer\" and dataset_name == \"treatment\":\n",
    "    params[\"batch_size\"] = 2\n",
    "params[\"max_seconds\"] = 3600\n",
    "params[\"patience\"] = 10\n",
    "params[\"epochs\"] = 100\n",
    "if debug:\n",
    "    params[\"epochs\"] = 2\n",
    "with open(\"params.json\", \"w\") as f:\n",
    "    json.dump(params, f)\n",
    "params = map_parameters(params, param_space=param_space)\n",
    "params"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "a48bd9e9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T12:44:38.197028Z",
     "iopub.status.busy": "2024-03-22T12:44:38.196103Z",
     "iopub.status.idle": "2024-03-22T12:55:26.894260Z",
     "shell.execute_reply": "2024-03-22T12:55:26.893195Z"
    },
    "papermill": {
     "duration": 648.727448,
     "end_time": "2024-03-22T12:55:26.908814",
     "exception": false,
     "start_time": "2024-03-22T12:44:38.181366",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Caching in ../../../../contraceptive/_cache_aug_train/realtabformer/all inf False\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "split df ratio is 0\n",
      "../../../../ml-utility-loss/aug_train/contraceptive [400, 0]\n",
      "Caching in ../../../../contraceptive/_cache_aug_val/realtabformer/all inf False\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "split df ratio is 1\n",
      "../../../../ml-utility-loss/aug_val/contraceptive [0, 200]\n",
      "Caching in ../../../../contraceptive/_cache_bs_train/realtabformer/all inf False\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "split df ratio is 0\n",
      "../../../../ml-utility-loss/bs_train/contraceptive [100, 0]\n",
      "Caching in ../../../../contraceptive/_cache_bs_val/realtabformer/all inf False\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "split df ratio is 1\n",
      "../../../../ml-utility-loss/bs_val/contraceptive [0, 50]\n",
      "Caching in ../../../../contraceptive/_cache_synth/realtabformer/all inf False\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Splitting without random!\n",
      "Split with reverse index!\n",
      "../../../../ml-utility-loss/synthetics/contraceptive [400, 200]\n",
      "[900, 450]\n",
      "[900, 450]\n"
     ]
    }
   ],
   "source": [
    "train_set, val_set = datasetsn(model=params[\"fixed_role_model\"], synth_data=params[\"synth_data\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "2fcb1418",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "execution": {
     "iopub.execute_input": "2024-03-22T12:55:26.938038Z",
     "iopub.status.busy": "2024-03-22T12:55:26.937496Z",
     "iopub.status.idle": "2024-03-22T12:55:27.377636Z",
     "shell.execute_reply": "2024-03-22T12:55:27.376636Z"
    },
    "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.4571,
     "end_time": "2024-03-22T12:55:27.379821",
     "exception": false,
     "start_time": "2024-03-22T12:55:26.922721",
     "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 True True\n",
      "['realtabformer'] 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-22T12:55:27.409753Z",
     "iopub.status.busy": "2024-03-22T12:55:27.409425Z",
     "iopub.status.idle": "2024-03-22T12:55:27.413860Z",
     "shell.execute_reply": "2024-03-22T12:55:27.412935Z"
    },
    "papermill": {
     "duration": 0.021547,
     "end_time": "2024-03-22T12:55:27.415899",
     "exception": false,
     "start_time": "2024-03-22T12:55:27.394352",
     "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-22T12:55:27.443636Z",
     "iopub.status.busy": "2024-03-22T12:55:27.443384Z",
     "iopub.status.idle": "2024-03-22T12:55:27.450566Z",
     "shell.execute_reply": "2024-03-22T12:55:27.449690Z"
    },
    "papermill": {
     "duration": 0.023232,
     "end_time": "2024-03-22T12:55:27.452543",
     "exception": false,
     "start_time": "2024-03-22T12:55:27.429311",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "12536352"
      ]
     },
     "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-22T12:55:27.480763Z",
     "iopub.status.busy": "2024-03-22T12:55:27.480493Z",
     "iopub.status.idle": "2024-03-22T12:55:27.568738Z",
     "shell.execute_reply": "2024-03-22T12:55:27.567842Z"
    },
    "papermill": {
     "duration": 0.10513,
     "end_time": "2024-03-22T12:55:27.570916",
     "exception": false,
     "start_time": "2024-03-22T12:55:27.465786",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "========================================================================================================================\n",
       "Layer (type:depth-idx)                                                 Output Shape              Param #\n",
       "========================================================================================================================\n",
       "MLUtilitySingle                                                        [2, 1179, 16128]          --\n",
       "├─Adapter: 1-1                                                         [2, 1179, 16128]          --\n",
       "│    └─Embedding: 2-1                                                  [2, 1179, 24, 672]        (48,384)\n",
       "│    └─TensorInductionPoint: 2-2                                       [24, 1]                   24\n",
       "│    └─Sequential: 2-3                                                 [2, 1179, 256]            --\n",
       "│    │    └─FeedForward: 3-1                                           [2, 1179, 1024]           --\n",
       "│    │    │    └─Linear: 4-1                                           [2, 1179, 1024]           689,152\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, 16128]           (recursive)\n",
       "│    └─Embedding: 2-4                                                  [2, 294, 24, 672]         (recursive)\n",
       "│    └─TensorInductionPoint: 2-5                                       [24, 1]                   (recursive)\n",
       "│    └─Sequential: 2-6                                                 [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-7                                                    [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-8                                                    [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-9                                                 [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: 12,584,736\n",
       "Trainable params: 12,536,352\n",
       "Non-trainable params: 48,384\n",
       "Total mult-adds (M): 46.91\n",
       "========================================================================================================================\n",
       "Input size (MB): 0.28\n",
       "Forward/backward pass size (MB): 755.51\n",
       "Params size (MB): 50.34\n",
       "Estimated Total Size (MB): 806.13\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-22T12:55:27.602224Z",
     "iopub.status.busy": "2024-03-22T12:55:27.601876Z",
     "iopub.status.idle": "2024-03-22T14:00:22.928909Z",
     "shell.execute_reply": "2024-03-22T14:00:22.927881Z"
    },
    "papermill": {
     "duration": 3895.361184,
     "end_time": "2024-03-22T14:00:22.946984",
     "exception": false,
     "start_time": "2024-03-22T12:55:27.585800",
     "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 True True\n",
      "g_loss_mul 0.1\n",
      "Epoch 0\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.015436244466497252, 'avg_role_model_std_loss': 0.6971071543745386, 'avg_role_model_mean_pred_loss': 0.0005885604529329952, '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.015436244466497252, 'n_size': 900, 'n_batch': 225, 'duration': 233.85006093978882, 'duration_batch': 1.0393336041768393, 'duration_size': 0.2598334010442098, 'avg_pred_std': 0.1107698762230575}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.014223382426425814, 'avg_role_model_std_loss': 0.39072058395795967, 'avg_role_model_mean_pred_loss': 0.0007193372912492969, '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.014223382426425814, 'n_size': 450, 'n_batch': 113, 'duration': 101.00125312805176, 'duration_batch': 0.8938163993632899, 'duration_size': 0.22444722917344834, 'avg_pred_std': 0.1077716978992113}\n",
      "Epoch 1\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.006033640582399029, 'avg_role_model_std_loss': 0.4650218232954108, 'avg_role_model_mean_pred_loss': 0.00013023597284128328, '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.006033640582399029, 'n_size': 900, 'n_batch': 225, 'duration': 229.77366161346436, 'duration_batch': 1.0212162738376194, 'duration_size': 0.25530406845940484, 'avg_pred_std': 0.09818139906144804}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0075027576179450585, 'avg_role_model_std_loss': 0.3676717987151777, 'avg_role_model_mean_pred_loss': 0.00021706114066001486, '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.0075027576179450585, 'n_size': 450, 'n_batch': 113, 'duration': 105.09904932975769, 'duration_batch': 0.9300800825642274, 'duration_size': 0.2335534429550171, 'avg_pred_std': 0.09515106879932954}\n",
      "Epoch 2\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.004512168372780757, 'avg_role_model_std_loss': 0.38041619546195704, 'avg_role_model_mean_pred_loss': 8.644590021956824e-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.004512168372780757, 'n_size': 900, 'n_batch': 225, 'duration': 229.63529801368713, 'duration_batch': 1.020601324505276, 'duration_size': 0.255150331126319, 'avg_pred_std': 0.10015762750473288}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0042034335448018585, 'avg_role_model_std_loss': 1.679159187696908, 'avg_role_model_mean_pred_loss': 0.00013376625657448635, '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.0042034335448018585, 'n_size': 450, 'n_batch': 113, 'duration': 100.8151388168335, 'duration_batch': 0.8921693700604734, 'duration_size': 0.22403364181518554, 'avg_pred_std': 0.06495650028253584}\n",
      "Epoch 3\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0035539452421491863, 'avg_role_model_std_loss': 0.47440502540713714, 'avg_role_model_mean_pred_loss': 2.18277604056823e-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.0035539452421491863, 'n_size': 900, 'n_batch': 225, 'duration': 229.67535948753357, 'duration_batch': 1.0207793755001493, 'duration_size': 0.2551948438750373, 'avg_pred_std': 0.10116369463089439}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0038588620393743946, 'avg_role_model_std_loss': 3.2039021881799323, 'avg_role_model_mean_pred_loss': 5.9090333590049076e-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.0038588620393743946, 'n_size': 450, 'n_batch': 113, 'duration': 102.2182068824768, 'duration_batch': 0.904585901614839, 'duration_size': 0.22715157084994847, 'avg_pred_std': 0.04514441881030056}\n",
      "Epoch 4\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.00319372646672289, 'avg_role_model_std_loss': 0.37545427183122226, 'avg_role_model_mean_pred_loss': 1.550665479323714e-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.00319372646672289, 'n_size': 900, 'n_batch': 225, 'duration': 230.0189757347107, 'duration_batch': 1.0223065588209364, 'duration_size': 0.2555766397052341, 'avg_pred_std': 0.10247180342260334}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0040023055252256905, 'avg_role_model_std_loss': 3.8167529671252023, 'avg_role_model_mean_pred_loss': 7.529611734713794e-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.0040023055252256905, 'n_size': 450, 'n_batch': 113, 'duration': 101.59934687614441, 'duration_batch': 0.8991092643906585, 'duration_size': 0.22577632639143203, 'avg_pred_std': 0.04470131049484872}\n",
      "Epoch 5\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0029433389956506693, 'avg_role_model_std_loss': 0.4368025242733054, 'avg_role_model_mean_pred_loss': 1.580498963409443e-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.0029433389956506693, 'n_size': 900, 'n_batch': 225, 'duration': 229.80718541145325, 'duration_batch': 1.0213652684953478, 'duration_size': 0.25534131712383695, 'avg_pred_std': 0.1031194214626319}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0028074885386094035, 'avg_role_model_std_loss': 2.145103556606243, 'avg_role_model_mean_pred_loss': 1.1650951160528297e-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.0028074885386094035, 'n_size': 450, 'n_batch': 113, 'duration': 101.39577078819275, 'duration_batch': 0.8973077060902013, 'duration_size': 0.22532393508487278, 'avg_pred_std': 0.05228710767763576}\n",
      "Epoch 6\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0026049669001885277, 'avg_role_model_std_loss': 0.44792478884607234, 'avg_role_model_mean_pred_loss': 1.0308605452903701e-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.0026049669001885277, 'n_size': 900, 'n_batch': 225, 'duration': 230.53775358200073, 'duration_batch': 1.0246122381422256, 'duration_size': 0.2561530595355564, 'avg_pred_std': 0.10098279579128656}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.002687264719667534, 'avg_role_model_std_loss': 4.189337836805609, 'avg_role_model_mean_pred_loss': 1.241189197620803e-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.002687264719667534, 'n_size': 450, 'n_batch': 113, 'duration': 100.64273428916931, 'duration_batch': 0.8906436662758346, 'duration_size': 0.22365052064259847, 'avg_pred_std': 0.042642332664979375}\n",
      "Epoch 7\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.002563537800257715, 'avg_role_model_std_loss': 0.34648435719401377, 'avg_role_model_mean_pred_loss': 9.35702638039536e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.002563537800257715, 'n_size': 900, 'n_batch': 225, 'duration': 227.69733333587646, 'duration_batch': 1.011988148159451, 'duration_size': 0.25299703703986276, 'avg_pred_std': 0.10545726788747642}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0028965300656919784, 'avg_role_model_std_loss': 3.1744629383202634, 'avg_role_model_mean_pred_loss': 1.6787577942173726e-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.0028965300656919784, 'n_size': 450, 'n_batch': 113, 'duration': 100.22019076347351, 'duration_batch': 0.8869043430395885, 'duration_size': 0.22271153502994112, 'avg_pred_std': 0.05538224283527517}\n",
      "Epoch 8\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.002383246352579186, 'avg_role_model_std_loss': 0.3083862728209352, 'avg_role_model_mean_pred_loss': 9.936972519990587e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.002383246352579186, 'n_size': 900, 'n_batch': 225, 'duration': 227.7537636756897, 'duration_batch': 1.012238949669732, 'duration_size': 0.253059737417433, 'avg_pred_std': 0.10515566083292166}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0030194523966767723, 'avg_role_model_std_loss': 3.0041199968275354, 'avg_role_model_mean_pred_loss': 1.1394547741565071e-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.0030194523966767723, 'n_size': 450, 'n_batch': 113, 'duration': 100.15035581588745, 'duration_batch': 0.8862863346538713, 'duration_size': 0.22255634625752768, 'avg_pred_std': 0.04854994764514432}\n",
      "Epoch 9\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0021668040852819105, 'avg_role_model_std_loss': 0.2028817977175666, 'avg_role_model_mean_pred_loss': 7.674208641294594e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0021668040852819105, 'n_size': 900, 'n_batch': 225, 'duration': 226.46019649505615, 'duration_batch': 1.0064897622002495, 'duration_size': 0.2516224405500624, 'avg_pred_std': 0.10634001894543568}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0023035917821754184, 'avg_role_model_std_loss': 3.5878168070930125, 'avg_role_model_mean_pred_loss': 7.551760705609701e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0023035917821754184, 'n_size': 450, 'n_batch': 113, 'duration': 100.57623744010925, 'duration_batch': 0.8900551985850377, 'duration_size': 0.22350274986690946, 'avg_pred_std': 0.05207151871749439}\n",
      "Epoch 10\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss {'avg_role_model_loss': 0.0022073838575144894, 'avg_role_model_std_loss': 0.18685059259163805, 'avg_role_model_mean_pred_loss': 1.00230588112276e-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.0022073838575144894, 'n_size': 900, 'n_batch': 225, 'duration': 227.7475564479828, 'duration_batch': 1.0122113619910347, 'duration_size': 0.25305284049775867, 'avg_pred_std': 0.10737030942820841}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Val loss {'avg_role_model_loss': 0.0024145089968806133, 'avg_role_model_std_loss': 2.368802141273148, 'avg_role_model_mean_pred_loss': 1.0890554641507788e-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.0024145089968806133, 'n_size': 450, 'n_batch': 113, 'duration': 99.10306596755981, 'duration_batch': 0.8770182828987594, 'duration_size': 0.22022903548346626, 'avg_pred_std': 0.04590538341193501}\n",
      "Time out: 3648.574878692627/3600\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Eval loss {'role_model': 'realtabformer', 'n_size': 1050, 'n_batch': 263, 'role_model_metrics': {'avg_loss': 0.002682760669579563, 'avg_g_mag_loss': 0.008364482207499076, 'avg_g_cos_loss': 0.010354253430961675, 'pred_duration': 8.742810010910034, 'grad_duration': 8.114531993865967, 'total_duration': 16.857342004776, 'pred_std': 0.09103205054998398, 'std_loss': 0.0308249332010746, 'mean_pred_loss': 2.5912582714227028e-05, 'pred_rmse': 0.05179537460207939, 'pred_mae': 0.037153515964746475, 'pred_mape': 0.1209072470664978, 'grad_rmse': 0.3796982765197754, 'grad_mae': 0.21929873526096344, 'grad_mape': 5.288557529449463}, '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.002682760669579563, 'avg_g_mag_loss': 0.008364482207499076, 'avg_g_cos_loss': 0.010354253430961675, 'avg_pred_duration': 8.742810010910034, 'avg_grad_duration': 8.114531993865967, 'avg_total_duration': 16.857342004776, 'avg_pred_std': 0.09103205054998398, 'avg_std_loss': 0.0308249332010746, 'avg_mean_pred_loss': 2.5912582714227028e-05}, 'min_metrics': {'avg_loss': 0.002682760669579563, 'avg_g_mag_loss': 0.008364482207499076, 'avg_g_cos_loss': 0.010354253430961675, 'pred_duration': 8.742810010910034, 'grad_duration': 8.114531993865967, 'total_duration': 16.857342004776, 'pred_std': 0.09103205054998398, 'std_loss': 0.0308249332010746, 'mean_pred_loss': 2.5912582714227028e-05, 'pred_rmse': 0.05179537460207939, 'pred_mae': 0.037153515964746475, 'pred_mape': 0.1209072470664978, 'grad_rmse': 0.3796982765197754, 'grad_mae': 0.21929873526096344, 'grad_mape': 5.288557529449463}, 'model_metrics': {'realtabformer': {'avg_loss': 0.002682760669579563, 'avg_g_mag_loss': 0.008364482207499076, 'avg_g_cos_loss': 0.010354253430961675, 'pred_duration': 8.742810010910034, 'grad_duration': 8.114531993865967, 'total_duration': 16.857342004776, 'pred_std': 0.09103205054998398, 'std_loss': 0.0308249332010746, 'mean_pred_loss': 2.5912582714227028e-05, 'pred_rmse': 0.05179537460207939, 'pred_mae': 0.037153515964746475, 'pred_mape': 0.1209072470664978, 'grad_rmse': 0.3796982765197754, 'grad_mae': 0.21929873526096344, 'grad_mape': 5.288557529449463}}}\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-22T14:00:22.983471Z",
     "iopub.status.busy": "2024-03-22T14:00:22.983097Z",
     "iopub.status.idle": "2024-03-22T14:00:22.987681Z",
     "shell.execute_reply": "2024-03-22T14:00:22.986775Z"
    },
    "papermill": {
     "duration": 0.02542,
     "end_time": "2024-03-22T14:00:22.989686",
     "exception": false,
     "start_time": "2024-03-22T14:00:22.964266",
     "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-22T14:00:23.023599Z",
     "iopub.status.busy": "2024-03-22T14:00:23.023288Z",
     "iopub.status.idle": "2024-03-22T14:00:23.126595Z",
     "shell.execute_reply": "2024-03-22T14:00:23.125728Z"
    },
    "papermill": {
     "duration": 0.122795,
     "end_time": "2024-03-22T14:00:23.129060",
     "exception": false,
     "start_time": "2024-03-22T14:00:23.006265",
     "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-22T14:00:23.165615Z",
     "iopub.status.busy": "2024-03-22T14:00:23.165292Z",
     "iopub.status.idle": "2024-03-22T14:00:23.485004Z",
     "shell.execute_reply": "2024-03-22T14:00:23.484004Z"
    },
    "papermill": {
     "duration": 0.34071,
     "end_time": "2024-03-22T14:00:23.487074",
     "exception": false,
     "start_time": "2024-03-22T14:00:23.146364",
     "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-22T14:00:23.524381Z",
     "iopub.status.busy": "2024-03-22T14:00:23.523671Z",
     "iopub.status.idle": "2024-03-22T14:04:32.132930Z",
     "shell.execute_reply": "2024-03-22T14:04:32.132048Z"
    },
    "papermill": {
     "duration": 248.630794,
     "end_time": "2024-03-22T14:04:32.135514",
     "exception": false,
     "start_time": "2024-03-22T14:00:23.504720",
     "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-22T14:04:32.172721Z",
     "iopub.status.busy": "2024-03-22T14:04:32.172390Z",
     "iopub.status.idle": "2024-03-22T14:04:32.193148Z",
     "shell.execute_reply": "2024-03-22T14:04:32.192186Z"
    },
    "papermill": {
     "duration": 0.041408,
     "end_time": "2024-03-22T14:04:32.195213",
     "exception": false,
     "start_time": "2024-03-22T14:04:32.153805",
     "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>realtabformer</th>\n",
       "      <td>0.013763</td>\n",
       "      <td>0.006845</td>\n",
       "      <td>0.002683</td>\n",
       "      <td>8.117687</td>\n",
       "      <td>0.219299</td>\n",
       "      <td>5.28856</td>\n",
       "      <td>0.379699</td>\n",
       "      <td>0.000026</td>\n",
       "      <td>8.684867</td>\n",
       "      <td>0.037153</td>\n",
       "      <td>0.120907</td>\n",
       "      <td>0.051795</td>\n",
       "      <td>0.091032</td>\n",
       "      <td>0.030825</td>\n",
       "      <td>16.802554</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               avg_g_cos_loss  avg_g_mag_loss  avg_loss  grad_duration  \\\n",
       "realtabformer        0.013763        0.006845  0.002683       8.117687   \n",
       "\n",
       "               grad_mae  grad_mape  grad_rmse  mean_pred_loss  pred_duration  \\\n",
       "realtabformer  0.219299    5.28856   0.379699        0.000026       8.684867   \n",
       "\n",
       "               pred_mae  pred_mape  pred_rmse  pred_std  std_loss  \\\n",
       "realtabformer  0.037153   0.120907   0.051795  0.091032  0.030825   \n",
       "\n",
       "               total_duration  \n",
       "realtabformer       16.802554  "
      ]
     },
     "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-22T14:04:32.230875Z",
     "iopub.status.busy": "2024-03-22T14:04:32.230010Z",
     "iopub.status.idle": "2024-03-22T14:04:32.737553Z",
     "shell.execute_reply": "2024-03-22T14:04:32.736522Z"
    },
    "papermill": {
     "duration": 0.527728,
     "end_time": "2024-03-22T14:04:32.739757",
     "exception": false,
     "start_time": "2024-03-22T14:04:32.212029",
     "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-22T14:04:32.777689Z",
     "iopub.status.busy": "2024-03-22T14:04:32.777370Z",
     "iopub.status.idle": "2024-03-22T14:09:14.837137Z",
     "shell.execute_reply": "2024-03-22T14:09:14.836205Z"
    },
    "papermill": {
     "duration": 282.081664,
     "end_time": "2024-03-22T14:09:14.839804",
     "exception": false,
     "start_time": "2024-03-22T14:04:32.758140",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Caching in ../../../../contraceptive/_cache_aug_test/realtabformer/all inf False\n",
      "Caching in ../../../../contraceptive/_cache_bs_test/realtabformer/all inf False\n",
      "Caching in ../../../../contraceptive/_cache_synth_test/realtabformer/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-22T14:09:14.877034Z",
     "iopub.status.busy": "2024-03-22T14:09:14.876694Z",
     "iopub.status.idle": "2024-03-22T14:09:14.903623Z",
     "shell.execute_reply": "2024-03-22T14:09:14.902858Z"
    },
    "papermill": {
     "duration": 0.04813,
     "end_time": "2024-03-22T14:09:14.905644",
     "exception": false,
     "start_time": "2024-03-22T14:09:14.857514",
     "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-22T14:09:14.939512Z",
     "iopub.status.busy": "2024-03-22T14:09:14.939241Z",
     "iopub.status.idle": "2024-03-22T14:09:14.944671Z",
     "shell.execute_reply": "2024-03-22T14:09:14.943801Z"
    },
    "papermill": {
     "duration": 0.024708,
     "end_time": "2024-03-22T14:09:14.946665",
     "exception": false,
     "start_time": "2024-03-22T14:09:14.921957",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'realtabformer': 0.3827591784511294}\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-22T14:09:14.983564Z",
     "iopub.status.busy": "2024-03-22T14:09:14.983242Z",
     "iopub.status.idle": "2024-03-22T14:09:15.352971Z",
     "shell.execute_reply": "2024-03-22T14:09:15.352073Z"
    },
    "papermill": {
     "duration": 0.390816,
     "end_time": "2024-03-22T14:09:15.355058",
     "exception": false,
     "start_time": "2024-03-22T14:09:14.964242",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAASIAAAE8CAYAAABkYrxdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABHCElEQVR4nO3deXhTVf4/8PfNnrZZ2tKVpgul7LIvsgkqKogKOqKoM7Qi4iiM4zA8P2WeGdxGi46ijAujo7bgxox+cRtHBFTAUXZEQZC1LaWUtnRLm6RZz++Pm6RNm7RJmuS26ef1PHna3JzcnJs0n579cIwxBkIIEZBI6AwQQggFIkKI4CgQEUIER4GIECI4CkSEEMFRICKECI4CESFEcBSICCGCo0BECBEcBSLi02OPPQaO40J6zuLiYnAchwMHDviV/m9/+xsGDBgAsViM0aNHhzQvpOegQEQC8vTTT+Pjjz+OyGtt3boV/+///T9MnToVRUVFePrppyPyuiTyJEJngPQuTz/9NG699VbMnz8/7K/19ddfQyQS4c0334RMJgv76xHhUIkoShgMBqGzEHLV1dVQKpUhC0KMMZhMppCcqzuMRqPQWehxKBD1Qq62m2PHjuHOO+9EfHw8pk2bBgB45513MG7cOCiVSiQkJGDhwoUoLy/3eP63336LBQsWIDMzE3K5HDqdDn/4wx+6/JJyHAeDwYANGzaA4zhwHIeCggIAQFlZGR544AEMHjwYSqUSiYmJWLBgAUpLS72ey2g04r777kNiYiLUajUWLVqE+vp6j9cqKiqCwWBwv1ZxcTEAwGaz4cknn0Rubi7kcjmys7Pxpz/9CWaz2eM1srOzccMNN+DLL7/E+PHjoVQq8dprr2HHjh3gOA7//ve/8fjjj6N///5QqVS49dZb0djYCLPZjIceegjJycmIi4vD3Xff3eHc/r7XM2fOxIgRI3Dw4EFcccUViImJwZ/+9KdO3+e+iKpmvdiCBQuQl5eHp59+GowxPPXUU/jLX/6C2267DUuWLEFNTQ1eeuklXHHFFfjhhx+g1WoBAB988AGMRiPuv/9+JCYmYt++fXjppZdw/vx5fPDBBz5f7+2338aSJUswceJELF26FACQm5sLANi/fz++//57LFy4EBkZGSgtLcX69esxc+ZMHDt2DDExMR7nWr58ObRaLR577DGcOHEC69evR1lZmTtIvP3223j99dexb98+vPHGGwCAKVOmAACWLFmCDRs24NZbb8Uf//hH7N27F4WFhTh+/Dg++ugjj9c5ceIE7rjjDtx333249957MXjwYPdjhYWFUCqVeOSRR3D69Gm89NJLkEqlEIlEqK+vx2OPPYY9e/aguLgYOTk5WL16tfu5/r7XAFBbW4s5c+Zg4cKF+PWvf42UlJQAP+k+gJFe59FHH2UA2B133OE+VlpaysRiMXvqqac80h45coRJJBKP40ajscM5CwsLGcdxrKysrMPrtBUbG8vy8/M7PN/bOXfv3s0AsI0bN7qPFRUVMQBs3LhxzGKxuI8/++yzDAD75JNP3Mfy8/NZbGysxzkPHz7MALAlS5Z4HF+5ciUDwL7++mv3saysLAaAbdmyxSPtN998wwCwESNGeOThjjvuYBzHsTlz5niknzx5MsvKynLfD+S9njFjBgPA/vGPf3R4f0grqpr1Yr/97W/dv2/evBkOhwO33XYbLl265L6lpqYiLy8P33zzjTutUql0/24wGHDp0iVMmTIFjDH88MMPQeWl7TmtVitqa2sxcOBAaLVaHDp0qEP6pUuXQiqVuu/ff//9kEgk+O9//9vp67geX7FihcfxP/7xjwCAzz//3ON4Tk4OrrvuOq/nWrRokUceJk2aBMYYFi9e7JFu0qRJKC8vh81mAxDYew0Acrkcd999d6fX1ddR1awXy8nJcf9+6tQpMMaQl5fnNW3bL9y5c+ewevVqfPrppx7tMgDQ2NgYVF5MJhMKCwtRVFSEiooKsDYLf3o7Z/t8xsXFIS0tzWebkktZWRlEIhEGDhzocTw1NRVarRZlZWUex9u+R+1lZmZ63NdoNAAAnU7X4bjD4UBjYyMSExMDeq8BoH///tTr1wUKRL1Y21KIw+EAx3H44osvIBaLO6SNi4sDANjtdlxzzTWoq6vDww8/jCFDhiA2NhYVFRUoKCiAw+EIKi+/+93vUFRUhIceegiTJ0+GRqMBx3FYuHBh0OfsjL8DLdu+R+15e586O+4Krv6+1/7kgfAoEEWJ3NxcMMaQk5ODQYMG+Ux35MgRnDx5Ehs2bMCiRYvcx7dt2+bX6/gKAB9++CHy8/Px/PPPu4+1tLSgoaHBa/pTp07hyiuvdN9vbm5GZWUlrr/++k5fPysrCw6HA6dOncLQoUPdx6uqqtDQ0ICsrCy/rqM7/H2vif+ojShK3HLLLRCLxXj88cc9qkUA/5+8trYWQOt/+7ZpGGNYt26dX68TGxvrNbiIxeIOr/vSSy/Bbrd7Pc/rr78Oq9Xqvr9+/XrYbDbMmTOn09d3BaoXX3zR4/jatWsBAHPnzu3qErrN3/ea+I9KRFEiNzcXf/3rX7Fq1SqUlpZi/vz5UKlUKCkpwUcffYSlS5di5cqVGDJkCHJzc7Fy5UpUVFRArVbj//7v/zq0Ffkybtw4bN++HWvXrkV6ejpycnIwadIk3HDDDXj77beh0WgwbNgw7N69G9u3b0diYqLX81gsFlx99dW47bbbcOLECbz66quYNm0abrrppk5ff9SoUcjPz8frr7+OhoYGzJgxA/v27cOGDRswf/58j1JWuPj7XhP/USCKIo888ggGDRqEF154AY8//jgAvuH12muvdX/BpVIpPvvsMzz44IMoLCyEQqHAzTffjOXLl2PUqFFdvsbatWuxdOlS/PnPf4bJZEJ+fj4mTZqEdevWQSwW491330VLSwumTp2K7du3++yxevnll/Huu+9i9erVsFqtuOOOO/D3v//dr7afN954AwMGDEBxcTE++ugjpKamYtWqVXj00UcDeLe6x5/3mviPY+3LloQQEmHURkQIERwFIkKI4CgQEUIER4GIECI4CkSEEMFRICKECK5XjyNyOBy4cOECVCpVyBd5J4R0H2MMTU1NSE9Ph0jku9zTqwPRhQsXOsyUJoT0POXl5cjIyPD5eK8ORCqVCgB/kWq1WuDcEELa0+v10Ol07u+qL706ELmqY2q1mgIRIT1YV00n1FhNCBEcBSJCiOAoEBFCBNer24j8wRiDzWbzuUAX8U0sFkMikdDQCBJ2UR2ILBYLKisraWfNboiJiUFaWhot/k7CKmoDkcPhQElJCcRiMdLT0yGTyeg/ewAYY7BYLKipqUFJSQny8vI6HZBGSHcIGoiys7M7bP8CAA888ABeeeWVbp3bYrHA4XBAp9N12GWU+EepVEIqlaKsrAwWiwUKhULoLJEoJWgg2r9/v0fbzdGjR3HNNddgwYIFIXsN+i/ePdH0/pltdsgl3rcKIsISNBAlJSV53F+zZg1yc3MxY8YMgXJEolVtsxnv7zuH4ekaTM/rB32LDQmx1O7VU/SYNiKLxYJ33nkHK1as8NmWYzabYTab3ff1en2kskd6ufJ6E6x2hlPVTThS0Qi5RISlVwygdsMeoseUuz/++GM0NDSgoKDAZ5rCwkJoNBr3jSa8dl92dnaHPcKi0YUGEwBgRH8NOABGix2NJmvnTyIR02MC0Ztvvok5c+YgPT3dZ5pVq1ahsbHRfSsvL49gDklvVtPEl6TTNUokxPFVskvNFiGzRNroEVWzsrIybN++HZs3b+40nVwuh1wuj1Cueg+LxULjfDphszvQYORLP/1UciTEyFCtN6PeSIGop+gRJaKioiIkJydHZLtgALDYHD5vNrvD77RWP9IGY+bMmVi+fDmWL18OjUaDfv364S9/+Yt7e+Ps7Gw8+eSTWLRoEdRqNZYuXQoA+N///ofp06dDqVRCp9PhwQcfhMFgcJ+3uroaN954I5RKJXJycvDuu+8Glb/eps5ggYMxKKRixMrEiHc2UtcbKBD1FIKXiBwOB4qKipCfnw+JJDLZeeWb0z4fy+kXi/lj+rvvv77rDKx273tQZsQrsWB8azvVW9+VwGTxnEryh2sGBZXHDRs24J577sG+fftw4MABLF26FJmZmbj33nsBAM899xxWr17t3t30zJkzmD17Nv7617/irbfeQk1NjTuYFRUVAQAKCgpw4cIFfPPNN5BKpXjwwQdRXV0dVP56kzpnyScxlh/UGh/jDERUIuoxBA9E27dvx7lz57B48WKhs9Kj6HQ6vPDCC+A4DoMHD8aRI0fwwgsvuAPRVVddhT/+8Y/u9EuWLMFdd92Fhx56CACQl5eHv//975gxYwbWr1+Pc+fO4YsvvsC+ffswYcIEAHy73NChQyN+bZEmE4uQEa9EqoYfkKmNkQIANVb3IIIHomuvvRaR3vV62ZUDfT4matebu/SKXJ9p2/f8Lp6a051sebj88ss9upYnT56M559/3j0AdPz48R7pf/zxR/z0008e1S3GmHuqy8mTJyGRSDBu3Dj340OGDIFWqw1ZnnuqAUlxGJAU576vUUoxor8GaoUEjDHqwu8BBA9EQpBJ/G8aC1fa7oqNjfW439zcjPvuuw8PPvhgh7SZmZk4efJkpLLW4ymkYlwzLEXobJA2+mQg6g327t3rcX/Pnj3Iy8uDWOx9isLYsWNx7NgxDBzovbQ3ZMgQ2Gw2HDx40F01O3HiBBoaGkKa757I7mAQty/qkh6lR/SakY7OnTuHFStW4MSJE3j//ffx0ksv4fe//73P9A8//DC+//57LF++HIcPH8apU6fwySefYPny5QCAwYMHY/bs2bjvvvuwd+9eHDx4EEuWLIFSqYzUJQnC4WB49ZvT+OeuszBabO7jFpsDdQYLDGZbJ88mkUKBqIdatGgRTCYTJk6ciGXLluH3v/+9u5vem5EjR2Lnzp04efIkpk+fjjFjxmD16tUeA0SLioqQnp6OGTNm4JZbbsHSpUuRnJwcicsRTLPFBpuDwWixQ9FmwuvXv1Rhw/elOF5J04R6Aqqa9VBSqRQvvvgi1q9f3+Gx0tJSr8+ZMGECtm7d6vOcqamp+M9//uNx7De/+U238tnT6Z09YyqFBKI21bNYOf+nb7DQyp09AZWISFRrdla9VArP/7kxMr50ZLJQ1awnoEBEoprRWeJxlYBclFKJx+NEWFQ164F27NghdBaihmuku1Lm2dvoKhFRIOoZqEREopqrVyxG6j0QtZ+SQ4RBgYhEtYRYGXQJMUiM81ydQNmmRBTpkf2kI6qakag2PjsB47MTOhyPkUkwSqeBUiqBgwFiGu8oKApEpE8SizhcNYSmefQUVDUjUYuf9EvVrt6ASkQkalnsDqzfcQZKqRj3TMuBROz5f7fFaofJYodCKu7Qq0Yii0pEJGqZLHYwBtgcrEMQAoCtx6pQ/H0pTlU3CZA70hYFIhK1XNM3lFLvpR2Fc9mWFmtwS/qS0KFARKKWa/pGjI9ql8IZoFqsNJZIaH0rEDEG2CyRvwUwTmXjxo1ITEz02EgSAObPnx/1E1RDzTVqOkbuvSmUAlHPIXhjdUVFBR5++GF88cUXMBqNGDhwIIqKijoshRoSdivw7fOhP29Xpv8RkPi33c+CBQvw4IMP4tNPP8WCBQsA8LtvfP75553OrCcduQORr6qZlP8/bA5ytxUSOoKWiOrr6zF16lRIpVJ88cUXOHbsGJ5//nnEx8cLmS1BKZVK3Hnnne6dNwDgnXfeQWZmJmbOnClcxnoh1/QNqpr1fIKWiJ555hnodDqPL11OTugWoO9ALOVLJ5EmlgaU/N5778WECRNQUVGB/v37o7i4GAUFBbTIe4A0MVJkJsS4d3ZtT+5qrKYSkeAEDUSffvoprrvuOixYsAA7d+5E//798cADD7i3zGnPbDZ7tJ3o9QGursdxfleRhDRmzBiMGjUKGzduxLXXXouff/4Zn3/+udDZ6nXGZsZjbKbv0rVWKcNonRZqpeAtFH2eoFWzs2fPYv369cjLy8OXX36J+++/Hw8++CA2bNjgNX1hYSE0Go37ptPpvKaLBkuWLEFxcTGKioowa9asqL5WoWhipLhySDLGZXWci0Yii2MCTj2WyWQYP348vv/+e/exBx98EPv378fu3bs7pPdWItLpdGhsbIRarfZI29LSgpKSEuTk5EChUITvIsKksbER6enpsNls2LhxI26//XZB8tGb30eHg3ksD0siT6/XQ6PReP2OtiVoiSgtLQ3Dhg3zODZ06FCcO3fOa3q5XA61Wu1xi1YajQa/+tWvEBcXh/nz5wudnV7H7mD4+9en8I+dZzptjDZZ7Kg3WGCzUzuRkAQNRFOnTsWJEyc8jp08eRJZWVkC5ahnqaiowF133QW5XC50Vnodo8UGxgCz1eFulPZmw+5SFH9figbaflpQgrbS/eEPf8CUKVPw9NNP47bbbsO+ffvw+uuv4/XXXxcyW4Krr6/Hjh07sGPHDrz66qtCZ6dXatt131lvo0Iigslipy58gQkaiCZMmICPPvoIq1atwhNPPIGcnBy8+OKLuOuuu4TMluDGjBmD+vp6PPPMMxg8eLDQ2emVDD7Wqm6PH0tkpflmAhO83/KGG27ADTfcIHQ2ehRf+5YR/7l2dY2Vdx6IZBLX6GoqEQmpb801I32Ge/cOaef/a+XO3V8tNKhRUFEfiGhh9O7pre+fsYvpHS5yCc036wmiNhBJpfy0CqPRKHBOejfX++d6P3sLjZKf3tF+9472XFUzKhEJS/A2onARi8XQarWorq4GAMTExNBcrQAwxmA0GlFdXQ2tVguxuHctpTpKp8UonbbLdP3jlbA7GNK1yvBnivgUtYEIAFJTUwHAHYxI4LRarft9jEa5SXHITYoTOht9XlQHIo7jkJaWhuTkZFitNGAtUFKptNeVhFxoekfvEtWByEUsFvfaLxQJHGMML39zGjKJCL+5PAuxPlZoBPiAZbLaYWcMakXvageLJlHbWE36rharA3YHc28V1JmKBhNe33UWHx2qiFDuiDcUiEjUcQ1mlEtFEHdRPZNTr1mPQIGIRB3XGKJYWdctD64BjTSyWlgUiEjUMfo5zwxoHUdktTPYaXtqwVAgIlHH2MV+Zm3J2iwRQtUz4VAgIlHHFEDVTCziaHR1D0CBiEQdtXN6R784/xaUk4lpBr7Q+sQ4ItK3jOivwYj+Gr/TD0lTwWZn7oZrEnkUiEifNz0vSegs9HlUNSNRx0G9X70OlYhI1Fm/8wxEHIe7Ls/0a9qG3cFgttkh4rguR2KT8KBARKKKxeZw9351tntHW9/8Uo0jFY2YnJuIywckhjN7xAdBq2aPPfYYOI7zuA0ZMkTILJFeztV1LxFx7t6wrlD3vfAELxENHz4c27dvd9+XSATPEunFjFbnYEa5xO+F8Gi5WOEJ/q2XSCRRvfAWiSx/16pui0pEwhO81+zUqVNIT0/HgAEDcNddd/ncbhoAzGYz9Hq9x42QtozmwAOReycPOw1oFIqggWjSpEkoLi7Gli1bsH79epSUlGD69Oloamrymr6wsBAajcZ90+l0Ec4x6ela55n5X9inEpHwONaD9otpaGhAVlYW1q5di3vuuafD42azGWaz2X1fr9dDp9OhsbERarU6klklPdSxC3r8clGPAUlxGO3H4vkAUF5nxIcHz6NfnAy/mZwd1vz1NXq9HhqNpsvvqOBtRG1ptVoMGjQIp0+f9vq4XC6HXO7f/CHSNw1LV2NYemD/lOLkEgxNU9FSsQISvI2orebmZpw5cwZpaWlCZ4X0IfGxMswekYYpA/sJnZU+S9BAtHLlSuzcuROlpaX4/vvvcfPNN0MsFuOOO+4QMlukF6PpHb2ToFWz8+fP44477kBtbS2SkpIwbdo07NmzB0lJNAmRBOf1b8+CMWDhBB3iYzvf5bUtm90Bi90BhURM2xAJQNBAtGnTJiFfnkQZh3PnDoBfON9fjDG8uuMM7A6GJdNzoKK2oojrUW1EhHSH0coHIY4DFAGsLcRxtEqj0CgQkajRdq3qQKtXrnlpFjsFIiH0qO57QrrD5N69o5M/6xY9cG43YG4CUkcCSYMA0KBGoVEgIlHDPc/M15pC5mbgh7f5YAQAl04BQ28AUi9zByKa+CoMqpqRqNHlNkKnvuSDkDIeSBnuPLYVMDfRjq8CoxIRiRpxcimyEmOQrFZ0fLDpIlBzkm/JHnELENMPMNUB+krg/H7IxEMBUIlIKBSISNQYnKrC4FSV9wfP7eF/Jg8D4pL537OmAUc+AC4cRv+skeA4FeJjqOteCBSISPSzmoBLJ/nfdZNajyfmAnIVYG7CSGUtRmYOFiZ/hNqISPTwuXd99XHAYQfikgBVSutxjgNShvG/V/0c/gwSnygQkajxxrdn8eqO06gzWDwfqD7G/0y5rOOTkpxrpNeXwG6z0W6vAqFARKKCw8Fgstphtjo8d++wtgCNFfzvzjFDHlRpgFSJmvomFH3xHT7/qTIyGSYeKBCRqGC02sEYX9tSth1HVF8CMAcQk8h327fHcUBCDsQiDtqWcuq+FwgFIhIVfE7vqD3D/0wc4PvJ8dkQiziozBdpiodAggpEZ8+eDXU+COkW16L5HtM7GAPqnH+rCbm+n6zOgFjEIc5SA6vVGsZcEl+CCkQDBw7ElVdeiXfeeQctLS2hzhMhATM4S0SxbUdVG2sBiwEQSQBNJxstxCRAJIuBiNkhNlaHOafEm6AC0aFDhzBy5EisWLECqampuO+++7Bv375Q540Qv5nc+5m1KRE1lvM/1emAuJMhcxwHcXwGAEBhqEQP2k+izwgqEI0ePRrr1q3DhQsX8NZbb6GyshLTpk3DiBEjsHbtWtTU1IQ6n4R0Kk4hQXa/GCSr22yu0OAMRJqMLp8v1vJpVJYqmuYhgG41VkskEtxyyy344IMP8Mwzz+D06dNYuXIldDodFi1ahMpK6golkTEkVY2bx2RgbGabnrHG8/xPbdf734k16UiIlSFH0RymHJLOdCsQHThwAA888ADS0tKwdu1arFy5EmfOnMG2bdtw4cIFzJs3L1T5JCQwLY38jeMAdf8uk3NxKRicosIwrQMKUIN1pAUViNauXYvLLrsMU6ZMwYULF7Bx40aUlZXhr3/9K3JycjB9+nQUFxfj0KFDfp9zzZo14DgODz30UDBZIn1ch+kdrtJQXAog8WMvPFkMoHDuh2agButIC2rS6/r167F48WIUFBT43IMsOTkZb775pl/n279/P1577TWMHDkymOwQgn9+exYOxnDHhEx+9w79Bf4BP9qH3OJS4DA1gukvQqzNDE9GiVdBlYi2bduGhx9+uEMQYozh3LlzAACZTIb8/Pwuz9Xc3Iy77roL//znPxEf72XkKyFdsDt37zBbHa27dzRX8T9VqX6fZ1elCHtL6nDxQlkYckk6E1Qgys3NxaVLlzocr6urQ05OTkDnWrZsGebOnYtZs2Z1mdZsNkOv13vcCHGNqhZxHD+9gzF+ITQAiPM/EFmV/H56XFNVyPNIOhdU1czXOIvm5mYoFF5Wx/Nh06ZNOHToEPbv3+9X+sLCQjz++ON+n5/0De61qmVicBwHGOsAu5UfyBiT6Pd5WCy/YBoz1vLLhoj835KIdE9AgWjFihUA+H2gVq9ejZiYGPdjdrsde/fuxejRo/06V3l5OX7/+99j27ZtfgevVatWufMAAHq9Hjpd112zJLo1m52jquXOP2d3aSgJEPlf6BcpNbBzUjjsNsDUAMT6H8RI9wQUiH744QcAfInoyJEjkMlat/SVyWQYNWoUVq5c6de5Dh48iOrqaowdO9Z9zG63Y9euXXj55ZdhNpshFnv+R5LL5ZDL/egBIX2KwR2InH8vrvahAKplACCTSNAi1cDuaAaMlygQRVBAgeibb74BANx9991Yt24d1Gp10C989dVX48iRIx7H7r77bgwZMgQPP/xwhyBEiC/NLXwgUimcf87uhuoUH8/wTiYRoU6aALujCTBcApJo6dhICaqNqKioqNsvrFKpMGLECI9jsbGxSExM7HCckM5oYqT89A6Vol1DdeCByCSNh91aypeISMT4HYhuueUWFBcXQ61W45Zbbuk07ebNm7udMUL8NTxdg+HpGv5OSyO/WD4nApyNz/6Kj5EiMSUdsTVH+BIRiRi/A5FGo+F7JJy/h8OOHTvCcl7ShzQ7R0XHJnY+496LrMRYZI0bBuzZxfe8ORwBNXaT4Pn9SbWtjoWiakZIqFjtDkjFzoARxPghD3INH8DsNqClAYhJCEkeSeeCCvcmkwlGo9F9v6ysDC+++CK2bt0asowR4g+r3YGXvz6NV3ec5nfgCGJEtQeRCA6ls7eMqmcRE1QgmjdvHjZu3AgAaGhowMSJE/H8889j3rx5WL9+fUgzSEhnXD1mDgeDTCxqUyIKrH0IABqNVrz89Sl8WeKcfW+sDVU2SReCXqFx+vTpAIAPP/wQqampKCsrw8aNG/H3v/89pBkkpDOuwYxxcgk4qxEwN/EPBNhjBgBSCQernaFZpOZnD5jqQ5lV0omgApHRaIRKxe8xvnXrVtxyyy0QiUS4/PLLUVZGEwZJ5LjXqpZLWqtlMQn+Lf3RjszZzmSSaGBnDDDVhSyfpHNBL57/8ccfo7y8HF9++SWuvfZaAEB1dXW3BjkSEihX1SxOLgFck1WDKA0BgEQsgljEoUWi4dc3MlIgipSgAtHq1auxcuVKZGdnY9KkSZg8eTIAvnQ0ZsyYkGaQkM64q2YKCdAc3EDGtuQSEVqkaj4QWQyAzRyKbJIuBDWy+tZbb8W0adNQWVmJUaNGuY9fffXVuPnmm0OWOUK64jHhtTa4qR1tySQiGEVyWDklACtfKlJ7X/yPhE5QgQgAUlNTkZrq2UU6ceLEbmeIkECkqBWw2Rn6KdDauBzsGCLwgQgALDItYK/hz0mBKOyCCkQGgwFr1qzBV199herqajgcntuv0E6wJFImZCdgQjaABn5lUCjU/PrTQUrXKhEnl0BsTwT0NdRgHSFBBaIlS5Zg586d+M1vfoO0tDT31A9CBNPNhmqXKwc7xx+VpQL6X6jBOkKCCkRffPEFPv/8c0ydOjXU+SHEb3YHg93B+OpUCBqqPSid66dTiSgiggpE8fHxSEigOThEWJWNJnxw4DxS1ArcKerm1I52mDIeHMCXiBjj90cjYRNU9/2TTz6J1atXe8w3IyTS9Ca+x0wusgMG53SMbpaI9pXU4eWvT2HXef7csJn5ZUVIWAVVInr++edx5swZpKSkIDs7G1Kp1OPxQDZWJCRYTS38nLB+nB5gDr6RWq7q1jk5DrDaGcwOMd/w3aLnq2fdaAAnXQsqEM2fPz/E2SAkcHrnqOp4h7MdJy6l21Uo1zQPs80BKBP4QGSsC2yjRhKwoALRo48+Gup8EBIwV4lIY28TiLrJPY7I5gDi4oH6UmqwjoCgl59raGjAG2+8gVWrVqGujv+gDh06hIqKipBljpDONLkWzbc624dC0FDtDkR2R+uiaDQLP+yCCkQ//fQTBg0ahGeeeQbPPfccGhoaAPBrVa9atcrv86xfvx4jR46EWq2GWq3G5MmT8cUXXwSTJdLHMMbQ1GIFx+xQWkLTUA20Vs0sNkebLnwKROEWVCBasWIFCgoKcOrUKY/NEa+//nrs2rXL7/NkZGRgzZo1OHjwIA4cOICrrroK8+bNw88//xxMtkgfYncwDElVY5DKDLmIARJZa+DoBrnUSyBydeGTsAmqjWj//v147bXXOhzv378/Ll686Pd5brzxRo/7Tz31FNavX489e/Zg+PDhwWSN9BESsQizhqUAlVXALxw/vywEY32UUjH6a5WIkYsBhZY/p93Kz8SXx3U/48SroAKRXC6HXq/vcPzkyZNISkoKKiN2ux0ffPABDAaDe1mR9sxmM8zm1mUZvOWB9DGupWG7MeO+LZVCitsmtNnGXK7mtygy1VMgCqOgqmY33XQTnnjiCVitfK8Fx3E4d+4cHn74YfzqV78K6FxHjhxBXFwc5HI5fvvb3+Kjjz7CsGHDvKYtLCyERqNx32jf+77LaLE5F8vv5q4dXaGpHhERVCB6/vnn0dzcjKSkJJhMJsyYMQMDBw6ESqXCU089FdC5Bg8ejMOHD2Pv3r24//77kZ+fj2PHjnlNu2rVKjQ2Nrpv5eXlwWSfRIHvTtfi1a9P4Xx5KX9AFaalOqjnLCKCqpppNBps27YN3333HX788Uc0Nzdj7NixmDVrVsDnkslkGDhwIABg3Lhx2L9/P9atW+e1DUoul0MuD3wtYhJ9GowWKK0NkIscgFga0v3H3tlThkaTFbeN1yGJes4iIuBA5HA4UFxcjM2bN6O0tBQcxyEnJwepqalgjHV7SRCHw+HRDkSIN40mK2Ktl6BQiPjxQyGclGqzO2CxOfixRG17zkjYBBSIGGO46aab8N///hejRo3CZZddBsYYjh8/joKCAmzevBkff/yx3+dbtWoV5syZg8zMTDQ1NeG9997Djh078OWXXwZ6HaQPsdodaGqxIdFSA0WcOOTtQzKJGIDV2YXfpmpGs/DDJqBAVFxcjF27duGrr77ClVde6fHY119/jfnz52Pjxo1YtGiRX+errq7GokWLUFlZCY1Gg5EjR+LLL7/ENddcE0i2SB+jNzmndtjqIBFzIesxc3GNrjbb7IBCQ134ERBQIHr//ffxpz/9qUMQAoCrrroKjzzyCN59912/A9Gbb74ZyMsTAgBoMFkB5kAC6sEhNuQN1R7zzcSSNl34dRSIwiSgXrOffvoJs2fP9vn4nDlz8OOPP3Y7U4R0psFohdLWiBiRM1AoQ7tIn8c0D4B6ziIgoEBUV1eHlBTfxeCUlBTU19OHRcIrKU6O0VoTtDFSfn6ZKOi5217JJe0CEfWchV1AVTO73Q6JxPdTxGIxbDZbtzNFSGcyE2OQmdgCmBWAOj3k54+PlaG/Vslv2ghQz1kEBNxrVlBQ4HMsD3W7k4jRO5ebUYd+wbLROi1G67StB5RUNQu3gAJRfn5+l2n8bagmJBg2uwN1+iYkNlVDzAHQ9A//i7atmlEXflgEFIiKiorClQ9C/FJnsOCz/x3C6No6jBuc3e01qv2i1Lbpwm+OzGv2MaFt5SMkzGoNFqjMVVBIxYA6PKWh8joj/rnrLP59wDmXUSTmxxMBVD0LEwpEpEuNJit2nqzB7jO1/CA/AdUZLIizVEMpC18g4jig2WyD0dym44V6zsIqqEmvpO9osdrxwYFy9/rQ5XVG3DouAyKRMO0ktc1mxJuroYwRh619yGPdahdlAoAS6jkLEyoRkU4dLKtHU4sNMTIxZBIRKhpMOHy+QbD8mOovQuJogVKhCN320u3IxWIAbcYRAVQiCjMKRKRTIo6DSiHB1UNTMD2vHwDgQGkdrG1LCxFidzCwhnMAAHm/LL7tJgxc61Zb7Qx2h3OtagpEYUVVM9KpybmJuHwAP47Gwfgtmc02B6qbzOivVUY0L3UGC1SmCkhEHBRJOWF7Ham49f+zxebg26NiaBZ+OFEgIl1yrTEl5oD5Y/pDrZC621EiSSnlMErVCCgU4OKzw/Y6YhEHqZiD1c5aA5HHLHzqwg81CkTEpyp9C/rFySFu0zDdL064FTLjLLWIixMBkvjwrVHtlKJWwNF2CyFXF76pgW+wpkAUUhSIiFfNZhve23sOMokIS68Y4FFdAfjpPiarHTGyCP4J1ZfyP7WZIZ/o2t6C8V42ZlAm8IHIVA/EZ4X19fsaCkTEk7kZOLUVxspzyKxPQEvG1A5BqLbZjM+PVMJmZ7h7ana3lwf2B2MMF0uOQmu1QxGfDUFaaKjBOmwoEJFWdivw4/uA4RIMjQakN52HutkOsAEejbNqpRRNLTZYbA5caGyJSKO1Xq9H6ZmTEHEM46flIjz9ZV2grYXChrrvSavyvYDhEiCLxWnNZDg4MVLMZUC15/ZOUrEIuUn8SoW/VEZmk8v6878AYOBUKRDHdH9r6a5880s1/rnrLI5WNLYepAXSwoYCEeHZLMD5/QAANvBqnJQMRoV6DGJkYuDsDsDhObVjWJoaAHCyqrl1rE0YGS4cBwBIkweF/bUAflR1s9mGFmub624/C5+EjKCBqLCwEBMmTIBKpUJycjLmz5+PEydOCJmlvqvmOGBtAZTxaIzLhcXmQJV2FBSxGqBFD1T97JE8I16JOLkELVY7Si4Zwps3awvsNacAAHEZ3ncBDjVZ+1UaAWcXvgiw2wBzU0Ty0VcIGoh27tyJZcuWYc+ePdi2bRusViuuvfZaGAxh/sMmHVU5q19pI3HJwO+SkaCKgUg3gT9ecdAjuUjEYXAq34X9y8XwVs+sVcdhNJlhkmqRnBaZ3iq52LWTR5tARLPww0bQxuotW7Z43C8uLkZycjIOHjyIK664QqBc9UEWA9BQxv+ePBSJDjmm5fXj125O7geUfgs0XQSaq4G4ZPfThqSpcLCsHmdrDGix2vmlOcKgqewwGACDdgjUSmlYXqO91i2F2k1lUcbzQYi68EOqR/WaNTbyDYMJCd53ZTCbzR7L0er1kWkojXp1Z/k2D1UKoIxHPIAJsW0+g8SBQM0JoPInIK91W/FklQLjs+Ohi49x73wRcoZaGKvOAuAg7X9ZRIYKAD5m4APUcxYmPaax2uFw4KGHHsLUqVMxYsQIr2kKCwuh0WjcN53Oy6AzEjjXQMF4H/O30kbxP6uOAg7PL+b0vCRk94sN37Ig5/cjVaNAzpCRGDEgcp+3XMKX7szWdusvUc9ZWPSYQLRs2TIcPXoUmzZt8plm1apVaGxsdN/Ky8sjmMMoxRhQV8L/njAAdgfD6epm1DabwVw9Q/E5gFQJWE1AQ2knpwpxT5K5Cag6AolIhNRhVyAjPia05+9ErFyMxDhZx6ogDWoMix5RNVu+fDn+85//YNeuXcjI8L0rg1wu97mDCAmSoYZvIxJLAXV/NJqs+OzHC5BJRHhgZi6fRiQCkoYAF34Aqn8BEgZ4nMJkseNAWR2q9Gb8amz/0FWfSv/H91Bp+vPTOiIoIz4GiyZnd3yAFtIPC0FLRIwxLF++HB999BG+/vpr5OSEb2kH4kOjs1SpyQDEEtQbLQAAbYzUM6AkD+F/XjrRYUyRnTH8dL4R5XVG/Hi+ESHRWAFU/oiyWgMOSsag2SLsErVu1IUfFoIGomXLluGdd97Be++9B5VKhYsXL+LixYswmUxCZqtv0V/gfzrXf25wBqL4GJlnOk0mIIvhxxq52pSc4uQSTB3IL5q262QNyuuM3cuT1QQc/xQ2ux0/23XYVSX3XD9aSB5d+NRgHSqCBqL169ejsbERM2fORFpamvv2r3/9S8hs9S2Nro0K+R1T651jiLQx7dpGXNUzgO9Ba2dUhgZ5KXGwOxg++qEC35+5hEaTNfD8WIzAT/8GTA2osSpwWjsFCbEyJKkiXyV/b+85vL7rDPQt7a4jlg+6MNRGPE/RStA2opA3bpLAWAytja7OElG9rxIRwAeiikPO6tl1Hku1chyH2cNTAVzEqapm7D1bh71n63DDyDTkpfADH5vNNhgtNiTGeq5x5FZ3FjixBWhpBJMo8C13BexWOYanqyPWbd+WwWyDwWxHi8UOtaJNYI5JBHAKMF6KeJ6iVY9orCYCcZWGYvsBUgUAoMHI//f3Gog0OkAWywew+lIgMdfjYYlYhLmXpeFUSjMOn2tAZWML4mNbz3PiYhN2nayBQirGiP5qjNJp+S94czVw5hs+EAGAMh6nk69BxRk7ZBIRRvTXhPzS/aGQitBsBkztu/DdJSIKRKFCgagvc+8fz5eGzDY7mp1tMR2qZkBr9aziID8jv10gAviS0aAUFQalqGCxOSBpU/KxOxjkUhFarHYcKK3Hj2cvYgr3IwazUsTKxHwJK30s9GmT8PXBagDA+Kz4sI3Y7orrdVus7QY1xibxP6lEFDIUiPoyVyBy7g8m4jjMHZmGphar7y9/yjA+ENWcAPKuAyReSk5O7de1npiTgPFZ8SipNeD4iRNQnf4UZrsBPwGQpA7FuJk3QxSbgAO/VMFosaOfSo5xWeFf8sMX13vQoUQUk8h321uMfOlQFitA7qILBaK+yuEAmir5350lIqlYhEEpXazFrO7P7wVvagBqTwEpwwN6WZGIQ67kEnId36A5VYIyUzJ2yy5Hmi4PIue0kim5/VBvsOKa4SmQhGvqiB+U7hJRu0AklrauX+1cv4l0DwWivsp4iR8LI5E5G1/9xHF88Cn9jl8aJMBABGMdcPT/ALsVcWl5GD78ZvS3eDZEK6Ri/Gqc74GtkeKzRAQAMf2cC+lfosmvIdBjpniQCHONH4pLdY8OLrlkwNmaZpi6GjyY7Aw+dSV81cRfdhtw7GN+ETZNBjDiVkAihzZGBq23xnGBqZUSJMbJ3CUjD7HO4E1d+CFBJaK+quki/1Od5j60+0wtqvQtuHFUOgYmx/l+bmwi/zx9JV8q0k307zXPfA00VfHz1obNA8Q9+89vZIYWIzO03h+McfacUYN1SFCJqK9ytQ+p+EDEGGszhsiPNX9cM/IrDnaYke9V9fHWxdWG3ggo1IHmuGdxd+HXCJuPKEGBqC+y21q/QCp+o0KjxQ6LzQGOAzT+LD6WMoIfe2RqAOrOdJ7WWAec+C//e9Zkr93+vY6rRGQx8jfSLRSI+iJDDT9xVaoEFFoArSOq1Qqpfz1VYmlrqajse9+LybdvF8ruPStvNptteHtPGd78X0nHByWy1jlnVD3rNgpEfVGTs6FaleZuqHaNqPY6kNGXjAl8O4/+AnDplPc0p7d5tguFeYfWUJKJRbjUZIbeZPVcRN/FVT1rpupZd/WevwoSOq6GalXr/vHu9qHYAHqv5Cogw9lQfXobPzO/rYpDwIXDfLDrhe1CMokIUjEfqI0WL7P/Xet3G6ojmKvoRIGoL2rXUA0A9Z3NMetM5mR+gGOLvrUKxhjfMH1qK58m54pe2y4UI+N79gzehjTEpfA/m6simKPo1LP7T0no2a2tkzXblIim5CZiUEocUtWKwM4nkfFVrsPv8eOK9v4DkCgAo3N8Tf+xfLDqpWLlYjSarDB5LRG5AlEN33PYi6qdPQ29c31NcxVfYpHHeVSV+sXJMSRVHdzAQnU6MPJ2vvHWYuCDkEgC5F4J5F3bq5dTdZeIzF5KRMp4vtHeYWsNvCQoVCLqa/Qdq2UhodUBE5cCjef4njKtjm+g7uViZPyoaoO3EhHH8e1EjRV8gI9LinDuogeViPoad/tQa7XsUrMZP5yrR0VDN5foFUv4hfWTBkVFEAL4XsR+cTL39kIdxDnfR2on6hYqEfU17h6z1hJReZ0RO07UYGByHPproyOAhMq4rASMy/K+4SeA1p6zZuo56w4qEfUlFmNrW0abQNTpqoykc217zmjp46AJGoh27dqFG2+8Eenp6eA4Dh9//LGQ2Yl+rhn3MYn8jhxObbcQIgGKTeK3F7KagJYQbaXUBwkaiAwGA0aNGoVXXnlFyGz0Hfrz/E/niowu7jFEgQxm7CMMZhve3l2KN749632zB7GktXrmCvQkYIK2Ec2ZMwdz5swRMgt9S6PnGtUAYLU70NTiqppRiag9mUSES818idFsc3hfQlfdn297a7rAL6VLAtarGqvNZjPMZrP7vl6vFzA3vYzD3jrHTNO6+mG90QLG+NUIvS4A1sdJxSIoZWKYLHbofa3lrU4DKkAlom7oVY3VhYWF0Gg07ptOpxM6S71HcxU/vkeq8Fgattb53z4xVibI3mG9gUrB/79ubvGx26yrhNlU1WE7buKfXhWIVq1ahcbGRvetvLxc6Cz1Hg3O90qd4THSeWByHO6YmIlpef0EyljPp3JurtjkKxAp4/kA77DReKIg9aqqmVwuh1we+a2Ho4Jrv/p2C71LxSKkagKcX9bHuEpEPgMRx/Glotoz/Mh15/bdxH+9qkREgmS38VMvACA+W9Cs9EZqdyCydpLIGXxcPZMkIIKWiJqbm3H69Gn3/ZKSEhw+fBgJCQnIzMwUMGdRRn+eD0ay2NZdSgFYbA58d/oSEmJlGJmhoTYiHzRKGRLjZIiVd/J1cbUTNZTzAxvpvQyIoIHowIEDuPLKK933V6xYAQDIz89HcXGxQLmKQu5qWbbHF6TeaMHh8gbEyMQYpdMKkbNeYWByXOe7mgB8T6RIDJibAFM9ENPJtBDSgaCBaObMmd4HiZHQci3jmpDjebiZHwqRGEftbt0mlvLVs4ZyoKGMAlGAqI0o2hlq+YXQOBGQONDjoeomPhD1i6MR1f5gjHX+j1Pr7AioL4tMhqIIBaJod+kk/zM+q8PSHNV6fo3plEBXZeyDthytxKs7zqDkUic727p6JBvKaAJsgCgQRTPGgKqj/O9Jgz0ecjgYapwlIgpEXbM7+MZ917w8r1Tp/Nwzi5E2XgwQBaJo1lTJV8tEEiBpqMdDdUYLrHYGmUREc8z84HqP6g0W34nEktbqWe1p3+lIBxSIotmFw/zPpMH8yN82XFM7klVy6rb3g2stb9eSKT652uF87fNGvOpVI6tJAMxNrdWy9NEdHh6cqkJWYgxM3rbJIR0kOJdIaeisagYA/fKAk1/yE2DNzfwmBaRLVCKKVuV7+QmYmgxA431ysEIqpjWI/ORaNK7ZbOs8eMtV/Gx8AKilUpG/KBBFI2Mdv8sqAGRNoVG+IaCQiqFR8sHI1cjvU2Ie/7PmZJhzFT0oEEUbxoCTW/jSUMIA/tbO2Zpm/PtAOX463xD5/PVi2f1iMCApFmJxF4E92dkxUF/CV5FJl6iNKNqUfc8PqBNLgLxrvJaGymqNqKg30UDGAF01JMW/hDEJ/HK8jRVA1c9A5uXhzVgUoBJRNKk6BpR+y/+ed53XaQaMMZx1DsrLSoyNZO76ltTL+J8Xj9DgRj9QIIoWNSeB45/xf/T9xwJpI70nazZDb7JCKuaQmRDjNQ3pXKPJihZrF72NSUP5+WeGS3wVjXSKAlE0qDgI/LwZYA4gdQS/37wPZ6r50pAuIQZSMX38gfrsxwt4638lOFPT3HlCqQJIG8X/Xr4v/Bnr5egvsTdjDDjzNXByK/972khg8FyfvWSMMRyr5DccyEtWRTKnUcM1nuhcrbHrxBkT+M+iroQW1u8CBaLeymYGfv4IOLeXv59zBTD4ekDk+yMtrzNBb7JCJhEhL4UG2gUjpx/frnb2kgFWu6PzxEotkDKc//30dmor6gQFot7IWAcc2gjUnOAX4xp6I5A9tcvxQrFyMXKT4zA0TUXVsiClaRRQKSSw2Bwoq+1kJr5Lzgy+B7OxonWkO+mA/hp7m0ungIPFfCOoPA4YfSffLuSHxDg5bhqVjpmDksObxyjGcRyGpKoBAD+ca+j6CQo1kDWV//3UVv6fCOmAAlFvYbMAJ7YARz7kq2WaDGBcgcdmib7YHZ4LeolENNK6O0bpNBBxHM7Xm3C+3o+2It3lgFbHf4ZH/w+w+FGS6mN6RCB65ZVXkJ2dDYVCgUmTJmHfPuplcGMMqP4FOPAmcOEH/ljGBL4kJO+6wZkxhm3HqvCfnyphsXXRpkH8olJIMaI/Xyo6dsGP3YZFImDoTXwJ1nAJOPwelYzaETwQ/etf/8KKFSvw6KOP4tChQxg1ahSuu+46VFdXC501Ydlt/KjcQxv4RmlTAx94Ri0E8mbxbUNdaDbb8NlPlTheqcfZGgOqm1rCn+8+YurAfrhmWAquGebnaGuFGhh1J7+TiuEScLCI79a3dzGbv4/gmMCr10+aNAkTJkzAyy+/DABwOBzQ6XT43e9+h0ceeaTT5+r1emg0GjQ2NkKtVkciu6HHGGC3AFYjv/tDcw2//U9dSesfqVgC6CbxRXxJ59MyapvNqG4y41ydEaeqmmC1M4hFHK4dnuJu2yChV2ew4KfzDchKjEVCrAwqucR7FbhFDxz7mG+8BvjPMzGPr7rFJgEKLSCN6bT3szfx9zsq6Fwzi8WCgwcPYtWqVe5jIpEIs2bNwu7duzukN5vNMJtbZz7r9X4UiwH+S33mK+/dpx7HmO9jXaR1MIZD5+p8PM0BbYwMeUmtUyoOltXBwQCRwwqOeY7SVSkk/DgfeRyQPgbvnkuAoVwOdq7c49SMAakaOW4e09pOtGl/uUcVLFWjwFVDkmk52DDbX1qHYxf0Hg3YUjEHmUQEsUiEBeMzoFZIAYUaBxOuR2XNfqTUH4LMWg2Uepb+B6eooFDIAbEcFXorLjS2AODAOI7/CQ7gAIDD8HQ14pz7rV1oaEG5s81KzHEYnx0f3ou+7Da+pBcCggaiS5cuwW63IyXFs3ibkpKCX375pUP6wsJCPP7444G/kM3MlzTCiTFYjb5nWttFFsDa+l/OZjbC0SZYOTgxzBIVTNJ4NMX3R964SYAqFeA4NJaehtnHlAKz1bPdJz5GBhHHB6BBKSqkaRS0AmMEDErh2+suNrag0WSF3cFgtTNY7XYAnp+dwcJwSpSLUwkDoDJfhLblPFSWKsitesjtBjgY46vmdhscJiNsBpPvF242A1bn17jZBEcTH4g4EQc0+9giO1RY6Noce9Xs+1WrVrk3YQT4EpFO533RLw9aHd+2ArQZa9Pmy+nxRQ3kOOfxqG5gi/Nhz7QcALlUBMS2lkqyh7TwhSmxFEwaA04sc59aJhYBbRYsWzBOBwYGzvl6rtNzACTtxgPdOYl2yBVCTr9Y92BHh4PBbHPAYnPAbLfD7mCIkba26Y3M0CCnX6yzMK0DMKH1RA47JHEcACtgs0BjNEPUYnGWvFlrqdwZBKQqGeD8G4gz25Bp4oMPxwHQhLkULAvdpGlBA1G/fv0gFotRVVXlcbyqqgqpqakd0svlcsjlQWwGKIvtsLlgqHEAMgIopQYysDlJRRsg9iYiEQelTAylTAyg48YE2hiZew3srqhVgL9/Vmr4n7anEbRFTCaTYdy4cfjqq6/cxxwOB7766itMnjxZwJwRQiJJ8KrZihUrkJ+fj/Hjx2PixIl48cUXYTAYcPfddwudNUJIhAgeiG6//XbU1NRg9erVuHjxIkaPHo0tW7Z0aMAmhEQvwccRdUdUjCMiJIr5+x2NjlFThJBejQIRIURwFIgIIYITvLG6O1zNW35P9SCERJTru9lVU3SvDkRNTfyUCr9GVxNCBNPU1ASNRuPz8V7da+ZwOHDhwgWoVKoeOZ/KNQWlvLw8Knv1ovn6ovnagMhdH2MMTU1NSE9Ph6iTFQV6dYlIJBIhI6PrFQqFplaro/KP2SWary+arw2IzPV1VhJyocZqQojgKBARQgRHgSiM5HI5Hn300eBWDOgFovn6ovnagJ53fb26sZoQEh2oREQIERwFIkKI4CgQEUIER4GIECI4CkQBCnRX2g8++ABDhgyBQqHAZZddhv/+978ejzPGsHr1aqSlpUGpVGLWrFk4depUOC/Bp0Cu7Z///CemT5+O+Ph4xMfHY9asWR3SFxQUgOM4j9vs2bPDfRk+BXJ9xcXFHfKuUHguRt9bP7uZM2d2uDaO4zB37lx3moh/doz4bdOmTUwmk7G33nqL/fzzz+zee+9lWq2WVVVVeU3/3XffMbFYzJ599ll27Ngx9uc//5lJpVJ25MgRd5o1a9YwjUbDPv74Y/bjjz+ym266ieXk5DCTyRSpy2KMBX5td955J3vllVfYDz/8wI4fP84KCgqYRqNh58+fd6fJz89ns2fPZpWVle5bXV1dpC7JQ6DXV1RUxNRqtUfeL1686JGmt352tbW1Htd19OhRJhaLWVFRkTtNpD87CkQBmDhxIlu2bJn7vt1uZ+np6aywsNBr+ttuu43NnTvX49ikSZPYfffdxxhjzOFwsNTUVPa3v/3N/XhDQwOTy+Xs/fffD8MV+BbotbVns9mYSqViGzZscB/Lz89n8+bNC3VWgxLo9RUVFTGNRuPzfNH02b3wwgtMpVKx5uZm97FIf3ZUNfOTa1faWbNmuY91tistAOzevdsjPQBcd9117vQlJSW4ePGiRxqNRoNJkyb5PGc4BHNt7RmNRlitViQkJHgc37FjB5KTkzF48GDcf//9qK2tDWne/RHs9TU3NyMrKws6nQ7z5s3Dzz//7H4smj67N998EwsXLkRsrOc+ZZH87CgQ+amzXWkvXrzo9TkXL17sNL3rZyDnDIdgrq29hx9+GOnp6R5fiNmzZ2Pjxo346quv8Mwzz2Dnzp2YM2cO7Hbvu9aGSzDXN3jwYLz11lv45JNP8M4778DhcGDKlCk4f/48gOj57Pbt24ejR49iyZIlHscj/dn16tn3pGdYs2YNNm3ahB07dng06C5cuND9+2WXXYaRI0ciNzcXO3bswNVXXy1EVv02efJkj731pkyZgqFDh+K1117Dk08+KWDOQuvNN9/EZZddhokTJ3ocj/RnRyUiPwW6Ky0ApKamdpre9TOQc4ZDMNfm8txzz2HNmjXYunUrRo4c2WnaAQMGoF+/fjh9+nS38xyI7lyfi1QqxZgxY9x5j4bPzmAwYNOmTbjnnnu6fJ1wf3YUiPwUzK60kydP9kgPANu2bXOnz8nJQWpqqkcavV6PvXv3RnSn22B33H322Wfx5JNPYsuWLRg/fnyXr3P+/HnU1tYiLS0tJPn2Vyh2FLbb7Thy5Ig77739swP4oSVmsxm//vWvu3ydsH92EWsWjwKbNm1icrmcFRcXs2PHjrGlS5cyrVbr7tb9zW9+wx555BF3+u+++45JJBL23HPPsePHj7NHH33Ua/e9Vqtln3zyCfvpp5/YvHnzBOsCDuTa1qxZw2QyGfvwww89unibmpoYY4w1NTWxlStXst27d7OSkhK2fft2NnbsWJaXl8daWloiem3BXN/jjz/OvvzyS3bmzBl28OBBtnDhQqZQKNjPP//sTtNbPzuXadOmsdtvv73DcSE+OwpEAXrppZdYZmYmk8lkbOLEiWzPnj3ux2bMmMHy8/M90v/73/9mgwYNYjKZjA0fPpx9/vnnHo87HA72l7/8haWkpDC5XM6uvvpqduLEiUhcSgeBXFtWVhYD0OH26KOPMsYYMxqN7Nprr2VJSUlMKpWyrKwsdu+993YYixNJgVzfQw895E6bkpLCrr/+enbo0CGP8/XWz44xxn755RcGgG3durXDuYT47GgZEEKI4KiNiBAiOApEhBDBUSAihAiOAhEhRHAUiAghgqNARAgRHAUiQojgKBARQgRHgYj0KsXFxdBqte77jz32GEaPHu2+X1BQgPnz50c8X6R7KBARr1xrFv/2t7/t8NiyZcvAcRwKCgo80oc6AGRnZ+PFF1/0OHb77bfj5MmTPp+zbt06FBcXu+/PnDkTDz30UEjzRUKPAhHxSafTYdOmTTCZTO5jLS0teO+995CZmSlInpRKJZKTk30+rtFoPEpMpHegQER8Gjt2LHQ6HTZv3uw+tnnzZmRmZmLMmDHdOre3ksr8+fPdpayZM2eirKwMf/jDH9y7SAAdq2bttS2ZFRQUYOfOnVi3bp37HCUlJRg4cCCee+45j+cdPnwYHMdFfK0kwqNARDq1ePFiFBUVue+/9dZbuPvuu8P+ups3b0ZGRgaeeOIJVFZWorKyMuBzrFu3DpMnT8a9997rPkdmZmaHawKAoqIiXHHFFRg4cGCoLoEEgAIR6dSvf/1r/O9//0NZWRnKysrw3Xff+bWQVnclJCRALBZDpVIhNTU1qFUPNRoNZDIZYmJi3OcQi8UoKCjAiRMn3Ht/Wa1WvPfee1i8eHGoL4P4idasJp1KSkrC3LlzUVxcDMYY5s6di379+gmdrW5JT0/H3Llz8dZbb2HixIn47LPPYDabsWDBAqGz1mdRiYh0afHixSguLsaGDRtCVmoQiURovxSW1WoNybn9sWTJEndDfFFREW6//XbExMRE7PWJJwpEpEuzZ8+GxWKB1WrFddddF5JzJiUlebT72O12HD161CONTCbr9vY1vs5x/fXXIzY2FuvXr8eWLVuoWiYwqpqRLonFYhw/ftz9uy+NjY04fPiwx7HExETodLoOaa+66iqsWLECn3/+OXJzc7F27Vo0NDR4pMnOzsauXbuwcOFCyOXyoKqE2dnZ2Lt3L0pLSxEXF4eEhASIRCJ3W9GqVauQl5cX0QXvSUdUIiJ+UavVUKvVnabZsWMHxowZ43F7/PHHvaZdvHgx8vPzsWjRIsyYMQMDBgzAlVde6ZHmiSeeQGlpKXJzc5GUlBRUvleuXAmxWIxhw4YhKSkJ586dcz92zz33wGKxRKQXkHSO1qwmfda3336Lq6++GuXl5R12SiWRRYGI9Dlmsxk1NTXIz89Hamoq3n33XaGz1OdR1Yz0Oe+//z6ysrLQ0NCAZ599VujsEFCJiBDSA1CJiBAiOApEhBDBUSAihAiOAhEhRHAUiAghgqNARAgRHAUiQojgKBARQgT3/wGwzN7+n6CW1gAAAABJRU5ErkJggg==",
      "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-22T14:09:15.392278Z",
     "iopub.status.busy": "2024-03-22T14:09:15.391924Z",
     "iopub.status.idle": "2024-03-22T14:09:15.784425Z",
     "shell.execute_reply": "2024-03-22T14:09:15.783446Z"
    },
    "papermill": {
     "duration": 0.413747,
     "end_time": "2024-03-22T14:09:15.786550",
     "exception": false,
     "start_time": "2024-03-22T14:09:15.372803",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 300x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from ml_utility_loss.loss_learning.visualization import plot_density_3\n",
    "\n",
    "_ = plot_density_3(y2[\"pred\"], next(iter(y2[\"y\"].values())))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "745adde1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-03-22T14:09:15.827277Z",
     "iopub.status.busy": "2024-03-22T14:09:15.826461Z",
     "iopub.status.idle": "2024-03-22T14:09:16.050286Z",
     "shell.execute_reply": "2024-03-22T14:09:16.049185Z"
    },
    "papermill": {
     "duration": 0.245593,
     "end_time": "2024-03-22T14:09:16.052340",
     "exception": false,
     "start_time": "2024-03-22T14:09:15.806747",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAS8AAAEpCAYAAADCh6TFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAo50lEQVR4nO3de1gU56E/8O8ul0UEVEQuIrqiTdAooFARE48xEUiTWPOYJvzMBcTUtio9xj00hrSBQ80J2hglzSFyYoOXJI00XpI0GtSgtNF4hehBBSyK4gUQVEAgLsvue/7wx8TN7sKCwDLL9/M8+8C8887MO8z6debd2XcUQggBIiKZUdq6AUREXcHwIiJZYngRkSwxvIhIlhheRCRLDC8ikiWGFxHJEsOLiGSJ4UVEssTwIiJZsnl4ZWZmQq1Ww8XFBRERETh69Gi79evq6rBkyRL4+flBpVLhvvvuw65du3qptUTUVzjacuM5OTnQaDTIyspCREQEMjIyEBMTg9LSUnh7e5vUb2lpQVRUFLy9vbF161b4+/vj4sWLGDx4sNXbNBgMuHr1Ktzd3aFQKLpxb4ioOwghcOvWLQwfPhxKZTvnV8KGpkyZIpYsWSJN6/V6MXz4cJGenm62/rp160RgYKBoaWnp8jYvXbokAPDFF199/HXp0qV2/y0rhLDNqBItLS1wdXXF1q1b8dRTT0nl8fHxqKurw+eff26yzOOPPw5PT0+4urri888/x7Bhw/Dcc89h+fLlcHBwMLsdrVYLrVYrTdfX12PkyJEoLy+Hu7t7t+9XX6HT6bB//37MnDkTTk5Otm4OdYP+ckxv3bqF0aNHo66uDoMGDbJYz2aXjbW1tdDr9fDx8TEq9/HxQUlJidllzp8/j3379uH555/Hrl27UFZWhsWLF0On0yE1NdXsMunp6UhLSzMpP3ToEFxdXe99R/owV1dXHDlyxNbNoG7UH45pc3MzAHTYrWPTPq/OMhgM8Pb2xvvvvw8HBweEhYXhypUreOuttyyGV3JyMjQajTTd0NCAgIAAREdHw8PDo7ea3ut0Oh327t2LqKgou/5fuj/pL8e0oaHBqno2Cy8vLy84ODigurraqLy6uhq+vr5ml/Hz84OTk5PRJeK4ceNQVVWFlpYWODs7myyjUqmgUqlMyp2cnOz6DdCmv+xnf2Lvx9TafbPZrRLOzs4ICwtDXl6eVGYwGJCXl4fIyEizyzz44IMoKyuDwWCQys6ePQs/Pz+zwUVE9sum93lpNBqsX78emzZtQnFxMRYtWoSmpiYkJCQAAOLi4pCcnCzVX7RoEW7cuIGlS5fi7Nmz2LlzJ958800sWbLEVrtARDZi0z6v2NhY1NTUICUlBVVVVQgNDUVubq7UiV9RUWF0n0dAQAB2796NZcuWITg4GP7+/li6dCmWL19uq10gIhuxeYd9YmIiEhMTzc7Lz883KYuMjMThw4d7uFVE1NfZPLyIyFRzc7PJLUON32vxbdE5DPE6DrcBP3wIFRQUZPe3/ZjD8CLqg0pKShAWFmZ23p9+NF1QUIDJkyf3fKP6GIYXUR8UFBSEgoICo7LSyjpoPi3Cmmcm4n6/wUZ1+yOGF1Ef5OrqanI2pbx4Hapvvse4CSEIHTXURi3rO2w+JA4RUVcwvIhIlhheRCRLDC8ikiWGFxHJEsOLiGSJ4UVEssTwIiJZYngRkSwxvIhIlhheRCRLDC8ikiWGFxHJEsOLiGSJ4UVEssTwIiJZYngRkSwxvIhIlhheRCRLHMPeTvz4UVmWHpMF9N9HZZF9YXjZCUuPyvrxY7KA/vuoLLIvDC878eNHZVl6TFZbXSK5Y3jZiR8/KouPySJ7xw57IpIlhhcRyRLDi4hkieFFRLLE8CIiWWJ4EZEs9YnwyszMhFqthouLCyIiInD06FGLdTdu3AiFQmH0cnFx6cXWElFfYPPwysnJgUajQWpqKgoLCxESEoKYmBhcu3bN4jIeHh6orKyUXhcvXuzFFhNRX2Dz8FqzZg0WLlyIhIQEjB8/HllZWXB1dUV2drbFZRQKBXx9faWXj49PL7aYiPoCm95h39LSgoKCAiQnJ0tlSqUSs2bNwqFDhywu19jYiFGjRsFgMGDy5Ml488038cADD5itq9VqodVqpemGhgYAgE6ng06n66Y96XtaW1uln/a8n/1Jfzmm1u6bTcOrtrYWer3e5MzJx8fHaISEu91///3Izs5GcHAw6uvrsXr1akybNg2nT5/GiBEjTOqnp6cjLS3NpHzPnj12PbLCpUYAcMThw4dx5ZStW0Pdob8c0+bmZqvqye67jZGRkYiMjJSmp02bhnHjxuF//ud/sGLFCpP6ycnJ0Gg00nRDQwMCAgIQHR0NDw+PXmmzLZysuAEUHcfUqVMRMtLT1s2hbtBfjmnb1VFHbBpeXl5ecHBwQHV1tVF5dXU1fH19rVqHk5MTJk2ahLKyMrPzVSoVVCqVSbmTkxOcnJw632iZcHR0lH7a8372J/3lmFq7bzbtsHd2dkZYWBjy8vKkMoPBgLy8PKOzq/bo9XoUFRXBz8+vp5pJRH2QzS8bNRoN4uPjER4ejilTpiAjIwNNTU1ISEgAAMTFxcHf3x/p6ekAgD/+8Y+YOnUqxo4di7q6Orz11lu4ePEifvnLX9pyN4iol9k8vGJjY1FTU4OUlBRUVVUhNDQUubm5Uid+RUUFlMofThBv3ryJhQsXoqqqCkOGDEFYWBi+/fZbjB8/3la7QEQ2YPPwAoDExEQkJiaanZefn280vXbtWqxdu7YXWkVEfZnNb1IlIuoKhhcRyRLDi4hkieFFRLLE8CIiWeoTnzYSEVBe24QmbavF+edqmqSfbXfb/9hAlSNGew3skfb1NQwvoj6gvLYJM1fnW1X3P7YWtTt/f9LD/SLAGF5EfUDbGVdGbCjGeruZr/O9Fl/mH8KTD0di4ADT7+uWXWvEyzkn2j17sycML6I+ZKy3Gyb4DzI7T6fToWoYMHnUELv+Yra12GFPRLLE8CIiWeJlo4y19+mUNZ9MAf3r0ymyLwwvmbL206mOPpkC+s+nU2RfGF4y1dGnUx19MgX0v0+nyL4wvGTO0qdT/GSK7B077IlIlhheRCRLDC8ikiWGFxHJEsOLiGSJ4UVEssTwIiJZYngRkSwxvIhIlhheRCRLDC8ikiV+t1GmtPrbULpcQXlDKZQupl/Mbm1txdXWqyi+UWxxSJzyhkYoXa5Aq78NwPzonUR9FcNLpq42XcTA0e/itaPt13sv97125w8cDVxtCkUYfLqxdUQ9j+ElU8MHjkJT+W/xTmwoxpgZEqe1tRUHDxzEgw89aPHM69y1RizNOYHhM0f1dHOpAx2dSQMdn033tzNphpdMqRxcYLjtj9Ee92P8UPND4pQ7lmOc5ziLQ+IYbtfDcLsGKgeXnm4udcDaM2mg/bPp/nQmzfAi6gM6OpMGOj6b7m9n0gwvoj6gozNpoOOz6f52Jt3pWyXOnz/fE+0gIuqUTofX2LFjMXPmTHz00Ue4fft2tzQiMzMTarUaLi4uiIiIwNGjVlz4A9iyZQsUCgWeeuqpbmkHEclHp8OrsLAQwcHB0Gg08PX1xa9//Wurw8acnJwcaDQapKamorCwECEhIYiJicG1a9faXe7ChQtISkrC9OnTu7xtIpKvTodXaGgo3nnnHVy9ehXZ2dmorKzEQw89hAkTJmDNmjWoqanp1PrWrFmDhQsXIiEhAePHj0dWVhZcXV2RnZ1tcRm9Xo/nn38eaWlpCAwM7OwuEJEd6HKHvaOjI+bOnYsnnngC7733HpKTk5GUlITXXnsNzz77LFatWgU/P79219HS0oKCggIkJydLZUqlErNmzcKhQ4csLvfHP/4R3t7eeOmll/DNN9+0uw2tVgutVitNNzQ0ALjT+anT6azZ1T6ptbVV+mluP9rK2tvHjtZBvceaY9HRMbWX42lt27scXsePH0d2dja2bNmCgQMHIikpCS+99BIuX76MtLQ0zJkzp8PLydraWuj1evj4GN+T4uPjg5KSErPLHDhwAB988AFOnDhhVTvT09ORlpZmUr5nzx64urpatY6+6FIjADjiwIEDuGj+k3UAwN69e+95HdTzOnMsLB1Tezmezc3NVtXrdHitWbMGGzZsQGlpKR5//HFs3rwZjz/+OJTKO1ego0ePxsaNG6FWqzu76g7dunULL774ItavXw8vLy+rlklOToZGo5GmGxoaEBAQgOjoaHh4eHR7G3vL6asNWF10GA899BAeGG66HzqdDnv37kVUVJTFm1Q7Wgf1HmuORUfH1F6OZ9vVUUc6HV7r1q3DggULMH/+fIuXhd7e3vjggw86XJeXlxccHBxQXV1tVF5dXQ1fX1+T+ufOncOFCxcwe/ZsqcxgMAC4cxlbWlqKMWPGGC2jUqmgUpk+MdrJyUnWD2Ntu0nR0dGx3f1obz+tXQf1vM4cC0vH1F6Op7Vt73R47d27FyNHjpTOtNoIIXDp0iWMHDkSzs7OiI+P73Bdzs7OCAsLQ15ennS7g8FgQF5eHhITE03qBwUFoaioyKjsD3/4A27duoV33nkHAQEBnd0dIpKpTofXmDFjUFlZCW9vb6PyGzduYPTo0dDr9Z1an0ajQXx8PMLDwzFlyhRkZGSgqakJCQkJAIC4uDj4+/sjPT0dLi4umDBhgtHygwcPBgCTciKyb50OLyGE2fLGxka4uHT+awmxsbGoqalBSkoKqqqqEBoaitzcXKkTv6KiwuQsj4jI6vBq6/RWKBRISUkx+qROr9fjyJEjCA0N7VIjEhMTzV4mAkB+fn67y27cuLFL2yQiebM6vL777jsAd868ioqK4OzsLM1zdnZGSEgIkpKSur+FRERmWB1e+/fvBwAkJCTgnXfekfVtBkQkf53u89qwYUNPtIOIqFOsCq+5c+di48aN8PDwwNy5c9utu3379m5pGBFRe6wKr0GDBkGhUEi/ExHZmlXhdfelIi8biagv4A1URCRLVp15TZo0Sbps7EhhYeE9NYiIyBpWhReHWSaivsaq8EpNTe3pdhARdQr7vIhIlqw68/L09MTZs2fh5eWFIUOGtNv/dePGjW5rHBGRJVaF19q1a+Hu7i79bm3nPRFRT7EqvO4eWHD+/Pk91RYiIqt1us/LwcHB7DMVr1+/DgcHh25pFBFRRzodXpYGI9RqtUbD5BAR9SSrR5X485//DODOYIR/+ctf4Ob2w7OV9Ho9/vnPfyIoKKj7W0hEZIbV4bV27VoAd868srKyjC4RnZ2doVarkZWV1f0tJCIyw+rwKi8vBwDMnDkT27dvx5AhQ3qsUUREHen0YIRtI6oSEdlSp8NrwYIF7c7Pzs7ucmOIiKzV6fC6efOm0bROp8OpU6dQV1eHRx55pNsaRkTUnk6H144dO0zKDAYDFi1ahDFjxnRLo4iIOtItX8xWKpXQaDTSJ5JERD2t20aVOHfuHFpbW7trdURE7er0ZWPbk7PbCCFQWVmJnTt3Gn0HkoioJ3U6vNqenN1GqVRi2LBhePvttzv8JJKIqLvwPi8ikiWOpEpEssTwIiJZYngRkSwxvIhIlrotvC5fvoxf/epX3bU6IqJ2dVt4Xb9+HR988EGXls3MzIRarYaLiwsiIiJw9OhRi3W3b9+O8PBwDB48GAMHDkRoaCg+/PDDrjZbtr7X6QEAp67Um30VXryJ4zVA4cWbFuuUXWu08V4QdV2nb5Xobjk5OdBoNMjKykJERAQyMjIQExOD0tJSeHt7m9T39PTE73//ewQFBcHZ2RlffvklEhIS4O3tjZiYGBvsgW2c+//B8+r2onZqOeLDsmMdrmugyuZvA6JOs/m7ds2aNVi4cCESEhIAAFlZWdi5cyeys7Px6quvmtR/+OGHjaaXLl2KTZs24cCBA/0qvKIf8AUAjPF2wwAn0weflFbW4z+2FuHtX0zE/X6DLK5noMoRo70G9lg7iXqKTcOrpaUFBQUFSE5OlsqUSiVmzZqFQ4cOdbi8EAL79u1DaWkpVq1aZbaOVquFVquVphsaGgDcGcpHp9Pd4x7YjruzAk9P8rM4//bt2wCAUUNUuN/btd11yfnvYC/avhfc2tpq8Xi0lVuab8065MDatlsdXnPnzm13fl1dnbWrktTW1kKv18PHx8eo3MfHByUlJRaXq6+vh7+/P7RaLRwcHPDee+8hKirKbN309HSkpaWZlO/Zsweuru3/o5azS40A4IjDhw/jyilbt4Y6cq4BAByxZfdBjBho/gldOgNwQwuc37YXTmZ6q6u/VwBwwIEDB3DRzXS+XDQ3N1tVz+rwGjTI8qVH2/y4uDhrV3dP3N3dceLECTQ2NiIvLw8ajQaBgYEml5QAkJycbPRl8oaGBgQEBCA6OhoeHh690l5bOFlxAyg6jqlTpyJkpKetm0Md+Nvxy8DpM9hy/t6ffRrz6Ayoh8q3K6Dt6qgjVofXhg0butwYS7y8vODg4IDq6mqj8urqavj6+lpcTqlUYuzYsQCA0NBQFBcXIz093Wx4qVQqqFQqk3InJyc4OTnd2w70YY6OjtJPe95Pe/GzYH84ODhY7MMErOvHtIc+TGvfrzbt83J2dkZYWBjy8vLw1FNPAbgzKmteXh4SExOtXo/BYDDq1yKSG8+Bzvh/U0a2W6etT2vMsIGY4N/+lVB/YHV4WTvcTWcfwKHRaBAfH4/w8HBMmTIFGRkZaGpqkj59jIuLg7+/P9LT0wHc6cMKDw/HmDFjoNVqsWvXLnz44YdYt25dp7ZLRPJmdXht3LgRo0aNwqRJkyCE+Q7FroiNjUVNTQ1SUlJQVVWF0NBQ5ObmSp34FRUVUCp/6J1samrC4sWLcfnyZQwYMABBQUH46KOPEBsb221tIqK+z+rwWrRoET755BOUl5cjISEBL7zwAjw9u6cjODEx0eJlYn5+vtH0G2+8gTfeeKNbtktE8mX114MyMzNRWVmJV155BX//+98REBCAZ599Frt37+7WMzEiImt06ruNKpUK8+bNw969e3HmzBk88MADWLx4MdRqNRob+T05Iuo9Xf5itlKphEKhgBACer2+O9tERNShToWXVqvFJ598gqioKNx3330oKirCf//3f6OiogJubjK+pZeIZMfqDvvFixdjy5YtCAgIwIIFC/DJJ5/Ay8urJ9tGRGSR1eGVlZWFkSNHIjAwEP/4xz/wj3/8w2y97du3d1vjiIgssTq84uLioFAoerItRERW69RNqkREfQUfwEFEssTwIiJZYngRkSwxvIhIlhheRCRLDC8ikiWGFxHJEsOLiGSJ4UVEssTwIiJZYngRkSwxvIhIlhheRCRLDC8ikiWGFxHJEsOLiGSJ4UVEssTwIiJZYngRkSwxvIhIlhheRCRLDC8ikiWGFxHJEsOLiGSJ4UVEstQnwiszMxNqtRouLi6IiIjA0aNHLdZdv349pk+fjiFDhmDIkCGYNWtWu/WJyD7ZPLxycnKg0WiQmpqKwsJChISEICYmBteuXTNbPz8/H/PmzcP+/ftx6NAhBAQEIDo6GleuXOnllhORLdk8vNasWYOFCxciISEB48ePR1ZWFlxdXZGdnW22/scff4zFixcjNDQUQUFB+Mtf/gKDwYC8vLxebjkR2ZKjLTfe0tKCgoICJCcnS2VKpRKzZs3CoUOHrFpHc3MzdDodPD09zc7XarXQarXSdENDAwBAp9NBp9PdQ+v7ttbWVumnPe9nf9Jfjqm1+2bT8KqtrYVer4ePj49RuY+PD0pKSqxax/LlyzF8+HDMmjXL7Pz09HSkpaWZlO/Zsweurq6db7RMXGoEAEccPnwYV07ZujXUHfrLMW1ubraqnk3D616tXLkSW7ZsQX5+PlxcXMzWSU5OhkajkaYbGhqkfjIPD4/eamqvO1lxAyg6jqlTpyJkpPmzUpKX/nJM266OOmLT8PLy8oKDgwOqq6uNyqurq+Hr69vusqtXr8bKlSvx9ddfIzg42GI9lUoFlUplUu7k5AQnJ6euNVwGHB0dpZ/2vJ/9SX85ptbum0077J2dnREWFmbU2d7W+R4ZGWlxuT/96U9YsWIFcnNzER4e3htNJaI+xuaXjRqNBvHx8QgPD8eUKVOQkZGBpqYmJCQkAADi4uLg7++P9PR0AMCqVauQkpKCv/71r1Cr1aiqqgIAuLm5wc3NzWb7QUS9y+bhFRsbi5qaGqSkpKCqqgqhoaHIzc2VOvErKiqgVP5wgrhu3Tq0tLTgF7/4hdF6UlNT8Z//+Z+92XQisiGbhxcAJCYmIjEx0ey8/Px8o+kLFy70fIOIqM+z+U2qRERdwfAiIllieBGRLDG8iEiWGF5EJEsMLyKSJYYXEckSw4uIZInhRUSyxPAiIlnqE18PonvX3NxsNIBjaWUdtFVlKD41AIbrg43qBgUF2fVAjNQ/MLzsRElJCcLCwkzKn9tkWregoACTJ0/uhVYR9RyGl50ICgpCQUGBNN34vRY79x/CEzMj4TZAZVKXSO4YXnbC1dXV6GxKp9PhZu01RE4Jt+tRN6n/Yoc9EckSw4uIZInhRUSyxPAiIllieBGRLDG8iEiWGF5EJEsMLyKSJYYXEckSw4uIZInhRUSyxPAiIllieBGRLDG8iEiWGF5EJEsMLyKSJYYXEckSw4uIZInhRUSyZPPwyszMhFqthouLCyIiInD06FGLdU+fPo2nn34aarUaCoUCGRkZvddQIupTbPoAjpycHGg0GmRlZSEiIgIZGRmIiYlBaWkpvL29Teo3NzcjMDAQzzzzDJYtW2aDFhP1jh8/hxOw/CzOfvscTmFDU6ZMEUuWLJGm9Xq9GD58uEhPT+9w2VGjRom1a9d2epv19fUCgKivr+/0snLS0tIiPvvsM9HS0mLrplAXFBQUCABWvQoKCmzd3G5l7b9Rm515tbS0oKCgAMnJyVKZUqnErFmzcOjQoW7bjlarhVarlaYbGhoA3Hk0mE6n67bt9DVt+2bP+2jPxowZgyNHjhiVNX6vxe5vjiFm+k+NnsU5ZswYuzrO1u6LzcKrtrYWer0ePj4+RuU+Pj4mp8v3Ij09HWlpaSble/bs6Ren2nv37rV1E6gbTZs4BrfqbuBW3Q9llZWVNmtPT2hubraqnt0/dDY5ORkajUaabmhoQEBAAKKjo+Hh4WHDlvUsnU6HvXv3Iioqig+dtRP95Zi2XR11xGbh5eXlBQcHB1RXVxuVV1dXw9fXt9u2o1KpoFKpTMqdnJzs+g3Qpr/sZ39i78fU2n2z2a0Szs7OCAsLQ15enlRmMBiQl5eHyMhIWzWLiGTCppeNGo0G8fHxCA8Px5QpU5CRkYGmpiYkJCQAAOLi4uDv74/09HQAdzr5z5w5I/1+5coVnDhxAm5ubhg7dqzN9oOIep9Nwys2NhY1NTVISUlBVVUVQkNDkZubK3XiV1RUQKn84eTw6tWrmDRpkjS9evVqrF69GjNmzEB+fn5vN5+IbMjmHfaJiYlITEw0O+/HgaRWqyGE6IVWEVFfZ/OvBxERdYXNz7x6W9uZm7Ufx8qVTqdDc3MzGhoa7PqTqf6kvxzTtn+bHV1l9bvwunXrFgAgICDAxi0hovbcunULgwYNsjhfIfpZJ5LBYMDVq1fh7u4OhUJh6+b0mLabcS9dumTXN+P2J/3lmAohcOvWLQwfPtzoA7sf63dnXkqlEiNGjLB1M3qNh4eHXb/R+6P+cEzbO+Nqww57IpIlhhcRyRLDy06pVCqkpqaa/V4nyROPqbF+12FPRPaBZ15EJEsMLyKSJYYXEckSw8tGLly4AIVCgRMnTvTKeg4ePIiJEyfCyckJTz311D1tk6gvYHj1Efn5+VAoFKirq+uR9Ws0GoSGhqK8vBwbN27skW2QqYcffhgvv/yyrZsh6WvtuRcMry5oaWmxdRM67dy5c3jkkUcwYsQIDB48uEvr6M39FkKgtbW117bXl8nx/dYrevYJbPZhxowZYsmSJWLp0qVi6NCh4uGHHxZFRUXiscceEwMHDhTe3t7ihRdeEDU1NdIyX331lXjwwQfFoEGDhKenp3jiiSdEWVmZNL+8vFwAEN999530+92v+Pj4Tq3nk08+EZGRkUKlUokHHnhA5OfnG82/+7VhwwYhhBD5+fnipz/9qXB2dha+vr5i+fLlQqfTtbvf+/fvFwBEbm6uCA0NFS4uLmLmzJmiurpa7Nq1SwQFBQl3d3cxb9480dTUJK1Lr9eLN998U6jVauHi4iKCg4PFp59+Ks1vW++uXbvE5MmThZOTk9i/f393HsZeFx8fb/K3LysrEwsWLJD+Dvfdd5/IyMgwWW7OnDnijTfeEH5+fkKtVgshhDh48KAICQkRKpVKhIWFiR07dkjvoTbtvS/Ntae8vLy3/hzdjuFlhRkzZgg3Nzfxu9/9TpSUlIjDhw+LYcOGieTkZFFcXCwKCwtFVFSUmDlzprTM1q1bxbZt28S//vUv8d1334nZs2eLiRMnCr1eL4QwDq/W1laxbds2AUCUlpaKyspKUVdX16n1jBgxQmzdulWcOXNG/PKXvxTu7u6itrZWtLa2isrKSuHh4SEyMjJEZWWlaG5uFpcvXxaurq5i8eLFori4WOzYsUN4eXmJ1NRUi/tdUlIihczUqVPFgQMHRGFhoRg7dqyYMWOGiI6OFoWFheKf//ynGDp0qFi5cqW0rjfeeEMEBQWJ3Nxcce7cObFhwwahUqmkkG1bb3BwsNizZ48oKysT169f7+lD26Pq6upEZGSkWLhwoaisrBSVlZXi9u3bIiUlRRw7dkycP39efPTRR8LV1VXk5ORIy8XHxws3Nzfx4osvilOnTolTp06J+vp64enpKV544QVx+vRpsWvXLnHfffcZhdfNmzfbfV+aa09ra6st/jTdguFlhRkzZohJkyZJ0ytWrBDR0dFGdS5duiSFjzk1NTUCgCgqKhJCGIeXED/8471582a7bbG0nruDQqfTiREjRohVq1ZJZYMGDZLOuIQQ4rXXXhP333+/MBgMUllmZqZwc3OTgvHH+313O7/++mupLD09XQAQ586dk8p+/etfi5iYGCGEELdv3xaurq7i22+/NVrXSy+9JObNm2e03s8++6zd/ZebGTNmiKVLl7ZbZ8mSJeLpp5+WpuPj44WPj4/QarVS2bp168TQoUPF999/L5WtX7/e6D1kzfvSmvbIBfu8rBQWFib9fvLkSezfvx9ubm7SKygoCMCdviUA+Ne//oV58+YhMDAQHh4eUKvVAO6My98Z1q7n7icuOTo6Ijw8HMXFxRbXW1xcjMjISKNhgR588EE0Njbi8uXLZvf7bsHBwdLvPj4+cHV1RWBgoFHZtWvXAABlZWVobm5GVFSU0d9s8+bN0t+rTXh4uMU224vMzEyEhYVh2LBhcHNzw/vvv29yPCdOnAhnZ2dpurS0FMHBwXBxcZHKpkyZYrSMNe9Le9LvhsTpqoEDB0q/NzY2Yvbs2Vi1apVJPT8/PwDA7NmzMWrUKKxfvx7Dhw+HwWDAhAkTOt352l3r6aq79/tud4/kqVAoTEb2VCgUMBgMAO78vQBg586d8Pf3N6r34+/pWdqevdiyZQuSkpLw9ttvIzIyEu7u7njrrbdw5MgRo3pd+TtY8760JwyvLpg8eTK2bdsGtVoNR0fTP+H169dRWlqK9evXY/r06QCAAwcOtLvOtv9l9Xp9l9Zz+PBh/Nu//RsAoLW1FQUFBRYfbAIA48aNw7Zt2yCEkM6+Dh48CHd3924f72z8+PFQqVSoqKjAjBkzunXdfZ2zs7PRMT148CCmTZuGxYsXS2XWnBXdf//9+Oijj6DVaqXAP3bsmFGdjt6X5tojZ7xs7IIlS5bgxo0bmDdvHo4dO4Zz585h9+7dSEhIgF6vx5AhQzB06FC8//77KCsrw759+6DRaNpd56hRo6BQKPDll1+ipqYGjY2NnVpPZmYmduzYgZKSEixZsgQ3b97EggULLG5v8eLFuHTpEn7729+ipKQEn3/+OVJTU6HRaNodvbIr3N3dkZSUhGXLlmHTpk04d+4cCgsL8e6772LTpk3duq2+Rq1W48iRI7hw4QJqa2vxk5/8BMePH8fu3btx9uxZvP766yYhZM5zzz0Hg8GAX/3qVyguLsbu3buxevVqAJD+8+nofWmuPW1nx3LE8OqC4cOH4+DBg9Dr9YiOjsbEiRPx8ssvY/DgwVAqlVAqldiyZQsKCgowYcIELFu2DG+99Va76/T390daWhpeffVV+Pj4IDExsVPrWblyJVauXImQkBAcOHAAX3zxBby8vNrd3q5du3D06FGEhITgN7/5DV566SX84Q9/uKe/jSUrVqzA66+/jvT0dIwbNw6PPfYYdu7cidGjR/fI9vqKpKQkODg4YPz48Rg2bBhiYmIwd+5cxMbGIiIiAtevXzc6C7PEw8MDf//733HixAmEhobi97//PVJSUgBA6gfr6H1prj2d7YPtSzgkDpFMffzxx0hISEB9fT0GDBhg6+b0OvZ5EcnE5s2bERgYCH9/f5w8eRLLly/Hs88+2y+DC2B4EclGVVUVUlJSUFVVBT8/PzzzzDP4r//6L1s3y2Z42UhEssQOeyKSJYYXEckSw4uIZInhRUSyxPAiIllieFGPmj9/PhQKhfTlbR8fH0RFRSE7O7tTX03ZuHFjl0eAvRfz58/nmP99FMOLetxjjz2GyspKXLhwAV999RVmzpyJpUuX4sknn+RQz9R1Nh1NjOxe25DGP5aXlycAiPXr1wshhHj77bfFhAkThKurqxgxYoRYtGiRuHXrlhDih4EK7361jfi6efNmERYWJtzc3ISPj4+YN2+eqK6ulrZz48YN8dxzzwkvLy/h4uIixo4dK7Kzs6X5FRUV4plnnhGDBg0SQ4YMET//+c+loZFTU1NNtiv3oantCc+8yCYeeeQRhISEYPv27QAApVKJP//5zzh9+jQ2bdqEffv24ZVXXgEATJs2DRkZGfDw8EBlZSUqKyuRlJQEANDpdFixYgVOnjyJzz77DBcuXMD8+fOl7bz++us4c+YMvvrqKxQXF2PdunXSF9Z1Oh1iYmLg7u6Ob775BgcPHoSbmxsee+wxtLS0ICkpCc8++6x05lhZWYlp06b17h+KLLN1epJ9s3TmJYQQsbGxYty4cWbnffrpp2Lo0KHS9IYNG8SgQYM63N6xY8cEAOmsbfbs2SIhIcFs3Q8//NBkKGytVisGDBggdu/e3WH7ybZ45kU2I+4aCPHrr7/Go48+Cn9/f7i7u+PFF1/E9evX0dzc3O46CgoKMHv2bIwcORLu7u7SYIdtQ70sWrQIW7ZsQWhoKF555RV8++230rInT55EWVkZ3N3dpWGTPT09cfv2bbscNtneMLzIZoqLizF69GhcuHABTz75JIKDg7Ft2zYUFBQgMzMTQPvPLGxqakJMTAw8PDzw8ccf49ixY9ixY4fRcj/72c9w8eJFLFu2DFevXsWjjz4qXXI2NjYiLCwMJ06cMHqdPXsWzz33XA/vPd0rjipBNrFv3z4UFRVh2bJlKCgogMFgwNtvvy0Nmve3v/3NqL654YtLSkpw/fp1rFy5EgEBAQCA48ePm2xr2LBhiI+PR3x8PKZPn47f/e53WL16NSZPnoycnBx4e3vDw8PDbDvtadhke8MzL+pxWq0WVVVVuHLlCgoLC/Hmm29izpw5ePLJJxEXF4exY8dCp9Ph3Xffxfnz5/Hhhx8iKyvLaB1qtRqNjY3Iy8tDbW0tmpubMXLkSDg7O0vLffHFF1ixYoXRcikpKfj8889RVlaG06dP48svv8S4ceMAAM8//zy8vLwwZ84cfPPNNygvL0d+fj7+/d//XXqCklqtxv/+7/+itLQUtbW10Ol0vfNHo47ZutON7NvdT2l2dHQUw4YNE7NmzRLZ2dnS8yGFEGLNmjXCz89PDBgwQMTExIjNmzebPMfyN7/5jRg6dKjRrRJ//etfhVqtFiqVSkRGRoovvvjC5FmG48aNEwMGDBCenp5izpw54vz589I6KysrRVxcnPDy8hIqlUoEBgaKhQsXivr6eiGEENeuXRNRUVHCzc2Nt0r0MRzPi4hkiZeNRCRLDC8ikiWGFxHJEsOLiGSJ4UVEssTwIiJZYngRkSwxvIhIlhheRCRLDC8ikiWGFxHJEsOLiGTp/wAUEDbIgVJSKgAAAABJRU5ErkJggg==",
      "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-22T14:09:16.091828Z",
     "iopub.status.busy": "2024-03-22T14:09:16.091522Z",
     "iopub.status.idle": "2024-03-22T14:09:16.340630Z",
     "shell.execute_reply": "2024-03-22T14:09:16.339642Z"
    },
    "papermill": {
     "duration": 0.271426,
     "end_time": "2024-03-22T14:09:16.342666",
     "exception": false,
     "start_time": "2024-03-22T14:09:16.071240",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 300x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#\"\"\"\n",
    "from ml_utility_loss.loss_learning.visualization import plot_grad, plot_grad_2, plot_grad_3\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "#plot_grad_2(y, model.models)\n",
    "for m in model.models:\n",
    "    ym = y[m]\n",
    "    fig, ax = plt.subplots()\n",
    "    plot_grad_3(ym[\"error\"], ym[\"grad\"], name=f\"{m}_grad\", fig=fig, ax=ax)\n",
    "#\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "54c0e9f3",
   "metadata": {
    "papermill": {
     "duration": 0.019751,
     "end_time": "2024-03-22T14:09:16.382119",
     "exception": false,
     "start_time": "2024-03-22T14:09:16.362368",
     "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": 5617.022719,
   "end_time": "2024-03-22T14:09:19.125511",
   "environment_variables": {},
   "exception": null,
   "input_path": "eval/contraceptive/realtabformer/42/mlu-eval.ipynb",
   "output_path": "eval/contraceptive/realtabformer/42/mlu-eval.ipynb",
   "parameters": {
    "allow_same_prediction": true,
    "dataset": "contraceptive",
    "dataset_name": "contraceptive",
    "debug": false,
    "folder": "eval",
    "gp": false,
    "gp_multiply": false,
    "log_wandb": false,
    "param_index": 0,
    "path": "eval/contraceptive/realtabformer/42",
    "path_prefix": "../../../../",
    "random_seed": 42,
    "single_model": "realtabformer"
   },
   "start_time": "2024-03-22T12:35:42.102792",
   "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
}