younadi commited on
Commit
3fcb808
·
1 Parent(s): a897e4f

updated source/

Browse files
Files changed (44) hide show
  1. source/{demos/create_dataset.bash → create_dataset.bash} +1 -1
  2. source/demos/ftd/.terminated_create_dataset +0 -0
  3. source/demos/ftd/create_dataset.log +24 -0
  4. source/demos/ftd/makespans.npy +3 -0
  5. source/demos/ftd/metadata.json +11 -0
  6. source/demos/ftd/pfsp_instance.npy +3 -0
  7. source/demos/ftd/schedules.npy +3 -0
  8. source/demos/ftd_split/makespans_train.npy +3 -0
  9. source/demos/ftd_split/makespans_val.npy +3 -0
  10. source/demos/ftd_split/metadata.json +14 -0
  11. source/demos/ftd_split/pfsp_instance.npy +3 -0
  12. source/demos/ftd_split/schedules_train.npy +3 -0
  13. source/demos/ftd_split/schedules_val.npy +3 -0
  14. source/demos/ftd_split/split_dataset.log +37 -0
  15. source/demos/rs_artifacts/.terminated_phase2 +0 -0
  16. source/demos/rs_artifacts/actual_makespan.npy +3 -0
  17. source/demos/rs_artifacts/checkpoints_phase2/best_checkpoint_phase2.pth +3 -0
  18. source/demos/rs_artifacts/checkpoints_phase2/last_checkpoint_phase2.pth +3 -0
  19. source/demos/rs_artifacts/last_losses_idx.npy +3 -0
  20. source/demos/rs_artifacts/makespan_losses.npy +3 -0
  21. source/demos/rs_artifacts/optimal_job_sequence.npy +3 -0
  22. source/demos/rs_artifacts/recover_schedules.log +15 -0
  23. source/demos/rs_artifacts/recover_schedules_pbar.log +1 -0
  24. source/demos/rs_artifacts/rs_viz.ipynb +0 -0
  25. source/demos/rs_artifacts/sinkhorn_losses.npy +3 -0
  26. source/demos/rs_artifacts/total_losses.npy +3 -0
  27. source/demos/train_artifacts/.terminated_phase1 +0 -0
  28. source/demos/train_artifacts/batch_losses.npy +3 -0
  29. source/demos/train_artifacts/checkpoints/best_checkpoint.pth +3 -0
  30. source/demos/train_artifacts/checkpoints/last_checkpoint.pth +3 -0
  31. source/demos/train_artifacts/last_batch_loss_idx.npy +3 -0
  32. source/demos/train_artifacts/last_val_loss_idx.npy +3 -0
  33. source/demos/train_artifacts/train.log +41 -0
  34. source/demos/train_artifacts/train_parameters.json +38 -0
  35. source/demos/train_artifacts/train_pbar_epoch.log +1 -0
  36. source/demos/train_artifacts/train_pbar_val.log +1 -0
  37. source/demos/train_artifacts/val_losses.npy +3 -0
  38. source/demos/train_artifacts/viz.ipynb +182 -0
  39. source/{demos/recover_schedules.bash → recover_schedules.bash} +4 -4
  40. source/{demos/split_dataset.bash → split_dataset.bash} +2 -2
  41. source/{demos/train.bash → train.bash} +2 -2
  42. source/train_rpe.py +4 -0
  43. source/viz_rs.ipynb +0 -0
  44. source/viz_train.ipynb +106 -0
source/{demos/create_dataset.bash → create_dataset.bash} RENAMED
@@ -7,6 +7,6 @@ python create_dataset.py\
7
  --nb_base_samples 0\
8
  --duplication_factor 0.0\
9
  --init_type exhaustive\
10
- --output_dir "./ftd_"\
11
  --seed 97\
12
  --normalize_makespans "true"\
 
7
  --nb_base_samples 0\
8
  --duplication_factor 0.0\
9
  --init_type exhaustive\
10
+ --output_dir "./demos/ftd"\
11
  --seed 97\
12
  --normalize_makespans "true"\
source/demos/ftd/.terminated_create_dataset ADDED
File without changes
source/demos/ftd/create_dataset.log ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 2026-03-09 13:47:05.498 | INFO | __main__:create_dataset:408 - nb_base_samples: 0
2
+ 2026-03-09 13:47:05.498 | INFO | __main__:create_dataset:409 - duplication_factor: 0.0
3
+ 2026-03-09 13:47:05.498 | INFO | __main__:create_dataset:410 - init_type: exhaustive
4
+ 2026-03-09 13:47:05.498 | INFO | __main__:create_dataset:411 - output_dir: ./demos/ftd
5
+ 2026-03-09 13:47:05.498 | INFO | __main__:create_dataset:412 - seed: 97
6
+ 2026-03-09 13:47:05.499 | INFO | __main__:create_dataset:417 - Normalizing makespans by the sum of processing times with pfsp sum: 7.829251766204834
7
+ 2026-03-09 13:49:16.973 | INFO | __main__:create_dataset:408 - nb_base_samples: 0
8
+ 2026-03-09 13:49:16.973 | INFO | __main__:create_dataset:409 - duplication_factor: 0.0
9
+ 2026-03-09 13:49:16.973 | INFO | __main__:create_dataset:410 - init_type: exhaustive
10
+ 2026-03-09 13:49:16.973 | INFO | __main__:create_dataset:411 - output_dir: ./demos/ftd
11
+ 2026-03-09 13:49:16.973 | INFO | __main__:create_dataset:412 - seed: 97
12
+ 2026-03-09 13:49:16.974 | INFO | __main__:create_dataset:417 - Normalizing makespans by the sum of processing times with pfsp sum: 7.829251766204834
13
+ 2026-03-09 13:49:18.793 | INFO | __main__:create_dataset:408 - nb_base_samples: 0
14
+ 2026-03-09 13:49:18.793 | INFO | __main__:create_dataset:409 - duplication_factor: 0.0
15
+ 2026-03-09 13:49:18.793 | INFO | __main__:create_dataset:410 - init_type: exhaustive
16
+ 2026-03-09 13:49:18.793 | INFO | __main__:create_dataset:411 - output_dir: ./demos/ftd
17
+ 2026-03-09 13:49:18.793 | INFO | __main__:create_dataset:412 - seed: 97
18
+ 2026-03-09 13:49:18.794 | INFO | __main__:create_dataset:417 - Normalizing makespans by the sum of processing times with pfsp sum: 7.829251766204834
19
+ 2026-03-09 13:49:19.963 | INFO | __main__:create_dataset:408 - nb_base_samples: 0
20
+ 2026-03-09 13:49:19.963 | INFO | __main__:create_dataset:409 - duplication_factor: 0.0
21
+ 2026-03-09 13:49:19.963 | INFO | __main__:create_dataset:410 - init_type: exhaustive
22
+ 2026-03-09 13:49:19.963 | INFO | __main__:create_dataset:411 - output_dir: ./demos/ftd
23
+ 2026-03-09 13:49:19.963 | INFO | __main__:create_dataset:412 - seed: 97
24
+ 2026-03-09 13:49:19.963 | INFO | __main__:create_dataset:417 - Normalizing makespans by the sum of processing times with pfsp sum: 7.829251766204834
source/demos/ftd/makespans.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:fdf8f7f81b105726e1f162eb5e2d01897e83038a84d585da6aef479739a4ffe5
3
+ size 141248
source/demos/ftd/metadata.json ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "nb_base_samples": 5040,
3
+ "duplication_factor": 0.0,
4
+ "nb_samples": 5040,
5
+ "nb_jobs": 7,
6
+ "nb_machines": 2,
7
+ "init_type": "exhaustive",
8
+ "data_path": "./demos/ftd",
9
+ "seed": 97,
10
+ "date_time": "2026_03_09_13_49_19"
11
+ }
source/demos/ftd/pfsp_instance.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f2c4c61b681263cd6448403ed1c8d291ae5eb5220b4aa6ac8a9c22dc271ccbba
3
+ size 184
source/demos/ftd/schedules.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e67ea603c6c9f48542ff3113b51e40ed56619a29e6cf3b6ce8c4571f940c6de8
3
+ size 141248
source/demos/ftd_split/makespans_train.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8ab32f9ce8398e0b9c0a782d5bcb624d6995b9a543929f4704a081f2fe31cd45
3
+ size 119520
source/demos/ftd_split/makespans_val.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0658e817a13a6027d6e7fd3e9d0f58a635a39cd5a650074ac931e2c2a951aa1b
3
+ size 21212
source/demos/ftd_split/metadata.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "nb_base_samples": 5040,
3
+ "duplication_factor": 0.0,
4
+ "nb_samples": 5040,
5
+ "nb_jobs": 7,
6
+ "nb_machines": 2,
7
+ "init_type": "exhaustive",
8
+ "data_path": "./demos/ftd",
9
+ "seed": 97,
10
+ "date_time": "2026_03_09_13_49_19",
11
+ "nb_train_samples": 4264,
12
+ "nb_val_samples": 753,
13
+ "data_source": "./demos/ftd"
14
+ }
source/demos/ftd_split/pfsp_instance.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f2c4c61b681263cd6448403ed1c8d291ae5eb5220b4aa6ac8a9c22dc271ccbba
3
+ size 184
source/demos/ftd_split/schedules_train.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1497ea89e294e74643ae892a468c52f418c1dffc141e63d50528b8ea828e29c0
3
+ size 119520
source/demos/ftd_split/schedules_val.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6ef9c21ee2fd0d74cc90351b8a5c7b0fcdfb71b5a635ced9486d2f0d770a5546
3
+ size 21212
source/demos/ftd_split/split_dataset.log ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 2026-03-09 13:50:39.654 | INFO | __main__:split_dataset:15 - Starting dataset split. Input: ./demos/ftd -> Output: ./demos/ftd_split
2
+ 2026-03-09 13:50:39.654 | INFO | __main__:split_dataset:31 - Loading data from .npy files...
3
+ 2026-03-09 13:50:39.655 | INFO | __main__:split_dataset:34 - Loaded 5040 = 5040 samples.
4
+ 2026-03-09 13:50:39.656 | INFO | __main__:split_dataset:41 - Removing 16 samples with best makespan (0.5417570471763611).
5
+ 2026-03-09 13:50:39.656 | INFO | __main__:split_dataset:41 - Removing 7 samples with best makespan (0.5427406430244446).
6
+ 2026-03-09 13:50:39.656 | INFO | __main__:split_dataset:46 - Filtered dataset contains 5017 samples.
7
+ 2026-03-09 13:50:39.657 | INFO | __main__:split_dataset:50 - Shuffling with seed 97...
8
+ 2026-03-09 13:50:39.668 | INFO | __main__:split_dataset:63 - Saving 4264 training samples...
9
+ 2026-03-09 13:50:39.670 | INFO | __main__:split_dataset:68 - Saving 753 validation samples...
10
+ 2026-03-09 13:50:39.671 | SUCCESS | __main__:split_dataset:85 - Successfully split dataset into 4264 train and 753 val samples in ./demos/ftd_split.
11
+ 2026-03-09 13:51:36.653 | INFO | __main__:split_dataset:15 - Starting dataset split. Input: ./demos/ftd -> Output: ./demos/ftd_split
12
+ 2026-03-09 13:51:36.654 | INFO | __main__:split_dataset:31 - Loading data from .npy files...
13
+ 2026-03-09 13:51:36.655 | INFO | __main__:split_dataset:34 - Loaded 5040 = 5040 samples.
14
+ 2026-03-09 13:51:36.655 | INFO | __main__:split_dataset:46 - Filtered dataset contains 5040 samples.
15
+ 2026-03-09 13:51:36.655 | INFO | __main__:split_dataset:50 - Shuffling with seed 97...
16
+ 2026-03-09 13:51:36.660 | INFO | __main__:split_dataset:63 - Saving 4284 training samples...
17
+ 2026-03-09 13:51:36.672 | INFO | __main__:split_dataset:68 - Saving 756 validation samples...
18
+ 2026-03-09 13:51:36.672 | SUCCESS | __main__:split_dataset:85 - Successfully split dataset into 4284 train and 756 val samples in ./demos/ftd_split.
19
+ 2026-03-09 13:51:54.170 | INFO | __main__:split_dataset:15 - Starting dataset split. Input: ./demos/ftd -> Output: ./demos/ftd_split
20
+ 2026-03-09 13:51:54.170 | INFO | __main__:split_dataset:31 - Loading data from .npy files...
21
+ 2026-03-09 13:51:54.171 | INFO | __main__:split_dataset:34 - Loaded 5040 = 5040 samples.
22
+ 2026-03-09 13:51:54.171 | INFO | __main__:split_dataset:41 - Removing 16 samples with best makespan (0.5417570471763611).
23
+ 2026-03-09 13:51:54.172 | INFO | __main__:split_dataset:46 - Filtered dataset contains 5024 samples.
24
+ 2026-03-09 13:51:54.172 | INFO | __main__:split_dataset:50 - Shuffling with seed 97...
25
+ 2026-03-09 13:51:54.179 | INFO | __main__:split_dataset:63 - Saving 4270 training samples...
26
+ 2026-03-09 13:51:54.180 | INFO | __main__:split_dataset:68 - Saving 754 validation samples...
27
+ 2026-03-09 13:51:54.181 | SUCCESS | __main__:split_dataset:85 - Successfully split dataset into 4270 train and 754 val samples in ./demos/ftd_split.
28
+ 2026-03-09 13:52:40.401 | INFO | __main__:split_dataset:15 - Starting dataset split. Input: ./demos/ftd -> Output: ./demos/ftd_split
29
+ 2026-03-09 13:52:40.401 | INFO | __main__:split_dataset:31 - Loading data from .npy files...
30
+ 2026-03-09 13:52:40.402 | INFO | __main__:split_dataset:34 - Loaded 5040 = 5040 samples.
31
+ 2026-03-09 13:52:40.403 | INFO | __main__:split_dataset:41 - Removing 16 samples with best makespan (0.5417570471763611).
32
+ 2026-03-09 13:52:40.403 | INFO | __main__:split_dataset:41 - Removing 7 samples with best makespan (0.5427406430244446).
33
+ 2026-03-09 13:52:40.404 | INFO | __main__:split_dataset:46 - Filtered dataset contains 5017 samples.
34
+ 2026-03-09 13:52:40.404 | INFO | __main__:split_dataset:50 - Shuffling with seed 97...
35
+ 2026-03-09 13:52:40.410 | INFO | __main__:split_dataset:63 - Saving 4264 training samples...
36
+ 2026-03-09 13:52:40.411 | INFO | __main__:split_dataset:68 - Saving 753 validation samples...
37
+ 2026-03-09 13:52:40.412 | SUCCESS | __main__:split_dataset:85 - Successfully split dataset into 4264 train and 753 val samples in ./demos/ftd_split.
source/demos/rs_artifacts/.terminated_phase2 ADDED
File without changes
source/demos/rs_artifacts/actual_makespan.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7e33bebcd064617aae8f5558a7cb8ab10515ee119b8ff4447fef3aed24af0642
3
+ size 132
source/demos/rs_artifacts/checkpoints_phase2/best_checkpoint_phase2.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:722bc00a389bfac0b39773fe51e4d16dfc86f3b29ccef2f75ee031c259ac3ff0
3
+ size 8499
source/demos/rs_artifacts/checkpoints_phase2/last_checkpoint_phase2.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9f406a487d6d20d1067f93199f9baa5bb6fb4164448d86ea0d9db18729e9ab53
3
+ size 8499
source/demos/rs_artifacts/last_losses_idx.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:76e066551dde328485503f66a893e3147844b5f0ce70edfdfeaaa37b5c772791
3
+ size 136
source/demos/rs_artifacts/makespan_losses.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0e5a9f5f29dc7c245166b701e89d2b9d138e319c92adb50175edf3e4055b2b2f
3
+ size 8128
source/demos/rs_artifacts/optimal_job_sequence.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e1d6e9db4aedec7981287f7e836a7f07c7278bb10d3556209784e588621a6ab1
3
+ size 184
source/demos/rs_artifacts/recover_schedules.log ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 2026-03-09 14:04:47.941 | INFO | __main__:<module>:385 - Found better makespan!:
2
+ 2026-03-09 14:04:47.941 | INFO | __main__:<module>:386 - recovered permutation: [1 4 3 2 6 5 0]
3
+ 2026-03-09 14:04:47.941 | INFO | __main__:<module>:387 - actual makespan: 5.0353
4
+ 2026-03-09 14:04:47.941 | INFO | __main__:<module>:388 - predicted makespan (normalized): 0.6345
5
+ 2026-03-09 14:04:47.941 | INFO | __main__:<module>:389 - actual makespan normalized: 0.6431
6
+ 2026-03-09 14:04:50.425 | INFO | __main__:<module>:385 - Found better makespan!:
7
+ 2026-03-09 14:04:50.425 | INFO | __main__:<module>:386 - recovered permutation: [6 1 3 4 2 5 0]
8
+ 2026-03-09 14:04:50.426 | INFO | __main__:<module>:387 - actual makespan: 4.7626
9
+ 2026-03-09 14:04:50.426 | INFO | __main__:<module>:388 - predicted makespan (normalized): 0.6037
10
+ 2026-03-09 14:04:50.426 | INFO | __main__:<module>:389 - actual makespan normalized: 0.6083
11
+ 2026-03-09 14:05:02.609 | INFO | __main__:<module>:385 - Found better makespan!:
12
+ 2026-03-09 14:05:02.610 | INFO | __main__:<module>:386 - recovered permutation: [1 6 3 4 0 5 2]
13
+ 2026-03-09 14:05:02.610 | INFO | __main__:<module>:387 - actual makespan: 4.6095
14
+ 2026-03-09 14:05:02.610 | INFO | __main__:<module>:388 - predicted makespan (normalized): 0.5900
15
+ 2026-03-09 14:05:02.610 | INFO | __main__:<module>:389 - actual makespan normalized: 0.5888
source/demos/rs_artifacts/recover_schedules_pbar.log ADDED
@@ -0,0 +1 @@
 
 
1
+ Latent schedules optimization: 100%|█████████| 1000/1000 [00:24<00:00, 40.22it/s, total loss=4.74, makespan=0.409, sinkhorn=43.3]
source/demos/rs_artifacts/rs_viz.ipynb ADDED
The diff for this file is too large to render. See raw diff
 
