From 9752b3212b5f12da4583c1ad56c3b96c80320913 Mon Sep 17 00:00:00 2001 From: Marco Pleines Date: Wed, 18 Sep 2024 06:59:08 +0200 Subject: [PATCH 1/4] Add PPO + Transformer-XL (#459) * initial commit of ppo trxl * removed video capture * Switched from grayscale to RGB * RGB obs reconstruction * print reconstruction loss instead of total loss * Ensure that transformer memory length is not larger than max episode steps * fixed enjoy.py in the case of Searing Spotlights * added video capture support again after updating memory gym * default hyperparameters * remove unnecessary padding from TrXL memory, if applicable * print SPS * updated pyproject.toml because of memory-gym 1.0.2 * fixed comment * refactored code + added a comment * added annealing entropy coefficient. learning rate anneals also from initial to final value. * aligned monitoring of losses and further metrics * slight adjustments due to pre-commit, pre-commit still fails due to unused imports, however these imports are necessary for the used environments to be registered * heads share parameters again for reproduction purposes, set default hyperparameters for succesfull MMG training * fixed entropy for multi-discrete action spaces * advantage normalization is off per default, added hidden layer after TrXL * set max_episode_steps for endless environments * updated poetry.lock, define max episode steps for endless environments, started docs, added benchmark sh * added Transformer-XL (PPO-TrXL) to the navigation bar, improved docs * Added report to docs * refactored "blocks" to "layers" * Finalized enjoy.py,which can load pre-trained models from huggingface hub, updated docs * pre-commit enjoy.py * add #noqa to fix pre-commit * fix pre-commit #noqa * pre-commit fixed enjoy import order * last pass of pre-commit * fixed spelling * remove macos-latest from .github/workflows/test.yaml * Added ppo_trxl to README.md, fixed enjoy and ppo_trxl for MiniGrid, added proper rendering to ProofofMemory-v0, updated docs for training and enjoying MiniGrid and ProofofMemory-v0 * pre-commit fixes * Add requirements.txt, update poetry, torch defaults to CUDA, updated docs * updated doc links, added memory gym requirements to README.md --------- Co-authored-by: Horrible22232 --- .github/workflows/tests.yaml | 6 +- README.md | 2 + benchmark/ppo_trxl.sh | 52 + cleanrl/ppo_trxl/enjoy.py | 91 ++ cleanrl/ppo_trxl/poetry.lock | 1582 ++++++++++++++++++++++ cleanrl/ppo_trxl/pom_env.py | 186 +++ cleanrl/ppo_trxl/ppo_trxl.py | 682 ++++++++++ cleanrl/ppo_trxl/pyproject.toml | 28 + docs/rl-algorithms/ppo-trxl.md | 184 +++ docs/rl-algorithms/ppo-trxl/compare.png | Bin 0 -> 165190 bytes mkdocs.yml | 1 + requirements/requirements-memory_gym.txt | 85 ++ 12 files changed, 2896 insertions(+), 3 deletions(-) create mode 100644 benchmark/ppo_trxl.sh create mode 100644 cleanrl/ppo_trxl/enjoy.py create mode 100644 cleanrl/ppo_trxl/poetry.lock create mode 100644 cleanrl/ppo_trxl/pom_env.py create mode 100644 cleanrl/ppo_trxl/ppo_trxl.py create mode 100644 cleanrl/ppo_trxl/pyproject.toml create mode 100644 docs/rl-algorithms/ppo-trxl.md create mode 100644 docs/rl-algorithms/ppo-trxl/compare.png create mode 100644 requirements/requirements-memory_gym.txt diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index ebdd57e4c..ca77b4f2a 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -12,7 +12,7 @@ jobs: matrix: python-version: ["3.8", "3.9", "3.10"] poetry-version: ["1.7"] - os: [ubuntu-22.04, macos-latest, windows-latest] + os: [ubuntu-22.04, windows-latest] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v2 @@ -55,7 +55,7 @@ jobs: matrix: python-version: ["3.8", "3.9", "3.10"] poetry-version: ["1.7"] - os: [ubuntu-22.04, macos-latest, windows-latest] + os: [ubuntu-22.04, windows-latest] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v2 @@ -91,7 +91,7 @@ jobs: matrix: python-version: ["3.8", "3.9", "3.10"] poetry-version: ["1.7"] - os: [ubuntu-22.04, macos-latest, windows-latest] + os: [ubuntu-22.04, windows-latest] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v2 diff --git a/README.md b/README.md index d1394a765..2a69b2543 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,7 @@ pip install -r requirements/requirements-pettingzoo.txt pip install -r requirements/requirements-jax.txt pip install -r requirements/requirements-docs.txt pip install -r requirements/requirements-cloud.txt +pip install -r requirements/requirements-memory_gym.txt ``` To run training scripts in other games: @@ -140,6 +141,7 @@ You may also use a prebuilt development environment hosted in Gitpod: | | [`ppo_atari_multigpu.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/ppo_atari_multigpu.py), [docs](https://docs.cleanrl.dev/rl-algorithms/ppo/#ppo_atari_multigpupy) | | [`ppo_pettingzoo_ma_atari.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/ppo_pettingzoo_ma_atari.py), [docs](https://docs.cleanrl.dev/rl-algorithms/ppo/#ppo_pettingzoo_ma_ataripy) | | [`ppo_continuous_action_isaacgym.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/ppo_continuous_action_isaacgym/ppo_continuous_action_isaacgym.py), [docs](https://docs.cleanrl.dev/rl-algorithms/ppo/#ppo_continuous_action_isaacgympy) +| | [`ppo_trxl.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/ppo_trxl/ppo_trxl.py), [docs](https://docs.cleanrl.dev/rl-algorithms/ppo_trxl/) | ✅ [Deep Q-Learning (DQN)](https://web.stanford.edu/class/psych209/Readings/MnihEtAlHassibis15NatureControlDeepRL.pdf) | [`dqn.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/dqn.py), [docs](https://docs.cleanrl.dev/rl-algorithms/dqn/#dqnpy) | | | [`dqn_atari.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/dqn_atari.py), [docs](https://docs.cleanrl.dev/rl-algorithms/dqn/#dqn_ataripy) | | | [`dqn_jax.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/dqn_jax.py), [docs](https://docs.cleanrl.dev/rl-algorithms/dqn/#dqn_jaxpy) | diff --git a/benchmark/ppo_trxl.sh b/benchmark/ppo_trxl.sh new file mode 100644 index 000000000..5cbc203e3 --- /dev/null +++ b/benchmark/ppo_trxl.sh @@ -0,0 +1,52 @@ +# export WANDB_ENTITY=openrlbenchmark + +cd cleanrl/ppo_trxl +poetry install +OMP_NUM_THREADS=4 poetry run python -m cleanrl_utils.benchmark \ + --env-ids MortarMayhem-Grid-v0 \ + --command "python ./cleanrl/ppo_trxl/ppo_trxl.py --track --norm_adv --trxl_memory_length 119 --total_timesteps 100000000" \ + --num-seeds 3 \ + --workers 32 \ + --slurm-template-path benchmark/cleanrl_1gpu.slurm_template + +OMP_NUM_THREADS=4 poetry run python -m cleanrl_utils.benchmark \ + --env-ids MortarMayhem-v0 \ + --command "python ./cleanrl/ppo_trxl/ppo_trxl.py --track --reconstruction_coef 0.1 --trxl_memory_length 275" \ + --num-seeds 3 \ + --workers 32 \ + --slurm-template-path benchmark/cleanrl_1gpu.slurm_template + +OMP_NUM_THREADS=4 poetry run python -m cleanrl_utils.benchmark \ + --env-ids MysteryPath-Grid-v0 \ + --command "python ./cleanrl/ppo_trxl/ppo_trxl.py --track --trxl_memory_length 96 --total_timesteps 100000000" \ + --num-seeds 3 \ + --workers 32 \ + --slurm-template-path benchmark/cleanrl_1gpu.slurm_template + +OMP_NUM_THREADS=4 poetry run python -m cleanrl_utils.benchmark \ + --env-ids MysteryPath-v0 \ + --command "python ./cleanrl/ppo_trxl/ppo_trxl.py --track --trxl_memory_length 256" \ + --num-seeds 3 \ + --workers 32 \ + --slurm-template-path benchmark/cleanrl_1gpu.slurm_template + +OMP_NUM_THREADS=4 poetry run python -m cleanrl_utils.benchmark \ + --env-ids SearingSpotlights-v0 \ + --command "python ./cleanrl/ppo_trxl/ppo_trxl.py --track --reconstruction_coef 0.1 --trxl_memory_length 256" \ + --num-seeds 3 \ + --workers 32 \ + --slurm-template-path benchmark/cleanrl_1gpu.slurm_template + +OMP_NUM_THREADS=4 poetry run python -m cleanrl_utils.benchmark \ + --env-ids Endless-SearingSpotlights-v0 \ + --command "python ./cleanrl/ppo_trxl/ppo_trxl.py --track --reconstruction_coef 0.1 --trxl_memory_length 256 --total_timesteps 350000000" \ + --num-seeds 3 \ + --workers 32 \ + --slurm-template-path benchmark/cleanrl_1gpu.slurm_template + +OMP_NUM_THREADS=4 poetry run python -m cleanrl_utils.benchmark \ + --env-ids Endless-MortarMayhem-v0 Endless-MysteryPath-v0 \ + --command "python ./cleanrl/ppo_trxl/ppo_trxl.py --track --trxl_memory_length 256 --total_timesteps 350000000" \ + --num-seeds 3 \ + --workers 32 \ + --slurm-template-path benchmark/cleanrl_1gpu.slurm_template diff --git a/cleanrl/ppo_trxl/enjoy.py b/cleanrl/ppo_trxl/enjoy.py new file mode 100644 index 000000000..6c0310abe --- /dev/null +++ b/cleanrl/ppo_trxl/enjoy.py @@ -0,0 +1,91 @@ +from dataclasses import dataclass + +import gymnasium as gym +import torch +import tyro +from ppo_trxl import Agent, make_env + + +@dataclass +class Args: + hub: bool = False + """whether to load the model from the huggingface hub or from the local disk""" + name: str = "Endless-MortarMayhem-v0_12.nn" + """path to the model file""" + + +if __name__ == "__main__": + # Parse command line arguments and retrieve model path + cli_args = tyro.cli(Args) + if cli_args.hub: + try: + from huggingface_hub import hf_hub_download + + path = hf_hub_download(repo_id="LilHairdy/cleanrl_memory_gym", filename=cli_args.name) + except: + raise RuntimeError( + "Cannot load model from the huggingface hub. Please install the huggingface_hub pypi package and verify the model name. You can also download the model from the hub manually and load it from disk." + ) + else: + path = cli_args.name + + # Load the pre-trained model and the original args used to train it + checkpoint = torch.load(path) + args = checkpoint["args"] + args = type("Args", (), args) + + # Init environment and reset + env = make_env(args.env_id, 0, False, "", "human")() + obs, _ = env.reset() + env.render() + + # Determine maximum episode steps + max_episode_steps = env.spec.max_episode_steps + if not max_episode_steps: + max_episode_steps = env.max_episode_steps + if max_episode_steps <= 0: + max_episode_steps = 1024 # Memory Gym envs have max_episode_steps set to -1 + # May episode impacts positional encoding, so make sure to set this accordingly + + # Setup agent and load its model parameters + action_space_shape = ( + (env.action_space.n,) if isinstance(env.action_space, gym.spaces.Discrete) else tuple(env.action_space.nvec) + ) + agent = Agent(args, env.observation_space, action_space_shape, max_episode_steps) + agent.load_state_dict(checkpoint["model_weights"]) + + # Setup Transformer-XL memory, mask and indices + memory = torch.zeros((1, max_episode_steps, args.trxl_num_layers, args.trxl_dim), dtype=torch.float32) + memory_mask = torch.tril(torch.ones((args.trxl_memory_length, args.trxl_memory_length)), diagonal=-1) + repetitions = torch.repeat_interleave( + torch.arange(0, args.trxl_memory_length).unsqueeze(0), args.trxl_memory_length - 1, dim=0 + ).long() + memory_indices = torch.stack( + [torch.arange(i, i + args.trxl_memory_length) for i in range(max_episode_steps - args.trxl_memory_length + 1)] + ).long() + memory_indices = torch.cat((repetitions, memory_indices)) + + # Run episode + done = False + t = 0 + while not done: + # Prepare observation and memory + obs = torch.Tensor(obs).unsqueeze(0) + memory_window = memory[0, memory_indices[t].unsqueeze(0)] + t_ = max(0, min(t, args.trxl_memory_length - 1)) + mask = memory_mask[t_].unsqueeze(0) + indices = memory_indices[t].unsqueeze(0) + # Forward agent + action, _, _, _, new_memory = agent.get_action_and_value(obs, memory_window, mask, indices) + memory[:, t] = new_memory + # Step + obs, reward, termination, truncation, info = env.step(action.cpu().squeeze().numpy()) + env.render() + done = termination or truncation + t += 1 + + if "r" in info["episode"].keys(): + print(f"Episode return: {info['episode']['r'][0]}, Episode length: {info['episode']['l'][0]}") + else: + print(f"Episode return: {info['reward']}, Episode length: {info['length']}") + env.close() diff --git a/cleanrl/ppo_trxl/poetry.lock b/cleanrl/ppo_trxl/poetry.lock new file mode 100644 index 000000000..8c70e2be1 --- /dev/null +++ b/cleanrl/ppo_trxl/poetry.lock @@ -0,0 +1,1582 @@ +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. + +[[package]] +name = "absl-py" +version = "2.1.0" +description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." +optional = false +python-versions = ">=3.7" +files = [ + {file = "absl-py-2.1.0.tar.gz", hash = "sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff"}, + {file = "absl_py-2.1.0-py3-none-any.whl", hash = "sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308"}, +] + +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = "*" +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] + +[[package]] +name = "backports-shutil-get-terminal-size" +version = "1.0.0" +description = "A backport of the get_terminal_size function from Python 3.3's shutil." +optional = false +python-versions = "*" +files = [ + {file = "backports.shutil_get_terminal_size-1.0.0-py2.py3-none-any.whl", hash = "sha256:0975ba55054c15e346944b38956a4c9cbee9009391e41b86c68990effb8c1f64"}, + {file = "backports.shutil_get_terminal_size-1.0.0.tar.gz", hash = "sha256:713e7a8228ae80341c70586d1cc0a8caa5207346927e23d09dcbcaf18eadec80"}, +] + +[[package]] +name = "certifi" +version = "2024.8.30" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "cloudpickle" +version = "3.0.0" +description = "Pickler class to extend the standard pickle.Pickler functionality" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cloudpickle-3.0.0-py3-none-any.whl", hash = "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7"}, + {file = "cloudpickle-3.0.0.tar.gz", hash = "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "docker-pycreds" +version = "0.4.0" +description = "Python bindings for the docker credentials store API" +optional = false +python-versions = "*" +files = [ + {file = "docker-pycreds-0.4.0.tar.gz", hash = "sha256:6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4"}, + {file = "docker_pycreds-0.4.0-py2.py3-none-any.whl", hash = "sha256:7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49"}, +] + +[package.dependencies] +six = ">=1.4.0" + +[[package]] +name = "docstring-parser" +version = "0.16" +description = "Parse Python docstrings in reST, Google and Numpydoc format" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "docstring_parser-0.16-py3-none-any.whl", hash = "sha256:bf0a1387354d3691d102edef7ec124f219ef639982d096e26e3b60aeffa90637"}, + {file = "docstring_parser-0.16.tar.gz", hash = "sha256:538beabd0af1e2db0146b6bd3caa526c35a34d61af9fd2887f3a8a27a739aa6e"}, +] + +[[package]] +name = "einops" +version = "0.7.0" +description = "A new flavour of deep learning operations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "einops-0.7.0-py3-none-any.whl", hash = "sha256:0f3096f26b914f465f6ff3c66f5478f9a5e380bb367ffc6493a68143fbbf1fd1"}, + {file = "einops-0.7.0.tar.gz", hash = "sha256:b2b04ad6081a3b227080c9bf5e3ace7160357ff03043cd66cc5b2319eb7031d1"}, +] + +[[package]] +name = "farama-notifications" +version = "0.0.4" +description = "Notifications for all Farama Foundation maintained libraries." +optional = false +python-versions = "*" +files = [ + {file = "Farama-Notifications-0.0.4.tar.gz", hash = "sha256:13fceff2d14314cf80703c8266462ebf3733c7d165336eee998fc58e545efd18"}, + {file = "Farama_Notifications-0.0.4-py3-none-any.whl", hash = "sha256:14de931035a41961f7c056361dc7f980762a143d05791ef5794a751a2caf05ae"}, +] + +[[package]] +name = "filelock" +version = "3.16.1" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +typing = ["typing-extensions (>=4.12.2)"] + +[[package]] +name = "fsspec" +version = "2024.9.0" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2024.9.0-py3-none-any.whl", hash = "sha256:a0947d552d8a6efa72cc2c730b12c41d043509156966cca4fb157b0f2a0c574b"}, + {file = "fsspec-2024.9.0.tar.gz", hash = "sha256:4b0afb90c2f21832df142f292649035d80b421f60a9e1c027802e5a0da2b04e8"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +dev = ["pre-commit", "ruff"] +doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] +tqdm = ["tqdm"] + +[[package]] +name = "gitdb" +version = "4.0.11" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.43" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, + {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] + +[[package]] +name = "grpcio" +version = "1.66.1" +description = "HTTP/2-based RPC framework" +optional = false +python-versions = ">=3.8" +files = [ + {file = "grpcio-1.66.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:4877ba180591acdf127afe21ec1c7ff8a5ecf0fe2600f0d3c50e8c4a1cbc6492"}, + {file = "grpcio-1.66.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3750c5a00bd644c75f4507f77a804d0189d97a107eb1481945a0cf3af3e7a5ac"}, + {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:a013c5fbb12bfb5f927444b477a26f1080755a931d5d362e6a9a720ca7dbae60"}, + {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1b24c23d51a1e8790b25514157d43f0a4dce1ac12b3f0b8e9f66a5e2c4c132f"}, + {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7ffb8ea674d68de4cac6f57d2498fef477cef582f1fa849e9f844863af50083"}, + {file = "grpcio-1.66.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:307b1d538140f19ccbd3aed7a93d8f71103c5d525f3c96f8616111614b14bf2a"}, + {file = "grpcio-1.66.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1c17ebcec157cfb8dd445890a03e20caf6209a5bd4ac5b040ae9dbc59eef091d"}, + {file = "grpcio-1.66.1-cp310-cp310-win32.whl", hash = "sha256:ef82d361ed5849d34cf09105d00b94b6728d289d6b9235513cb2fcc79f7c432c"}, + {file = "grpcio-1.66.1-cp310-cp310-win_amd64.whl", hash = "sha256:292a846b92cdcd40ecca46e694997dd6b9be6c4c01a94a0dfb3fcb75d20da858"}, + {file = "grpcio-1.66.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:c30aeceeaff11cd5ddbc348f37c58bcb96da8d5aa93fed78ab329de5f37a0d7a"}, + {file = "grpcio-1.66.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8a1e224ce6f740dbb6b24c58f885422deebd7eb724aff0671a847f8951857c26"}, + {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a66fe4dc35d2330c185cfbb42959f57ad36f257e0cc4557d11d9f0a3f14311df"}, + {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3ba04659e4fce609de2658fe4dbf7d6ed21987a94460f5f92df7579fd5d0e22"}, + {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4573608e23f7e091acfbe3e84ac2045680b69751d8d67685ffa193a4429fedb1"}, + {file = "grpcio-1.66.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7e06aa1f764ec8265b19d8f00140b8c4b6ca179a6dc67aa9413867c47e1fb04e"}, + {file = "grpcio-1.66.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3885f037eb11f1cacc41f207b705f38a44b69478086f40608959bf5ad85826dd"}, + {file = "grpcio-1.66.1-cp311-cp311-win32.whl", hash = "sha256:97ae7edd3f3f91480e48ede5d3e7d431ad6005bfdbd65c1b56913799ec79e791"}, + {file = "grpcio-1.66.1-cp311-cp311-win_amd64.whl", hash = "sha256:cfd349de4158d797db2bd82d2020554a121674e98fbe6b15328456b3bf2495bb"}, + {file = "grpcio-1.66.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:a92c4f58c01c77205df6ff999faa008540475c39b835277fb8883b11cada127a"}, + {file = "grpcio-1.66.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fdb14bad0835914f325349ed34a51940bc2ad965142eb3090081593c6e347be9"}, + {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:f03a5884c56256e08fd9e262e11b5cfacf1af96e2ce78dc095d2c41ccae2c80d"}, + {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ca2559692d8e7e245d456877a85ee41525f3ed425aa97eb7a70fc9a79df91a0"}, + {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ca1be089fb4446490dd1135828bd42a7c7f8421e74fa581611f7afdf7ab761"}, + {file = "grpcio-1.66.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d639c939ad7c440c7b2819a28d559179a4508783f7e5b991166f8d7a34b52815"}, + {file = "grpcio-1.66.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b9feb4e5ec8dc2d15709f4d5fc367794d69277f5d680baf1910fc9915c633524"}, + {file = "grpcio-1.66.1-cp312-cp312-win32.whl", hash = "sha256:7101db1bd4cd9b880294dec41a93fcdce465bdbb602cd8dc5bd2d6362b618759"}, + {file = "grpcio-1.66.1-cp312-cp312-win_amd64.whl", hash = "sha256:b0aa03d240b5539648d996cc60438f128c7f46050989e35b25f5c18286c86734"}, + {file = "grpcio-1.66.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:ecfe735e7a59e5a98208447293ff8580e9db1e890e232b8b292dc8bd15afc0d2"}, + {file = "grpcio-1.66.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4825a3aa5648010842e1c9d35a082187746aa0cdbf1b7a2a930595a94fb10fce"}, + {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:f517fd7259fe823ef3bd21e508b653d5492e706e9f0ef82c16ce3347a8a5620c"}, + {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1fe60d0772831d96d263b53d83fb9a3d050a94b0e94b6d004a5ad111faa5b5b"}, + {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31a049daa428f928f21090403e5d18ea02670e3d5d172581670be006100db9ef"}, + {file = "grpcio-1.66.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f914386e52cbdeb5d2a7ce3bf1fdfacbe9d818dd81b6099a05b741aaf3848bb"}, + {file = "grpcio-1.66.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bff2096bdba686019fb32d2dde45b95981f0d1490e054400f70fc9a8af34b49d"}, + {file = "grpcio-1.66.1-cp38-cp38-win32.whl", hash = "sha256:aa8ba945c96e73de29d25331b26f3e416e0c0f621e984a3ebdb2d0d0b596a3b3"}, + {file = "grpcio-1.66.1-cp38-cp38-win_amd64.whl", hash = "sha256:161d5c535c2bdf61b95080e7f0f017a1dfcb812bf54093e71e5562b16225b4ce"}, + {file = "grpcio-1.66.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:d0cd7050397b3609ea51727b1811e663ffda8bda39c6a5bb69525ef12414b503"}, + {file = "grpcio-1.66.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0e6c9b42ded5d02b6b1fea3a25f036a2236eeb75d0579bfd43c0018c88bf0a3e"}, + {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:c9f80f9fad93a8cf71c7f161778ba47fd730d13a343a46258065c4deb4b550c0"}, + {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dd67ed9da78e5121efc5c510f0122a972216808d6de70953a740560c572eb44"}, + {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48b0d92d45ce3be2084b92fb5bae2f64c208fea8ceed7fccf6a7b524d3c4942e"}, + {file = "grpcio-1.66.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4d813316d1a752be6f5c4360c49f55b06d4fe212d7df03253dfdae90c8a402bb"}, + {file = "grpcio-1.66.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9c9bebc6627873ec27a70fc800f6083a13c70b23a5564788754b9ee52c5aef6c"}, + {file = "grpcio-1.66.1-cp39-cp39-win32.whl", hash = "sha256:30a1c2cf9390c894c90bbc70147f2372130ad189cffef161f0432d0157973f45"}, + {file = "grpcio-1.66.1-cp39-cp39-win_amd64.whl", hash = "sha256:17663598aadbedc3cacd7bbde432f541c8e07d2496564e22b214b22c7523dac8"}, + {file = "grpcio-1.66.1.tar.gz", hash = "sha256:35334f9c9745add3e357e3372756fd32d925bd52c41da97f4dfdafbde0bf0ee2"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.66.1)"] + +[[package]] +name = "gymnasium" +version = "0.29.0" +description = "A standard API for reinforcement learning and a diverse set of reference environments (formerly Gym)." +optional = false +python-versions = ">=3.8" +files = [ + {file = "gymnasium-0.29.0-py3-none-any.whl", hash = "sha256:14a0e6ea9c4d34c0cd6e42e08c51e281834e9a83dc99b044427c9c6abf3b2a2b"}, + {file = "gymnasium-0.29.0.tar.gz", hash = "sha256:f012a2001fbbcbf70d0a2bff311aa3173efd6e3131811ab30ae06d43d31e94af"}, +] + +[package.dependencies] +cloudpickle = ">=1.2.0" +farama-notifications = ">=0.0.1" +numpy = ">=1.21.0" +typing-extensions = ">=4.3.0" + +[package.extras] +accept-rom-license = ["autorom[accept-rom-license] (>=0.4.2,<0.5.0)"] +all = ["box2d-py (==2.3.5)", "imageio (>=2.14.1)", "jax (>=0.4.0)", "jaxlib (>=0.4.0)", "lz4 (>=3.1.0)", "matplotlib (>=3.0)", "moviepy (>=1.0.0)", "mujoco (>=2.3.3)", "mujoco-py (>=2.1,<2.2)", "opencv-python (>=3.0)", "pygame (>=2.1.3)", "shimmy[atari] (>=0.1.0,<1.0)", "swig (==4.*)", "torch (>=1.0.0)"] +atari = ["shimmy[atari] (>=0.1.0,<1.0)"] +box2d = ["box2d-py (==2.3.5)", "pygame (>=2.1.3)", "swig (==4.*)"] +classic-control = ["pygame (>=2.1.3)", "pygame (>=2.1.3)"] +jax = ["jax (>=0.4.0)", "jaxlib (>=0.4.0)"] +mujoco = ["imageio (>=2.14.1)", "mujoco (>=2.3.3)"] +mujoco-py = ["mujoco-py (>=2.1,<2.2)", "mujoco-py (>=2.1,<2.2)"] +other = ["lz4 (>=3.1.0)", "matplotlib (>=3.0)", "moviepy (>=1.0.0)", "opencv-python (>=3.0)", "torch (>=1.0.0)"] +testing = ["pytest (==7.1.3)", "scipy (>=1.7.3)"] +toy-text = ["pygame (>=2.1.3)", "pygame (>=2.1.3)"] + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "markdown" +version = "3.7" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, + {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, +] + +[package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "memory-gym" +version = "1.0.2" +description = "A gym that contains the memory benchmarks Mortar Mayhem, Mystery Maze and Searing Spotlights" +optional = false +python-versions = ">=3.8" +files = [ + {file = "memory_gym-1.0.2-py3-none-any.whl", hash = "sha256:f012f2ffa91dbd2f9f2c5972f41ef7a96f5992a4cb5fdcf72f13eeec836dfbe4"}, + {file = "memory_gym-1.0.2.tar.gz", hash = "sha256:ce159f6f8c4c3d1a55ee4e08385e948bb9add68350cd3ed0fcd8cf82a0589c2a"}, +] + +[package.dependencies] +gymnasium = "0.29.0" +pygame = "2.4.0" + +[[package]] +name = "minigrid" +version = "2.3.1" +description = "Minimalistic gridworld reinforcement learning environments." +optional = false +python-versions = ">=3.7" +files = [ + {file = "minigrid-2.3.1-py3-none-any.whl", hash = "sha256:6e841a9f95378abe1fdb053d4dfaead1613ceb2fa1e9548a8525882fbdb4f6f3"}, + {file = "minigrid-2.3.1.tar.gz", hash = "sha256:9b08ccd1a99754eb8d26a3bde59b35c016861da20aae7fff559769b329c26b67"}, +] + +[package.dependencies] +gymnasium = ">=0.28.1" +numpy = ">=1.18.0" +pygame = ">=2.4.0" + +[package.extras] +testing = ["matplotlib (>=3.0)", "pytest (>=7.0.1)", "pytest-mock (>=3.10.0)"] + +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + +[[package]] +name = "networkx" +version = "3.3" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.10" +files = [ + {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"}, + {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"}, +] + +[package.extras] +default = ["matplotlib (>=3.6)", "numpy (>=1.23)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["myst-nb (>=1.0)", "numpydoc (>=1.7)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=2.0)", "pygraphviz (>=1.12)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "numpy" +version = "2.1.1" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.10" +files = [ + {file = "numpy-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8a0e34993b510fc19b9a2ce7f31cb8e94ecf6e924a40c0c9dd4f62d0aac47d9"}, + {file = "numpy-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7dd86dfaf7c900c0bbdcb8b16e2f6ddf1eb1fe39c6c8cca6e94844ed3152a8fd"}, + {file = "numpy-2.1.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:5889dd24f03ca5a5b1e8a90a33b5a0846d8977565e4ae003a63d22ecddf6782f"}, + {file = "numpy-2.1.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:59ca673ad11d4b84ceb385290ed0ebe60266e356641428c845b39cd9df6713ab"}, + {file = "numpy-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13ce49a34c44b6de5241f0b38b07e44c1b2dcacd9e36c30f9c2fcb1bb5135db7"}, + {file = "numpy-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913cc1d311060b1d409e609947fa1b9753701dac96e6581b58afc36b7ee35af6"}, + {file = "numpy-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:caf5d284ddea7462c32b8d4a6b8af030b6c9fd5332afb70e7414d7fdded4bfd0"}, + {file = "numpy-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:57eb525e7c2a8fdee02d731f647146ff54ea8c973364f3b850069ffb42799647"}, + {file = "numpy-2.1.1-cp310-cp310-win32.whl", hash = "sha256:9a8e06c7a980869ea67bbf551283bbed2856915f0a792dc32dd0f9dd2fb56728"}, + {file = "numpy-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:d10c39947a2d351d6d466b4ae83dad4c37cd6c3cdd6d5d0fa797da56f710a6ae"}, + {file = "numpy-2.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0d07841fd284718feffe7dd17a63a2e6c78679b2d386d3e82f44f0108c905550"}, + {file = "numpy-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b5613cfeb1adfe791e8e681128f5f49f22f3fcaa942255a6124d58ca59d9528f"}, + {file = "numpy-2.1.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0b8cc2715a84b7c3b161f9ebbd942740aaed913584cae9cdc7f8ad5ad41943d0"}, + {file = "numpy-2.1.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:b49742cdb85f1f81e4dc1b39dcf328244f4d8d1ded95dea725b316bd2cf18c95"}, + {file = "numpy-2.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8d5f8a8e3bc87334f025194c6193e408903d21ebaeb10952264943a985066ca"}, + {file = "numpy-2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf"}, + {file = "numpy-2.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:98ce7fb5b8063cfdd86596b9c762bf2b5e35a2cdd7e967494ab78a1fa7f8b86e"}, + {file = "numpy-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:24c2ad697bd8593887b019817ddd9974a7f429c14a5469d7fad413f28340a6d2"}, + {file = "numpy-2.1.1-cp311-cp311-win32.whl", hash = "sha256:397bc5ce62d3fb73f304bec332171535c187e0643e176a6e9421a6e3eacef06d"}, + {file = "numpy-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:ae8ce252404cdd4de56dcfce8b11eac3c594a9c16c231d081fb705cf23bd4d9e"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521"}, + {file = "numpy-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b"}, + {file = "numpy-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201"}, + {file = "numpy-2.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a"}, + {file = "numpy-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313"}, + {file = "numpy-2.1.1-cp312-cp312-win32.whl", hash = "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed"}, + {file = "numpy-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270"}, + {file = "numpy-2.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5"}, + {file = "numpy-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5"}, + {file = "numpy-2.1.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136"}, + {file = "numpy-2.1.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0"}, + {file = "numpy-2.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb"}, + {file = "numpy-2.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df"}, + {file = "numpy-2.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78"}, + {file = "numpy-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556"}, + {file = "numpy-2.1.1-cp313-cp313-win32.whl", hash = "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b"}, + {file = "numpy-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0"}, + {file = "numpy-2.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553"}, + {file = "numpy-2.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480"}, + {file = "numpy-2.1.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f"}, + {file = "numpy-2.1.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468"}, + {file = "numpy-2.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef"}, + {file = "numpy-2.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f"}, + {file = "numpy-2.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c"}, + {file = "numpy-2.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec"}, + {file = "numpy-2.1.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7be6a07520b88214ea85d8ac8b7d6d8a1839b0b5cb87412ac9f49fa934eb15d5"}, + {file = "numpy-2.1.1-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:52ac2e48f5ad847cd43c4755520a2317f3380213493b9d8a4c5e37f3b87df504"}, + {file = "numpy-2.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50a95ca3560a6058d6ea91d4629a83a897ee27c00630aed9d933dff191f170cd"}, + {file = "numpy-2.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:99f4a9ee60eed1385a86e82288971a51e71df052ed0b2900ed30bc840c0f2e39"}, + {file = "numpy-2.1.1.tar.gz", hash = "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd"}, +] + +[[package]] +name = "nvidia-cublas-cu11" +version = "11.11.3.6" +description = "CUBLAS native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cublas_cu11-11.11.3.6-py3-none-manylinux1_x86_64.whl", hash = "sha256:39fb40e8f486dd8a2ddb8fdeefe1d5b28f5b99df01c87ab3676f057a74a5a6f3"}, + {file = "nvidia_cublas_cu11-11.11.3.6-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5ccae9e069a2c6be9af9cb5a0b0c6928c19c7915e390d15f598a1eead2a01a7a"}, + {file = "nvidia_cublas_cu11-11.11.3.6-py3-none-manylinux2014_x86_64.whl", hash = "sha256:60252822adea5d0b10cd990a7dc7bedf7435f30ae40083c7a624a85a43225abc"}, + {file = "nvidia_cublas_cu11-11.11.3.6-py3-none-win_amd64.whl", hash = "sha256:6ab12b1302bef8ac1ff4414edd1c059e57f4833abef9151683fb8f4de25900be"}, +] + +[[package]] +name = "nvidia-cuda-cupti-cu11" +version = "11.8.87" +description = "CUDA profiling tools runtime libs." +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_cupti_cu11-11.8.87-py3-none-manylinux1_x86_64.whl", hash = "sha256:0e50c707df56c75a2c0703dc6b886f3c97a22f37d6f63839f75b7418ba672a8d"}, + {file = "nvidia_cuda_cupti_cu11-11.8.87-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9aaa638963a8271df26b6ee0d93b781730b7acc6581ff700bd023d7934e4385e"}, + {file = "nvidia_cuda_cupti_cu11-11.8.87-py3-none-manylinux2014_x86_64.whl", hash = "sha256:4191a17913a706b5098681280cd089cd7d8d3df209a6f5cb79384974a96d24f2"}, + {file = "nvidia_cuda_cupti_cu11-11.8.87-py3-none-win_amd64.whl", hash = "sha256:4332d8550ad5f5b673f98d08e4e4f82030cb604c66d8d5ee919399ea01312e58"}, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu11" +version = "11.8.89" +description = "NVRTC native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_nvrtc_cu11-11.8.89-py3-none-manylinux1_x86_64.whl", hash = "sha256:1f27d67b0f72902e9065ae568b4f6268dfe49ba3ed269c9a3da99bb86d1d2008"}, + {file = "nvidia_cuda_nvrtc_cu11-11.8.89-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8ab17ed51e7c4928f7170a0551e3e3b42f89d973bd267ced9688c238b3e10aef"}, + {file = "nvidia_cuda_nvrtc_cu11-11.8.89-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a8d02f3cba345be56b1ffc3e74d8f61f02bb758dd31b0f20e12277a5a244f756"}, + {file = "nvidia_cuda_nvrtc_cu11-11.8.89-py3-none-win_amd64.whl", hash = "sha256:e18a23a8f4064664a6f1c4a64f38c581cbebfb5935280e94a4943ea8ae3791b1"}, +] + +[[package]] +name = "nvidia-cuda-runtime-cu11" +version = "11.8.89" +description = "CUDA Runtime native Libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_runtime_cu11-11.8.89-py3-none-manylinux1_x86_64.whl", hash = "sha256:f587bd726eb2f7612cf77ce38a2c1e65cf23251ff49437f6161ce0d647f64f7c"}, + {file = "nvidia_cuda_runtime_cu11-11.8.89-py3-none-manylinux2014_aarch64.whl", hash = "sha256:e53bf160b6b660819cb6e4a9da2cc89e6aa2329858299780a2459780a2b8d012"}, + {file = "nvidia_cuda_runtime_cu11-11.8.89-py3-none-manylinux2014_x86_64.whl", hash = "sha256:92d04069a987e1fbc9213f8376d265df0f7bb42617d44f5eda1f496acea7f2d1"}, + {file = "nvidia_cuda_runtime_cu11-11.8.89-py3-none-win_amd64.whl", hash = "sha256:f60c9fdaed8065b38de8097867240efc5556a8a710007146daeb9082334a6e63"}, +] + +[[package]] +name = "nvidia-cudnn-cu11" +version = "9.1.0.70" +description = "cuDNN runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cudnn_cu11-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e6135ac63fe9d5b0b89cfb35c3fc1c1349f2b995becadf2e9dc21bca89d9633d"}, + {file = "nvidia_cudnn_cu11-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:32f6a2fe80b4b7ebc5f9c4cb403c4c381eca99e6daa3cf38241047b3d3e14daa"}, +] + +[package.dependencies] +nvidia-cublas-cu11 = "*" + +[[package]] +name = "nvidia-cufft-cu11" +version = "10.9.0.58" +description = "CUFFT native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cufft_cu11-10.9.0.58-py3-none-manylinux1_x86_64.whl", hash = "sha256:222f9da70c80384632fd6035e4c3f16762d64ea7a843829cb278f98b3cb7dd81"}, + {file = "nvidia_cufft_cu11-10.9.0.58-py3-none-manylinux2014_aarch64.whl", hash = "sha256:34b7315104e615b230dc3c2d1861f13bff9ec465c5d3b4bb65b4986d03a1d8d4"}, + {file = "nvidia_cufft_cu11-10.9.0.58-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e21037259995243cc370dd63c430d77ae9280bedb68d5b5a18226bfc92e5d748"}, + {file = "nvidia_cufft_cu11-10.9.0.58-py3-none-win_amd64.whl", hash = "sha256:c4d316f17c745ec9c728e30409612eaf77a8404c3733cdf6c9c1569634d1ca03"}, +] + +[[package]] +name = "nvidia-curand-cu11" +version = "10.3.0.86" +description = "CURAND native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_curand_cu11-10.3.0.86-py3-none-manylinux1_x86_64.whl", hash = "sha256:ac439548c88580269a1eb6aeb602a5aed32f0dbb20809a31d9ed7d01d77f6bf5"}, + {file = "nvidia_curand_cu11-10.3.0.86-py3-none-manylinux2014_aarch64.whl", hash = "sha256:64defc3016d8c1de351a764617818c2961210430f12476faee10084b269b188c"}, + {file = "nvidia_curand_cu11-10.3.0.86-py3-none-manylinux2014_x86_64.whl", hash = "sha256:cd4cffbf78bb06580206b4814d5dc696d1161c902aae37b2bba00056832379e6"}, + {file = "nvidia_curand_cu11-10.3.0.86-py3-none-win_amd64.whl", hash = "sha256:8fa8365065fc3e3760d7437b08f164a6bcf8f7124f3b544d2463ded01e6bdc70"}, +] + +[[package]] +name = "nvidia-cusolver-cu11" +version = "11.4.1.48" +description = "CUDA solver native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusolver_cu11-11.4.1.48-py3-none-manylinux1_x86_64.whl", hash = "sha256:ca538f545645b7e6629140786d3127fe067b3d5a085bd794cde5bfe877c8926f"}, + {file = "nvidia_cusolver_cu11-11.4.1.48-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1a96acb05768610bc414dbef5b25ebd2d820fc8a1e8c72097f41f53d80934d61"}, + {file = "nvidia_cusolver_cu11-11.4.1.48-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea9fb1ad8c644ca9ed55af13cc39af3b7ba4c3eb5aef18471fe1fe77d94383cb"}, + {file = "nvidia_cusolver_cu11-11.4.1.48-py3-none-win_amd64.whl", hash = "sha256:7efe43b113495a64e2cf9a0b4365bd53b0a82afb2e2cf91e9f993c9ef5e69ee8"}, +] + +[package.dependencies] +nvidia-cublas-cu11 = "*" + +[[package]] +name = "nvidia-cusparse-cu11" +version = "11.7.5.86" +description = "CUSPARSE native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusparse_cu11-11.7.5.86-py3-none-manylinux1_x86_64.whl", hash = "sha256:4ae709fe78d3f23f60acaba8c54b8ad556cf16ca486e0cc1aa92dca7555d2d2b"}, + {file = "nvidia_cusparse_cu11-11.7.5.86-py3-none-manylinux2014_aarch64.whl", hash = "sha256:6c7da46abee7567e619d4aa2e90a1b032cfcbd1211d429853b1a6e87514a14b2"}, + {file = "nvidia_cusparse_cu11-11.7.5.86-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8d7cf1628fd8d462b5d2ba6678fae34733a48ecb80495b9c68672ec6a6dde5ef"}, + {file = "nvidia_cusparse_cu11-11.7.5.86-py3-none-win_amd64.whl", hash = "sha256:a0f6ee81cd91be606fc2f55992d06b09cd4e86d74b6ae5e8dd1631cf7f5a8706"}, +] + +[[package]] +name = "nvidia-nccl-cu11" +version = "2.20.5" +description = "NVIDIA Collective Communication Library (NCCL) Runtime" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nccl_cu11-2.20.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:3619e25dfb0c8f4c554561c3459ee7dfe1250eed05e9aa4d147a75c45cc6ae0d"}, +] + +[[package]] +name = "nvidia-nvtx-cu11" +version = "11.8.86" +description = "NVIDIA Tools Extension" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvtx_cu11-11.8.86-py3-none-manylinux1_x86_64.whl", hash = "sha256:890656d8bd9b4e280231c832e1f0d03459200ba4824ddda3dcb59b1e1989b9f5"}, + {file = "nvidia_nvtx_cu11-11.8.86-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5e84b97062eb102b45a8a9172a06cfe28b239b1635075a13d6474e91295e0468"}, + {file = "nvidia_nvtx_cu11-11.8.86-py3-none-manylinux2014_x86_64.whl", hash = "sha256:979f5b2aef5da164c5c53c64c85c3dfa61b8b4704f4f963bb568bf98fa8472e8"}, + {file = "nvidia_nvtx_cu11-11.8.86-py3-none-win_amd64.whl", hash = "sha256:54031010ee38d774b2991004d88f90bbd7bbc1458a96bbc4b42662756508c252"}, +] + +[[package]] +name = "opencv-python" +version = "4.10.0.84" +description = "Wrapper package for OpenCV python bindings." +optional = false +python-versions = ">=3.6" +files = [ + {file = "opencv-python-4.10.0.84.tar.gz", hash = "sha256:72d234e4582e9658ffea8e9cae5b63d488ad06994ef12d81dc303b17472f3526"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:fc182f8f4cda51b45f01c64e4cbedfc2f00aff799debebc305d8d0210c43f251"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-macosx_12_0_x86_64.whl", hash = "sha256:71e575744f1d23f79741450254660442785f45a0797212852ee5199ef12eed98"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09a332b50488e2dda866a6c5573ee192fe3583239fb26ff2f7f9ceb0bc119ea6"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ace140fc6d647fbe1c692bcb2abce768973491222c067c131d80957c595b71f"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-win32.whl", hash = "sha256:2db02bb7e50b703f0a2d50c50ced72e95c574e1e5a0bb35a8a86d0b35c98c236"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-win_amd64.whl", hash = "sha256:32dbbd94c26f611dc5cc6979e6b7aa1f55a64d6b463cc1dcd3c95505a63e48fe"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, + {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\" and python_version < \"3.11\""}, + {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\" and python_version < \"3.11\""}, +] + +[[package]] +name = "packaging" +version = "24.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] + +[[package]] +name = "protobuf" +version = "4.25.4" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-4.25.4-cp310-abi3-win32.whl", hash = "sha256:db9fd45183e1a67722cafa5c1da3e85c6492a5383f127c86c4c4aa4845867dc4"}, + {file = "protobuf-4.25.4-cp310-abi3-win_amd64.whl", hash = "sha256:ba3d8504116a921af46499471c63a85260c1a5fc23333154a427a310e015d26d"}, + {file = "protobuf-4.25.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:eecd41bfc0e4b1bd3fa7909ed93dd14dd5567b98c941d6c1ad08fdcab3d6884b"}, + {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:4c8a70fdcb995dcf6c8966cfa3a29101916f7225e9afe3ced4395359955d3835"}, + {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:3319e073562e2515c6ddc643eb92ce20809f5d8f10fead3332f71c63be6a7040"}, + {file = "protobuf-4.25.4-cp38-cp38-win32.whl", hash = "sha256:7e372cbbda66a63ebca18f8ffaa6948455dfecc4e9c1029312f6c2edcd86c4e1"}, + {file = "protobuf-4.25.4-cp38-cp38-win_amd64.whl", hash = "sha256:051e97ce9fa6067a4546e75cb14f90cf0232dcb3e3d508c448b8d0e4265b61c1"}, + {file = "protobuf-4.25.4-cp39-cp39-win32.whl", hash = "sha256:90bf6fd378494eb698805bbbe7afe6c5d12c8e17fca817a646cd6a1818c696ca"}, + {file = "protobuf-4.25.4-cp39-cp39-win_amd64.whl", hash = "sha256:ac79a48d6b99dfed2729ccccee547b34a1d3d63289c71cef056653a846a2240f"}, + {file = "protobuf-4.25.4-py3-none-any.whl", hash = "sha256:bfbebc1c8e4793cfd58589acfb8a1026be0003e852b9da7db5a4285bde996978"}, + {file = "protobuf-4.25.4.tar.gz", hash = "sha256:0dc4a62cc4052a036ee2204d26fe4d835c62827c855c8a03f29fe6da146b380d"}, +] + +[[package]] +name = "psutil" +version = "6.0.0" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, + {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, + {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, + {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, + {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, + {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, + {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, + {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, + {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, + {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "pygame" +version = "2.4.0" +description = "Python Game Development" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pygame-2.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:63591f381e5b28b90e115ac7a96f8ce5ecb917facb42d79d4f89714f89cc6d8e"}, + {file = "pygame-2.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:13511c7c29f0fc23636f3b95a96ab45f964e84073e7e27dc602a479cd274d89a"}, + {file = "pygame-2.4.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1b7201a44869eb420dd56c8e003251c9e7422c5304b3e78508e767a5634ab31b"}, + {file = "pygame-2.4.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3ab14e06c302921f33d25180813711a920acef386d3992fc21731d2d5e8e86f0"}, + {file = "pygame-2.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:418659c2d42f6a2356e2691006d79b6e07fd4992f9e904a2638c51c992f3e41b"}, + {file = "pygame-2.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e70fd71e0321a805001192e08ae4af45b86c68f155670230c3f6f4dd25089e70"}, + {file = "pygame-2.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab8115af26a9e95f39b08fff416f097803480f265500b218a5ca065d6e73124f"}, + {file = "pygame-2.4.0-cp310-cp310-win32.whl", hash = "sha256:4ffec9661731fb674ccc88d1de92709219047af3d8198d0e6203c21f3f1b54a7"}, + {file = "pygame-2.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:bb5a39320d00fa781959d2d0151e6f0293dd1398c6dc9dc934112ecce7b4fb52"}, + {file = "pygame-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:23543e2d206d8de7d6db4f7b1c74e6fea6c01ead63caf7252e63341e1cdb09f6"}, + {file = "pygame-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4b562cfdd8caa76ba47ca2a9211fee6b0a95ceb95c9da94cf60a3909b2300854"}, + {file = "pygame-2.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:751bc57e4c3b7cd92762344562dcbd405e2b54488de1d7a1e083a470bdbc5ae9"}, + {file = "pygame-2.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9b1127f085d09c7c0a976d440e8fc2f7adc579d62abcfc20c23c2699bbe2dc1"}, + {file = "pygame-2.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47fd096ceb68d966681f8d0e820f7305bf05b30421ca562cfdb3c89a5aef26e5"}, + {file = "pygame-2.4.0-cp311-cp311-win32.whl", hash = "sha256:de963a4b8787d93a9fba8f4052d9dde8b12adbeac5781e48035be1557dfadb20"}, + {file = "pygame-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:75ef535ebe541b74a160bb59c3e520f543250d19f69d5973350ec1b9706e1469"}, + {file = "pygame-2.4.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ca2ecc65126eaaa5b8e6a119913cfb2c2b1ed4c8ee1b980baf333aa9d379f227"}, + {file = "pygame-2.4.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4a98ed8c47e367b9233b5ca25c36c2b45ab61959ac543195f0b6349f0a599ec8"}, + {file = "pygame-2.4.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00ecd4688ee25d5d4cf48eddab18749a9bb2b382772f7fa8a987e4d21026c603"}, + {file = "pygame-2.4.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99c296ecb8ce6ea1f404f4d174fdb215c64515827778525301c29ddf6f8e6e07"}, + {file = "pygame-2.4.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6b94fc99487ce4a45ce00fa9145f4861f6e021254a005101d00bc17a4bb4f5c"}, + {file = "pygame-2.4.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3020fb98f27a6ea79418a5b332ca07be93884e4a455c8a0a31b2dcf39ee2d96"}, + {file = "pygame-2.4.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8f97c8be81b3262ad8dae982485c4a73c9f2374614dfc0db8eb0f754badb29d6"}, + {file = "pygame-2.4.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:be7f948d33d0536c2922289e6f5983251cb0bd0d727db6ff692886c239f47a2c"}, + {file = "pygame-2.4.0-cp36-cp36m-win32.whl", hash = "sha256:a66b314f4a637784d5ca2970745bb2e6e554447dce8f4cfedd9b9fcef5e3ffc6"}, + {file = "pygame-2.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:c09323eeae9e0cb2ced0cb3635485ae17f4f1b2b6b908a494ce2d830c609d4be"}, + {file = "pygame-2.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4241e1da3852a955d37a22157ed51b2d30a65f7987eac9d162bb302fb754d87"}, + {file = "pygame-2.4.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:802b03f6c367359c94eb6a90169666efa1aa1d6e24fce37a0b21642ccdfe48cf"}, + {file = "pygame-2.4.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:79b0962a8f09788ca735532cfcf2dd053424fe5eabbda564b74f8e5e2eb11f48"}, + {file = "pygame-2.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:627c8bb007a757da18d32c5d9b7ac50ab0356d9e922d570b0572765778080787"}, + {file = "pygame-2.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f576403c2b14f0eea694365b9018d5bacac70b1550261ffc7a54a92e18967541"}, + {file = "pygame-2.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5210cb09ec31281e16fda008bf8dfe2e024eef58e075dd0c01935d0004fdfffd"}, + {file = "pygame-2.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6060d68d10fafd51c4cb3a7d687d741009881860dfd429c863e570877e2ce9de"}, + {file = "pygame-2.4.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6c0081546749c0b4341ce575622a4f8eee05f675d3a0872ab6aed6e5bd2ba5a8"}, + {file = "pygame-2.4.0-cp37-cp37m-win32.whl", hash = "sha256:fa2531f83e7c5f6f7cc20a1b4e0f982bd608aad81ff6c385148e64256ab0419f"}, + {file = "pygame-2.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:cff815181437add5f3d702e8c7f1d2aa4ed04ed04cde27ec809e7ac516ee6b5f"}, + {file = "pygame-2.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53bfdc1aea619fa8d347be37b08de87089d543375948aacf8b163b0c5eb6d4e4"}, + {file = "pygame-2.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7fa1e65fd559823997f39a592cb49d8c89dd31c8bbde8273fe3922e2c1f294f6"}, + {file = "pygame-2.4.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:65ee75e0e83e393fdc5c06e55e376c7511881a5ebee006ecca89cb1b3b41d6f1"}, + {file = "pygame-2.4.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fbcba1b06f42338fecbd366227025f81729d9f4a577677fd3cd1ceff34d7286a"}, + {file = "pygame-2.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b04451e5addae3a078a7a4f494e6b217025f4813dfb364a49c250fc5dfd1d2e2"}, + {file = "pygame-2.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faa3b63b71d555e7a21cecc11c65e059d9cb1902158d863ac3592e1947bc521a"}, + {file = "pygame-2.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef14750fa60b47510cfe9c7c37e7abe67617f5d1f1a8ffa257a59d49836dadda"}, + {file = "pygame-2.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5a2aee4214e5efed2cb3650139010dd4d0b1c29a9760278ab259d0b46281b66a"}, + {file = "pygame-2.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:47be83060a9dbc79763fd230f04d53a29064b5f64d1b59425c432d3570b22623"}, + {file = "pygame-2.4.0-cp38-cp38-win32.whl", hash = "sha256:14492d8c0eaad778bb10b6d53eaea4ef77f4d3431b6b7c857397dc6cf4397ac9"}, + {file = "pygame-2.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:6ba967d0e3fed8611f1face6695dc8fa554ee543d300681f8080f5de9cc7da73"}, + {file = "pygame-2.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f6b7a604812f447495829751dfe7ab57cb31c2c9acdb07ba4b7157490411a12"}, + {file = "pygame-2.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e2a3176b33b97ebae397f951d254e3155a0afe730e1b76fb35126555c27dd3b5"}, + {file = "pygame-2.4.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6ec870a63295ebff737640c4ef39868312e206dcba655b4ad5c7d0e8c2488b73"}, + {file = "pygame-2.4.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e75d8c2980d719045be366160568bf508cbbed21285efe32468c75abcd4cf8b3"}, + {file = "pygame-2.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e5d32def075e495b4802371fd8cda96ff4957aa39e215f83d87022dedf14cfb"}, + {file = "pygame-2.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cad74cbbefbdb81cb22a9ea22561614b8dc58fcd52cd54126bbb8ee9ee77a5d5"}, + {file = "pygame-2.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c75dd345707da622c78dbd6a63a025f7b89377ddc4e71ba40043929824f5d4"}, + {file = "pygame-2.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075c1282b1d307669c8ef29942564b91acb85623bedba3bfb841079d539ded31"}, + {file = "pygame-2.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1422673a2b485153cbc20dbbd37af791c9842ca98a1b7a89fe3ac115cce79805"}, + {file = "pygame-2.4.0-cp39-cp39-win32.whl", hash = "sha256:fb7bb86c4aedb4382d7f643ff7d21ab4731d59ddb9b448e78b9125ab1addc007"}, + {file = "pygame-2.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:93bb1406125ae9bd7a9bb0d45f11b30f157ea8d2efee1ebe9d781b1d1a9fce6b"}, + {file = "pygame-2.4.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:2946c151691c80ffb9f3f39e1f294d7ed9edaae1814e528d2f5b4751e7e6d903"}, + {file = "pygame-2.4.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80502eb26483b0206d0508475ec7d67a86bc0afc5bb4aad3a6172a7a85a27554"}, + {file = "pygame-2.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9c8bb7b77f97eb49dac900445fbf96a332d2072588949d6396581933843fb04"}, + {file = "pygame-2.4.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8b6e1493724d29e46a0e7e8125d9808c9957c652db67afe9497d385509fc5ac5"}, + {file = "pygame-2.4.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43db3a6c9be3d94eececf7c86cde7584d2bb87f394ade40139c3b4e528fdff24"}, + {file = "pygame-2.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32ed4d4317bce8fe78592a7b5b4a07f2e0ff814e35c66cb5a3b398dae96c3f27"}, + {file = "pygame-2.4.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e5f043751840a07ff0160abe46ed42a88bc29baee93656abb5a050beda176306"}, + {file = "pygame-2.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:867cf19f1c7aa6f187a0a31b702f5668e935e700b46d94bd58e94ec8581cf081"}, + {file = "pygame-2.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a93d368311d40827dc5f0cad2a0e9a8700c1b017346808cfdfd9ea98aee45df"}, + {file = "pygame-2.4.0.tar.gz", hash = "sha256:e3603e70e96ee30af1954ce57d4922a059402f368013e7138e90f1c03d185267"}, +] + +[[package]] +name = "pygments" +version = "2.18.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "reprint" +version = "0.6.0" +description = "A simple module for Python2/3 to print and refresh multi line output contents in terminal" +optional = false +python-versions = "*" +files = [ + {file = "reprint-0.6.0-py2.py3-none-any.whl", hash = "sha256:0ebc4dc21aefc810205f3fcc21783ea91bb96292a8500663482e864989bff54d"}, +] + +[package.dependencies] +"backports.shutil-get-terminal-size" = "*" +colorama = "*" +six = "*" + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rich" +version = "13.8.1" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.8.1-py3-none-any.whl", hash = "sha256:1760a3c0848469b97b558fc61c85233e3dafb69c7a071b4d60c38099d3cd4c06"}, + {file = "rich-13.8.1.tar.gz", hash = "sha256:8260cda28e3db6bf04d2d1ef4dbc03ba80a824c88b0e7668a0f23126a424844a"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "sentry-sdk" +version = "2.14.0" +description = "Python client for Sentry (https://sentry.io)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sentry_sdk-2.14.0-py2.py3-none-any.whl", hash = "sha256:b8bc3dc51d06590df1291b7519b85c75e2ced4f28d9ea655b6d54033503b5bf4"}, + {file = "sentry_sdk-2.14.0.tar.gz", hash = "sha256:1e0e2eaf6dad918c7d1e0edac868a7bf20017b177f242cefe2a6bcd47955961d"}, +] + +[package.dependencies] +certifi = "*" +urllib3 = ">=1.26.11" + +[package.extras] +aiohttp = ["aiohttp (>=3.5)"] +anthropic = ["anthropic (>=0.16)"] +arq = ["arq (>=0.23)"] +asyncpg = ["asyncpg (>=0.23)"] +beam = ["apache-beam (>=2.12)"] +bottle = ["bottle (>=0.12.13)"] +celery = ["celery (>=3)"] +celery-redbeat = ["celery-redbeat (>=2)"] +chalice = ["chalice (>=1.16.0)"] +clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] +django = ["django (>=1.8)"] +falcon = ["falcon (>=1.4)"] +fastapi = ["fastapi (>=0.79.0)"] +flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] +grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"] +httpx = ["httpx (>=0.16.0)"] +huey = ["huey (>=2)"] +huggingface-hub = ["huggingface-hub (>=0.22)"] +langchain = ["langchain (>=0.0.210)"] +litestar = ["litestar (>=2.0.0)"] +loguru = ["loguru (>=0.5)"] +openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] +opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +opentelemetry-experimental = ["opentelemetry-distro"] +pure-eval = ["asttokens", "executing", "pure-eval"] +pymongo = ["pymongo (>=3.1)"] +pyspark = ["pyspark (>=2.4.4)"] +quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] +rq = ["rq (>=0.6)"] +sanic = ["sanic (>=0.8)"] +sqlalchemy = ["sqlalchemy (>=1.2)"] +starlette = ["starlette (>=0.19.1)"] +starlite = ["starlite (>=1.48)"] +tornado = ["tornado (>=6)"] + +[[package]] +name = "setproctitle" +version = "1.3.3" +description = "A Python module to customize the process title" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:897a73208da48db41e687225f355ce993167079eda1260ba5e13c4e53be7f754"}, + {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c331e91a14ba4076f88c29c777ad6b58639530ed5b24b5564b5ed2fd7a95452"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbbd6c7de0771c84b4aa30e70b409565eb1fc13627a723ca6be774ed6b9d9fa3"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c05ac48ef16ee013b8a326c63e4610e2430dbec037ec5c5b58fcced550382b74"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1342f4fdb37f89d3e3c1c0a59d6ddbedbde838fff5c51178a7982993d238fe4f"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc74e84fdfa96821580fb5e9c0b0777c1c4779434ce16d3d62a9c4d8c710df39"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9617b676b95adb412bb69645d5b077d664b6882bb0d37bfdafbbb1b999568d85"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6a249415f5bb88b5e9e8c4db47f609e0bf0e20a75e8d744ea787f3092ba1f2d0"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:38da436a0aaace9add67b999eb6abe4b84397edf4a78ec28f264e5b4c9d53cd5"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:da0d57edd4c95bf221b2ebbaa061e65b1788f1544977288bdf95831b6e44e44d"}, + {file = "setproctitle-1.3.3-cp310-cp310-win32.whl", hash = "sha256:a1fcac43918b836ace25f69b1dca8c9395253ad8152b625064415b1d2f9be4fb"}, + {file = "setproctitle-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:200620c3b15388d7f3f97e0ae26599c0c378fdf07ae9ac5a13616e933cbd2086"}, + {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:334f7ed39895d692f753a443102dd5fed180c571eb6a48b2a5b7f5b3564908c8"}, + {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:950f6476d56ff7817a8fed4ab207727fc5260af83481b2a4b125f32844df513a"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:195c961f54a09eb2acabbfc90c413955cf16c6e2f8caa2adbf2237d1019c7dd8"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f05e66746bf9fe6a3397ec246fe481096664a9c97eb3fea6004735a4daf867fd"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b5901a31012a40ec913265b64e48c2a4059278d9f4e6be628441482dd13fb8b5"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64286f8a995f2cd934082b398fc63fca7d5ffe31f0e27e75b3ca6b4efda4e353"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:184239903bbc6b813b1a8fc86394dc6ca7d20e2ebe6f69f716bec301e4b0199d"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:664698ae0013f986118064b6676d7dcd28fefd0d7d5a5ae9497cbc10cba48fa5"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e5119a211c2e98ff18b9908ba62a3bd0e3fabb02a29277a7232a6fb4b2560aa0"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:417de6b2e214e837827067048f61841f5d7fc27926f2e43954567094051aff18"}, + {file = "setproctitle-1.3.3-cp311-cp311-win32.whl", hash = "sha256:6a143b31d758296dc2f440175f6c8e0b5301ced3b0f477b84ca43cdcf7f2f476"}, + {file = "setproctitle-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a680d62c399fa4b44899094027ec9a1bdaf6f31c650e44183b50d4c4d0ccc085"}, + {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d4460795a8a7a391e3567b902ec5bdf6c60a47d791c3b1d27080fc203d11c9dc"}, + {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bdfd7254745bb737ca1384dee57e6523651892f0ea2a7344490e9caefcc35e64"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477d3da48e216d7fc04bddab67b0dcde633e19f484a146fd2a34bb0e9dbb4a1e"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ab2900d111e93aff5df9fddc64cf51ca4ef2c9f98702ce26524f1acc5a786ae7"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:088b9efc62d5aa5d6edf6cba1cf0c81f4488b5ce1c0342a8b67ae39d64001120"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6d50252377db62d6a0bb82cc898089916457f2db2041e1d03ce7fadd4a07381"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:87e668f9561fd3a457ba189edfc9e37709261287b52293c115ae3487a24b92f6"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:287490eb90e7a0ddd22e74c89a92cc922389daa95babc833c08cf80c84c4df0a"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe1c49486109f72d502f8be569972e27f385fe632bd8895f4730df3c87d5ac8"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4a6ba2494a6449b1f477bd3e67935c2b7b0274f2f6dcd0f7c6aceae10c6c6ba3"}, + {file = "setproctitle-1.3.3-cp312-cp312-win32.whl", hash = "sha256:2df2b67e4b1d7498632e18c56722851ba4db5d6a0c91aaf0fd395111e51cdcf4"}, + {file = "setproctitle-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:f38d48abc121263f3b62943f84cbaede05749047e428409c2c199664feb6abc7"}, + {file = "setproctitle-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:816330675e3504ae4d9a2185c46b573105d2310c20b19ea2b4596a9460a4f674"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f960bc22d8d8e4ac886d1e2e21ccbd283adcf3c43136161c1ba0fa509088e0"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00e6e7adff74796ef12753ff399491b8827f84f6c77659d71bd0b35870a17d8f"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53bc0d2358507596c22b02db079618451f3bd720755d88e3cccd840bafb4c41c"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6d20f9541f5f6ac63df553b6d7a04f313947f550eab6a61aa758b45f0d5657"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c1c84beab776b0becaa368254801e57692ed749d935469ac10e2b9b825dbdd8e"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:507e8dc2891021350eaea40a44ddd887c9f006e6b599af8d64a505c0f718f170"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b1067647ac7aba0b44b591936118a22847bda3c507b0a42d74272256a7a798e9"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2e71f6365744bf53714e8bd2522b3c9c1d83f52ffa6324bd7cbb4da707312cd8"}, + {file = "setproctitle-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:7f1d36a1e15a46e8ede4e953abb104fdbc0845a266ec0e99cc0492a4364f8c44"}, + {file = "setproctitle-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9a402881ec269d0cc9c354b149fc29f9ec1a1939a777f1c858cdb09c7a261df"}, + {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ff814dea1e5c492a4980e3e7d094286077054e7ea116cbeda138819db194b2cd"}, + {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:accb66d7b3ccb00d5cd11d8c6e07055a4568a24c95cf86109894dcc0c134cc89"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554eae5a5b28f02705b83a230e9d163d645c9a08914c0ad921df363a07cf39b1"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a911b26264dbe9e8066c7531c0591cfab27b464459c74385b276fe487ca91c12"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2982efe7640c4835f7355fdb4da313ad37fb3b40f5c69069912f8048f77b28c8"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df3f4274b80709d8bcab2f9a862973d453b308b97a0b423a501bcd93582852e3"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:af2c67ae4c795d1674a8d3ac1988676fa306bcfa1e23fddb5e0bd5f5635309ca"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:af4061f67fd7ec01624c5e3c21f6b7af2ef0e6bab7fbb43f209e6506c9ce0092"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:37a62cbe16d4c6294e84670b59cf7adcc73faafe6af07f8cb9adaf1f0e775b19"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a83ca086fbb017f0d87f240a8f9bbcf0809f3b754ee01cec928fff926542c450"}, + {file = "setproctitle-1.3.3-cp38-cp38-win32.whl", hash = "sha256:059f4ce86f8cc92e5860abfc43a1dceb21137b26a02373618d88f6b4b86ba9b2"}, + {file = "setproctitle-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:ab92e51cd4a218208efee4c6d37db7368fdf182f6e7ff148fb295ecddf264287"}, + {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c7951820b77abe03d88b114b998867c0f99da03859e5ab2623d94690848d3e45"}, + {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc94cf128676e8fac6503b37763adb378e2b6be1249d207630f83fc325d9b11"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f5d9027eeda64d353cf21a3ceb74bb1760bd534526c9214e19f052424b37e42"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e4a8104db15d3462e29d9946f26bed817a5b1d7a47eabca2d9dc2b995991503"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c32c41ace41f344d317399efff4cffb133e709cec2ef09c99e7a13e9f3b9483c"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbf16381c7bf7f963b58fb4daaa65684e10966ee14d26f5cc90f07049bfd8c1e"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e18b7bd0898398cc97ce2dfc83bb192a13a087ef6b2d5a8a36460311cb09e775"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69d565d20efe527bd8a9b92e7f299ae5e73b6c0470f3719bd66f3cd821e0d5bd"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ddedd300cd690a3b06e7eac90ed4452348b1348635777ce23d460d913b5b63c3"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:415bfcfd01d1fbf5cbd75004599ef167a533395955305f42220a585f64036081"}, + {file = "setproctitle-1.3.3-cp39-cp39-win32.whl", hash = "sha256:21112fcd2195d48f25760f0eafa7a76510871bbb3b750219310cf88b04456ae3"}, + {file = "setproctitle-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:5a740f05d0968a5a17da3d676ce6afefebeeeb5ce137510901bf6306ba8ee002"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6b9e62ddb3db4b5205c0321dd69a406d8af9ee1693529d144e86bd43bcb4b6c0"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e3b99b338598de0bd6b2643bf8c343cf5ff70db3627af3ca427a5e1a1a90dd9"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ae9a02766dad331deb06855fb7a6ca15daea333b3967e214de12cfae8f0ef5"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:200ede6fd11233085ba9b764eb055a2a191fb4ffb950c68675ac53c874c22e20"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0d3a953c50776751e80fe755a380a64cb14d61e8762bd43041ab3f8cc436092f"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e08e232b78ba3ac6bc0d23ce9e2bee8fad2be391b7e2da834fc9a45129eb87"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1da82c3e11284da4fcbf54957dafbf0655d2389cd3d54e4eaba636faf6d117a"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:aeaa71fb9568ebe9b911ddb490c644fbd2006e8c940f21cb9a1e9425bd709574"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:59335d000c6250c35989394661eb6287187854e94ac79ea22315469ee4f4c244"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3ba57029c9c50ecaf0c92bb127224cc2ea9fda057b5d99d3f348c9ec2855ad3"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d876d355c53d975c2ef9c4f2487c8f83dad6aeaaee1b6571453cb0ee992f55f6"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:224602f0939e6fb9d5dd881be1229d485f3257b540f8a900d4271a2c2aa4e5f4"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d7f27e0268af2d7503386e0e6be87fb9b6657afd96f5726b733837121146750d"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5e7266498cd31a4572378c61920af9f6b4676a73c299fce8ba93afd694f8ae7"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33c5609ad51cd99d388e55651b19148ea99727516132fb44680e1f28dd0d1de9"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:eae8988e78192fd1a3245a6f4f382390b61bce6cfcc93f3809726e4c885fa68d"}, + {file = "setproctitle-1.3.3.tar.gz", hash = "sha256:c913e151e7ea01567837ff037a23ca8740192880198b7fbb90b16d181607caae"}, +] + +[package.extras] +test = ["pytest"] + +[[package]] +name = "setuptools" +version = "75.1.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2"}, + {file = "setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] + +[[package]] +name = "shtab" +version = "1.7.1" +description = "Automagic shell tab completion for Python CLI applications" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shtab-1.7.1-py3-none-any.whl", hash = "sha256:32d3d2ff9022d4c77a62492b6ec875527883891e33c6b479ba4d41a51e259983"}, + {file = "shtab-1.7.1.tar.gz", hash = "sha256:4e4bcb02eeb82ec45920a5d0add92eac9c9b63b2804c9196c1f1fdc2d039243c"}, +] + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "smmap" +version = "5.0.1" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.7" +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] + +[[package]] +name = "sympy" +version = "1.13.2" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.13.2-py3-none-any.whl", hash = "sha256:c51d75517712f1aed280d4ce58506a4a88d635d6b5dd48b39102a7ae1f3fcfe9"}, + {file = "sympy-1.13.2.tar.gz", hash = "sha256:401449d84d07be9d0c7a46a64bd54fe097667d5e7181bfe67ec777be9e01cb13"}, +] + +[package.dependencies] +mpmath = ">=1.1.0,<1.4" + +[package.extras] +dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"] + +[[package]] +name = "tensorboard" +version = "2.17.1" +description = "TensorBoard lets you watch Tensors Flow" +optional = false +python-versions = ">=3.9" +files = [ + {file = "tensorboard-2.17.1-py3-none-any.whl", hash = "sha256:253701a224000eeca01eee6f7e978aea7b408f60b91eb0babdb04e78947b773e"}, +] + +[package.dependencies] +absl-py = ">=0.4" +grpcio = ">=1.48.2" +markdown = ">=2.6.8" +numpy = ">=1.12.0" +packaging = "*" +protobuf = ">=3.19.6,<4.24.0 || >4.24.0" +setuptools = ">=41.0.0" +six = ">1.9" +tensorboard-data-server = ">=0.7.0,<0.8.0" +werkzeug = ">=1.0.1" + +[[package]] +name = "tensorboard-data-server" +version = "0.7.2" +description = "Fast data loading for TensorBoard" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tensorboard_data_server-0.7.2-py3-none-any.whl", hash = "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb"}, + {file = "tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60"}, + {file = "tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530"}, +] + +[[package]] +name = "torch" +version = "2.4.1+cu118" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "torch-2.4.1+cu118-cp310-cp310-linux_x86_64.whl", hash = "sha256:740bae6eb10c6b41cb86c4f9e84da0b4533b5595aed4f06694d95d5e32b4076c"}, + {file = "torch-2.4.1+cu118-cp310-cp310-win_amd64.whl", hash = "sha256:08634e2d32e753ea4a086d42cc145f9251c767b0a7619fd9a6ed5c035dee7b63"}, + {file = "torch-2.4.1+cu118-cp311-cp311-linux_x86_64.whl", hash = "sha256:c7fbf1e214af65ccc0e54d265140b2d09486f977b966fcde218b25068bd54551"}, + {file = "torch-2.4.1+cu118-cp311-cp311-win_amd64.whl", hash = "sha256:1db7ac11687fc6ec279c5504302840a057a4f6bbadf81b7c4588fa53743cf493"}, + {file = "torch-2.4.1+cu118-cp312-cp312-linux_x86_64.whl", hash = "sha256:5c08fa312d259dd19dbd5058d3e82992b27f092347fccc7c0f417f9e0ac16956"}, + {file = "torch-2.4.1+cu118-cp312-cp312-win_amd64.whl", hash = "sha256:1ea70f54853744dd097992ef88d86d4ab793df0df4c41d1e37313ef4b80ef93f"}, + {file = "torch-2.4.1+cu118-cp38-cp38-linux_x86_64.whl", hash = "sha256:a8ba825b2c00274db8924b8c3e860a8d42947d2f04fcdf5b220ad7a650a83dea"}, + {file = "torch-2.4.1+cu118-cp38-cp38-win_amd64.whl", hash = "sha256:1520c0a9aa6d0187c9617b07409c9493d0bf20b28f26cffa3458995f53f58c48"}, + {file = "torch-2.4.1+cu118-cp39-cp39-linux_x86_64.whl", hash = "sha256:82309da0cce45cf61eb48b0567c7d080992d8ba98264da128ee1d858fac5dd75"}, + {file = "torch-2.4.1+cu118-cp39-cp39-win_amd64.whl", hash = "sha256:0eb4393f51f110e5d9f20e3e8079b4bd1fc8fa781c4ac521f709065f498be676"}, +] + +[package.dependencies] +filelock = "*" +fsspec = "*" +jinja2 = "*" +networkx = "*" +nvidia-cublas-cu11 = {version = "11.11.3.6", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu11 = {version = "11.8.87", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu11 = {version = "11.8.89", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu11 = {version = "11.8.89", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu11 = {version = "9.1.0.70", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu11 = {version = "10.9.0.58", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu11 = {version = "10.3.0.86", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu11 = {version = "11.4.1.48", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu11 = {version = "11.7.5.86", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu11 = {version = "2.20.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu11 = {version = "11.8.86", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +sympy = "*" +triton = {version = "3.0.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.13\""} +typing-extensions = ">=4.8.0" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] +optree = ["optree (>=0.11.0)"] + +[package.source] +type = "legacy" +url = "https://download.pytorch.org/whl/cu118" +reference = "pytorch" + +[[package]] +name = "torchaudio" +version = "2.4.1+cu118" +description = "An audio package for PyTorch" +optional = false +python-versions = "*" +files = [ + {file = "torchaudio-2.4.1+cu118-cp310-cp310-linux_x86_64.whl", hash = "sha256:ba8c23b7d101faa53b10f5e84d6c2925c55702c1eedabccea0f0504eed1049d2"}, + {file = "torchaudio-2.4.1+cu118-cp310-cp310-win_amd64.whl", hash = "sha256:7ba476129f5aa06066583b24adf8a47e581857388de889aa41af1b3716c2b621"}, + {file = "torchaudio-2.4.1+cu118-cp311-cp311-linux_x86_64.whl", hash = "sha256:1b372b3a0f9fa152a8ec3e0a720dac3b93dfaacefe6238ff0b2f628c14d954bf"}, + {file = "torchaudio-2.4.1+cu118-cp311-cp311-win_amd64.whl", hash = "sha256:d945f15bdef06798669e4d1f16ae632b260dc913e93949f9c5b6324183ab91fc"}, + {file = "torchaudio-2.4.1+cu118-cp312-cp312-linux_x86_64.whl", hash = "sha256:7f27a4e6837863e6121252e4dcc8a0490aedec366be99dac9ca7522eaf33c870"}, + {file = "torchaudio-2.4.1+cu118-cp312-cp312-win_amd64.whl", hash = "sha256:45b7ef91f08f7c493a877871bb411b706e277a641187089d28cd8403bc1cf96e"}, + {file = "torchaudio-2.4.1+cu118-cp38-cp38-linux_x86_64.whl", hash = "sha256:c6b9d6e4a4735823ea859bd6d0de583447d2df1784720c058db465d8911b767a"}, + {file = "torchaudio-2.4.1+cu118-cp38-cp38-win_amd64.whl", hash = "sha256:d391ef8eea690864fb28bde8d9228fc481f3f4a63b5921da48a3db60a3fe4e2a"}, + {file = "torchaudio-2.4.1+cu118-cp39-cp39-linux_x86_64.whl", hash = "sha256:f7e7c9d88ddf5aed9cc2ac02672cf36d57bb8f3e85d24e853a3ff469ffb4318c"}, + {file = "torchaudio-2.4.1+cu118-cp39-cp39-win_amd64.whl", hash = "sha256:9c64b40ebcb6663b7b38cdbc7d510126e5be246a069480036b11cdd19a35e374"}, +] + +[package.dependencies] +torch = "2.4.1" + +[package.source] +type = "legacy" +url = "https://download.pytorch.org/whl/cu118" +reference = "pytorch" + +[[package]] +name = "triton" +version = "3.0.0" +description = "A language and compiler for custom Deep Learning operations" +optional = false +python-versions = "*" +files = [ + {file = "triton-3.0.0-1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e1efef76935b2febc365bfadf74bcb65a6f959a9872e5bddf44cc9e0adce1e1a"}, + {file = "triton-3.0.0-1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ce8520437c602fb633f1324cc3871c47bee3b67acf9756c1a66309b60e3216c"}, + {file = "triton-3.0.0-1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e509deb77f1c067d8640725ef00c5cbfcb2052a1a3cb6a6d343841f92624eb"}, + {file = "triton-3.0.0-1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bcbf3b1c48af6a28011a5c40a5b3b9b5330530c3827716b5fbf6d7adcc1e53e9"}, + {file = "triton-3.0.0-1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6e5727202f7078c56f91ff13ad0c1abab14a0e7f2c87e91b12b6f64f3e8ae609"}, +] + +[package.dependencies] +filelock = "*" + +[package.extras] +build = ["cmake (>=3.20)", "lit"] +tests = ["autopep8", "flake8", "isort", "llnl-hatchet", "numpy", "pytest", "scipy (>=1.7.1)"] +tutorials = ["matplotlib", "pandas", "tabulate"] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "tyro" +version = "0.8.10" +description = "Strongly typed, zero-effort CLI interfaces" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tyro-0.8.10-py3-none-any.whl", hash = "sha256:83de6684fa5554b39c111d5b8801723bd20832589603e40feb2a3ff09ed96d8b"}, + {file = "tyro-0.8.10.tar.gz", hash = "sha256:78f3622721d2c66f62bebcd2f11863421de9779ad9fc090a89e780b484abf332"}, +] + +[package.dependencies] +colorama = {version = ">=0.4.0", markers = "platform_system == \"Windows\""} +docstring-parser = ">=0.16" +rich = ">=11.1.0" +shtab = ">=1.5.6" +typing-extensions = ">=4.7.0" + +[package.extras] +dev = ["PyYAML (>=6.0)", "attrs (>=21.4.0)", "coverage[toml] (>=6.5.0)", "eval-type-backport (>=0.1.3)", "flax (>=0.6.9)", "frozendict (>=2.3.4)", "mypy (>=1.4.1)", "numpy (>=1.20.0)", "omegaconf (>=2.2.2)", "pydantic (>=2.5.2)", "pyright (>=1.1.349)", "pytest (>=7.1.2)", "pytest-cov (>=3.0.0)", "ruff (>=0.1.13)", "torch (>=1.10.0)"] + +[[package]] +name = "urllib3" +version = "2.2.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "wandb" +version = "0.16.6" +description = "A CLI and library for interacting with the Weights & Biases API." +optional = false +python-versions = ">=3.7" +files = [ + {file = "wandb-0.16.6-py3-none-any.whl", hash = "sha256:5810019a3b981c796e98ea58557a7c380f18834e0c6bdaed15df115522e5616e"}, + {file = "wandb-0.16.6.tar.gz", hash = "sha256:86f491e3012d715e0d7d7421a4d6de41abef643b7403046261f962f3e512fe1c"}, +] + +[package.dependencies] +appdirs = ">=1.4.3" +Click = ">=7.1,<8.0.0 || >8.0.0" +docker-pycreds = ">=0.4.0" +GitPython = ">=1.0.0,<3.1.29 || >3.1.29" +protobuf = {version = ">=3.19.0,<4.21.0 || >4.21.0,<5", markers = "python_version > \"3.9\" or sys_platform != \"linux\""} +psutil = ">=5.0.0" +PyYAML = "*" +requests = ">=2.0.0,<3" +sentry-sdk = ">=1.0.0" +setproctitle = "*" +setuptools = "*" + +[package.extras] +async = ["httpx (>=0.23.0)"] +aws = ["boto3"] +azure = ["azure-identity", "azure-storage-blob"] +gcp = ["google-cloud-storage"] +importers = ["filelock", "mlflow", "polars", "rich", "tenacity"] +kubeflow = ["google-cloud-storage", "kubernetes", "minio", "sh"] +launch = ["PyYAML (>=6.0.0)", "awscli", "azure-containerregistry", "azure-identity", "azure-storage-blob", "boto3", "botocore", "chardet", "google-auth", "google-cloud-aiplatform", "google-cloud-artifact-registry", "google-cloud-compute", "google-cloud-storage", "iso8601", "kubernetes", "kubernetes-asyncio", "nbconvert", "nbformat", "optuna", "pydantic", "tomli", "typing-extensions"] +media = ["bokeh", "moviepy", "numpy", "pillow", "plotly (>=5.18.0)", "rdkit-pypi", "soundfile"] +models = ["cloudpickle"] +perf = ["orjson"] +reports = ["pydantic (>=2.0.0)"] +sweeps = ["sweeps (>=0.2.0)"] + +[[package]] +name = "werkzeug" +version = "3.0.4" +description = "The comprehensive WSGI web application library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "werkzeug-3.0.4-py3-none-any.whl", hash = "sha256:02c9eb92b7d6c06f31a782811505d2157837cea66aaede3e217c7c27c039476c"}, + {file = "werkzeug-3.0.4.tar.gz", hash = "sha256:34f2371506b250df4d4f84bfe7b0921e4762525762bbd936614909fe25cd7306"}, +] + +[package.dependencies] +MarkupSafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog (>=2.3)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "48a65a39a1da109e4617f235e736b912d9d9734b39be5f899975c6da08ba590d" diff --git a/cleanrl/ppo_trxl/pom_env.py b/cleanrl/ppo_trxl/pom_env.py new file mode 100644 index 000000000..9c807ce88 --- /dev/null +++ b/cleanrl/ppo_trxl/pom_env.py @@ -0,0 +1,186 @@ +import gymnasium as gym +import numpy as np +import pygame +from gymnasium import spaces + +gym.register( + id="ProofofMemory-v0", + entry_point="pom_env:PoMEnv", + max_episode_steps=16, +) + + +class PoMEnv(gym.Env): + """ + Proof of Concept Memory Environment + + This environment is intended to assess whether the policy's memory is working. + The environment is based on a one dimensional grid where the agent can move left or right. + At both ends, a goal is spawned that is either punishing or rewarding. + During the very first two steps, the agent gets to know which goal leads to a positive or negative reward. + Afterwards, this information is hidden in the agent's observation. + The last value of the agent's observation is its current position inside the environment. + Optionally and to increase the difficulty of the task, the agent's position can be frozen until the goal information is hidden. + To further challenge the agent, the step_size can be decreased. + """ + + metadata = {"render_modes": ["human", "rgb_array", "debug_rgb_array"], "render_fps": 4} + + def __init__(self, render_mode="human"): + self._freeze = True + self._step_size = 0.2 + self._min_steps = int(1.0 / self._step_size) + 1 + self._time_penalty = 0.1 + self._num_show_steps = 2 + self.render_mode = render_mode + glob = False + + self.action_space = spaces.Discrete(2) + self.observation_space = spaces.Box(low=-1.0, high=1.0, shape=(3,), dtype=np.float32) + + # Create an array with possible positions + num_steps = int(0.4 / self._step_size) + lower = min(-2.0 * self._step_size, -num_steps * self._step_size) if not glob else -1 + self._step_size + upper = max(3.0 * self._step_size, self._step_size, (num_steps + 1) * self._step_size) if not glob else 1 + self.possible_positions = np.arange(lower, upper, self._step_size).clip(-1 + self._step_size, 1 - self._step_size) + self.possible_positions = list(map(lambda x: round(x, 2), self.possible_positions)) # fix floating point errors + + # Pygame-related attributes for rendering + self.window = None + self.clock = None + self.width = 400 + self.height = 80 + self.cell_width = self.width / (2 * int(1 / self._step_size) + 1) + + def step(self, action): + reward = 0.0 + done = False + + if self._num_show_steps > self._step_count: + self._position += self._step_size * (1 - self._freeze) if action == 1 else -self._step_size * (1 - self._freeze) + self._position = np.round(self._position, 2) + + obs = np.asarray([self._goals[0], self._position, self._goals[1]], dtype=np.float32) + + if self._freeze: + self._step_count += 1 + return obs, reward, done, False, {} + + else: + self._position += self._step_size if action == 1 else -self._step_size + self._position = np.round(self._position, 2) + obs = np.asarray([0.0, self._position, 0.0], dtype=np.float32) # mask out goal information + + # Determine reward and termination + if self._position == -1.0: + if self._goals[0] == 1.0: + reward += 1.0 + self._min_steps * self._time_penalty + else: + reward -= 1.0 + self._min_steps * self._time_penalty + done = True + elif self._position == 1.0: + if self._goals[1] == 1.0: + reward += 1.0 + self._min_steps * self._time_penalty + else: + reward -= 1.0 + self._min_steps * self._time_penalty + done = True + else: + reward -= self._time_penalty + self.rewards.append(reward) + + if done: + info = {"reward": sum(self.rewards), "length": len(self.rewards)} + else: + info = {} + + self._step_count += 1 + + return obs, reward, done, False, info + + def reset(self, *, seed=None, options=None): + super().reset(seed=seed) + self.rewards = [] + self._position = np.random.choice(self.possible_positions) + self._step_count = 0 + goals = np.asarray([-1.0, 1.0]) + self._goals = goals[np.random.permutation(2)] + obs = np.asarray([self._goals[0], self._position, self._goals[1]], dtype=np.float32) + return obs, {} + + def render(self): + if self.render_mode not in self.metadata["render_modes"]: + return + + # Initialize Pygame + if not pygame.get_init(): + pygame.init() + if self.window is None and self.render_mode == "human": + pygame.display.init() + self.window = pygame.display.set_mode((self.width, self.height)) + pygame.display.set_caption("Proof of Memory Environment") + if self.clock is None and self.render_mode == "human": + self.clock = pygame.time.Clock() + + # Create surface + canvas = pygame.Surface((self.width, self.height)) + canvas.fill((255, 255, 255)) # Fill the background with white + + # Draw grid + num_cells = 2 * int(1 / self._step_size) + 1 + for i in range(num_cells): + x = i * self.cell_width + pygame.draw.rect(canvas, (200, 200, 200), pygame.Rect(x, 0, self.cell_width, self.height), 1) + + # Draw agent + agent_pos = int((self._position + 1) / self._step_size) + agent_x = agent_pos * self.cell_width + self.cell_width / 2 + pygame.draw.circle(canvas, (0, 0, 255), (agent_x, self.height / 2), 15) + + # Draw goals + show_goals = self._num_show_steps > self._step_count + if show_goals: + left_goal_color = (0, 255, 0) if self._goals[0] > 0 else (255, 0, 0) + pygame.draw.rect(canvas, left_goal_color, pygame.Rect(0, 0, self.cell_width, self.height)) + right_goal_color = (0, 255, 0) if self._goals[1] > 0 else (255, 0, 0) + pygame.draw.rect( + canvas, right_goal_color, pygame.Rect(self.width - self.cell_width, 0, self.cell_width, self.height) + ) + else: + pygame.draw.rect(canvas, (200, 200, 200), pygame.Rect(0, 0, self.cell_width, self.height)) + pygame.draw.rect( + canvas, (200, 200, 200), pygame.Rect(self.width - self.cell_width, 0, self.cell_width, self.height) + ) + + # Render text information + font = pygame.font.SysFont(None, 24) + text = font.render(f"Goals are shown: {show_goals}", True, (0, 0, 0)) + canvas.blit(text, (10, 10)) + + if self.render_mode == "human": + self.window.blit(canvas, (0, 0)) + pygame.display.flip() + self.clock.tick(self.metadata["render_fps"]) + elif self.render_mode in ["rgb_array", "debug_rgb_array"]: + return np.transpose(np.array(pygame.surfarray.pixels3d(canvas)), axes=(1, 0, 2)) + + def close(self): + if self.window is not None: + pygame.display.quit() + pygame.quit() + self.window = None + self.clock = None + + +if __name__ == "__main__": + env = PoMEnv(render_mode="human") + o, _ = env.reset() + img = env.render() + done = False + rewards = [] + const_action = 1 + while not done: + o, r, done, _, _ = env.step(const_action) + rewards.append(r) + img = env.render() + print(f"Total reward: {sum(rewards)}, Steps: {len(rewards)}") + env.close() diff --git a/cleanrl/ppo_trxl/ppo_trxl.py b/cleanrl/ppo_trxl/ppo_trxl.py new file mode 100644 index 000000000..7529546b0 --- /dev/null +++ b/cleanrl/ppo_trxl/ppo_trxl.py @@ -0,0 +1,682 @@ +import os +import random +import time +from collections import deque +from dataclasses import dataclass + +import gymnasium as gym +import memory_gym # noqa +import numpy as np +import torch +import torch.nn as nn +import torch.optim as optim +import tyro +from einops import rearrange +from minigrid.wrappers import ImgObsWrapper, RGBImgPartialObsWrapper +from pom_env import PoMEnv # noqa +from torch.distributions import Categorical +from torch.utils.tensorboard import SummaryWriter + + +@dataclass +class Args: + exp_name: str = os.path.basename(__file__)[: -len(".py")] + """the name of this experiment""" + seed: int = 1 + """seed of the experiment""" + torch_deterministic: bool = True + """if toggled, `torch.backends.cudnn.deterministic=False`""" + cuda: bool = True + """if toggled, cuda will be enabled by default""" + track: bool = False + """if toggled, this experiment will be tracked with Weights and Biases""" + wandb_project_name: str = "cleanRL" + """the wandb's project name""" + wandb_entity: str = None + """the entity (team) of wandb's project""" + capture_video: bool = False + """whether to capture videos of the agent performances (check out `videos` folder)""" + save_model: bool = False + """whether to save model into the `runs/{run_name}` folder""" + + # Algorithm specific arguments + env_id: str = "MortarMayhem-Grid-v0" + """the id of the environment""" + total_timesteps: int = 200000000 + """total timesteps of the experiments""" + init_lr: float = 2.75e-4 + """the initial learning rate of the optimizer""" + final_lr: float = 1.0e-5 + """the final learning rate of the optimizer after linearly annealing""" + num_envs: int = 32 + """the number of parallel game environments""" + num_steps: int = 512 + """the number of steps to run in each environment per policy rollout""" + anneal_steps: int = 32 * 512 * 10000 + """the number of steps to linearly anneal the learning rate and entropy coefficient from initial to final""" + gamma: float = 0.995 + """the discount factor gamma""" + gae_lambda: float = 0.95 + """the lambda for the general advantage estimation""" + num_minibatches: int = 8 + """the number of mini-batches""" + update_epochs: int = 3 + """the K epochs to update the policy""" + norm_adv: bool = False + """Toggles advantages normalization""" + clip_coef: float = 0.1 + """the surrogate clipping coefficient""" + clip_vloss: bool = True + """Toggles whether or not to use a clipped loss for the value function, as per the paper.""" + init_ent_coef: float = 0.0001 + """initial coefficient of the entropy bonus""" + final_ent_coef: float = 0.000001 + """final coefficient of the entropy bonus after linearly annealing""" + vf_coef: float = 0.5 + """coefficient of the value function""" + max_grad_norm: float = 0.25 + """the maximum norm for the gradient clipping""" + target_kl: float = None + """the target KL divergence threshold""" + + # Transformer-XL specific arguments + trxl_num_layers: int = 3 + """the number of transformer layers""" + trxl_num_heads: int = 4 + """the number of heads used in multi-head attention""" + trxl_dim: int = 384 + """the dimension of the transformer""" + trxl_memory_length: int = 119 + """the length of TrXL's sliding memory window""" + trxl_positional_encoding: str = "absolute" + """the positional encoding type of the transformer, choices: "", "absolute", "learned" """ + reconstruction_coef: float = 0.0 + """the coefficient of the observation reconstruction loss, if set to 0.0 the reconstruction loss is not used""" + + # To be filled on runtime + batch_size: int = 0 + """the batch size (computed in runtime)""" + minibatch_size: int = 0 + """the mini-batch size (computed in runtime)""" + num_iterations: int = 0 + """the number of iterations (computed in runtime)""" + + +def make_env(env_id, idx, capture_video, run_name, render_mode="debug_rgb_array"): + if "MiniGrid" in env_id: + if render_mode == "debug_rgb_array": + render_mode = "rgb_array" + + def thunk(): + if "MiniGrid" in env_id: + env = gym.make(env_id, agent_view_size=3, tile_size=28, render_mode=render_mode) + env = ImgObsWrapper(RGBImgPartialObsWrapper(env, tile_size=28)) + env = gym.wrappers.TimeLimit(env, 96) + else: + env = gym.make(env_id, render_mode=render_mode) + if capture_video and idx == 0: + env = gym.wrappers.RecordVideo(env, f"videos/{run_name}") + return gym.wrappers.RecordEpisodeStatistics(env) + + return thunk + + +def layer_init(layer, std=np.sqrt(2), bias_const=0.0): + torch.nn.init.orthogonal_(layer.weight, std) + # torch.nn.init.constant_(layer.bias, bias_const) + return layer + + +def batched_index_select(input, dim, index): + for ii in range(1, len(input.shape)): + if ii != dim: + index = index.unsqueeze(ii) + expanse = list(input.shape) + expanse[0] = -1 + expanse[dim] = -1 + index = index.expand(expanse) + return torch.gather(input, dim, index) + + +class PositionalEncoding(nn.Module): + def __init__(self, dim, min_timescale=2.0, max_timescale=1e4): + super().__init__() + freqs = torch.arange(0, dim, min_timescale) + inv_freqs = max_timescale ** (-freqs / dim) + self.register_buffer("inv_freqs", inv_freqs) + + def forward(self, seq_len): + seq = torch.arange(seq_len - 1, -1, -1.0) + sinusoidal_inp = rearrange(seq, "n -> n ()") * rearrange(self.inv_freqs, "d -> () d") + pos_emb = torch.cat((sinusoidal_inp.sin(), sinusoidal_inp.cos()), dim=-1) + return pos_emb + + +class MultiHeadAttention(nn.Module): + """Multi Head Attention without dropout inspired by https://github.com/aladdinpersson/Machine-Learning-Collection""" + + def __init__(self, embed_dim, num_heads): + super().__init__() + self.embed_dim = embed_dim + self.num_heads = num_heads + self.head_size = embed_dim // num_heads + + assert self.head_size * num_heads == embed_dim, "Embedding dimension needs to be divisible by the number of heads" + + self.values = nn.Linear(self.head_size, self.head_size, bias=False) + self.keys = nn.Linear(self.head_size, self.head_size, bias=False) + self.queries = nn.Linear(self.head_size, self.head_size, bias=False) + self.fc_out = nn.Linear(self.num_heads * self.head_size, embed_dim) + + def forward(self, values, keys, query, mask): + N = query.shape[0] + value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1] + + values = values.reshape(N, value_len, self.num_heads, self.head_size) + keys = keys.reshape(N, key_len, self.num_heads, self.head_size) + query = query.reshape(N, query_len, self.num_heads, self.head_size) + + values = self.values(values) # (N, value_len, heads, head_dim) + keys = self.keys(keys) # (N, key_len, heads, head_dim) + queries = self.queries(query) # (N, query_len, heads, heads_dim) + + # Dot-product + energy = torch.einsum("nqhd,nkhd->nhqk", [queries, keys]) + + # Mask padded indices so their attention weights become 0 + if mask is not None: + energy = energy.masked_fill(mask.unsqueeze(1).unsqueeze(1) == 0, float("-1e20")) # -inf causes NaN + + # Normalize energy values and apply softmax to retrieve the attention scores + attention = torch.softmax( + energy / (self.embed_dim ** (1 / 2)), dim=3 + ) # attention shape: (N, heads, query_len, key_len) + + # Scale values by attention weights + out = torch.einsum("nhql,nlhd->nqhd", [attention, values]).reshape(N, query_len, self.num_heads * self.head_size) + + return self.fc_out(out), attention + + +class TransformerLayer(nn.Module): + def __init__(self, dim, num_heads): + super().__init__() + self.attention = MultiHeadAttention(dim, num_heads) + self.layer_norm_q = nn.LayerNorm(dim) + self.norm_kv = nn.LayerNorm(dim) + self.layer_norm_attn = nn.LayerNorm(dim) + self.fc_projection = nn.Sequential(nn.Linear(dim, dim), nn.ReLU()) + + def forward(self, value, key, query, mask): + # Pre-layer normalization (post-layer normalization is usually less effective) + query_ = self.layer_norm_q(query) + value = self.norm_kv(value) + key = value # K = V -> self-attention + attention, attention_weights = self.attention(value, key, query_, mask) # MHA + x = attention + query # Skip connection + x_ = self.layer_norm_attn(x) # Pre-layer normalization + forward = self.fc_projection(x_) # Forward projection + out = forward + x # Skip connection + return out, attention_weights + + +class Transformer(nn.Module): + def __init__(self, num_layers, dim, num_heads, max_episode_steps, positional_encoding): + super().__init__() + self.max_episode_steps = max_episode_steps + self.positional_encoding = positional_encoding + if positional_encoding == "absolute": + self.pos_embedding = PositionalEncoding(dim) + elif positional_encoding == "learned": + self.pos_embedding = nn.Parameter(torch.randn(max_episode_steps, dim)) + self.transformer_layers = nn.ModuleList([TransformerLayer(dim, num_heads) for _ in range(num_layers)]) + + def forward(self, x, memories, mask, memory_indices): + # Add positional encoding to every transformer layer input + if self.positional_encoding == "absolute": + pos_embedding = self.pos_embedding(self.max_episode_steps)[memory_indices] + memories = memories + pos_embedding.unsqueeze(2) + elif self.positional_encoding == "learned": + memories = memories + self.pos_embedding[memory_indices].unsqueeze(2) + + # Forward transformer layers and return new memories (i.e. hidden states) + out_memories = [] + for i, layer in enumerate(self.transformer_layers): + out_memories.append(x.detach()) + x, attention_weights = layer( + memories[:, :, i], memories[:, :, i], x.unsqueeze(1), mask + ) # args: value, key, query, mask + x = x.squeeze() + if len(x.shape) == 1: + x = x.unsqueeze(0) + return x, torch.stack(out_memories, dim=1) + + +class Agent(nn.Module): + def __init__(self, args, observation_space, action_space_shape, max_episode_steps): + super().__init__() + self.obs_shape = observation_space.shape + self.max_episode_steps = max_episode_steps + + if len(self.obs_shape) > 1: + self.encoder = nn.Sequential( + layer_init(nn.Conv2d(3, 32, 8, stride=4)), + nn.ReLU(), + layer_init(nn.Conv2d(32, 64, 4, stride=2)), + nn.ReLU(), + layer_init(nn.Conv2d(64, 64, 3, stride=1)), + nn.ReLU(), + nn.Flatten(), + layer_init(nn.Linear(64 * 7 * 7, args.trxl_dim)), + nn.ReLU(), + ) + else: + self.encoder = layer_init(nn.Linear(observation_space.shape[0], args.trxl_dim)) + + self.transformer = Transformer( + args.trxl_num_layers, args.trxl_dim, args.trxl_num_heads, self.max_episode_steps, args.trxl_positional_encoding + ) + + self.hidden_post_trxl = nn.Sequential( + layer_init(nn.Linear(args.trxl_dim, args.trxl_dim)), + nn.ReLU(), + ) + + self.actor_branches = nn.ModuleList( + [ + layer_init(nn.Linear(args.trxl_dim, out_features=num_actions), np.sqrt(0.01)) + for num_actions in action_space_shape + ] + ) + self.critic = layer_init(nn.Linear(args.trxl_dim, 1), 1) + + if args.reconstruction_coef > 0.0: + self.transposed_cnn = nn.Sequential( + layer_init(nn.Linear(args.trxl_dim, 64 * 7 * 7)), + nn.ReLU(), + nn.Unflatten(1, (64, 7, 7)), + layer_init(nn.ConvTranspose2d(64, 64, 3, stride=1)), + nn.ReLU(), + layer_init(nn.ConvTranspose2d(64, 32, 4, stride=2)), + nn.ReLU(), + layer_init(nn.ConvTranspose2d(32, 3, 8, stride=4)), + nn.Sigmoid(), + ) + + def get_value(self, x, memory, memory_mask, memory_indices): + if len(self.obs_shape) > 1: + x = self.encoder(x.permute((0, 3, 1, 2)) / 255.0) + else: + x = self.encoder(x) + x, _ = self.transformer(x, memory, memory_mask, memory_indices) + x = self.hidden_post_trxl(x) + return self.critic(x).flatten() + + def get_action_and_value(self, x, memory, memory_mask, memory_indices, action=None): + if len(self.obs_shape) > 1: + x = self.encoder(x.permute((0, 3, 1, 2)) / 255.0) + else: + x = self.encoder(x) + x, memory = self.transformer(x, memory, memory_mask, memory_indices) + x = self.hidden_post_trxl(x) + self.x = x + probs = [Categorical(logits=branch(x)) for branch in self.actor_branches] + if action is None: + action = torch.stack([dist.sample() for dist in probs], dim=1) + log_probs = [] + for i, dist in enumerate(probs): + log_probs.append(dist.log_prob(action[:, i])) + entropies = torch.stack([dist.entropy() for dist in probs], dim=1).sum(1).reshape(-1) + return action, torch.stack(log_probs, dim=1), entropies, self.critic(x).flatten(), memory + + def reconstruct_observation(self): + x = self.transposed_cnn(self.x) + return x.permute((0, 2, 3, 1)) + + +if __name__ == "__main__": + args = tyro.cli(Args) + args.batch_size = int(args.num_envs * args.num_steps) + args.minibatch_size = int(args.batch_size // args.num_minibatches) + args.num_iterations = args.total_timesteps // args.batch_size + run_name = f"{args.env_id}__{args.exp_name}__{args.seed}__{int(time.time())}" + + if args.track: + import wandb + + wandb.init( + project=args.wandb_project_name, + entity=args.wandb_entity, + sync_tensorboard=True, + config=vars(args), + name=run_name, + monitor_gym=True, + save_code=True, + ) + writer = SummaryWriter(f"runs/{run_name}") + writer.add_text( + "hyperparameters", + "|param|value|\n|-|-|\n%s" % ("\n".join([f"|{key}|{value}|" for key, value in vars(args).items()])), + ) + + # TRY NOT TO MODIFY: seeding + random.seed(args.seed) + np.random.seed(args.seed) + torch.manual_seed(args.seed) + torch.backends.cudnn.deterministic = args.torch_deterministic + + # Determine the device to be used for training and set the default tensor type + if args.cuda: + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + torch.set_default_device(device) + else: + device = torch.device("cpu") + + # Environment setup + envs = gym.vector.SyncVectorEnv( + [make_env(args.env_id, i, args.capture_video, run_name) for i in range(args.num_envs)], + ) + observation_space = envs.single_observation_space + action_space_shape = ( + (envs.single_action_space.n,) + if isinstance(envs.single_action_space, gym.spaces.Discrete) + else tuple(envs.single_action_space.nvec) + ) + env_ids = range(args.num_envs) + env_current_episode_step = torch.zeros((args.num_envs,), dtype=torch.long) + # Determine maximum episode steps + max_episode_steps = envs.envs[0].spec.max_episode_steps + if not max_episode_steps: + envs.envs[0].reset() # Memory Gym envs need to be reset before accessing max_episode_steps + max_episode_steps = envs.envs[0].max_episode_steps + if max_episode_steps <= 0: + max_episode_steps = 1024 # Memory Gym envs have max_episode_steps set to -1 + # Set transformer memory length to max episode steps if greater than max episode steps + args.trxl_memory_length = min(args.trxl_memory_length, max_episode_steps) + + agent = Agent(args, observation_space, action_space_shape, max_episode_steps).to(device) + optimizer = optim.AdamW(agent.parameters(), lr=args.init_lr) + bce_loss = nn.BCELoss() # Binary cross entropy loss for observation reconstruction + + # ALGO Logic: Storage setup + rewards = torch.zeros((args.num_steps, args.num_envs)) + actions = torch.zeros((args.num_steps, args.num_envs, len(action_space_shape)), dtype=torch.long) + dones = torch.zeros((args.num_steps, args.num_envs)) + obs = torch.zeros((args.num_steps, args.num_envs) + observation_space.shape) + log_probs = torch.zeros((args.num_steps, args.num_envs, len(action_space_shape))) + values = torch.zeros((args.num_steps, args.num_envs)) + # The length of stored-memories is equal to the number of sampled episodes during training data sampling + # (num_episodes, max_episode_length, num_layers, embed_dim) + stored_memories = [] + # Memory mask used during attention + stored_memory_masks = torch.zeros((args.num_steps, args.num_envs, args.trxl_memory_length), dtype=torch.bool) + # Index to select the correct episode memory from stored_memories + stored_memory_index = torch.zeros((args.num_steps, args.num_envs), dtype=torch.long) + # Indices to slice the episode memories into windows + stored_memory_indices = torch.zeros((args.num_steps, args.num_envs, args.trxl_memory_length), dtype=torch.long) + + # TRY NOT TO MODIFY: start the game + global_step = 0 + start_time = time.time() + episode_infos = deque(maxlen=100) # Store episode results for monitoring statistics + next_obs, _ = envs.reset(seed=args.seed) + next_obs = torch.Tensor(next_obs).to(device) + next_done = torch.zeros(args.num_envs) + # Setup placeholders for each environments's current episodic memory + next_memory = torch.zeros((args.num_envs, max_episode_steps, args.trxl_num_layers, args.trxl_dim), dtype=torch.float32) + # Generate episodic memory mask used in attention + memory_mask = torch.tril(torch.ones((args.trxl_memory_length, args.trxl_memory_length)), diagonal=-1) + """ e.g. memory mask tensor looks like this if memory_length = 6 + 0, 0, 0, 0, 0, 0 + 1, 0, 0, 0, 0, 0 + 1, 1, 0, 0, 0, 0 + 1, 1, 1, 0, 0, 0 + 1, 1, 1, 1, 0, 0 + 1, 1, 1, 1, 1, 0 + """ + # Setup memory window indices to support a sliding window over the episodic memory + repetitions = torch.repeat_interleave( + torch.arange(0, args.trxl_memory_length).unsqueeze(0), args.trxl_memory_length - 1, dim=0 + ).long() + memory_indices = torch.stack( + [torch.arange(i, i + args.trxl_memory_length) for i in range(max_episode_steps - args.trxl_memory_length + 1)] + ).long() + memory_indices = torch.cat((repetitions, memory_indices)) + """ e.g. the memory window indices tensor looks like this if memory_length = 4 and max_episode_length = 7: + 0, 1, 2, 3 + 0, 1, 2, 3 + 0, 1, 2, 3 + 0, 1, 2, 3 + 1, 2, 3, 4 + 2, 3, 4, 5 + 3, 4, 5, 6 + """ + + for iteration in range(1, args.num_iterations + 1): + sampled_episode_infos = [] + + # Annealing the learning rate and entropy coefficient if instructed to do so + do_anneal = args.anneal_steps > 0 and global_step < args.anneal_steps + frac = 1 - global_step / args.anneal_steps if do_anneal else 0 + lr = (args.init_lr - args.final_lr) * frac + args.final_lr + for param_group in optimizer.param_groups: + param_group["lr"] = lr + ent_coef = (args.init_ent_coef - args.final_ent_coef) * frac + args.final_ent_coef + + # Init episodic memory buffer using each environments' current episodic memory + stored_memories = [next_memory[e] for e in range(args.num_envs)] + for e in range(args.num_envs): + stored_memory_index[:, e] = e + + for step in range(args.num_steps): + global_step += args.num_envs + + # ALGO LOGIC: action logic + with torch.no_grad(): + obs[step] = next_obs + dones[step] = next_done + stored_memory_masks[step] = memory_mask[torch.clip(env_current_episode_step, 0, args.trxl_memory_length - 1)] + stored_memory_indices[step] = memory_indices[env_current_episode_step] + # Retrieve the memory window from the entire episodic memory + memory_window = batched_index_select(next_memory, 1, stored_memory_indices[step]) + action, logprob, _, value, new_memory = agent.get_action_and_value( + next_obs, memory_window, stored_memory_masks[step], stored_memory_indices[step] + ) + next_memory[env_ids, env_current_episode_step] = new_memory + # Store the action, log_prob, and value in the buffer + actions[step], log_probs[step], values[step] = action, logprob, value + + # TRY NOT TO MODIFY: execute the game and log data. + next_obs, reward, terminations, truncations, infos = envs.step(action.cpu().numpy()) + next_done = np.logical_or(terminations, truncations) + rewards[step] = torch.tensor(reward).to(device).view(-1) + next_obs, next_done = torch.Tensor(next_obs).to(device), torch.Tensor(next_done).to(device) + + # Reset and process episodic memory if done + for id, done in enumerate(next_done): + if done: + # Reset the environment's current timestep + env_current_episode_step[id] = 0 + # Break the reference to the environment's episodic memory + mem_index = stored_memory_index[step, id] + stored_memories[mem_index] = stored_memories[mem_index].clone() + # Reset episodic memory + next_memory[id] = torch.zeros( + (max_episode_steps, args.trxl_num_layers, args.trxl_dim), dtype=torch.float32 + ) + if step < args.num_steps - 1: + # Store memory inside the buffer + stored_memories.append(next_memory[id]) + # Store the reference of to the current episodic memory inside the buffer + stored_memory_index[step + 1 :, id] = len(stored_memories) - 1 + else: + # Increment environment timestep if not done + env_current_episode_step[id] += 1 + + if "final_info" in infos: + for info in infos["final_info"]: + if info and "episode" in info: + sampled_episode_infos.append(info["episode"]) + + # Bootstrap value if not done + with torch.no_grad(): + start = torch.clip(env_current_episode_step - args.trxl_memory_length, 0) + end = torch.clip(env_current_episode_step, args.trxl_memory_length) + indices = torch.stack([torch.arange(start[b], end[b]) for b in range(args.num_envs)]).long() + memory_window = batched_index_select(next_memory, 1, indices) # Retrieve the memory window from the entire episode + next_value = agent.get_value( + next_obs, + memory_window, + memory_mask[torch.clip(env_current_episode_step, 0, args.trxl_memory_length - 1)], + stored_memory_indices[-1], + ) + advantages = torch.zeros_like(rewards).to(device) + lastgaelam = 0 + for t in reversed(range(args.num_steps)): + if t == args.num_steps - 1: + nextnonterminal = 1.0 - next_done + nextvalues = next_value + else: + nextnonterminal = 1.0 - dones[t + 1] + nextvalues = values[t + 1] + delta = rewards[t] + args.gamma * nextvalues * nextnonterminal - values[t] + advantages[t] = lastgaelam = delta + args.gamma * args.gae_lambda * nextnonterminal * lastgaelam + returns = advantages + values + + # Flatten the batch + b_obs = obs.reshape(-1, *obs.shape[2:]) + b_logprobs = log_probs.reshape(-1, *log_probs.shape[2:]) + b_actions = actions.reshape(-1, *actions.shape[2:]) + b_advantages = advantages.reshape(-1) + b_returns = returns.reshape(-1) + b_values = values.reshape(-1) + b_memory_index = stored_memory_index.reshape(-1) + b_memory_indices = stored_memory_indices.reshape(-1, *stored_memory_indices.shape[2:]) + b_memory_mask = stored_memory_masks.reshape(-1, *stored_memory_masks.shape[2:]) + stored_memories = torch.stack(stored_memories, dim=0) + + # Remove unnecessary padding from TrXL memory, if applicable + actual_max_episode_steps = (stored_memory_indices * stored_memory_masks).max().item() + 1 + if actual_max_episode_steps < args.trxl_memory_length: + b_memory_indices = b_memory_indices[:, :actual_max_episode_steps] + b_memory_mask = b_memory_mask[:, :actual_max_episode_steps] + stored_memories = stored_memories[:, :actual_max_episode_steps] + + # Optimizing the policy and value network + clipfracs = [] + for epoch in range(args.update_epochs): + b_inds = torch.randperm(args.batch_size) + for start in range(0, args.batch_size, args.minibatch_size): + end = start + args.minibatch_size + mb_inds = b_inds[start:end] + mb_memories = stored_memories[b_memory_index[mb_inds]] + mb_memory_windows = batched_index_select(mb_memories, 1, b_memory_indices[mb_inds]) + + _, newlogprob, entropy, newvalue, _ = agent.get_action_and_value( + b_obs[mb_inds], mb_memory_windows, b_memory_mask[mb_inds], b_memory_indices[mb_inds], b_actions[mb_inds] + ) + + # Policy loss + mb_advantages = b_advantages[mb_inds] + if args.norm_adv: + mb_advantages = (mb_advantages - mb_advantages.mean()) / (mb_advantages.std() + 1e-8) + mb_advantages = mb_advantages.unsqueeze(1).repeat( + 1, len(action_space_shape) + ) # Repeat is necessary for multi-discrete action spaces + logratio = newlogprob - b_logprobs[mb_inds] + ratio = torch.exp(logratio) + pgloss1 = -mb_advantages * ratio + pgloss2 = -mb_advantages * torch.clamp(ratio, 1.0 - args.clip_coef, 1.0 + args.clip_coef) + pg_loss = torch.max(pgloss1, pgloss2).mean() + + # Value loss + v_loss_unclipped = (newvalue - b_returns[mb_inds]) ** 2 + if args.clip_vloss: + v_loss_clipped = b_values[mb_inds] + (newvalue - b_values[mb_inds]).clamp( + min=-args.clip_coef, max=args.clip_coef + ) + v_loss = torch.max(v_loss_unclipped, (v_loss_clipped - b_returns[mb_inds]) ** 2).mean() + else: + v_loss = v_loss_unclipped.mean() + + # Entropy loss + entropy_loss = entropy.mean() + + # Combined losses + loss = pg_loss - ent_coef * entropy_loss + v_loss * args.vf_coef + + # Add reconstruction loss if used + r_loss = torch.tensor(0.0) + if args.reconstruction_coef > 0.0: + r_loss = bce_loss(agent.reconstruct_observation(), b_obs[mb_inds] / 255.0) + loss += args.reconstruction_coef * r_loss + + optimizer.zero_grad() + loss.backward() + torch.nn.utils.clip_grad_norm_(agent.parameters(), max_norm=args.max_grad_norm) + optimizer.step() + + with torch.no_grad(): + # calculate approx_kl http://joschu.net/blog/kl-approx.html + old_approx_kl = (-logratio).mean() + approx_kl = ((ratio - 1) - logratio).mean() + clipfracs += [((ratio - 1.0).abs() > args.clip_coef).float().mean().item()] + + if args.target_kl is not None and approx_kl > args.target_kl: + break + + y_pred, y_true = b_values.cpu().numpy(), b_returns.cpu().numpy() + var_y = np.var(y_true) + explained_var = np.nan if var_y == 0 else 1 - np.var(y_true - y_pred) / var_y + + # Log and monitor training statistics + episode_infos.extend(sampled_episode_infos) + episode_result = {} + if len(episode_infos) > 0: + for key in episode_infos[0].keys(): + episode_result[key + "_mean"] = np.mean([info[key] for info in episode_infos]) + + print( + "{:9} SPS={:4} return={:.2f} length={:.1f} pi_loss={:.3f} v_loss={:.3f} entropy={:.3f} r_loss={:.3f} value={:.3f} adv={:.3f}".format( + iteration, + int(global_step / (time.time() - start_time)), + episode_result["r_mean"], + episode_result["l_mean"], + pg_loss.item(), + v_loss.item(), + entropy_loss.item(), + r_loss.item(), + torch.mean(values), + torch.mean(advantages), + ) + ) + + if episode_result: + for key in episode_result: + writer.add_scalar("episode/" + key, episode_result[key], global_step) + writer.add_scalar("episode/value_mean", torch.mean(values), global_step) + writer.add_scalar("episode/advantage_mean", torch.mean(advantages), global_step) + writer.add_scalar("charts/learning_rate", lr, global_step) + writer.add_scalar("charts/entropy_coefficient", ent_coef, global_step) + writer.add_scalar("losses/policy_loss", pg_loss.item(), global_step) + writer.add_scalar("losses/value_loss", v_loss.item(), global_step) + writer.add_scalar("losses/loss", loss.item(), global_step) + writer.add_scalar("losses/entropy", entropy_loss.item(), global_step) + writer.add_scalar("losses/reconstruction_loss", r_loss.item(), global_step) + writer.add_scalar("losses/old_approx_kl", old_approx_kl.item(), global_step) + writer.add_scalar("losses/approx_kl", approx_kl.item(), global_step) + writer.add_scalar("losses/clipfrac", np.mean(clipfracs), global_step) + writer.add_scalar("losses/explained_variance", explained_var, global_step) + writer.add_scalar("charts/SPS", int(global_step / (time.time() - start_time)), global_step) + + if args.save_model: + model_path = f"runs/{run_name}/{args.exp_name}.cleanrl_model" + model_data = { + "model_weights": agent.state_dict(), + "args": vars(args), + } + torch.save(model_data, model_path) + print(f"model saved to {model_path}") + + writer.close() + envs.close() diff --git a/cleanrl/ppo_trxl/pyproject.toml b/cleanrl/ppo_trxl/pyproject.toml new file mode 100644 index 000000000..e57a0b2d3 --- /dev/null +++ b/cleanrl/ppo_trxl/pyproject.toml @@ -0,0 +1,28 @@ +[tool.poetry] +name = "ppo-trxl" +version = "1.0.1" +description = "" +authors = ["Marco Pleines "] +license = "MIT" + +[tool.poetry.dependencies] +python = "^3.10" +memory-gym = "^1.0.2" +einops = "^0.7.0" +minigrid = "^2.3.1" +reprint = "^0.6.0" +opencv-python = "^4.9.0.80" +torch = { version = "^2.0.0", source = "pytorch" } +torchaudio = { version = "^2.0.0", source = "pytorch" } +wandb = "^0.16.6" +tyro = "^0.8.3" +tensorboard = "^2.16.2" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[[tool.poetry.source]] +name = "pytorch" +url = "https://download.pytorch.org/whl/cu118" +priority = "explicit" diff --git a/docs/rl-algorithms/ppo-trxl.md b/docs/rl-algorithms/ppo-trxl.md new file mode 100644 index 000000000..dee80a556 --- /dev/null +++ b/docs/rl-algorithms/ppo-trxl.md @@ -0,0 +1,184 @@ +# Tranformer-XL (PPO-TrXL) + +## Overview + +Real-world tasks may expose imperfect information (e.g. partial observability). Such tasks require an agent to leverage memory capabilities. One way to do this is to use recurrent neural networks (e.g. LSTM) as seen in :material-github: [`ppo_atari_lstm.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/ppo_atari_lstm.py), :material-file-document: [docs](/rl-algorithms/ppo/#ppo_atari_lstmpy). Here, Transformer-XL is used as episodic memory in Proximal Policy Optimization (PPO). + +Original Paper and Implementation + +* :material-file-document: [Memory Gym: Towards Endless Tasks to Benchmark Memory Capabilities of Agents](https://arxiv.org/abs/2309.17207) +* :material-github: [neroRL](https://github.com/MarcoMeter/neroRL) +* :material-github: [Episodic Transformer Memory PPO](https://github.com/MarcoMeter/episodic-transformer-memory-ppo) +* :material-github: [Endless Memory Gym](https://github.com/MarcoMeter/endless-memory-gym) +* :material-play-circle: [Interactive Visualizations of Trained Agents](https://marcometer.github.io/) + +Related Publications and Repositories + +* :material-file-document: [Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context](https://arxiv.org/abs/1901.02860) +* :material-file-document: [Stabilizing Transformers for Reinforcement Learning](https://arxiv.org/abs/1910.06764) +* :material-file-document: [Towards mental time travel: a hierarchical memory for reinforcement learning agents](https://arxiv.org/abs/2105.14039) +* :material-file-document: [Grounded Language Learning Fast and Slow](https://arxiv.org/abs/2009.01719) +* :material-github: [transformerXL_PPO_JAX](https://github.com/Reytuag/transformerXL_PPO_JAX) + +## Implemented Variants + + +| Variants Implemented | Description | +| ----------- | ----------- | +| :material-github: [`ppo_trxl.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/ppo_trxl/ppo_trxl.py), :material-file-document: [docs](/rl-algorithms/ppo-trxl#ppo_trxlpy) | For training on tasks like `Endless-MortarMayhem-v0`. | + +Below is our single-file implementation of PPO-TrXL: + +## `ppo_trxl.py` + +`ppo_trxl.py` has the following features: + +* Works with Memory Gym's environments (84x84 RGB image observation). +* Works with Minigrid Memory (84x84 RGB image observation). +* Works also with environments exposing only game state vector observations (e.g. Proof of Memory Environment). +* Works with just single or multi-discrete action spaces. + +### Usage + +As the recommended way, the requirements default to PyTorch's CUDA packages. + +=== "poetry" + + ```bash + cd cleanrl/ppo_trxl + poetry install + poetry run python ppo_trxl.py --help + poetry run python ppo_trxl.py --env-id Endless-MortarMayhem-v0 + ``` + +=== "pip" + + ```bash + pip install -r requirements/requirements-memory_gym.txt + python cleanrl/ppo_trxl/ppo_trxl.py --help + python cleanrl/ppo_trxl/ppo_trxl.py --env-id Endless-MortarMayhem-v0 + ``` + +### Explanation of the logged metrics + +* `episode/r_mean`: mean of the episodic return of the game +* `episode/l_mean`: mean of the episode length of the game in steps +* `episode/t_mean`: mean of the episode duration of the game in seconds +* `episode/advantage_mean`: mean of all computed advantages +* `episode/value_mean`: mean of all approximated values +* `charts/SPS`: number of steps per second +* `charts/learning_rate`: the current learning rate +* `charts/entropy_coefficient`: the current entropy coefficient +* `losses/value_loss`: the mean value loss across all data points +* `losses/policy_loss`: the mean policy loss across all data points +* `losses/entropy`: the mean entropy value across all data points +* `losses/reconstruction_loss`: the mean observation reconstruction loss value across all data points +* `losses/loss`: the mean of all summed losses across all data points +* `losses/old_approx_kl`: the approximate Kullback–Leibler divergence, measured by `(-logratio).mean()`, which corresponds to the k1 estimator in John Schulman’s blog post on [approximating KL](http://joschu.net/blog/kl-approx.html) +* `losses/approx_kl`: better alternative to `olad_approx_kl` measured by `(logratio.exp() - 1) - logratio`, which corresponds to the k3 estimator in [approximating KL](http://joschu.net/blog/kl-approx.html) +* `losses/clipfrac`: the fraction of the training data that triggered the clipped objective +* `losses/explained_variance`: the explained variance for the value function + +### Implementation details + +Most details are derived from [`ppo.py`](/rl-algorithms/ppo#ppopy). These are additional or differing details: + +1. The policy and value function share parameters. +2. Multi-head attention is implemented so that all heads share parameters. +3. Absolute positional encoding is used as default. Learned positional encodings are supported. +4. Previously computed hidden states of the TrXL layers are cached and re-used for up to `trxl_memory_length`. Only 1 hidden state is computed anew. +5. TrXL layers adhere to pre-layer normalization. +6. Support for multi-discrete action spaces. +7. Support for an auxiliary observation reconstruction loss, which reconstructs TrXL's output to the fed visual observation. +8. The learning rate and the entropy bonus coefficient linearly decay until reaching a lower threshold. + +### Experiment results + +Note: When training on potentially endless episodes, the cached hidden states demand a large GPU memory. To reproduce the following experiments a minimum of 40GB is required. One workaround is to cache the hidden states in the buffer with lower precision as bfloat16. This is under examination for future updates. + +| | PPO-TrXL | +|:-----------------------------|:------------| +| MortarMayhem-Grid-v0 | 0.99 ± 0.00 | +| MortarMayhem-v0 | 0.99 ± 0.00 | +| Endless-MortarMayhem-v0 | 1.50 ± 0.02 | +| MysteryPath-Grid-v0 | 0.97 ± 0.01 | +| MysteryPath-v0 | 1.67 ± 0.02 | +| Endless-MysteryPath-v0 | 1.84 ± 0.06 | +| SearingSpotlights-v0 | 1.11 ± 0.08 | +| Endless-SearingSpotlights-v0 | 1.60 ± 0.03 | + +Learning curves: + + + + + +Tracked experiments: + + + + +### Hyperparameters + +Memory Gym Environments + +Please refer to the defaults in [`ppo_trxl.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/ppo_trxl/ppo_trxl.py) and the single modifications as found in [`benchmark/ppo_trxl.sh`](https://github.com/vwxyzjn/cleanrl/blob/master/benchmark/ppo_trxl.sh) + +ProofofMemory-v0 +```bash +poetry run python ppo_trxl.py \ + --env_id ProofofMemory-v0 \ + --total_timesteps 25000 \ + --num_envs 16 \ + --num_steps 128 \ + --num_minibatches 8 \ + --update_epochs 4 \ + --trxl_num_layers 4 \ + --trxl_num_heads 1 \ + --trxl_dim 64 \ + --trxl_memory_length 16 \ + --trxl_positional_encoding none \ + --vf_coef 0.1 \ + --max_grad_norm 0.5 \ + --init_lr 3.0e-4 \ + --init_ent_coef 0.001 \ + --clip_coef 0.2 +``` + +MiniGrid-MemoryS9-v0 +```bash +poetry run python ppo_trxl.py \ + --env_id MiniGrid-MemoryS9-v0 \ + --total_timesteps 2048000 \ + --num_envs 16 \ + --num_steps 256 \ + --trxl_num_layers 2 \ + --trxl_num_heads 4 \ + --trxl_dim 256 \ + --trxl_memory_length 64 \ + --max_grad_norm 0.25 \ + --anneal_steps 4096000 + --clip_coef 0.2 +``` + +### Enjoy pre-trained models + +Use [`cleanrl/ppo_trxl/enjoy.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/ppo_trxl/en.py) to watch pre-trained agents. +You can retrieve pre-trained models from [huggingface](https://huggingface.co/LilHairdy/cleanrl_memory_gym). +Note that Memory Gym environments are usually rendered using the `debug_rgb_array` render mode, which shows ground truth information about the current task that the agent cannot observe. + + +Run models from the hub: +```bash +python cleanrl/ppo_trxl/enjoy.py --hub --name Endless-MortarMayhem-v0_12.nn +python cleanrl/ppo_trxl/enjoy.py --hub --name Endless-MysterPath-v0_11.nn +python cleanrl/ppo_trxl/enjoy.py --hub --name Endless-SearingSpotlights-v0_30.nn +python cleanrl/ppo_trxl/enjoy.py --hub --name MiniGrid-MemoryS9-v0_10.nn +python cleanrl/ppo_trxl/enjoy.py --hub --name ProofofMemory-v0_1.nn +``` + + +Run local models (or download them from the hub manually): +```bash +python cleanrl/ppo_trxl/enjoy.py --name Your.cleanrl_model +``` \ No newline at end of file diff --git a/docs/rl-algorithms/ppo-trxl/compare.png b/docs/rl-algorithms/ppo-trxl/compare.png new file mode 100644 index 0000000000000000000000000000000000000000..ee965744be0f3da16589696b6e7de66d7e342c4a GIT binary patch literal 165190 zcmeGEcRba9{67wBNQpFzLP*Fan~Wr69Lmm?tT^_}I7LZ>WRJ}3y=O*3_RI)b8QGh| z!S#6c{(io{+wHo(*Y(%+&+m5o{n1-*=bYDhj>q%gZx*Z-R$1aEOXREsxa{J`*EO{ zj2u1d3--c2PUpe^KFMDyWy+Nf?bstbGvAxe6wXGGdc*TaFRv84td0ru-gEE%+ATcq z#+MrQ;QXyOm;d{ZUtrI@s#E{hFP<&Yy=M5|ub%IvzxwFv|Me;d{r|sSG?f*+kBmY` zV#uiwU7ZqpOPl%fdBf{6vVv0oet+u%!v%Q#Stv`YR;4}T&!0bUj+6Gvr>3TcMMkDr zXv+#p|9jt+|9Ri6_oJ^bcjzet~di^O=Wj#aW7 z)W*ruxV_1*J@98yP5a~XFj(SPh=AG_@91!EzH~@`X4Ix`cBt-{e@NGXxP=xYDxWEn zFX*(W29FFmDId~zx0{PLBe$aBHoWh3qR1r0PCiq6xH_|jIk{)^b%z{Jo<&J)M{Re+ zjJ8X3tHb#??B7ZeM&BIAL&oVBbeZriGZz=ZBt_jmKJw)!hZ85mmib@t7Jg<^KnTE| zzH8^Ii%U3KHtR@`NH{(^bbzn4A9x~bw>R!GAMDb6!>p&;#U@B(k(tJ8-zZJ#v-bMS zkVkJGF?>1^zD{&CP-Y7)G#jRxk(Xy0EVesYHfnvFl(5jemwtBwgYm+)8`v*qrf-gz zC2Ry^a6ZBgbL+E_24#D)|8}+4@9ZaJ%)O>zDq7KLkE8OJ4~YOFL+N+6{F(=Lc6YhHZmTrx!qg(n5_>9hkI+v?Bppn6SWLiFC4=zk)L&qY4a(mjpjAG8r-sVV(%6dQ@qu6Pmqv) z7Ppmf!ay0g2@CRARkgoJkmcVRHb0m7cbtAHGMlgeNVwxNY+2qcNpSP~O_woA?(1LR z;ZdejCcQc~U!`Hi;E*S0WH8rxzPss+HyLYFYqa)t&)RX!rWWga<+co-Ed;?`FWf%P zm`W#zJfJCNOx$viJ>KiU!n8ZS^TM6DdRVL`RBOO9acQgq6#$7~yk15e8#;TR=oL!)Wn$&V*3EsZakfqL@f zNrT(`=N32=jSIag(RYo{xvzZ{lsNjU9L;CZXL?fy*~#S6vLH6Ge`~8mPaa@5q~~IX z+h}nZd}?NQjGb52)$M@5_{JEi`>n8rrroaP=8$Q=3%pv`uXN9@0iObo+j>lhv+~c? zE|DenTHL0ByuAG8q1Q$e1^#O`RR49cmyWTe|B&&2@F>@Dxv*vPmu0@)O6gG1gx6t+ zQu>J3;R^O>4bzQJpKM57}DRl>bA-tg?T&^Y0^m zySY`KJwd*^m-W9i_}$b&k7Bg!Ue%4{x2Ipf z>Uj7suQ2_;%}lP0p4G)h%T*d*n!GwSXcRR2Dt4PxT#%lFi(OT^x zBu*ACu6fP61G1f+otxwAx5@~KyQ@)00CsyKRqu7iUK7yxrCC_j9qppTkNXt3W+f8J zE_Ku$u2v%xRnycg|7+)Pj)dkznuTH%cT#K131rwm6Qi=Uo&%idVGXzVmWktCL0_U9 z4}_>qBlVo88VG2Y7fhW95zgqSKV=(5K;!z#b8o!d@Q});rlBuY;lkSo=!2K7&p&17 zRS~W$@2)VC5^g}Iwf~zMNp6J!0Q|MWU+x@f;3bS;_9(jiW_p}GA@cLDV+=5iC@SlU z*O;Rv19q)~MCq28doG++wX?><@$+}xHlK?hF7qOo`*M4s0k)$HruYMR&)D+Yx0jRA zj}qv$Uv$L@Q``Tzg(TWB*O@?ey{fRK{JMCzt+|achi)gwtvACjaDSCC&whNo6<9_> zC6IGQyMF`H>DGMrybp=E;aG(oesE`;aHy@2qR40Kts$78OXXr#Ho{VnB(yc-bMjl? zeT82mPgl;(&8@+B1^c_qsqW-x4cN-@w`jBYRvP!^2H3dP5{v#GzQCDaiQ1Idp(Mz! z=7U#csT*zwi+axp;g8a~PM&HGx;eVQP?{;)Z8>yJhdzXP9}85|oaYm+{tOAX+vXo< z%a*|xgE>!iJ$HUmyNua+Y;_9iy04VRc^&+XbNTHy20PCFwCGL332vTB)K|q{jTL`i zQ1A79Lj}IC^(n#PZ9p~Jfu~kX`?CqH)oi&Q?F`)|@?p!XcotAD>z5~UK-#NPcR0Sr z%*HkYkvt#g&@~lfnKw14V>64LPnZXuu)HvLq3~xEpT*TX@vhHOFk-L;3u#V%z;<~& z_Sa?RmmNhqVV=L|=9hO41Ih;0e^DAHc<$b!3FfsN%<(>o;M8k_=x03YWzs6Mx*<4b zduIN#3ysT!r=VH98|Q;x2^KU;_Gw7Jf0h?n%(Z>sT~1I#KVjCGhxuoE-a5&eN$_|s$N@1I?M z%XP<#ovMHh-0bIau*{J-!ENCbqhNR4+=SCVJ5yQ?<#7l(TW2-^S?h!igH^EPI}k(v z;)BODmQQ%aPL$ct%Im}OGfikRg-&g@bD1p<7sBbi9MCjuQ+MPF34QaBIrX}zE4Rc! zZ!o2p#AhW{6_szmTJ;LXw?y;4?rI+ZLldH&`zUqE=op6$j7Q{w!~WDec;5p)%GpxtFFYN60 zLaz_zcq`$oPlHTwWLOxV_C*QTb;BUh%}4sKQ~1sko-Xtu=Uv8~G>;2+92j64n$#Za z4G-zBz>vCuCi%>}QK3g6Q2f&@YBrjw0%@w3@~RIY%U`p8f zo1Va9(Z}E)5b(Zb20@a*2!gqYYqhX0aqg>?+lxN~5Rn5wZ{NxoiO2o?$43uLSo^7$ z6P|l^>kS0`*_vGNO}Aw}Ou`e*2YiY3bbKUk|BW&ZV%e|3qw!dmgaJkg**!}!F8jje z0in~wm)knAcZNjtRhmUdyjZp2VUbC@(7{3qi~w2l0Iu4KCp}GDqSm!oQ<)%YIU(va zm$lzgxR1S_90{4({+bu->iqL0b3ayUxGe%mC7iTY_f$l_k&vUB0ZWtlTJG z3FFG7N{4w!QRTm1vf(L(b9=pffd;r~3c$;f-ow=wK=ESuVbNeS^Sv{U z9J?-+)h4b783FEoyDJuaY7*= z6Y-AaX1`xk{!=+0pHfs*G>JtZ20nruE&S1w&B(g-{h43~AnXn!CXpMz-PbmX6OM9v z=S$#Zs_N*plWFQUz>v+dva^NvCw;Jx#wbgjKykUow}8THA9tCv62rjTQUT0d4@(RALxUh>M%>N3WLGJP_92{@aB+whKw`?AtlYxlKEwnD%tQ zRUx?Pc-djDW2(IFh=W4c_SDJoUR@=upTGfS=pAM2-R5U7YXs7sq{y5)maez1UKuoh zI$mKn1N_?q03-J$2K~-%^dj@#WEsJX01B=-I3Mj8g4+G*i_|Tx1QGUN zco;W-7+FAhUw-yECWaE8th#P<^a=|RSP$ky3!qjfGO@i0O!wUuY9I6{))UdtUYnr_ zzw95Mx+G3KtSe{9eTk`>;T(0r%EV2qA^u0* z!O#5bcb}aVobce))N>+(0ZhT^?_P805}vmOIlPXTEnsJShG36+#PAK?*gxI<{8x!Z zj#gnZ9p*POxLfb2ALQ$QrCd4rscBFM3Tgv}Y6sL}vqj=KL^^=n4$eGz3CBEy#Vlm~ zIY8=pWJz179f<)$K-g0sG+$RN2Bgl#WL_VyZ3FH^}K;dLH0XOE@BMlYX9LAy= zCGIJruCA^a&GQz%!hY&4g*_msJ;=a9!-mrcN)ca@*;^ftJ#$GYam1aVk$WHL4B`IX zB~Z(soquH-){PbY;GCdkxi#njfyZ*+6SB-AVJbf7 zh*coQG~`)!;J7f~*K_FP$8QnY9X1Y6vv>ii3X6W#=cI?E4gAAA{jb`m7X8`s%m>oO zmISxqOt9Ynik*waqBV8x-ku%+S>I!RGG?5unXf@%;892^V5N0jD7HH+_4(yuCUzH6 zoEx@ER+jwE>bMS!+5(GqnD0`5RRsx#a93}^( z3pJnl;|5Cu+Xj5X$KdUGd5waKRg;r@e|jKUIzV8!84`#jppAlXQ0PS2vnImSrK*Ge zgyXOYusR6641~Kyw-k%fWDl&w|Ehjbej=X35=5TZ(4AysJx(Q}T zzE{M&D|Tz;b$4VXz)N^u!rBeS#fYqeQY2O#6;;_Wn3*^q8GQN3JAJNVYlS*`f?L6Y~x39NFMMGSu3 z642+Tr|^d+VEVvDvI>n`<}hAMx#gsZrd@GQ3nsR@B__<>S3MCygGF=Itb3nUW4PM7 zcT=7PK+J{Z{#VFdfxk7SDv#`sjJy1<+#Ue^5_bZOx;4;?M4l!55d&$W7wm)ex>K1G z&uuxY9z>e4hED@_rRC)Xr6+h*wPqf4i$iD`t!En?Wf>mA?ooxQ1b#B6v8_M#;riX= zrWLTQu_p;&z7(4h14FoTKeYcT`1^6hG&TTVh$~7Wf#W`zNc&Ck%IG?lQ7?Y}$fRDU-y;^&djs~bNLNxYG`Z%Y#}*_2-Qy*FQ5I z8L#{*#fE%&NZ$Z>_zirw5$0(xuvtk<+yQE2S(;$@@e}&syR1(&Zsix>f~1ERXnOnS zzyR>cZf{Iw$adT6axiE!$-c&TF?Rt}%)pdN43v~r}xoGOy8N(kSwl@~~`V7Ho(m(w= z213*k4yBiKZ9&{^01qU?>73w%!JLK|-jvA4tZIQjisZaMp~`7rzA)5HKoYI$-O5w( zN3tK_AAYJ@Lq`UjZWUG4P>Hqhh=?M`zkN)RKWD=tA~u0O7kgkg2R$z@fg+#;o}uOC zR%&z|2YlJOBw?wl29hwf=XNi?g2UnV-$r2euAnfshT4P?!QpFEQo%udm@-CG1VH)< z$OwFkYQb7_UM_LtWW`KSdpGX0umjVXb3{K*lmxebQ7v9n7WvD--p-m~DhNgQKe2R{bN50lVd|9t(PGy8^XjbWx>Jp>-1saPPb1kEdumqHURd}FnR z#|yv*8~8fCJyZ<5u#7<9O2_V%c&nkWQ4Ij+XHtv;@h5tpC;GdSUJ#(C%pr$p5$YW0uYrAkyU0`HG7cn&?k2XF+Gc2H=dm%ru>emQ}if`DaG1#`po8M zS8Mb-)F<$S06k;Tnm_|3=j)E|g5i1oU1Q)U)`+k$Qbn|WrM*c?%k7Xy$9t7tt+TG8 z@!bxa(*a!e<4!~TFLV?zEx<*(685Pm#XVdby7~F}@$W1faz84!9^b4KH|>mRf@nUy z{}}^b)POhY$9>M!r7E$%!Aqx|CFu zaHYfg$sy(>80?5>_{d$WVeU)!mbsBc3{FGn#GVc2kP6fe4+McBC_ZYt?^og+`{b~6 z%ATH{4gA^2aehvG6NB5(_1I_<1tY%$j00G|q9>S8OAJr6l_QGK3-iZ~Mgq5f=C*85 zhm8#yvke6#+a@wiZuecQPp!`zjFH7?sE(j^2fV;doE*^tNx1QkbE%0)&v9bN|y3z?@CvhL7-K5Qsb1+a%zc63eP9e6CFFRp zY34nL8U$LUtf&;@3IvTBJSR>>odb0PQ9t8G1B%o&bjeW19%s>?2FU61SWWFafJZEc z9FX-rhc=dUTafDxAd`AP6cIHVLJ2TX{x@vbhOX<>TVxLZ=oh?u8Ol;9=lh+38h>P7 zIIJyIE#+AX)b$+jzKs!?Yt|>gg@pTp@geHYys-DrJcyzHW&VQ80rrl|W7^ahvU1??Zy`tqQ>qBxqpnxchSk zCkL8f5#41%#e4_D#o*&Zx1K~v?3Y2}9Vn>5iT#KiP-L(O6viIuJ81XQa%dI2lDZ`P z2C6Y3V7G;U4|$pBoEuc{D*vX%Qtrrd2=DH1%pi0Wkq`mo950-m*-P@cME`yX-3Nix z2?kvudjQOdD_C(Q9Lk}LFVDMxOSxiaBQvwJ z+58sfvxb3fo2TUW>z34HW&Nv^fko&Kl@8H5F~O>;Oytl(VXw=djBURgbKJk|1tu;t zVhke4E=d*3dSfD2N03Q5z5_TncBI>@`QBQMDtF&6N-z%aakF@pi70mqE$ItCf^&#y z#pA#qj0dmE8xmx+7W?2_z8G*LCQKyIOpbjlBqWX~@lo3W4-j-XkZsdYdYyvzO0uYP z^OG5NMBS~~8Psu&*R=K7gH&@ZQ0Ag3*M(cZg11@p%9YHF79l|AQ0XG4F@|96sonC-dt0f1c%QE ztdtkdlZmCCQ*cPSLBW5A9QBAboc{88zN$g%OtAMhK|~b;O(`>s1410iVnV(!#iT*t73`SMbr)_nfUH538M)nsc5ONAX*d z&ol>G@*V9B8waNXfPfBUuS3I=kgW%flG@7O^T4m{j;H+4>c8ByIol47gZn<{J<4%E z#Njvkc6Jp6#Ny)O=I9BSAdd|U47lCp&i5W8=LnWS@1&Rx)k^0jBTfZkAfPvhR zz+ON=gsRi}-M6i-gP(suw}Y#6pXDujv?6cRJX!^$@WN=hjTg4pc@(W_yJ}IvZtaN- z5TqDB_?GUHUX?qe7|5m@z_G|XtgwB>9H|+HI$P%= z-gpS{tQuYvj|m}Shd{WlVd3Q65PQkTRl84*m{ovll3omsQs8I8QW%1Bu?z)a$ECqQ z@I~&v7+^+v299^j>x@PP;Ndf1TtDwkmX1BD^@8kR{cEj2DeYJOi+y zd0_9ExSH=M$18%ehJ!5&PPa<&5=KyF$O-H*8U(0+gxnSetMKnoK5csh#|-peq*PQy zrN_T~5gIg33B-H`(Cj(vDbOqeY5;no8$54-r31TYMNSn`m?laZtk~{TfZ#oD1e3E1 z@|7iY03h}!=Ia2E-{71bc2>GS^n{)qjwB^bR_4GIV$Ny3w_&Im2#6l+yEvLMDg6zs1f`&eE6 z#1Gws*d7V3BR$}NjW2JGrYRNhr>fv)zlsW0Ymy% z;6Ryxbq&1?h;<|mgoOBofi2Po~gB6ehd zOBYJ*eG-rm5kB6Zxp4M0VwXTy#|H>E@KA)H*CI0?I(fi)0?+q_y_<~!F_M4Qaw{q- zetJ&H-T55WZ8@xVIU^P1FCKuIRhn`F)Q%j4AfnEnJ>3y27>xAZ=vY^#w&LES(U2w( z=Wq-P_K0WGt8$3gz+f%g0>OoFL%5l;=*C&3uLd}pmAc9fIs{4>u{}}w7!GTNp2ZXc~OA}DyX4t86 z>A|#ks9EOdR(=Ax9e}i(zz)~~;o1TPLaIjCe&L)CNVafLj$d2fWaJ{A7!NSbyxM~o z)?art7MGTwaA=0x-#`rHSf}N|eE_A7@9(cwLc*&AL_~xv^v~RM9)3N6n-hd;kT8@S zZ2AfvmVz-*;(|fp-Xbm+cy~SJHWS`$_o;XxjUfkx4`pfp*T?8O((R%P4*5Sio2ljx z8ph`auPI-&&BOD(c3+gAn&~X5f<-NR(}@(8>-o1g7f|P#0mlT9XgHn#UXE}?QZh0- zFeP|B54Jh_WNwv_5l6D~I|69w+ST1V64)_lum=?g|dFXtu z@5{Z_P6AqwdN5Y*AcPCh$GOU7tqaaF7LtC<#2N&tDKH!)iw_J9_18hq(N4C(#ybhz zsdcmHcsO&2juZtu3~XP-+J!uiZQ}Cko!;xy21frUxBT}sWNc$N`0x%OV3mNBvFzmi zVaS}p@rVJQ5;~uNq3Pbzg8q!gcO>(Gh_fV^{WIWW-Gze!zI$DwS$BLK_+Tr$@%GxI z6iN`!MMXTK-7^^}LBDc_YN2)K28c>1<4_=_I&M@b5=Gz)TH7)`)e!;1419=zpFjDl z71zMS~alh+)#c zbojAg9y9~HYLKQF{SBeYLDoSFhLFbn1R|8uk-1@8mA&XGa7d>{z%~o~5b;5H7Px4L zkaTiXeRzjXVf2mpZD1|aK|suZW)&U~!XO?08zj+c#mprntu}wS(FnCokt*Tj z(2vyr+6w=76Nl`-cBcPYK>k1aT&U$<&ATBjc0k7XP)iGQ=WjiH_eB1Qrl#yft!M8} z-rYeuPiSM=uhOQao5$RGqm|C@31fQ&{ui%d{i`5r-^&jiDG^}@aJIH!YIUWL0G^SQ z*GKRJYjFM+rKKD#^l&C-WSn1@D43p}CYR`T(j#Zrs_#jXg2tDxF+&!Pse5c|PNNKK zPBSkoEpI@d-f_(^*(2JX+CL62ZeZiIWyI41N8`FPvUg6!zC0$ta+Z-{sRa`}d}Ecx zr3@?&@GdY&da+vC+1X{=&`)m&L3vPb`r=Ud@BEq}bZE^`#FD%!E|tXGU{kpCgNG8w z?S%g3(k8P3^@CR^u@fH;icx=$Ab3_|=bZ$jq=@ZPqsP-`$Tt1g2hz**e{7%p-z)ro z>aG0$^`gjIF!n=1VIdL5hnj&B-|&KiKIX^?Ir>mHgH}usm^W5_EB!Z!DxTsLD!MX` z))Ex`Y~qq3rHFJdT~(fwV==U>zJ}}yEndPaCH+EBp%kb(0c$o&)Qtx!*p~oR{ve$G z18-NNa)LO3w%x@NEx)`5J2745D}>jv==k*Yum}BoxE ze0)~%Ok+Ox1IDFoyg+nr{EwCoj*qu zw=Ar|!c81_zn;!~(L5%u?qLh`Fq!jOv?p;|s3x=-np0};8rZQ9_oA*nu);@Z2yij& zniKHRTcIhgV#=2aZ`dOJGh%HaG7z@w;k7W8=hR%Zmp4VF`|JzY3Hk^8-kd(G__^x2 zZ`f?2rAYjy&!hNs=D>I7@liP+r0CHz6@;kUv|oDpIcQ7ls7WZ#eiBtaMM-!fti38p z{Mf5N_Dm0-{ho}r&pg{~;*WEgR*?^XHTO8xI39P-CVUAA*2Fe&D9>VcT{aAEQ<(Sh zVK9w7J-ysS#En{l76vvwX}GP{)qD%=nT+MpUOv=mwFiF0@@Y4-mik5$ zr0m%J=2@)3ciO$ZvSH3GahmzfWwg=m@(9w>VmOLqwMp-b0{f!vMFs3^Ck|*d2VUON zbd`00!GzQJa)wcRLO)sS`~VNiQ;FDY9(1xSn6kihQr}w6%hMG! zWlJGt)I4Rfd{$R4Q8IA6J6QIsSYr7mc};I1G|lYGz7-&6SR?!DW+flxayJEU`111oF-74kicx*o^bwQCzGfV9+H$cW z{4soN9ABrp8;EUb!;iJc?T18Q>MD(2(bn*6J2j;1+OksA_wh*xl^#1iS#^oJ=WH#Y zE>*b_lQw%sv+`ulTQhb`@D3*ZL5W1Wb7p2aH&LJ#Lr>N`Yw9C2UG~w9ZoBw4Yln;+ z1>+bd5wAqi>)e~X(e`}Ar$Q4+yYd59!gNMb!SuryNmIg1Arxy>HEBdR8rUw#4|T3(TN(zqf_6{e`yfhBD}* zhFYouD9Wqv`LH#A`_mnulEwe47HV10VgPesVIEC|5tQ5%#TZH6?8G3}enkQU16qDWVc|Ar}|me^`j5x__H9XBD+~+ZP86 zrWf(P8%#(lW@Jgt$jyBA_o|4;7cq*DZS68n_6=E1hbAYZwu0){<5)e|{6C}=SOp)1 zDbTMRC>*KnR!=@ax80iA7Ywo9rK?Q*w8Ff2&BA%2FzBw7g7!{4@Ftzoy35HosWi)uW)*iOe@?wwx+vwL7CDekpKynTd~B z*$sOmB_?g^rGD+nYurOsKE1|{_==8KN;xc&obSMcdFlfvsC&JU}M%UKR6X?-E`|c_r+Tx9iY~mLFk8_R6=(ecu3ri3y-1O zLC1r7$O*PV91ysX`_Jh#;Z0$5+!70QOT&)n!7lBa+57a-t@9n+#Kiprl30r0r~22V zc!OlQ6U`hhV<|@3wtS?^mVy`OB3$rMDT%>dosJf)h6B;iMb^jIgPHuObR$afsgk%~ znBqNlozHZi?H;Aw^gcCSXV=G{waBiKhbnl6{uJ}Fy)MLF41-NtDV5Wav7$8rT(kM< zV9(3<_AZRUChrfMeed}l2(Zbk&&fE(#YqB-TLPyHYO@t}9 z9laa*IJPPt9U##!5bb>km#Jn-vO z(brdkf^0(>6wqP)V?PI;g>L)vZyyAfQTg^R1`y~C3I27{>nz(A<}X)dLkk~o7CfHn z&`BlLaIR;h=G#)Z%!hlE$t>MwU&tfy_k%3zn@@@1OhJ`M(_$7W|9c|-9rE{KsOF6V^iYCuSVw`ClbDlSb*H}O z5TE?CB+M9tr^KSzXt4U^D#_JWuOa(W-^SSQNDck?^5RCZRItWLC;B2L<$)u^(3aWI zb83Ry?-OIbL)`?780DW~w?k_xD|*+2TidrYLI=H>e(L~oJm(v9zqm~$G| z5xI3|E272OhlLcUSS0GhimXoiDsh`%zJOnhO=DMy@LAb++YT$bi}D=bG(eB%DCy}4 zQnj}-36!JXmCQbVYWd{qJM)U2;-)G}a3MRNjc~p%38lS>R^nt`jiPbNB&tf9a(hgA z@efx{sKqye0YhCXR zkKatV*yJ&LQuB}ba$7dhqRNHO{?a>Bj(zPE7rgb*IH=k>Ezsb6ePe4^t(`8$G>I11 z$$6`v?}21WqtBz2q)HPss&&@v1&3b0pX}-TMj!8xUw9nZ@v%!NDosh~&-_9$TG0K{ zj+qj6FD1s{{eT8`F)1lgPU!lVww_D{?U7g4u&M7X+5s_n+jP6z3AT-=i0|-r&*rz` z55)Wu6dZoO@JmCmHMt-E({GP06i|E-@#B4C)0#p0qq4y zSA_&_iUjG&)%o&OFM7pwU=VBRF~gxdV@W9z@=*@;^{uajbWsFROq$Wiv09VsK;8bO zM^6=QRfQcKyp)ho97G5pui2&XDktN~`q#S7BPQ%RWgjqbQ2-Cov12cna&=$+O+}Pe z&B04++S6bEs z)xyU-0u-a_f!+`EHY1~>e3j_T$vwC}EO&m4&KF6aty7)kx|93#8r|@@Vxl(-ZB{Ma z%5y^c;!$x5wkxhQWh*9;Ozzl4i>lRm?oV6$5$dF9T}IJ??>T96uJHyBlXI9A+w3#t zw2(t-)ZR76u6F#v5F=Bl#AEX3(4H=#M0cpvW7_t_ZK-QCURFRNDZ*3lkqPy;Q$CM- z5}7HjHmhgcmQJg5J{cLYp^BaC)ezC6V+nc0{c_t}>D~%o5OfR%uGT@{0%F)hF}x8> zd+0jW6q@AM8yUuN^d*VH2S)fQ4su!E}%9Y{1 zT+PPjwOilI{z55w8oHs|PU6~)9ie@L*SMJoiKI`A3Y)XmF*4EZyYcQ(4?}cWArEvHTQkXdwk7=hq&VWb zPw^3@H#~b9uctypQ#0gZ+85qDiLAIEAKNN&vJ~ga&%E*W!sCoCdRp=2>Rz#0SCBq^$-sG;$J9b+ zWyNaM5^@1AMK*X2xxj_^(!u3)Wl!>!(kE<-=C9Q&Y!@m+xrrf9&0E^!Q{M+%E;QIyo1bi($~u_&27gu zoC{xOOdKeErOv%C!HfeHGq0M{%#NKeEv4fJc}CBA#yY-qecurkPbl{-n&$R7Bn?#@6+K+t>%dy``zGBj zaJk}H)dFqD(rhmZZ$=)A&D8Aul-JNq#f##$rZea;kdihj8vm7P=HR!@9C(>H`i-}* zgk|eSb`Sn(5u@9UiC$mNpX;#FzwlXqJb9Zn;CZ`2`AMmFx|+a5I4z%w{FK|V(+7*i zH+;lm)O61mu{SI#V|()|{-ltcjZZlSZCyHIM z!Bh)(lIgHWybEm8_~86QXtnC;tGqg#;_POiNimmY5hmHu* zDq1%vhPH|-BXLiw3m=ue(EIk_l!3Z4-+y zF?yIz5G8qbB{b%tZ(?TXqY>s*;25NT z&d63~nY~v#CsY=UL{ECM*r1NF0h$B+B6H~u&{BunBv^`wxJ0Wp z7d)^;sa|UFX~bg3)BXFxD6dlRC+?7f=sE*lVzF4dUk0@%lp;;Nbg9y}o`v9@QoVx~ zet7#eanP}Qd<#hc1&?9RM-Gir;z17O;+rJ1*!Q{ij9-XRjXg&{dY?$ z6H=BAjvlnx+ZC}<+83YpN%KuQlv|F?I$hRPWrEhZ-Mv-Ru)JH%H9F`t*j-R*vX)d| zb*#)HjruBGKk)ty$~#R7{f(ZwM?3rup|%Tc!B2uu0!?r+7P&J*i8g=+73c(NYS|DC zZfldD>rSYX<}wwLUp>+;3kbI>|M5#9l{C9JrCC0tZeJHuQgLf&XXvAKS6FS{cJ<1O zH79URkBLq1aWJl@%N*YE)a&0YCZjwj5z9s!@18Sh_T!E!+B#v(yrQ`(#Cm8aBS&|s zJcX=o=-}Xhe2wj)yMtbEoAyOL13|P-=GceZ7-uU=%*_XSeQBH)#@8uZ!_LHDPMI!H zCViBw@5w|x|FQ6L_nYFC3)t6*k1{-ESAI42sXKYBtK%DRX}ABPtSiz|*gTWU{%&dQ zB+7IBWJX;z@{`R_Hvf!DQ z6s1^q|8k!BXYQMkqFGkbOmEY$uUl>FI}Cizo)PioZ0#MDf;wUaxZNXAk%VpqFyQ|+ zL_jlg!npHjAoMdr={VG<721E%#VzP;cf1AdA>|bdRq+;G?7lA=ZO zmuGolnWa_rP{YP5tLylNNZ#})?bV#joq$(gcxasD-lbaNW~VYg(BduWQ%{CT9bUe) zIFL_lSZ435X1RK%?BKo%ToNH8Bf}qs26|>rPHTICtM#CuBb28JkIlbBdks_^%o{|O z1MT!8v0L-J&_YC%;(#);A<0|ffp#4Em)iu|kryxye>mre^!9wTA{4k|HR)U=^ho(H z{IlQGJO}TRh1STQ z;)Z2ur^cD;yvTgrg4z!&&z{Sk#JZ0;0~*%FpuA3Z}_HWU0|Bq*6F`WD!6Lpns9Txm8Wm=V93TsFy=!w!{*&bYO~f-lMO zZ846=zTDS){yrr)T6^LNjOXsjJIaXM%$6OTMJ}GY6FFJ9ocuFMBB}He=I=F(>O?EK z4vX=*hhOJp%-${#EvgFav=Ygb>DsK$iCyoJdn&MD^_xBwHzreA7wgI}{AYVJS?hAQ z>PiHynF4kpme3lry(M!y{OD!#!c%gS$Cb2yF5nYW%U&Ulb>zCRwJ0mG-sD}1rBe|y zw_T`sy-?L0pK?G-&1NEuy}GR@$@%zi1uIoecSMGOlmCNrQ;E08Ov)4CDiJT-Xu@?v z;Z*P&+XZc@uU+fCQC8x(3cKqCp+}h(;7OHCHx<_AF zR3*63n_Krv6pf`*UBHrQEQa3rWI;e@u)~2q6x^;1nE0?_bWb2CG?w->80ZXErfkdR zUQcCFjeLsVmKb+_U#%O}{Y}uaao&VWg-YDiM3>adD`=-(Y)(W~syjS%+lRd}Q9+5b zAVl$=`F)}1S1-n5qj`Ld5|>2c`*4eAiCI;zS7}_1Gn3W`eG6FQN-7c{uHT~71hU=6zcgF zG_KCQ^A~w>4HX%=s!pB+N=)43F!fn+LZHdLoLo5@?x|(te2)5_QgTg((^`5rCbx~Z zH9X%{cT_4mzBuMvA(CrPFe1Hl!#w6`!JkZ{rpKs$<{)%UTY8?wLi3Xm$|3+FTJA4vL$j~f%QbN!m^9Qd(PwKXM3mXoOzB7g70^}gJZ`@Ln_ z3-l794LgVWn7^MT7OoI2khYwTYOY$ekSXILy=eot6KkLXi3gSQGmYFa)QZ+xKhd6O zHxfL(b@9Z{R?7~KVkZZ+;?cQ@7gl2UFqVH3S{yGhpnc15L}JQ?_GoXL+WhBo(t5S~ z5A*KHrQN)0K{dLOk%LlIo!I^=B_-X9ce{KkzB84Sp7IiRqD$Pgmf!DjdKlvthNL?w znWxo<%S*N%?i{?isr_?xFs@x>T>XKkrx;wH>^`Xh!3V`uDQN1vE@VpwcSdg@trE~a zAc%+5WRP1&aP@};xxs~86ha!Kkv@6ZuW!*YZCxD;3jtZK1GMTgI+}ku(izCx46dj1 zUfTIf6u)UhM}JGgFO2Q4?p2Zy#Y0}1ZzGeREX?tjlyvAdMfirlFXT!Trxm=hVbbBJ z53w(>BIwr9OyZ>I$x?V;RC%BD^()Dqp1Z~GTl#NExQ4KuvAF)ynXon>?+|-KQL537 z>_$sx9@!pORHy~0^B>*YeXkz2r4=5HsJ@% zgXDYU-gIP`ko1IfhmC1gJ}@s=4(u%MtckKG0@{vZ8qKK!Mn=^%O(R#!^}<#B4--xz zG{tdAhKJ(S+fyYeGIM6iWe>Rx3%WTyN2}g{*0)Y<0t1#pv42f4;Mu9Vi9y_K*K3Z) zvocmyaNnvYJy^nl^Ewfa^Rkw{+bkKkw6nA~^Wmtu z^(vJw--O17tSm?{ns&r7=PpM4zR@Ts5N*w;e=xv#N z>nG2QLLHkKukwuK8C)3mZ`@uYOLv!Z^_e*G`Z}%a*`;5DJHD!a=*mK{cGu8hV)vX= z)%`wb#`_Ncj78Xqu;9@)bV8Xzfe~&Mc{3^uGP+aqJU0XoG*xz&t@~_>1`L^V?0wb^*q3 z`|KNeMa%Q@| zJ6uMKZ*DTLT`|Tko>gFd0ql!EEy-be>fY5$H`ukbJKJg58@L^PN!U&P7O~cP)t+wb zS8Fjite(ABE*~SQtAAs%((RHG~I^Q4{V^gmXdyXsOotqqSsk1qFz1S?L zA83Ui2v%ie7rvt?3H>ebe(1n>PH+=4FUn$-Yu+6?N3x*zJ!$6L#}eJ&htKeV{Hv&t zPOpm*+%8VPRymjH|a)l3D=-wy$sq*Y1AieIS7_1XknOzUb7C`ndAV@X(Ys;3B?Ss zdJNvoaP_?hnP8#QmZ-F68*PcI{FTv1^j^1q#muvaoO;+8Giz?qViPY`O4Yy z(ZU=Ogz0`gk9@#`CHu8X|7r7&kA@%iC(6pbp-G)0@6555Z`@{-?4K+UBPd*ps{Q_} zlI~IZMTVPjH7)RJs{kLA(Eq#2T4tR6FldQIWJcJ-SXD=mbia=;FxkAmn?DJcs`=B2 z99RLGex`f6klJdrUDLdkW2KFQUt2voxyJqMs9mPQ>m&;-ql;JV&A=}vGo}u__$VJT z%WGpt-zjpkw#_m`4;DSVUjE>gA^O|Z$kja)yEcSxLZoMWe~q5hKTA7%Bvln}D{|0w z9i=pUI|gtna6H~jKWa1WPeUZXL7>~`hn z&J9*e6?R?y02Tk=py(ILP1H?3HL)ETK4CWGcAL0Gw50jXzw`pwIG_Aql5=JQJzeJe zLUpZ$B$=7KV=e=4bQh2xcR!K#%a#I%WsFR-GoULdRa-q|0nn6yznvD%EZC#Y_X)ukm_)mRI+^9uYg=-JszoF_V-K-iW%MFpEdIuY|W*&;|baI z1t|_28xoXfZMDq`+3N-CN|$O4(<<_y#9||rPRrgz{EKKsU!+wF@w(0V+BmD1kzPDq z+YiW1Q0RZ-ti##EzgEzSv~dF#Q!!4G>(GK&RC=DFp!MeTxrY1c)h1-46`=L+9Ulri zP!YvZRben8T|&(GC>5}da zNeStalo07gK|;E_L68=Z25AK8R6x4!JnuKYd+)gM2g5NO#@YMqz1CdwdFJo=irYW` zL#l%w6w3sM0vXfcZ;G|V7%PWNf$vZ&q>&~M>(_hBK3;X9L-FVOtAIy%#+N~&;!(fm z*Z@VeoO`$3ar1oCkbbTl8Zxg#KZi9 z$%Oh_npCRYKv${X4vK2kS=s z5vl+tU^bLrjPO}CRY6wf$V-)y1+mSG5+v*pzKTzgRmne^@bedL_sHQcNt%`f(b8?qm4!%{z{gH2^yj73Y zQr2W=FdH5|L`4Tbo03s);o<66skII1Gf-Shtd!_5FG~D_UeO?sbGq37K;Un?-s}6s zqR6cbU6BDzPpW-ot|{nK9YO+sNP53~tHx!^@ag#QCiordi2b8eT( zX*VrY@|KKAfK5*pl>7Lc_JYEX6;%`LYv~&3r zk9SS%9l4@UP4!H|O?kOO9n6&1!wgY(zV+4gN0HpK^y#tL44|{fAGA*x5FooVZ zloKPHT;7&Q5IEU8`L~I;Iwe-y<3NC{nq@L=;(0=P+j57mSu-qiy}>Uu!9iLF8!Sx0 zrEwMd#oM<-*zn#gIMY#fQ1>-NwwE)>CTOmhE@#onp%^xQ}tSvVZzALxt9K zE#UEhdU`)A4<-+~I6w>2q8(b-MJ9{EtQ z#F*V?qg40>spR5q>?OI0Zeri*y1#V&HodaG`lpq~PwC~g^bxsj?2*$!4m2r>6m!bS z{14ab(^{LGjCWpq;i!7bZ`+e@RVWaYq)#7ti?z<2hrfuSF3@X!`y53WdUpQb8V|o3 zpH{tCC1dRT*?UBgP-CT%81YzcTAb8TFe-jER`z1z8hl24a6Z)6D3&RAmtZX_j8&V+ zE}!qxny#jWGWGeNsS&ty%)Du(*5b1s(^?(1%&R!nIUv6nQD7i}3RKYR{TmP_>*ea>UQ8`9H)5EHn62 z-zeqElSP_ch~U5hsZcJ%$leG3Zu)WF&p8+g8%J zaF8ds#mA4e*Ui@9xmZt8P%Xw~V`BE%>nPdio1$czy{&Iz_?MW9ua{k|DPL*6lMn3+ zw2Q>WT83n5McaS>aW`<(>aP4`h{UbH%CQ&QST{sD`$}1%FB(kqNs~XJ46v(mVUa%_ zJ@p9wa(~FqO}}nrSu|v@qmMVk)~n&5_VrRIfug`Q9te863ipv$TGrHg+*Kl}tk1D+f>+)MvUrU-Tzh!dk3co3d z4-$iJe*2sEqC;!UKaTD+pl4inRm*wj_~Nl9R0d9QyUQx8S}3PGhDbKcA z_5+jB%2jl!^~QOkbs2*EqBltcP2hHV_^5FXI{E{}Rk{`QZTH`>812O}6>k5eQ^L4| z=}Jzr{PoR4yT4~0cM~0spYY!gyZwUEmEvbWlCW0$@HO4PO^U2HL+({W>asD?{DHT8 z6v!sk$LUzPu(oW3KR7FMg+vCwr?x$-a#68*FU{+>drG(d%DDBl=AQUNj1*`|GWM4( znsI-`*Nc=tIAnr1xsWtEiCGoL^uvL92 zG|w1AOZmS9-9r81C!)-y#bH7|fZ8OW_>7og)Fon=P~Z%Witpj1>e&lV%^2xfFFv;i zHAlp2>?Lb)4MoVUj{P~0cUxq7yVYH5qvA?b%r~~t1*an4qjqK@b7in?YKrvfNAZ;= z87^3J-CLQemEyI5=F3(t-3ac8^rIVrNmU<_TR9x^9loV|>-TKjD~cRFRx6|4^bKT| z+NPlBh&rp6=9P1@xyYnwaXk{Dtx%R_)F_s(wAZd_<)qaO*@%0?oL_7!L{-~*IX#s6 z5S=6t1+{A*cNT{s$F1&O!OR3E5pVRtUIq3U#ZP+M8zH9rR~te7Rf0q5Ig_6>P-Py; zaP{wld1*)mEg99|dq%0_Y=is7=`8y7S!>aKokg=zVvKOncX|pm+^E}Cy~V7)XWFhB%HPJ7(O>F!)C&4~w&XE{1~Wv$*4TV2 zS7fO2o&on4w~m5%N!JfrVx;{g%TX`NF6M)7`FMEn@c$;m=Dt}^=kHA>MLYi<0dT$& zS{3fJ8NLg$9uPESRMRU#Zr)VJm+Z$T`r&!T-}13FF}}u*c>kR7{o6#z5GjC|=0zdq79Vh>N!qcO; zEKfb$xmt%P#`8juzlOqfGWI4moH(s8GX13g)LNY!)c;zV>xp}70h~?z79`+=jroGt zax{zU$3oM;UFWAMPiy5y9fwCQWrxzFzI|ugM2$^MFdV3;xgGNYwl)--9$V*%rW$zg z-&Vh^-ivB8>vNm^a%fLn|u(Fb{`{U=Sk-00M|c5 z-xegMr%Nb=Sr+~}ZUy68wPyHRkq}6T!PXI2Utsm8;gJ&CAElWCr>US@p2qassG-R$ ze2?JCA9NLfMm4?_|645E3~N+%-6f><+RQ?>ft?}Ea(fRfxMtM~?uL;IVc|#BYz%7J zDQjapqdQo=tRA)GzAoYpEH4~b#A!{3OK3%{=5RzO@@%%^d|D=@znj8id;TvZrV@<0 za?mY;PRXuXe{(U^*H=q-hn;QppVb(B%itxU=8;_S@acuGZ`ItV^N0J3pg3PRPQo&J$SQx`o;O+-Ndu%D7~_Y!Jm@{bEG|r!Xix zuo#nyr0-G9#BF=RU!E~V?RP{&bqUS9makf`VZ*DmB(=6ynY)>*^E%gGMp9DddT|na zZ=@U{#DPY#`HNXW+kw~cMb8ld1K5Gr*a}R}wmel5#W;6Yoc>9O(nCiLbK9`5{5t2~ zAMzfqe_kRPCEmG3Dt%=dwijK|CdR&K_3LMHlizUCR`+mH?nl`b5Z19a6g`l4)JrJC z{W;B;bNV+0JG|v|0-*q;SSYwU#XY!SO|X!DWN! zn0BckTIom$c6m~tgk%eY$y~NUvIJM zO%BN&ZMqeC9H&ZTKlSnX`Q=KM=&P6_;y~Br(?!sula%$wy>`Y$&UT=mh8L!s{gqEE3%6N+$KY02 z`q^_E5hPAu1K>1QZ!)W@EXU{HgonW4Ahpli(LKyvLs9xSrx`{bh^R$Jrv!?>qkw2VUzIuFJG1T%-ZZ9W;hCk zzImu&RD`~TPfRvRL&E(b7^ObV#8y5ueBOO+62AA(+-9AqMK3X0|Hx-wsVZt_R}ymE5Td&R8^IZcIDl{YNSbZ?G7tit)qTQ}X~nJB^QH6&7EfIh6l*iT1@ z2JWM+(TAl_rpqx3hp4HhQxT2RZOp@hnexz_eXZ-{;d)ZGzu}QnPn(%@)D$N9XgauK za=)w}KCmKjX2u@N;uy&>dk%+06Jw{i#Mn36E7;mxnepwl^9nANh{_3t-3#Me z#a*1`@7{H1*}umzQDC7wgYAVZe>g2-79d|P&X^&a(; z=BQnFM0q3g76&!sP1KY*<*X_?7T8rsm(Zxh`TsH}*Wa0iC)xISHp^t0O{UAB*DZ{s z3Hv`cEw_x|OD~7T0x6tSd+-CPHs`#Cqq;FT@$RA0%GBa!Ivp@;nBOC6)Kh)adGPE5 z93HW>b>rAh8+^-nh53van*K}`sUCltjjdi)p%ux-idB^4`t6)4KD!y-ks9Ugzk7;z zYItdy#9gwr%uA75(2p2Cn~||?@9wMTEq!lH1WPpd+1YV++!^ldTdwzs<;DMwP)yt} zvuKfA(p(o<%P=M%O?2)qL%*NkBYST|=6R`<3piY<85pU!w`!t%kuEPw^W=#?rCV)* z-PBKn*Yvk%XczPAUS2klF(dn5Cc($dF-W6?M*I}PUzEptOXc}U&*UCPtg!9ypNp&O zzj3&rNw0va1ynuF^eUblTfH3mS4|+5@<|N81U~aKSw_7fG3c|LnN5!-ig`1MaTwvE zlMqR+>q=gxueYpDL|tNBiFk+dZf~SAGQYmKJwv+edHqeH&P02ZK5(NMpOKV#88_;C z#7Van@%y@Umb;6^S#IX*#)8T7ZqNtQ%~#L-;@q7>OGsKf9p5d8#VAFYB7|JEH<+cy(@p5&n0k)V50f_=BRk zUYqQQxEHYuM*M7%%XoW!3^v`apZ0(7Ab~6#A=ZOs3U_pdEjIBD+x?f1dm1be|#kMuV3pY*f)aNslR zq7scY(uIc&)=04a^U|&tBx;ox2h%Zcb6}-jb^qJlSaU{`WhB!y=D%Kq{$=>`7i1C= zbP0Geuv1VtP^E`{^AqpvEV+U&kkX12+DbjCh{E|^~y*L($SduTq@ zD!*{x3MsWVC3`3~$q>ug2OAt4kos%ohQ~*qVTlEZGX;!ty~`Eh7;af#NcIe)WZDAj z-%>yyl&;XxUrPB?q}5!R2#uQe{$|ip@VGp>b7yGYJ8$9gU-T}&O>~>9fQ=MLugV0r zvvl+D&uhdZ)_2QlE2_`7K`No9GsZF!;{i0QYV)%QUvfPAjqHVG=XF>E-& zVUf#^amb^d;|x^_+Ti&kX5fg^ch-c;JPk<&(W#P0*TOB?Yq!E0yxveReqMd*i7yQ4bSxjMxD1TBbabV zNGg<&I)2>w;QY?t=25{X8Q4zjmVVk@ttjZMG?c#I_SAJ&Gv50xo96z?SSZB#T$zTL zr?Oc-GF5sSS~gw#k7Un!4Xp1IQ;Ybf;AS3v0*uB(eP=ub^8sjQ>j#=^g>UHXJ2Nt+iels%o#n;yzJAKG-tnk&mkGNt>h`z~@5Xs`kM%SOr8sfb}?lioIcef&faZ2Uvr zxu(R`?KU-MW8q|yw#}&brk}1~x3Msi)Z9n3d;blmkJq9SbS~e-MVgtBsU(Jp!Vn2M zXi+c<={u%Ea+0@zijv|=LlbD}%d_B4gCIL02ogw$ZvvruBW`%>)$SY8-5Uf~9562& zz`aBQD)iqBq#hvc#1Z)VVKx?Gg}v>(H{LOKtWPYFg+{!chh*Wg|Iw z*%Omet-Dk3E*{ohSj;JX^!<%3p_|hk?L$Yd@zTV*q0kk1>>G66;)vfN$7yxi{Qj*O zQUb(lBQUcd1~SN;emo(azX59K3P5^SfsyePU?Ot>$3V~>5C%YfxA|wSzhHRZ1IR*$ z!YR3PGu1pWUHbtuavSfLq+>5bPJY2qxtF{kSc*W3$>cUx*0wh0_Zeo1sjMK!={d5m z>Z19nNrLmlNA0=TMFKQ4!YOj_M3Kc%QD?NNcX2sfz$OcW2TFT~wfCOSh6?l?{S^pm z31Ty%^xWjKCYx~Dzf-kN;H&!*9hn)6ox zXXsFA`sNpKG$}mHC~7`n?o0a>ytf-N;6GVfN?PCleIW-;ruDYh#g(4mP!>QU?dE}2vp$f5fCiww z@7Mt>3<99ykCHMZJf^XJGw0Me<2KUA3!B%zV(T^j+CUAXx43Go71V}dUCi5v_M%zQ zwsr;ghXeq;T6u?EPMFuPZQE;-fu#HkNNI6!-IW z(NK9+-<`;K73d6GZQQKtCLD(J32w>9xz=474? z^k3PLdEKLsQwYQh<;;~RV8I5Jg4Sj&iJ7R89?y!ZF$4%osfY&>0XsopUclITh@fR4 zU>3sH`%&^j7O-DM9K1#XO240b^J4X+iek+WfQ;+A-Fu*`T6<1%heNSl#L5+BZmYs{oO9J+*sYY|L_{tOA2ex*52QC z@|7-c=B#SFa=|h&4zQe3Y$U@biSLqce0Z1W=VQ@7mBXHQ-U~cR@P4Ai_D* zuAA+Evyt+Fx7Z12pGf84k&ct5MR0vifiLrGr3+z9{(p@2>ZT!$x#)xOd2cDt;FP%^b&l)}Op?ai=Qw1enPFA%7QM&+sNKFC8$&z>rd4BbpU{Q} zI_rgi*dz?@Bah*b)mZFhl^&nWeg63mIh8Y-HYdFfHUWD*3EC+iUtaitbwUTkP7g1# zeh5FeBw8}sZh3b-`hZ>6s%I!fjSNTjz=o<8xy>jVfVBsR+MwtRurP=$AxKjAwc-T8 z$E>j2xjTL;@`~&@L85`8UnFO-IxLU60!p`2{x#cv+C3LZ2yT6Nld1e`~vv$}jOId%u|wzNDe` zXV_$)f(K#4nYMLjcb#szo3r2DI$N5Vb7doU_Mq&_yyAVB!-$Kc>IELKXdQJ0&Wi=Ml)N5jvs;3CRua-0)d z*RiaC8tCj#%Xl^S1ZLc8US;lrj=y?*m`dCWPsLp4HyLtbQ(<>l%+#`Z9ESQHJ zA$*C=26YXhutYFAVQ)ap#4SS+M;{}-QdFM`l)Qi2lTpANK;ba!BS1{{xI%e%Ia-TY z#1QZ{Im3I-1UZ+=JrM&fR-wzDa|gqpFNeT?VwvTQ5Kynn$v>W5)_n{fjJd!xmi`sV zn)R8~{~1=nJtlEoPr!U3&?D|Za|h_if#gY9S(!!KyE`g2U&ymr-@mMl9!NAYBQy7H zh(*Yeqv}C&w$Po1JyQkYJpe1-o1={Csq*+$BYqzass2GC^gCC5`6J~Y+70RR3APh$ zt$hqXrtIgK73I%N_suP3RE%uDo4cCJ)e{bh9ND}+$o}WlV=q`U{lGQ3%1i#8F6CKx zJk$bM_WK`R5v#RWJ-m+Geyr8c`YP^GEbeUL|Jx08h*qD(qOHO)bBur0SrDb3nsKY&39Gx&_QL21Z8YMPSF8 z11%7+ks(0baROed5fLgt+}jg<17E0O*Q=WC9q4m$=UazM(k|7mC;8uReJZkex8wz@Wom|qgj=r_qL?G|ntZ3Bq6PKP^*y^KfiJ{A5!+_uJ=8O{Z3z3!8#o&MQwW@ zO(so45zvf!u7&Olt*?~wigP){dX|t3@o1-~!573JBn-T%oj7S1HfRb_q zz|O3Pxs4&=yI``&Tsm&DEtcoI-2U{&-FooA>(&~aF|bKy(@|Wv6<>yKRHwk7s}Ky$ z5@|P%vmbtBB#R_%qnC$HE3>&Cx#SUAy_-?7R2fsk%Br36-F_&}$E7wc2ak=MBhxCO&_)3P#%POEOd|w~7bs^b1G;xt0>qwgjHNB_m9) zlcRbkmOCikXTj?_e&VIjw6>FuijJeYOE6Ds{_n6q_s?u4@B*r^|Huy{=ZqImH@jv& z(k8b&xj$cf&}56|Q8t?^?_HK!^RH^-5(f26XRMAmH`&+9sA4J^Bi{3FhNSZChO5r* zb2wwo?%%sj0IEGTRorN%Qc7YwAvAemkd$^5dr4__KuIRscHz>L7}^f;3D$9EyC9yg z=DoKW!ba(z*{Kmfj8}nGA~XMXOlR(<+JCKnFiW#l=#rD1QdKb;3j?Tvv0eK_g&)0ox3 zTYSPS22)lRS$1J8vt5S-U0ovDLJZv6@XY(evogA+S}Q#ExN_4l=-f2;Cgs^(MMfYg zMEtt6spA%A%z26pHWkbKF>f;nn(D72Z#5FjZhJoCAb5SW!_#~??bz4zKW1%5B-z8i(D-Qlfgq2!$zpDQrw5LnH-z3=pciL*8= zk3d$0!w4qYYkG}ZHyZio^&8+)9Bq1_1KP%QG>}|*zL3NWA~MK&m*=NXY$?PKDp#{# z#T*YsK;~Yi3p{`<5686Jd`cCkFZT!C3JMP~bc>7o7Cl051TL^BeVdqCf5G&PBQ$vU zucWKDJ)!-i^zD0H4ei2pe=*z&8gRr=o88B(-b?m@evqB_%2TLnk%CJRjefGqo)^K# z>{f??^O;KBuFCEJ2vMDUF*b}OA7Ib$VtD-U>HCg0g@>rPx}OxzuwqAtbS3*7?a7kd zx$3oH#XDR@dO2gQ)bu$X=JoS`NaBlzDD+kWXo!YD&#hyBg%smJB>VGu{J>n7I?`u8 zv)gdHBu31Sg>^%hnSLu*joodAt7L`w^yZd|%L1&g`@JgHS35jl^RuuDgr#uEzv*ap z=K{0B7)+Pa=HI8-O4rvJ!vkNw?7$(inl@5lu#~2xpNXIQv z(+{Ky+`!^mQDQ3lb)9jTOO(@-IdFq|G%>)q`m*t&qfFEB*O(y+>|xLID4#i2IWm7p zl+kWjeUA)-v4V0mw*!zd8!Yg3{Y)pfGHrS~Dh1!It);H~I{T3xQQcooLC`bf(+L_% zZb3~wdNkxJvN9(LGpz6P5SluzB|LHMF(5Fz2!?0u)~V`FT`qBM;x0b=#_b$F=+j}q z4JZg7`yCozR1`aR5l<=3=Y09X$Kl5yzW8ekSw?8~>yN?Y6yogfXN8MN1WSl+xZVR7 zWdL3Y)M!_E2`KLGJ!D3jvT*)Y`&tLNl`BU%`Ypr=i?1)$8(g>7aK|jo4_)~f|Ixqn z`9e!7oqW|Lixh8Clx*;)F;t7TUcE*esDkQ!mHPq{nV<6_w;g(Xg&&(eM~KqnX#C$B zDpMJAq_fFk7239R8bB zBa;V@durUW=Sr!uQ@yxX0om#e@fdQ!SK5-t(Ip>#H*fm(HChpq0{yVRUO1j12 zqn1vn=xZAhzKe&Ja%VLgf;pWjO7raXgG#pGX?=ItTa>C z;bS>wWthT?mLUD;ZQ$YI*(_C05W%mr4#R0i(6?fnK>MrS*Sf?UH`|fxPFqoZsieIb{q@=fo=e^Z9b0xla z>t2sFq)G8DE0N&zzNDoRPl_Gnbx(V5WpjG`cS*Aa#vh9A-N78Z>SasOM{X?Yn?itt zqDC2lOP9=OKr({ntZTrRemNj5A_F_&2*noY{nENNM}grK}NY zf79W(E{2ECu?dm_|7+US`B%D`9<$J&5byB!not$IF%;GskEII+UK1Lvi%8_Q-NBuM z%4b$!J8a|P8oV6I=eGMK95kjHs?`}E=8m`tHa+QyV3b0be~>OMZ+7`68fIMuUW)bC zF~-z7kO#e|CgZwyR~}X(SHR2Bkzm72Q{SCt+)O#J&;gE&#P0g%-=Gu1!(WqYDA%EZ z!3}@Kx83{Fy=l>^x_-XAC8Mv@J^e4#mU5s7#V87IHJ-4>d+*+)>c`-h^8`>%4Ju0S z?r+XbAnkBu#OuFzvuU3Q?xMwKyxTD>lOq^vf-I0TJj@Vz_phEr-+y>_SmYhUjFHIz zKYOR5pnY#72v&R84u@;Z#|*qKcbO=>9M~3dh{ziLM6*tJ+D0zBf6Sfx6H<}_s|eB1 zVbwKh3a+$@?EZWuEz(8A-t13#l*^H2qi@mozQW5aDtpF5mbjXUG&X#;$Slk=TCYt0 zl&>US6dC%8xuq~sU%L#`#~*_uVbVd~^lv;h1saU8VZP8GJ(gqKCJ|8u$dYs6v>GT? z3-K!B<2g{MRLOh>yVcXQYji)5`c``GV$a6P&(XsJwACSFAUqzY_4K$ui_v4UIE@5;fIs@84ZR!PETbdu^>x4q3@ zD#f{*5udI}9nJbdFTGks1Z*vY+)psca{yuFZ@e*{XLHL6%&ZKNCH>xNWO1f5@Kp7? z2r^l-swBz-qV74V3}ctKqOUxl1ANQs)hw-1WEtZ{nN-6{(&j4Mo-~Borr;x|H`Sy2 zfwgAFtUG$05fFFr)6#IMR_ zjV_ehL?Skc5U6vK9ZBs4gN!XJ!*y(qR&0j5c+)8F{EFYaXb>Rc$FfVGmWCSGa!W;0 z4Q|(m_|@`SJ_+>_3H{Mq-`RZuJQCHqA7}GNDD%pk22{92?|G00Fumt<0M2Htt3kG~ zDAAB>1)E+b3L^3fAxc1U1cd1U_qkIt{SZ!sRUrD|p$8Fh+Ymi9|6y4@WLr1i4MA4W z8AhCMafD7Yc1c^Y_LCm#LI)1!Yk(~?VBl6(`0_v7zI~^V7)*^+)1@>HR92xp!jHeN z%YTOI_9SsN<4yaUua(>bni!L}I7(9sxnN}%z@J(XUqrYL6gX{F!8R&qCY{X*R2mV9 zbQtM4le0!5npKdgC7+~8a1D{Vnv-nv^Upow5nH^OoQhYFzgHnahmR&1MKJ&$^JnJO zLsp&6mEO4L8yNuzr3;ZFf#@GWwvwn%I#8ho;5HAwlA@ zoyzUY`JtpNKasEP|Mm!N4{PbhxO1((b1A~&a~rh$#s%s)2XHBU4E||J51^wn9_!g7 z)?Aj9Z;d5%W7y#OrQ27!K5~&4Go#c*H&xOM8GHi?36LmI&~@<(PR$4iJA`Q<`$2x# z2Sk`>ie2Le$T7HO56Yq=BC8(ckhOGRfDPFLi~eBt*LCgguTG6Y2f^3)#Ln`w8#_1a z7QRF6t2LeN^sT2KSgfqEpdYA@GkJ(1!f=PdcTtSTxt&UN&#jYNWDs3H#MeZ%WDgV6 z6AEt^A*5Hq-LuX5usWbexIaBZg=hE#r$MVi{2zCq#65AliNOT6tjX1H}g=y4Um+attw! zNB+Y%SvkQAf@AB;ZmQ-O+9CLFVb=JbUpjdU&Ac2n>;}4mlZVpTHpSs#rQ3n;=qse7 zN8Ll9mhyCq8fnsvhf{vTFTB~?pJK*g;cPz=aQ?d5dW>ksHC_l0-Uz(5pGA#zL{p`q zQf1nJy6$mCJT>@|-bq&VcPADXFVA+V6E$|9DzDxds=;&B7ZuPAtO)nj*So>>8OqUv%e>2p1)NJ*poY`lY> z$rrzHSH#_bDp%VI!HX9G!VBy^+VeH>$c6d!vx*c0_g>hdIYUvcC zZ{L7BECw6Gq9=vR2TZ$T)W<{|;B-zVGa7a&;c%};>!JbZ(%ApOlG#R;1L^6%)E2k% zPcg8|eyZi+yKin=GGI-4h4jszW|>8|GJk$HH$JmAH#A3%yM$;s_aMISZh+&2j8g!a zd`*@y`ed+N$+L(Z;fU-~;-d2DDNiH&ci1(M?7x*>9nL1G z0N;$|b}?zQy?)X}a&R622@sr#XNM*c69oaNBvi#2l=h=sAwejeS@J_Fw(kCA(TL|f ztgpYnAU~gBN<&#$#KGZ7jP≥B#j6diV9Gu%jc0K8VE#A^eq?LCO&(IbS>wwl!)- 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 H@rd{*q)^HV literal 0 HcmV?d00001 diff --git a/mkdocs.yml b/mkdocs.yml index 7af22abe2..9c8c97695 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -49,6 +49,7 @@ nav: - rl-algorithms/ppo-rnd.md - rl-algorithms/rpo.md - rl-algorithms/qdagger.md + - rl-algorithms/ppo-trxl.md - Advanced: - advanced/hyperparameter-tuning.md - advanced/resume-training.md diff --git a/requirements/requirements-memory_gym.txt b/requirements/requirements-memory_gym.txt new file mode 100644 index 000000000..a2c5ac374 --- /dev/null +++ b/requirements/requirements-memory_gym.txt @@ -0,0 +1,85 @@ +absl-py==2.1.0 ; python_version >= "3.8" and python_version < "3.11" +appdirs==1.4.4 ; python_version >= "3.8" and python_version < "3.11" +arch==7.0.0 ; python_version >= "3.8" and python_version < "3.11" +cachetools==5.5.0 ; python_version >= "3.8" and python_version < "3.11" +certifi==2024.8.30 ; python_version >= "3.8" and python_version < "3.11" +charset-normalizer==3.3.2 ; python_version >= "3.8" and python_version < "3.11" +click==8.1.7 ; python_version >= "3.8" and python_version < "3.11" +cloudpickle==3.0.0 ; python_version >= "3.8" and python_version < "3.11" +colorama==0.4.6 ; python_version >= "3.8" and python_version < "3.11" +contourpy==1.3.0 ; python_version >= "3.8" and python_version < "3.11" +cycler==0.12.1 ; python_version >= "3.8" and python_version < "3.11" +decorator==4.4.2 ; python_version >= "3.8" and python_version < "3.11" +docker-pycreds==0.4.0 ; python_version >= "3.8" and python_version < "3.11" +docstring_parser==0.16 ; python_version >= "3.8" and python_version < "3.11" +einops==0.7.0 ; python_version >= "3.8" and python_version < "3.11" +Farama-Notifications==0.0.4 ; python_version >= "3.8" and python_version < "3.11" +filelock==3.13.1 ; python_version >= "3.8" and python_version < "3.11" +fonttools==4.53.1 ; python_version >= "3.8" and python_version < "3.11" +fsspec==2024.2.0 ; python_version >= "3.8" and python_version < "3.11" +gitdb==4.0.11 ; python_version >= "3.8" and python_version < "3.11" +GitPython==3.1.43 ; python_version >= "3.8" and python_version < "3.11" +google-auth==2.34.0 ; python_version >= "3.8" and python_version < "3.11" +google-auth-oauthlib==1.2.1 ; python_version >= "3.8" and python_version < "3.11" +grpcio==1.66.1 ; python_version >= "3.8" and python_version < "3.11" +gymnasium==0.29.0 ; python_version >= "3.8" and python_version < "3.11" +huggingface-hub==0.24.6 ; python_version >= "3.8" and python_version < "3.11" +idna==3.10 ; python_version >= "3.8" and python_version < "3.11" +imageio==2.35.1 ; python_version >= "3.8" and python_version < "3.11" +imageio-ffmpeg==0.5.1 ; python_version >= "3.8" and python_version < "3.11" +Jinja2==3.1.3 ; python_version >= "3.8" and python_version < "3.11" +kiwisolver==1.4.7 ; python_version >= "3.8" and python_version < "3.11" +Markdown==3.7 ; python_version >= "3.8" and python_version < "3.11" +markdown-it-py==3.0.0 ; python_version >= "3.8" and python_version < "3.11" +MarkupSafe==2.1.5 ; python_version >= "3.8" and python_version < "3.11" +matplotlib==3.9.2 ; python_version >= "3.8" and python_version < "3.11" +mdurl==0.1.2 ; python_version >= "3.8" and python_version < "3.11" +memory-gym==1.0.2 ; python_version >= "3.8" and python_version < "3.11" +minigrid==2.3.1 ; python_version >= "3.8" and python_version < "3.11" +moviepy==1.0.3 ; python_version >= "3.8" and python_version < "3.11" +mpmath==1.3.0 ; python_version >= "3.8" and python_version < "3.11" +networkx==3.2.1 ; python_version >= "3.8" and python_version < "3.11" +numpy==1.26.3 ; python_version >= "3.8" and python_version < "3.11" +oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "3.11" +packaging==24.1 ; python_version >= "3.8" and python_version < "3.11" +pandas==2.2.2 ; python_version >= "3.8" and python_version < "3.11" +pathtools==0.1.2 ; python_version >= "3.8" and python_version < "3.11" +patsy==0.5.6 ; python_version >= "3.8" and python_version < "3.11" +pillow==10.2.0 ; python_version >= "3.8" and python_version < "3.11" +proglog==0.1.10 ; python_version >= "3.8" and python_version < "3.11" +protobuf==4.23.4 ; python_version >= "3.8" and python_version < "3.11" +psutil==6.0.0 ; python_version >= "3.8" and python_version < "3.11" +pyasn1==0.6.1 ; python_version >= "3.8" and python_version < "3.11" +pyasn1_modules==0.4.1 ; python_version >= "3.8" and python_version < "3.11" +pygame==2.4.0 ; python_version >= "3.8" and python_version < "3.11" +Pygments==2.18.0 ; python_version >= "3.8" and python_version < "3.11" +pyparsing==3.1.4 ; python_version >= "3.8" and python_version < "3.11" +python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "3.11" +pytz==2024.2 ; python_version >= "3.8" and python_version < "3.11" +PyYAML==6.0.2 ; python_version >= "3.8" and python_version < "3.11" +requests==2.32.3 ; python_version >= "3.8" and python_version < "3.11" +requests-oauthlib==2.0.0 ; python_version >= "3.8" and python_version < "3.11" +rich==13.8.1 ; python_version >= "3.8" and python_version < "3.11" +rliable==1.2.0 ; python_version >= "3.8" and python_version < "3.11" +rsa==4.9 ; python_version >= "3.8" and python_version < "3.11" +scipy==1.14.1 ; python_version >= "3.8" and python_version < "3.11" +seaborn==0.13.2 ; python_version >= "3.8" and python_version < "3.11" +sentry-sdk==2.14.0 ; python_version >= "3.8" and python_version < "3.11" +setproctitle==1.3.3 ; python_version >= "3.8" and python_version < "3.11" +shtab==1.7.1 ; python_version >= "3.8" and python_version < "3.11" +six==1.16.0 ; python_version >= "3.8" and python_version < "3.11" +smmap==5.0.1 ; python_version >= "3.8" and python_version < "3.11" +statsmodels==0.14.3 ; python_version >= "3.8" and python_version < "3.11" +sympy==1.12 ; python_version >= "3.8" and python_version < "3.11" +tensorboard==2.15.1 ; python_version >= "3.8" and python_version < "3.11" +tensorboard-data-server==0.7.2 ; python_version >= "3.8" and python_version < "3.11" +torch==2.4.1+cu118 ; python_version >= "3.8" and python_version < "3.11" +torchaudio==2.4.1+cu118 ; python_version >= "3.8" and python_version < "3.11" +torchvision==0.19.1+cu118 ; python_version >= "3.8" and python_version < "3.11" +tqdm==4.66.5 ; python_version >= "3.8" and python_version < "3.11" +typing_extensions==4.9.0 ; python_version >= "3.8" and python_version < "3.11" +tyro==0.5.18 ; python_version >= "3.8" and python_version < "3.11" +tzdata==2024.1 ; python_version >= "3.8" and python_version < "3.11" +urllib3==2.2.3 ; python_version >= "3.8" and python_version < "3.11" +wandb==0.13.11 ; python_version >= "3.8" and python_version < "3.11" +Werkzeug==3.0.4 ; python_version >= "3.8" and python_version < "3.11" From 9125613187da00eb813f3ad6e1c72f34239c1cc8 Mon Sep 17 00:00:00 2001 From: Marco Pleines Date: Thu, 19 Sep 2024 06:10:27 +0200 Subject: [PATCH 2/4] fixed ppo-trxl links (#483) --- README.md | 2 +- docs/rl-algorithms/ppo-trxl.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2a69b2543..c9cd05b46 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ You may also use a prebuilt development environment hosted in Gitpod: | | [`ppo_atari_multigpu.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/ppo_atari_multigpu.py), [docs](https://docs.cleanrl.dev/rl-algorithms/ppo/#ppo_atari_multigpupy) | | [`ppo_pettingzoo_ma_atari.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/ppo_pettingzoo_ma_atari.py), [docs](https://docs.cleanrl.dev/rl-algorithms/ppo/#ppo_pettingzoo_ma_ataripy) | | [`ppo_continuous_action_isaacgym.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/ppo_continuous_action_isaacgym/ppo_continuous_action_isaacgym.py), [docs](https://docs.cleanrl.dev/rl-algorithms/ppo/#ppo_continuous_action_isaacgympy) -| | [`ppo_trxl.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/ppo_trxl/ppo_trxl.py), [docs](https://docs.cleanrl.dev/rl-algorithms/ppo_trxl/) +| | [`ppo_trxl.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/ppo_trxl/ppo_trxl.py), [docs](https://docs.cleanrl.dev/rl-algorithms/ppo-trxl/) | ✅ [Deep Q-Learning (DQN)](https://web.stanford.edu/class/psych209/Readings/MnihEtAlHassibis15NatureControlDeepRL.pdf) | [`dqn.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/dqn.py), [docs](https://docs.cleanrl.dev/rl-algorithms/dqn/#dqnpy) | | | [`dqn_atari.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/dqn_atari.py), [docs](https://docs.cleanrl.dev/rl-algorithms/dqn/#dqn_ataripy) | | | [`dqn_jax.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/dqn_jax.py), [docs](https://docs.cleanrl.dev/rl-algorithms/dqn/#dqn_jaxpy) | diff --git a/docs/rl-algorithms/ppo-trxl.md b/docs/rl-algorithms/ppo-trxl.md index dee80a556..acefbcd69 100644 --- a/docs/rl-algorithms/ppo-trxl.md +++ b/docs/rl-algorithms/ppo-trxl.md @@ -163,7 +163,7 @@ poetry run python ppo_trxl.py \ ### Enjoy pre-trained models -Use [`cleanrl/ppo_trxl/enjoy.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/ppo_trxl/en.py) to watch pre-trained agents. +Use [`cleanrl/ppo_trxl/enjoy.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/ppo_trxl/enjoy.py) to watch pre-trained agents. You can retrieve pre-trained models from [huggingface](https://huggingface.co/LilHairdy/cleanrl_memory_gym). Note that Memory Gym environments are usually rendered using the `debug_rgb_array` render mode, which shows ground truth information about the current task that the agent cannot observe. From 38c313f8326b5049fe941a873e798485bccf18e5 Mon Sep 17 00:00:00 2001 From: Costa Huang Date: Tue, 24 Sep 2024 12:16:16 -0400 Subject: [PATCH 3/4] Add LeanRL as a related project (#484) * Update README.md * Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c9cd05b46..88bec5ba0 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,11 @@ CleanRL is a Deep Reinforcement Learning library that provides high-quality sing You can read more about CleanRL in our [JMLR paper](https://www.jmlr.org/papers/volume23/21-1342/21-1342.pdf) and [documentation](https://docs.cleanrl.dev/). -CleanRL only contains implementations of **online** deep reinforcement learning algorithms. If you are looking for **offline** algorithms, please check out [corl-team/CORL](https://github.com/corl-team/CORL), which shares a similar design philosophy as CleanRL. +Notable CleanRL-related projects: + +* [corl-team/CORL](https://github.com/corl-team/CORL): Offline RL algorithm implemented in CleanRL style +* [pytorch-labs/LeanRL](https://github.com/pytorch-labs/LeanRL): Fast optimized PyTorch implementation of CleanRL RL algorithms using CUDAGraphs. + > ℹ️ **Support for Gymnasium**: [Farama-Foundation/Gymnasium](https://github.com/Farama-Foundation/Gymnasium) is the next generation of [`openai/gym`](https://github.com/openai/gym) that will continue to be maintained and introduce new features. Please see their [announcement](https://farama.org/Announcing-The-Farama-Foundation) for further detail. We are migrating to `gymnasium` and the progress can be tracked in [vwxyzjn/cleanrl#277](https://github.com/vwxyzjn/cleanrl/pull/277). From e648ee2dc8960c59ed3ee6caf9eb0c34b497958f Mon Sep 17 00:00:00 2001 From: Roger Creus <31919499+roger-creus@users.noreply.github.com> Date: Thu, 14 Nov 2024 10:32:57 -0500 Subject: [PATCH 4/4] Add Parallel Q-Networks algorithm (PQN) (#472) --- benchmark/pqn.sh | 32 +++ benchmark/pqn_plot.sh | 50 ++++ cleanrl/pqn.py | 247 ++++++++++++++++++++ cleanrl/pqn_atari_envpool.py | 290 +++++++++++++++++++++++ cleanrl/pqn_atari_envpool_lstm.py | 338 +++++++++++++++++++++++++++ docs/rl-algorithms/pqn.md | 297 +++++++++++++++++++++++ docs/rl-algorithms/pqn/pqn.png | Bin 0 -> 137314 bytes docs/rl-algorithms/pqn/pqn_lstm.png | Bin 0 -> 126701 bytes docs/rl-algorithms/pqn/pqn_state.png | Bin 0 -> 61105 bytes mkdocs.yml | 1 + 10 files changed, 1255 insertions(+) create mode 100644 benchmark/pqn.sh create mode 100644 benchmark/pqn_plot.sh create mode 100644 cleanrl/pqn.py create mode 100644 cleanrl/pqn_atari_envpool.py create mode 100644 cleanrl/pqn_atari_envpool_lstm.py create mode 100644 docs/rl-algorithms/pqn.md create mode 100644 docs/rl-algorithms/pqn/pqn.png create mode 100644 docs/rl-algorithms/pqn/pqn_lstm.png create mode 100644 docs/rl-algorithms/pqn/pqn_state.png diff --git a/benchmark/pqn.sh b/benchmark/pqn.sh new file mode 100644 index 000000000..1aed60bf4 --- /dev/null +++ b/benchmark/pqn.sh @@ -0,0 +1,32 @@ +poetry install +OMP_NUM_THREADS=1 xvfb-run -a poetry run python -m cleanrl_utils.benchmark \ + --env-ids CartPole-v1 Acrobot-v1 MountainCar-v0 \ + --command "poetry run python cleanrl/pqn.py --no_cuda --track" \ + --num-seeds 3 \ + --workers 9 \ + --slurm-gpus-per-task 1 \ + --slurm-ntasks 1 \ + --slurm-total-cpus 10 \ + --slurm-template-path benchmark/cleanrl_1gpu.slurm_template + +poetry install -E envpool +poetry run python -m cleanrl_utils.benchmark \ + --env-ids Breakout-v5 SpaceInvaders-v5 BeamRider-v5 Pong-v5 MsPacman-v5 \ + --command "poetry run python cleanrl/pqn_atari_envpool.py --track" \ + --num-seeds 3 \ + --workers 9 \ + --slurm-gpus-per-task 1 \ + --slurm-ntasks 1 \ + --slurm-total-cpus 10 \ + --slurm-template-path benchmark/cleanrl_1gpu.slurm_template + +poetry install -E envpool +poetry run python -m cleanrl_utils.benchmark \ + --env-ids Breakout-v5 SpaceInvaders-v5 BeamRider-v5 Pong-v5 MsPacman-v5 \ + --command "poetry run python cleanrl/pqn_atari_envpool_lstm.py --track" \ + --num-seeds 3 \ + --workers 9 \ + --slurm-gpus-per-task 1 \ + --slurm-ntasks 1 \ + --slurm-total-cpus 10 \ + --slurm-template-path benchmark/cleanrl_1gpu.slurm_template \ No newline at end of file diff --git a/benchmark/pqn_plot.sh b/benchmark/pqn_plot.sh new file mode 100644 index 000000000..1c9237d22 --- /dev/null +++ b/benchmark/pqn_plot.sh @@ -0,0 +1,50 @@ + +python -m openrlbenchmark.rlops \ + --filters '?we=rogercreus&wpn=cleanRL&ceik=env_id&cen=exp_name&metric=charts/episodic_return' \ + 'pqn?tag=pr-472&cl=CleanRL PQN' \ + --env-ids CartPole-v1 Acrobot-v1 MountainCar-v0 \ + --no-check-empty-runs \ + --pc.ncols 3 \ + --pc.ncols-legend 2 \ + --output-filename benchmark/cleanrl/pqn \ + --scan-history + +python -m openrlbenchmark.rlops \ + --filters '?we=rogercreus&wpn=cleanRL&ceik=env_id&cen=exp_name&metric=charts/episodic_return' \ + 'pqn_atari_envpool?tag=pr-472&cl=CleanRL PQN' \ + --env-ids Breakout-v5 SpaceInvaders-v5 BeamRider-v5 Pong-v5 MsPacman-v5 \ + --no-check-empty-runs \ + --pc.ncols 3 \ + --pc.ncols-legend 3 \ + --rliable \ + --rc.score_normalization_method maxmin \ + --rc.normalized_score_threshold 1.0 \ + --rc.sample_efficiency_plots \ + --rc.sample_efficiency_and_walltime_efficiency_method Median \ + --rc.performance_profile_plots \ + --rc.aggregate_metrics_plots \ + --rc.sample_efficiency_num_bootstrap_reps 10 \ + --rc.performance_profile_num_bootstrap_reps 10 \ + --rc.interval_estimates_num_bootstrap_reps 10 \ + --output-filename static/0compare \ + --scan-history + +python -m openrlbenchmark.rlops \ + --filters '?we=rogercreus&wpn=cleanRL&ceik=env_id&cen=exp_name&metric=charts/episodic_return' \ + 'pqn_atari_envpool_lstm?tag=pr-472&cl=CleanRL PQN' \ + --env-ids Breakout-v5 SpaceInvaders-v5 BeamRider-v5 MsPacman-v5 \ + --no-check-empty-runs \ + --pc.ncols 3 \ + --pc.ncols-legend 3 \ + --rliable \ + --rc.score_normalization_method maxmin \ + --rc.normalized_score_threshold 1.0 \ + --rc.sample_efficiency_plots \ + --rc.sample_efficiency_and_walltime_efficiency_method Median \ + --rc.performance_profile_plots \ + --rc.aggregate_metrics_plots \ + --rc.sample_efficiency_num_bootstrap_reps 10 \ + --rc.performance_profile_num_bootstrap_reps 10 \ + --rc.interval_estimates_num_bootstrap_reps 10 \ + --output-filename static/0compare \ + --scan-history \ No newline at end of file diff --git a/cleanrl/pqn.py b/cleanrl/pqn.py new file mode 100644 index 000000000..6ed6e205d --- /dev/null +++ b/cleanrl/pqn.py @@ -0,0 +1,247 @@ +# docs and experiment results can be found at https://docs.cleanrl.dev/rl-algorithms/pqn/#pqnpy +import os +import random +import time +from dataclasses import dataclass + +import gymnasium as gym +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +import tyro +from torch.utils.tensorboard import SummaryWriter + + +@dataclass +class Args: + exp_name: str = os.path.basename(__file__)[: -len(".py")] + """the name of this experiment""" + seed: int = 1 + """seed of the experiment""" + torch_deterministic: bool = True + """if toggled, `torch.backends.cudnn.deterministic=False`""" + cuda: bool = True + """if toggled, cuda will be enabled by default""" + track: bool = False + """if toggled, this experiment will be tracked with Weights and Biases""" + wandb_project_name: str = "cleanRL" + """the wandb's project name""" + wandb_entity: str = None + """the entity (team) of wandb's project""" + capture_video: bool = False + """whether to capture videos of the agent performances (check out `videos` folder)""" + + # Algorithm specific arguments + env_id: str = "CartPole-v1" + """the id of the environment""" + total_timesteps: int = 500000 + """total timesteps of the experiments""" + learning_rate: float = 2.5e-4 + """the learning rate of the optimizer""" + num_envs: int = 4 + """the number of parallel game environments""" + num_steps: int = 128 + """the number of steps to run for each environment per update""" + num_minibatches: int = 4 + """the number of mini-batches""" + update_epochs: int = 4 + """the K epochs to update the policy""" + anneal_lr: bool = True + """Toggle learning rate annealing""" + gamma: float = 0.99 + """the discount factor gamma""" + start_e: float = 1 + """the starting epsilon for exploration""" + end_e: float = 0.05 + """the ending epsilon for exploration""" + exploration_fraction: float = 0.5 + """the fraction of `total_timesteps` it takes from start_e to end_e""" + max_grad_norm: float = 10.0 + """the maximum norm for the gradient clipping""" + q_lambda: float = 0.65 + """the lambda for Q(lambda)""" + + +def make_env(env_id, seed, idx, capture_video, run_name): + def thunk(): + if capture_video and idx == 0: + env = gym.make(env_id, render_mode="rgb_array") + env = gym.wrappers.RecordVideo(env, f"videos/{run_name}") + else: + env = gym.make(env_id) + env = gym.wrappers.RecordEpisodeStatistics(env) + env.action_space.seed(seed) + + return env + + return thunk + + +def layer_init(layer, std=np.sqrt(2), bias_const=0.0): + torch.nn.init.orthogonal_(layer.weight, std) + torch.nn.init.constant_(layer.bias, bias_const) + return layer + + +# ALGO LOGIC: initialize agent here: +class QNetwork(nn.Module): + def __init__(self, env): + super().__init__() + + self.network = nn.Sequential( + layer_init(nn.Linear(np.array(env.single_observation_space.shape).prod(), 120)), + nn.LayerNorm(120), + nn.ReLU(), + layer_init(nn.Linear(120, 84)), + nn.LayerNorm(84), + nn.ReLU(), + layer_init(nn.Linear(84, env.single_action_space.n)), + ) + + def forward(self, x): + return self.network(x) + + +def linear_schedule(start_e: float, end_e: float, duration: int, t: int): + slope = (end_e - start_e) / duration + return max(slope * t + start_e, end_e) + + +if __name__ == "__main__": + args = tyro.cli(Args) + args.batch_size = int(args.num_envs * args.num_steps) + args.minibatch_size = int(args.batch_size // args.num_minibatches) + args.num_iterations = args.total_timesteps // args.batch_size + run_name = f"{args.env_id}__{args.exp_name}__{args.seed}__{int(time.time())}" + if args.track: + import wandb + + wandb.init( + project=args.wandb_project_name, + entity=args.wandb_entity, + sync_tensorboard=True, + config=vars(args), + name=run_name, + monitor_gym=True, + save_code=True, + ) + writer = SummaryWriter(f"runs/{run_name}") + writer.add_text( + "hyperparameters", + "|param|value|\n|-|-|\n%s" % ("\n".join([f"|{key}|{value}|" for key, value in vars(args).items()])), + ) + + # TRY NOT TO MODIFY: seeding + random.seed(args.seed) + np.random.seed(args.seed) + torch.manual_seed(args.seed) + torch.backends.cudnn.deterministic = args.torch_deterministic + + device = torch.device("cuda" if torch.cuda.is_available() and args.cuda else "cpu") + + # env setup + envs = gym.vector.SyncVectorEnv( + [make_env(args.env_id, args.seed + i, i, args.capture_video, run_name) for i in range(args.num_envs)] + ) + assert isinstance(envs.single_action_space, gym.spaces.Discrete), "only discrete action space is supported" + + # agent setup + q_network = QNetwork(envs).to(device) + optimizer = optim.RAdam(q_network.parameters(), lr=args.learning_rate) + + # storage setup + obs = torch.zeros((args.num_steps, args.num_envs) + envs.single_observation_space.shape).to(device) + actions = torch.zeros((args.num_steps, args.num_envs) + envs.single_action_space.shape).to(device) + rewards = torch.zeros((args.num_steps, args.num_envs)).to(device) + dones = torch.zeros((args.num_steps, args.num_envs)).to(device) + values = torch.zeros((args.num_steps, args.num_envs)).to(device) + + # TRY NOT TO MODIFY: start the game + global_step = 0 + start_time = time.time() + next_obs, _ = envs.reset(seed=args.seed) + next_obs = torch.Tensor(next_obs).to(device) + next_done = torch.zeros(args.num_envs).to(device) + + for iteration in range(1, args.num_iterations + 1): + # Annealing the rate if instructed to do so. + if args.anneal_lr: + frac = 1.0 - (iteration - 1.0) / args.num_iterations + lrnow = frac * args.learning_rate + optimizer.param_groups[0]["lr"] = lrnow + + for step in range(0, args.num_steps): + global_step += args.num_envs + obs[step] = next_obs + dones[step] = next_done + + epsilon = linear_schedule(args.start_e, args.end_e, args.exploration_fraction * args.total_timesteps, global_step) + random_actions = torch.randint(0, envs.single_action_space.n, (args.num_envs,)).to(device) + with torch.no_grad(): + q_values = q_network(next_obs) + max_actions = torch.argmax(q_values, dim=1) + values[step] = q_values[torch.arange(args.num_envs), max_actions].flatten() + + explore = torch.rand((args.num_envs,)).to(device) < epsilon + action = torch.where(explore, random_actions, max_actions) + actions[step] = action + + # TRY NOT TO MODIFY: execute the game and log data. + next_obs, reward, terminations, truncations, infos = envs.step(action.cpu().numpy()) + next_done = np.logical_or(terminations, truncations) + rewards[step] = torch.tensor(reward).to(device).view(-1) + next_obs, next_done = torch.Tensor(next_obs).to(device), torch.Tensor(next_done).to(device) + + if "final_info" in infos: + for info in infos["final_info"]: + if info and "episode" in info: + print(f"global_step={global_step}, episodic_return={info['episode']['r']}") + writer.add_scalar("charts/episodic_return", info["episode"]["r"], global_step) + writer.add_scalar("charts/episodic_length", info["episode"]["l"], global_step) + + # Compute Q(lambda) targets + with torch.no_grad(): + returns = torch.zeros_like(rewards).to(device) + for t in reversed(range(args.num_steps)): + if t == args.num_steps - 1: + next_value, _ = torch.max(q_network(next_obs), dim=-1) + nextnonterminal = 1.0 - next_done + returns[t] = rewards[t] + args.gamma * next_value * nextnonterminal + else: + nextnonterminal = 1.0 - dones[t + 1] + next_value = values[t + 1] + returns[t] = rewards[t] + args.gamma * ( + args.q_lambda * returns[t + 1] + (1 - args.q_lambda) * next_value * nextnonterminal + ) + + # flatten the batch + b_obs = obs.reshape((-1,) + envs.single_observation_space.shape) + b_actions = actions.reshape((-1,) + envs.single_action_space.shape) + b_returns = returns.reshape(-1) + + # Optimizing the Q-network + b_inds = np.arange(args.batch_size) + for epoch in range(args.update_epochs): + np.random.shuffle(b_inds) + for start in range(0, args.batch_size, args.minibatch_size): + end = start + args.minibatch_size + mb_inds = b_inds[start:end] + + old_val = q_network(b_obs[mb_inds]).gather(1, b_actions[mb_inds].unsqueeze(-1).long()).squeeze() + loss = F.mse_loss(b_returns[mb_inds], old_val) + + # optimize the model + optimizer.zero_grad() + loss.backward() + nn.utils.clip_grad_norm_(q_network.parameters(), args.max_grad_norm) + optimizer.step() + + writer.add_scalar("losses/td_loss", loss, global_step) + writer.add_scalar("losses/q_values", old_val.mean().item(), global_step) + print("SPS:", int(global_step / (time.time() - start_time))) + writer.add_scalar("charts/SPS", int(global_step / (time.time() - start_time)), global_step) + + envs.close() + writer.close() diff --git a/cleanrl/pqn_atari_envpool.py b/cleanrl/pqn_atari_envpool.py new file mode 100644 index 000000000..45fd5a4cf --- /dev/null +++ b/cleanrl/pqn_atari_envpool.py @@ -0,0 +1,290 @@ +# docs and experiment results can be found at https://docs.cleanrl.dev/rl-algorithms/pqn/#pqn_atari_envpoolpy +import os +import random +import time +from collections import deque +from dataclasses import dataclass + +import envpool +import gym +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +import tyro +from torch.utils.tensorboard import SummaryWriter + + +@dataclass +class Args: + exp_name: str = os.path.basename(__file__)[: -len(".py")] + """the name of this experiment""" + seed: int = 1 + """seed of the experiment""" + torch_deterministic: bool = True + """if toggled, `torch.backends.cudnn.deterministic=False`""" + cuda: bool = True + """if toggled, cuda will be enabled by default""" + track: bool = False + """if toggled, this experiment will be tracked with Weights and Biases""" + wandb_project_name: str = "cleanRL" + """the wandb's project name""" + wandb_entity: str = None + """the entity (team) of wandb's project""" + capture_video: bool = False + """whether to capture videos of the agent performances (check out `videos` folder)""" + + # Algorithm specific arguments + env_id: str = "Breakout-v5" + """the id of the environment""" + total_timesteps: int = 10000000 + """total timesteps of the experiments""" + learning_rate: float = 2.5e-4 + """the learning rate of the optimizer""" + num_envs: int = 8 + """the number of parallel game environments""" + num_steps: int = 128 + """the number of steps to run in each environment per policy rollout""" + anneal_lr: bool = True + """Toggle learning rate annealing for policy and value networks""" + gamma: float = 0.99 + """the discount factor gamma""" + num_minibatches: int = 4 + """the number of mini-batches""" + update_epochs: int = 4 + """the K epochs to update the policy""" + max_grad_norm: float = 10.0 + """the maximum norm for the gradient clipping""" + start_e: float = 1 + """the starting epsilon for exploration""" + end_e: float = 0.01 + """the ending epsilon for exploration""" + exploration_fraction: float = 0.10 + """the fraction of `total_timesteps` it takes from start_e to end_e""" + q_lambda: float = 0.65 + """the lambda for the Q-Learning algorithm""" + + # to be filled in runtime + batch_size: int = 0 + """the batch size (computed in runtime)""" + minibatch_size: int = 0 + """the mini-batch size (computed in runtime)""" + num_iterations: int = 0 + """the number of iterations (computed in runtime)""" + + +class RecordEpisodeStatistics(gym.Wrapper): + def __init__(self, env, deque_size=100): + super().__init__(env) + self.num_envs = getattr(env, "num_envs", 1) + self.episode_returns = None + self.episode_lengths = None + + def reset(self, **kwargs): + observations = super().reset(**kwargs) + self.episode_returns = np.zeros(self.num_envs, dtype=np.float32) + self.episode_lengths = np.zeros(self.num_envs, dtype=np.int32) + self.lives = np.zeros(self.num_envs, dtype=np.int32) + self.returned_episode_returns = np.zeros(self.num_envs, dtype=np.float32) + self.returned_episode_lengths = np.zeros(self.num_envs, dtype=np.int32) + return observations + + def step(self, action): + observations, rewards, dones, infos = super().step(action) + self.episode_returns += infos["reward"] + self.episode_lengths += 1 + self.returned_episode_returns[:] = self.episode_returns + self.returned_episode_lengths[:] = self.episode_lengths + self.episode_returns *= 1 - infos["terminated"] + self.episode_lengths *= 1 - infos["terminated"] + infos["r"] = self.returned_episode_returns + infos["l"] = self.returned_episode_lengths + return ( + observations, + rewards, + dones, + infos, + ) + + +def layer_init(layer, std=np.sqrt(2), bias_const=0.0): + torch.nn.init.orthogonal_(layer.weight, std) + torch.nn.init.constant_(layer.bias, bias_const) + return layer + + +class QNetwork(nn.Module): + def __init__(self, env): + super().__init__() + self.network = nn.Sequential( + layer_init(nn.Conv2d(4, 32, 8, stride=4)), + nn.LayerNorm([32, 20, 20]), + nn.ReLU(), + layer_init(nn.Conv2d(32, 64, 4, stride=2)), + nn.LayerNorm([64, 9, 9]), + nn.ReLU(), + layer_init(nn.Conv2d(64, 64, 3, stride=1)), + nn.LayerNorm([64, 7, 7]), + nn.ReLU(), + nn.Flatten(), + layer_init(nn.Linear(3136, 512)), + nn.LayerNorm(512), + nn.ReLU(), + layer_init(nn.Linear(512, env.single_action_space.n)), + ) + + def forward(self, x): + return self.network(x / 255.0) + + +def linear_schedule(start_e: float, end_e: float, duration: int, t: int): + slope = (end_e - start_e) / duration + return max(slope * t + start_e, end_e) + + +if __name__ == "__main__": + args = tyro.cli(Args) + args.batch_size = int(args.num_envs * args.num_steps) + args.minibatch_size = int(args.batch_size // args.num_minibatches) + args.num_iterations = args.total_timesteps // args.batch_size + run_name = f"{args.env_id}__{args.exp_name}__{args.seed}__{int(time.time())}" + if args.track: + import wandb + + wandb.init( + project=args.wandb_project_name, + entity=args.wandb_entity, + sync_tensorboard=True, + config=vars(args), + name=run_name, + monitor_gym=True, + save_code=True, + ) + writer = SummaryWriter(f"runs/{run_name}") + writer.add_text( + "hyperparameters", + "|param|value|\n|-|-|\n%s" % ("\n".join([f"|{key}|{value}|" for key, value in vars(args).items()])), + ) + + # TRY NOT TO MODIFY: seeding + random.seed(args.seed) + np.random.seed(args.seed) + torch.manual_seed(args.seed) + torch.backends.cudnn.deterministic = args.torch_deterministic + + device = torch.device("cuda" if torch.cuda.is_available() and args.cuda else "cpu") + + # env setup + envs = envpool.make( + args.env_id, + env_type="gym", + num_envs=args.num_envs, + episodic_life=True, + reward_clip=True, + seed=args.seed, + ) + envs.num_envs = args.num_envs + envs.single_action_space = envs.action_space + envs.single_observation_space = envs.observation_space + envs = RecordEpisodeStatistics(envs) + assert isinstance(envs.action_space, gym.spaces.Discrete), "only discrete action space is supported" + + q_network = QNetwork(envs).to(device) + optimizer = optim.RAdam(q_network.parameters(), lr=args.learning_rate) + + # ALGO Logic: Storage setup + obs = torch.zeros((args.num_steps, args.num_envs) + envs.single_observation_space.shape).to(device) + actions = torch.zeros((args.num_steps, args.num_envs) + envs.single_action_space.shape).to(device) + rewards = torch.zeros((args.num_steps, args.num_envs)).to(device) + dones = torch.zeros((args.num_steps, args.num_envs)).to(device) + values = torch.zeros((args.num_steps, args.num_envs)).to(device) + avg_returns = deque(maxlen=20) + + # TRY NOT TO MODIFY: start the game + global_step = 0 + start_time = time.time() + next_obs = torch.Tensor(envs.reset()).to(device) + next_done = torch.zeros(args.num_envs).to(device) + + for iteration in range(1, args.num_iterations + 1): + # Annealing the rate if instructed to do so. + if args.anneal_lr: + frac = 1.0 - (iteration - 1.0) / args.num_iterations + lrnow = frac * args.learning_rate + optimizer.param_groups[0]["lr"] = lrnow + + for step in range(0, args.num_steps): + global_step += args.num_envs + obs[step] = next_obs + dones[step] = next_done + + epsilon = linear_schedule(args.start_e, args.end_e, args.exploration_fraction * args.total_timesteps, global_step) + + random_actions = torch.randint(0, envs.single_action_space.n, (args.num_envs,)).to(device) + with torch.no_grad(): + q_values = q_network(next_obs) + max_actions = torch.argmax(q_values, dim=1) + values[step] = q_values[torch.arange(args.num_envs), max_actions].flatten() + + explore = torch.rand((args.num_envs,)).to(device) < epsilon + action = torch.where(explore, random_actions, max_actions) + actions[step] = action + + # TRY NOT TO MODIFY: execute the game and log data. + next_obs, reward, next_done, info = envs.step(action.cpu().numpy()) + rewards[step] = torch.tensor(reward).to(device).view(-1) + next_obs, next_done = torch.Tensor(next_obs).to(device), torch.Tensor(next_done).to(device) + + for idx, d in enumerate(next_done): + if d and info["lives"][idx] == 0: + print(f"global_step={global_step}, episodic_return={info['r'][idx]}") + avg_returns.append(info["r"][idx]) + writer.add_scalar("charts/avg_episodic_return", np.average(avg_returns), global_step) + writer.add_scalar("charts/episodic_return", info["r"][idx], global_step) + writer.add_scalar("charts/episodic_length", info["l"][idx], global_step) + + # Compute Q(lambda) targets + with torch.no_grad(): + returns = torch.zeros_like(rewards).to(device) + for t in reversed(range(args.num_steps)): + if t == args.num_steps - 1: + next_value, _ = torch.max(q_network(next_obs), dim=-1) + nextnonterminal = 1.0 - next_done + returns[t] = rewards[t] + args.gamma * next_value * nextnonterminal + else: + nextnonterminal = 1.0 - dones[t + 1] + next_value = values[t + 1] + returns[t] = rewards[t] + args.gamma * ( + args.q_lambda * returns[t + 1] + (1 - args.q_lambda) * next_value * nextnonterminal + ) + + # flatten the batch + b_obs = obs.reshape((-1,) + envs.single_observation_space.shape) + b_actions = actions.reshape((-1,) + envs.single_action_space.shape) + b_returns = returns.reshape(-1) + + # Optimizing the Q-network + b_inds = np.arange(args.batch_size) + for epoch in range(args.update_epochs): + np.random.shuffle(b_inds) + for start in range(0, args.batch_size, args.minibatch_size): + end = start + args.minibatch_size + mb_inds = b_inds[start:end] + + old_val = q_network(b_obs[mb_inds]).gather(1, b_actions[mb_inds].unsqueeze(-1).long()).squeeze() + loss = F.mse_loss(b_returns[mb_inds], old_val) + + # optimize the model + optimizer.zero_grad() + loss.backward() + nn.utils.clip_grad_norm_(q_network.parameters(), args.max_grad_norm) + optimizer.step() + + writer.add_scalar("losses/td_loss", loss, global_step) + writer.add_scalar("losses/q_values", old_val.mean().item(), global_step) + print("SPS:", int(global_step / (time.time() - start_time))) + writer.add_scalar("charts/SPS", int(global_step / (time.time() - start_time)), global_step) + + envs.close() + writer.close() diff --git a/cleanrl/pqn_atari_envpool_lstm.py b/cleanrl/pqn_atari_envpool_lstm.py new file mode 100644 index 000000000..6b348b0af --- /dev/null +++ b/cleanrl/pqn_atari_envpool_lstm.py @@ -0,0 +1,338 @@ +# docs and experiment results can be found at https://docs.cleanrl.dev/rl-algorithms/pqn/#pqn_atari_envpool_lstmpy +import os +import random +import time +from collections import deque +from dataclasses import dataclass + +import envpool +import gym +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +import tyro +from torch.utils.tensorboard import SummaryWriter + + +@dataclass +class Args: + exp_name: str = os.path.basename(__file__)[: -len(".py")] + """the name of this experiment""" + seed: int = 1 + """seed of the experiment""" + torch_deterministic: bool = True + """if toggled, `torch.backends.cudnn.deterministic=False`""" + cuda: bool = True + """if toggled, cuda will be enabled by default""" + track: bool = False + """if toggled, this experiment will be tracked with Weights and Biases""" + wandb_project_name: str = "cleanRL" + """the wandb's project name""" + wandb_entity: str = None + """the entity (team) of wandb's project""" + capture_video: bool = False + """whether to capture videos of the agent performances (check out `videos` folder)""" + + # Algorithm specific arguments + env_id: str = "Breakout-v5" + """the id of the environment""" + total_timesteps: int = 10000000 + """total timesteps of the experiments""" + learning_rate: float = 2.5e-4 + """the learning rate of the optimizer""" + num_envs: int = 8 + """the number of parallel game environments""" + num_steps: int = 128 + """the number of steps to run in each environment per policy rollout""" + anneal_lr: bool = True + """Toggle learning rate annealing for policy and value networks""" + gamma: float = 0.99 + """the discount factor gamma""" + num_minibatches: int = 4 + """the number of mini-batches""" + update_epochs: int = 4 + """the K epochs to update the policy""" + max_grad_norm: float = 0.5 + """the maximum norm for the gradient clipping""" + start_e: float = 1 + """the starting epsilon for exploration""" + end_e: float = 0.01 + """the ending epsilon for exploration""" + exploration_fraction: float = 0.10 + """the fraction of `total_timesteps` it takes from start_e to end_e""" + q_lambda: float = 0.65 + """the lambda for the Q-Learning algorithm""" + + # to be filled in runtime + batch_size: int = 0 + """the batch size (computed in runtime)""" + minibatch_size: int = 0 + """the mini-batch size (computed in runtime)""" + num_iterations: int = 0 + """the number of iterations (computed in runtime)""" + + +class RecordEpisodeStatistics(gym.Wrapper): + def __init__(self, env, deque_size=100): + super().__init__(env) + self.num_envs = getattr(env, "num_envs", 1) + self.episode_returns = None + self.episode_lengths = None + + def reset(self, **kwargs): + observations = super().reset(**kwargs) + self.episode_returns = np.zeros(self.num_envs, dtype=np.float32) + self.episode_lengths = np.zeros(self.num_envs, dtype=np.int32) + self.lives = np.zeros(self.num_envs, dtype=np.int32) + self.returned_episode_returns = np.zeros(self.num_envs, dtype=np.float32) + self.returned_episode_lengths = np.zeros(self.num_envs, dtype=np.int32) + return observations + + def step(self, action): + observations, rewards, dones, infos = super().step(action) + self.episode_returns += infos["reward"] + self.episode_lengths += 1 + self.returned_episode_returns[:] = self.episode_returns + self.returned_episode_lengths[:] = self.episode_lengths + self.episode_returns *= 1 - infos["terminated"] + self.episode_lengths *= 1 - infos["terminated"] + infos["r"] = self.returned_episode_returns + infos["l"] = self.returned_episode_lengths + return ( + observations, + rewards, + dones, + infos, + ) + + +def layer_init(layer, std=np.sqrt(2), bias_const=0.0): + torch.nn.init.orthogonal_(layer.weight, std) + torch.nn.init.constant_(layer.bias, bias_const) + return layer + + +class QNetwork(nn.Module): + def __init__(self, env): + super().__init__() + self.network = nn.Sequential( + layer_init(nn.Conv2d(1, 32, 8, stride=4)), + nn.LayerNorm([32, 20, 20]), + nn.ReLU(), + layer_init(nn.Conv2d(32, 64, 4, stride=2)), + nn.LayerNorm([64, 9, 9]), + nn.ReLU(), + layer_init(nn.Conv2d(64, 64, 3, stride=1)), + nn.LayerNorm([64, 7, 7]), + nn.ReLU(), + nn.Flatten(), + layer_init(nn.Linear(3136, 512)), + nn.LayerNorm(512), + nn.ReLU(), + ) + self.lstm = nn.LSTM(512, 128) + for name, param in self.lstm.named_parameters(): + if "bias" in name: + nn.init.constant_(param, 0) + elif "weight" in name: + nn.init.orthogonal_(param, 1.0) + self.q_func = layer_init(nn.Linear(128, env.single_action_space.n)) + + def get_states(self, x, lstm_state, done): + hidden = self.network(x / 255.0) + + # LSTM logic + batch_size = lstm_state[0].shape[1] + hidden = hidden.reshape((-1, batch_size, self.lstm.input_size)) + done = done.reshape((-1, batch_size)) + new_hidden = [] + for h, d in zip(hidden, done): + h, lstm_state = self.lstm( + h.unsqueeze(0), + ( + (1.0 - d).view(1, -1, 1) * lstm_state[0], + (1.0 - d).view(1, -1, 1) * lstm_state[1], + ), + ) + new_hidden += [h] + new_hidden = torch.flatten(torch.cat(new_hidden), 0, 1) + return new_hidden, lstm_state + + def forward(self, x, lstm_state, done): + hidden, lstm_state = self.get_states(x, lstm_state, done) + return self.q_func(hidden), lstm_state + + +def linear_schedule(start_e: float, end_e: float, duration: int, t: int): + slope = (end_e - start_e) / duration + return max(slope * t + start_e, end_e) + + +if __name__ == "__main__": + args = tyro.cli(Args) + args.batch_size = int(args.num_envs * args.num_steps) + args.minibatch_size = int(args.batch_size // args.num_minibatches) + args.num_iterations = args.total_timesteps // args.batch_size + run_name = f"{args.env_id}__{args.exp_name}__{args.seed}__{int(time.time())}" + if args.track: + import wandb + + wandb.init( + project=args.wandb_project_name, + entity=args.wandb_entity, + sync_tensorboard=True, + config=vars(args), + name=run_name, + monitor_gym=True, + save_code=True, + ) + writer = SummaryWriter(f"runs/{run_name}") + writer.add_text( + "hyperparameters", + "|param|value|\n|-|-|\n%s" % ("\n".join([f"|{key}|{value}|" for key, value in vars(args).items()])), + ) + + # TRY NOT TO MODIFY: seeding + random.seed(args.seed) + np.random.seed(args.seed) + torch.manual_seed(args.seed) + torch.backends.cudnn.deterministic = args.torch_deterministic + + device = torch.device("cuda" if torch.cuda.is_available() and args.cuda else "cpu") + + # env setup + envs = envpool.make( + args.env_id, + env_type="gym", + num_envs=args.num_envs, + episodic_life=True, + reward_clip=True, + seed=args.seed, + stack_num=1, + ) + envs.num_envs = args.num_envs + envs.single_action_space = envs.action_space + envs.single_observation_space = envs.observation_space + envs = RecordEpisodeStatistics(envs) + assert isinstance(envs.action_space, gym.spaces.Discrete), "only discrete action space is supported" + + q_network = QNetwork(envs).to(device) + optimizer = optim.RAdam(q_network.parameters(), lr=args.learning_rate) + + # ALGO Logic: Storage setup + obs = torch.zeros((args.num_steps, args.num_envs) + envs.single_observation_space.shape).to(device) + actions = torch.zeros((args.num_steps, args.num_envs) + envs.single_action_space.shape).to(device) + rewards = torch.zeros((args.num_steps, args.num_envs)).to(device) + dones = torch.zeros((args.num_steps, args.num_envs)).to(device) + values = torch.zeros((args.num_steps, args.num_envs)).to(device) + avg_returns = deque(maxlen=20) + + # TRY NOT TO MODIFY: start the game + global_step = 0 + start_time = time.time() + next_obs = torch.Tensor(envs.reset()).to(device) + next_done = torch.zeros(args.num_envs).to(device) + + next_lstm_state = ( + torch.zeros(q_network.lstm.num_layers, args.num_envs, q_network.lstm.hidden_size).to(device), + torch.zeros(q_network.lstm.num_layers, args.num_envs, q_network.lstm.hidden_size).to(device), + ) # hidden and cell states (see https://youtu.be/8HyCNIVRbSU) + + for iteration in range(1, args.num_iterations + 1): + initial_lstm_state = (next_lstm_state[0].clone(), next_lstm_state[1].clone()) + + # Annealing the rate if instructed to do so. + if args.anneal_lr: + frac = 1.0 - (iteration - 1.0) / args.num_iterations + lrnow = frac * args.learning_rate + optimizer.param_groups[0]["lr"] = lrnow + + for step in range(0, args.num_steps): + global_step += args.num_envs + obs[step] = next_obs + dones[step] = next_done + + epsilon = linear_schedule(args.start_e, args.end_e, args.exploration_fraction * args.total_timesteps, global_step) + + random_actions = torch.randint(0, envs.single_action_space.n, (args.num_envs,)).to(device) + with torch.no_grad(): + q_values, next_lstm_state = q_network(next_obs, next_lstm_state, next_done) + max_actions = torch.argmax(q_values, dim=1) + values[step] = q_values[torch.arange(args.num_envs), max_actions].flatten() + + explore = torch.rand((args.num_envs,)).to(device) < epsilon + action = torch.where(explore, random_actions, max_actions) + actions[step] = action + + # TRY NOT TO MODIFY: execute the game and log data. + next_obs, reward, next_done, info = envs.step(action.cpu().numpy()) + rewards[step] = torch.tensor(reward).to(device).view(-1) + next_obs, next_done = torch.Tensor(next_obs).to(device), torch.Tensor(next_done).to(device) + + for idx, d in enumerate(next_done): + if d and info["lives"][idx] == 0: + print(f"global_step={global_step}, episodic_return={info['r'][idx]}") + avg_returns.append(info["r"][idx]) + writer.add_scalar("charts/avg_episodic_return", np.average(avg_returns), global_step) + writer.add_scalar("charts/episodic_return", info["r"][idx], global_step) + writer.add_scalar("charts/episodic_length", info["l"][idx], global_step) + + # Compute Q(lambda) targets + with torch.no_grad(): + returns = torch.zeros_like(rewards).to(device) + for t in reversed(range(args.num_steps)): + if t == args.num_steps - 1: + next_value, _ = torch.max(q_network(next_obs, next_lstm_state, next_done)[0], dim=-1) + nextnonterminal = 1.0 - next_done + returns[t] = rewards[t] + args.gamma * next_value * nextnonterminal + else: + nextnonterminal = 1.0 - dones[t + 1] + next_value = values[t + 1] + returns[t] = rewards[t] + args.gamma * ( + args.q_lambda * returns[t + 1] + (1 - args.q_lambda) * next_value * nextnonterminal + ) + + # flatten the batch + b_obs = obs.reshape((-1,) + envs.single_observation_space.shape) + b_actions = actions.reshape((-1,) + envs.single_action_space.shape) + b_returns = returns.reshape(-1) + b_dones = dones.reshape(-1) + + assert args.num_envs % args.num_minibatches == 0 + envsperbatch = args.num_envs // args.num_minibatches + envinds = np.arange(args.num_envs) + flatinds = np.arange(args.batch_size).reshape(args.num_steps, args.num_envs) + + # Optimizing the Q-network + b_inds = np.arange(args.batch_size) + for epoch in range(args.update_epochs): + np.random.shuffle(envinds) + for start in range(0, args.num_envs, envsperbatch): + end = start + envsperbatch + mbenvinds = envinds[start:end] + mb_inds = flatinds[:, mbenvinds].ravel() # be really careful about the index + + old_val, _ = q_network( + b_obs[mb_inds], + (initial_lstm_state[0][:, mbenvinds], initial_lstm_state[1][:, mbenvinds]), + b_dones[mb_inds], + ) + old_val = old_val.gather(1, b_actions[mb_inds].unsqueeze(-1).long()).squeeze() + + loss = F.mse_loss(b_returns[mb_inds], old_val) + + # optimize the model + optimizer.zero_grad() + loss.backward() + nn.utils.clip_grad_norm_(q_network.parameters(), args.max_grad_norm) + optimizer.step() + + writer.add_scalar("losses/td_loss", loss, global_step) + writer.add_scalar("losses/q_values", old_val.mean().item(), global_step) + print("SPS:", int(global_step / (time.time() - start_time))) + writer.add_scalar("charts/SPS", int(global_step / (time.time() - start_time)), global_step) + + envs.close() + writer.close() diff --git a/docs/rl-algorithms/pqn.md b/docs/rl-algorithms/pqn.md new file mode 100644 index 000000000..c6c86e76b --- /dev/null +++ b/docs/rl-algorithms/pqn.md @@ -0,0 +1,297 @@ +# Parallel Q Network (PQN) + + +## Overview + +PQN is a parallelized version of the Deep Q-learning algorithm. It is designed to be more efficient than DQN by using multiple agents to interact with the environment in parallel. PQN can be thought of as DQN (1) without replay buffer and target networks, and (2) with layer normalizations and parallel environments. + +Original paper: + +* [Simplifying Deep Temporal Difference Learning](https://arxiv.org/html/2407.04811v2) + +Reference resources: + +* :material-github: [purejaxql](https://github.com/mttga/purejaxql) + +## Implemented Variants + + +| Variants Implemented | Description | +| ----------- | ----------- | +| :material-github: [`pqn.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/pqn.py), :material-file-document: [docs](/rl-algorithms/pqn/#pqnpy) | For classic control tasks like `CartPole-v1`. | +| :material-github: [`pqn_atari_envpool.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/pqn_atari_envpool.py), :material-file-document: [docs](/rl-algorithms/pqn/#pqn_atari_envpoolpy) | For Atari games. Uses the blazing fast Envpool Atari vectorized environment. It uses convolutional layers and common atari-based pre-processing techniques. | +| :material-github: [`pqn_atari_envpool_lstm.py`](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/pqn_atari_envpool_lstm.py), :material-file-document: [docs](/rl-algorithms/pqn/#pqn_atari_envpool_lstmpy) | For Atari games. Uses the blazing fast Envpool Atari vectorized environment. Using LSTM without stacked frames. | + +Below are our single-file implementations of PQN: + +## `pqn.py` + +The [pqn.py](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/pqn.py) has the following features: + +* Works with the `Box` observation space of low-level features +* Works with the `Discrete` action space +* Works with envs like `CartPole-v1` + +### Usage + +=== "poetry" + + ```bash + poetry install + poetry run python cleanrl/pqn.py --help + poetry run python cleanrl/pqn.py --env-id CartPole-v1 + ``` + +=== "pip" + + ```bash + python cleanrl/pqn.py --help + python cleanrl/pqn.py --env-id CartPole-v1 + ``` + +### Explanation of the logged metrics + +Running `python cleanrl/pqn.py` will automatically record various metrics such as actor or value losses in Tensorboard. Below is the documentation for these metrics: + +* `charts/episodic_return`: episodic return of the game +* `charts/episodic_length`: episodic length of the game +* `charts/SPS`: number of steps per second +* `charts/learning_rate`: the current learning rate +* `losses/td_loss`: the mean squared error (MSE) between the Q values at timestep $t$ and the Bellman update target estimated using the $Q(\lambda)$ returns. +* `losses/q_values`: it is the average Q values of the sampled data in the replay buffer; useful when gauging if under or over estimation happens. + +### Implementation details + +1. Vectorized architecture (:material-github: [common/cmd_util.py#L22](https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/common/cmd_util.py#L22)) +2. Orthogonal Initialization of Weights and Constant Initialization of biases (:material-github: [a2c/utils.py#L58)](https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/a2c/utils.py#L58)) +3. Normalized Q Network (:material-github: [purejaxql/pqn_atari.py#L200](https://github.com/mttga/purejaxql/blob/2205ae5308134d2cedccd749074bff2871832dc8/purejaxql/pqn_atari.py#L200)) +4. Uses the RAdam Optimizer with the default epsilon parameter(:material-github: [purejaxql/pqn_atari.py#L362](https://github.com/mttga/purejaxql/blob/2205ae5308134d2cedccd749074bff2871832dc8/purejaxql/pqn_atari.py#L362)) +5. Adam Learning Rate Annealing (:material-github: [pqn2/pqn2.py#L133-L135](https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/pqn2/pqn2.py#L133-L135)) +6. Q Lambda Returns (:material-github: [purejaxql/pqn_atari.py#L446](https://github.com/mttga/purejaxql/blob/2205ae5308134d2cedccd749074bff2871832dc8/purejaxql/pqn_atari.py#L446)) +7. Mini-batch Updates (:material-github: [pqn2/pqn2.py#L157-L166](https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/pqn2/pqn2.py#L157-L166)) +8. Global Gradient Clipping (:material-github: [purejaxql/pqn_atari.py#L360](https://github.com/mttga/purejaxql/blob/2205ae5308134d2cedccd749074bff2871832dc8/purejaxql/pqn_atari.py#L360)) + +### Experiment results + +To run benchmark experiments, see :material-github: [benchmark/pqn.sh](https://github.com/vwxyzjn/cleanrl/blob/master/benchmark/pqn.sh). Specifically, execute the following command: + +``` title="benchmark/pqn.sh" linenums="1" +--8<-- "benchmark/pqn.sh:0:6" +``` + +Episode Rewards: + +| Environment | CleanRL PQN | +|------------------|-------------------| +| CartPole-v1 | 408.14 ± 128.42 | +| Acrobot-v1 | -93.71 ± 2.94 | +| MountainCar-v0 | -200.00 ± 0.00 | + +Runtime: + +| Environment | CleanRL PQN | +|------------------|----------------------| +| CartPole-v1 | 3.619667511995135 | +| Acrobot-v1 | 4.264845468334595 | +| MountainCar-v0 | 3.99800178870078 | + +Learning curves: + +``` title="benchmark/pqn_plot.sh" linenums="1" +--8<-- "benchmark/pqn_plot.sh:1:9" +``` + + + +Tracked experiments: + + + +## `pqn_atari_envpool.py` + +The [pqn_atari_envpool.py](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/pqn_atari_envpool.py) has the following features: + +* Uses the blazing fast [Envpool](https://github.com/sail-sg/envpool) vectorized environment. +* For Atari games. It uses convolutional layers and common atari-based pre-processing techniques. +* Works with the Atari's pixel `Box` observation space of shape `(210, 160, 3)` +* Works with the `Discrete` action space + +???+ warning + + Note that `pqn_atari_envpool.py` does not work in Windows :fontawesome-brands-windows: and MacOs :fontawesome-brands-apple:. See envpool's built wheels here: [https://pypi.org/project/envpool/#files](https://pypi.org/project/envpool/#files) + +???+ bug + + EnvPool's vectorized environment **does not behave the same** as gym's vectorized environment, which causes a compatibility bug in our PQN implementation. When an action $a$ results in an episode termination or truncation, the environment generates $s_{last}$ as the terminated or truncated state; we then use $s_{new}$ to denote the initial state of the new episodes. Here is how the bahviors differ: + + * Under the vectorized environment of `envpool<=0.6.4`, the `obs` in `obs, reward, done, info = env.step(action)` is the truncated state $s_{last}$ + * Under the vectorized environment of `gym==0.23.1`, the `obs` in `obs, reward, done, info = env.step(action)` is the initial state $s_{new}$. + + This causes the $s_{last}$ to be off by one. + See [:material-github: sail-sg/envpool#194](https://github.com/sail-sg/envpool/issues/194) for more detail. However, it does not seem to impact performance, so we take a note here and await for the upstream fix. + + +### Usage + +=== "poetry" + + ```bash + poetry install -E envpool + poetry run python cleanrl/pqn_atari_envpool.py --help + poetry run python cleanrl/pqn_atari_envpool.py --env-id Breakout-v5 + ``` + +=== "pip" + + ```bash + pip install -r requirements/requirements-envpool.txt + python cleanrl/pqn_atari_envpool.py --help + python cleanrl/pqn_atari_envpool.py --env-id Breakout-v5 + ``` + +### Explanation of the logged metrics + +See [related docs](/rl-algorithms/pqn/#explanation-of-the-logged-metrics) for `pqn.py`. + +### Implementation details + +[pqn_atari_envpool.py](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/pqn_atari_envpool.py) uses a customized `RecordEpisodeStatistics` to work with envpool but has the same other implementation details as `ppo_atari.py`. + +### Experiment results + +To run benchmark experiments, see :material-github: [benchmark/pqn.sh](https://github.com/vwxyzjn/cleanrl/blob/master/benchmark/pqn.sh). Specifically, execute the following command: + +``` title="benchmark/pqn.sh" linenums="1" +--8<-- "benchmark/pqn.sh:12:17" +``` + +Episode Rewards: + +| Environment | CleanRL PQN | +|-------------------|--------------------| +| Breakout-v5 | 356.93 ± 7.48 | +| SpaceInvaders-v5 | 900.07 ± 107.95 | +| BeamRider-v5 | 1987.97 ± 24.47 | +| Pong-v5 | 20.44 ± 0.11 | +| MsPacman-v5 | 2437.57 ± 215.01 | + +Runtime: + +| Environment | CleanRL PQN | +|-------------------|-----------------------| +| Breakout-v5 | 41.27235000576079 | +| SpaceInvaders-v5 | 42.191246278536035 | +| BeamRider-v5 | 42.66799268151052 | +| Pong-v5 | 39.35770012905844 | +| MsPacman-v5 | 43.22808379473344 | + + +Learning curves: + +``` title="benchmark/pqn_plot.sh" linenums="1" +--8<-- "benchmark/pqn_plot.sh:11:29" +``` + + + +Tracked experiments: + + + +## `pqn_atari_envpool_lstm.py` + +The [pqn_atari_envpool_lstm.py](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/pqn_atari_envpool_lstm.py) has the following features: + +* Uses the blazing fast [Envpool](https://github.com/sail-sg/envpool) vectorized environment. +* For Atari games using LSTM without stacked frames. It uses convolutional layers and common atari-based pre-processing techniques. +* Works with the Atari's pixel `Box` observation space of shape `(210, 160, 3)` +* Works with the `Discrete` action space + +???+ warning + + Note that `pqn_atari_envpool.py` does not work in Windows :fontawesome-brands-windows: and MacOs :fontawesome-brands-apple:. See envpool's built wheels here: [https://pypi.org/project/envpool/#files](https://pypi.org/project/envpool/#files) + +???+ bug + + EnvPool's vectorized environment **does not behave the same** as gym's vectorized environment, which causes a compatibility bug in our PQN implementation. When an action $a$ results in an episode termination or truncation, the environment generates $s_{last}$ as the terminated or truncated state; we then use $s_{new}$ to denote the initial state of the new episodes. Here is how the bahviors differ: + + * Under the vectorized environment of `envpool<=0.6.4`, the `obs` in `obs, reward, done, info = env.step(action)` is the truncated state $s_{last}$ + * Under the vectorized environment of `gym==0.23.1`, the `obs` in `obs, reward, done, info = env.step(action)` is the initial state $s_{new}$. + + This causes the $s_{last}$ to be off by one. + See [:material-github: sail-sg/envpool#194](https://github.com/sail-sg/envpool/issues/194) for more detail. However, it does not seem to impact performance, so we take a note here and await for the upstream fix. + +### Usage + + +=== "poetry" + + ```bash + poetry install -E atari + poetry run python cleanrl/pqn_atari_envpool_lstm.py --help + poetry run python cleanrl/pqn_atari_envpool_lstm.py --env-id Breakout-v5 + ``` + +=== "pip" + + ```bash + pip install -r requirements/requirements-atari.txt + python cleanrl/pqn_atari_envpool_lstm.py --help + python cleanrl/pqn_atari_envpool_lstm.py --env-id Breakout-v5 + ``` + + +### Explanation of the logged metrics + +See [related docs](/rl-algorithms/pqn/#explanation-of-the-logged-metrics) for `pqn.py`. + +### Implementation details + +[pqn_atari_envpool_lstm.py](https://github.com/vwxyzjn/cleanrl/blob/master/cleanrl/pqn_atari_envpool_lstm.py) is based on the "5 LSTM implementation details" in [The 37 Implementation Details of Proximal Policy Optimization](https://iclr-blog-track.github.io/2022/03/25/pqn-implementation-details/), which are as follows: + +1. Layer initialization for LSTM layers (:material-github: [a2c/utils.py#L84-L86](https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/a2c/utils.py#L84-L86)) +2. Initialize the LSTM states to be zeros (:material-github: [common/models.py#L179](https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/common/models.py#L179)) +3. Reset LSTM states at the end of the episode (:material-github: [common/models.py#L141](https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/common/models.py#L141)) +4. Prepare sequential rollouts in mini-batches (:material-github: [a2c/utils.py#L81](https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/a2c/utils.py#L81)) +5. Reconstruct LSTM states during training (:material-github: [a2c/utils.py#L81](https://github.com/openai/baselines/blob/ea25b9e8b234e6ee1bca43083f8f3cf974143998/baselines/a2c/utils.py#L81)) + +To help test out the memory, we remove the 4 stacked frames from the observation (i.e., using `env = gym.wrappers.FrameStack(env, 1)` instead of `env = gym.wrappers.FrameStack(env, 4)` like in `ppo_atari.py` ) + +### Experiment results + +To run benchmark experiments, see :material-github: [benchmark/pqn.sh](https://github.com/vwxyzjn/cleanrl/blob/master/benchmark/pqn.sh). Specifically, execute the following command: + +``` title="benchmark/pqn.sh" linenums="1" +--8<-- "benchmark/pqn.sh:23:28" +``` + + +Episode Rewards: + +| Environment | CleanRL PQN | +|-------------------|--------------------| +| Breakout-v5 | 366.47 ± 2.72 | +| SpaceInvaders-v5 | 681.92 ± 40.15 | +| BeamRider-v5 | 2050.85 ± 38.58 | +| MsPacman-v5 | 1815.20 ± 183.03 | + +Runtime: + +| Environment | CleanRL PQN | +|-------------------|-----------------------| +| Breakout-v5 | 170.30230232607076 | +| SpaceInvaders-v5 | 168.45747969698144 | +| BeamRider-v5 | 172.11561139317593 | +| MsPacman-v5 | 171.66131707108408 | + +Learning curves: + +``` title="benchmark/pqn_plot.sh" linenums="1" +--8<-- "benchmark/pqn_plot.sh:32:50" +``` + + + +Tracked experiments: + + \ No newline at end of file diff --git a/docs/rl-algorithms/pqn/pqn.png b/docs/rl-algorithms/pqn/pqn.png new file mode 100644 index 0000000000000000000000000000000000000000..df72dbdb9c6921e344ef63acf0ef9ff046d43d3f GIT binary patch literal 137314 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 He2)GTZj83r literal 0 HcmV?d00001 diff --git a/docs/rl-algorithms/pqn/pqn_lstm.png b/docs/rl-algorithms/pqn/pqn_lstm.png new file mode 100644 index 0000000000000000000000000000000000000000..b97946e3eb84ae561ef084133033892cdc9dd6b0 GIT binary patch literal 126701 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/rl-algorithms/pqn/pqn_state.png b/docs/rl-algorithms/pqn/pqn_state.png new file mode 100644 index 0000000000000000000000000000000000000000..743d08790c015eacf590e78138961a3aad8ffd65 GIT binary patch literal 61105 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

QdM`Ld;TvOt;_xo5&4&Bd*|d=)qw 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 uDeB@--%r{$