File size: 153,976 Bytes
8138842
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "b3062040",
   "metadata": {},
   "outputs": [],
   "source": [
    "import gym\n",
    "import numpy as np\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "from IPython.display import clear_output\n",
    "from stable_baselines3.common.env_util import make_vec_env\n",
    "from stable_baselines3.common.callbacks import CheckpointCallback, EvalCallback\n",
    "import torch\n",
    "from torch import nn\n",
    "\n",
    "from stable_baselines3 import A2C\n",
    "from stable_baselines3.common.monitor import Monitor\n",
    "from rl_zoo3.wrappers import FrameSkip"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "eb54309b",
   "metadata": {},
   "outputs": [],
   "source": [
    "env_name = 'MountainCarContinuous-v0'"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e3dacf8a",
   "metadata": {},
   "source": [
    "# MountainCarContinuous SB3 A2C baseline"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cd55c184",
   "metadata": {},
   "source": [
    "Let's establish a baseline using sb3 and rl_zoo3 libraries. We will be using frameskip wrapper from rl_zoo3. This environment needs it to enable stable convergence."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "8927a36d",
   "metadata": {},
   "outputs": [],
   "source": [
    "env = make_vec_env(env_name, \n",
    "                   n_envs=8, \n",
    "                   wrapper_class=FrameSkip)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "d37024b3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using cpu device\n"
     ]
    }
   ],
   "source": [
    "model = A2C(\"MlpPolicy\", env, verbose=1, \n",
    "            n_steps=30,\n",
    "            ent_coef=0.0001)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "2976849a",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 680      |\n",
      "|    ep_rew_mean        | 40.3     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10187    |\n",
      "|    iterations         | 100      |\n",
      "|    time_elapsed       | 2        |\n",
      "|    total_timesteps    | 24000    |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.4     |\n",
      "|    explained_variance | 0.0118   |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 99       |\n",
      "|    policy_loss        | 0.336    |\n",
      "|    std                | 0.979    |\n",
      "|    value_loss         | 317      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 669      |\n",
      "|    ep_rew_mean        | 18.4     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10224    |\n",
      "|    iterations         | 200      |\n",
      "|    time_elapsed       | 4        |\n",
      "|    total_timesteps    | 48000    |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.39    |\n",
      "|    explained_variance | -0.123   |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 199      |\n",
      "|    policy_loss        | -7.13    |\n",
      "|    std                | 0.967    |\n",
      "|    value_loss         | 34.3     |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 802      |\n",
      "|    ep_rew_mean        | -26.3    |\n",
      "| time/                 |          |\n",
      "|    fps                | 10231    |\n",
      "|    iterations         | 300      |\n",
      "|    time_elapsed       | 7        |\n",
      "|    total_timesteps    | 72000    |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.39    |\n",
      "|    explained_variance | -0.456   |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 299      |\n",
      "|    policy_loss        | -6.29    |\n",
      "|    std                | 0.971    |\n",
      "|    value_loss         | 45.1     |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 834      |\n",
      "|    ep_rew_mean        | -36.2    |\n",
      "| time/                 |          |\n",
      "|    fps                | 10232    |\n",
      "|    iterations         | 400      |\n",
      "|    time_elapsed       | 9        |\n",
      "|    total_timesteps    | 96000    |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.38    |\n",
      "|    explained_variance | -0.989   |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 399      |\n",
      "|    policy_loss        | -5.6     |\n",
      "|    std                | 0.964    |\n",
      "|    value_loss         | 30.6     |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 815      |\n",
      "|    ep_rew_mean        | -25.8    |\n",
      "| time/                 |          |\n",
      "|    fps                | 10223    |\n",
      "|    iterations         | 500      |\n",
      "|    time_elapsed       | 11       |\n",
      "|    total_timesteps    | 120000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.39    |\n",
      "|    explained_variance | -0.371   |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 499      |\n",
      "|    policy_loss        | -4.2     |\n",
      "|    std                | 0.967    |\n",
      "|    value_loss         | 19.4     |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 769      |\n",
      "|    ep_rew_mean        | -25      |\n",
      "| time/                 |          |\n",
      "|    fps                | 10207    |\n",
      "|    iterations         | 600      |\n",
      "|    time_elapsed       | 14       |\n",
      "|    total_timesteps    | 144000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.39    |\n",
      "|    explained_variance | 0.109    |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 599      |\n",
      "|    policy_loss        | 10.5     |\n",
      "|    std                | 0.973    |\n",
      "|    value_loss         | 977      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 790      |\n",
      "|    ep_rew_mean        | -21.5    |\n",
      "| time/                 |          |\n",
      "|    fps                | 10202    |\n",
      "|    iterations         | 700      |\n",
      "|    time_elapsed       | 16       |\n",
      "|    total_timesteps    | 168000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.41    |\n",
      "|    explained_variance | 0.126    |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 699      |\n",
      "|    policy_loss        | 8.49     |\n",
      "|    std                | 0.986    |\n",
      "|    value_loss         | 906      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 769      |\n",
      "|    ep_rew_mean        | -14      |\n",
      "| time/                 |          |\n",
      "|    fps                | 10202    |\n",
      "|    iterations         | 800      |\n",
      "|    time_elapsed       | 18       |\n",
      "|    total_timesteps    | 192000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.41    |\n",
      "|    explained_variance | 0.228    |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 799      |\n",
      "|    policy_loss        | 7.22     |\n",
      "|    std                | 0.992    |\n",
      "|    value_loss         | 500      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 635      |\n",
      "|    ep_rew_mean        | 19       |\n",
      "| time/                 |          |\n",
      "|    fps                | 10195    |\n",
      "|    iterations         | 900      |\n",
      "|    time_elapsed       | 21       |\n",
      "|    total_timesteps    | 216000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.4     |\n",
      "|    explained_variance | 0.178    |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 899      |\n",
      "|    policy_loss        | 7.95     |\n",
      "|    std                | 0.981    |\n",
      "|    value_loss         | 894      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 699      |\n",
      "|    ep_rew_mean        | -0.351   |\n",
      "| time/                 |          |\n",
      "|    fps                | 10196    |\n",
      "|    iterations         | 1000     |\n",
      "|    time_elapsed       | 23       |\n",
      "|    total_timesteps    | 240000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.4     |\n",
      "|    explained_variance | 0.288    |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 999      |\n",
      "|    policy_loss        | 9.62     |\n",
      "|    std                | 0.977    |\n",
      "|    value_loss         | 415      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 488      |\n",
      "|    ep_rew_mean        | 54.6     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10193    |\n",
      "|    iterations         | 1100     |\n",
      "|    time_elapsed       | 25       |\n",
      "|    total_timesteps    | 264000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.41    |\n",
      "|    explained_variance | 0.357    |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 1099     |\n",
      "|    policy_loss        | 1.7      |\n",
      "|    std                | 0.99     |\n",
      "|    value_loss         | 596      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 537      |\n",
      "|    ep_rew_mean        | 37.1     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10195    |\n",
      "|    iterations         | 1200     |\n",
      "|    time_elapsed       | 28       |\n",
      "|    total_timesteps    | 288000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.41    |\n",
      "|    explained_variance | 0.122    |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 1199     |\n",
      "|    policy_loss        | 23.6     |\n",
      "|    std                | 0.994    |\n",
      "|    value_loss         | 1.48e+03 |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 398      |\n",
      "|    ep_rew_mean        | 67.4     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10190    |\n",
      "|    iterations         | 1300     |\n",
      "|    time_elapsed       | 30       |\n",
      "|    total_timesteps    | 312000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.41    |\n",
      "|    explained_variance | 0.137    |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 1299     |\n",
      "|    policy_loss        | 9.97     |\n",
      "|    std                | 0.987    |\n",
      "|    value_loss         | 948      |\n",
      "------------------------------------\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 362      |\n",
      "|    ep_rew_mean        | 70.2     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10193    |\n",
      "|    iterations         | 1400     |\n",
      "|    time_elapsed       | 32       |\n",
      "|    total_timesteps    | 336000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.42    |\n",
      "|    explained_variance | 0.0151   |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 1399     |\n",
      "|    policy_loss        | 19.2     |\n",
      "|    std                | 0.997    |\n",
      "|    value_loss         | 1.31e+03 |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 335      |\n",
      "|    ep_rew_mean        | 76.4     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10193    |\n",
      "|    iterations         | 1500     |\n",
      "|    time_elapsed       | 35       |\n",
      "|    total_timesteps    | 360000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.42    |\n",
      "|    explained_variance | 0.0048   |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 1499     |\n",
      "|    policy_loss        | 14       |\n",
      "|    std                | 0.998    |\n",
      "|    value_loss         | 1.13e+03 |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 326      |\n",
      "|    ep_rew_mean        | 74.8     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10190    |\n",
      "|    iterations         | 1600     |\n",
      "|    time_elapsed       | 37       |\n",
      "|    total_timesteps    | 384000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.41    |\n",
      "|    explained_variance | -0.0023  |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 1599     |\n",
      "|    policy_loss        | 8.96     |\n",
      "|    std                | 0.994    |\n",
      "|    value_loss         | 940      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 252      |\n",
      "|    ep_rew_mean        | 83.2     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10189    |\n",
      "|    iterations         | 1700     |\n",
      "|    time_elapsed       | 40       |\n",
      "|    total_timesteps    | 408000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.42    |\n",
      "|    explained_variance | 0.00187  |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 1699     |\n",
      "|    policy_loss        | 16.8     |\n",
      "|    std                | 0.999    |\n",
      "|    value_loss         | 1.21e+03 |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 244      |\n",
      "|    ep_rew_mean        | 82.8     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10191    |\n",
      "|    iterations         | 1800     |\n",
      "|    time_elapsed       | 42       |\n",
      "|    total_timesteps    | 432000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.42    |\n",
      "|    explained_variance | 0.000167 |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 1799     |\n",
      "|    policy_loss        | 21       |\n",
      "|    std                | 1        |\n",
      "|    value_loss         | 1.31e+03 |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 264      |\n",
      "|    ep_rew_mean        | 79.1     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10187    |\n",
      "|    iterations         | 1900     |\n",
      "|    time_elapsed       | 44       |\n",
      "|    total_timesteps    | 456000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.41    |\n",
      "|    explained_variance | 0.000292 |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 1899     |\n",
      "|    policy_loss        | -1.46    |\n",
      "|    std                | 0.996    |\n",
      "|    value_loss         | 426      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 257      |\n",
      "|    ep_rew_mean        | 79.8     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10191    |\n",
      "|    iterations         | 2000     |\n",
      "|    time_elapsed       | 47       |\n",
      "|    total_timesteps    | 480000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.41    |\n",
      "|    explained_variance | 0.000532 |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 1999     |\n",
      "|    policy_loss        | 4.65     |\n",
      "|    std                | 0.994    |\n",
      "|    value_loss         | 687      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 199      |\n",
      "|    ep_rew_mean        | 86.7     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10194    |\n",
      "|    iterations         | 2100     |\n",
      "|    time_elapsed       | 49       |\n",
      "|    total_timesteps    | 504000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.41    |\n",
      "|    explained_variance | 0.000245 |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 2099     |\n",
      "|    policy_loss        | 2.49     |\n",
      "|    std                | 0.991    |\n",
      "|    value_loss         | 556      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 210      |\n",
      "|    ep_rew_mean        | 85.5     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10192    |\n",
      "|    iterations         | 2200     |\n",
      "|    time_elapsed       | 51       |\n",
      "|    total_timesteps    | 528000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.4     |\n",
      "|    explained_variance | 0.000217 |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 2199     |\n",
      "|    policy_loss        | 23.6     |\n",
      "|    std                | 0.986    |\n",
      "|    value_loss         | 1.14e+03 |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 217      |\n",
      "|    ep_rew_mean        | 85.4     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10196    |\n",
      "|    iterations         | 2300     |\n",
      "|    time_elapsed       | 54       |\n",
      "|    total_timesteps    | 552000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.39    |\n",
      "|    explained_variance | 0.000115 |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 2299     |\n",
      "|    policy_loss        | 17.5     |\n",
      "|    std                | 0.976    |\n",
      "|    value_loss         | 849      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 184      |\n",
      "|    ep_rew_mean        | 87       |\n",
      "| time/                 |          |\n",
      "|    fps                | 10194    |\n",
      "|    iterations         | 2400     |\n",
      "|    time_elapsed       | 56       |\n",
      "|    total_timesteps    | 576000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.39    |\n",
      "|    explained_variance | 6.5e-05  |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 2399     |\n",
      "|    policy_loss        | 15.5     |\n",
      "|    std                | 0.97     |\n",
      "|    value_loss         | 800      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 186      |\n",
      "|    ep_rew_mean        | 86       |\n",
      "| time/                 |          |\n",
      "|    fps                | 10195    |\n",
      "|    iterations         | 2500     |\n",
      "|    time_elapsed       | 58       |\n",
      "|    total_timesteps    | 600000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.37    |\n",
      "|    explained_variance | 0.000167 |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 2499     |\n",
      "|    policy_loss        | 13.4     |\n",
      "|    std                | 0.948    |\n",
      "|    value_loss         | 726      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 167      |\n",
      "|    ep_rew_mean        | 87.4     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10194    |\n",
      "|    iterations         | 2600     |\n",
      "|    time_elapsed       | 61       |\n",
      "|    total_timesteps    | 624000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.37    |\n",
      "|    explained_variance | 8.85e-05 |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 2599     |\n",
      "|    policy_loss        | 12.7     |\n",
      "|    std                | 0.953    |\n",
      "|    value_loss         | 646      |\n",
      "------------------------------------\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 149      |\n",
      "|    ep_rew_mean        | 90       |\n",
      "| time/                 |          |\n",
      "|    fps                | 10193    |\n",
      "|    iterations         | 2700     |\n",
      "|    time_elapsed       | 63       |\n",
      "|    total_timesteps    | 648000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.36    |\n",
      "|    explained_variance | 8.25e-05 |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 2699     |\n",
      "|    policy_loss        | 0.152    |\n",
      "|    std                | 0.949    |\n",
      "|    value_loss         | 359      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 143      |\n",
      "|    ep_rew_mean        | 90.7     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10192    |\n",
      "|    iterations         | 2800     |\n",
      "|    time_elapsed       | 65       |\n",
      "|    total_timesteps    | 672000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.36    |\n",
      "|    explained_variance | 3.92e-05 |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 2799     |\n",
      "|    policy_loss        | 10.4     |\n",
      "|    std                | 0.94     |\n",
      "|    value_loss         | 447      |\n",
      "------------------------------------\n",
      "-------------------------------------\n",
      "| rollout/              |           |\n",
      "|    ep_len_mean        | 136       |\n",
      "|    ep_rew_mean        | 91        |\n",
      "| time/                 |           |\n",
      "|    fps                | 10192     |\n",
      "|    iterations         | 2900      |\n",
      "|    time_elapsed       | 68        |\n",
      "|    total_timesteps    | 696000    |\n",
      "| train/                |           |\n",
      "|    entropy_loss       | -1.35     |\n",
      "|    explained_variance | -7.03e-06 |\n",
      "|    learning_rate      | 0.0007    |\n",
      "|    n_updates          | 2899      |\n",
      "|    policy_loss        | -0.258    |\n",
      "|    std                | 0.934     |\n",
      "|    value_loss         | 302       |\n",
      "-------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 128      |\n",
      "|    ep_rew_mean        | 91.3     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10189    |\n",
      "|    iterations         | 3000     |\n",
      "|    time_elapsed       | 70       |\n",
      "|    total_timesteps    | 720000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.34    |\n",
      "|    explained_variance | 3.95e-05 |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 2999     |\n",
      "|    policy_loss        | 12.6     |\n",
      "|    std                | 0.929    |\n",
      "|    value_loss         | 328      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 121      |\n",
      "|    ep_rew_mean        | 91       |\n",
      "| time/                 |          |\n",
      "|    fps                | 10179    |\n",
      "|    iterations         | 3100     |\n",
      "|    time_elapsed       | 73       |\n",
      "|    total_timesteps    | 744000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.34    |\n",
      "|    explained_variance | 2.8e-05  |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 3099     |\n",
      "|    policy_loss        | 7        |\n",
      "|    std                | 0.921    |\n",
      "|    value_loss         | 235      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 107      |\n",
      "|    ep_rew_mean        | 92.1     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10173    |\n",
      "|    iterations         | 3200     |\n",
      "|    time_elapsed       | 75       |\n",
      "|    total_timesteps    | 768000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.32    |\n",
      "|    explained_variance | 0.000182 |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 3199     |\n",
      "|    policy_loss        | 4.2      |\n",
      "|    std                | 0.907    |\n",
      "|    value_loss         | 193      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 96.9     |\n",
      "|    ep_rew_mean        | 92.4     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10169    |\n",
      "|    iterations         | 3300     |\n",
      "|    time_elapsed       | 77       |\n",
      "|    total_timesteps    | 792000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.31    |\n",
      "|    explained_variance | 0.0106   |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 3299     |\n",
      "|    policy_loss        | 4.23     |\n",
      "|    std                | 0.895    |\n",
      "|    value_loss         | 176      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 97.4     |\n",
      "|    ep_rew_mean        | 92.4     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10163    |\n",
      "|    iterations         | 3400     |\n",
      "|    time_elapsed       | 80       |\n",
      "|    total_timesteps    | 816000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.29    |\n",
      "|    explained_variance | 0.0753   |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 3399     |\n",
      "|    policy_loss        | 6.4      |\n",
      "|    std                | 0.882    |\n",
      "|    value_loss         | 112      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 90       |\n",
      "|    ep_rew_mean        | 92.6     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10160    |\n",
      "|    iterations         | 3500     |\n",
      "|    time_elapsed       | 82       |\n",
      "|    total_timesteps    | 840000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.28    |\n",
      "|    explained_variance | 0.119    |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 3499     |\n",
      "|    policy_loss        | -1.05    |\n",
      "|    std                | 0.874    |\n",
      "|    value_loss         | 160      |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 91.6     |\n",
      "|    ep_rew_mean        | 92.5     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10158    |\n",
      "|    iterations         | 3600     |\n",
      "|    time_elapsed       | 85       |\n",
      "|    total_timesteps    | 864000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.27    |\n",
      "|    explained_variance | 0.207    |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 3599     |\n",
      "|    policy_loss        | 1.9      |\n",
      "|    std                | 0.861    |\n",
      "|    value_loss         | 70.1     |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 87.5     |\n",
      "|    ep_rew_mean        | 92.6     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10153    |\n",
      "|    iterations         | 3700     |\n",
      "|    time_elapsed       | 87       |\n",
      "|    total_timesteps    | 888000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.26    |\n",
      "|    explained_variance | 0.296    |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 3699     |\n",
      "|    policy_loss        | 2.32     |\n",
      "|    std                | 0.854    |\n",
      "|    value_loss         | 72       |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 92.5     |\n",
      "|    ep_rew_mean        | 92.7     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10153    |\n",
      "|    iterations         | 3800     |\n",
      "|    time_elapsed       | 89       |\n",
      "|    total_timesteps    | 912000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.25    |\n",
      "|    explained_variance | 0.217    |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 3799     |\n",
      "|    policy_loss        | 0.812    |\n",
      "|    std                | 0.846    |\n",
      "|    value_loss         | 85.5     |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 83.6     |\n",
      "|    ep_rew_mean        | 92.9     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10146    |\n",
      "|    iterations         | 3900     |\n",
      "|    time_elapsed       | 92       |\n",
      "|    total_timesteps    | 936000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.25    |\n",
      "|    explained_variance | 0.0992   |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 3899     |\n",
      "|    policy_loss        | -3.14    |\n",
      "|    std                | 0.843    |\n",
      "|    value_loss         | 106      |\n",
      "------------------------------------\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 85.5     |\n",
      "|    ep_rew_mean        | 92.7     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10142    |\n",
      "|    iterations         | 4000     |\n",
      "|    time_elapsed       | 94       |\n",
      "|    total_timesteps    | 960000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.24    |\n",
      "|    explained_variance | 0.452    |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 3999     |\n",
      "|    policy_loss        | 1.36     |\n",
      "|    std                | 0.832    |\n",
      "|    value_loss         | 40.4     |\n",
      "------------------------------------\n",
      "------------------------------------\n",
      "| rollout/              |          |\n",
      "|    ep_len_mean        | 84.6     |\n",
      "|    ep_rew_mean        | 92.6     |\n",
      "| time/                 |          |\n",
      "|    fps                | 10135    |\n",
      "|    iterations         | 4100     |\n",
      "|    time_elapsed       | 97       |\n",
      "|    total_timesteps    | 984000   |\n",
      "| train/                |          |\n",
      "|    entropy_loss       | -1.22    |\n",
      "|    explained_variance | 0.554    |\n",
      "|    learning_rate      | 0.0007   |\n",
      "|    n_updates          | 4099     |\n",
      "|    policy_loss        | 1.44     |\n",
      "|    std                | 0.821    |\n",
      "|    value_loss         | 31.6     |\n",
      "------------------------------------\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<stable_baselines3.a2c.a2c.A2C at 0x148f17c10>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.learn(total_timesteps=1e6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "023f2a3d",
   "metadata": {},
   "outputs": [],
   "source": [
    "test_env = make_vec_env(env_name, n_envs=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "fb932be5",
   "metadata": {},
   "outputs": [],
   "source": [
    "def eval_agent(env, actor, n_steps=1000, render=True):\n",
    "    state = env.reset()\n",
    "\n",
    "    rewards, logits = [], []\n",
    "    for _ in range(n_steps):\n",
    "        if render:\n",
    "            env.render()\n",
    "\n",
    "        action = actor.predict(state)\n",
    "        next_state, reward, done, info = env.step(action[0])\n",
    "\n",
    "        rewards.append(reward)\n",
    "\n",
    "        state = next_state\n",
    "        if done:\n",
    "            break\n",
    "\n",
    "    env.close()\n",
    "    return sum(rewards)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "39f19ac3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([93.09493], dtype=float32)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eval_agent(test_env, model, n_steps=1000, render=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a95b8b0c",
   "metadata": {},
   "source": [
    "The model converges to rewards around 90 within 1e6 steps. Let's now try to repeat the result using DIY functionality."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a5397530",
   "metadata": {},
   "source": [
    "# DIY A2C on MountainCarContinuous-v0 with frameskip"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "9505a663",
   "metadata": {},
   "outputs": [],
   "source": [
    "env = gym.make(env_name)\n",
    "envs = make_vec_env(env_name, n_envs=8, \n",
    "                   wrapper_class=FrameSkip)#batch_agent_not_mc(env_name=env_name, n_envs=3)\n",
    "\n",
    "init_observation = env.reset()\n",
    "state_len = len(env.reset())\n",
    "action_len = len(env.action_space.sample())\n",
    "\n",
    "DISCOUNT = 0.99"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "591ec015",
   "metadata": {},
   "outputs": [],
   "source": [
    "num_inputs  = envs.observation_space.shape[0]\n",
    "num_outputs = len(envs.action_space.sample())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "1412c1ef",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Actor(torch.nn.Module):\n",
    "    \n",
    "    def __init__(self, obs_len=state_len, action_len=action_len):\n",
    "        super().__init__()\n",
    "        self.obs_len = obs_len\n",
    "        self.action_len = action_len\n",
    "        \n",
    "        self.lin_1 = torch.nn.Linear(self.obs_len, 256)\n",
    "        self.rel_1 = torch.nn.ReLU()\n",
    "\n",
    "        self.lin_2 = torch.nn.Linear(256, self.action_len)\n",
    "        \n",
    "        self.lin_3 = torch.nn.Linear(256, self.action_len)\n",
    "        self.elu = torch.nn.ELU()\n",
    "        \n",
    "        \n",
    "    def forward(self, x):\n",
    "        x = self.lin_1(x)\n",
    "        x = self.rel_1(x)\n",
    "\n",
    "        mu = self.lin_2(x)\n",
    "        \n",
    "        x = self.lin_3(x)\n",
    "        sigma = self.elu(x) + 1.000001\n",
    "        \n",
    "        return mu, sigma\n",
    "    \n",
    "    def act(self, observation):\n",
    "        (mu, sigma) = self.forward(observation)\n",
    "        dist = torch.distributions.normal.Normal(mu, sigma)\n",
    "        action = dist.sample()\n",
    "        logit = dist.log_prob(action)   \n",
    "        entropy = dist.entropy()\n",
    "        return action, logit, entropy\n",
    "    \n",
    "\n",
    "class Critic(torch.nn.Module):\n",
    "    \n",
    "    def __init__(self, obs_len=state_len):\n",
    "        super().__init__()\n",
    "        self.obs_len = obs_len\n",
    "        self.lin_1 = torch.nn.Linear(self.obs_len, 256)\n",
    "        self.rel_1 = torch.nn.ReLU()\n",
    "        self.drop = torch.nn.Dropout(p=0.15)\n",
    "        self.lin_2 = torch.nn.Linear(256, 1)\n",
    "    \n",
    "    def forward(self, x):\n",
    "        x = self.lin_1(x)\n",
    "        x = self.rel_1(x)\n",
    "        x = self.drop(x)\n",
    "        x = self.lin_2(x)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "e7af72f1",
   "metadata": {},
   "outputs": [],
   "source": [
    "def eval_agent(actor, n_steps=300, render=True):\n",
    "    state = env.reset()\n",
    "\n",
    "    rewards, logits = [], []\n",
    "    for _ in range(n_steps):\n",
    "        if render:\n",
    "            env.render()\n",
    "\n",
    "        action, _, _ = actor.act(torch.tensor(state, dtype=torch.float32))\n",
    "        next_state, reward, done, info = env.step([action.detach().numpy()[0]])\n",
    "\n",
    "        rewards.append(reward)\n",
    "\n",
    "        state = next_state\n",
    "        if done:\n",
    "            break\n",
    "\n",
    "    env.close()\n",
    "    return sum(rewards)\n",
    "\n",
    "def calc_cum_rewards(next_state_vals, rewards, dones, discount=DISCOUNT):\n",
    "    res = []\n",
    "    G = next_state_vals.T\n",
    "    for done, el in zip(dones.flip(0), rewards.flip(0)):\n",
    "        G = el + discount * G * done\n",
    "        res.insert(0, G)\n",
    "    return torch.stack(res).squeeze()\n",
    "\n",
    "def calc_losses(rewards, state_values, next_state_value, logits, entropies, dones, DISCOUNT):\n",
    "    rewards = torch.tensor(rewards, dtype=torch.float32)\n",
    "    dones = torch.tensor(dones, dtype=torch.float32).squeeze()\n",
    "\n",
    "    cum_rewards = calc_cum_rewards(next_state_value, rewards, dones, discount=DISCOUNT)\n",
    "    stacked_state_values = torch.stack(state_values).squeeze()\n",
    "    stacked_logits = torch.stack(logits).squeeze()\n",
    "\n",
    "    entropy = torch.stack(entropies).sum()\n",
    "\n",
    "    advantage = (cum_rewards - stacked_state_values).detach()\n",
    "    actor_loss =  - (stacked_logits * advantage).mean() - 0.0001 * entropy.mean()\n",
    "    critic_loss = torch.nn.functional.mse_loss(cum_rewards, \n",
    "                                               stacked_state_values)\n",
    "    return actor_loss, critic_loss\n",
    "\n",
    "def learn_one_traj(actor, critic, actor_opt, critic_opt, \n",
    "               traj_length=20, n_steps=200, discount=DISCOUNT):\n",
    "    state =  envs.reset()\n",
    "    states, rewards, logits, state_values, entropies, \\\n",
    "    next_state_values, dones, actor_losses, critic_losses = [], [], [], [], [], [], [], [], []\n",
    "    for step in range(n_steps):\n",
    "\n",
    "        #we get the action from the actor\n",
    "        action, logit, entropy = actor.act(torch.tensor(state, dtype=torch.float32))\n",
    "\n",
    "        #use the action to make a step by the env\n",
    "        next_state, reward, done, info = envs.step(action) #.detach().numpy()\n",
    "        \n",
    "        # getting state and next state values from critic\n",
    "        state_value = critic(torch.tensor(state, dtype=torch.float32))\n",
    "        next_state_value = critic(torch.tensor(next_state, dtype=torch.float32))\n",
    "\n",
    "        entropies.append(entropy)\n",
    "        rewards.append(reward)\n",
    "        logits.append(logit)\n",
    "        state_values.append(state_value)\n",
    "        next_state_values.append(next_state_value)\n",
    "\n",
    "        dones.append(1 - np.array(done))\n",
    "\n",
    "        state = next_state\n",
    "\n",
    "        # calculate losses if we made enough steps for 1 trajectory\n",
    "        if (step % traj_length == 0) and step > 1:\n",
    "            if len(next_state_value.shape) < 2: next_state_value = next_state_value.unsqueeze(0)\n",
    "            actor_loss, critic_loss = calc_losses(rewards[-traj_length:], \n",
    "                                                  state_values[-traj_length:], \n",
    "                                                  next_state_value, \n",
    "                                                  logits[-traj_length:],\n",
    "                                                  entropies[-traj_length:],\n",
    "                                                  dones[-traj_length:],\n",
    "                                                  discount)\n",
    "            actor_losses.append(actor_loss)\n",
    "            critic_losses.append(critic_loss)\n",
    "\n",
    "            actor_opt.zero_grad()\n",
    "            actor_loss.backward()\n",
    "            actor_opt.step()\n",
    "\n",
    "            critic_opt.zero_grad()\n",
    "            critic_loss.backward()\n",
    "            critic_opt.step()\n",
    "\n",
    "    out = (states, rewards, logits, state_values, next_state_values, dones, \n",
    "           actor_losses, critic_losses, entropies)\n",
    "    return out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "f32d43f7",
   "metadata": {},
   "outputs": [],
   "source": [
    "actor = Actor()\n",
    "critic = Critic()\n",
    "lr = 7e-4\n",
    "actor_opt = torch.optim.Adam(actor.parameters(),   lr=lr)\n",
    "critic_opt = torch.optim.Adam(critic.parameters(), lr=lr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "ce128bcd",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABlgAAAIQCAYAAADttGNfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3gU5doG8Ht7spveEwghBARCb0IoIhBBDNiwgKiIWI6CihwbfjbQI3YRxXoUPAr2jggCIkqHANIhEEgC6T3ZJFvn+2N3JyxJIGWT2c3ev+vaSzIzO/POBsmb95nneWSCIAggIiIiIiIiIiIiIiKiRpNLPQAiIiIiIiIiIiIiIiJPwwALERERERERERERERFREzHAQkRERERERERERERE1EQMsBARERERERERERERETURAyxERERERERERERERERNxAALERERERERERERERFREzHAQkRERERERERERERE1EQMsBARERERERERERERETURAyxERERERERERERERERNxAALEbmdyy+/HJdffrnUwyAiIiJqsTvuuAOdO3eWehhERETUxpqyttFa84XnnnsOMpnM5ecloloMsJDXWL58OWQyGWQyGTZv3lxnvyAIiI2NhUwmw6RJkyQYIXmzjz76CKNHj0ZkZCQ0Gg3i4+Mxc+ZMnD59us6xjr/H579eeumlOseePXsWN910E4KCghAQEIBrrrkG6enpbXBHRETUVjjHubDVq1fjueeek3oYRERE7RrnIxeXnZ2N5557Dvv27ZN6KETkQkqpB0DU1nx8fLBy5UqMHDnSafumTZtw5swZaDQaiUZG3mzv3r2Ij4/H1VdfjeDgYJw6dQofffQRVq1ahX/++QcxMTFOx19xxRW4/fbbnbYNGDDA6evKykqMGTMGZWVlePLJJ6FSqfDmm29i9OjR2LdvH0JDQ1v9voiIqO1wjlO/1atXY+nSpQyyEBERtQHOR2r9/vvvTl9nZ2djwYIF6Ny5M/r37++076OPPoLVam3D0RGRqzDAQl7nqquuwjfffIMlS5ZAqaz9X2DlypUYNGgQCgsLJRxdywmCgJqaGvj6+ko9lAbp9XrodDqph+FW3n333Trbrr32WgwePBj/+9//8MQTTzjtu+SSS3Drrbde9JxpaWnYuXMnhgwZAgCYOHEievfujddffx0vvvii626AiIgk197nOO7EarXCaDTCx8dH6qEQERG5Fc5HgKqqKmi1WqjV6ka/R6VSteKIiKg1sUQYeZ1p06ahqKgI69atE7cZjUZ8++23uOWWW+p9j9VqxeLFi9GrVy/4+PggMjIS9957L0pKSpyO++mnn5CSkoKYmBhoNBokJCTg+eefh8VicTru8ssvR+/evXH48GGMGTMGWq0WHTp0wCuvvNLk++ncuTMmTZqEtWvXYvDgwfD19cUHH3wAACgtLcXcuXMRGxsLjUaDrl274uWXX3Z6KmLgwIG4/vrrnc7Zp08fyGQy7N+/X9z21VdfQSaT4ciRIwCAjIwM3H///ejevTt8fX0RGhqKG2+8sU5JK0ea8KZNm3D//fcjIiICHTt2FPd/+OGHSEhIgK+vLy699FL8/fff9d7n22+/jV69ekGr1SI4OBiDBw/GypUrm/x5Ofz2228YNWoUdDod/P39kZKSgkOHDjkdc8cdd8DPzw/p6emYMGECdDodYmJisHDhQgiCcNFrlJWV4ejRoygrK2vWGB31V0tLS+vdX11djZqamgbf/+2332LIkCFicAUAevTogXHjxuHrr79u1piIiMh9NXWO487zm8ZeEwB27NiBq666CsHBwdDpdOjbty/eeustALaf5UuXLgXgXGLTQa/X49///rc4V+revTtee+21Oj/nZTIZ5syZgxUrVqBXr17QaDRYs2ZNk++rqdddt24dRo4ciaCgIPj5+aF79+548sknnY5pzBzp7NmzuPPOO8VSpL169cInn3xSZ1yunm8REZH3aU/zEcC2djB69Gj4+/sjICAAQ4YMcfrZ6LheamoqLrvsMmi1WvFn9bk9WP7880/xd/OZM2eKc5Lly5cDqL8Hi9VqxVtvvYU+ffrAx8cH4eHhuPLKK7F79+5m3YuD2WzG888/j4SEBGg0GnTu3BlPPvkkDAaD03G7d+/GhAkTEBYWBl9fX8THx+POO+90OubLL7/EoEGDxM+nT58+4jzMoTFrU409F5E7YoCFvE7nzp2RlJSEL774Qtz222+/oaysDFOnTq33Pffeey8effRRjBgxAm+99RZmzpyJFStWYMKECTCZTOJxy5cvh5+fH+bNm4e33noLgwYNwjPPPFMn+wAASkpKcOWVV6Jfv354/fXX0aNHDzz++OP47bffmnxPx44dw7Rp03DFFVfgrbfeQv/+/VFVVYXRo0fj888/x+23344lS5ZgxIgRmD9/PubNmye+d9SoUU71UYuLi3Ho0CHI5XKnYMfff/+N8PBw9OzZEwCwa9cubN26FVOnTsWSJUvwr3/9Cxs2bMDll1+OqqqqOmO8//77cfjwYafP4+OPP8a9996LqKgovPLKKxgxYgSuvvpqZGVlOb33o48+woMPPojExEQsXrwYCxYsQP/+/bFjx44mf1YA8NlnnyElJQV+fn54+eWX8fTTT+Pw4cMYOXJknQCRxWLBlVdeicjISLzyyisYNGgQnn32WTz77LMXvc4PP/yAnj174ocffmj02IqKipCfn4/du3dj5syZAIBx48bVOW758uXQ6XTw9fVFYmJincUPq9WK/fv3Y/DgwXXee+mll+LkyZOoqKho9LiIiMj9NXWO487zm8Zec926dbjssstw+PBhPPTQQ3j99dcxZswYrFq1SrzHK664AoDt57/jBdiyfq+++mq8+eabuPLKK/HGG2+ge/fuePTRR53mSg5//PEHHn74Ydx888146623mt2ItrHXPXToECZNmgSDwYCFCxfi9ddfx9VXX40tW7aIxzRmjpSXl4dhw4Zh/fr1mDNnDt566y107doVs2bNwuLFi5t0LiIiootpb/ORlJQUFBcXY/78+XjppZfQv3//Og9ZFBUVYeLEiejfvz8WL16MMWPG1DlXz549sXDhQgDAPffcI85JLrvssgavP2vWLDEw8fLLL+OJJ56Aj48Ptm/f3qT7ON9dd92FZ555BgMHDhTLiC9atMjp+5Ofn4/x48fj9OnTeOKJJ/D2229j+vTpTtdet24dpk2bhuDgYLz88st46aWXcPnllzvNVRq7NtWYcxG5LYHISyxbtkwAIOzatUt45513BH9/f6GqqkoQBEG48cYbhTFjxgiCIAhxcXFCSkqK+L6///5bACCsWLHC6Xxr1qyps91xvnPde++9glarFWpqasRto0ePFgAI//vf/8RtBoNBiIqKEqZMmdKk+4qLixMACGvWrHHa/vzzzws6nU44fvy40/YnnnhCUCgUQmZmpiAIgvDNN98IAITDhw8LgiAIP//8s6DRaISrr75auPnmm8X39e3bV7juuusueK/btm2rc1+Oz33kyJGC2WwWtxuNRiEiIkLo37+/YDAYxO0ffvihAEAYPXq0uO2aa64RevXq1ZSPpUEVFRVCUFCQ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8eHFi2XByGQyfPvtt9i+fTt++eUXrF27FnfeeSdef/11bN++HX5+foiIiMC+ffuwdu1a/Pbbb/jtt9+wbNky3H777fj0008BNH5tqjHnInJX7rOSSNTGrrvuOtx7773Yvn07vvrqqwaPS0hIwPr16zFixIgL/tD8888/UVRUhO+//96pSdmpU6dcOu7GSkhIQGVlJZKTky967KhRo7Bs2TJ8+eWXsFgsGD58OORyOUaOHCkGWIYPH+40Sfn2228xY8YMvP766+K2mpoalJaWNmp8cXFxAGxPM5ybTWIymXDq1Cn069fP6XidToebb74ZN998M4xGI66//nr85z//wfz58+uk615IQkICANsP78Z8NlarFenp6U4BqePHjwNAs5vbNkV1dXW9WSjnc6Q6Oyagcrkcffr0we7du+scu2PHDnTp0qXOk7NERNQ+NGaO487zm8Ze0/Ez/eDBgxf8md7QAkJcXBzWr1+PiooKp5+JjjIjjrmKqzXlunK5HOPGjcO4cePwxhtv4MUXX8T//d//YePGjeI9X2iOFB4eDn9/f1gslkbNe1w13yIiIvL0+ci584zzsz2aqymlvRISErB27VoUFxe7NIslLi4OVqsVaWlpYvYsAOTl5aG0tLTO/GfYsGEYNmwY/vOf/2DlypWYPn06vvzyS9x1110AbBU1Jk+ejMmTJ8NqteL+++/HBx98gKeffhpdu3Zt0trUxc5F5K7Yg4W8lp+fH9577z0899xzmDx5coPH3XTTTbBYLHj++efr7DObzWJAwRF8OPeJCKPRiHfffde1A2+km266Cdu2bcPatWvr7CstLYXZbBa/dpT+evnll9G3b1+xB8qoUaOwYcMG7N6926k8GGC73/Of/nj77bdhsVgaNb7BgwcjPDwc77//PoxGo7h9+fLldYI0RUVFTl+r1WokJiZCEIQGa4E2ZMKECQgICMCLL75Y73sLCgrqbHvnnXfEPwuCgHfeeQcqlQrjxo0Tt588eVJMIXYoKyvD0aNH6y2Zdi6z2YySkpI623fu3IkDBw5g8ODBFxxfRUUFFi9ejLCwMAwaNEjcfsMNN2DXrl1OQZZjx47hjz/+wI033njBMRERkedqzBzHnec3jb3mwIEDER8fj8WLF9eZO5z7Xp1OBwB1jrnqqqtgsVicfs4DwJtvvgmZTIaJEye29Fbq1djrOrJSz9W/f38AtSVALzZHUigUmDJlCr777jscPHiwzvnOnVe4cr5FRETk6fOR8ePHw9/fH4sWLRLLbDs0NxOmoTlJfaZMmQJBEOrNIm1JJs5VV10FAFi8eLHT9jfeeAMAkJKSAgAoKSmpc52LzUPkcrmYGes4prFrU405F5G7YgYLebWGSiWca/To0bj33nuxaNEi7Nu3D+PHj4dKpUJaWhq++eYbvPXWW7jhhhswfPhwBAcHY8aMGXjwwQchk8nw2WeftVoK6sU8+uij+PnnnzFp0iTccccdGDRoEPR6PQ4cOIBvv/0Wp0+fRlhYGACga9euiIqKwrFjx/DAAw+I57jsssvw+OOPA0CdAMukSZPw2WefITAwEImJidi2bRvWr1+P0NDQRo1PpVLhhRdewL333ouxY8fi5ptvxqlTp7Bs2bI6PU/Gjx+PqKgojBgxApGRkThy5AjeeecdpKSkOD35KZPJMHr0aPz5558NXjcgIADvvfcebrvtNgwcOBBTp05FeHg4MjMz8euvv2LEiBFOCx4+Pj5Ys2YNZsyYgaFDh+K3337Dr7/+iieffNKphqgj2HJuX5YffvgBM2fOxLJlyy7Y6L6yshKxsbG4+eab0atXL+h0Ohw4cADLli1DYGAgnn76afHYpUuX4scff8TkyZPRqVMn5OTk4JNPPkFmZiY+++wzp7qv999/Pz766COkpKTgkUcegUqlwhtvvIHIyEixgR0REbVPF5vjuPP8prHXlMvleO+99zB58mT0798fM2fORHR0NI4ePYpDhw6Jv8g7Hj548MEHMWHCBCgUCkydOhWTJ0/GmDFj8H//9384ffo0+vXrh99//x0//fQT5s6dKz656mqNve7ChQvx119/ISUlBXFxccjPz8e7776Ljh07YuTIkQAaN0d66aWXsHHjRgwdOhR33303EhMTUVxcjD179mD9+vViIKex8y0iIqLG8uT5SEBAAN58803cddddGDJkCG655RYEBwfjn3/+QVVVVbPKViUkJCAoKAjvv/8+/P39odPpMHTo0Hr7vI0ZMwa33XYblixZgrS0NFx55ZWwWq1i39yLlRFvSL9+/TBjxgx8+OGHYum1nTt34tNPP8W1114r9oX99NNP8e677+K6665DQkICKioq8NFHHyEgIEAM0tx1110oLi7G2LFj0bFjR2RkZODtt99G//79xeyY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5gxiYmIade3y8nIEBgairKwMAQEBrXJ/REREnoY/HxtHrVZj8ODB2Lp1q7jtwQcfxK5du7Bt27Z63/Pcc89hwYIFdbbzsyYiIqrFuUjb4WdNRERUlyt+PrZqBsuFnDp1Crm5uUhOTha3BQYGYujQoeJixbZt2xAUFCQGVwAgOTkZcrkcO3bsaPMxExERkfeJjo5GYmKi07aePXsiMzOzwffMnz8fZWVl4isrK6u1h0lEREREREREbUyyJve5ubkAgMjISKftkZGR4r7c3FxEREQ47VcqlQgJCRGPqY/BYIDBYBC/ZlkOIiIiaq4RI0bg2LFjTtuOHz+OuLi4Bt+j0Wig0Whae2hEREREREREJCHJMlha06JFixAYGCi+YmNjpR4SEREReaiHH34Y27dvx4svvogTJ05g5cqV+PDDDzF79myph0ZEREREREREEpIswBIVFQUAyMvLc9qel5cn7ouKikJ+fr7TfrPZjOLiYvGY+rAsBxEREbnKkCFD8MMPP+CLL75A79698fzzz2Px4sWYPn261EMjIiIiIiIiIglJViIsPj4eUVFR2LBhA/r37w/AVsprx44duO+++wAASUlJKC0tRWpqKgYNGgQA+OOPP2C1WjF06NAGz82yHERERORKkyZNwqRJk6QeBhERERERERG5kVbNYKmsrMS+ffuwb98+ALbG9vv27UNmZiZkMhnmzp2LF154AT///DMOHDiA22+/HTExMbj22msB2BrIXnnllbj77ruxc+dObNmyBXPmzMHUqVMRExPTmkMnIiIiIiIiImoRi8WCp59+GvHx8fD19UVCQgKef/55CIIgHiMIAp555hlER0fD19cXycnJSEtLczpPcXExpk+fjoCAAAQFBWHWrFmorKxs69shIiKi87RqgGX37t0YMGAABgwYAACYN28eBgwYgGeeeQYA8Nhjj+GBBx7APffcgyFDhqCyshJr1qyBj4+PeI4VK1agR48eGDduHK666iqMHDkSH374YWsOm4iIiIiIiIioxV5++WW89957eOedd3DkyBG8/PLLeOWVV/D222+Lx7zyyitYsmQJ3n//fezYsQM6nQ4TJkxATU2NeMz06dNx6NAhrFu3DqtWrcJff/2Fe+65R4pbIiIionPIhHMfm2inysvLERgYiLKyMgQEBEg9HCIiIrfAn49th581ERFRXd7w83HS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DtFPzhgsd6NPKW30XjxUmiNJZ47I15kj8lVa2aDXFpfola9LtOtgvZ7/Ypv+tmi7Lp/cR7ecMTi4fgmgY7jbdILZ4N5uswSzViR/hDnD4V/kaN6HJdhozUYKHgAAseZnP/uZevXqFe1hHKamoakHCwAA6Fo++eQTfetb31KvXr1ksVj0xhtvtHjeMAzdc8896tmzp1JSUjRt2jRt3LixxTH79+/X5ZdfrszMTGVnZ+u6665TTU1NBK8iPBxhymDx0OQeccxmtbQ7uHKogiynfnzGYH3ys9P0wg+O12lDc+X1Gfrrwu069eEFmvPRpg4HPH0+Q68tLtFtry7XpvLY/70EHAvuNp1glgfrnuY4rKlsZiDgYma4SDS5BwAgVr377rv64IMP9Mgjj0R7KIepCpYIa7sHCwAAiI7a2lqNHTtWc+bMafX5hx56SI8//rieeuopffnll0pLS9P06dPV0NDUuPryyy/X6tWrNXfuXL399tv65JNPdMMNN0TqEsLGafZgCXGTexdrL8AR2awWnTokV89de7z+fv0JGt07SzWuRj38/nqd9sgC/WvJTvl8xlHPs3ZPlb77p4X66T9X6vVlu3ThnM81f11ZBK4A6FrY6tgJZoP73IzDU+gyU+zadbC+9QwWbvIAAMSMsrIyXX/99XrjjTeUmprarte4XC65XK7g91VVVeEaHiXCAADows455xydc845rT5nGIZ+97vf6e6779b5558vSfrrX/+q/Px8vfHGG7r00ku1du1avffee/r66681adIkSdITTzyhc889V4888kiXzK5tLzODpSGETe4NwwiuvdhtlqMcDaB4YHe9OXOK/rNitx5+f712HazX7a+t0JyPNunc0T119qgCjeyV2WJjeY2rUY/N3aDnv9gmr89QarJN/bqnac2eKl33wmL9dPpQ3XTqwMM2owPxipX+TjADLD3Skw97LjOwyFFFgAUAgJhlGIauueYa3XjjjcFFjfaYPXu2srKygl9FRUVhG2NTgIUMFgAAYsnWrVtVWlqqadOmBR/LysrS5MmTtXDhQknSwoULlZ2d3WIeMm3aNFmtVn355ZdtntvlcqmqqqrFV1dj9qcNZQZLY7Nd9w7KswPtYrVadMH43pp3+6m685xhynAmaUtFrf7w0Sad98RnOvmhj/Srt9doyfb9envlbp3x2wV69rOt8voMnTu6QPNuP1VvzJyiyyf3kWFID723Xj95Zbnq3aHNTgO6Klb6O8HswdKjlSZQZk8WM4PFMIymEmE0WgMAIKruvPNOWSyWI36tW7dOTzzxhKqrq3XXXXd16Px33XWXKisrg18lJSVhuhKpxmWWCCODBQCAWFJaWipJys/Pb/F4fn5+8LnS0lLl5eW1eD4pKUndunULHtOaSG72OFZOe+h7sLibnYvNrUDHOO023XjqQH1x5+n6/aXjdPbIAjntVu08UK9nPtuqi59cqJtfXqayKpf6dk/V89cepz9ePlE9s1KUnGTVry8crV9dMEpJVoveWrFb33nqC+06WB/tywLCjk/inbA30IOlRxslwqSmuugubvIAAHQZt99+u6655pojHjNgwADNnz9fCxculMPR8l4/adIkXX755XrhhRdafa3D4TjsNeFCiTAAAHCou+66S7NmzQp+X1VV1eWCLGYGSyhLhDUPsFAiDDg2GU67zh/XW+eP6616t1cfbyjXe6tKNW9tuVxen340daBuPHVgMEja3BUn9NXgvHT96KWlWr27St9+4jOdMLC7nEk2OezW4H/Tkm06e1SBBuVltGtMa/dUqbSyQScP7qEkNq6ji+GTeCc0lQg7egaLmb0iNU0iAABAdOTm5io3N/eoxz3++OP61a9+Ffx+9+7dmj59ul599VVNnjw5nENsNwIsAADEpoKCAkn+fm89e/YMPl5WVqZx48YFjykvL2/xusbGRu3fvz/4+tZEcrPHsQpHiTBPYO3FahGLsEAIpCTbdPaonjp7VE95vD5ZdPR/W5MHdNebN0/RDX9dojV7qvTflXtaPW7OR5v1+GXjdeaI/FafN722uET/7/Vv5PEa6pnl1OWT++jS4/u0uh57rAzD0Beb96kwJ0V9u6eF7LxIDHwS74RgBkurPVgCGSz1/kWPFmmq3OQBAIgJffr0afF9enq6JGngwIEqLCyMxpAOUx3Ils1w0IMFAIBY0r9/fxUUFGjevHnBgEpVVZW+/PJL3XTTTZKk4uJiHTx4UEuWLNHEiRMlSfPnz5fP5+symz2OVbBEWAgzWFz0vgXCxt6B9czCnFT966YT9cGaUh2odauh0SeXx6eGRq8aPF6t3FmpJdsP6Ia/LdbPZ4zQtVP6yWJpmXXm8xl6+IP1enLBZkmS027VnsoGPfLBBj0+b5NmjOmpq4r7anyfHFU1eLRmd5VW7arU6sB/S6saNGN0T918+iAV5qS2OdYVJQd131urtXTHQaU7kvTctcfpuH7djnqNOw/Uacn2AyrIdKpP91TlZzhltZI5l4gIsHSCmcGS22oGS6DJfWDRwwyw2G0W/rEBAICQMTNY0slgAQCgy6mpqdGmTZuC32/dulXLly9Xt27d1KdPH91666361a9+pcGDB6t///76+c9/rl69eumCCy6QJA0fPlxnn322rr/+ej311FPyeDy6+eabdemll6pXr15RuqrQcNhDn8FiVg/pyEIwgPBISbbp/HG9W33O4/XpnjdX6+9f7dD9b6/R9n21+vl5I4LZMfVur257dbneW+3vNfXj0wdp5mmD9O6qPXrhi+1aXnJQry/bpdeX7VJuhiO4Cf5Qr3xdon8t3alLj+ujmacNUkGWM/hcaWWDHnp/nf69dFfwsRpXo6569is9e80knTiwR5vX9t6qPZr1jxWqczf9/kpOsqookAEzKC9dPzypv/IynW2eI9TcjT69u2qPNpRV64cnDVBO2uEJAQiPsN1xfv3rX+vEE09UamqqsrOzWz1mx44dmjFjhlJTU5WXl6ef/vSnamxsbHHMggULNGHCBDkcDg0aNEjPP/98uIbcYWaT+9wj9WCpbxlgIXsFAIDY1a9fPxmGEdxl2hVUuygRBgBAV7V48WKNHz9e48ePlyTNmjVL48eP1z333CNJ+tnPfqYf//jHuuGGG3TccceppqZG7733npzOpkW5l156ScOGDdMZZ5yhc889VyeddJKefvrpqFxPKDmSQp/BYpYIozQ70LXZbVY9cOEo/b9zh0mSXli4XTf8bYlqXY0qq2rQd/+0UO+tLlWyzapHvztWt581VE67TReOL9QbM6fozZlTdPGEQiUnWYPBld7ZKTprRL5mnTlEf7lmkl764WRNGdRdHq+hvy3arlMe/kj3v7VGJfvr9MS8jTrtkQXB4MpFE3prwf9O1cmDe6je49W1z32tjzfsPWzcPp+hx+Zu0I0vLlWd26sBuWnq2z1VSVaL3I0+bd5bq/nryvX0J1t07uOf6tONh58j1EorG/ToB+t14oPzdcsryzXno8266MkvtGNfXdjfG35h+yTudrt1ySWXqLi4WM8+++xhz3u9Xs2YMUMFBQX64osvtGfPHl111VWy2+164IEHJPl3dsyYMUM3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\n",
      "text/plain": [
       "<Figure size 2000x600 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[47], line 6\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[38;5;66;03m# mean_rewards, all_actor_losses, all_critic_losses, mean_critic_losses, mean_actor_losses = \\\u001b[39;00m\n\u001b[1;32m      2\u001b[0m \u001b[38;5;66;03m#     [], [], [], [], []\u001b[39;00m\n\u001b[1;32m      4\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m ep \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;28mint\u001b[39m(\u001b[38;5;241m2e3\u001b[39m)): \u001b[38;5;66;03m#\u001b[39;00m\n\u001b[1;32m      5\u001b[0m     states, rewards, logits, state_values, next_state_values, dones, actor_losses, critic_losses, entropies \u001b[38;5;241m=\u001b[39m \\\n\u001b[0;32m----> 6\u001b[0m             \u001b[43mlearn_one_traj\u001b[49m\u001b[43m(\u001b[49m\u001b[43mactor\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcritic\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mactor_opt\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcritic_opt\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtraj_length\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m50\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mn_steps\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m500\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m      9\u001b[0m     \u001b[38;5;66;03m################## progress plotting ##################\u001b[39;00m\n\u001b[1;32m     10\u001b[0m     all_actor_losses\u001b[38;5;241m.\u001b[39mappend(torch\u001b[38;5;241m.\u001b[39mstack(actor_losses)\u001b[38;5;241m.\u001b[39mmedian()\u001b[38;5;241m.\u001b[39mdetach()\u001b[38;5;241m.\u001b[39mnumpy())\n",
      "Cell \u001b[0;32mIn[40], line 57\u001b[0m, in \u001b[0;36mlearn_one_traj\u001b[0;34m(actor, critic, actor_opt, critic_opt, traj_length, n_steps, discount)\u001b[0m\n\u001b[1;32m     53\u001b[0m         action, logit, entropy \u001b[38;5;241m=\u001b[39m actor\u001b[38;5;241m.\u001b[39mact(torch\u001b[38;5;241m.\u001b[39mtensor(state, dtype\u001b[38;5;241m=\u001b[39mtorch\u001b[38;5;241m.\u001b[39mfloat32))\n\u001b[1;32m     54\u001b[0m \u001b[38;5;66;03m#         print(action)\u001b[39;00m\n\u001b[1;32m     55\u001b[0m \n\u001b[1;32m     56\u001b[0m         \u001b[38;5;66;03m#use the action to make a step by the env\u001b[39;00m\n\u001b[0;32m---> 57\u001b[0m         next_state, reward, done, info \u001b[38;5;241m=\u001b[39m \u001b[43menvs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstep\u001b[49m\u001b[43m(\u001b[49m\u001b[43maction\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m#.detach().numpy()\u001b[39;00m\n\u001b[1;32m     59\u001b[0m         \u001b[38;5;66;03m# getting state and next state values from critic\u001b[39;00m\n\u001b[1;32m     60\u001b[0m         state_value \u001b[38;5;241m=\u001b[39m critic(torch\u001b[38;5;241m.\u001b[39mtensor(state, dtype\u001b[38;5;241m=\u001b[39mtorch\u001b[38;5;241m.\u001b[39mfloat32))\n",
      "File \u001b[0;32m~/.local/share/virtualenvs/RL_in_ksp--361CVkw/lib/python3.9/site-packages/stable_baselines3/common/vec_env/base_vec_env.py:163\u001b[0m, in \u001b[0;36mVecEnv.step\u001b[0;34m(self, actions)\u001b[0m\n\u001b[1;32m    156\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m    157\u001b[0m \u001b[38;5;124;03mStep the environments with the given action\u001b[39;00m\n\u001b[1;32m    158\u001b[0m \n\u001b[1;32m    159\u001b[0m \u001b[38;5;124;03m:param actions: the action\u001b[39;00m\n\u001b[1;32m    160\u001b[0m \u001b[38;5;124;03m:return: observation, reward, done, information\u001b[39;00m\n\u001b[1;32m    161\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m    162\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstep_async(actions)\n\u001b[0;32m--> 163\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstep_wait\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/.local/share/virtualenvs/RL_in_ksp--361CVkw/lib/python3.9/site-packages/stable_baselines3/common/vec_env/dummy_vec_env.py:54\u001b[0m, in \u001b[0;36mDummyVecEnv.step_wait\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m     52\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mstep_wait\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m VecEnvStepReturn:\n\u001b[1;32m     53\u001b[0m     \u001b[38;5;28;01mfor\u001b[39;00m env_idx \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnum_envs):\n\u001b[0;32m---> 54\u001b[0m         obs, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbuf_rews[env_idx], \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbuf_dones[env_idx], \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbuf_infos[env_idx] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43menvs\u001b[49m\u001b[43m[\u001b[49m\u001b[43menv_idx\u001b[49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstep\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m     55\u001b[0m \u001b[43m            \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mactions\u001b[49m\u001b[43m[\u001b[49m\u001b[43menv_idx\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m     56\u001b[0m \u001b[43m        \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     57\u001b[0m         \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbuf_dones[env_idx]:\n\u001b[1;32m     58\u001b[0m             \u001b[38;5;66;03m# save final observation where user can get it, then reset\u001b[39;00m\n\u001b[1;32m     59\u001b[0m             \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbuf_infos[env_idx][\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mterminal_observation\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m obs\n",
      "File \u001b[0;32m~/.local/share/virtualenvs/RL_in_ksp--361CVkw/lib/python3.9/site-packages/rl_zoo3/wrappers.py:269\u001b[0m, in \u001b[0;36mFrameSkip.step\u001b[0;34m(self, action)\u001b[0m\n\u001b[1;32m    267\u001b[0m done \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m    268\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m _ \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_skip):\n\u001b[0;32m--> 269\u001b[0m     obs, reward, done, info \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43menv\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstep\u001b[49m\u001b[43m(\u001b[49m\u001b[43maction\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    270\u001b[0m     total_reward \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m reward\n\u001b[1;32m    271\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m done:\n",
      "File \u001b[0;32m~/.local/share/virtualenvs/RL_in_ksp--361CVkw/lib/python3.9/site-packages/stable_baselines3/common/monitor.py:94\u001b[0m, in \u001b[0;36mMonitor.step\u001b[0;34m(self, action)\u001b[0m\n\u001b[1;32m     92\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mneeds_reset:\n\u001b[1;32m     93\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTried to step environment that needs reset\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m---> 94\u001b[0m observation, reward, done, info \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43menv\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstep\u001b[49m\u001b[43m(\u001b[49m\u001b[43maction\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     95\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrewards\u001b[38;5;241m.\u001b[39mappend(reward)\n\u001b[1;32m     96\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m done:\n",
      "File \u001b[0;32m~/.local/share/virtualenvs/RL_in_ksp--361CVkw/lib/python3.9/site-packages/gym/wrappers/time_limit.py:18\u001b[0m, in \u001b[0;36mTimeLimit.step\u001b[0;34m(self, action)\u001b[0m\n\u001b[1;32m     14\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mstep\u001b[39m(\u001b[38;5;28mself\u001b[39m, action):\n\u001b[1;32m     15\u001b[0m     \u001b[38;5;28;01massert\u001b[39;00m (\n\u001b[1;32m     16\u001b[0m         \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_elapsed_steps \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m     17\u001b[0m     ), \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCannot call env.step() before calling reset()\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m---> 18\u001b[0m     observation, reward, done, info \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43menv\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstep\u001b[49m\u001b[43m(\u001b[49m\u001b[43maction\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     19\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_elapsed_steps \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[1;32m     20\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_elapsed_steps \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_max_episode_steps:\n",
      "File \u001b[0;32m~/.local/share/virtualenvs/RL_in_ksp--361CVkw/lib/python3.9/site-packages/gym/envs/classic_control/continuous_mountain_car.py:120\u001b[0m, in \u001b[0;36mContinuous_MountainCarEnv.step\u001b[0;34m(self, action)\u001b[0m\n\u001b[1;32m    117\u001b[0m     reward \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m100.0\u001b[39m\n\u001b[1;32m    118\u001b[0m reward \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m=\u001b[39m math\u001b[38;5;241m.\u001b[39mpow(action[\u001b[38;5;241m0\u001b[39m], \u001b[38;5;241m2\u001b[39m) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m0.1\u001b[39m\n\u001b[0;32m--> 120\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43marray\u001b[49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[43mposition\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvelocity\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfloat32\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    121\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate, reward, done, {}\n",
      "File \u001b[0;32m~/.local/share/virtualenvs/RL_in_ksp--361CVkw/lib/python3.9/site-packages/torch/_tensor.py:958\u001b[0m, in \u001b[0;36mTensor.__array__\u001b[0;34m(self, dtype)\u001b[0m\n\u001b[1;32m    956\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnumpy()\n\u001b[1;32m    957\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 958\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnumpy\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mastype\u001b[49m(dtype, copy\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "mean_rewards, all_actor_losses, all_critic_losses, mean_critic_losses, mean_actor_losses = \\\n",
    "    [], [], [], [], []\n",
    "\n",
    "for ep in range(int(2e3)): #\n",
    "    states, rewards, logits, state_values, next_state_values, dones, actor_losses, critic_losses, entropies = \\\n",
    "            learn_one_traj(actor, critic, actor_opt, critic_opt, traj_length=50, n_steps=500)\n",
    "    \n",
    "    \n",
    "    ################## progress plotting ##################\n",
    "    all_actor_losses.append(torch.stack(actor_losses).median().detach().numpy())\n",
    "    all_critic_losses.append(torch.stack(critic_losses).median().detach().numpy())\n",
    "    \n",
    "    ave_over=10\n",
    "    if ep%ave_over==0:\n",
    "        mean_critic_losses.append(np.median(all_critic_losses[-ave_over:]))\n",
    "        mean_actor_losses.append(np.median(all_actor_losses[-ave_over:]))\n",
    "        mean_rewards.append(np.median([eval_agent(actor, n_steps=1000, render=False) for _ in range(30)]))\n",
    "        \n",
    "        clear_output()\n",
    "        fig, ax = plt.subplots(1, 3, figsize=(20, 6))\n",
    "        ax[0].plot(mean_rewards); ax[0].set_title(f'Mean_rewards, ep.: {ep}')\n",
    "        ax[0].hlines(0, 0, len(mean_rewards), color='red')\n",
    "        ax[0].hlines(70, 0, len(mean_rewards), color='orange')\n",
    "        ax[0].hlines(90, 0, len(mean_rewards), color='green')\n",
    "        \n",
    "        ax[1].plot(mean_actor_losses); ax[1].set_title('Mean_actor_losses')\n",
    "        ax[2].plot(mean_critic_losses); ax[2].set_title('Mean_critic_losses')\n",
    "        plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6a0b2914",
   "metadata": {},
   "source": [
    "The agent repeats the baseline results."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "e5658d30",
   "metadata": {},
   "outputs": [],
   "source": [
    "test_res = [eval_agent(actor, n_steps=1000, render=False) for _ in range(1000)]\n",
    "med = np.median(test_res)\n",
    "std = np.std(test_res)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "b4d44584",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "90.98183966439393"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "med"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "abc9052d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3.323945755031544"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "std"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "rl_in_ksp_new",
   "language": "python",
   "name": "rl_in_ksp_new"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}