source/demos/rs_artifacts/sinkhorn_losses.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:66df9c21eba3c6a5d37cb6818ba694c123377ee1017922e2690c95ba02ef15ed
3
+ size 8128
source/demos/rs_artifacts/total_losses.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:baa37fea9c87e4ff024339b9b2b30837854f45c9707196dfb6d31e90c61e6f5c
3
+ size 8128
source/demos/train_artifacts/.terminated_phase1 ADDED
File without changes
source/demos/train_artifacts/batch_losses.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c0288f4a30a39ede69f969e0a1260323fa3d3423854498efd16d3d3a56638185
3
+ size 1468
source/demos/train_artifacts/checkpoints/best_checkpoint.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e7ec22f51f076216bd0c9816833a377da3bd8650d50938271bb2ed770e7f32e5
3
+ size 1272039
source/demos/train_artifacts/checkpoints/last_checkpoint.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1b0ba0fd1b0de37e17451c9c1a43d4ede457e9b1a28f48e7f9fd9faeaa3572db
3
+ size 1272039
source/demos/train_artifacts/last_batch_loss_idx.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9be9677f396de401fc8f5927562f574b23b9688836f263dc7d4209ff200cf2cc
3
+ size 132
source/demos/train_artifacts/last_val_loss_idx.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3796fb1823c74dd7996471963958c045efbd9253ff765ac1e4d3e3064f5add03
3
+ size 132
source/demos/train_artifacts/train.log ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 2026-03-09 13:56:45.032 | INFO | __main__:__init__:291 - Loaded schedules from ./demos/ftd_split/schedules_train.npy with shape (4264, 7)
2
+ 2026-03-09 13:56:45.033 | INFO | __main__:__init__:296 - Loaded makespans from ./demos/ftd_split/makespans_train.npy with shape (4264, 7)
3
+ 2026-03-09 13:56:45.049 | INFO | __main__:<module>:324 - schedules.shape: torch.Size([64, 7])
4
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:325 - makespans.shape: torch.Size([64, 7])
5
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:391 - data_dir: ./demos/ftd_split
6
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:392 - block_size: 7
7
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:393 - vocab_size: 7
8
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:394 - n_embd: 64
9
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:395 - n_head: 4
10
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:396 - n_layer: 2
11
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:397 - ff_width: 4
12
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:398 - train_batch_size: 64
13
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:399 - val_batch_size: 256
14
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:400 - dropout: 0.0
15
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:401 - nb_epochs: 5
16
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:402 - early_stopping_patience: 15
17
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:403 - nb_iters: 335
18
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:404 - checkpoint_interval: 16
19
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:405 - decay_lr: True
20
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:406 - lr_partitions_ratios: [0.66, None]
21
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:407 - lr_partitions_iters: [221, 114]
22
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:408 - init_lr: 0.0001
23
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:409 - max_lr: 0.001
24
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:410 - min_lr: 5e-05
25
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:411 - lr_warmup_iters_ratio: 0.1
26
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:412 - lr_decay_iters_ratio: 0.95
27
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:413 - beta1: 0.9
28
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:414 - beta2: 0.95
29
+ 2026-03-09 13:56:45.050 | INFO | __main__:<module>:415 - weight_decay: 0.1
30
+ 2026-03-09 13:56:45.051 | INFO | __main__:<module>:416 - grad_clip: 1.0
31
+ 2026-03-09 13:56:45.051 | INFO | __main__:<module>:417 - compile: False
32
+ 2026-03-09 13:56:45.051 | INFO | __main__:<module>:418 - compile_mode: default
33
+ 2026-03-09 13:56:45.051 | INFO | __main__:<module>:419 - intermediate_schedules: True
34
+ 2026-03-09 13:56:45.051 | INFO | __main__:<module>:420 - save_only_last_checkpoint: True
35
+ 2026-03-09 13:56:45.181 | INFO | __main__:<module>:489 - The model has 100K trainable parameters
36
+ 2026-03-09 13:56:45.182 | INFO | __main__:<module>:510 - num decayed parameter tensors: 40, with 99,712 parameters
37
+ 2026-03-09 13:56:45.182 | INFO | __main__:<module>:511 - num non-decayed parameter tensors: 9, with 513 parameters
38
+ 2026-03-09 13:56:45.182 | INFO | __main__:<module>:515 - using fused AdamW: True
39
+ 2026-03-09 13:56:46.106 | INFO | __main__:__init__:291 - Loaded schedules from ./demos/ftd_split/schedules_val.npy with shape (753, 7)
40
+ 2026-03-09 13:56:46.107 | INFO | __main__:__init__:296 - Loaded makespans from ./demos/ftd_split/makespans_val.npy with shape (753, 7)
41
+ 2026-03-09 13:56:52.408 | INFO | __main__:<module>:701 - Best validation loss: 0.0005
source/demos/train_artifacts/train_parameters.json ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "data_dir": "./demos/ftd_split",
3
+ "block_size": 7,
4
+ "vocab_size": 7,
5
+ "n_embd": 64,
6
+ "n_head": 4,
7
+ "n_layer": 2,
8
+ "ff_width": 4,
9
+ "train_batch_size": 64,
10
+ "val_batch_size": 256,
11
+ "dropout": 0.0,
12
+ "nb_epochs": 5,
13
+ "early_stopping_patience": 15,
14
+ "nb_iters": 335,
15
+ "checkpoint_interval": 16,
16
+ "decay_lr": true,
17
+ "lr_partitions_ratios": [
18
+ 0.66,
19
+ null
20
+ ],
21
+ "lr_partitions_iters": [
22
+ 221,
23
+ 114
24
+ ],
25
+ "init_lr": 0.0001,
26
+ "max_lr": 0.001,
27
+ "min_lr": 5e-05,
28
+ "lr_warmup_iters_ratio": 0.1,
29
+ "lr_decay_iters_ratio": 0.95,
30
+ "beta1": 0.9,
31
+ "beta2": 0.95,
32
+ "weight_decay": 0.1,
33
+ "grad_clip": 1.0,
34
+ "compile": false,
35
+ "compile_mode": "default",
36
+ "intermediate_schedules": true,
37
+ "save_only_last_checkpoint": true
38
+ }
source/demos/train_artifacts/train_pbar_epoch.log ADDED
@@ -0,0 +1 @@
 
 
1
+ Epoch 5/5: 100%|█████████████████████████████████████████████████████████████████████████████████| 67/67 [00:01<00:00, 53.22it/s]
source/demos/train_artifacts/train_pbar_val.log ADDED
@@ -0,0 +1 @@
 
 
1
+ Validation 5.00: 100%|████████████████████████████████████████████████████████████████████████████| 3/3 [00:00<00:00, 168.44it/s]
source/demos/train_artifacts/val_losses.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9613fdca112b080597b2fca0949f5d9d8625e13fc8648d5087efdd4b33115604
3
+ size 228
source/demos/train_artifacts/viz.ipynb ADDED
@@ -0,0 +1,182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "id": "24989eac",
7
+ "metadata": {},
8
+ "outputs": [],
9
+ "source": [
10
+ "import numpy as np\n",
11
+ "import matplotlib.pyplot as plt"
12
+ ]
13
+ },
14
+ {
15
+ "cell_type": "code",
16
+ "execution_count": 2,
17
+ "id": "90d06b25",
18
+ "metadata": {},
19
+ "outputs": [
20
+ {
21
+ "data": {
22
+ "text/plain": [
23
+ "True"
24
+ ]
25
+ },
26
+ "execution_count": 2,
27
+ "metadata": {},
28
+ "output_type": "execute_result"
29
+ }
30
+ ],
31
+ "source": [
32
+ "import torch\n",
33
+ "torch.cuda.is_available()"
34
+ ]
35
+ },
36
+ {
37
+ "cell_type": "code",
38
+ "execution_count": 3,
39
+ "id": "c6c1eda1",
40
+ "metadata": {},
41
+ "outputs": [
42
+ {
43
+ "name": "stdout",
44
+ "output_type": "stream",
45
+ "text": [
46
+ "(335,)\n"
47
+ ]
48
+ },
49
+ {
50
+ "data": {
51
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1kAAAIjCAYAAADxz9EgAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAZrVJREFUeJzt3Xl4VNX9x/HPTJLJQghJCCQsgSAgsqMgNFIFld0Na5UKLUsVFUlRo1ZpVURbwY2iiFK1irWouIJ1QRABZRFl+4mICMii7CAQCJBMMuf3x+1MGJJACJPcO8n79Tx5ZuYuM9+ZMzPJJ+fcc13GGCMAAAAAQEi47S4AAAAAAKoSQhYAAAAAhBAhCwAAAABCiJAFAAAAACFEyAIAAACAECJkAQAAAEAIEbIAAAAAIIQIWQAAAAAQQoQsAAAAAAghQhYAoMwyMjI0dOjQcu3bvXt3de/ePaT1lNWZ1A0AwOkiZAFAFbJ48WI9+OCDOnDggN2lAABQbUXaXQAAIHQWL16ssWPHaujQoUpMTAz5/a9bt05ud/n+Pzd79uwQVwMAgDPRkwUA1ZTP59OxY8dOa5/o6GhFRUWV6/E8Ho88Hk+59sXpM8bo6NGjdpcBANUSIQsAqogHH3xQd999tySpSZMmcrlccrlc2rx5syTJ5XIpKytL06ZNU+vWrRUdHa1Zs2ZJkp544gldcMEFql27tmJjY9WxY0e9/fbbxR7jxGObpk6dKpfLpUWLFik7O1t16tRRjRo1dPXVV2vPnj1B+554TNb8+fPlcrn05ptv6u9//7saNmyomJgYXXrppdqwYUOxx548ebLOOussxcbGqnPnzvriiy/O6DivH3/8Uddee62Sk5MVFxenX/3qV/rwww+LbTdp0iS1bt1acXFxSkpKUqdOnfTaa68F1h86dEi33367MjIyFB0drbp166pnz55asWLFKWvYtm2bbrjhBtWvX1/R0dFq0qSJRowYofz8fElWm7pcrmL7+V93f9tKVttcfvnl+uSTT9SpUyfFxsbqn//8p9q0aaOLL7642H34fD41aNBAv/3tb4OWTZw4Ua1bt1ZMTIxSU1N18803a//+/ad8LgCAIgwXBIAq4je/+Y1++OEHvf766/rHP/6hlJQUSVKdOnUC23z22Wd68803lZWVpZSUFGVkZEiSnnrqKV155ZUaNGiQ8vPz9cYbb+jaa6/VBx98oMsuu+yUj/2nP/1JSUlJGjNmjDZv3qyJEycqKytL06dPP+W+48ePl9vt1l133aWDBw/qscce06BBg7R06dLANs8995yysrJ04YUX6o477tDmzZvVv39/JSUlqWHDhqf5Skm7du3SBRdcoCNHjmjUqFGqXbu2XnnlFV155ZV6++23dfXVV0uSXnjhBY0aNUq//e1vddttt+nYsWP65ptvtHTpUg0cOFCSdMstt+jtt99WVlaWWrVqpX379mnhwoVau3atzjvvvFJr2L59uzp37qwDBw7opptu0jnnnKNt27bp7bff1pEjR8rV67du3Tpdf/31uvnmmzV8+HC1aNFCAwYM0IMPPqidO3cqLS0tsO3ChQu1fft2/e53vwssu/nmmzV16lQNGzZMo0aN0qZNm/TMM89o5cqVWrRoUbl7MQGg2jEAgCrj8ccfN5LMpk2biq2TZNxut1mzZk2xdUeOHAm6nZ+fb9q0aWMuueSSoOWNGzc2Q4YMCdx++eWXjSTTo0cP4/P5AsvvuOMOExERYQ4cOBBY1q1bN9OtW7fA7Xnz5hlJpmXLliYvLy+w/KmnnjKSzOrVq40xxuTl5ZnatWub888/33i93sB2U6dONZKC7rM0J9Z9++23G0nmiy++CCw7dOiQadKkicnIyDCFhYXGGGOuuuoq07p165Ped61atczIkSNPWcOJBg8ebNxut/n666+LrfO/lmPGjDEl/ar2v+7Ht3Pjxo2NJDNr1qygbdetW2ckmUmTJgUtv/XWW018fHyg7b/44gsjyUybNi1ou1mzZpW4HABQOoYLAkA10q1bN7Vq1arY8tjY2MD1/fv36+DBg7rwwgvLNORNkm666aagYW0XXnihCgsLtWXLllPuO2zYsKBemwsvvFCSNZxPkpYtW6Z9+/Zp+PDhiowsGoAxaNAgJSUllam+E3300Ufq3Lmzfv3rXweWxcfH66abbtLmzZv13XffSZISExP1888/6+uvvy71vhITE7V06VJt3769zI/v8/k0Y8YMXXHFFerUqVOx9SUNESyLJk2aqHfv3kHLzj77bHXo0CGoV7GwsFBvv/22rrjiikDbv/XWW6pVq5Z69uypvXv3Bn46duyo+Ph4zZs3r1w1AUB1RMgCgGqkSZMmJS7/4IMP9Ktf/UoxMTFKTk5WnTp19Nxzz+ngwYNlut9GjRoF3faHn7Icy3Oqff1BrVmzZkHbRUZGBoY7nq4tW7aoRYsWxZa3bNky6DHvuecexcfHq3PnzmrevLlGjhypRYsWBe3z2GOP6dtvv1V6ero6d+6sBx98MBAQS7Nnzx7l5OSoTZs25aq/NKW174ABA7Ro0SJt27ZNknU83O7duzVgwIDANuvXr9fBgwdVt25d1alTJ+jn8OHD2r17d0hrBYCqjJAFANXI8T1Wfl988YWuvPJKxcTE6Nlnn9VHH32kOXPmaODAgTLGlOl+IyIiSlxelv3PZN+K1rJlS61bt05vvPGGfv3rX+udd97Rr3/9a40ZMyawzXXXXacff/xRkyZNUv369fX444+rdevW+vjjj8/48Uvr0SosLCxxeUntK1khyxijt956S5L05ptvqlatWurTp09gG5/Pp7p162rOnDkl/jz00ENn+GwAoPpg4gsAqELKM8zsnXfeUUxMjD755BNFR0cHlr/88suhLK3cGjduLEnasGFD0Cx5BQUF2rx5s9q1a1eu+1y3bl2x5d9//33QY0pSjRo1NGDAAA0YMED5+fn6zW9+o7///e8aPXq0YmJiJEn16tXTrbfeqltvvVW7d+/Weeedp7///e/q27dviY9fp04dJSQk6Ntvvz1pnf5evQMHDgSd96wswzCP16RJE3Xu3FnTp09XVlaW3n33XfXv3z+ovZs2bapPP/1UXbt2LTWsAQDKhp4sAKhCatSoIcn6o7ysIiIi5HK5gnpHNm/erBkzZoS4uvLp1KmTateurRdeeEEFBQWB5dOmTSv31OL9+vXTV199pSVLlgSW5ebm6vnnn1dGRkbguLV9+/YF7efxeNSqVSsZY+T1elVYWFhsSGXdunVVv3595eXllfr4brdb/fv313//+18tW7as2Hp/L17Tpk0lSZ9//nlQna+88sppPmOrN+vLL7/USy+9pL179wYNFZSsHrnCwkI9/PDDxfYtKCg4rfcUAFR39GQBQBXSsWNHSdJf//pX/e53v1NUVJSuuOKKQPgqyWWXXaYJEyaoT58+GjhwoHbv3q3JkyerWbNm+uabbyqr9FJ5PB49+OCD+tOf/qRLLrlE1113nTZv3qypU6eqadOm5eq9u/fee/X666+rb9++GjVqlJKTk/XKK69o06ZNeuedd+R2W/+D7NWrl9LS0tS1a1elpqZq7dq1euaZZ3TZZZepZs2aOnDggBo2bKjf/va3at++veLj4/Xpp5/q66+/1pNPPnnSGh555BHNnj1b3bp100033aSWLVtqx44deuutt7Rw4UIlJiaqV69eatSokW644QbdfffdioiI0EsvvaQ6depo69atp/Wcr7vuOt1111266667lJycrB49egSt79atm26++WaNGzdOq1atUq9evRQVFaX169frrbfe0lNPPRV0Ti0AQOkIWQBQhZx//vl6+OGHNWXKFM2aNUs+n0+bNm06aci65JJL9K9//Uvjx4/X7bffriZNmujRRx/V5s2bHRGyJCkrK0vGGD355JO666671L59e73//vsaNWpUYMje6UhNTdXixYt1zz33aNKkSTp27JjatWun//73v0HnBbv55ps1bdo0TZgwQYcPH1bDhg01atQo3XfffZKkuLg43XrrrZo9e7beffdd+Xw+NWvWTM8++6xGjBhx0hoaNGigpUuX6v7779e0adOUk5OjBg0aqG/fvoqLi5MkRUVF6b333tOtt96q+++/X2lpabr99tuVlJSkYcOGndZzbtiwoS644AItWrRIN954Y4nnvJoyZYo6duyof/7zn/rLX/4SmFzk97//vbp27XpajwcA1ZnLOOHIYgAATpPP51OdOnX0m9/8Ri+88ILd5QAAEMAxWQAAxzt27Fix2Qb//e9/65dfflH37t3tKQoAgFLQkwUAcLz58+frjjvu0LXXXqvatWtrxYoV+te//qWWLVtq+fLlQSczBgDAbhyTBQBwvIyMDKWnp+vpp5/WL7/8ouTkZA0ePFjjx48nYAEAHIeeLAAAAAAIIY7JAgAAAIAQImQBAAAAQAhVu2OyfD6ftm/frpo1a5brBJYAAAAAqgZjjA4dOqT69esHTkQfCtUuZG3fvl3p6el2lwEAAADAIX766Sc1bNgwZPdX7UJWzZo1JVkvZEJCgs3VSF6vV7Nnz1avXr0UFRVldzkoAW3kfLRReKCdnI82Cg+0k/PRRuHB6/VqxowZuvHGGwMZIVSqXcjyDxFMSEhwTMiKi4tTQkICH0KHoo2cjzYKD7ST89FG4YF2cj7aKDz420lSyA8jYuILAAAAAAghQhYAAAAAhBAhCwAAAABCqNodkwUAAICqpbCwUF6v1+4yArxeryIjI3Xs2DEVFhbaXU61FxUVpYiIiEp9TEIWAAAAwtbhw4f1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Br/Dhw/rwQcf1IcffqgdO3aooKBAR48ePWVPVrt27QLXa9SooYSEBO3evbvU7ePi4gIBS5Lq1asX2P7gwYPatWuXOnfuHFgfERGhjh07lnuK+rVr1yoyMlJdunQJLKtdu7ZatGihtWvXSpJGjRqlESNGaPbs2erRo4euueaawPMaMWKErrnmGq1YsUK9evVS//79A2HNCWwfLlidvfyyNGBApObPLz71PAAAAE6PyyXVqGHPT6gm6atRo0bQ7bvuukvvvfeeHnnkEX3xxRdatWqV2rZtq/z8/JPez4kTPLhcrpMGopK2t3EScknSjTfeqB9//FF/+MMftHr1anXq1EmTJk2SJPXt21dbtmzRHXfcoe3bt+vSSy8NGt5oN0KWjfwzSHq9ESffEAAAAFWGx+NRYWFhmbZdtGiRhg4dqquvvlpt27ZVWlqaNm/eXLEFnqBWrVpKTU3V119/HVhWWFioFStWlPs+W7ZsqYKCgqBTNu3bt0/r1q0LOgwoPT1dt9xyi959913deeedeuGFFwLr6tSpoyFDhug///mPJk6cqOeff77c9YSaI4YLVlexsdZlfj5ZFwAAoLrIyMjQ0qVLtXnzZsXHxys5ObnUbZs3b653331XV1xxhVwul+6///5yD9E7E3/60580btw4NWvWTOecc44mTZqk/fv3l+k8W6tXr1bNmjUDt10ul9q3b6+rrrpKw4cP1z//+U/VrFlT9957rxo0aKCrrrpKknT77berb9++Ovvss7V//37NmzdPLVu2lCQ98MAD6tixo1q3bq28vDx98MEHgXVOQMiykb8nKz+fniwAAIDq4q677tKQIUPUqlUrHT16VJs2bSp12wkTJuiPf/yjLrjgAqWkpOiee+5RTk5OJVZrueeee7Rz504NHjxYERERuummm9S7d29FRJz679iLLroo6HZERIQKCgr08ssv67bbbtPll1+u/Px8XXTRRfroo48CQxcLCws1cuRI/fzzz0pISFCfPn0CczN4PB6NHj1amzdvVmxsrC688EK98cYboX/i5UTIslFRTxYhCwAAoLo4++yztWTJkqBlGRkZJR4DlZGRoc8++yxo2ciRI4Nunzh8sKT78Z8TS5K6d+8etM3QoUM1dOjQoO379+8ftE1kZKQmTZoUOCbK5/OpZcuWuu6664o/wVIe50RJSUn697//Xep6/2OV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AAAA4YWQ5XCELAAAACC8ELIcjpAFAAAAhBdClsMxuyAAAAAQXghZDsfsggAAAEB4IWQ5HMMFAQAAgPDiiJA1efJkZWRkKCYmRl26dNFXX31V6rYvvPCCLrzwQiUlJSkpKUk9evQ46fbhjpAFAAAAhBfbQ9b06dOVnZ2tMWPGaMWKFWrfvr169+6t3bt3l7j9/Pnzdf3112vevHlasmSJ0tPT1atXL23btq2SK68chCwAAAAgvNgesiZMmKDhw4dr2LBhatWqlaZMmaK4uDi99NJLJW4/bdo03XrrrerQoYPOOeccvfjii/L5fJo7d24lV145CFkAAABAeIm088Hz8/O1fPlyjR49OrDM7XarR48eWrJkSZnu48iRI/J6vUpOTi5xfV5envLy8gK3c3JyJEler1der/cMqg8Nfw2l1RId7ZYUodxcn7zewlLv59Ahafp0l6691qhWrYqotPo6VRvBfrRReKCdnI82Cg+0k/PRRuGhItvH1pC1d+9eFRYWKjU1NWh5amqqvv/++zLdxz333KP69eurR48eJa4fN26cxo4dW2z57NmzFefvJnKAOXPmlLh8w4bGkjpo06Zd+uij0o89e/LJjvrii4b64ou1GjDghwqqsnorrY3gHLRReKCdnI82Cg+0k/PRRtWXrSHrTI0fP15vvPGG5s+fr5iYmBK3GT16tLKzswO3c3JyAsdxJSQkVFappfJ6vZozZ4569uypqKioYuv373fpueekhIRU9evXr8T7+O47aeFCqyldrhbq169ZhdZc3ZyqjWA/2ig80E7ORxuFB9rJ+Wij8OD1ejVz5swKuW9bQ1ZKSooiIiK0a9euoOW7du1SWlraSfd94oknNH78eH366adq165dqdtFR0crOjq62PKoqChHvelLq8efA48edSsqquRD6B57TDLGur5zZ+nb4cw47T2D4mij8EA7OR9tFB5oJ+ejjaovW/8a93g86tixY9CkFf5JLDIzM0vd77HHHtPDDz+sWbNmqVOnTpVRqm1ONfHFunXSG28U3a6ikywCAAAAYcP2Lo/s7Gy98MILeuWVV7R27VqNGDFCubm5GjZsmCRp8ODBQRNjPProo7r//vv10ksvKSMjQzt37tTOnTt1+PBhu55ChTpVyJo0SfL5pNatrdvbt1dOXQAAAABKZnvIGjBggJ544gk98MAD6tChg1at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4Ai2hyxJysrKUlZWVonr5s+fX2zZtddeq2uvvbaCqwIAAACA02frMVkAAAAAUNUQsgAAAAAghAhZAAAAABBChCwAAAAACCFCFgAAAACEECELAAAAAEKIkAUAAAAAIUTIAgAAAIAQImQBAAAAQAgRsgAAAAAghAhZAAAAABBChCwAAAAACCFCFgAAAACEUKTdBVQ2Y4wkKScnx+ZKLF6vV0eOHFFOTo6ioqLsLgcloI2cjzYKD7ST89FG4YF2cj7aKDz420kqygihUu1C1qFDhyRJ6enpNlcCAAAAwAkOHTqkWrVqhez+XCbUsc3hfD6ftm/frpo1a8rlctldjnJycpSenq6ffvpJCQkJdpeDEtBGzkcbhQfayfloo/BAOzkfbRQe/O303XffqUWLFnK7Q3ckVbXryXK73WrYsKHdZRSTkJDAh9DhaCPno43CA+3kfLRReKCdnI82Cg8NGjQIacCSmPgCAAAAAEKKkAUAAAAAIUTIsll0dLTGjBmj6Ohou0tBKWgj56ONwgPt5Hy0UXignZyPNgoPFdlO1W7iCwAAAACoSPRkAQAAAEAIEbIAAAAAIIQIWQAAAAAQQoQsAAAAAAghQpaNJk+erIyMDMXExKhLly766quv7C6p2nrwwQflcrmCfs4555zA+mPHjmnkyJGqXbu24uPjdc0112jXrl02Vlw9fP7557riiitUv359uVwuzZgxI2i9MUYPPPCA6tWrp9jYWPXo0UPr168P2uaXX37RoEGDlJCQoMTERN1www06fPhwJT6Lqu1UbTR06NBin60+ffoEbUMbVaxx48bp/PPPV82aNVW3bl31799f69atC9qmLN9xW7du1WWXXaa4uDjVrVtXd999twoKCirzqVRpZWmn7t27F/s83XLLLUHb0E4V57nnnlO7du0CJxjOzMzUxx9/HFjP58gZTtVOlfU5ImTZZPr06crOztaYMWO0YsUKtW/fXr1799bu3bvtLq3aat26tXbs2BH4WbhwYWDdHXfcof/+97966623tGDBAm3fvl2/+c1vbKy2esjNzVX79u01efLkEtc/9thjevrppzVlyhQtXbpUNWrUUO/evXXs2LHANoMGDdKaNWs0Z84cffDBB/r888910003VdZTqPJO1UaS1KdPn6DP1uuvvx60njaqWAsWLNDIkSP15Zdfas6cOfJ6verVq5dyc3MD25zqO66wsFCXXXaZ8vPztXjxYr3yyiuaOnWqHnjgATueUpVUlnaSpOHDhwd9nh577LHAOtqpYjVs2FDjx4/X8uXLtWzZMl1yySW66qqrtGbNGkl8jpziVO0kVdLnyMAWnTt3NiNHjgzcLiwsNPXr1zfjxo2zsarqa8yYMaZ9+/Ylrjtw4ICJiooyb731VmDZ2rVrjSSzZMmSSqoQksx7770XuO3z+UxaWpp5/PHHA8sOHDhgoqOjzeuvv26MMea7774zkszXX38d2Objjz82LpfLbNu2rdJqry5ObCNjjBkyZIi56qqrSt2HNqp8u3fvNpLMggULjDFl+4776KOPjNvtNjt37gxs89xzz5mEhASTl5dXuU+gmjixnYwxplu3bua2224rdR/aqfIlJSWZF198kc+Rw/nbyZjK+xzRk2WD/Px8LV++XD169Agsc7vd6tGjh5YsWWJjZdXb+vXrVb9+fZ111lkaNGiQtm7dKklavny5vF5vUHudc845atSoEe1lo02bNmnnzp1B7VKrVi116dIl0C5LlixRYmKiOnXqFNimR48ecrvdWrp0aaXXXF3Nnz9fdevWVYsWLTRixAjt27cvsI42qnwHDx6UJCUnJ0sq23fckiVL1LZtW6Wmpga26d27t3JycoL+O4zQObGd/KZNm6aUlBS1adNGo0eP1pEjRwLraKfKU1hYqDfeeEO5ubnKzMzkc+RQJ7aTX2V8jiJD8xRwOvbu3avCwsKgxpOk1NRUff/99zZVVb116dJFU6dOVYsWLbRjxw6NHTtWF154ob799lvt3LlTHo9HiYmJQfukpqZq586d9hSMwGtf0ufIv27nzp2qW7du0PrIyEglJyfTdpWkT58++s1vfqMmTZpo48aN+stf/qK+fftqyZIlioiIoI0qmc/n0+23366uXbuqTZs2klSm77idO3eW+Fnzr0NoldROkjRw4EA1btxY9evX1zfffKN77rlH69at07vvviuJdqoMq1evVmZmpo4dO6b4+Hi99957atWqlVatWsXnyEFKayep8j5HhCxAUt++fQPX27Vrpy5duqhx48Z68803FRsba2NlQHj73e9+F7jetm1btWvXTk2bNtX8+fN16aWX2lhZ9TRy5Eh9++23QcecwnlKa6fjj1Vs27at6tWrp0svvVQbN25U06ZNK7vMaqlFixZatWqV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3eahhx4y69atMy+//LKJjY01L7/8cuB5NG7c2CQnJ5vJkyeb9evXm3Hjxhm3222+//77M29UAEBIEbIAAKelW7dupmXLlsbn8wWW3XPPPaZly5al7vP1118bSebQoUPGGFMsZBhjTE5OjomOjg6EqhP5g86LL74YWLZmzRojyaxdu7bUxz4+ZPnvY+XKlUHbNG3a1Lz22mtByx5++GGTmZkZtN/EiRNLfRy/yy67zNx5552B2926dTO33XZb0DYnPv+BAweanj17Bm1z9913m1atWgVuN27c2Pz+978P3Pb5fKZu3brmueeeO2VNAIDKxXBBAMBp+9WvfiWXyxW4nZmZqfXr16uwsFCStHz5cl1xxRVq1KiRatasqW7dukmStm7dWup9rl27Vnl5ebr00ktP+tjt2rULXK9Xr54kBYYilkdubq42btyoG264QfHx8YGfv/3tb9q4cWPQtp06dQq6XVhYqIcfflht27ZVcnKy4uPj9cknn5z0eZZk7dq16tq1a9Cyrl27Br2mUvBzd7lcSktLO6PnDgCoGEx8AQAIqdzcXPXu3Vu9e/fWtGnTVKdOHW3dulW9e/dWfn5+qfvFxsaW6f6Pn2zCH/R8Pl+56z18+LAk6YUXXlCXLl2C1kVERATdrlGjRtDtxx9/XE899ZQmTpyotm3bqkaNGrr99ttP+jzPxIkTbbhcrjN67gCAikHIAgCctqVLlwbd/vLLL9W8eXNFRETo+++/1759+zR+/Hilp6dLkpYtWxa0vcfjkaSgXprmzZsrNjZWc+fO1Y033lghdZf0uKmpqapfv75+/PFHDRo06LTub9GiRbrqqqv0+9//XpIV9n744Qe1atUq6DGPf7yStGzZUosWLSp232effXaxoAcAcD5CFgDgtG3dulXZ2dm6+eabtWLFCk2aNCkwG16jRo3k8Xg0adIk3XLLLfr222/18MMPB+3fuHFjuVwuffDBB+rXr59iY2MVHx+ve+65R3/+85/l8XjUtWtX7dmzR2vWrNENN9wQkrrr1q2r2NhYzZo1Sw0bNlRMTIxq1aqlsWPHatSoUapVq5b69OmjvLw8LVu2TPv371d2dnap99e8eXO9/fbbWrx4sZKSkjRhwgTt2rUrKGRlZGRo6dKl2rx5s+Lj45WcnFzsfu68806df/75evjhhzVgwAAtWbJEzzzzTNAMhwCA8MExWQCA0zZ48GAdPXpUnTt31siRI3XbbbfppptukiTVqVNHU6dO1VtvvaVWrVpp/PjxeuKJJ4L2b9CggcaOHat7771XqampysrKkiTdf//9uvPOO/XAAw+oZcuWGjBgQEiPOYqMjNTTTz+tf/7zn6pfv76uuuoqSdKNN96oF198US+//LLatm2rbt26aerUqYEp30tz33336bzzzlPv3r3VvXt3paWlqX///kHb3HXXXYqIiFCrVq0CQydPdN555+nNN9/UG2+8oTZt2uiBBx7QQw89FJjaHgAQXlzGHHdiEwAAAADAGaEnCwAAAABCiJAFAAAAACFEyAIAAACAECJkAQAAAEAIEbIAAAAAIIQIWQAAAAAQQoQsAAAAAAghQhYAAAAAhBAhCwAAAABCiJAFAAAAACFEyAIAAACAEPp/rV31pteVRjkAAAAASUVORK5CYII=",
52
+ "text/plain": [
53
+ "<Figure size 1000x600 with 1 Axes>"
54
+ ]
55
+ },
56
+ "metadata": {},
57
+ "output_type": "display_data"
58
+ }
59
+ ],
60
+ "source": [
61
+ "# plot the loss curves\n",
62
+ "batch_losses = np.lib.format.open_memmap(\"batch_losses.npy\", dtype=np.float32, mode=\"r\")\n",
63
+ "print(batch_losses.shape)\n",
64
+ "last_batch_loss_idx = np.lib.format.open_memmap(\"last_batch_loss_idx.npy\", dtype=np.float32, mode=\"r\")\n",
65
+ "plt.figure(figsize=(10, 6))\n",
66
+ "plt.plot(batch_losses[:last_batch_loss_idx[...]+1], label=\"training Loss\", color=\"blue\")\n",
67
+ "plt.xlabel(\"batch iteration\")\n",
68
+ "plt.ylabel(\"loss\")\n",
69
+ "plt.title(\"training loss curve\")\n",
70
+ "plt.legend()\n",
71
+ "plt.grid(True)\n",
72
+ "plt.show()"
73
+ ]
74
+ },
75
+ {
76
+ "cell_type": "code",
77
+ "execution_count": 4,
78
+ "id": "38bfe104",
79
+ "metadata": {},
80
+ "outputs": [
81
+ {
82
+ "data": {
83
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1kAAAIjCAYAAADxz9EgAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAYE1JREFUeJzt3XlcVXX+x/H3ZRcRNwREcUlNrVzKLdTUxgW1jRYz6zeuaWWkE6WNTWpOM1lNOVY6ma02ZS4ttjkmWVopZm7TlLtpmAq4k6CI3PP743SvXgEFPHDuvbyej8d9cDj3e8/5HPp64833e77XYRiGIQAAAACAJQLsLgAAAAAA/AkhCwAAAAAsRMgCAAAAAAsRsgAAAADAQoQsAAAAALAQIQsAAAAALETIAgAAAAALEbIAAAAAwEKELAAAAACwECELAFCsN998Uw6HQ7t373bv69Gjh3r06HHB1y5fvlwOh0PLly+3tCaHw6HHH3/c0mOWxOOPPy6Hw1Hh5wUA+B5CFgDA6yxevNiWIAUAgBWC7C4AAOBbli5dWu7nWLx4sWbOnFlk0Dpx4oSCgvjfFwDAezGSBQAolZCQEIWEhNh2/rCwMEJWBcrJybG7BADwOYQsAPAT7733nhwOh1asWFHouZdfflkOh0M//vijJOmHH37Q0KFDdckllygsLEyxsbEaPny4Dh06dMHzFHVP1q+//qqkpCRVrVpV0dHRevDBB5WXl1fotd98840GDBigBg0aKDQ0VPHx8XrwwQd14sQJd5uhQ4dq5syZksz7r1wPl6LuydqwYYP69eunyMhIRUREqGfPnlq9erVHG9f9ZStXrlRKSorq1KmjqlWr6uabb9aBAwcueN1FOX36tJ544gk1adJEoaGhatSokR599NFC17527VolJiYqKipKVapUUePGjTV8+HCPNvPmzVO7du1UrVo1RUZGqlWrVnr++ecvWIPT6dTzzz+vVq1aKSwsTHXq1FHfvn21du1aSdLu3bvlcDj05ptvFnrtuT9L131nmzZt0p133qmaNWuqa9euevbZZ+VwOPTLL78UOsaECRMUEhKiI0eOuPd999136tu3r6pXr67w8HB1795dK1euvOC1AIC/4E+BAOAnrrvuOkVERGjBggXq3r27x3Pz58/X5ZdfriuuuEKSlJqaqp9//lnDhg1TbGysfvrpJ82ePVs//fSTVq9eXaoFHk6cOKGePXsqPT1dY8aMUVxcnP7973/ryy+/LNR24cKFys3N1X333afatWtrzZo1evHFF/Xrr79q4cKFkqR77rlH+/btU2pqqv79739f8Pw//fSTrrnmGkVGRmr8+PEKDg7Wyy+/rB49emjFihXq1KmTR/sHHnhANWvW1OTJk7V7925Nnz5dycnJmj9/fomv2eXuu+/WnDlzdNttt+mhhx7Sd999p6lTp2rz5s368MMPJUlZWVnq06eP6tSpoz//+c+qUaOGdu/erQ8++MB9nNTUVA0aNEg9e/bU008/LUnavHmzVq5cqbFjx563hhEjRujNN99Uv379dPfdd+v06dP65ptvtHr1arVv377U1yRJAwYMULNmzfTkk0/KMAxdf/31Gj9+vBYsWKBx48Z5tF2wYIH69OmjmjVrSpK+/PJL9evXT+3atdPkyZMVEBCgN954Q3/4wx/0zTffqGPHjmWqCQB8igEA8BuDBg0yoqOjjdOnT7v37d+/3wgICDD++te/uvfl5uYWeu27775rSDK+/vpr97433njDkGTs2rXLva979+5G9+7d3d9Pnz7dkGQsWLDAvS8nJ8do2rSpIcn46quvznveqVOnGg6Hw/jll1/c++6//36juP9FSTImT57s/j4pKckICQkxdu7c6d63b98+o1q1aka3bt0KXUuvXr0Mp9Pp3v/ggw8agYGBxtGjR4s8n8vkyZM9atq4caMhybj77rs92j388MOGJOPLL780DMMwPvzwQ0OS8f333xd77LFjxxqRkZEe/91K4ssvvzQkGWPGjCn0nOsad+3aZUgy3njjjUJtzv1Zuq5x0KBBhdomJCQY7dq189i3Zs0aQ5Lx1ltvuc/ZrFkzIzEx0eNnnJubazRu3Njo3bt3qa4PAHwV0wUBwI8MHDhQWVlZHsumv/fee3I6nRo4cKB7X5UqVdzbJ0+e1MGDB3X11VdLktavX1+qcy5evFh169bVbbfd5t4XHh6uUaNGFWp79nlzcnJ08OBBde7cWYZhaMOGDaU6ryQVFBRo6dKlSkpK0iWXXOLeX7duXd1555369ttvlZ2d7fGaUaNGeYzUXXPNNSooKChyKtz5LF68WJKUkpLisf+hhx6SJH322WeSpBo1akiSPv30U+Xn5xd5rBo1aignJ0epqamlquH999+Xw+HQ5MmTCz13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daF+NHTo0ELvUX379rWnWHi1qVOnqkOHDqpWrZqio6OVlJSkrVu3erQ5efKk7r//ftWuXVsRERG69dZblZmZaVPF8EYl6Uc9evQo9L507733luo8hCwvNn/+fKWkpGjy5Mlav3692rRpo8TERGVlZdldGnzM5Zdfrv3797sf3377rd0lwQfk5OSoTZs2mjlzZpHPP/PMM3rhhRc0a9Ysfffdd6pataoSExN18uTJCq4U3uxC/UiS+vbt6/Ee9e6771ZghfAVK1as0P3336/Vq1crNTVV+fn56tOnj3JyctxtHnzwQX3yySdauHChVqxYoX379umWW26xsWp4m5L0I0kaOXKkx/vSM888U6rzsIS7F+vUqZM6dOigGTNmSJKcTqfi4+P1wAMP6M9//rPN1cFXPP7441q0aJE2btxodynwYQ6HQx9++KGSkpIkmaNYcXFxeuihh/Twww9Lko4dO6aYmBi9+eabuuOOO2ysFt7q3H4kmSNZR48eLTTCBVzIgQMHFB0drRUrVqhbt246duyY6tSpo7lz5+q2226TJG3ZskUtW7ZUWlqarr76apsrhjc6tx9J5khW27ZtNX369DIfl5EsL3Xq1CmtW7dOvXr1cu8LCAhQr169lJaWZmNl8EXbt29XXFycLrnkEt11111KT0+3uyT4uF27dikjI8PjPap69erq1KkT71EoteXLlys6OlrNmzfXfffdp0OHDtldEnzAsWPHJEm1atWSJK1bt075+fke70stWrRQgwYNeF9Csc7tRy7vvPOOoqKidMUVV2jChAnKzc0t1XGDLKsQljp48KAKCgoUExPjsT8mJkZbtmyxqSr4ok6dOunNN99U8+bNtX//fk2ZMkXXXHONfvzxR1WrVs3u8uCjMjIyJKnI9yjXc0BJ9O3bV7fccosaN26snTt36tFHH1W/fv2UlpamwMBAu8uDl3I6nfrTn/6kLl266IorrpBkvi+FhISoRo0aHm15X0JxiupHknTnnXeqYcOGiouL0w8//KBHHnlEW7du1QcffFDiYxOyAD/Xr18/93br1q3VqVMnNWzYUAsWLNCIESNsrAwA5DG1tFWrVmrdurWaNGmi5cuXq2fPnjZWBm92//3368cff+QeY1yU4vrRqFGj3NutWrVS3bp11bNnT+3cuVNNmjQp0bGZLuiloqKiFBgYWGhFnMzMTMXGxtpUFfxBjRo1dOmll2rHjh12lwIf5nof4j0KVrvkkksUFRXFexSKlZycrE8//VRfffWV6tev794fGxurU6dO6ejRox7teV9CUYrrR0Xp1KmTJJXqfYmQ5aVCQkLUrl07LVu2zL3P6XRq2bJlSkhIsLEy+Lrjx49r586dqlu3rt2lwIc1btxYsbGxHu9R2dnZ+u6773iPwkX59ddfdejQId6jUIhhGEpOTtaHH36oL7/8Uo0bN/Z4vl27dgoODvZ4X9q6davS09N5X4LbhfpRUVyLh5XmfYnpgl4sJSVFQ4YMUfv27dWxY0dNnz5dOTk5GjZsmN2lwYc8/PDDuuGGG9SwYUPt27dPkydPVmBgoAYNGmR3afByx48f9/ir3a5du7Rx40bVqlVLDRo00J/+9Cf97W9/U7NmzdS4cWNNnDhRcXFxHivHAefrR7Vq1dKUKVN06623KjY2Vjt37tT48ePVtGlTJSYm2lg1vNH999+vuXPn6qOPPlK1atXc91lVr15dVapUUfXq1TVixAilpKSoVq1aioyM1AMPPKCEhARWFoTbhfrRzp07NXfuXPXv31+1a9fWDz/8oAcffFDdunVT69atS34iA17txRdfNBo0aGCEhIQYHTt2NFavXm13SfAxAwcONOrWrWuEhIQY9erVMwYOHGjs2LHD7rLgA7766itDUqHHkCFDDMMwDKfTaUycONGIiYkxQkNDjZ49expbt261t2h4nfP1o9zcXKNPnz5GnTp1jODgYKNhw4bGyJEjjYyMDLvLhhcqqh9JMt544w13mxMnThijR482atasaYSHhxs333yzsX//fvuKhte5UD9KT083unXrZtSqVcsIDQ01mjZtaowbN844duxYqc7D52QBAAAAgIW4JwsAAAAALETIAgAAAAALEbIAAAAAwEKELAAAAACwECELAAAAACxEyAIAAAAACxGyAAAAAMBChCwAAAAAsBAhCwDg9Xbv3i2Hw6GNGzeW2zmWL18uh8Oho0ePlts5JKlHjx7605/+VK7nAADYK8juAgAAqEw++OADBQcHl7j97t271bhxY23YsEFt27Ytv8IAAJYhZAEAUIFq1apldwkAgHLGdEEAgNdwOp165pln1LRpU4WGhqpBgwb6+9//7n7+559/1rXXXqvw8HC1adNGaWlpHq//9ttvdc0116hKlSqKj4/XmDFjlJOT434+Ly9PjzzyiOLj4xUaGqqmTZvqtddeK7KW3Nxc9evXT126dNHRo0fdUxbnzZunzp07KywsTFdccYVWrFjh8boVK1aoY8eOCg0NVd26dfXnP/9Zp0+fdj9/7nTBRo0a6cknn9Tw4cNVrVo1NWjQQLNnz3Y/37hxY0nSlVdeKYfDoR49epT65woAqFiELACA15gwYYKeeuopTZw4UZs2bdLcuXMVExPjfv4vf/mLHn74YW3cuFGXXnqpBg0a5A4wO3fuVN++fXXrrbfqhx9+0Pz58/Xtt98qOTnZ/frBgwfr3Xff1QsvvKDNmzfr5ZdfVkRERKE6jh49qt69e8vpdCo1NVU1atRwPzdu3Dg99NBD2rBhgxISEnTDDTfo0KFDkqS9e/eqf//+6tChg/773//qpZde0muvvaa//e1v573u5557Tu3bt9eGDRs0evRo3Xfffdq6daskac2aNZKkL774Qvv379cHH3xQth8uAKDiGAAAeIHs7GwjNDTUeOWVVwo9t2vXLkOS8eqrr7r3/fTTT4YkY/PmzYZhGMaIESOMUaNGebzum2++MQICAowTJ04YW7duNSQZqampRZ7/q6++ch+vdevWxq233mrk5eUVquGpp55y78vPzzfq169vPP3004ZhGMajjz5qNG/e3HA6ne42M2fONCIiIoyCggLDMAyje/fuxtixY93PN2zY0Pi///s/9/dOp9OIjo42XnrpJY/zbtiw4bw/PwCA92AkCwDgFTZv3qy8vDz17Nmz2DatW7d2b9etW1eSlJWVJUn673//qzfffFMRERHuR2JiopxOp3bt2qWNGzcqMDBQ3bt3P28dvXv3VtOmTTV//nyFhIQUej4hIcG9HRQUpPbt22vz5s3ua0hISJDD4XC36dKli44fP65ff/21RNflcDgUGxvrvi4AgO9h4QsAgFeoUqXKBducvSqfK8g4nU5J0vHjx3XPPfdozJgxhV7XoEED7dixo0R1XHfddXr//fe1adMmtWrVqkSvuVjnrjbocDjc1wUA8D2MZAEAvEKzZs1UpUoVLVu2rEyvv+qqq7Rp0yY1bdq00CMkJEStWrWS0+kstFDFuZ566ikNGTJEPXv21KZNmwo9v3r1avf26dOntW7dOrVs2VKS1LJlS6WlpckwDHeblStXqlq1aqpfv36Zrss1mlZQUFCm1wMAKh4hCwDgFcLCwvTII49o/Pjxeuutt7Rz506tXr262NX/zvXII49o1apVSk5O1saNG7V9+3Z99NFH7oUvGjVqpCFDhmj48OFatGiRdu3apeXLl2vBggWFjvXss8/qrrvu0h/+8Adt2bLF47mZM2fqww8/1JYtW3T//ffryJEjGj58uCRp9OjR2rNnjx544AFt2bJFH330kSZPnqyUlBQFBJTtf7nR0dGqUqWKlixZoszMTB07dqxMxwEAVBxCFgDAa0ycOFEPPfSQJk2apJYtW2rgwIElvjepdevWWrFihbZt26ZrrrlGV155pSZNmqS4uDh3m5deekm33XabRo8erRYtWmjkyJEeS7yf7Z///Kduv/12/eEPf9C2bdvc+5966ik99dRTatOmjb799lt9/PHHioqKkiTVq1dPixcv1po1a9SmTRvde++9GjFihB577LEy/0yCgoL0wgsv6OWXX1ZcXJxuuummMh8LAFAxHMbZcxoAAECRdu/ercaNG2vDhg1q27at3eUAALwYI1kAAAAAYCFCFgAAAABYiOmCAAAAAGAhRrIAAAAAwEKELAAAAACwECELAAAAACxEyAIAAAAACxGyAAAAAMBChCwAAAAAsBAhCwAAAAAsRMgCAAAAAAv9Py9yMHM9tCSgAAAAAElFTkSuQmCC",
84
+ "text/plain": [
85
+ "<Figure size 1000x600 with 1 Axes>"
86
+ ]
87
+ },
88
+ "metadata": {},
89
+ "output_type": "display_data"
90
+ }
91
+ ],
92
+ "source": [
93
+ "# plot the val loss curves\n",
94
+ "val_losses = np.lib.format.open_memmap(\"val_losses.npy\", dtype=np.float32, mode=\"r\")\n",
95
+ "last_val_loss_idx = np.lib.format.open_memmap(\"last_val_loss_idx.npy\", dtype=np.float32, mode=\"r\")\n",
96
+ "plt.figure(figsize=(10, 6))\n",
97
+ "plt.plot(val_losses[:last_val_loss_idx[...]+1], label=\"validation loss\", color=\"red\")\n",
98
+ "plt.xlabel(\"checkpoint\")\n",
99
+ "plt.ylabel(\"loss\")\n",
100
+ "plt.title(\"validation loss curve\")\n",
101
+ "plt.legend()\n",
102
+ "plt.grid(True)\n",
103
+ "plt.show()"
104
+ ]
105
+ },
106
+ {
107
+ "cell_type": "code",
108
+ "execution_count": 5,
109
+ "id": "969edb6e",
110
+ "metadata": {},
111
+ "outputs": [
112
+ {
113
+ "ename": "FileNotFoundError",
114
+ "evalue": "[Errno 2] No such file or directory: './total_losses.npy'",
115
+ "output_type": "error",
116
+ "traceback": [
117
+ "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
118
+ "\u001b[31mFileNotFoundError\u001b[39m Traceback (most recent call last)",
119
+ "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[5]\u001b[39m\u001b[32m, line 5\u001b[39m\n\u001b[32m 2\u001b[39m \u001b[38;5;28;01mimport\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mnumpy\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mas\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mnp\u001b[39;00m\n\u001b[32m 3\u001b[39m \u001b[38;5;28;01mimport\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mmatplotlib\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mpyplot\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mas\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mplt\u001b[39;00m\n\u001b[32m----> \u001b[39m\u001b[32m5\u001b[39m total_losses = \u001b[43mnp\u001b[49m\u001b[43m.\u001b[49m\u001b[43mload\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43m./total_losses.npy\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[32m 6\u001b[39m makespan_losses = np.load(\u001b[33m\"\u001b[39m\u001b[33m./makespan_losses.npy\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 7\u001b[39m sinkhorn_losses = np.load(\u001b[33m\"\u001b[39m\u001b[33m./sinkhorn_losses.npy\u001b[39m\u001b[33m\"\u001b[39m)\n",
120
+ "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/ai/lib/python3.11/site-packages/numpy/lib/_npyio_impl.py:451\u001b[39m, in \u001b[36mload\u001b[39m\u001b[34m(file, mmap_mode, allow_pickle, fix_imports, encoding, max_header_size)\u001b[39m\n\u001b[32m 449\u001b[39m own_fid = \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[32m 450\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m451\u001b[39m fid = stack.enter_context(\u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mos\u001b[49m\u001b[43m.\u001b[49m\u001b[43mfspath\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mrb\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m)\n\u001b[32m 452\u001b[39m own_fid = \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[32m 454\u001b[39m \u001b[38;5;66;03m# Code to distinguish from NumPy binary files and pickles.\u001b[39;00m\n",
121
+ "\u001b[31mFileNotFoundError\u001b[39m: [Errno 2] No such file or directory: './total_losses.npy'"
122
+ ]
123
+ }
124
+ ],
125
+ "source": [
126
+ "# plot phase 2\n",
127
+ "import numpy as np\n",
128
+ "import matplotlib.pyplot as plt\n",
129
+ "\n",
130
+ "total_losses = np.load(\"./total_losses.npy\")\n",
131
+ "makespan_losses = np.load(\"./makespan_losses.npy\")\n",
132
+ "sinkhorn_losses = np.load(\"./sinkhorn_losses.npy\")\n",
133
+ "last_losses_idx = np.load(\"./last_losses_idx.npy\")\n",
134
+ "\n",
135
+ "fig, axes = plt.subplots(3, 1, figsize=(10, 12), sharex=True)\n",
136
+ "\n",
137
+ "axes[0].plot(total_losses[:last_losses_idx+1], label=\"total loss\", color=\"blue\")\n",
138
+ "axes[0].set_ylabel(\"loss\")\n",
139
+ "axes[0].set_title(\"Total Loss\")\n",
140
+ "axes[0].legend()\n",
141
+ "axes[0].grid(True)\n",
142
+ "\n",
143
+ "axes[1].plot(makespan_losses[:last_losses_idx+1], label=\"makespan loss\", color=\"orange\")\n",
144
+ "axes[1].set_ylabel(\"loss\")\n",
145
+ "axes[1].set_title(\"Makespan Loss\")\n",
146
+ "axes[1].legend()\n",
147
+ "axes[1].grid(True)\n",
148
+ "\n",
149
+ "axes[2].plot(sinkhorn_losses[:last_losses_idx+1], label=\"sinkhorn loss\", color=\"green\")\n",
150
+ "axes[2].set_xlabel(\"checkpoint\")\n",
151
+ "axes[2].set_ylabel(\"loss\")\n",
152
+ "axes[2].set_title(\"Sinkhorn Loss\")\n",
153
+ "axes[2].legend()\n",
154
+ "axes[2].grid(True)\n",
155
+ "\n",
156
+ "plt.tight_layout()\n",
157
+ "plt.show()"
158
+ ]
159
+ }
160
+ ],
161
+ "metadata": {
162
+ "kernelspec": {
163
+ "display_name": "ai",
164
+ "language": "python",
165
+ "name": "python3"
166
+ },
167
+ "language_info": {
168
+ "codemirror_mode": {
169
+ "name": "ipython",
170
+ "version": 3
171
+ },
172
+ "file_extension": ".py",
173
+ "mimetype": "text/x-python",
174
+ "name": "python",
175
+ "nbconvert_exporter": "python",
176
+ "pygments_lexer": "ipython3",
177
+ "version": "3.11.13"
178
+ }
179
+ },
180
+ "nbformat": 4,
181
+ "nbformat_minor": 5
182
+ }
source/{demos/recover_schedules.bash → recover_schedules.bash} RENAMED
@@ -1,5 +1,5 @@
1
  python recover_schedules.py\
