diff --git a/pyproject.toml b/pyproject.toml index 008f7c9c..9c94a388 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,8 @@ dependencies = [ "PyYAML==6.0", "typer[all]==0.9.0", "pydantic==2.7.0", - "ipywidgets" + "ipywidgets", + "deepdiff" ] [tool.setuptools.dynamic] diff --git a/src/primaite/notebooks/Getting-Information-Out-Of-PrimAITE.ipynb b/src/primaite/notebooks/Getting-Information-Out-Of-PrimAITE.ipynb new file mode 100644 index 00000000..25dec889 --- /dev/null +++ b/src/primaite/notebooks/Getting-Information-Out-Of-PrimAITE.ipynb @@ -0,0 +1,168 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Getting information out of PrimAITE" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Imports\n", + "import yaml\n", + "from primaite import PRIMAITE_CONFIG\n", + "\n", + "from primaite.config.load import data_manipulation_config_path\n", + "from primaite.session.environment import PrimaiteGymEnv\n", + "from primaite.simulator.network.hardware.nodes.host.computer import Computer\n", + "from notebook.services.config import ConfigManager\n", + "\n", + "cm = ConfigManager().update('notebook', {'limit_output': 50}) # limit output lines to 50 - for neatness\n", + "\n", + "# create the env\n", + "with open(data_manipulation_config_path(), 'r') as f:\n", + " cfg = yaml.safe_load(f)\n", + "\n", + "env = PrimaiteGymEnv(env_config=cfg)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualising the Simulation Network" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The network can be visualised by running the code below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "env.game.simulation.network.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Getting the state of a simulation object\n", + "\n", + "The state of the simulation object is used to determine the observation space used by agents.\n", + "\n", + "Any object created using the ``SimComponent`` class has a ``describe_state`` method which can show the state of the object.\n", + "\n", + "An example of such an object is ``Computer`` which inherits from ``SimComponent``. In the default network configuration, ``client_1`` is a Computer object." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "client_1: Computer = env.game.simulation.network.get_node_by_hostname(\"client_1\")\n", + "client_1.describe_state()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### More specific describe_state\n", + "\n", + "As you can see, the output from the ``describe_state`` method for the ``Computer`` object includes the describe state for all its components. This can cause a large describe state output.\n", + "\n", + "As stated, the ``describe_state`` can be called on any object that inherits ``SimComponent``. This can allow you retrieve the state of a specific item." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "client_1.file_system.describe_state()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## System Logs\n", + "\n", + "Objects that inherit from the ``Node`` class will inherit the ``sys_log`` attribute.\n", + "\n", + "This is to simulate the idea that items such as Computer, Routers, Servers, etc. have a logging system used to diagnose problems." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# store config\n", + "# this is to prevent the notebook from breaking your local settings\n", + "was_enabled = PRIMAITE_CONFIG[\"developer_mode\"][\"enabled\"]\n", + "was_syslogs_enabled = PRIMAITE_CONFIG[\"developer_mode\"][\"output_sys_logs\"]\n", + "\n", + "# enable dev mode so that the default config outputs are overridden for this demo\n", + "PRIMAITE_CONFIG[\"developer_mode\"][\"enabled\"] = True\n", + "PRIMAITE_CONFIG[\"developer_mode\"][\"output_sys_logs\"] = True\n", + "\n", + "\n", + "\n", + "\n", + "# Remake the environment\n", + "env = PrimaiteGymEnv(env_config=cfg)\n", + "\n", + "# get the example computer\n", + "client_1: Computer = env.game.simulation.network.get_node_by_hostname(\"client_1\")\n", + "\n", + "# show sys logs on terminal\n", + "client_1.sys_log.show()\n", + "\n", + "\n", + "\n", + "\n", + "# restore config\n", + "PRIMAITE_CONFIG[\"developer_mode\"][\"enabled\"] = was_enabled\n", + "PRIMAITE_CONFIG[\"developer_mode\"][\"output_sys_logs\"] = was_syslogs_enabled" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "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.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/primaite/session/environment.py b/src/primaite/session/environment.py index 1e9faded..edb8a476 100644 --- a/src/primaite/session/environment.py +++ b/src/primaite/session/environment.py @@ -82,7 +82,7 @@ class PrimaiteGymEnv(gymnasium.Env): with open(path, "w") as file: json.dump(data, file) - def reset(self, seed: Optional[int] = None) -> Tuple[ObsType, Dict[str, Any]]: + def reset(self, seed: Optional[int] = None, options: Optional[Dict] = None) -> Tuple[ObsType, Dict[str, Any]]: """Reset the environment.""" _LOGGER.info( f"Resetting environment, episode {self.episode_counter}, "