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.
199 lines
28 KiB
199 lines
28 KiB
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Example usage of Tempestpy"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "plaintext"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"pygame 2.6.1 (SDL 2.28.4, Python 3.10.12)\n",
|
|
"Hello from the pygame community. https://www.pygame.org/contribute.html\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"2024-11-29 12:18:59.459471: 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",
|
|
"2024-11-29 12:18:59.474489: 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",
|
|
"2024-11-29 12:18:59.478811: 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",
|
|
"2024-11-29 12:18:59.488641: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
|
|
"To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n",
|
|
"2024-11-29 12:19:00.368388: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n",
|
|
"error: XDG_RUNTIME_DIR not set in the environment.\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"from sb3_contrib import MaskablePPO\n",
|
|
"from sb3_contrib.common.wrappers import ActionMasker\n",
|
|
"from stable_baselines3.common.logger import Logger, CSVOutputFormat, TensorBoardOutputFormat, HumanOutputFormat\n",
|
|
"\n",
|
|
"import gymnasium as gym\n",
|
|
"\n",
|
|
"from minigrid.core.actions import Actions\n",
|
|
"from minigrid.core.constants import TILE_PIXELS\n",
|
|
"from minigrid.wrappers import RGBImgObsWrapper, ImgObsWrapper\n",
|
|
"\n",
|
|
"import tempfile, datetime, shutil\n",
|
|
"\n",
|
|
"import time\n",
|
|
"import os\n",
|
|
"\n",
|
|
"from utils import MiniGridShieldHandler, create_log_dir, ShieldingConfig, MiniWrapper, expname, shield_needed, shielded_evaluation, create_shield_overlay_image\n",
|
|
"from sb3utils import MiniGridSbShieldingWrapper, parse_sb3_arguments, ImageRecorderCallback, InfoCallback\n",
|
|
"\n",
|
|
"import os, sys\n",
|
|
"from copy import deepcopy\n",
|
|
"\n",
|
|
"from PIL import Image"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "plaintext"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Starting the training\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"image/jpeg": "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/wDf9v8AGqdFAGvqmqahHq96iX90qLO4VVmYADceBzVT+19T/wCgjd/9/wBv8aNX/wCQ1f8A/XxJ/wChGqdAFz+19T/6CN3/AN/2/wAaP7X1P/oI3f8A3/b/ABqnRQBr6pqmoR6veol/dKizuFVZmAA3Hgc1U/tfU/8AoI3f/f8Ab/GjV/8AkNX/AP18Sf8AoRqnQBc/tfU/+gjd/wDf9v8AGj+19T/6CN3/AN/2/wAap0UAa+qapqEer3qJf3Sos7hVWZgANx4HNVP7X1P/AKCN3/3/AG/xo1f/AJDV/wD9fEn/AKEap0AXP7X1P/oI3f8A3/b/ABo/tfU/+gjd/wDf9v8AGqdFAGvqmqahHq96iX90qLO4VVmYADceBzVT+19T/wCgjd/9/wBv8aNX/wCQ1f8A/XxJ/wChGqdAFz+19T/6CN3/AN/2/wAaP7X1P/oI3f8A3/b/ABqnRQBr6pqmoR6veol/dKizuFVZmAA3Hgc1U/tfU/8AoI3f/f8Ab/GjV/8AkNX/AP18Sf8AoRqnQBc/tfU/+gjd/wDf9v8AGj+19T/6CN3/AN/2/wAap0UAeyUUUUAFFFFABRRRQAUUUUAeT6v/AMhq/wD+viT/ANCNU6uav/yGr/8A6+JP/QjVOgAooooAuav/AMhq/wD+viT/ANCNU6uav/yGr/8A6+JP/QjVOgAooooAuav/AMhq/wD+viT/ANCNU6uav/yGr/8A6+JP/QjVOgAooooAuav/AMhq/wD+viT/ANCNU6uav/yGr/8A6+JP/QjVOgAooooAuav/AMhq/wD+viT/ANCNU6uav/yGr/8A6+JP/QjVOgAooooAuav/AMhq/wD+viT/ANCNU6uav/yGr/8A6+JP/QjVOgAooooAuav/AMhq/wD+viT/ANCNU6uav/yGr/8A6+JP/QjVOgAooooAuav/AMhq/wD+viT/ANCNU6uav/yGr/8A6+JP/QjVOgAooooAuav/AMhq/wD+viT/ANCNU6uav/yGr/8A6+JP/QjVOgAooooA9kooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//9k=",
|
|
"image/png": "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",
|
|
"text/plain": [
|
|
"<PIL.Image.Image image mode=RGB size=352x288>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"\n",
|
|
"Computing new shield\n",
|
|
"LOG: Starting with explicit model creation...\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"GRID_TO_PRISM_BINARY=os.getenv(\"M2P_BINARY\")\n",
|
|
"\n",
|
|
"def mask_fn(env: gym.Env):\n",
|
|
" return env.create_action_mask()\n",
|
|
"\n",
|
|
"def nomask_fn(env: gym.Env):\n",
|
|
" return [1.0] * 7\n",
|
|
"\n",
|
|
"def main():\n",
|
|
" #env = \"MiniGrid-LavaSlipperyCliff-16x13-Slip10-Time-v0\"\n",
|
|
" env = \"MiniGrid-WindyCity-Adv-v0\"\n",
|
|
"\n",
|
|
" formula = \"Pmax=? [G ! AgentIsOnLava]\"\n",
|
|
" value_for_training = 0.99\n",
|
|
" shield_comparison = \"absolute\"\n",
|
|
" shielding = ShieldingConfig.Training\n",
|
|
" \n",
|
|
" logger = Logger(\"/tmp\", output_formats=[HumanOutputFormat(sys.stdout)])\n",
|
|
" \n",
|
|
" env = gym.make(env, render_mode=\"rgb_array\")\n",
|
|
" image_env = RGBImgObsWrapper(env, TILE_PIXELS)\n",
|
|
" env = RGBImgObsWrapper(env, 8)\n",
|
|
" env = ImgObsWrapper(env)\n",
|
|
" env = MiniWrapper(env)\n",
|
|
"\n",
|
|
" \n",
|
|
" env.reset()\n",
|
|
" Image.fromarray(env.render()).show()\n",
|
|
" \n",
|
|
" shield_handlers = dict()\n",
|
|
" if shield_needed(shielding):\n",
|
|
" for value in [0.9, 0.95, 0.99, 1.0]:\n",
|
|
" shield_handler = MiniGridShieldHandler(GRID_TO_PRISM_BINARY, \"grid.txt\", \"grid.prism\", formula, shield_value=value, shield_comparison=shield_comparison, nocleanup=True, prism_file=None)\n",
|
|
" env = MiniGridSbShieldingWrapper(env, shield_handler=shield_handler, create_shield_at_reset=False)\n",
|
|
"\n",
|
|
"\n",
|
|
" shield_handlers[value] = shield_handler\n",
|
|
" if shield_needed(shielding):\n",
|
|
" for value in [0.9, 0.95, 0.99, 1.0]: \n",
|
|
" create_shield_overlay_image(image_env, shield_handlers[value].create_shield())\n",
|
|
" print(f\"The shield for shield_value = {value}\")\n",
|
|
"\n",
|
|
" if shielding == ShieldingConfig.Training:\n",
|
|
" env = MiniGridSbShieldingWrapper(env, shield_handler=shield_handlers[value_for_training], create_shield_at_reset=False)\n",
|
|
" env = ActionMasker(env, mask_fn)\n",
|
|
" print(\"Training with shield:\")\n",
|
|
" create_shield_overlay_image(image_env, shield_handlers[value_for_training].create_shield())\n",
|
|
" elif shielding == ShieldingConfig.Disabled:\n",
|
|
" env = ActionMasker(env, nomask_fn)\n",
|
|
" else:\n",
|
|
" assert(False) \n",
|
|
" model = MaskablePPO(\"CnnPolicy\", env, verbose=1, device=\"auto\")\n",
|
|
" model.set_logger(logger)\n",
|
|
" steps = 200\n",
|
|
"\n",
|
|
" assert(False)\n",
|
|
" model.learn(steps,callback=[InfoCallback()])\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"if __name__ == '__main__':\n",
|
|
" print(\"Starting the training\")\n",
|
|
" main()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3 (ipykernel)",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.10.12"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 4
|
|
}
|