2
- --testing ""\
3
  --seed 97\
4
  --init_mode random\
5
  --n_optimization_steps 1000\
@@ -20,6 +20,6 @@ python recover_schedules.py\
20
  --lr_warmup_iters_ratio 0.1\
21
  --lr_decay_iters_ratio 0.90\
22
  --checkpoint_interval 100\
23
- --data_dir "/home/younes/MVA/semester_2/advanced_deep_learning/flowshop_transformer/datasets/d_2026_03_05_09_02_38_retail_jetskiing/ftd_split"\
24
- --model_dir "./train_artifacts"\
25
- --output_dir "./rc_artifacts"
 
1
  python recover_schedules.py\
2
+ --testing True\
3
  --seed 97\
4
  --init_mode random\
5
  --n_optimization_steps 1000\
 
20
  --lr_warmup_iters_ratio 0.1\
21
  --lr_decay_iters_ratio 0.90\
22
  --checkpoint_interval 100\
23
+ --data_dir "./demos/ftd_split"\
24
+ --model_dir "./demos/train_artifacts"\
25
+ --output_dir "./demos/rs_artifacts"
source/{demos/split_dataset.bash → split_dataset.bash} RENAMED
@@ -1,6 +1,6 @@
1
  python split_dataset.py\
2
- --input_dir "./ftd_"\
3
- --output_dir "./ftd_split"\
4
  --train_ratio 0.85\
