The source code and dockerfile for the GSW2024 AI Lab.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

523 lines
263 KiB

4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
  1. {
  2. "cells": [
  3. {
  4. "cell_type": "markdown",
  5. "metadata": {},
  6. "source": [
  7. "## Example usage of Tempestpy"
  8. ]
  9. },
  10. {
  11. "cell_type": "code",
  12. "execution_count": 1,
  13. "metadata": {
  14. "vscode": {
  15. "languageId": "plaintext"
  16. }
  17. },
  18. "outputs": [
  19. {
  20. "name": "stdout",
  21. "output_type": "stream",
  22. "text": [
  23. "pygame 2.6.0 (SDL 2.28.4, Python 3.10.12)\n",
  24. "Hello from the pygame community. https://www.pygame.org/contribute.html\n"
  25. ]
  26. },
  27. {
  28. "name": "stderr",
  29. "output_type": "stream",
  30. "text": [
  31. "2024-09-24 12:42:32.571249: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:485] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
  32. "2024-09-24 12:42:32.588338: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:8454] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
  33. "2024-09-24 12:42:32.593115: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1452] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n",
  34. "2024-09-24 12:42:32.603726: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
  35. "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n",
  36. "2024-09-24 12:42:33.541399: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n",
  37. "error: XDG_RUNTIME_DIR not set in the environment.\n"
  38. ]
  39. }
  40. ],
  41. "source": [
  42. "from sb3_contrib import MaskablePPO\n",
  43. "from sb3_contrib.common.wrappers import ActionMasker\n",
  44. "from stable_baselines3.common.logger import Logger, CSVOutputFormat, TensorBoardOutputFormat, HumanOutputFormat\n",
  45. "\n",
  46. "import gymnasium as gym\n",
  47. "\n",
  48. "from minigrid.core.actions import Actions\n",
  49. "from minigrid.core.constants import TILE_PIXELS\n",
  50. "from minigrid.wrappers import RGBImgObsWrapper, ImgObsWrapper\n",
  51. "\n",
  52. "import tempfile, datetime, shutil\n",
  53. "\n",
  54. "import time\n",
  55. "import os\n",
  56. "\n",
  57. "from utils import MiniGridShieldHandler, create_log_dir, ShieldingConfig, MiniWrapper, expname, shield_needed, shielded_evaluation, create_shield_overlay_image\n",
  58. "from sb3utils import MiniGridSbShieldingWrapper, parse_sb3_arguments, ImageRecorderCallback, InfoCallback\n",
  59. "\n",
  60. "import os, sys\n",
  61. "from copy import deepcopy\n",
  62. "\n",
  63. "from PIL import Image"
  64. ]
  65. },
  66. {
  67. "cell_type": "code",
  68. "execution_count": 3,
  69. "metadata": {
  70. "vscode": {
  71. "languageId": "plaintext"
  72. }
  73. },
  74. "outputs": [
  75. {
  76. "name": "stdout",
  77. "output_type": "stream",
  78. "text": [
  79. "Starting the training\n"
  80. ]
  81. },
  82. {
  83. "data": {
  84. "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAGgAgADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDDooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDzLVNU1CPV71Ev7pU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
  85. "image/png": "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
  86. "text/plain": [
  87. "<PIL.Image.Image image mode=RGB size=512x416>"
  88. ]
  89. },
  90. "metadata": {},
  91. "output_type": "display_data"
  92. },
  93. {
  94. "name": "stdout",
  95. "output_type": "stream",
  96. "text": [
  97. "\n",
  98. "\n",
  99. "Computing new shield\n",
  100. "LOG: Starting with explicit model creation...\n",
  101. "Elapsed time is 0.08019781112670898 seconds.\n",
  102. "LOG: Starting with model checking...\n",
  103. "Elapsed time is 0.0008318424224853516 seconds.\n",
  104. "LOG: Starting to translate shield...\n",
  105. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 445\n",
  106. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 446\n",
  107. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 447\n",
  108. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 448\n",
  109. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 449\n",
  110. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 450\n",
  111. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 451\n",
  112. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 452\n",
  113. "Elapsed time is 0.022951364517211914 seconds.\n",
  114. "\n",
  115. "\n",
  116. "Computing new shield\n",
  117. "LOG: Starting with explicit model creation...\n",
  118. "Elapsed time is 0.0903787612915039 seconds.\n",
  119. "LOG: Starting with model checking...\n",
  120. "Elapsed time is 0.0008656978607177734 seconds.\n",
  121. "LOG: Starting to translate shield...\n",
  122. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 54\n",
  123. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 55\n",
  124. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 56\n",
  125. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 57\n",
  126. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 58\n",
  127. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 59\n",
  128. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 60\n",
  129. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 61\n",
  130. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 62\n",
  131. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 315\n",
  132. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 316\n",
  133. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 317\n",
  134. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 318\n",
  135. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 319\n",
  136. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 320\n",
  137. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 321\n",
  138. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 322\n",
  139. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 323\n",
  140. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 444\n",
  141. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 445\n",
  142. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 446\n",
  143. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 447\n",
  144. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 448\n",
  145. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 449\n",
  146. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 450\n",
  147. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 451\n",
  148. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 452\n",
  149. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 453\n",
  150. "Elapsed time is 0.0263826847076416 seconds.\n",
  151. "\n",
  152. "\n",
  153. "Computing new shield\n",
  154. "LOG: Starting with explicit model creation...\n",
  155. "Elapsed time is 0.11173772811889648 seconds.\n",
  156. "LOG: Starting with model checking...\n",
  157. "Elapsed time is 0.0016129016876220703 seconds.\n",
  158. "LOG: Starting to translate shield...\n",
  159. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 54\n",
  160. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 55\n",
  161. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 56\n",
  162. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 57\n",
  163. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 58\n",
  164. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 59\n",
  165. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 60\n",
  166. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 61\n",
  167. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 62\n",
  168. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 315\n",
  169. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 316\n",
  170. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 317\n",
  171. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 318\n",
  172. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 319\n",
  173. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 320\n",
  174. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 321\n",
  175. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 322\n",
  176. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 323\n",
  177. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 444\n",
  178. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 445\n",
  179. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 446\n",
  180. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 447\n",
  181. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 448\n",
  182. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 449\n",
  183. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 450\n",
  184. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 451\n",
  185. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 452\n",
  186. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 453\n",
  187. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 458\n",
  188. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 459\n",
  189. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 460\n",
  190. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 461\n",
  191. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 462\n",
  192. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 463\n",
  193. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 464\n",
  194. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 465\n",
  195. "Elapsed time is 0.03487586975097656 seconds.\n",
  196. "\n",
  197. "\n",
  198. "Computing new shield\n",
  199. "LOG: Starting with explicit model creation...\n",
  200. "Elapsed time is 0.1351919174194336 seconds.\n",
  201. "LOG: Starting with model checking...\n",
  202. "Elapsed time is 0.0011432170867919922 seconds.\n",
  203. "LOG: Starting to translate shield...\n",
  204. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 54\n",
  205. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 55\n",
  206. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 56\n",
  207. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 57\n",
  208. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 58\n",
  209. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 59\n",
  210. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 60\n",
  211. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 61\n",
  212. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 62\n",
  213. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 67\n",
  214. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 68\n",
  215. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 69\n",
  216. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 70\n",
  217. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 71\n",
  218. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 72\n",
  219. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 73\n",
  220. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 74\n",
  221. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 80\n",
  222. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 81\n",
  223. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 82\n",
  224. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 83\n",
  225. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 84\n",
  226. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 85\n",
  227. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 86\n",
  228. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 93\n",
  229. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 94\n",
  230. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 95\n",
  231. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 96\n",
  232. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for statElapsed time is 0.03844499588012695 seconds.\n",
  233. "e with index 97\n",
  234. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 98\n",
  235. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 106\n",
  236. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 107\n",
  237. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 108\n",
  238. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 109\n",
  239. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 110\n",
  240. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 315\n",
  241. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 316\n",
  242. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 317\n",
  243. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 318\n",
  244. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 319\n",
  245. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 320\n",
  246. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 321\n",
  247. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 322\n",
  248. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 323\n",
  249. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 329\n",
  250. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 330\n",
  251. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 331\n",
  252. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 332\n",
  253. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 333\n",
  254. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 334\n",
  255. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 335\n",
  256. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 336\n",
  257. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 343\n",
  258. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 344\n",
  259. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 345\n",
  260. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 346\n",
  261. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 347\n",
  262. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 348\n",
  263. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 349\n",
  264. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 357\n",
  265. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 358\n",
  266. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 359\n",
  267. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 360\n",
  268. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 361\n",
  269. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 362\n",
  270. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 371\n",
  271. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 372\n",
  272. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 373\n",
  273. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 374\n",
  274. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 375\n",
  275. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 444\n",
  276. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 445\n",
  277. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 446\n",
  278. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 447\n",
  279. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 448\n",
  280. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 449\n",
  281. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 450\n",
  282. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 451\n",
  283. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 452\n",
  284. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 453\n",
  285. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 457\n",
  286. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 458\n",
  287. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 459\n",
  288. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 460\n",
  289. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 461\n",
  290. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 462\n",
  291. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 463\n",
  292. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 464\n",
  293. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 465\n",
  294. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 466\n",
  295. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 470\n",
  296. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 471\n",
  297. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 472\n",
  298. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 473\n",
  299. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 474\n",
  300. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 475\n",
  301. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 476\n",
  302. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 477\n",
  303. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 478\n",
  304. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 479\n",
  305. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 483\n",
  306. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 484\n",
  307. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 485\n",
  308. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 486\n",
  309. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 487\n",
  310. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 488\n",
  311. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 489\n",
  312. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 490\n",
  313. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 491\n",
  314. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 492\n",
  315. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 496\n",
  316. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 497\n",
  317. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 498\n",
  318. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 499\n",
  319. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 500\n",
  320. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 501\n",
  321. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 502\n",
  322. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 503\n",
  323. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 504\n",
  324. " WARN (PreShield.cpp:50): No shielding action possible with absolute comparison for state with index 505\n"
  325. ]
  326. },
  327. {
  328. "data": {
  329. "image/png": "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
  330. "text/plain": [
  331. "<PIL.Image.Image image mode=RGBA size=512x416>"
  332. ]
  333. },
  334. "metadata": {},
  335. "output_type": "display_data"
  336. },
  337. {
  338. "name": "stdout",
  339. "output_type": "stream",
  340. "text": [
  341. "The shield for shield_value = 0.9\n"
  342. ]
  343. },
  344. {
  345. "data": {
  346. "image/png": "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
  347. "text/plain": [
  348. "<PIL.Image.Image image mode=RGBA size=512x416>"
  349. ]
  350. },
  351. "metadata": {},
  352. "output_type": "display_data"
  353. },
  354. {
  355. "name": "stdout",
  356. "output_type": "stream",
  357. "text": [
  358. "The shield for shield_value = 0.95\n"
  359. ]
  360. },
  361. {
  362. "data": {
  363. "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgAAAAGgCAYAAADcjN+JAABgIklEQVR4Ae19Ta8lt5neUbuhwIA8NiTgzhXQasULbSxvPBsdaZfNZNc7d/7AnR+g7p1+gJCNpGwSBPDNKjspq4YXnkkWXlnXm2iAsbIxME63NNBFGxI8cQODaYxHeZ/D897D4mFVkTysIln18IK3qlh8+RYfvl9kfZwXLi4uvt0wEQEiQASIABEgAqtC4NaqesvOEgEiQASIABEgAjsEGABQEIgAESACRIAIrBABBgArHHR2mQgQASJABIgAAwDKABEgAkSACBCBFSLAAGCFg84uEwEiQASIABFgAEAZIAJEgAgQASKwQgQYAKxw0NllIkAEiAARIAIMACgDRIAIEAEiQARWiAADgBUOOrtMBIgAESACRIABAGWACBABIkAEiMAKEWAAsMJBZ5eJABEgAkSACDAAoAwQASJABIgAEVghAgwAVjjo7DIRIAJEgAgQAQYAlAEiQASIABEgAitEgAHACgedXSYCRIAIEAEiwACAMkAEiAARIAJEYIUIMABY4aCzy0SACBABIkAEGABQBogAESACRIAIrBABBgArHHR2mQgQASJABIgAAwDKABEgAkSACBCBFSLAAGCFg84uEwEiQASIABFgAEAZIAJEgAgQASKwQgQYAKxw0NllIkAEiAARIAIMACgDRIAIEAEiQARWiAADgBUOOrtMBIgAESACRIABAGWACBABIkAEiMAKEWAAsMJBZ5eJABEgAkSACDAAoAwQASJABIgAEVghAgwAVjjo7DIRIAJEgAgQAQYAlAEiQASIABEgAitEgAHACgedXSYCRIAIEAEicLs0BO89elT6Eory/+GLTzebi4KXcCm8yb/cABB/yt+K9e93/+WsnO4J56c/FPtbMJ397mzz/r17xa6geACAnj99Wm4QLi8uNheXsMJl0g/vlOG741qu26bT5F9w8IU18Sf+QAByUCII2ctfSfu/+WFZESjNfdW3ALZ79HVbejBm5U/jPyvcR8yI/xEksxYQ/y7cc+MxN79ub3dHq7T7Dg6rDQDcwXePHZyWdVha+ci/rDwRf+LvQ2AuuZiLj6+P+7JV2fsBHFYZAPQNfl/5AH7tnSqtfORfVmaIP/EfQmBq+Zi6/aG+7c+tws4H4IAqqwsAxgZ/7HwgrnVWK6185F9WLog/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
  364. "text/plain": [
  365. "<PIL.Image.Image image mode=RGBA size=512x416>"
  366. ]
  367. },
  368. "metadata": {},
  369. "output_type": "display_data"
  370. },
  371. {
  372. "name": "stdout",
  373. "output_type": "stream",
  374. "text": [
  375. "The shield for shield_value = 0.99\n"
  376. ]
  377. },
  378. {
  379. "data": {
  380. "image/png": "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
  381. "text/plain": [
  382. "<PIL.Image.Image image mode=RGBA size=512x416>"
  383. ]
  384. },
  385. "metadata": {},
  386. "output_type": "display_data"
  387. },
  388. {
  389. "name": "stdout",
  390. "output_type": "stream",
  391. "text": [
  392. "The shield for shield_value = 1.0\n",
  393. "Training with shield:\n"
  394. ]
  395. },
  396. {
  397. "data": {
  398. "image/png": "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
  399. "text/plain": [
  400. "<PIL.Image.Image image mode=RGBA size=512x416>"
  401. ]
  402. },
  403. "metadata": {},
  404. "output_type": "display_data"
  405. },
  406. {
  407. "name": "stdout",
  408. "output_type": "stream",
  409. "text": [
  410. "Using cpu device\n",
  411. "Wrapping the env with a `Monitor` wrapper\n",
  412. "Wrapping the env in a DummyVecEnv.\n",
  413. "Wrapping the env in a VecTransposeImage.\n"
  414. ]
  415. },
  416. {
  417. "ename": "AssertionError",
  418. "evalue": "",
  419. "output_type": "error",
  420. "traceback": [
  421. "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
  422. "\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)",
  423. "Cell \u001b[0;32mIn[3], line 62\u001b[0m\n\u001b[1;32m 60\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;18m__name__\u001b[39m \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m__main__\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[1;32m 61\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mStarting the training\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m---> 62\u001b[0m \u001b[43mmain\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
  424. "Cell \u001b[0;32mIn[3], line 55\u001b[0m, in \u001b[0;36mmain\u001b[0;34m()\u001b[0m\n\u001b[1;32m 52\u001b[0m model\u001b[38;5;241m.\u001b[39mset_logger(logger)\n\u001b[1;32m 53\u001b[0m steps \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m20_000\u001b[39m\n\u001b[0;32m---> 55\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m(\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[1;32m 56\u001b[0m model\u001b[38;5;241m.\u001b[39mlearn(steps,callback\u001b[38;5;241m=\u001b[39m[InfoCallback()])\n",
  425. "\u001b[0;31mAssertionError\u001b[0m: "
  426. ]
  427. }
  428. ],
  429. "source": [
  430. "GRID_TO_PRISM_BINARY=os.getenv(\"M2P_BINARY\")\n",
  431. "\n",
  432. "def mask_fn(env: gym.Env):\n",
  433. " return env.create_action_mask()\n",
  434. "\n",
  435. "def nomask_fn(env: gym.Env):\n",
  436. " return [1.0] * 7\n",
  437. "\n",
  438. "def main():\n",
  439. " env = \"MiniGrid-LavaSlipperyCliff-16x13-Slip10-Time-v0\"\n",
  440. " \n",
  441. " formula = \"Pmax=? [G ! AgentIsOnLava]\"\n",
  442. " value_for_training = 0.99\n",
  443. " shield_comparison = \"absolute\"\n",
  444. " shielding = ShieldingConfig.Training\n",
  445. " \n",
  446. " logger = Logger(\"/tmp\", output_formats=[HumanOutputFormat(sys.stdout)])\n",
  447. " \n",
  448. " env = gym.make(env, render_mode=\"rgb_array\")\n",
  449. " image_env = RGBImgObsWrapper(env, TILE_PIXELS)\n",
  450. " env = RGBImgObsWrapper(env, 8)\n",
  451. " env = ImgObsWrapper(env)\n",
  452. " env = MiniWrapper(env)\n",
  453. "\n",
  454. " \n",
  455. " env.reset()\n",
  456. " Image.fromarray(env.render()).show()\n",
  457. " \n",
  458. " shield_handlers = dict()\n",
  459. " if shield_needed(shielding):\n",
  460. " for value in [0.9, 0.95, 0.99, 1.0]:\n",
  461. " shield_handler = MiniGridShieldHandler(GRID_TO_PRISM_BINARY, \"grid.txt\", \"grid.prism\", formula, shield_value=value, shield_comparison=shield_comparison, nocleanup=False, prism_file=None)\n",
  462. " env = MiniGridSbShieldingWrapper(env, shield_handler=shield_handler, create_shield_at_reset=False)\n",
  463. "\n",
  464. "\n",
  465. " shield_handlers[value] = shield_handler\n",
  466. " if shield_needed(shielding):\n",
  467. " for value in [0.9, 0.95, 0.99, 1.0]: \n",
  468. " create_shield_overlay_image(image_env, shield_handlers[value].create_shield())\n",
  469. " print(f\"The shield for shield_value = {value}\")\n",
  470. "\n",
  471. " if shielding == ShieldingConfig.Training:\n",
  472. " env = MiniGridSbShieldingWrapper(env, shield_handler=shield_handlers[value_for_training], create_shield_at_reset=False)\n",
  473. " env = ActionMasker(env, mask_fn)\n",
  474. " print(\"Training with shield:\")\n",
  475. " create_shield_overlay_image(image_env, shield_handlers[value_for_training].create_shield())\n",
  476. " elif shielding == ShieldingConfig.Disabled:\n",
  477. " env = ActionMasker(env, nomask_fn)\n",
  478. " else:\n",
  479. " assert(False) \n",
  480. " model = MaskablePPO(\"CnnPolicy\", env, verbose=1, device=\"auto\")\n",
  481. " model.set_logger(logger)\n",
  482. " steps = 20_000\n",
  483. "\n",
  484. " assert(False)\n",
  485. " model.learn(steps,callback=[InfoCallback()])\n",
  486. "\n",
  487. "\n",
  488. "\n",
  489. "if __name__ == '__main__':\n",
  490. " print(\"Starting the training\")\n",
  491. " main()"
  492. ]
  493. },
  494. {
  495. "cell_type": "code",
  496. "execution_count": null,
  497. "metadata": {},
  498. "outputs": [],
  499. "source": []
  500. }
  501. ],
  502. "metadata": {
  503. "kernelspec": {
  504. "display_name": "Python 3 (ipykernel)",
  505. "language": "python",
  506. "name": "python3"
  507. },
  508. "language_info": {
  509. "codemirror_mode": {
  510. "name": "ipython",
  511. "version": 3
  512. },
  513. "file_extension": ".py",
  514. "mimetype": "text/x-python",
  515. "name": "python",
  516. "nbconvert_exporter": "python",
  517. "pygments_lexer": "ipython3",
  518. "version": "3.10.12"
  519. }
  520. },
  521. "nbformat": 4,
  522. "nbformat_minor": 4
  523. }