5
  --seed 97\
6
  --eliminate_top_k_makespans 2\
 
1
  python split_dataset.py\
2
+ --input_dir "./demos/ftd"\
3
+ --output_dir "./demos/ftd_split"\
4
  --train_ratio 0.85\
5
  --seed 97\
6
  --eliminate_top_k_makespans 2\
source/{demos/train.bash → train.bash} RENAMED
@@ -1,7 +1,7 @@
1
  python train_rpe.py\
2
  --testing ""\
3
  --seed 97\
4
- --data_dir /home/younes/MVA/semester_2/advanced_deep_learning/flowshop_transformer/datasets/d_2026_03_05_09_02_38_retail_jetskiing/ftd_split\
5
  --n_embd 64\
6
  --n_head 4\
7
  --n_layer 2\
@@ -27,4 +27,4 @@ python train_rpe.py\
27
  --compile ""\
28
  --compile_mode default\
29
  --save_only_last_checkpoint True\
30
- --output_dir "./train_artifacts"\
 
1
  python train_rpe.py\
2
  --testing ""\
3
  --seed 97\
4
+ --data_dir ./demos/ftd_split\
5
  --n_embd 64\
6
  --n_head 4\
7
  --n_layer 2\
 
27
  --compile ""\
28
  --compile_mode default\
29
  --save_only_last_checkpoint True\
30
+ --output_dir "./demos/train_artifacts"\
source/train_rpe.py CHANGED
@@ -210,6 +210,10 @@ if __name__ == "__main__":
210
 
211
  os.makedirs(args.output_dir, exist_ok=True)
212
 
 
 
 
 
213
  if not args.testing:
214
  # check if experiment termination flag file exists
215
  if os.path.exists(os.path.join(args.output_dir, ".terminated_phase1")):
 
210
 
211
  os.makedirs(args.output_dir, exist_ok=True)
212
 
213
+ # copy the viz.ipynb file to the output directory
214
+ import shutil
215
+ shutil.copy("viz.ipynb", args.output_dir)
216
+
217
  if not args.testing:
218
  # check if experiment termination flag file exists
219
  if os.path.exists(os.path.join(args.output_dir, ".terminated_phase1")):
source/viz_rs.ipynb ADDED
The diff for this file is too large to render. See raw diff
 
source/viz_train.ipynb ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "id": "24989eac",
7
+ "metadata": {},
8
+ "outputs": [],
9
+ "source": [
10
+ "import numpy as np\n",
11
+ "import matplotlib.pyplot as plt"
12
+ ]
13
+ },
14
+ {
15
+ "cell_type": "code",
16
+ "execution_count": 3,
17
+ "id": "c6c1eda1",
18
+ "metadata": {},
19
+ "outputs": [
20
+ {
21
+ "name": "stdout",
22
+ "output_type": "stream",
23
+ "text": [
24
+ "(335,)\n"
25
+ ]
26
+ },
27
+ {
28
+ "data": {
29
+ "image/png": "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ZZepZs2aOnDggBo2bKjf/va3at++veLj4/Xpp5/q66+/1pNPPnnSGh555BHNnj1b3bp100033aSWLVtqx44deuutt7Rw4UIlJiaqV69eatSokW644QbdfffdioiI0EsvvaQ6depo69atp/Wcr7vuOt1111266667lJycrB49egSt79atm26++WaNGzdOq1atUq9evRQVFaX169frrbfe0lNPPRV0Ti0AQOkIWQBQhZx//vl6+OGHNWXKFM2aNUs+n0+bNm06aci65JJL9K9//Uvjx4/X7bffriZNmujRRx/V5s2bHRGyJCkrK0vGGD355JO666671L59e73//vsaNWpUYMje6UhNTdXixYt1zz33aNKkSTp27JjatWun//73v0HnBbv55ps1bdo0TZgwQYcPH1bDhg01atQo3XfffZKkuLg43XrrrZo9e7beffdd+Xw+NWvWTM8++6xGjBhx0hoaNGigpUuX6v7779e0adOUk5OjBg0aqG/fvoqLi5MkRUVF6b333tOtt96q+++/X2lpabr99tuVlJSkYcOGndZzbtiwoS644AItWrRIN954Y4nnvJoyZYo6duyof/7zn/rLX/4SmFzk97//vbp27XpajwcA1ZnLOOHIYgAATpPP51OdOnX0m9/8Ri+88ILd5QAAEMAxWQAAxzt27Fix2Qb//e9/65dfflH37t3tKQoAgFLQkwUAcLz58+frjjvu0LXXXqvatWtrxYoV+te//qWWLVtq+fLlQSczBgDAbhyTBQBwvIyMDKWnp+vpp5/WL7/8ouTkZA0ePFjjx48nYAEAHIeeLAAAAAAIIY7JAgAAAIAQImQBAAAAQAhVu2OyfD6ftm/frpo1a5brBJYAAAAAqgZjjA4dOqT69esHTkQfCtUuZG3fvl3p6el2lwEAAADAIX766Sc1bNgwZPdX7UJWzZo1JVkvZEJCgs3VSF6vV7Nnz1avXr0UFRVldzkoAW3kfLRReKCdnI82Cg+0k/PRRuHB6/VqxowZuvHGGwMZIVSqXcjyDxFMSEhwTMiKi4tTQkICH0KHoo2cjzYKD7ST89FG4YF2cj7aKDz420lSyA8jYuILAAAAAAghQhYAAAAAhBAhCwAAAABCqNodkwUAAICqpbCwUF6v1+4yArxeryIjI3Xs2DEVFhbaXU61FxUVpYiIiEp9TEIWAAAAwtbhw4f1888/yxhjdykBxhilpaXpp59+4rysDuByudSwYUPFx8dX2mMSsgAAABCWCgsL9fPPPysuLk516tRxTKDx+Xw6fPiw4uPjQ3qCW5w+Y4z27Nmjn3/+Wc2bN6+0Hi1HhKzJkyfr8ccf186dO9W+fXtNmjRJnTt3LnHbqVOnatiwYUHLoqOjdezYscooFQAAAA7h9XpljFGdOnUUGxtrdzkBPp9P+fn5iomJIWQ5QJ06dbR582Z5vd5KC1m2t/r06dOVnZ2tMWPGaMWKFWrfvr169+6t3bt3l7pPQkKCduzYEfjZsmVLJVYMAAAAJ3FKDxacyY73h+0ha8KECRo+fLiGDRumVq1aacqUKYqLi9NLL71U6j4ul0tpaWmBn9TU1EqsGAAAAABKZ+twwfz8fC1fvlyjR48OLHO73erRo4eWLFlS6n6HDx9W48aN5fP5dN555+mRRx5R69atS9w2Ly9PeXl5gds5OTmSrO5lJ8xC46/BCbWgZLSR89FG4YF2cj7aKDzQTkX8wwV9Pp98Pp/d5QT4J+Hw1wZ7+Xw+GWOKDResyM+Qy9g4Fcv27dvVoEEDLV68WJmZmYHlf/7zn7VgwQItXbq02D5LlizR+vXr1a5dOx08eFBPPPGEPv/8c61Zs0YNGzYstv2DDz6osWPHFlv+2muvKS4uLrRPCAAAAJUmMjJSaWlpSk9Pl8fjsbsc27Rr104jRozQiBEjyrT9woULdcUVV2jz5s2qVatWBVdnv/z8fP3000/auXOnCgoKgtYdOXJEAwcO1MGDB5WQkBCyxwy7kHUir9erli1b6vrrr9fDDz9cbH1JPVnp6enau3dvSF/I8vJ6vZozZ4569uypqKgou8tBCWgj56ONwgPt5Hy0UXignYocO3ZMP/30kzIyMhQTE2N3OQHGGB06dEg1a9Ys8XigSy65RO3bt9c//vGPkDzenj17VKNGjTJ3IOTn5+uXX35RampqhR6vNH/+fF166aXat2+fEhMTK+xxTuXYsWPavHmz0tPTg94nXq9XM2fOrJCQZetwwZSUFEVERGjXrl1By3ft2qW0tLQy3UdUVJTOPfdcbdiwocT10dHRio6OLnE/J30xOa0eFEcbOR9tFB5oJ+ejjcID7WRN4e5yueR2ux01i59/iKC/tpKcbJ1kBbXCwkJFRp76z/XTnZ8gJiZG9evXP619ysP//OxuH7fbLZfLVamfGVvfjR6PRx07dtTcuXMDy3w+n+bOnRvUs3UyhYWFWr16terVq1dRZQIAACAMGCPl5trzU9axYUOHDtWCBQv01FNPyeVyyeVyafPmzZo/f75cLpc+/vhjdezYUdHR0Vq4cKE2btyoq666SqmpqYqPj9f555+vTz/9NOg+MzIyNHHixMBtl8ulF198UVdffbXi4uLUvHlzvf/++4H1/sc6cOCAJOsUSYmJifrkk0/UsmVLxcfHq0+fPtqxY0dgn4KCAo0aNUqJiYmqXbu27rnnHg0ZMkT9+/cvb3Np//79Gjx4sJKSkhQXF6e+fftq/fr1gfVbtmzRFVdcoaSkJNWoUUOtW7fWRx99FNh30KBBgen7mzdvrpdffrnctYSa7ZE/OztbL7zwgl555RWtXbtWI0aMUG5ubuBcWIMHDw6aGOOhhx7S7Nmz9eOPP2rFihX6/e9/ry1btujGG2+06ykAAADAAY4ckeLj7fk5cqRsNT711FPKzMzU8OHDA6cjSk9PD6y/9957NX78eK1du1bt2rXT4cOH1a9fP82dO1crV65Unz59dMUVV2jr1q0nfZyxY8fquuuu0zfffKN+/fpp0KBB+uWXX07y2h3RE088oVdffVWff/65tm7dqrvuuiuw/tFHH9W0adP08ssva9GiRcrJydGMGTPK9qRLMXToUC1btkzvv/++lixZImOM+vXrF5iQYuTIkcrLy9Pnn3+u1atX69FHH1V8fLwk6f7779d3332njz/+WGvXrtVzzz2nlJSUM6onlGw/GfGAAQO0Z88ePfDAA9q5c6c6dOigWbNmBbo9t27dGtS9uH//fg0fPlw7d+5UUlKSOnbsqMWLF6tVq1Z2PQUAAACgTGrVqiWPx6O4uLgSD4956KGH1LNnz8Dt5ORktW/fPnD74Ycf1nvvvaf3339fWVlZpT7O0KFDdf3110uSHnnkET399NP66quv1KdPnxK393q9mjJlipo2bSpJysrK0kMPPRRYP2nSJI0ePVpXX321JOmZZ54J9CqVx/r16/X+++9r0aJFuuCCCyRJ06ZNU3p6umbMmKFrr71WW7du1TXXXKO2bdtKks4666zA/lu3btW5556rTp06SbJ685zE9pAlWY1Y2ptk/vz5Qbf/8Y9/hOwgQbutWSOtWePSjh32T8ABAAAQ7uLipMOH7XvsUPCHBr/Dhw/rwQcf1IcffqgdO3aooKBAR48ePWVPVrt27QLXa9SooYSEBO3evbvU7ePi4gIBS5Lq1asX2P7gwYPatWuXOnfuHFgfERGhjh07lnuK+rVr1yoyMlJdunQJLKtdu7ZatGihtWvXSpJGjRqlESNGaPbs2erRo4euueaawPMaMWKErrnmGq1YsUK9evVS//79A2HNCWwfLlidvfyyNGBApObPLz71PAAAAE6PyyXVqGHPT6gm6atRo0bQ7bvuukvvvfeeHnnkEX3xxRdatWqV2rZtq/z8/JPez4kTPLhcrpMGopK2t3EScknSjTfeqB9//FF/+MMftHr1anXq1EmTJk2SJPXt21dbtmzRHXfcoe3bt+vSSy8NGt5oN0KWjfwzSHq9ESffEAAAAFWGx+NRYWFhmbZdtGiRhg4dqquvvlpt27ZVWlqaNm/eXLEFnqBWrVpKTU3V119/HVhWWFioFStWlPs+W7ZsqYKCgqBTNu3bt0/r1q0LOgwoPT1dt9xyi959913deeedeuGFFwLr6tSpoyFDhug///mPJk6cqOeff77c9YSaI4YLVlexsdZlfj5ZFwAAoLrIyMjQ0qVLtXnzZsXHxys5ObnUbZs3b653331XV1xxhVwul+6///5yD9E7E3/60580btw4NWvWTOecc44mTZqk/fv3l+k8W6tXr1bNmjUDt10ul9q3b6+rrrpKw4cP1z//+U/VrFlT9957rxo0aKCrrrpKknT77berb9++Ovvss7V//37NmzdPLVu2lCQ98MAD6tixo1q3bq28vDx98MEHgXVOQMiykb8nKz+fniwAAIDq4q677tKQIUPUqlUrHT16VJs2bSp12wkTJuiPf/yjLrjgAqWkpOiee+5RTk5OJVZrueeee7Rz504NHjxYERERuummm9S7d29FRJz679iLLroo6HZERIQKCgr08ssv67bbbtPll1+u/Px8XXTRRfroo48CQxcLCws1cuRI/fzzz0pISFCfPn0CczN4PB6NHj1amzdvVmxsrC688EK98cYboX/i5UTIslFRTxYhCwAAoLo4++yztWTJkqBlGRkZJR4DlZGRoc8++yxo2ciRI4Nunzh8sKT78Z8TS5K6d+8etM3QoUM1dOjQoO379+8ftE1kZKQmTZoUOCbK5/OpZcuWuu6664o/wVIe50RJSUn697//Xep6/2OV5L777tN9991X6nq7EbJsVHRMFsMFAQAA4FxbtmzR7Nmz1a1bN+Xl5emZZ57Rpk2bNHDgQLtLcyT+urcRwwUBAAAQDtxut6ZOnarzzz9fXbt21erVq/Xpp5866jgoJ6Eny0ZMfAEAAIBwkJ6erkWLFtldRtjgr3sb0ZMFAAAAVD2ELBsx8QUAAMCZs/ukuXA2O94fhCwbMfEFAABA+fmnD8/Pz7e5EjiZ//1RlunmQ4VjsmzEcEEAAIDyi4yMVFxcnPbs2aOoqCi53c74x7XP51N+fr6OHTvmmJqqK5/Ppz179iguLk6RkZUXfQhZNmLiCwAAgPJzuVyqV6+eNm3apC1btthdToAxRkePHlVsbKxcLpfd5VR7brdbjRo1qtS2IGTZqGi4YIQkn621AAAAhCOPx6PmzZs7asig1+vV559/rosuukhRUVF2l1PteTyeSu9RJGTZ6PiJL4whZAEAAJSH2+1WjP+/1w4QERGhgoICxcTEELKqKcap2ej474K8PPvqAAAAABA6hCwbHR+yjh61rw4AAAAAoUPIslFUlOR2W/P2HztmczEAAAAAQoKQZSOXq6g3i5AFAAAAVA2ELJv5J79guCAAAABQNRCybObvyWLiCwAAAKBqIGTZrKgnixPVAQAAAFUBIctm0dHWJcdkAQAAAFUDIctmMTHMLggAAABUJYQsmzHxBQAAAFC1ELJsxhTuAAAAQNVCyLIZIQsAAACoWghZNisKWcwuCAAAAFQFhCyb0ZMFAAAAVC2ELJvFxlqzCzLxBQAAAFA1ELJsRk8WAAAAULUQsmxGyAIAAACqFkKWzQhZAAAAQNVCyLKZP2QdPcrsggAAAEBVQMiyWWysdUlPFgAAAFA1ELJsFhNjzS5IyAIAAACqBkKWzTgmCwAAAKhaCFk2I2QBAAAAVQshy2b+Y7I4GTEAAABQNRCybFbUk8XsggAAAEBVQMiyGcMFAQAAgKqFkGWz2FhmFwQAAACqEkKWzaKjrUtCFgAAAFA1ELJsxsQXAAAAQNVCyLIZx2QBAAAAVQshy2b+kFVY6JLXa28tAAAAAM4cIctm/uGCEr1ZAAAAQFVAyLKZf+ILiZAFAAAAVAWELJu53VJUVKEkJr8AAAAAqgJClgNERfkk0ZMFAAAAVAWELAfweOjJAgAAAKoKQpYD+EMWPVkAAABA+CNkOYDHw3BBAAAAoKogZDkAwwUBAACAqoOQ5QBMfAEAAABUHYQsB6AnCwAAAKg6CFkOwMQXAAAAQNVByHIAhgsCAAAAVQchywGioxkuCAAAAFQVhCwHoCcLAAAAqDoIWQ7AxBcAAABA1UHIcgAmvgAAAACqDkKWA/iHC9KTBQAAAIQ/QpYD0JMFAAAAVB2ELAfweOjJAgAAAKoKQpYDxMQUSJJyc20uBAAAAMAZI2Q5gD9kHTpkcyEAAAAAzhghywFiYwlZAAAAQFVByHKAuDgrZOXk2FwIAAAAgDNGyHIAerIAAACAqoOQ5QCELAAAAKDqIGQ5gD9kHT4sGWNzMQAAAADOCCHLAfzHZBnDNO4AAABAuCNkOYDHUyi32+rCYvILAAAAILwRshzA5ZJq1rSuc1wWAAAAEN4cEbImT56sjIwMxcTEqEuXLvrqq6/KtN8bb7whl8ul/v37V2yBlYCQBQAAAFQNtoes6dOnKzs7W2PGjNGKFSvUvn179e7dW7t37z7pfps3b9Zdd92lCy+8sJIqrVjx8dYlIQsAAAAIb7aHrAkTJmj48OEaNmyYWrVqpSlTpiguLk4vvfRSqfsUFhZq0KBBGjt2rM4666xKrLbiJCRwTBYAAABQFUTa+eD5+flavny5Ro8eHVjmdrvVo0cPLVmypNT9HnroIdWtW1c33HCDvvjii5M+Rl5envLy8gK3c/6XYrxer7xe7xk+gzPnr6FGDStk7d9fIK+XedydxN9GTni/oGS0UXignZyPNgoPtJPz0UbhoSLbx9aQtXfvXhUWFio1NTVoeWpqqr7//vsS91m4cKH+9a9/adWqVWV6jHHjxmns2LHFls+ePVtxcXGnXXNFOXp0l6T6+vLLNUpK2mx3OSjBnDlz7C4Bp0AbhQfayfloo/BAOzkfbVR92RqyTtehQ4f0hz/8QS+88IJSUlLKtM/o0aOVnZ0duJ2Tk6P09HT16tVLCQkJFVVqmXm9Xs2ZM0dnnVVXX34pNW7cRv36tbK7LBzH30Y9e/ZUVFSU3eWgBLRReKCdnI82Cg+0k/PRRuHB6/Vq5syZFXLftoaslJQURUREaNeuXUHLd+3apbS0tGLbb9y4UZs3b9YVV1wRWObz+SRJkZGRWrdunZo2bRq0T3R0tKKjo4vdV1RUlKPe9ImJLklSbm6EoqIibK4GJXHaewbF0UbhgXZyPtooPNBOzkcbVV+2Tnzh8XjUsWNHzZ07N7DM5/Np7ty5yszMLLb9Oeeco9WrV2vVqlWBnyuvvFIXX3yxVq1apfT09MosP6SYXRAAAACoGmwfLpidna0hQ4aoU6dO6ty5syZOnKjc3FwNGzZMkjR48GA1aNBA48aNU0xMjNq0aRO0f2JioiQVWx5uOE8WAAAAUDXYHrIGDBigPXv26IEHHtDOnTvVoUMHzZo1KzAZxtatW+V22z7TfIUjZAEAAABVg+0hS5KysrKUlZVV4rr58+efdN+pU6eGviAbxMdb07YTsgAAAIDwVvW7iMKEf6JDTkYMAAAAhDdClkMwXBAAAACoGghZDkHIAgAAAKoGQpZDcEwWAAAAUDUQshzi+GOyjLG3FgAAAADlR8hyCP9wwYICKS/P3loAAAAAlB8hyyHi44uuM2QQAAAACF+ELIeIiJDi4qzrhCwAAAAgfBGyHMR/XBYhCwAAAAhfhCwH8R+XxQmJAQAAgPBFyHIQzpUFAAAAhD9CloMQsgAAAIDwR8hyEEIWAAAAEP4IWQ5y/AmJAQAAAIQnQpaD0JMFAAAAhD9CloMQsgAAAIDwR8hyEEIWAAAAEP4IWQ7CMVkAAABA+CNkOQg9WQAAAED4I2Q5CCELAAAACH+ELAeJi7Mujx61tw4AAAAA5UfIcpDYWOuSkAUAAACEL0KWg8TEWJeELAAAACB8EbIcxN+TdeyYvXUAAAAAKD9CloPQkwUAAACEP0KWg9CTBQAAAIQ/QpaDHN+TZYy9tQAAAAAoH0KWg/h7soyRvF57awEAAABQPoQsB/H3ZEkclwUAAACEK0KWg0RHSy6XdZ3jsgAAAIDwRMhyEJeLGQYBAACAcEfIchh/yKInCwAAAAhPhCyH8U9+QU8WAAAAEJ4IWQ7DcEEAAAAgvBGyHIYTEgMAAADhjZDlMPRkAQAAAOGNkOUw9GQBAAAA4Y2Q5TD0ZAEAAADhjZDlMPRkAQAAAOGNkOUw9GQBAAAA4Y2Q5TD0ZAEAAADhjZDlMJyMGAAAAAhvhCyH8Q8XpCcLAAAACE+ELIehJwsAAAAIb4Qsh2HiCwAAACC8EbIchokvAAAAgPBGyHIYerIAAACA8EbIchh6sgAAAIDwRshyGHqyAAAAgPBGyHIYerIAAACA8EbIchh6sgAAAIDwRshyGHqyAAAAgPBGyHIYTkYMAAAAhDdClsP4hwvSkwUAAACEJ0KWw9CTBQAAAIQ3QpbD0JMFAAAAhDdClsMc35NljL21AAAAADh9hCyH8fdkGSPl59tbCwAAAIDTR8hyGH9PlsSQQQAAACAcEbIcxuORXC7rOpNfAAAAAOGHkOUwLheTXwAAAADhjJDlQP6QRU8WAAAAEH4IWQ7kPy6LniwAAAAg/BCyHIgTEgMAAADhi5DlQByTBQAAAIQvQpYD0ZMFAAAAhC9ClgPRkwUAAACEL0KWA9GTBQAAAIQvQpYDMYU7AAAAEL4IWQ7EFO4AAABA+CJkORA9WQAAAED4ImQ5ED1ZAAAAQPgiZDkQPVkAAABA+CJkORA9WQAAAED4ckTImjx5sjIyMhQTE6MuXbroq6++KnXbd999V506dVJiYqJq1KihDh066NVXX63EaiseU7gDAAAA4cv2kDV9+nRlZ2drzJgxWrFihdq3b6/evXtr9+7dJW6fnJysv/71r1qyZIm++eYbDRs2TMOGDdMnn3xSyZVXHE5GDAAAAIQv20PWhAkTNHz4cA0bNkytWrXSlClTFBcXp5deeqnE7bt3766rr75aLVu2VNOmTXXbbbepXbt2WrhwYSVXXnHoyQIAAADCV6SdD56fn6/ly5dr9OjRgWVut1s9evTQkiVLTrm/MUafffaZ1q1bp0cffbTEbfLy8pSXlxe4nZOTI0nyer3yer1n+AzOnL+G42uJinJJitSRIz55vYU2VQa/ktoIzkIbhQfayfloo/BAOzkfbRQeKrJ9bA1Ze/fuVWFhoVJTU4OWp6am6vvvvy91v4MHD6pBgwbKy8tTRESEnn32WfXs2bPEbceNG6exY8cWWz579mzFxcWd2RMIoTlz5gSur1vXUFJH/fTTXn300anDJirH8W0EZ6KNwgPt5Hy0UXignZyPNqq+bA1Z5VWzZk2tWrVKhw8f1ty5c5Wdna2zzjpL3bt3L7bt6NGjlZ2dHbidk5Oj9PR09erVSwkJCZVYdcm8Xq/mzJmjnj17KioqSpJ09KhLkhQfn6J+/frZWR5UchvBWWij8EA7OR9tFB5oJ+ejjcKD1+vVzJkzK+S+bQ1ZKSkpioiI0K5du4KW79q1S2lpaaXu53a71axZM0lShw4dtHbtWo0bN67EkBUdHa3o6Ohiy6Oiohz1pj++npo1rWV5eW5FRdl+2Bz+x2nvGRRHG4UH2sn5aKPwQDs5H21Ufdn6F7zH41HHjh01d+7cwDKfz6e5c+cqMzOzzPfj8/mCjrsKd5yMGAAAAAhftg8XzM7O1pAhQ9SpUyd17txZEydOVG5uroYNGyZJGjx4sBo0aKBx48ZJso6x6tSpk5o2baq8vDx99NFHevXVV/Xcc8/Z+TRCipMRAwAAAOHL9pA1YMAA7dmzRw888IB27typDh06aNasWYHJMLZu3Sq3u6jDLTc3V7feeqt+/vlnxcbG6pxzztF//vMfDRgwwK6nEHL0ZAEAAADhy/aQJUlZWVnKysoqcd38+fODbv/tb3/T3/72t0qoyj70ZAEAAADhi1kVHIiTEQMAAADhi5DlQP7hgseOScbYWwsAAACA00PIciB/T5YxUn6+vbUAAAAAOD2ELAfy92RJHJcFAAAAhBtClgN5PJLLZV3nuCwAAAAgvBCyHMjlYhp3AAAAIFwRshyKadwBAACA8ETIcih6sgAAAIDwRMhyKHqyAAAAgPBEyHIoerIAAACA8ETIcih6sgAAAIDwRMhyKH/IoicLAAAACC+ELIfyDxekJwsAAAAIL4Qsh6InCwAAAAhPhCyHoicLAAAACE+ELIeiJwsAAAAIT4Qsh2IKdwAAACA8EbIciincAQAAgPBEyHIoerIAAACA8ETIcih6sgAAAIDwRMhyKHqyAAAAgPBEyHIoerIAAACA8ETIciimcAcAAADCEyHLoTgZMQAAABCeCFkORU8WAAAAEJ4IWQ5FTxYAAAAQnghZDkVPFgAAABCeCFkOxRTuAAAAQHgiZDkUU7gDAAAA4YmQ5VD0ZAEAAADhiZDlUPRkAQAAAOGpXCHrlVde0Ycffhi4/ec//1mJiYm64IILtGXLlpAVV50d35NljL21AAAAACi7coWsRx55RLH/62pZsmSJJk+erMcee0wpKSm64447QlpgdeXvyZKk/Hz76gAAAABweiLLs9NPP/2kZs2aSZJmzJiha665RjfddJO6du2q7t27h7K+auv4kHX0qBQdbV8tAAAAAMquXD1Z8fHx2rdvnyRp9uzZ6tmzpyQpJiZGR5mpISSioiSXy7rOcVkAAABA+ChXT1bPnj1144036txzz9UPP/ygfv36SZLWrFmjjIyMUNZXbblcVm/WkSPMMAgAAACEk3L1ZE2ePFmZmZnas2eP3nnnHdWuXVuStHz5cl1//fUhLbA6809+QU8WAAAAED7K1ZOVmJioZ555ptjysWPHnnFBKOI/LoueLAAAACB8lKsna9asWVq4cGHg9uTJk9WhQwcNHDhQ+/fvD1lx1R09WQAAAED4KVfIuvvuu5WTkyNJWr16te68807169dPmzZtUnZ2dkgLrM7oyQIAAADCT7mGC27atEmtWrWSJL3zzju6/PLL9cgjj2jFihWBSTBw5o4/ITEAAACA8FCuniyPx6MjR45Ikj799FP16tVLkpScnBzo4cKZ8/dkMVwQAAAACB/l6sn69a9/rezsbHXt2lVfffWVpk+fLkn64Ycf1LBhw5AWWJ3RkwUAAACEn3L1ZD3zzDOKjIzU22+/reeee04NGjSQJH388cfq06dPSAuszujJAgAAAMJPuXqyGjVqpA8++KDY8n/84x9nXBCKMPEFAAAAEH7KFbIkqbCwUDNmzNDatWslSa1bt9aVV16piIiIkBVX3TGFOwAAABB+yhWyNmzYoH79+mnbtm1q0aKFJGncuHFKT0/Xhx9+qKZNm4a0yOqKniwAAAAg/JTrmKxRo0apadOm+umnn7RixQqtWLFCW7duVZMmTTRq1KhQ11ht0ZMFAAAAhJ9y9WQtWLBAX375pZKTkwPLateurfHjx6tr164hK666oycLAAAACD/l6smKjo7WoUOHii0/fPiwPB7PGRcFCz1ZAAAAQPgpV8i6/PLLddNNN2np0qUyxsgYoy+//FK33HKLrrzyylDXWG3RkwUAAACEn3KFrKefflpNmzZVZmamYmJiFBMTowsuuEDNmjXTxIkTQ1xi9cXJiAEAAIDwU65jshITEzVz5kxt2LAhMIV7y5Yt1axZs5AWV91xMmIAAAAg/JQ5ZGVnZ590/bx58wLXJ0yYUP6KEEBPFgAAABB+yhyyVq5cWabtXC5XuYtBMHqyAAAAgPBT5pB1fE8VKgcTXwAAAADhp1wTX6ByMIU7AAAAEH4IWQ5GTxYAAAAQfghZDkZPFgAAABB+CFkORk8WAAAAEH4IWQ5GTxYAAAAQfghZDnZ8T5Yx9tYCAAAAoGwIWQ4WF1d0nd4sAAAAIDwQshzM35MlSUeO2FcHAAAAgLIjZDlYZKTk8VjXCVkAAABAeCBkOZx/yCAhCwAAAAgPhCyH84cspnEHAAAAwgMhy+H8x2XRkwUAAACEB0KWwzFcEAAAAAgvhCyHI2QBAAAA4YWQ5XCELAAAACC8ELIcjpAFAAAAhBdClsMxuyAAAAAQXghZDsfsggAAAEB4IWQ5HMMFAQAAgPDiiJA1efJkZWRkKCYmRl26dNFXX31V6rYvvPCCLrzwQiUlJSkpKUk9evQ46fbhjpAFAAAAhBfbQ9b06dOVnZ2tMWPGaMWKFWrfvr169+6t3bt3l7j9/Pnzdf3112vevHlasmSJ0tPT1atXL23btq2SK68chCwAAAAgvNgesiZMmKDhw4dr2LBhatWqlaZMmaK4uDi99NJLJW4/bdo03XrrrerQoYPOOeccvfjii/L5fJo7d24lV145CFkAAABAeIm088Hz8/O1fPlyjR49OrDM7XarR48eWrJkSZnu48iRI/J6vUpOTi5xfV5envLy8gK3c3JyJEler1der/cMqg8Nfw2l1RId7ZYUodxcn7zewlLv59Ahafp0l6691qhWrYqotPo6VRvBfrRReKCdnI82Cg+0k/PRRuGhItvH1pC1d+9eFRYWKjU1NWh5amqqvv/++zLdxz333KP69eurR48eJa4fN26cxo4dW2z57NmzFefvJnKAOXPmlLh8w4bGkjpo06Zd+uij0o89e/LJjvrii4b64ou1GjDghwqqsnorrY3gHLRReKCdnI82Cg+0k/PRRtWXrSHrTI0fP15vvPGG5s+fr5iYmBK3GT16tLKzswO3c3JyAsdxJSQkVFappfJ6vZozZ4569uypqKioYuv373fpueekhIRU9evXr8T7+O47aeFCqyldrhbq169ZhdZc3ZyqjWA/2ig80E7ORxuFB9rJ+Wij8OD1ejVz5swKuW9bQ1ZKSooiIiK0a9euoOW7du1SWlraSfd94oknNH78eH366adq165dqdtFR0crOjq62PKoqChHvelLq8efA48edSsqquRD6B57TDLGur5zZ+nb4cw47T2D4mij8EA7OR9tFB5oJ+ejjaovW/8a93g86tixY9CkFf5JLDIzM0vd77HHHtPDDz+sWbNmqVOnTpVRqm1ONfHFunXSG28U3a6ikywCAAAAYcP2Lo/s7Gy98MILeuWVV7R27VqNGDFCubm5GjZsmCRp8ODBQRNjPProo7r//vv10ksvKSMjQzt37tTOnTt1+PBhu55ChTpVyJo0SfL5pNatrdvbt1dOXQAAAABKZnvIGjBggJ544gk98MAD6tChg1at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4Ai2hyxJysrKUlZWVonr5s+fX2zZtddeq2uvvbaCqwIAAACA02frMVkAAAAAUNUQsgAAAAAghAhZAAAAABBChCwAAAAACCFCFgAAAACEECELAAAAAEKIkAUAAAAAIUTIAgAAAIAQImQBAAAAQAgRsgAAAAAghAhZAAAAABBChCwAAAAACCFCFgAAAACEUKTdBVQ2Y4wkKScnx+ZKLF6vV0eOHFFOTo6ioqLsLgcloI2cjzYKD7ST89FG4YF2cj7aKDz420kqygihUu1C1qFDhyRJ6enpNlcCAAAAwAkOHTqkWrVqhez+XCbUsc3hfD6ftm/frpo1a8rlctldjnJycpSenq6ffvpJCQkJdpeDEtBGzkcbhQfayfloo/BAOzkfbRQe/O303XffqUWLFnK7Q3ckVbXryXK73WrYsKHdZRSTkJDAh9DhaCPno43CA+3kfLRReKCdnI82Cg8NGjQIacCSmPgCAAAAAEKKkAUAAAAAIUTIsll0dLTGjBmj6Ohou0tBKWgj56ONwgPt5Hy0UXignZyPNgoPFdlO1W7iCwAAAACoSPRkAQAAAEAIEbIAAAAAIIQIWQAAAAAQQoQsAAAAAAghQpaNJk+erIyMDMXExKhLly766quv7C6p2nrwwQflcrmCfs4555zA+mPHjmnkyJGqXbu24uPjdc0112jXrl02Vlw9fP7557riiitUv359uVwuzZgxI2i9MUYPPPCA6tWrp9jYWPXo0UPr168P2uaXX37RoEGDlJCQoMTERN1www06fPhwJT6Lqu1UbTR06NBin60+ffoEbUMbVaxx48bp/PPPV82aNVW3bl31799f69atC9qmLN9xW7du1WWXXaa4uDjVrVtXd999twoKCirzqVRpZWmn7t27F/s83XLLLUHb0E4V57nnnlO7du0CJxjOzMzUxx9/HFjP58gZTtVOlfU5ImTZZPr06crOztaYMWO0YsUKtW/fXr1799bu3bvtLq3aat26tXbs2BH4WbhwYWDdHXfcof/+97966623tGDBAm3fvl2/+c1vbKy2esjNzVX79u01efLkEtc/9thjevrppzVlyhQtXbpUNWrUUO/evXXs2LHANoMGDdKaNWs0Z84cffDBB/r888910003VdZTqPJO1UaS1KdPn6DP1uuvvx60njaqWAsWLNDIkSP15Zdfas6cOfJ6verVq5dyc3MD25zqO66wsFCXXXaZ8vPztXjxYr3yyiuaOnWqHnjgATueUpVUlnaSpOHDhwd9nh577LHAOtqpYjVs2FDjx4/X8uXLtWzZMl1yySW66qqrtGbNGkl8jpziVO0kVdLnyMAWnTt3NiNHjgzcLiwsNPXr1zfjxo2zsarqa8yYMaZ9+/Ylrjtw4ICJiooyb731VmDZ2rVrjSSzZMmSSqoQksx7770XuO3z+UxaWpp5/PHHA8sOHDhgoqOjzeuvv26MMea7774zkszXX38d2Objjz82LpfLbNu2rdJqry5ObCNjjBkyZIi56qqrSt2HNqp8u3fvNpLMggULjDFl+4776KOPjNvtNjt37gxs89xzz5mEhASTl5dXuU+gmjixnYwxplu3bua2224rdR/aqfIlJSWZF198kc+Rw/nbyZjK+xzRk2WD/Px8LV++XD169Agsc7vd6tGjh5YsWWJjZdXb+vXrVb9+fZ111lkaNGiQtm7dKklavny5vF5vUHudc845atSoEe1lo02bNmnnzp1B7VKrVi116dIl0C5LlixRYmKiOnXqFNimR48ecrvdWrp0aaXXXF3Nnz9fdevWVYsWLTRixAjt27cvsI42qnwHDx6UJCUnJ0sq23fckiVL1LZtW6Wmpga26d27t3JycoL+O4zQObGd/KZNm6aUlBS1adNGo0eP1pEjRwLraKfKU1hYqDfeeEO5ubnKzMzkc+RQJ7aTX2V8jiJD8xRwOvbu3avCwsKgxpOk1NRUff/99zZVVb116dJFU6dOVYsWLbRjxw6NHTtWF154ob799lvt3LlTHo9HiYmJQfukpqZq586d9hSMwGtf0ufIv27nzp2qW7du0PrIyEglJyfTdpWkT58++s1vfqMmTZpo48aN+stf/qK+fftqyZIlioiIoI0qmc/n0+23366uXbuqTZs2klSm77idO3eW+Fnzr0NoldROkjRw4EA1btxY9evX1zfffKN77rlH69at07vvviuJdqoMq1evVmZmpo4dO6b4+Hi99957atWqlVatWsXnyEFKayep8j5HhCxAUt++fQPX27Vrpy5duqhx48Z68803FRsba2NlQHj73e9+F7jetm1btWvXTk2bNtX8+fN16aWX2lhZ9TRy5Eh9++23QcecwnlKa6fjj1Vs27at6tWrp0svvVQbN25U06ZNK7vMaqlFixZatWqV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3eahhx4y69atMy+//LKJjY01L7/8cuB5NG7c2CQnJ5vJkyeb9evXm3Hjxhm3222+//77M29UAEBIEbIAAKelW7dupmXLlsbn8wWW3XPPPaZly5al7vP1118bSebQoUPGGFMsZBhjTE5OjomOjg6EqhP5g86LL74YWLZmzRojyaxdu7bUxz4+ZPnvY+XKlUHbNG3a1Lz22mtByx5++GGTmZkZtN/EiRNLfRy/yy67zNx5552B2926dTO33XZb0DYnPv+BAweanj17Bm1z9913m1atWgVuN27c2Pz+978P3Pb5fKZu3brmueeeO2VNAIDKxXBBAMBp+9WvfiWXyxW4nZmZqfXr16uwsFCStHz5cl1xxRVq1KiRatasqW7dukmStm7dWup9rl27Vnl5ebr00ktP+tjt2rULXK9Xr54kBYYilkdubq42btyoG264QfHx8YGfv/3tb9q4cWPQtp06dQq6XVhYqIcfflht27ZVcnKy4uPj9cknn5z0eZZk7dq16tq1a9Cyrl27Br2mUvBzd7lcSktLO6PnDgCoGEx8AQAIqdzcXPXu3Vu9e/fWtGnTVKdOHW3dulW9e/dWfn5+qfvFxsaW6f6Pn2zCH/R8Pl+56z18+LAk6YUXXlCXLl2C1kVERATdrlGjRtDtxx9/XE899ZQmTpyotm3bqkaNGrr99ttP+jzPxIkTbbhcrjN67gCAikHIAgCctqVLlwbd/vLLL9W8eXNFRETo+++/1759+zR+/Hilp6dLkpYtWxa0vcfjkaSgXprmzZsrNjZWc+fO1Y033lghdZf0uKmpqapfv75+/PFHDRo06LTub9GiRbrqqqv0+9//XpIV9n744Qe1atUq6DGPf7yStGzZUosWLSp232effXaxoAcAcD5CFgDgtG3dulXZ2dm6+eabtWLFCk2aNCkwG16jRo3k8Xg0adIk3XLLLfr222/18MMPB+3fuHFjuVwuffDBB+rXr59iY2MVHx+ve+65R3/+85/l8XjUtWtX7dmzR2vWrNENN9wQkrrr1q2r2NhYzZo1Sw0bNlRMTIxq1aqlsWPHatSoUapVq5b69OmjvLw8LVu2TPv371d2dnap99e8eXO9/fbbWrx4sZKSkjRhwgTt2rUrKGRlZGRo6dKl2rx5s+Lj45WcnFzsfu68806df/75evjhhzVgwAAtWbJEzzzzTNAMhwCA8MExWQCA0zZ48GAdPXpUnTt31siRI3XbbbfppptukiTVqVNHU6dO1VtvvaVWrVpp/PjxeuKJJ4L2b9CggcaOHat7771XqampysrKkiTdf//9uvPOO/XAAw+oZcuWGjBgQEiPOYqMjNTTTz+tf/7zn6pfv76uuuoqSdKNN96oF198US+//LLatm2rbt26aerUqYEp30tz33336bzzzlPv3r3VvXt3paWlqX///kHb3HXXXYqIiFCrVq0CQydPdN555+nNN9/UG2+8oTZt2uiBBx7QQw89FJjaHgAQXlzGHHdiEwAAAADAGaEnCwAAAABCiJAFAAAAACFEyAIAAACAECJkAQAAAEAIEbIAAAAAIIQIWQAAAAAQQoQsAAAAAAghQhYAAAAAhBAhCwAAAABCiJAFAAAAACFEyAIAAACAEPp/rV31pteVRjkAAAAASUVORK5CYII=",
30
+ "text/plain": [
31
+ "<Figure size 1000x600 with 1 Axes>"
32
+ ]
33
+ },
34
+ "metadata": {},
35
+ "output_type": "display_data"
36
+ }
37
+ ],
38
+ "source": [
39
+ "# plot the loss curves\n",
40
+ "batch_losses = np.lib.format.open_memmap(\"batch_losses.npy\", dtype=np.float32, mode=\"r\")\n",
41
+ "print(batch_losses.shape)\n",
42
+ "last_batch_loss_idx = np.lib.format.open_memmap(\"last_batch_loss_idx.npy\", dtype=np.float32, mode=\"r\")\n",
43
+ "plt.figure(figsize=(10, 6))\n",
44
+ "plt.plot(batch_losses[:last_batch_loss_idx[...]+1], label=\"training Loss\", color=\"blue\")\n",
45
+ "plt.xlabel(\"batch iteration\")\n",
46
+ "plt.ylabel(\"loss\")\n",
47
+ "plt.title(\"training loss curve\")\n",
48
+ "plt.legend()\n",
49
+ "plt.grid(True)\n",
50
+ "plt.show()"
51
+ ]
52
+ },
53
+ {
54
+ "cell_type": "code",
55
+ "execution_count": 4,
56
+ "id": "38bfe104",
57
+ "metadata": {},
58
+ "outputs": [
59
+ {
60
+ "data": {
61
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1kAAAIjCAYAAADxz9EgAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAYE1JREFUeJzt3XlcVXX+x/H3ZRcRNwREcUlNrVzKLdTUxgW1jRYz6zeuaWWkE6WNTWpOM1lNOVY6ma02ZS4ttjkmWVopZm7TlLtpmAq4k6CI3PP743SvXgEFPHDuvbyej8d9cDj3e8/5HPp64833e77XYRiGIQAAAACAJQLsLgAAAAAA/AkhCwAAAAAsRMgCAAAAAAsRsgAAAADAQoQsAAAAALAQIQsAAAAALETIAgAAAAALEbIAAAAAwEKELAAAAACwECELAFCsN998Uw6HQ7t373bv69Gjh3r06HHB1y5fvlwOh0PLly+3tCaHw6HHH3/c0mOWxOOPPy6Hw1Hh5wUA+B5CFgDA6yxevNiWIAUAgBWC7C4AAOBbli5dWu7nWLx4sWbOnFlk0Dpx4oSCgvjfFwDAezGSBQAolZCQEIWEhNh2/rCwMEJWBcrJybG7BADwOYQsAPAT7733nhwOh1asWFHouZdfflkOh0M//vijJOmHH37Q0KFDdckllygsLEyxsbEaPny4Dh06dMHzFHVP1q+//qqkpCRVrVpV0dHRevDBB5WXl1fotd98840GDBigBg0aKDQ0VPHx8XrwwQd14sQJd5uhQ4dq5syZksz7r1wPl6LuydqwYYP69eunyMhIRUREqGfPnlq9erVHG9f9ZStXrlRKSorq1KmjqlWr6uabb9aBAwcueN1FOX36tJ544gk1adJEoaGhatSokR599NFC17527VolJiYqKipKVapUUePGjTV8+HCPNvPmzVO7du1UrVo1RUZGqlWrVnr++ecvWIPT6dTzzz+vVq1aKSwsTHXq1FHfvn21du1aSdLu3bvlcDj05ptvFnrtuT9L131nmzZt0p133qmaNWuqa9euevbZZ+VwOPTLL78UOsaECRMUEhKiI0eOuPd999136tu3r6pXr67w8HB1795dK1euvOC1AIC/4E+BAOAnrrvuOkVERGjBggXq3r27x3Pz58/X5ZdfriuuuEKSlJqaqp9//lnDhg1TbGysfvrpJ82ePVs//fSTVq9eXaoFHk6cOKGePXsqPT1dY8aMUVxcnP7973/ryy+/LNR24cKFys3N1X333afatWtrzZo1evHFF/Xrr79q4cKFkqR77rlH+/btU2pqqv79739f8Pw//fSTrrnmGkVGRmr8+PEKDg7Wyy+/rB49emjFihXq1KmTR/sHHnhANWvW1OTJk7V7925Nnz5dycnJmj9/fomv2eXuu+/WnDlzdNttt+mhhx7Sd999p6lTp2rz5s368MMPJUlZWVnq06eP6tSpoz//+c+qUaOGdu/erQ8++MB9nNTUVA0aNEg9e/bU008/LUnavHmzVq5cqbFjx563hhEjRujNN99Uv379dPfdd+v06dP65ptvtHr1arVv377U1yRJAwYMULNmzfTkk0/KMAxdf/31Gj9+vBYsWKBx48Z5tF2wYIH69OmjmjVrSpK+/PJL9evXT+3atdPkyZMVEBCgN954Q3/4wx/0zTffqGPHjmWqCQB8igEA8BuDBg0yoqOjjdOnT7v37d+/3wgICDD++te/uvfl5uYWeu27775rSDK+/vpr97433njDkGTs2rXLva979+5G9+7d3d9Pnz7dkGQsWLDAvS8nJ8do2rSpIcn46quvznveqVOnGg6Hw/jll1/c++6//36juP9FSTImT57s/j4pKckICQkxdu7c6d63b98+o1q1aka3bt0KXUuvXr0Mp9Pp3v/ggw8agYGBxtGjR4s8n8vkyZM9atq4caMhybj77rs92j388MOGJOPLL780DMMwPvzwQ0OS8f333xd77LFjxxqRkZEe/91K4ssvvzQkGWPGjCn0nOsad+3aZUgy3njjjUJtzv1Zuq5x0KBBhdomJCQY7dq189i3Zs0aQ5Lx1ltvuc/ZrFkzIzEx0eNnnJubazRu3Njo3bt3qa4PAHwV0wUBwI8MHDhQWVlZHsumv/fee3I6nRo4cKB7X5UqVdzbJ0+e1MGDB3X11VdLktavX1+qcy5evFh169bVbbfd5t4XHh6uUaNGFWp79nlzcnJ08OBBde7cWYZhaMOGDaU6ryQVFBRo6dKlSkpK0iWXXOLeX7duXd1555369ttvlZ2d7fGaUaNGeYzUXXPNNSooKChyKtz5LF68WJKUkpLisf+hhx6SJH322WeSpBo1akiSPv30U+Xn5xd5rBo1aignJ0epqamlquH999+Xw+HQ5MmTCz13McvN33vvvYX2DRw4UOvWrdPOnTvd++bPn6/Q0FDddNNNkqSNGzdq+/btuvPOO3Xo0CEdPHhQBw8eVE5Ojnr27Kmvv/5aTqezzHUBgK8gZAGAH3HdB3P21Lf58+erbdu2uvTSS937Dh8+rLFjxyomJkZVqlRRnTp11LhxY0nSsWPHSnXOX375RU2bNi30S33z5s0LtU1PT9fQoUNVq1YtRUREqE6dOu6pjaU9ryQdOHBAubm5RZ6rZcuWcjqd2rNnj8f+Bg0aeHzvmuZ29j1FJfHLL78oICBATZs29dgfGxurGjVquENb9+7ddeutt2rKlCmKiorSTTfdpDfeeMPjvq3Ro0fr0ksvVb9+/VS/fn0NHz5cS5YsuWANO3fuVFxcnGrVqlWq2i/E1RfONmDAAAUEBLj7lmEYWrhwofteOEnavn27JGnIkCGqU6eOx+PVV19VXl5emf47A4Cv4Z4sAPAjoaGhSkpK0ocffqh//etfyszM1MqVK/Xkk096tLv99tu1atUqjRs3Tm3btlVERIScTqf69u1bbiMNBQUF6t27tw4fPqxHHnlELVq0UNWqVbV3714NHTq0wkY4AgMDi9xvGEaZjnehESOHw6H33ntPq1ev1ieffKLPP/9cw4cP13PPPafVq1crIiJC0dHR2rhxoz7//HP95z//0X/+8x+98cYbGjx4sObMmVOmui5UX0FBQbGvOXvE0SUuLk7XXHONFixYoEcffVSrV69Wenq6+x4ySe7/hv/4xz/Utm3bIo8dERFRiuoBwDcRsgDAzwwcOFBz5szRsmXLtHnzZhmG4TFV8MiRI1q2bJmmTJmiSZMmufe7RiFKq2HDhvrxxx9lGIbHL/Rbt271aPe///1P27Zt05w5czR48GD3/qKmyJV0qludOnUUHh5e6FyStGXLFgUEBCg+Pr6kl1IqDRs2lNPp1Pbt29WyZUv3/szMTB09elQNGzb0aH/11Vfr6quv1t///nfNnTtXd911l+bNm6e7775bkrk0/g033KAbbrhBTqdTo0eP1ssvv6yJEycWGi1zadKkiT7//HMdPny42NEs10jd0aNHPfaXdnqkZPat0aNHa+vWrZo/f77Cw8N1ww03eNQjSZGRkerVq1epjw8A/oLpggDgZ3r16qVatWpp/vz5mj9/vjp27Ogx/cs1knPuyM306dPLdL7+/ftr3759eu+999z7cnNzNXv2bI92RZ3XMIwilymvWrWqpMLB4FyBgYHq06ePPvroI+3evdu9PzMzU3PnzlXXrl3dU9ms1r9/f0mFf27Tpk2TZK72KJmh9tyftWuUxzVl8Nyl8wMCAtS6dWuPNkW59dZbZRiGpkyZUug51zkjIyMVFRWlr7/+2uP5f/3rX8Ue93znCwwM1LvvvquFCxfq+uuvd/+3kqR27dqpSZMmevbZZ3X8+PFCry/rUvkA4GsYyQIAPxMcHKxbbrlF8+bNU05Ojp599lmP5yMjI9WtWzc988wzys/PV7169bR06VLt2rWrTOcbOXKkZsyYocGDB2vdunWqW7eu/v3vfys8PNyjXYsWLdSkSRM9/PDD2rt3ryIjI/X+++8XeS9Uu3btJEljxoxRYmKiAgMDdccddxR5/r/97W9KTU1V165dNXr0aAUFBenll19WXl6ennnmmTJdU0m0adNGQ4YM0ezZs3X06FF1795da9as0Zw5c5SUlKRrr71WkjRnzhz961//0s0336wmTZrot99+0yuvvKLIyEh3ULv77rt1+PBh/eEPf1D9+vX1yy+/6MUXX1Tbtm09RsnOde211+qPf/yjXnjhBW3fvt093fObb77Rtddeq+TkZPfxn3rqKd19991q3769vv76a23btq3U1xwdHa1rr71W06ZN02+//eYxQiqZ4fDVV19Vv379dPnll2vYsGGqV6+e9u7dq6+++kqRkZH65JNPSn1eAPA5Nq1qCAAoR6mpqYYkw+FwGHv27Cn0/K+//mrcfPPNRo0aNYzq1asbAwYMMPbt21doSe+SLOFuGIbxyy+/GDfeeKMRHh5uREVFGWPHjjWWLFlSaAn3TZs2Gb169TIiIiKMqKgoY+TIkcZ///vfQkuMnz592njggQeMOnXqGA6Hw2Pp9HNrNAzDWL9+vZGYmGhEREQY4eHhxrXXXmusWrXKo43rWs5dSv2rr74qVGdRzl3C3TAMIz8/35gyZYrRuHFjIzg42IiPjzcmTJhgnDx50qO2QYMGGQ0aNDBCQ0ON6Oho4/rrrzfWrl3rbvPee+8Zffr0MaKjo42QkBCjQYMGxj333GPs37//vDW5flb/+Mc/jBYtWhghISFGnTp1jH79+hnr1q1zt8nNzTVGjBhhVK9e3ahWrZpx++23G1lZWcUu4X7gwIFiz/fKK68Ykoxq1aoZJ06cKLLNhg0bjFtuucWoXbu2ERoaajRs2NC4/fbbjWXLll3wegDAHzgMo4x3+gIAAAAACuGeLAAAAACwECELAAAAACxEyAIAAAAACxGyAAAAAMBChCwAAAAAsBAhCwAAAAAsxIcRF8HpdGrfvn2qVq2aHA6H3eUAAAAAsIlhGPrtt98UFxengICSjVERsoqwb98+xcfH210GAAAAAC+xZ88e1a9fv0RtCVlFqFatmiTzBxkZGWlrLfn5+Vq6dKn69Omj4OBgW2uBb6MvwSr0JViFvgQr0I9gleL6UnZ2tuLj490ZoSQIWUVwTRGMjIz0ipAVHh6uyMhI3jhwUehLsAp9CVahL8EK9CNY5UJ9qTS3EbHwBQAAAABYiJAFAAAAABYiZAEAAACAhbgnCwAAAD7HMAydPn1aeXl5CgoK0smTJ1VQUGB3WfBBgYGBCgqyNhYRsgAAAOBTTp06pf379ys3N1eGYSg2NlZ79uzh801RZuHh4apTp45lxyNkAQAAwGc4nU7t2rVLgYGBiouLU1BQkHJychQREVHiD4oFXAzD0KlTp3TgwAGlp6dbdlxCFgAAAHzGqVOn5HQ6FR8fr/DwcDmdTuXn5yssLIyQhTKpUqWKgoODtXv3bgUGBlpyTHoiAAAAfA6BClZy9SerppzSOwEAAADAQoQsAAAAALAQIQsAAADwEY0aNdL06dPd3zscDi1atKjY9rt375bD4dDGjRsv6rxWHedChg4dqqSkpHI9R0Vg4QsAAADAR+3fv181a9a09JhDhw7V0aNHPcJbfHy89u/fr6ioKEvP5a8IWQAAAICPio2NrZDzBAYGVti5/AHTBQEAAODbDEPKybHnYRglKnH27NmKi4uT0+n02H/TTTdp+PDhkqSdO3fqpptuUkxMjCIiItShQwd98cUX5z3uudMF16xZoyuvvFJhYWFq3769NmzY4NG+oKBAI0aMUOPGjVWlShU1b95czz//vPv5xx9/XHPmzNFHH30kh8Mhh8Oh5cuXFzldcMWKFerYsaNCQ0NVt25d/fnPf9bp06fdz/fo0UNjxozR+PHjVatWLcXGxurxxx8v0c/LJS8vT2PGjFF0dLTCwsLUtWtXff/99+7njxw5orvuukt16tRRlSpV1KxZM73xxhuSzOX+k5OTVbduXYWFhalhw4aaOnVqqc5fVoxkAQAAwLfl5iqgfn17zn38uFS16gWbDRgwQA888IC++uor9ezZU5J0+PBhLVmyRIsXL/79UMfVv39//f3vf1doaKjeeust3XDDDdq6dasaNGhQglKO6/rrr1fv3r319ttva9euXRo7dqxHG6fTqfr162vhwoWqXbu2Vq1apVGjRqlu3bq6/fbb9fDDD2vz5s3Kzs52h5VatWpp3759HsfZu3ev+vfvr6FDh+qtt97Sli1bNHLkSIWFhXkEqTlz5iglJUXfffed0tLSNHToUHXp0kW9e/e+4PVI0vjx4/X+++9rzpw5atiwoZ555hklJiZqx44dqlWrliZOnKhNmzbpP//5j6KiorRjxw6dOHFCkvTCCy/o448/1oIFC9SgQQPt2bNHe/bsKdF5LxYhCwAAAChnNWvWVL9+/TR37lx3yHrvvfcUFRWla6+9VpLUpk0btWnTxv2aJ554Qh9++KE+/vhjJScnX/Acc+fOldPp1GuvvaawsDBdfvnl+vXXX3Xfffe52wQHB2vKlCnu7xs3bqy0tDQtWLBAt99+uyIiIlSlShXl5eWdd3rgv/71L8XHx2vGjBlyOBxq0aKF9u3bp0ceeUSTJk1yf+5U69atNXnyZElSs2bNNGPGDC1btqxEISsnJ0cvvfSS3nzzTfXr10+S9Morryg1NVWvvfaaxo0bp/T0dF155ZVq3769JHNhEJf09HQ1a9ZMXbt2lcPhUMOGDS94TqswXdDLOdLSVG/FCikz0+5SAAAAvFN4uJzZ2eaoUkU/wsNLXOZdd92l999/X3l5eZKkd955R3fccYc7kBw/flwPP/ywWrZsqRo1aigiIkKbN29Wenp6iY6/efNmtW7dWmFhYe59CQkJhdrNnDlT7dq1U506dRQREaHZs2eX+BxnnyshIcHjw3u7dOmi48eP69dff3Xva926tcfr6tatq6ysrBKdY+fOncrPz1eXLl3c+4KDg9WxY0dt3rxZknTfffdp3rx5atu2rcaPH69Vq1a52w4dOlQbN25U8+bNNWbMGC1durRU13gxCFleLvCBB9T+n/+Uo5yXywQAAPBZDoc5Zc+Ox1kh40JuuOEGGYahzz77THv27NE333yju+66y/38ww8/rA8//FBPPvmkvvnmG23cuFGtWrXSqVOnLPtRzZs3Tw8//LBGjBihpUuXauPGjRo2bJil5zhbcHCwx/cOh6PQfWkXo1+/fvrll1/04IMPat++ferZs6cefvhhSdJVV12lXbt26YknntCJEyd0++2367bbbrPs3OdDyPJyhmuYlpEsAAAAnxYWFqZbbrlF77zzjt599101b95cV111lfv5lStXaujQobr55pvVqlUrxcbGavfu3SU+fsuWLfXDDz/o5MmT7n2rV6/2aLNy5Up17txZo0eP1pVXXqmmTZtq586dHm1CQkJUUFBwwXOlpaXJOGvhj5UrV6patWqqb9H9cU2aNFFISIhWrlzp3pefn6/vv/9el112mXtfnTp1NGTIEL399tuaPn26Zs+e7X4uMjJSAwcO1CuvvKL58+fr/fff1+HDhy2p73wIWd4uJkaS5Ni/3+ZCAAAAcLHuuusuffbZZ3r99dc9RrEk856lDz74QBs3btR///tf3XnnnaUa9bnzzjvlcDg0cuRIbdq0SYsXL9azzz5b6Bxr167V559/rm3btmnixIkeq/VJ5n1NP/zwg7Zu3aqDBw8qPz+/0LlGjx6tPXv26IEHHtCWLVv00UcfafLkyUpJSXFPf7xYVatW1X333adx48ZpyZIl2rRpk0aOHKnc3FyNGDFCkjRp0iR99NFH2rFjh3766Sd9+umnatmypSRp2rRpevfdd7VlyxZt27ZNCxcuVGxsrGrUqGFJfedDyPJyjGQBAAD4jz/84Q+qVauWtm7dqjvvvNPjuWnTpqlmzZrq3LmzbrjhBiUmJnqMdF1IRESEPvnkE/3vf//TlVdeqb/85S96+umnPdrcc889uuWWWzRw4EB16tRJhw4d0ujRoz3ajBw5Us2bN1f79u1Vp04dj5Ekl3r16mnx4sVas2aN2rRpo3vvvVcjRozQY489VoqfxoU99dRTuvXWW/XHP/5RV111lXbs2KHPP//c/QHMISEhmjBhglq3bq1u3bopMDBQ8+bNkyRVq1ZNzzzzjNq3b68OHTpo9+7dWrx4sWUh8HwchlHCxf0rkezsbFWvXl3Hjh1TZGSkrbUUTJumwIcekvO22xSwcKGttcC35efna/Hixerfv3+h+dFAadCXYBX6Esri5MmT2rVrlxo3bqywsDA5nU5lZ2crMjKyQn55hn86efKkfv75Z+3atUt9+vTxeE8qSzagJ3o54/fpgoxkAQAAAL6BkOXt6taVxD1ZAAAAgK8gZHk5RrIAAAAA30LI8na/L3zh+O03KSfH5mIAAAAAXAghy9tVq6bToaHmdkaGvbUAAAB4CdZug5Ws7k+ELG/ncCjPtZY/IQsAAFRyrlXfcnNzba4E/sTVny70IcwlFWTJUVCuTtasqaqZmYQsAABQ6QUGBqpGjRrKysqSJIWFhenUqVM6efIkS7ij1AzDUG5urrKyshQZGWnZiBYhywfk/f5ha2KFQQAAAMX+fs96VlaWDMPQiRMnVKVKFTkcDpsrg6+qUaOGateubdnxCFk+4KQrZDGSBQAAIIfDobp16yo6OlonTpzQihUr1K1bNz7UGmUSHByswMBA5efnW3ZMQpYP4J4sAACAwgIDAxUaGqrTp08rLCyMkAWvwcRVH3CS6YIAAACAzyBk+YA8pgsCAAAAPoOQ5QNOMl0QAAAA8BmELB+QV6uWuZGZKVm0dj8AAACA8kHI8gF5kZEyHA4zYB06ZHc5AAAAAM6DkOUDjKAgKSrK/IYpgwAAAIBXI2T5ipgY8ysrDAIAAABejZDlI4y6dc0NRrIAAAAAr0bI8hWukSxCFgAAAODVCFk+wmC6IAAAAOATCFm+gumCAAAAgE8gZPkIg+mCAAAAgE8gZPmK2FjzK9MFAQAAAK9GyPIRhitkMZIFAAAAeDVClq9whazsbCk3195aAAAAABSLkOUrIiOlsDBzm9EsAAAAwGsRsnyFw8EKgwAAAIAPIGT5Eu7LAgAAALweIcuXELIAAAAAr0fI8iWu6YIs4w4AAAB4LUKWL2EkCwAAAPB6hCxfQsgCAAAAvB4hy5cwXRAAAADweoQsX8JIFgAAAOD1CFm+xBWyMjMlp9PeWgAAAAAUiZDlS2JizK+nT0uHDtlbCwAAAIAiEbJ8SXCwFBVlbjNlEAAAAPBKhCxfw31ZAAAAgFcjZPkaVhgEAAAAvBohy9cwkgUAAAB4NUKWryFkAQAAAF6NkOVrmC4IAAAAeDVClq9hJAsAAADwaraHrJkzZ6pRo0YKCwtTp06dtGbNmmLb/vTTT7r11lvVqFEjORwOTZ8+/aKP6XMIWQAAAIBXszVkzZ8/XykpKZo8ebLWr1+vNm3aKDExUVlZWUW2z83N1SWXXKKnnnpKsa6wcZHH9Dmu62a6IAAAAOCVbA1Z06ZN08iRIzVs2DBddtllmjVrlsLDw/X6668X2b5Dhw76xz/+oTvuuEOhoaGWHNPnuO7JOnZMOnHC3loAAAAAFBJk14lPnTqldevWacKECe59AQEB6tWrl9LS0ir0mHl5ecrLy3N/n52dLUnKz89Xfn5+mWqxiuv87jrCwxUUGipHXp7yf/1VatTIvuLgUwr1JaCM6EuwCn0JVqAfwSrF9aWy9C3bQtbBgwdVUFCgmJgYj/0xMTHasmVLhR5z6tSpmjJlSqH9S5cuVXh4eJlqsVpqaqp7u3dkpMIPHFDaBx/oSIsWNlYFX3R2XwIuBn0JVqEvwQr0I1jl3L6Um5tb6mPYFrK8yYQJE5SSkuL+Pjs7W/Hx8erTp48iIyNtrMxMzqmpqerdu7eCg4MlSYGXXCIdOKDOl1wio39/W+uD7yiqLwFlQV+CVehLsAL9CFYpri+5ZrmVhm0hKyoqSoGBgcrMzPTYn5mZWeyiFuV1zNDQ0CLv8QoODvaaf6wetfx+X1bQwYOSl9QH3+FN/Rq+jb4Eq9CXYAX6Eaxybl8qS7+ybeGLkJAQtWvXTsuWLXPvczqdWrZsmRISErzmmF6JFQYBAAAAr2XrdMGUlBQNGTJE7du3V8eOHTV9+nTl5ORo2LBhkqTBgwerXr16mjp1qiRzYYtNmza5t/fu3auNGzcqIiJCTZs2LdEx/YJrhUE+KwsAAADwOraGrIEDB+rAgQOaNGmSMjIy1LZtWy1ZssS9cEV6eroCAs4Mtu3bt09XXnml+/tnn31Wzz77rLp3767ly5eX6Jh+gQ8kBgAAALyW7QtfJCcnKzk5ucjnXMHJpVGjRjIM46KO6ReYLggAAAB4LVs/jBhlxHRBAAAAwGsRsnyRayQrM1NyOu2tBQAAAIAHQpYvct1flp8vHTliby0AAAAAPBCyfFFIiFS7trnNfVkAAACAVyFk+SpWGAQAAAC8EiHLVxGyAAAAAK9EyPJVrhUGmS4IAAAAeBVClq9iJAsAAADwSoQsX0XIAgAAALwSIctXMV0QAAAA8EqELF/FSBYAAADglQhZvoqQBQAAAHglQpavck0XPHJEOnnS3loAAAAAuBGyfFWNGlJIiLmdmWlrKQAAAADOIGT5KoeDKYMAAACAFyJk+TJWGAQAAAC8DiHLlzGSBQAAAHgdQpYvI2QBAAAAXoeQ5ctcIYvpggAAAIDXIGT5Mtc9WYxkAQAAAF6DkOXLmC4IAAAAeB1Cli9juiAAAADgdQhZvuzs6YKGYW8tAAAAACQRsnxbTIz5NT9fOnLE3loAAAAASCJk+bbQUKlmTXObKYMAAACAVyBk+TpWGAQAAAC8CiHL17HCIAAAAOBVCFm+jpAFAAAAeBVClq9zTRfkniwAAADAKxCyfB0jWQAAAIBXIWT5OkIWAAAA4FUIWb6O6YIAAACAVyFk+TpGsgAAAACvQsjyda6QdfiwlJdnby0AAAAACFk+r1YtKTjY3M7MtLcWAAAAAIQsn+dwMGUQAAAA8CKELH9AyAIAAAC8BiHLH7DCIAAAAOA1CFn+gJEsAAAAwGsQsvwBIQsAAADwGoQsf8B0QQAAAMBrELL8ASNZAAAAgNcgZPkDQhYAAADgNQhZ/uDs6YKGYW8tAAAAQCVHyPIHMTHm11OnpKNHbS0FAAAAqOwIWf4gLEyqUcPcZsogAAAAYCtClr9w3ZfFCoMAAACArQhZ/sJ1XxYjWQAAAICtCFn+ghUGAQAAAK9AyPIXTBcEAAAAvAIhy18wXRAAAADwCoQsf8F0QQAAAMArELL8BdMFAQAAAK9AyPIXTBcEAAAAvAIhy1+4RrIOHZJOnbK3FgAAAKASI2T5i1q1pKAgczsry95aAAAAgEqMkOUvAgK4LwsAAADwAoQsf8IKgwAAAIDtCFn+hJAFAAAA2I6Q5U9cKwwyXRAAAACwDSHLnzCSBQAAANiOkOVPCFkAAACA7QhZ/oTpggAAAIDtbA9ZM2fOVKNGjRQWFqZOnTppzZo1522/cOFCtWjRQmFhYWrVqpUWL17s8fzx48eVnJys+vXrq0qVKrrssss0a9as8rwE78FIFgAAAGA7W0PW/PnzlZKSosmTJ2v9+vVq06aNEhMTlVXMh+muWrVKgwYN0ogRI7RhwwYlJSUpKSlJP/74o7tNSkqKlixZorffflubN2/Wn/70JyUnJ+vjjz+uqMuyz9khyzDsrQUAAACopGwNWdOmTdPIkSM1bNgw94hTeHi4Xn/99SLbP//88+rbt6/GjRunli1b6oknntBVV12lGTNmuNusWrVKQ4YMUY8ePdSoUSONGjVKbdq0ueAImV9whayTJ6Vjx+ytBQAAAKikguw68alTp7Ru3TpNmDDBvS8gIEC9evVSWlpaka9JS0tTSkqKx77ExEQtWrTI/X3nzp318ccfa/jw4YqLi9Py5cu1bds2/fOf/yy2lry8POXl5bm/z87OliTl5+crPz+/LJdnGdf5S1RHUJCCqleX49gx5e/ZI1WtWs7VwZeUqi8B50FfglXoS7AC/QhWKa4vlaVv2RayDh48qIKCAsXExHjsj4mJ0ZYtW4p8TUZGRpHtM866B+nFF1/UqFGjVL9+fQUFBSkgIECvvPKKunXrVmwtU6dO1ZQpUwrtX7p0qcLDw0tzWeUmNTW1RO3+EBGhaseO6buPPtKhn38u56rgi0ral4ALoS/BKvQlWIF+BKuc25dyc3NLfQzbQlZ5efHFF7V69Wp9/PHHatiwob7++mvdf//9iouLU69evYp8zYQJEzxGyLKzsxUfH68+ffooMjKyokovUn5+vlJTU9W7d28FBwdfsH1g06bS3r26umFDGf37V0CF8BWl7UtAcehLsAp9CVagH8EqxfUl1yy30rAtZEVFRSkwMFCZmZke+zMzMxXrurfoHLGxsedtf+LECT366KP68MMPdd1110mSWrdurY0bN+rZZ58tNmSFhoYqNDS00P7g4GCv+cda4lp+X8Y96OBByUtqh3fxpn4N30ZfglXoS7AC/QhWObcvlaVf2bbwRUhIiNq1a6dly5a59zmdTi1btkwJCQlFviYhIcGjvWQO57nau+6hCgjwvKzAwEA5nU6Lr8BLsYw7AAAAYCtbpwumpKRoyJAhat++vTp27Kjp06crJydHw4YNkyQNHjxY9erV09SpUyVJY8eOVffu3fXcc8/puuuu07x587R27VrNnj1bkhQZGanu3btr3LhxqlKliho2bKgVK1borbfe0rRp02y7zgrFBxIDAAAAtrI1ZA0cOFAHDhzQpEmTlJGRobZt22rJkiXuxS3S09M9RqU6d+6suXPn6rHHHtOjjz6qZs2aadGiRbriiivcbebNm6cJEyborrvu0uHDh9WwYUP9/e9/17333lvh12cLRrIAAAAAW9m+8EVycrKSk5OLfG758uWF9g0YMEADBgwo9nixsbF64403rCrP9xCyAAAAAFvZ+mHEKAeukMV0QQAAAMAWhCx/47on6+BBiQ/lAwAAACocIcvf1K4tBQaa21lZ9tYCAAAAVEKELH8TECD9vnAIUwYBAACAikfI8keuKYMsfgEAAABUOEKWP2KFQQAAAMA2hCx/xAqDAAAAgG0IWf6I6YIAAACAbQhZ/ojpggAAAIBtCFn+iJAFAAAA2IaQ5Y9c0wW5JwsAAACocIQsf3T2SJZh2FsLAAAAUMkQsvyRK2SdOCH99pu9tQAAAACVDCHLH4WHS5GR5jZTBgEAAIAKRcjyVyx+AQAAANiCkOWvCFkAAACALQhZ/ooVBgEAAABbELL8FSNZAAAAgC0IWf6KkAUAAADYgpDlr5guCAAAANiCkOWvGMkCAAAAbEHI8leELAAAAMAWhCx/5ZoueOCAdPq0vbUAAAAAlQghy1/Vri0FBkqGIWVl2V0NAAAAUGkQsvxVYKAUHW1uM2UQAAAAqDCELH/mui+LFQYBAACACkPI8meu+7IYyQIAAAAqDCHLn7HCIAAAAFDhCFn+jOmCAAAAQIUjZPkzpgsCAAAAFY6Q5c+YLggAAABUOEKWP2O6IAAAAFDhCFn+7OzpgoZhby0AAABAJUHI8mcxMebX3Fzp+HF7awEAAAAqCUKWP4uIMB8SUwYBAACACkLI8nesMAgAAABUKEKWv2OFQQAAAKBCEbL8HSELAAAAqFCELH/nmi7IPVkAAABAhSBk+TtGsgAAAIAKRcjyd4QsAAAAoEIRsvwd0wUBAACACkXI8neMZAEAAAAVipDl71wh68ABqaDA3loAAACASoCQ5e/q1JECAiSnU8rKsrsaAAAAwO8RsvxdYKAUHW1uM2UQAAAAKHeErMqA+7IAAACACkPIqgxYYRAAAACoMISsyoCRLAAAAKDCELIqA0IWAAAAUGEIWZUB0wUBAACACkPIqgwYyQIAAAAqDCGrMiBkAQAAABWGkFUZuEIW0wUBAACAckfIqgxc92Tl5EjHj9tbCwAAAODnCFmVQUSEVLWquc2UQQAAAKBcEbIqC6YMAgAAABWCkFVZuKYMMpIFAAAAlCtCVmXBCoMAAABAhSBkVRZMFwQAAAAqBCGrsmC6IAAAAFAhCFmVBdMFAQAAgApByKosCFkAAABAhbA9ZM2cOVONGjVSWFiYOnXqpDVr1py3/cKFC9WiRQuFhYWpVatWWrx4caE2mzdv1o033qjq1auratWq6tChg9LT08vrEnyDa7og92QBAAAA5crWkDV//nylpKRo8uTJWr9+vdq0aaPExERlZWUV2X7VqlUaNGiQRowYoQ0bNigpKUlJSUn68ccf3W127typrl27qkWLFlq+fLl++OEHTZw4UWFhYRV1Wd7JNZKVlSUVFNhbCwAAAODHbA1Z06ZN08iRIzVs2DBddtllmjVrlsLDw/X6668X2f75559X3759NW7cOLVs2VJPPPGErrrqKs2YMcPd5i9/+Yv69++vZ555RldeeaWaNGmiG2+8UdHR0RV1Wd6pTh3J4ZCcTungQburAQAAAPxWkF0nPnXqlNatW6cJEya49wUEBKhXr15KS0sr8jVpaWlKSUnx2JeYmKhFixZJkpxOpz777DONHz9eiYmJ2rBhgxo3bqwJEyYoKSmp2Fry8vKUl5fn/j47O1uSlJ+fr/z8/DJeoTVc57eijqDoaDkyM5Wfni7VqnXRx4NvsbIvoXKjL8Eq9CVYgX4EqxTXl8rSt2wLWQcPHlRBQYFiYmI89sfExGjLli1FviYjI6PI9hm/L+aQlZWl48eP66mnntLf/vY3Pf3001qyZIluueUWffXVV+revXuRx506daqmTJlSaP/SpUsVHh5elsuzXGpq6kUfo0eVKqouae2nnypr376LLwo+yYq+BEj0JViHvgQr0I9glXP7Um5ubqmPYVvIKg9Op1OSdNNNN+nBBx+UJLVt21arVq3SrFmzig1ZEyZM8Bghy87OVnx8vPr06aPIyMjyL/w88vPzlZqaqt69eys4OPiijhX4r39Ju3erQ4MGMvr3t6hC+Aor+xIqN/oSrEJfghXoR7BKcX3JNcutNMoUsubMmaOoqChdd911kqTx48dr9uzZuuyyy/Tuu++qYcOGFzxGVFSUAgMDlZmZ6bE/MzNTsa5FGs4RGxt73vZRUVEKCgrSZZdd5tGmZcuW+vbbb4utJTQ0VKGhoYX2BwcHe80/VktqiYuTJAVlZUlecl2oeN7Ur+Hb6EuwCn0JVqAfwSrn9qWy9KsyLXzx5JNPqkqVKpLM+6RmzpypZ555RlFRUe4RpAsJCQlRu3bttGzZMvc+p9OpZcuWKSEhocjXJCQkeLSXzOE8V/uQkBB16NBBW7du9Wizbdu2EgU/v8dnZQEAAADlrkwjWXv27FHTpk0lSYsWLdKtt96qUaNGqUuXLurRo0eJj5OSkqIhQ4aoffv26tixo6ZPn66cnBwNGzZMkjR48GDVq1dPU6dOlSSNHTtW3bt313PPPafrrrtO8+bN09q1azV79mz3MceNG6eBAweqW7duuvbaa7VkyRJ98sknWr58eVku1b8QsgAAAIByV6aQFRERoUOHDqlBgwZaunSp+36msLAwnThxosTHGThwoA4cOKBJkyYpIyNDbdu21ZIlS9yLW6Snpysg4MxgW+fOnTV37lw99thjevTRR9WsWTMtWrRIV1xxhbvNzTffrFmzZmnq1KkaM2aMmjdvrvfff19du3Yty6X6Fz6QGAAAACh3ZQpZvXv31t13360rr7xS27ZtU//fF1H46aef1KhRo1IdKzk5WcnJyUU+V9To04ABAzRgwIDzHnP48OEaPnx4qeqoFBjJAgAAAMpdme7JmjlzphISEnTgwAG9//77ql27tiRp3bp1GjRokKUFwkKELAAAAKDclWkkq0aNGpoxY0ah/UV91hS8iGu64G+/STk5UtWq9tYDAAAA+KEyjWQtWbLEY0n0mTNnqm3btrrzzjt15MgRy4qDxSIiJNeHKzOaBQAAAJSLMoWscePGuT+U63//+58eeugh9e/fX7t27fL4UF94GYeDKYMAAABAOSvTdMFdu3a5P/D3/fff1/XXX68nn3xS69evdy+CAS9Vt67088+sMAgAAACUkzKNZIWEhCg3N1eS9MUXX6hPnz6SpFq1arlHuOClGMkCAAAAylWZRrK6du2qlJQUdenSRWvWrNH8+fMlSdu2bVP9+vUtLRAWI2QBAAAA5apMI1kzZsxQUFCQ3nvvPb300kuqV6+eJOk///mP+vbta2mBsJgrZDFdEAAAACgXZRrJatCggT799NNC+//5z39edEEoZ65l3BnJAgAAAMpFmUKWJBUUFGjRokXavHmzJOnyyy/XjTfeqMDAQMuKQzlguiAAAABQrsoUsnbs2KH+/ftr7969at68uSRp6tSpio+P12effaYmTZpYWiQsxHRBAAAAoFyV6Z6sMWPGqEmTJtqzZ4/Wr1+v9evXKz09XY0bN9aYMWOsrhFWck0XzMqSCgrsrQUAAADwQ2UayVqxYoVWr16tWrVquffVrl1bTz31lLp06WJZcSgHdeqYH0pcUCAdOiRFR9tdEQAAAOBXyjSSFRoaqt9++63Q/uPHjyskJOSii0I5Cg6WoqLMbaYMAgAAAJYrU8i6/vrrNWrUKH333XcyDEOGYWj16tW69957deONN1pdI6zGCoMAAABAuSlTyHrhhRfUpEkTJSQkKCwsTGFhYercubOaNm2q6dOnW1wiLMcKgwAAAEC5KdM9WTVq1NBHH32kHTt2uJdwb9mypZo2bWppcSgnhCwAAACg3JQ4ZKWkpJz3+a+++sq9PW3atLJXhPLnmi7IPVkAAACA5UocsjZs2FCidg6Ho8zFoIIwkgUAAACUmxKHrLNHquDjCFkAAABAuSnTwhfwcUwXBAAAAMoNIasyYiQLAAAAKDeErMrIFbKys6XcXHtrAQAAAPwMIasyioyUqlQxtxnNAgAAACxFyKqMHA6mDAIAAADlhJBVWRGyAAAAgHJByKqsWGEQAAAAKBeErMqKkSwAAACgXBCyKitCFgAAAFAuCFmVFdMFAQAAgHJByKqsGMkCAAAAygUhq7IiZAEAAADlgpBVWbmmC2ZmSk6nvbUAAAAAfoSQVVlFR5tfT5+WDh2ytxYAAADAjxCyKqvgYCkqytxmyiAAAABgGUJWZea6L4sVBgEAAADLELIqM9d9WYxkAQAAAJYhZFVmrDAIAAAAWI6QVZkxXRAAAACwHCGrMmO6IAAAAGA5QlZlxnRBAAAAwHKErMqM6YIAAACA5QhZlRnTBQEAAADLEbIqM9dI1rFj0okT9tYCAAAA+AlCVmVWvboUGmpuZ2baWwsAAADgJwhZlZnDcWbKIPdlAQAAAJYgZFV2rDAIAAAAWIqQVdkRsgAAAABLEbIqO6YLAgAAAJYiZFV2jGQBAAAAliJkVXaELAAAAMBShKzKjumCAAAAgKUIWZUdI1kAAACApQhZlZ0rZGVmSk6nvbUAAAAAfoCQVdnFxJhf8/Olw4ftrQUAAADwA4Ssyi4kRKpd29xmyiAAAABw0QhZ4L4sAAAAwEKELLDCIAAAAGAhQhYYyQIAAAAsRMgCIQsAAACwECELTBcEAAAALETIAiNZAAAAgIUIWSBkAQAAABbyipA1c+ZMNWrUSGFhYerUqZPWrFlz3vYLFy5UixYtFBYWplatWmnx4sXFtr333nvlcDg0ffp0i6v2I66QxXRBAAAA4KLZHrLmz5+vlJQUTZ48WevXr1ebNm2UmJiorKysItuvWrVKgwYN0ogRI7RhwwYlJSUpKSlJP/74Y6G2H374oVavXq24uLjyvgzf5ron6+hR6eRJW0sBAAAAfJ3tIWvatGkaOXKkhg0bpssuu0yzZs1SeHi4Xn/99SLbP//88+rbt6/GjRunli1b6oknntBVV12lGTNmeLTbu3evHnjgAb3zzjsKDg6uiEvxXTVqSCEh5nZmpq2lAAAAAL4uyM6Tnzp1SuvWrdOECRPc+wICAtSrVy+lpaUV+Zq0tDSlpKR47EtMTNSiRYvc3zudTv3xj3/UuHHjdPnll1+wjry8POXl5bm/z87OliTl5+crPz+/NJdkOdf5y7uOoNhYOdLTdXrPHhmM/PmliupL8H/0JViFvgQr0I9gleL6Uln6lq0h6+DBgyooKFBMTIzH/piYGG3ZsqXI12RkZBTZPuOsRRuefvppBQUFacyYMSWqY+rUqZoyZUqh/UuXLlV4eHiJjlHeUlNTy/X414SFqZakdZ99poxDh8r1XLBXefclVB70JViFvgQr0I9glXP7Um5ubqmPYWvIKg/r1q3T888/r/Xr18vhcJToNRMmTPAYHcvOzlZ8fLz69OmjyMjI8iq1RPLz85WamqrevXuX67THwNdek7ZtU/v69eXs37/czgP7VFRfgv+jL8Eq9CVYgX4EqxTXl1yz3ErD1pAVFRWlwMBAZZ5zH1BmZqZiXSvenSM2Nva87b/55htlZWWpQYMG7ucLCgr00EMPafr06dq9e3ehY4aGhio0NLTQ/uDgYK/5x1rutfw+RTDwwAEFesk1o3x4U7+Gb6MvwSr0JViBfgSrnNuXytKvbF34IiQkRO3atdOyZcvc+5xOp5YtW6aEhIQiX5OQkODRXjKH9Fzt//jHP+qHH37Qxo0b3Y+4uDiNGzdOn3/+efldjK9zrTDIMu4AAADARbF9umBKSoqGDBmi9u3bq2PHjpo+fbpycnI0bNgwSdLgwYNVr149TZ06VZI0duxYde/eXc8995yuu+46zZs3T2vXrtXs2bMlSbVr11bt2rU9zhEcHKzY2Fg1b968Yi/Ol/CBxAAAAIAlbA9ZAwcO1IEDBzRp0iRlZGSobdu2WrJkiXtxi/T0dAUEnBlw69y5s+bOnavHHntMjz76qJo1a6ZFixbpiiuusOsS/AMhCwAAALCE7SFLkpKTk5WcnFzkc8uXLy+0b8CAARowYECJj1/UfVg4B9MFAQAAAEvY/mHE8BJnj2QZhr21AAAAAD6MkAWT67PH8vOlI0fsrQUAAADwYYQsmEJDpVq1zG2mDAIAAABlRsjCGSx+AQAAAFw0QhbOIGQBAAAAF42QhTNYYRAAAAC4aIQsnMFIFgAAAHDRCFk4g5AFAAAAXDRCFs5guiAAAABw0QhZOIORLAAAAOCiEbJwBiELAAAAuGiELJzhmi54+LCUl2dvLQAAAICPImThjJo1peBgczsz095aAAAAAB9FyMIZDgdTBgEAAICLRMiCJ1YYBAAAAC4KIQueGMkCAAAALgohC54IWQAAAMBFIWTBkytkMV0QAAAAKBNCFjy57sliJAsAAAAoE0IWPDFdEAAAALgohCx4YrogAAAAcFEIWfB09nRBw7C3FgAAAMAHEbLgKSbG/HrqlHT0qK2lAAAAAL6IkAVPYWFSjRrmNvdlAQAAAKVGyEJhrimD3JcFAAAAlBohC4WxwiAAAABQZoQsFEbIAgAAAMqMkIXCmC4IAAAAlBkhC4W5Qta2bfbWAQAAAPggQhYK693b/Lp4sbRvn721AAAAAD6GkIXC2rSRrrlGOn1amjXL7moAAAAAn0LIQtEeeMD8+vLLUl6evbUAAAAAPoSQhaIlJUn16klZWdLChXZXAwAAAPgMQhaKFhws3Xuvuf3ii/bWAgAAAPgQQhaKN2qUFBIirVljPgAAAABcECELxYuOlgYONLcZzQIAAABKhJCF83MtgDF/vpSZaW8tAAAAgA8gZOH8OnSQOnWS8vOl2bPtrgYAAADweoQsXJhrNGvWLDNsAQAAACgWIQsXNmCAFBMj7dsnffCB3dUAAAAAXo2QhQsLCZHuucfcZgEMAAAA4LwIWSiZe+6RgoKklSulDRvsrgYAAADwWoQslExcnHTbbeY2o1kAAABAsQhZKDnXAhhz50oHD9pbCwAAAOClCFkouYQE6aqrpLw86dVX7a4GAAAA8EqELJScw3FmNOtf/5JOn7a3HgAAAMALEbJQOnfcIUVFSXv2SB9/bHc1AAAAgNchZKF0wsKkkSPNbRbAAAAAAAohZKH07rtPCgyUli+X/vc/u6sBAAAAvAohC6UXHy8lJZnbM2bYWgoAAADgbQhZKBvXAhhvvy0dOWJvLQAAAIAXIWShbLp1k1q1knJzpTfesLsaAAAAwGsQslA2Zy/nPnOmVFBgbz0AAACAlyBkoezuukuqWVP6+WfpP/+xuxoAAADAKxCyUHbh4dKIEeY2y7kDAAAAkghZuFijR5tTB5culbZutbsaAAAAwHaELFycxo2lG24wt1nOHQAAACBkwQKuBTDefFPKzra1FAAAAMBuhCxcvJ49pZYtpePHpTlz7K4GAAAAsBUhCxfP4ZCSk83tGTMkp9PeegAAAAAbEbJgjcGDpchIads2KTXV7moAAAAA2xCyYI2ICGnYMHOb5dwBAABQiRGyYJ377ze/Ll4s7dxpby0AAACATQhZsE6zZlK/fpJhSDNn2l0NAAAAYAuvCFkzZ85Uo0aNFBYWpk6dOmnNmjXnbb9w4UK1aNFCYWFhatWqlRYvXux+Lj8/X4888ohatWqlqlWrKi4uToMHD9a+ffvK+zIgnVkA4/XXzdUGAQAAgErG9pA1f/58paSkaPLkyVq/fr3atGmjxMREZWVlFdl+1apVGjRokEaMGKENGzYoKSlJSUlJ+vHHHyVJubm5Wr9+vSZOnKj169frgw8+0NatW3XjjTdW5GVVXn37Sk2bSseOSW+/bXc1AAAAQIWzPWRNmzZNI0eO1LBhw3TZZZdp1qxZCg8P1+uvv15k++eff159+/bVuHHj1LJlSz3xxBO66qqrNGPGDElS9erVlZqaqttvv13NmzfX1VdfrRkzZmjdunVKT0+vyEurnAICztybNWOGOXUQAAAAqESC7Dz5qVOntG7dOk2YMMG9LyAgQL169VJaWlqRr0lLS1NKSorHvsTERC1atKjY8xw7dkwOh0M1atQo8vm8vDzl5eW5v8/OzpZkTj3Mz88v4dWUD9f57a6jVP7v/xT02GNy/PSTTqemyrj2Wrsrgny0L8Er0ZdgFfoSrEA/glWK60tl6Vu2hqyDBw+qoKBAMTExHvtjYmK0ZcuWIl+TkZFRZPuMjIwi2588eVKPPPKIBg0apMjIyCLbTJ06VVOmTCm0f+nSpQoPDy/JpZS7VB/77KnW11yjxkuW6MCkSVpzVoiG/XytL8F70ZdgFfoSrEA/glXO7Uu5ubmlPoatIau85efn6/bbb5dhGHrppZeKbTdhwgSP0bHs7GzFx8erT58+xQazipKfn6/U1FT17t1bwcHBttZSKo0aSUuWKPb779X/8sulhg3trqjS89m+BK9DX4JV6EuwAv0IVimuL7lmuZWGrSErKipKgYGByszM9NifmZmp2NjYIl8TGxtbovaugPXLL7/oyy+/PG9YCg0NVWhoaKH9wcHBXvOP1ZtqKZE2baSePeVYtkzBr7wiPf203RXhdz7Xl+C16EuwCn0JVqAfwSrn9qWy9CtbF74ICQlRu3bttGzZMvc+p9OpZcuWKSEhocjXJCQkeLSXzCG9s9u7Atb27dv1xRdfqHbt2uVzATi/Bx4wv776qnTihL21AAAAABXE9tUFU1JS9Morr2jOnDnavHmz7rvvPuXk5GjYsGGSpMGDB3ssjDF27FgtWbJEzz33nLZs2aLHH39ca9euVfLvn8+Un5+v2267TWvXrtU777yjgoICZWRkKCMjQ6dOnbLlGiut6683pw0ePizNnWt3NQAAAECFsD1kDRw4UM8++6wmTZqktm3bauPGjVqyZIl7cYv09HTt37/f3b5z586aO3euZs+erTZt2ui9997TokWLdMUVV0iS9u7dq48//li//vqr2rZtq7p167ofq1atsuUaK63AQGn0aHP7xRdZzh0AAACVglcsfJGcnOweiTrX8uXLC+0bMGCABgwYUGT7Ro0ayeCXee8xYoQ0ebL03/9K334rXXON3RUBAAAA5cr2kSz4uVq1pLvuMrdffNHeWgAAAIAKQMhC+XMtgPHBB9LevfbWAgAAAJQzQhbKX+vWUrduUkGBNGuW3dUAAAAA5YqQhYrhGs2aPVvKy7O3FgAAAKAcEbJQMZKSpPr1pawsacECu6sBAAAAyg0hCxUjKEi67z5zmwUwAAAA4McIWag4I0dKoaHS999L331ndzUAAABAuSBkoeLUqSPdcYe5zWgWAAAA/BQhCxXLtQDGggVSRoa9tQAAAADlgJCFitWunZSQIOXnmysNAgAAAH6GkIWK5xrNmjVLOnXK3loAAAAAixGyUPFuvVWKjZX275c++MDuagAAAABLEbJQ8UJCpHvvNbdZAAMAAAB+hpAFe9xzjxQcLK1aJa1fb3c1AAAAgGUIWbBHbKw0YIC5zWgWAAAA/AghC/ZxLYDx7rvSgQP21gIAAABYhJAF+3TqJLVvL+XlSa++anc1AAAAgCUIWbCPw3FmNOull6TTp+2tBwAAALAAIQv2GjhQqlNH2rNH+ugju6sBAAAALhohC/YKDZVGjTK3WQADAAAAfoCQBfvde68UGCitWCH98IPd1QAAAAAXhZAF+9WvL918s7k9Y4a9tQAAAAAXiZAF7+BaAOP116VXXrG3FgAAAOAiELLgHa65Rho2TCooMO/ReuQRyem0uyoAAACg1AhZ8A4Oh/Taa9Ljj5vfP/OMdPvtUm6urWUBAAAApUXIgvdwOKTJk6W335ZCQqT335euvVbKyLC7MgAAAKDECFnwPnfdJX3xhVSrlrRmjXT11dJPP9ldFQAAAFAihCx4p2uukVavlpo1k375RercWUpNtbsqAAAA4IIIWfBezZpJaWlSt25SdrbUrx8rDwIAAMDrEbLg3WrXlpYulf7v/86sPDh+PCsPAgAAwGsRsuD9QkOlt96Spkwxv//HP6QBA1h5EAAAAF6JkAXf4HBIkyZJ77xjrjz4wQdSjx6sPAgAAACvQ8iCb7nzTmnZMnMa4fffS506ST/+aHdVAAAAgBshC76na9czKw+mp0tdupj3bQEAAABegJAF39S0qefKg/37Sy+/bHdVAAAAACELPsy18uAf/2iuPHjvvdLDD7PyIAAAAGxFyIJvCw2V5syR/vpX8/vnnpNuu42VBwEAAGAbQhZ8n8MhTZwozZ1rrjz44YdS9+7S/v12VwYAAIBKiJAF/zFokPTll+Y0wrVrzZUH//c/u6sCAABAJUPIgn/p0sVcefDSS6U9e8zvP//c7qoAAABQiRCy4H9cKw/26CH99pt03XXSrFl2V3XG/v3mZ31lZdldCQAAAMoBIQv+qVYtcwRryBBz5cH77jNXHiwoqNg6jhyRUlOlJ5+Ubr5Zql9fiouTevWS4uPNlRG/+65iawIAAEC5CrK7AKDchIRIb7xhjmxNnGiuPLhzp/T221LVqtafLzdX2rBB+v77M4/t2wu3Cwgwg9avv5q1vP221KGD9MAD0u23mysmAgAAwGcRsuDfHA7pscekJk2kYcOkRYvMlQc/+USqW7fsx83PNxfVODtQ/fRT0SNll1xihijX46qrpIgI8zUzZkjz5pnbgwdLDz0kjRplfuZX/fplrw8AAAC2IWShchg0SGrQQEpKktatM1ce/PRTqXXrC7/W6ZS2bvUMVBs3Snl5hdvWresZqNq3N1c7LEqHDuZnfP3jH9Irr0gvvSTt3Sv9/e/SU0+Z0wuTk6Vu3cywCAAAAJ9AyELl4Vp58LrrzNDUtau0YIHUt++ZNoYhpad7Bqp166Ts7MLHq1HDM1B16CDVq1f6uqKjpb/8RXrkEXOkbcYMacUK6b33zEerVuZUwjvvLJ9pjgAAALAUIQuVS5Mm5sqDt9wiLV9uBq7Jk83RKleoOnCg8OvCw81pfmcHqiZNrB1hCgqSbrvNfPzwgzRzpvTvf5vTEkeNksaPl0aMkEaPNqcgAgAAwCsRslD51Kxprjx4zz3Sm2+aIetsQUHmNMKOHc8EqpYtzf0VpXVr6eWXzWmDb7xhBq6ffzYX75g2zQyHyclS797mQhoAAADwGoQsVE4hIdLrr5th5r33zBUIXYGqTRspLMzuCk01a0opKdLYsdKSJdKLL5oB8dNPzcell0r33y8NHSpFRtpdLQAAAMTnZKEyczikBx+UVq40F6BITjYXxPCWgHW2wEBz9GrJEvN+sjFjpGrVpG3bzABWr55Z/+bNdlcKAABQ6RGyAF9z6aXS88+bKxHOnGlOZTx+3Ny+7DJzCuFHH1X8By8DAABAEiEL8F3VqpmLYPz0k/TFF9JNN5n3Z33xhblUfdOm5vLwhw7ZXSkAeIeCAnPRo88+Mz+cnj9GASgn3JMF+DqHQ+rZ03zs3m1+3tarr5rb48dLkyZJd91lLvQBAJXRli3mtPB//9ucBeASEiI1aya1aOH5aN7c/EMWAJQRIQvwJ40aSU8/LT3+uPTuu+ZCGRs3Sq+9puDXXlOPRo0U+PHHUrt25pL0rVuby9MDgL85fFiaN88MV2vWnNlfs6YUH2/e03rypDkb4KefCr8+Lq5w+GrRwrwHllVdAVwAIQvwR1WqSMOHS8OGSatWSS++KOP991V9925zVcXXXzfbBQSYf7G96irpyivNr23bmr+EAICvyc83V2CdM0f6+GPp1Clzf2Cg1L+/NGSIdP31Umio+fmI6enmKNeWLeaiQq7tjAxp3z7z8eWXnucIDzffN88NX82ame+9ACBCFuDfHA6pSxepSxed3rNHG2bMUDuHQ4E//CCtXy9lZporEm7eLL3zzpnXNW58JnRdeaX5qFvXvusAgPP573/NYPXOO1JW1pn9bdqYwerOO6WYGM/XBASYo/+NGkl9+3o+d/SoZ+hybW/fLuXmShs2mI+zORxSw4ZFTz2MibH2w+sBeD1CFlBZxMZqf+fOcvbvr8DgYHPf/v3mLwrr15/5unu3tGuX+fjgA4/XewSvq64yfznhFwcAdsjKkubONcPVxo1n9kdHm/ehDhlihqyyqFHD/EiPTp089+fnm++N5458bd4sHTlivn/u3m1+3MbZqlc3w1azZmceTZuaX5k5APglQhZQmdWtaz769z+z78gR8xeWs4PX1q3m9Jn//Md8uNSocWakyxW8mjc3p+YAgNXy8swPYp8zx3wvOn3a3B8SIt1wgxms+vaVXH9IslpwsPkxGpde6rnfMKSDBwuHry1bzFB27Jh5X9jZ94a51K59JnCdHb6aNTPfYwH4JEIWAE81a0rXXms+XHJzJdcUQ1fw+vFHc0rNV1+ZD5cqVcy/HrtC1xVXSBER5i9BoaHm17O3g4O9dzTMMMxf4k6eNB95eZ5fz90XECDVquX5CA21+yoA32YY0tq1ZrB6911zQQuXjh3NYHXHHea/N7s4HFKdOubjmms8nzt5UtqxwwxfO3aYUw63bze39+0zP2bj0CHpu+8KH7d27aLDV9OmBDDAyxGyAFxYeLh09dXmw+XUKXOKzNnBa+NGKSdHWr3afJRUcQHs3K8lfS4kxPz8m5KGo/PtM4yL+9lVrWr+8le79pngVZLtkJCLOy/g6/buld5+2wxXmzef2R8XJ/3xj2a4atnSvvpKKizM/GPTFVcUfi4nxwxb54av7dvN6dyuAFbU+2lUVNHhq1kzc3oiAFsRsgCUTUiIOWLVpo25iqFkrta1Y8eZ4LVhg/nXW1dwOXXK/Op0eh7r1Kkzq4B5s+Bg8xemsDAz0J27ffq0+Vf2w4fNaZdOp/lLVE6OtGdP6c4VEVGyQFajhllXQEDhR2BgyfaVpq23jjrCP5w4IS1aZAar1NQz7xVhYdItt5jBqmdP/5mSXLXqmffRcx0/bn5g8rnha/t2c/r2wYPmIy2t8Gvr1DkTuOrWPTPKFh19ZrtOHVZDBMoRIQuAdQICztyvcMcdxbcrKDgTuErztTRtg4KKD0Nnb1/oedd2aGjpPhvH6TTvwzh82PxLtCt8ubaL2ucKZ4Zh/oJ1/Li5xLSXCQoM1PWBgQqoUsXz5+h6nO/70rQt6vvAQPO/retR1PeBgYRBX2IYcqxcaa4MuGCBlJ195rmuXc1gNWBA5RudiYg4fwBzha5zR8EyMqQDB8xHUQHsbFWreoau4sKY61G1Kv+2gBIiZAGoeIGB5l9Q/fmvqAEB5v1tNWtKTZqU/HUFBYXDWXGB7NAh8764ggIz1J39KGrf+Z4rBUdBgQJdQdlbucLX2SGsJAGtqO9dI3gOx5ntku4ry2sCAsygfe7D6Sz7vpK0lUo+8mnR8wFHjqjnW28paP/+M//tGjWSBg82H6X5t1OZRESYn2nYtm3h53777cwUxB07zI/qcIWurKwz2/n5Z0bad+8u2XnDwkoWxiIiCvfv8nycPq2g3Fzz/uEqVc78uwVs5BUha+bMmfrHP/6hjIwMtWnTRi+++KI6duxYbPuFCxdq4sSJ2r17t5o1a6ann35a/c9aHc0wDE2ePFmvvPKKjh49qi5duuill15Ss2bNKuJyAKDsAgPPTAls2rTizuv6hbu4cHbW/vyTJ/XV0qW6tnNnBTudZ6aDnn1PW3l9X1BgTst0fS1OQYH5gFcLlBQhyYiIkOO226ShQ82FI/gFueyqVTuz4mtxDMMcMXQFrqJC2LkP132qe/aUfvpzOQuWdN25Ox0Ozz+alMfDNXJ+9h8Uzv7DghXbRe07ezTx3PuGz/f9xbQt6ud79tfSbpe0bbVqUu/e56/FS9kesubPn6+UlBTNmjVLnTp10vTp05WYmKitW7cqOjq6UPtVq1Zp0KBBmjp1qq6//nrNnTtXSUlJWr9+va74/abSZ555Ri+88ILmzJmjxo0ba+LEiUpMTNSmTZsUFhZW0ZcIAN7P4TjzC8OF5OfrRHS0OS20vJbKLglXMDw7dJ39OHdfWducO+Jzoe3StC3qdU5n0X+tL25U4HyjBaV5zdk/0wuNhlrUxmkY2lCjhlo//riCWS2v4jgc5vTL6tVL9scc1xTm4gLYuQEtJ+fM66x8lIZhmKN1+fml//nAe7Ro4bnwjQ+xPWRNmzZNI0eO1LDfb5yfNWuWPvvsM73++uv685//XKj9888/r759+2rcuHGSpCeeeEKpqamaMWOGZs2aJcMwNH36dD322GO66aabJElvvfWWYmJitGjRIt1xvvtEAAC+ozTBEF6pID9fvy5erNZVq9pdCs7HNaJQrZp0ySX21lJE+Mo/dUpLFi9W3969Ffz79EFLH/n5xT937h8SLma7NO2KG/250PcX0/bs/wZnfy3tdmnaNmhQdA0+wNaQderUKa1bt04TJkxw7wsICFCvXr2UVszNmmlpaUpJSfHYl5iYqEWLFkmSdu3apYyMDPXq1cv9fPXq1dWpUyelpaUVGbLy8vKUl5fn/j7795tu8/PzlW/zX0Bc57e7Dvg++hKsQl+CVehLsEK+wyFnSIjyXZ+9CP9Sge8Pxb0nleU9ytaQdfDgQRUUFCgmJsZjf0xMjLZs2VLkazIyMopsn5GR4X7eta+4NueaOnWqpkyZUmj/0qVLFR4eXrKLKWepqal2lwA/QV+CVehLsAp9CVagH8Eq5/al3NzcUh/D9umC3mDChAkeo2PZ2dmKj49Xnz59FBkZaWNlZnJOTU1V7969FcxfZ3AR6EuwCn0JVqEvwQr0I1iluL6UffZHS5SQrSErKipKgYGByszM9NifmZmp2NjYIl8TGxt73vaur5mZmapbt65Hm7ZFLXUqKTQ0VKGhoYX2BwcHe80/Vm+qBb6NvgSr0JdgFfoSrEA/glXO7Utl6Ve2rpEaEhKidu3aadmyZe59TqdTy5YtU0JCQpGvSUhI8GgvmUN6rvaNGzdWbGysR5vs7Gx99913xR4TAAAAAKxi+3TBlJQUDRkyRO3bt1fHjh01ffp05eTkuFcbHDx4sOrVq6epU6dKksaOHavu3bvrueee03XXXad58+Zp7dq1mj17tiTJ4XDoT3/6k/72t7+pWbNm7iXc4+LilJSUZNdlAgAAAKgkbA9ZAwcO1IEDBzRp0iRlZGSobdu2WrJkiXvhivT0dAWc9aGEnTt31ty5c/XYY4/p0UcfVbNmzbRo0SL3Z2RJ0vjx45WTk6NRo0bp6NGj6tq1q5YsWcJnZAEAAAAod7aHLElKTk5WcnJykc8tX7680L4BAwZowIABxR7P4XDor3/9q/76179aVSIAAAAAlIit92QBAAAAgL8hZAEAAACAhQhZAAAAAGAhQhYAAAAAWIiQBQAAAAAWImQBAAAAgIUIWQAAAABgIUIWAAAAAFiIkAUAAAAAFiJkAQAAAICFCFkAAAAAYKEguwvwRoZhSJKys7NtrkTKz89Xbm6usrOzFRwcbHc58GH0JViFvgSr0JdgBfoRrFJcX3JlAldGKAlCVhF+++03SVJ8fLzNlQAAAADwBr/99puqV69eorYOozSRrJJwOp3at2+fqlWrJofDYWst2dnZio+P1549exQZGWlrLfBt9CVYhb4Eq9CXYAX6EaxSXF8yDEO//fab4uLiFBBQsrutGMkqQkBAgOrXr293GR4iIyN544Al6EuwCn0JVqEvwQr0I1ilqL5U0hEsFxa+AAAAAAALEbIAAAAAwEKELC8XGhqqyZMnKzQ01O5S4OPoS7AKfQlWoS/BCvQjWMXKvsTCFwAAAABgIUayAAAAAMBChCwAAAAAsBAhCwAAAAAsRMgCAAAAAAsRsrzczJkz1ahRI4WFhalTp05as2aN3SXBxzz++ONyOBwejxYtWthdFnzA119/rRtuuEFxcXFyOBxatGiRx/OGYWjSpEmqW7euqlSpol69emn79u32FAuvdaF+NHTo0ELvUX379rWnWHi1qVOnqkOHDqpWrZqio6OVlJSkrVu3erQ5efKk7r//ftWuXVsRERG69dZblZmZaVPF8EYl6Uc9evQo9L507733luo8hCwvNn/+fKWkpGjy5Mlav3692rRpo8TERGVlZdldGnzM5Zdfrv3797sf3377rd0lwQfk5OSoTZs2mjlzZpHPP/PMM3rhhRc0a9Ysfffdd6pataoSExN18uTJCq4U3uxC/UiS+vbt6/Ee9e6771ZghfAVK1as0P3336/Vq1crNTVV+fn56tOnj3JyctxtHnzwQX3yySdauHChVqxYoX379umWW26xsWp4m5L0I0kaOXKkx/vSM888U6rzsIS7F+vUqZM6dOigGTNmSJKcTqfi4+P1wAMP6M9//rPN1cFXPP7441q0aJE2btxodynwYQ6HQx9++KGSkpIkmaNYcXFxeuihh/Twww9Lko4dO6aYmBi9+eabuuOOO2ysFt7q3H4kmSNZR48eLTTCBVzIgQMHFB0drRUrVqhbt246duyY6tSpo7lz5+q2226TJG3ZskUtW7ZUWlqarr76apsrhjc6tx9J5khW27ZtNX369DIfl5EsL3Xq1CmtW7dOvXr1cu8LCAhQr169lJaWZmNl8EXbt29XXFycLrnkEt11111KT0+3uyT4uF27dikjI8PjPap69erq1KkT71EoteXLlys6OlrNmzfXfffdp0OHDtldEnzAsWPHJEm1atWSJK1bt075+fke70stWrRQgwYNeF9Csc7tRy7vvPOOoqKidMUVV2jChAnKzc0t1XGDLKsQljp48KAKCgoUExPjsT8mJkZbtmyxqSr4ok6dOunNN99U8+bNtX//fk2ZMkXXXHONfvzxR1WrVs3u8uCjMjIyJKnI9yjXc0BJ9O3bV7fccosaN26snTt36tFHH1W/fv2UlpamwMBAu8uDl3I6nfrTn/6kLl266IorrpBkvi+FhISoRo0aHm15X0JxiupHknTnnXeqYcOGiouL0w8//KBHHnlEW7du1QcffFDiYxOyAD/Xr18/93br1q3VqVMnNWzYUAsWLNCIESNsrAwA5DG1tFWrVmrdurWaNGmi5cuXq2fPnjZWBm92//3368cff+QeY1yU4vrRqFGj3NutWrVS3bp11bNnT+3cuVNNmjQp0bGZLuiloqKiFBgYWGhFnMzMTMXGxtpUFfxBjRo1dOmll2rHjh12lwIf5nof4j0KVrvkkksUFRXFexSKlZycrE8//VRfffWV6tev794fGxurU6dO6ejRox7teV9CUYrrR0Xp1KmTJJXqfYmQ5aVCQkLUrl07LVu2zL3P6XRq2bJlSkhIsLEy+Lrjx49r586dqlu3rt2lwIc1btxYsbGxHu9R2dnZ+u6773iPwkX59ddfdejQId6jUIhhGEpOTtaHH36oL7/8Uo0bN/Z4vl27dgoODvZ4X9q6davS09N5X4LbhfpRUVyLh5XmfYnpgl4sJSVFQ4YMUfv27dWxY0dNnz5dOTk5GjZsmN2lwYc8/PDDuuGGG9SwYUPt27dPkydPVmBgoAYNGmR3afByx48f9/ir3a5du7Rx40bVqlVLDRo00J/+9Cf97W9/U7NmzdS4cWNNnDhRcXFxHivHAefrR7Vq1dKUKVN06623KjY2Vjt37tT48ePVtGlTJSYm2lg1vNH999+vuXPn6qOPPlK1atXc91lVr15dVapUUfXq1TVixAilpKSoVq1aioyM1AMPPKCEhARWFoTbhfrRzp07NXfuXPXv31+1a9fWDz/8oAcffFDdunVT69atS34iA17txRdfNBo0aGCEhIQYHTt2NFavXm13SfAxAwcONOrWrWuEhIQY9erVMwYOHGjs2LHD7rLgA7766itDUqHHkCFDDMMwDKfTaUycONGIiYkxQkNDjZ49expbt261t2h4nfP1o9zcXKNPnz5GnTp1jODgYKNhw4bGyJEjjYyMDLvLhhcqqh9JMt544w13mxMnThijR482atasaYSHhxs333yzsX//fvuKhte5UD9KT083unXrZtSqVcsIDQ01mjZtaowbN844duxYqc7D52QBAAAAgIW4JwsAAAAALETIAgAAAAALEbIAAAAAwEKELAAAAACwECELAAAAACxEyAIAAAAACxGyAAAAAMBChCwAAAAAsBAhCwDg9Xbv3i2Hw6GNGzeW2zmWL18uh8Oho0ePlts5JKlHjx7605/+VK7nAADYK8juAgAAqEw++OADBQcHl7j97t271bhxY23YsEFt27Ytv8IAAJYhZAEAUIFq1apldwkAgHLGdEEAgNdwOp165pln1LRpU4WGhqpBgwb6+9//7n7+559/1rXXXqvw8HC1adNGaWlpHq//9ttvdc0116hKlSqKj4/XmDFjlJOT434+Ly9PjzzyiOLj4xUaGqqmTZvqtddeK7KW3Nxc9evXT126dNHRo0fdUxbnzZunzp07KywsTFdccYVWrFjh8boVK1aoY8eOCg0NVd26dfXnP/9Zp0+fdj9/7nTBRo0a6cknn9Tw4cNVrVo1NWjQQLNnz3Y/37hxY0nSlVdeKYfDoR49epT65woAqFiELACA15gwYYKeeuopTZw4UZs2bdLcuXMVExPjfv4vf/mLHn74YW3cuFGXXnqpBg0a5A4wO3fuVN++fXXrrbfqhx9+0Pz58/Xtt98qOTnZ/frBgwfr3Xff1QsvvKDNmzfr5ZdfVkRERKE6jh49qt69e8vpdCo1NVU1atRwPzdu3Dg99NBD2rBhgxISEnTDDTfo0KFDkqS9e/eqf//+6tChg/773//qpZde0muvvaa//e1v573u5557Tu3bt9eGDRs0evRo3Xfffdq6daskac2aNZKkL774Qvv379cHH3xQth8uAKDiGAAAeIHs7GwjNDTUeOWVVwo9t2vXLkOS8eqrr7r3/fTTT4YkY/PmzYZhGMaIESOMUaNGebzum2++MQICAowTJ04YW7duNSQZqampRZ7/q6++ch+vdevWxq233mrk5eUVquGpp55y78vPzzfq169vPP3004ZhGMajjz5qNG/e3HA6ne42M2fONCIiIoyCggLDMAyje/fuxtixY93PN2zY0Pi///s/9/dOp9OIjo42XnrpJY/zbtiw4bw/PwCA92AkCwDgFTZv3qy8vDz17Nmz2DatW7d2b9etW1eSlJWVJUn673//qzfffFMRERHuR2JiopxOp3bt2qWNGzcqMDBQ3bt3P28dvXv3VtOmTTV//nyFhIQUej4hIcG9HRQUpPbt22vz5s3ua0hISJDD4XC36dKli44fP65ff/21RNflcDgUGxvrvi4AgO9h4QsAgFeoUqXKBducvSqfK8g4nU5J0vHjx3XPPfdozJgxhV7XoEED7dixo0R1XHfddXr//fe1adMmtWrVqkSvuVjnrjbocDjc1wUA8D2MZAEAvEKzZs1UpUoVLVu2rEyvv+qqq7Rp0yY1bdq00CMkJEStWrWS0+kstFDFuZ566ikNGTJEPXv21KZNmwo9v3r1avf26dOntW7dOrVs2VKS1LJlS6WlpckwDHeblStXqlq1aqpfv36Zrss1mlZQUFCm1wMAKh4hCwDgFcLCwvTII49o/Pjxeuutt7Rz506tXr262NX/zvXII49o1apVSk5O1saNG7V9+3Z99NFH7oUvGjVqpCFDhmj48OFatGiRdu3apeXLl2vBggWFjvXss8/qrrvu0h/+8Adt2bLF47mZM2fqww8/1JYtW3T//ffryJEjGj58uCRp9OjR2rNnjx544AFt2bJFH330kSZPnqyUlBQFBJTtf7nR0dGqUqWKlixZoszMTB07dqxMxwEAVBxCFgDAa0ycOFEPPfSQJk2apJYtW2rgwIElvjepdevWWrFihbZt26ZrrrlGV155pSZNmqS4uDh3m5deekm33XabRo8erRYtWmjkyJEeS7yf7Z///Kduv/12/eEPf9C2bdvc+5966ik99dRTatOmjb799lt9/PHHioqKkiTVq1dPixcv1po1a9SmTRvde++9GjFihB577LEy/0yCgoL0wgsv6OWXX1ZcXJxuuummMh8LAFAxHMbZcxoAAECRdu/ercaNG2vDhg1q27at3eUAALwYI1kAAAAAYCFCFgAAAABYiOmCAAAAAGAhRrIAAAAAwEKELAAAAACwECELAAAAACxEyAIAAAAACxGyAAAAAMBChCwAAAAAsBAhCwAAAAAsRMgCAAAAAAv9Py9yMHM9tCSgAAAAAElFTkSuQmCC",
62
+ "text/plain": [
63
+ "<Figure size 1000x600 with 1 Axes>"
64
+ ]
65
+ },
66
+ "metadata": {},
67
+ "output_type": "display_data"
68
+ }
69
+ ],
70
+ "source": [
71
+ "# plot the val loss curves\n",
72
+ "val_losses = np.lib.format.open_memmap(\"val_losses.npy\", dtype=np.float32, mode=\"r\")\n",
73
+ "last_val_loss_idx = np.lib.format.open_memmap(\"last_val_loss_idx.npy\", dtype=np.float32, mode=\"r\")\n",
74
+ "plt.figure(figsize=(10, 6))\n",
75
+ "plt.plot(val_losses[:last_val_loss_idx[...]+1], label=\"validation loss\", color=\"red\")\n",
76
+ "plt.xlabel(\"checkpoint\")\n",
77
+ "plt.ylabel(\"loss\")\n",
78
+ "plt.title(\"validation loss curve\")\n",
79
+ "plt.legend()\n",
80
+ "plt.grid(True)\n",
81
+ "plt.show()"
82
+ ]
83
+ }
84
+ ],
85
+ "metadata": {
86
+ "kernelspec": {
87
+ "display_name": "ai",
88
+ "language": "python",
89
+ "name": "python3"
90
+ },
91
+ "language_info": {
92
+ "codemirror_mode": {
93
+ "name": "ipython",
94
+ "version": 3
95
+ },
96
+ "file_extension": ".py",
97
+ "mimetype": "text/x-python",
98
+ "name": "python",
99
+ "nbconvert_exporter": "python",
100
+ "pygments_lexer": "ipython3",
101
+ "version": "3.11.13"
102
+ }
103
+ },
104
+ "nbformat": 4,
105
+ "nbformat_minor": 5
106
+ }