diff --git a/a2c/a2c.py b/a2c/a2c.py deleted file mode 100644 index ab4430b9b9eb61bbc99aedbae7d4dd5d44f71bd9..0000000000000000000000000000000000000000 --- a/a2c/a2c.py +++ /dev/null @@ -1,201 +0,0 @@ -import numpy as np -import torch -import torch.nn as nn -import torch.nn.functional as F - -from dataclasses import asdict, dataclass, field -from time import perf_counter -from torch.utils.tensorboard.writer import SummaryWriter -from typing import List, Optional, Sequence, NamedTuple, TypeVar - -from shared.algorithm import Algorithm -from shared.callbacks.callback import Callback -from shared.gae import compute_advantage, compute_rtg_and_advantage -from shared.policy.on_policy import ActorCritic -from shared.schedule import schedule, update_learning_rate -from shared.stats import log_scalars -from shared.trajectory import Trajectory, TrajectoryAccumulator -from wrappers.vectorable_wrapper import ( - VecEnv, - VecEnvObs, - single_observation_space, - single_action_space, -) - -A2CSelf = TypeVar("A2CSelf", bound="A2C") - - -class A2C(Algorithm): - def __init__( - self, - policy: ActorCritic, - env: VecEnv, - device: torch.device, - tb_writer: SummaryWriter, - learning_rate: float = 7e-4, - learning_rate_decay: str = "none", - n_steps: int = 5, - gamma: float = 0.99, - gae_lambda: float = 1.0, - ent_coef: float = 0.0, - ent_coef_decay: str = "none", - vf_coef: float = 0.5, - max_grad_norm: float = 0.5, - rms_prop_eps: float = 1e-5, - use_rms_prop: bool = True, - sde_sample_freq: int = -1, - normalize_advantage: bool = False, - ) -> None: - super().__init__(policy, env, device, tb_writer) - self.policy = policy - - self.lr_schedule = schedule(learning_rate_decay, learning_rate) - if use_rms_prop: - self.optimizer = torch.optim.RMSprop( - policy.parameters(), lr=learning_rate, eps=rms_prop_eps - ) - else: - self.optimizer = torch.optim.Adam(policy.parameters(), lr=learning_rate) - - self.n_steps = n_steps - - self.gamma = gamma - self.gae_lambda = gae_lambda - - self.vf_coef = vf_coef - self.ent_coef_schedule = schedule(ent_coef_decay, ent_coef) - self.max_grad_norm = max_grad_norm - - self.sde_sample_freq = sde_sample_freq - self.normalize_advantage = normalize_advantage - - def learn( - self: A2CSelf, total_timesteps: int, callback: Optional[Callback] = None - ) -> A2CSelf: - epoch_dim = (self.n_steps, self.env.num_envs) - step_dim = (self.env.num_envs,) - obs_space = single_observation_space(self.env) - act_space = single_action_space(self.env) - - obs = np.zeros(epoch_dim + obs_space.shape, dtype=obs_space.dtype) - actions = np.zeros(epoch_dim + act_space.shape, dtype=act_space.dtype) - rewards = np.zeros(epoch_dim, dtype=np.float32) - episode_starts = np.zeros(epoch_dim, dtype=np.byte) - values = np.zeros(epoch_dim, dtype=np.float32) - logprobs = np.zeros(epoch_dim, dtype=np.float32) - - next_obs = self.env.reset() - next_episode_starts = np.ones(step_dim, dtype=np.byte) - - timesteps_elapsed = 0 - while timesteps_elapsed < total_timesteps: - start_time = perf_counter() - - progress = timesteps_elapsed / total_timesteps - ent_coef = self.ent_coef_schedule(progress) - learning_rate = self.lr_schedule(progress) - update_learning_rate(self.optimizer, learning_rate) - log_scalars( - self.tb_writer, - "charts", - { - "ent_coef": ent_coef, - "learning_rate": learning_rate, - }, - timesteps_elapsed, - ) - - self.policy.eval() - self.policy.reset_noise() - for s in range(self.n_steps): - timesteps_elapsed += self.env.num_envs - if self.sde_sample_freq > 0 and s > 0 and s % self.sde_sample_freq == 0: - self.policy.reset_noise() - - obs[s] = next_obs - episode_starts[s] = next_episode_starts - - actions[s], values[s], logprobs[s], clamped_action = self.policy.step( - next_obs - ) - next_obs, rewards[s], next_episode_starts, _ = self.env.step( - clamped_action - ) - - advantages = np.zeros(epoch_dim, dtype=np.float32) - last_gae_lam = 0 - for t in reversed(range(self.n_steps)): - if t == self.n_steps - 1: - next_nonterminal = 1.0 - next_episode_starts - next_value = self.policy.value(next_obs) - else: - next_nonterminal = 1.0 - episode_starts[t + 1] - next_value = values[t + 1] - delta = ( - rewards[t] + self.gamma * next_value * next_nonterminal - values[t] - ) - last_gae_lam = ( - delta - + self.gamma * self.gae_lambda * next_nonterminal * last_gae_lam - ) - advantages[t] = last_gae_lam - returns = advantages + values - - b_obs = torch.tensor(obs.reshape((-1,) + obs_space.shape)).to(self.device) - b_actions = torch.tensor(actions.reshape((-1,) + act_space.shape)).to( - self.device - ) - b_advantages = torch.tensor(advantages.reshape(-1)).to(self.device) - b_returns = torch.tensor(returns.reshape(-1)).to(self.device) - - if self.normalize_advantage: - b_advantages = (b_advantages - b_advantages.mean()) / ( - b_advantages.std() + 1e-8 - ) - - self.policy.train() - logp_a, entropy, v = self.policy(b_obs, b_actions) - - pi_loss = -(b_advantages * logp_a).mean() - value_loss = F.mse_loss(b_returns, v) - entropy_loss = -entropy.mean() - - loss = pi_loss + self.vf_coef * value_loss + ent_coef * entropy_loss - - self.optimizer.zero_grad() - loss.backward() - nn.utils.clip_grad_norm_(self.policy.parameters(), self.max_grad_norm) - self.optimizer.step() - - y_pred = values.reshape(-1) - y_true = returns.reshape(-1) - var_y = np.var(y_true).item() - explained_var = ( - np.nan if var_y == 0 else 1 - np.var(y_true - y_pred).item() / var_y - ) - - end_time = perf_counter() - rollout_steps = self.n_steps * self.env.num_envs - self.tb_writer.add_scalar( - "train/steps_per_second", - (rollout_steps) / (end_time - start_time), - timesteps_elapsed, - ) - - log_scalars( - self.tb_writer, - "losses", - { - "loss": loss.item(), - "pi_loss": pi_loss.item(), - "v_loss": value_loss.item(), - "entropy_loss": entropy_loss.item(), - "explained_var": explained_var, - }, - timesteps_elapsed, - ) - - if callback: - callback.on_step(timesteps_elapsed=rollout_steps) - - return self diff --git a/benchmarks/benchmark_test.sh b/benchmarks/benchmark_test.sh deleted file mode 100644 index 5ab766df564f86a5dad2737dfb96a421bc48067c..0000000000000000000000000000000000000000 --- a/benchmarks/benchmark_test.sh +++ /dev/null @@ -1,32 +0,0 @@ -source benchmarks/train_loop.sh - -export WANDB_PROJECT_NAME="rl-algo-impls" - -BENCHMARK_MAX_PROCS="${BENCHMARK_MAX_PROCS:-3}" - -ALGOS=( - # "vpg" - "dqn" - # "ppo" -) -ENVS=( - # Basic - "CartPole-v1" - "MountainCar-v0" - # "MountainCarContinuous-v0" - "Acrobot-v1" - "LunarLander-v2" - # # PyBullet - # "HalfCheetahBulletEnv-v0" - # "AntBulletEnv-v0" - # "HopperBulletEnv-v0" - # "Walker2DBulletEnv-v0" - # # CarRacing - # "CarRacing-v0" - # Atari - "PongNoFrameskip-v4" - "BreakoutNoFrameskip-v4" - "SpaceInvadersNoFrameskip-v4" - "QbertNoFrameskip-v4" -) -train_loop "${ALGOS[*]}" "${ENVS[*]}" | xargs -I CMD -P $BENCHMARK_MAX_PROCS bash -c CMD diff --git a/benchmarks/colab_atari1.sh b/benchmarks/colab_atari1.sh deleted file mode 100644 index ac3c646314420c360191f50135510c75e720a810..0000000000000000000000000000000000000000 --- a/benchmarks/colab_atari1.sh +++ /dev/null @@ -1,5 +0,0 @@ -source benchmarks/train_loop.sh -ALGOS="ppo" -ENVS="PongNoFrameskip-v4 BreakoutNoFrameskip-v4" -BENCHMARK_MAX_PROCS="${BENCHMARK_MAX_PROCS:-3}" -train_loop $ALGOS "$ENVS" | xargs -I CMD -P $BENCHMARK_MAX_PROCS bash -c CMD \ No newline at end of file diff --git a/benchmarks/colab_atari2.sh b/benchmarks/colab_atari2.sh deleted file mode 100644 index 5e7b79e72b626a8e93f635a45346670e07b20c34..0000000000000000000000000000000000000000 --- a/benchmarks/colab_atari2.sh +++ /dev/null @@ -1,5 +0,0 @@ -source benchmarks/train_loop.sh -ALGOS="ppo" -ENVS="SpaceInvadersNoFrameskip-v4 QbertNoFrameskip-v4" -BENCHMARK_MAX_PROCS="${BENCHMARK_MAX_PROCS:-3}" -train_loop $ALGOS "$ENVS" | xargs -I CMD -P $BENCHMARK_MAX_PROCS bash -c CMD \ No newline at end of file diff --git a/benchmarks/colab_basic.sh b/benchmarks/colab_basic.sh deleted file mode 100644 index affe598a08c94ea23cecacfab44931170ecfd29f..0000000000000000000000000000000000000000 --- a/benchmarks/colab_basic.sh +++ /dev/null @@ -1,5 +0,0 @@ -source benchmarks/train_loop.sh -ALGOS="ppo" -ENVS="CartPole-v1 MountainCar-v0 MountainCarContinuous-v0 Acrobot-v1 LunarLander-v2" -BENCHMARK_MAX_PROCS="${BENCHMARK_MAX_PROCS:-3}" -train_loop $ALGOS "$ENVS" | xargs -I CMD -P $BENCHMARK_MAX_PROCS bash -c CMD diff --git a/benchmarks/colab_benchmark.ipynb b/benchmarks/colab_benchmark.ipynb deleted file mode 100644 index a331841fd9fdd9b85c029c9c573652381d003483..0000000000000000000000000000000000000000 --- a/benchmarks/colab_benchmark.ipynb +++ /dev/null @@ -1,195 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "provenance": [], - "machine_shape": "hm", - "authorship_tag": "ABX9TyOGIH7rqgasim3Sz7b1rpoE", - "include_colab_link": true - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - }, - "gpuClass": "standard", - "accelerator": "GPU" - }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "view-in-github", - "colab_type": "text" - }, - "source": [ - "\"Open" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# [sgoodfriend/rl-algo-impls](https://github.com/sgoodfriend/rl-algo-impls) in Google Colaboratory\n", - "## Parameters\n", - "\n", - "\n", - "1. Wandb\n", - "\n" - ], - "metadata": { - "id": "S-tXDWP8WTLc" - } - }, - { - "cell_type": "code", - "source": [ - "from getpass import getpass\n", - "import os\n", - "os.environ[\"WANDB_API_KEY\"] = getpass(\"Wandb API key to upload metrics, videos, and models: \")" - ], - "metadata": { - "id": "1ZtdYgxWNGwZ" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## Setup\n", - "Clone [sgoodfriend/rl-algo-impls](https://github.com/sgoodfriend/rl-algo-impls) " - ], - "metadata": { - "id": "bsG35Io0hmKG" - } - }, - { - "cell_type": "code", - "source": [ - "%%capture\n", - "!git clone https://github.com/sgoodfriend/rl-algo-impls.git" - ], - "metadata": { - "id": "k5ynTV25hdAf" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "Installing the correct packages:\n", - "\n", - "While conda and poetry are generally used for package management, the mismatch in Python versions (3.10 in the project file vs 3.8 in Colab) makes using the package yml files difficult to use. For now, instead I'm going to specify the list of requirements manually below:" - ], - "metadata": { - "id": "jKxGok-ElYQ7" - } - }, - { - "cell_type": "code", - "source": [ - "%%capture\n", - "!apt install python-opengl\n", - "!apt install ffmpeg\n", - "!apt install xvfb\n", - "!apt install swig" - ], - "metadata": { - "id": "nn6EETTc2Ewf" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "%%capture\n", - "%cd /content/rl-algo-impls\n", - "!pip install -r colab_requirements.txt" - ], - "metadata": { - "id": "AfZh9rH3yQii" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## Run Once Per Runtime" - ], - "metadata": { - "id": "4o5HOLjc4wq7" - } - }, - { - "cell_type": "code", - "source": [ - "import wandb\n", - "wandb.login()" - ], - "metadata": { - "id": "PCXa5tdS2qFX" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## Restart Session beteween runs" - ], - "metadata": { - "id": "AZBZfSUV43JQ" - } - }, - { - "cell_type": "code", - "source": [ - "%%capture\n", - "from pyvirtualdisplay import Display\n", - "\n", - "virtual_display = Display(visible=0, size=(1400, 900))\n", - "virtual_display.start()" - ], - "metadata": { - "id": "VzemeQJP2NO9" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "The below 5 bash scripts train agents on environments with 3 seeds each:\n", - "- colab_basic.sh and colab_pybullet.sh test on a set of basic gym environments and 4 PyBullet environments. Running both together will likely take about 18 hours. This is likely to run into runtime limits for free Colab and Colab Pro, but is fine for Colab Pro+.\n", - "- colab_carracing.sh only trains 3 seeds on CarRacing-v0, which takes almost 22 hours on Colab Pro+ on high-RAM, standard GPU.\n", - "- colab_atari1.sh and colab_atari2.sh likely need to be run separately because each takes about 19 hours on high-RAM, standard GPU." - ], - "metadata": { - "id": "nSHfna0hLlO1" - } - }, - { - "cell_type": "code", - "source": [ - "%cd /content/rl-algo-impls\n", - "os.environ[\"BENCHMARK_MAX_PROCS\"] = str(1) # Can't reliably raise this to 2+, but would make it faster.\n", - "!./benchmarks/colab_basic.sh\n", - "!./benchmarks/colab_pybullet.sh\n", - "# !./benchmarks/colab_carracing.sh\n", - "# !./benchmarks/colab_atari1.sh\n", - "# !./benchmarks/colab_atari2.sh" - ], - "metadata": { - "id": "07aHYFH1zfXa" - }, - "execution_count": null, - "outputs": [] - } - ] -} \ No newline at end of file diff --git a/benchmarks/colab_carracing.sh b/benchmarks/colab_carracing.sh deleted file mode 100644 index 7101140eba9fa2ee8b953ad07d7662fba47416f9..0000000000000000000000000000000000000000 --- a/benchmarks/colab_carracing.sh +++ /dev/null @@ -1,5 +0,0 @@ -source benchmarks/train_loop.sh -ALGOS="ppo" -ENVS="CarRacing-v0" -BENCHMARK_MAX_PROCS="${BENCHMARK_MAX_PROCS:-3}" -train_loop $ALGOS "$ENVS" | xargs -I CMD -P $BENCHMARK_MAX_PROCS bash -c CMD \ No newline at end of file diff --git a/benchmarks/colab_pybullet.sh b/benchmarks/colab_pybullet.sh deleted file mode 100644 index 69e36bac610748c5bd18f5a58a3e79bd39b8b181..0000000000000000000000000000000000000000 --- a/benchmarks/colab_pybullet.sh +++ /dev/null @@ -1,5 +0,0 @@ -source benchmarks/train_loop.sh -ALGOS="ppo" -ENVS="HalfCheetahBulletEnv-v0 AntBulletEnv-v0 HopperBulletEnv-v0 Walker2DBulletEnv-v0" -BENCHMARK_MAX_PROCS="${BENCHMARK_MAX_PROCS:-3}" -train_loop $ALGOS "$ENVS" | xargs -I CMD -P $BENCHMARK_MAX_PROCS bash -c CMD \ No newline at end of file diff --git a/benchmarks/train_loop.sh b/benchmarks/train_loop.sh deleted file mode 100644 index 9ad750dcf09b706a045ed24cbc2c0a91575a6b4e..0000000000000000000000000000000000000000 --- a/benchmarks/train_loop.sh +++ /dev/null @@ -1,15 +0,0 @@ -train_loop () { - local WANDB_TAGS="benchmark_$(git rev-parse --short HEAD) host_$(hostname)" - local algo - local env - local seed - local WANDB_PROJECT_NAME="${WANDB_PROJECT_NAME:-rl-algo-impls-benchmarks}" - local SEEDS="${SEEDS:-1 2 3}" - for algo in $(echo $1); do - for env in $(echo $2); do - for seed in $SEEDS; do - echo python train.py --algo $algo --env $env --seed $seed --pool-size 1 --wandb-tags $WANDB_TAGS --wandb-project-name $WANDB_PROJECT_NAME - done - done - done -} \ No newline at end of file diff --git a/colab_enjoy.ipynb b/colab_enjoy.ipynb deleted file mode 100644 index 57daecf4ee497e489387bbb338cd2baa4b01a67a..0000000000000000000000000000000000000000 --- a/colab_enjoy.ipynb +++ /dev/null @@ -1,198 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "provenance": [], - "machine_shape": "hm", - "authorship_tag": "ABX9TyN6S7kyJKrM5x0OOiN+CgTc", - "include_colab_link": true - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - }, - "gpuClass": "standard", - "accelerator": "GPU" - }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "view-in-github", - "colab_type": "text" - }, - "source": [ - "\"Open" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# [sgoodfriend/rl-algo-impls](https://github.com/sgoodfriend/rl-algo-impls) in Google Colaboratory\n", - "## Parameters\n", - "\n", - "\n", - "1. Wandb\n", - "\n" - ], - "metadata": { - "id": "S-tXDWP8WTLc" - } - }, - { - "cell_type": "code", - "source": [ - "from getpass import getpass\n", - "import os\n", - "os.environ[\"WANDB_API_KEY\"] = getpass(\"Wandb API key to upload metrics, videos, and models: \")" - ], - "metadata": { - "id": "1ZtdYgxWNGwZ" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "2. enjoy.py parameters" - ], - "metadata": { - "id": "ao0nAh3MOdN7" - } - }, - { - "cell_type": "code", - "source": [ - "WANDB_RUN_PATH=\"sgoodfriend/rl-algo-impls-benchmarks/rd0lisee\"" - ], - "metadata": { - "id": "jKL_NFhVOjSc" - }, - "execution_count": 2, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## Setup\n", - "Clone [sgoodfriend/rl-algo-impls](https://github.com/sgoodfriend/rl-algo-impls) " - ], - "metadata": { - "id": "bsG35Io0hmKG" - } - }, - { - "cell_type": "code", - "source": [ - "%%capture\n", - "!git clone https://github.com/sgoodfriend/rl-algo-impls.git" - ], - "metadata": { - "id": "k5ynTV25hdAf" - }, - "execution_count": 3, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "Installing the correct packages:\n", - "\n", - "While conda and poetry are generally used for package management, the mismatch in Python versions (3.10 in the project file vs 3.8 in Colab) makes using the package yml files difficult to use. For now, instead I'm going to specify the list of requirements manually below:" - ], - "metadata": { - "id": "jKxGok-ElYQ7" - } - }, - { - "cell_type": "code", - "source": [ - "%%capture\n", - "!apt install python-opengl\n", - "!apt install ffmpeg\n", - "!apt install xvfb\n", - "!apt install swig" - ], - "metadata": { - "id": "nn6EETTc2Ewf" - }, - "execution_count": 4, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "%%capture\n", - "%cd /content/rl-algo-impls\n", - "!pip install -r colab_requirements.txt" - ], - "metadata": { - "id": "AfZh9rH3yQii" - }, - "execution_count": 5, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## Run Once Per Runtime" - ], - "metadata": { - "id": "4o5HOLjc4wq7" - } - }, - { - "cell_type": "code", - "source": [ - "import wandb\n", - "wandb.login()" - ], - "metadata": { - "id": "PCXa5tdS2qFX" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## Restart Session beteween runs" - ], - "metadata": { - "id": "AZBZfSUV43JQ" - } - }, - { - "cell_type": "code", - "source": [ - "%%capture\n", - "from pyvirtualdisplay import Display\n", - "\n", - "virtual_display = Display(visible=0, size=(1400, 900))\n", - "virtual_display.start()" - ], - "metadata": { - "id": "VzemeQJP2NO9" - }, - "execution_count": 7, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "%cd /content/rl-algo-impls\n", - "!python enjoy.py --wandb-run-path={WANDB_RUN_PATH}" - ], - "metadata": { - "id": "07aHYFH1zfXa" - }, - "execution_count": null, - "outputs": [] - } - ] -} \ No newline at end of file diff --git a/colab_requirements.txt b/colab_requirements.txt deleted file mode 100644 index 798b0a43c5831756303e88f525d1f54bf3384851..0000000000000000000000000000000000000000 --- a/colab_requirements.txt +++ /dev/null @@ -1,14 +0,0 @@ -AutoROM.accept-rom-license >= 0.4.2, < 0.5 -stable-baselines3[extra] >= 1.7.0, < 1.8 -gym[box2d] >= 0.21.0, < 0.22 -pyglet == 1.5.27 -wandb >= 0.13.10, < 0.14 -pyvirtualdisplay == 3.0 -pybullet >= 3.2.5, < 3.3 -tabulate >= 0.9.0, < 0.10 -huggingface-hub >= 0.12.0, < 0.13 -numexpr >= 2.8.4, < 2.9 -gym3 >= 0.3.3, < 0.4 -glfw >= 1.12.0, < 1.13 -procgen >= 0.10.7, < 0.11 -ipython >= 8.10.0, < 8.11 \ No newline at end of file diff --git a/colab_train.ipynb b/colab_train.ipynb deleted file mode 100644 index 7f981493d0545cfabd5b73db13f1f3bb30114855..0000000000000000000000000000000000000000 --- a/colab_train.ipynb +++ /dev/null @@ -1,200 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "provenance": [], - "machine_shape": "hm", - "authorship_tag": "ABX9TyMmemQnx6G7GOnn6XBdjgxY", - "include_colab_link": true - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - }, - "gpuClass": "standard", - "accelerator": "GPU" - }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "view-in-github", - "colab_type": "text" - }, - "source": [ - "\"Open" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# [sgoodfriend/rl-algo-impls](https://github.com/sgoodfriend/rl-algo-impls) in Google Colaboratory\n", - "## Parameters\n", - "\n", - "\n", - "1. Wandb\n", - "\n" - ], - "metadata": { - "id": "S-tXDWP8WTLc" - } - }, - { - "cell_type": "code", - "source": [ - "from getpass import getpass\n", - "import os\n", - "os.environ[\"WANDB_API_KEY\"] = getpass(\"Wandb API key to upload metrics, videos, and models: \")" - ], - "metadata": { - "id": "1ZtdYgxWNGwZ" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "2. train run parameters" - ], - "metadata": { - "id": "ao0nAh3MOdN7" - } - }, - { - "cell_type": "code", - "source": [ - "ALGO = \"ppo\"\n", - "ENV = \"CartPole-v1\"\n", - "SEED = 1" - ], - "metadata": { - "id": "jKL_NFhVOjSc" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## Setup\n", - "Clone [sgoodfriend/rl-algo-impls](https://github.com/sgoodfriend/rl-algo-impls) " - ], - "metadata": { - "id": "bsG35Io0hmKG" - } - }, - { - "cell_type": "code", - "source": [ - "%%capture\n", - "!git clone https://github.com/sgoodfriend/rl-algo-impls.git" - ], - "metadata": { - "id": "k5ynTV25hdAf" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "Installing the correct packages:\n", - "\n", - "While conda and poetry are generally used for package management, the mismatch in Python versions (3.10 in the project file vs 3.8 in Colab) makes using the package yml files difficult to use. For now, instead I'm going to specify the list of requirements manually below:" - ], - "metadata": { - "id": "jKxGok-ElYQ7" - } - }, - { - "cell_type": "code", - "source": [ - "%%capture\n", - "!apt install python-opengl\n", - "!apt install ffmpeg\n", - "!apt install xvfb\n", - "!apt install swig" - ], - "metadata": { - "id": "nn6EETTc2Ewf" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "%%capture\n", - "%cd /content/rl-algo-impls\n", - "!pip install -r colab_requirements.txt" - ], - "metadata": { - "id": "AfZh9rH3yQii" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## Run Once Per Runtime" - ], - "metadata": { - "id": "4o5HOLjc4wq7" - } - }, - { - "cell_type": "code", - "source": [ - "import wandb\n", - "wandb.login()" - ], - "metadata": { - "id": "PCXa5tdS2qFX" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## Restart Session beteween runs" - ], - "metadata": { - "id": "AZBZfSUV43JQ" - } - }, - { - "cell_type": "code", - "source": [ - "%%capture\n", - "from pyvirtualdisplay import Display\n", - "\n", - "virtual_display = Display(visible=0, size=(1400, 900))\n", - "virtual_display.start()" - ], - "metadata": { - "id": "VzemeQJP2NO9" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "%cd /content/rl-algo-impls\n", - "!python train.py --algo {ALGO} --env {ENV} --seed {SEED}" - ], - "metadata": { - "id": "07aHYFH1zfXa" - }, - "execution_count": null, - "outputs": [] - } - ] -} \ No newline at end of file diff --git a/dqn/dqn.py b/dqn/dqn.py deleted file mode 100644 index d057178294f661ff8ea83a1b023943480b6faf9e..0000000000000000000000000000000000000000 --- a/dqn/dqn.py +++ /dev/null @@ -1,182 +0,0 @@ -import copy -import numpy as np -import random -import torch -import torch.nn as nn -import torch.nn.functional as F - -from collections import deque -from torch.optim import Adam -from torch.utils.tensorboard.writer import SummaryWriter -from typing import List, NamedTuple, Optional, TypeVar - -from dqn.policy import DQNPolicy -from shared.algorithm import Algorithm -from shared.callbacks.callback import Callback -from shared.schedule import linear_schedule -from wrappers.vectorable_wrapper import VecEnv, VecEnvObs - - -class Transition(NamedTuple): - obs: np.ndarray - action: np.ndarray - reward: float - done: bool - next_obs: np.ndarray - - -class Batch(NamedTuple): - obs: np.ndarray - actions: np.ndarray - rewards: np.ndarray - dones: np.ndarray - next_obs: np.ndarray - - -class ReplayBuffer: - def __init__(self, num_envs: int, maxlen: int) -> None: - self.num_envs = num_envs - self.buffer = deque(maxlen=maxlen) - - def add( - self, - obs: VecEnvObs, - action: np.ndarray, - reward: np.ndarray, - done: np.ndarray, - next_obs: VecEnvObs, - ) -> None: - assert isinstance(obs, np.ndarray) - assert isinstance(next_obs, np.ndarray) - for i in range(self.num_envs): - self.buffer.append( - Transition(obs[i], action[i], reward[i], done[i], next_obs[i]) - ) - - def sample(self, batch_size: int) -> Batch: - ts = random.sample(self.buffer, batch_size) - return Batch( - obs=np.array([t.obs for t in ts]), - actions=np.array([t.action for t in ts]), - rewards=np.array([t.reward for t in ts]), - dones=np.array([t.done for t in ts]), - next_obs=np.array([t.next_obs for t in ts]), - ) - - def __len__(self) -> int: - return len(self.buffer) - - -DQNSelf = TypeVar("DQNSelf", bound="DQN") - - -class DQN(Algorithm): - def __init__( - self, - policy: DQNPolicy, - env: VecEnv, - device: torch.device, - tb_writer: SummaryWriter, - learning_rate: float = 1e-4, - buffer_size: int = 1_000_000, - learning_starts: int = 50_000, - batch_size: int = 32, - tau: float = 1.0, - gamma: float = 0.99, - train_freq: int = 4, - gradient_steps: int = 1, - target_update_interval: int = 10_000, - exploration_fraction: float = 0.1, - exploration_initial_eps: float = 1.0, - exploration_final_eps: float = 0.05, - max_grad_norm: float = 10.0, - ) -> None: - super().__init__(policy, env, device, tb_writer) - self.policy = policy - - self.optimizer = Adam(self.policy.q_net.parameters(), lr=learning_rate) - - self.target_q_net = copy.deepcopy(self.policy.q_net).to(self.device) - self.target_q_net.train(False) - self.tau = tau - self.target_update_interval = target_update_interval - - self.replay_buffer = ReplayBuffer(self.env.num_envs, buffer_size) - self.batch_size = batch_size - - self.learning_starts = learning_starts - self.train_freq = train_freq - self.gradient_steps = gradient_steps - - self.gamma = gamma - self.exploration_eps_schedule = linear_schedule( - exploration_initial_eps, - exploration_final_eps, - end_fraction=exploration_fraction, - ) - - self.max_grad_norm = max_grad_norm - - def learn( - self: DQNSelf, total_timesteps: int, callback: Optional[Callback] = None - ) -> DQNSelf: - self.policy.train(True) - obs = self.env.reset() - obs = self._collect_rollout(self.learning_starts, obs, 1) - learning_steps = total_timesteps - self.learning_starts - timesteps_elapsed = 0 - steps_since_target_update = 0 - while timesteps_elapsed < learning_steps: - progress = timesteps_elapsed / learning_steps - eps = self.exploration_eps_schedule(progress) - obs = self._collect_rollout(self.train_freq, obs, eps) - rollout_steps = self.train_freq - timesteps_elapsed += rollout_steps - for _ in range( - self.gradient_steps if self.gradient_steps > 0 else self.train_freq - ): - self.train() - steps_since_target_update += rollout_steps - if steps_since_target_update >= self.target_update_interval: - self._update_target() - steps_since_target_update = 0 - if callback: - callback.on_step(timesteps_elapsed=rollout_steps) - return self - - def train(self) -> None: - if len(self.replay_buffer) < self.batch_size: - return - o, a, r, d, next_o = self.replay_buffer.sample(self.batch_size) - o = torch.as_tensor(o, device=self.device) - a = torch.as_tensor(a, device=self.device).unsqueeze(1) - r = torch.as_tensor(r, dtype=torch.float32, device=self.device) - d = torch.as_tensor(d, dtype=torch.long, device=self.device) - next_o = torch.as_tensor(next_o, device=self.device) - - with torch.no_grad(): - target = r + (1 - d) * self.gamma * self.target_q_net(next_o).max(1).values - current = self.policy.q_net(o).gather(dim=1, index=a).squeeze(1) - loss = F.smooth_l1_loss(current, target) - - self.optimizer.zero_grad() - loss.backward() - if self.max_grad_norm: - nn.utils.clip_grad_norm_(self.policy.q_net.parameters(), self.max_grad_norm) - self.optimizer.step() - - def _collect_rollout(self, timesteps: int, obs: VecEnvObs, eps: float) -> VecEnvObs: - for _ in range(0, timesteps, self.env.num_envs): - action = self.policy.act(obs, eps, deterministic=False) - next_obs, reward, done, _ = self.env.step(action) - self.replay_buffer.add(obs, action, reward, done, next_obs) - obs = next_obs - return obs - - def _update_target(self) -> None: - for target_param, param in zip( - self.target_q_net.parameters(), self.policy.q_net.parameters() - ): - target_param.data.copy_( - self.tau * param.data + (1 - self.tau) * target_param.data - ) diff --git a/dqn/policy.py b/dqn/policy.py deleted file mode 100644 index ea6c28b5db004676e0bd22eccc3827e781b7b1a8..0000000000000000000000000000000000000000 --- a/dqn/policy.py +++ /dev/null @@ -1,52 +0,0 @@ -import numpy as np -import os -import torch - -from typing import Optional, Sequence, TypeVar - -from dqn.q_net import QNetwork -from shared.policy.policy import Policy -from wrappers.vectorable_wrapper import ( - VecEnv, - VecEnvObs, - single_observation_space, - single_action_space, -) - -DQNPolicySelf = TypeVar("DQNPolicySelf", bound="DQNPolicy") - - -class DQNPolicy(Policy): - def __init__( - self, - env: VecEnv, - hidden_sizes: Sequence[int] = [], - cnn_feature_dim: int = 512, - cnn_style: str = "nature", - cnn_layers_init_orthogonal: Optional[bool] = None, - impala_channels: Sequence[int] = (16, 32, 32), - **kwargs, - ) -> None: - super().__init__(env, **kwargs) - self.q_net = QNetwork( - single_observation_space(env), - single_action_space(env), - hidden_sizes, - cnn_feature_dim=cnn_feature_dim, - cnn_style=cnn_style, - cnn_layers_init_orthogonal=cnn_layers_init_orthogonal, - impala_channels=impala_channels, - ) - - def act( - self, obs: VecEnvObs, eps: float = 0, deterministic: bool = True - ) -> np.ndarray: - assert eps == 0 if deterministic else eps >= 0 - if not deterministic and np.random.random() < eps: - return np.array( - [self.env.action_space.sample() for _ in range(self.env.num_envs)] - ) - else: - o = self._as_tensor(obs) - with torch.no_grad(): - return self.q_net(o).argmax(axis=1).cpu().numpy() diff --git a/dqn/q_net.py b/dqn/q_net.py deleted file mode 100644 index 37859f0c22708392713c95d87964de2c494cbeb9..0000000000000000000000000000000000000000 --- a/dqn/q_net.py +++ /dev/null @@ -1,41 +0,0 @@ -import gym -import torch as th -import torch.nn as nn - -from gym.spaces import Discrete -from typing import Optional, Sequence, Type - -from shared.module.feature_extractor import FeatureExtractor -from shared.module.module import mlp - - -class QNetwork(nn.Module): - def __init__( - self, - observation_space: gym.Space, - action_space: gym.Space, - hidden_sizes: Sequence[int] = [], - activation: Type[nn.Module] = nn.ReLU, # Used by stable-baselines3 - cnn_feature_dim: int = 512, - cnn_style: str = "nature", - cnn_layers_init_orthogonal: Optional[bool] = None, - impala_channels: Sequence[int] = (16, 32, 32), - ) -> None: - super().__init__() - assert isinstance(action_space, Discrete) - self._feature_extractor = FeatureExtractor( - observation_space, - activation, - cnn_feature_dim=cnn_feature_dim, - cnn_style=cnn_style, - cnn_layers_init_orthogonal=cnn_layers_init_orthogonal, - impala_channels=impala_channels, - ) - layer_sizes = ( - (self._feature_extractor.out_dim,) + tuple(hidden_sizes) + (action_space.n,) - ) - self._fc = mlp(layer_sizes, activation) - - def forward(self, obs: th.Tensor) -> th.Tensor: - x = self._feature_extractor(obs) - return self._fc(x) diff --git a/hyperparams/a2c.yml b/hyperparams/a2c.yml deleted file mode 100644 index 508c17d3442592e5cdedca7e16e2bf1bd466ee78..0000000000000000000000000000000000000000 --- a/hyperparams/a2c.yml +++ /dev/null @@ -1,127 +0,0 @@ -CartPole-v1: &cartpole-defaults - n_timesteps: !!float 5e5 - env_hyperparams: - n_envs: 8 - -CartPole-v0: - <<: *cartpole-defaults - -MountainCar-v0: - n_timesteps: !!float 1e6 - env_hyperparams: - n_envs: 16 - normalize: true - -MountainCarContinuous-v0: - n_timesteps: !!float 1e5 - env_hyperparams: - n_envs: 4 - normalize: true - # policy_hyperparams: - # use_sde: true - # log_std_init: 0.0 - # init_layers_orthogonal: false - algo_hyperparams: - n_steps: 100 - sde_sample_freq: 16 - -Acrobot-v1: - n_timesteps: !!float 5e5 - env_hyperparams: - normalize: true - n_envs: 16 - -LunarLander-v2: - n_timesteps: !!float 1e6 - env_hyperparams: - n_envs: 8 - normalize: true - algo_hyperparams: - n_steps: 5 - gamma: 0.995 - learning_rate: !!float 8.3e-4 - learning_rate_decay: linear - ent_coef: !!float 1e-5 - -BipedalWalker-v3: - n_timesteps: !!float 5e6 - env_hyperparams: - n_envs: 16 - normalize: true - policy_hyperparams: - use_sde: true - log_std_init: -2 - init_layers_orthogonal: false - algo_hyperparams: - ent_coef: 0 - max_grad_norm: 0.5 - n_steps: 8 - gae_lambda: 0.9 - vf_coef: 0.4 - gamma: 0.99 - learning_rate: !!float 9.6e-4 - learning_rate_decay: linear - -HalfCheetahBulletEnv-v0: &pybullet-defaults - n_timesteps: !!float 2e6 - env_hyperparams: - n_envs: 4 - normalize: true - policy_hyperparams: - use_sde: true - log_std_init: -2 - init_layers_orthogonal: false - algo_hyperaparms: &pybullet-algo-defaults - n_steps: 8 - ent_coef: 0 - max_grad_norm: 0.5 - gae_lambda: 0.9 - gamma: 0.99 - vf_coef: 0.4 - learning_rate: !!float 9.6e-4 - learning_rate_decay: linear - -AntBulletEnv-v0: - <<: *pybullet-defaults - -Walker2DBulletEnv-v0: - <<: *pybullet-defaults - -HopperBulletEnv-v0: - <<: *pybullet-defaults - -CarRacing-v0: - n_timesteps: !!float 4e6 - env_hyperparams: - n_envs: 8 - frame_stack: 4 - policy_hyperparams: - use_sde: true - log_std_init: -2 - init_layers_orthogonal: false - activation_fn: relu - share_features_extractor: false - cnn_feature_dim: 256 - hidden_sizes: [256] - algo_hyperparams: - n_steps: 8 - learning_rate: !!float 5e-5 - learning_rate_decay: linear - gamma: 0.99 - gae_lambda: 0.95 - ent_coef: 0 - sde_sample_freq: 4 - -_atari: &atari-defaults - n_timesteps: !!float 1e7 - env_hyperparams: &atari-env-defaults - n_envs: 16 - frame_stack: 4 - no_reward_timeout_steps: 1000 - no_reward_fire_steps: 500 - vec_env_class: async - policy_hyperparams: &atari-policy-defaults - activation_fn: relu - algo_hyperparams: - ent_coef: 0.01 - vf_coef: 0.25 diff --git a/hyperparams/dqn.yml b/hyperparams/dqn.yml deleted file mode 100644 index 66003a67dd8c7865fd9ea269f6fc84b5d95fb428..0000000000000000000000000000000000000000 --- a/hyperparams/dqn.yml +++ /dev/null @@ -1,130 +0,0 @@ -CartPole-v1: &cartpole-defaults - n_timesteps: !!float 5e4 - env_hyperparams: - rolling_length: 50 - policy_hyperparams: - hidden_sizes: [256, 256] - algo_hyperparams: - learning_rate: !!float 2.3e-3 - batch_size: 64 - buffer_size: 100000 - learning_starts: 1000 - gamma: 0.99 - target_update_interval: 10 - train_freq: 256 - gradient_steps: 128 - exploration_fraction: 0.16 - exploration_final_eps: 0.04 - eval_params: - step_freq: !!float 1e4 - -CartPole-v0: - <<: *cartpole-defaults - n_timesteps: !!float 4e4 - -MountainCar-v0: - n_timesteps: !!float 1.2e5 - env_hyperparams: - rolling_length: 50 - policy_hyperparams: - hidden_sizes: [256, 256] - algo_hyperparams: - learning_rate: !!float 4e-3 - batch_size: 128 - buffer_size: 10000 - learning_starts: 1000 - gamma: 0.98 - target_update_interval: 600 - train_freq: 16 - gradient_steps: 8 - exploration_fraction: 0.2 - exploration_final_eps: 0.07 - -Acrobot-v1: - n_timesteps: !!float 1e5 - env_hyperparams: - rolling_length: 50 - policy_hyperparams: - hidden_sizes: [256, 256] - algo_hyperparams: - learning_rate: !!float 6.3e-4 - batch_size: 128 - buffer_size: 50000 - learning_starts: 0 - gamma: 0.99 - target_update_interval: 250 - train_freq: 4 - gradient_steps: -1 - exploration_fraction: 0.12 - exploration_final_eps: 0.1 - -LunarLander-v2: - n_timesteps: !!float 5e5 - env_hyperparams: - rolling_length: 50 - policy_hyperparams: - hidden_sizes: [256, 256] - algo_hyperparams: - learning_rate: !!float 1e-4 - batch_size: 256 - buffer_size: 100000 - learning_starts: 10000 - gamma: 0.99 - target_update_interval: 250 - train_freq: 8 - gradient_steps: -1 - exploration_fraction: 0.12 - exploration_final_eps: 0.1 - max_grad_norm: 0.5 - eval_params: - step_freq: 25_000 - -_atari: &atari-defaults - n_timesteps: !!float 1e7 - env_hyperparams: - frame_stack: 4 - no_reward_timeout_steps: 1_000 - no_reward_fire_steps: 500 - n_envs: 8 - vec_env_class: async - algo_hyperparams: - buffer_size: 100000 - learning_rate: !!float 1e-4 - batch_size: 32 - learning_starts: 100000 - target_update_interval: 1000 - train_freq: 8 - gradient_steps: 2 - exploration_fraction: 0.1 - exploration_final_eps: 0.01 - eval_params: - deterministic: false - -PongNoFrameskip-v4: - <<: *atari-defaults - n_timesteps: !!float 2.5e6 - -_impala-atari: &impala-atari-defaults - <<: *atari-defaults - policy_hyperparams: - cnn_style: impala - cnn_feature_dim: 256 - init_layers_orthogonal: true - cnn_layers_init_orthogonal: false - -impala-PongNoFrameskip-v4: - <<: *impala-atari-defaults - env_id: PongNoFrameskip-v4 - n_timesteps: !!float 2.5e6 - -impala-BreakoutNoFrameskip-v4: - <<: *impala-atari-defaults - env_id: BreakoutNoFrameskip-v4 - -impala-SpaceInvadersNoFrameskip-v4: - <<: *impala-atari-defaults - env_id: SpaceInvadersNoFrameskip-v4 - -impala-QbertNoFrameskip-v4: - <<: *impala-atari-defaults - env_id: QbertNoFrameskip-v4 diff --git a/hyperparams/ppo.yml b/hyperparams/ppo.yml deleted file mode 100644 index 0136fc46b019f9722aaad54bfe93f36ed88f4bc8..0000000000000000000000000000000000000000 --- a/hyperparams/ppo.yml +++ /dev/null @@ -1,383 +0,0 @@ -CartPole-v1: &cartpole-defaults - n_timesteps: !!float 1e5 - env_hyperparams: - n_envs: 8 - algo_hyperparams: - n_steps: 32 - batch_size: 256 - n_epochs: 20 - gae_lambda: 0.8 - gamma: 0.98 - ent_coef: 0.0 - learning_rate: 0.001 - learning_rate_decay: linear - clip_range: 0.2 - clip_range_decay: linear - eval_params: - step_freq: !!float 2.5e4 - -CartPole-v0: - <<: *cartpole-defaults - n_timesteps: !!float 5e4 - -MountainCar-v0: - n_timesteps: !!float 1e6 - env_hyperparams: - normalize: true - n_envs: 16 - algo_hyperparams: - n_steps: 16 - n_epochs: 4 - gae_lambda: 0.98 - gamma: 0.99 - ent_coef: 0.0 - -MountainCarContinuous-v0: - n_timesteps: !!float 1e5 - env_hyperparams: - normalize: true - n_envs: 4 - # policy_hyperparams: - # init_layers_orthogonal: false - # log_std_init: -3.29 - # use_sde: true - algo_hyperparams: - n_steps: 512 - batch_size: 256 - n_epochs: 10 - learning_rate: !!float 7.77e-5 - ent_coef: 0.01 # 0.00429 - ent_coef_decay: linear - clip_range: 0.1 - gae_lambda: 0.9 - max_grad_norm: 5 - vf_coef: 0.19 - eval_params: - step_freq: 5000 - -Acrobot-v1: - n_timesteps: !!float 1e6 - env_hyperparams: - n_envs: 16 - normalize: true - algo_hyperparams: - n_steps: 256 - n_epochs: 4 - gae_lambda: 0.94 - gamma: 0.99 - ent_coef: 0.0 - -LunarLander-v2: - n_timesteps: !!float 4e6 - env_hyperparams: - n_envs: 16 - algo_hyperparams: - n_steps: 1024 - batch_size: 64 - n_epochs: 4 - gae_lambda: 0.98 - gamma: 0.999 - learning_rate: !!float 5e-4 - learning_rate_decay: linear - clip_range: 0.2 - clip_range_decay: linear - ent_coef: 0.01 - normalize_advantage: false - -BipedalWalker-v3: - n_timesteps: !!float 10e6 - env_hyperparams: - n_envs: 16 - normalize: true - algo_hyperparams: - n_steps: 2048 - batch_size: 64 - gae_lambda: 0.95 - gamma: 0.99 - n_epochs: 10 - ent_coef: 0.001 - learning_rate: !!float 2.5e-4 - learning_rate_decay: linear - clip_range: 0.2 - clip_range_decay: linear - -CarRacing-v0: &carracing-defaults - n_timesteps: !!float 4e6 - env_hyperparams: - n_envs: 8 - frame_stack: 4 - policy_hyperparams: &carracing-policy-defaults - use_sde: true - log_std_init: -2 - init_layers_orthogonal: false - activation_fn: relu - share_features_extractor: false - cnn_feature_dim: 256 - hidden_sizes: [256] - algo_hyperparams: - n_steps: 512 - batch_size: 128 - n_epochs: 10 - learning_rate: !!float 1e-4 - learning_rate_decay: linear - gamma: 0.99 - gae_lambda: 0.95 - ent_coef: 0.0 - sde_sample_freq: 4 - max_grad_norm: 0.5 - vf_coef: 0.5 - clip_range: 0.2 - -impala-CarRacing-v0: - <<: *carracing-defaults - env_id: CarRacing-v0 - policy_hyperparams: - <<: *carracing-policy-defaults - cnn_style: impala - init_layers_orthogonal: true - cnn_layers_init_orthogonal: false - hidden_sizes: [] - -# BreakoutNoFrameskip-v4 -# PongNoFrameskip-v4 -# SpaceInvadersNoFrameskip-v4 -# QbertNoFrameskip-v4 -_atari: &atari-defaults - n_timesteps: !!float 1e7 - env_hyperparams: &atari-env-defaults - n_envs: 8 - frame_stack: 4 - no_reward_timeout_steps: 1000 - no_reward_fire_steps: 500 - vec_env_class: async - policy_hyperparams: &atari-policy-defaults - activation_fn: relu - algo_hyperparams: - n_steps: 128 - batch_size: 256 - n_epochs: 4 - learning_rate: !!float 2.5e-4 - learning_rate_decay: linear - clip_range: 0.1 - clip_range_decay: linear - vf_coef: 0.5 - ent_coef: 0.01 - eval_params: - deterministic: false - -_norm-rewards-atari: &norm-rewards-atari-default - <<: *atari-defaults - env_hyperparams: - <<: *atari-env-defaults - clip_atari_rewards: false - normalize: true - normalize_kwargs: - norm_obs: false - norm_reward: true - -norm-rewards-BreakoutNoFrameskip-v4: - <<: *norm-rewards-atari-default - env_id: BreakoutNoFrameskip-v4 - -debug-PongNoFrameskip-v4: - <<: *atari-defaults - device: cpu - env_id: PongNoFrameskip-v4 - env_hyperparams: - <<: *atari-env-defaults - vec_env_class: sync - -_impala-atari: &impala-atari-defaults - <<: *atari-defaults - policy_hyperparams: - <<: *atari-policy-defaults - cnn_style: impala - cnn_feature_dim: 256 - init_layers_orthogonal: true - cnn_layers_init_orthogonal: false - -impala-PongNoFrameskip-v4: - <<: *impala-atari-defaults - env_id: PongNoFrameskip-v4 - -impala-BreakoutNoFrameskip-v4: - <<: *impala-atari-defaults - env_id: BreakoutNoFrameskip-v4 - -impala-SpaceInvadersNoFrameskip-v4: - <<: *impala-atari-defaults - env_id: SpaceInvadersNoFrameskip-v4 - -impala-QbertNoFrameskip-v4: - <<: *impala-atari-defaults - env_id: QbertNoFrameskip-v4 - -HalfCheetahBulletEnv-v0: &pybullet-defaults - n_timesteps: !!float 2e6 - env_hyperparams: &pybullet-env-defaults - n_envs: 16 - normalize: true - policy_hyperparams: &pybullet-policy-defaults - pi_hidden_sizes: [256, 256] - v_hidden_sizes: [256, 256] - activation_fn: relu - algo_hyperparams: &pybullet-algo-defaults - n_steps: 512 - batch_size: 128 - n_epochs: 20 - gamma: 0.99 - gae_lambda: 0.9 - ent_coef: 0.0 - max_grad_norm: 0.5 - vf_coef: 0.5 - learning_rate: !!float 3e-5 - clip_range: 0.4 - -AntBulletEnv-v0: - <<: *pybullet-defaults - policy_hyperparams: - <<: *pybullet-policy-defaults - algo_hyperparams: - <<: *pybullet-algo-defaults - -Walker2DBulletEnv-v0: - <<: *pybullet-defaults - algo_hyperparams: - <<: *pybullet-algo-defaults - clip_range_decay: linear - -HopperBulletEnv-v0: - <<: *pybullet-defaults - algo_hyperparams: - <<: *pybullet-algo-defaults - clip_range_decay: linear - -HumanoidBulletEnv-v0: - <<: *pybullet-defaults - n_timesteps: !!float 1e7 - env_hyperparams: - <<: *pybullet-env-defaults - n_envs: 8 - policy_hyperparams: - <<: *pybullet-policy-defaults - # log_std_init: -1 - algo_hyperparams: - <<: *pybullet-algo-defaults - n_steps: 2048 - batch_size: 64 - n_epochs: 10 - gae_lambda: 0.95 - learning_rate: !!float 2.5e-4 - clip_range: 0.2 - -_procgen: &procgen-defaults - env_hyperparams: &procgen-env-defaults - env_type: procgen - n_envs: 64 - # grayscale: false - # frame_stack: 4 - normalize: true # procgen only normalizes reward - make_kwargs: &procgen-make-kwargs-defaults - num_threads: 8 - policy_hyperparams: &procgen-policy-defaults - activation_fn: relu - cnn_style: impala - cnn_feature_dim: 256 - init_layers_orthogonal: true - cnn_layers_init_orthogonal: false - algo_hyperparams: &procgen-algo-defaults - gamma: 0.999 - gae_lambda: 0.95 - n_steps: 256 - batch_size: 2048 - n_epochs: 3 - ent_coef: 0.01 - clip_range: 0.2 - # clip_range_decay: linear - clip_range_vf: 0.2 - learning_rate: !!float 5e-4 - # learning_rate_decay: linear - vf_coef: 0.5 - eval_params: &procgen-eval-defaults - ignore_first_episode: true - # deterministic: false - step_freq: !!float 1e5 - -_procgen-easy: &procgen-easy-defaults - <<: *procgen-defaults - n_timesteps: !!float 25e6 - env_hyperparams: &procgen-easy-env-defaults - <<: *procgen-env-defaults - make_kwargs: - <<: *procgen-make-kwargs-defaults - distribution_mode: easy - -procgen-coinrun-easy: &coinrun-easy-defaults - <<: *procgen-easy-defaults - env_id: coinrun - -debug-procgen-coinrun: - <<: *coinrun-easy-defaults - device: cpu - -procgen-starpilot-easy: - <<: *procgen-easy-defaults - env_id: starpilot - -procgen-bossfight-easy: - <<: *procgen-easy-defaults - env_id: bossfight - -procgen-bigfish-easy: - <<: *procgen-easy-defaults - env_id: bigfish - -_procgen-hard: &procgen-hard-defaults - <<: *procgen-defaults - n_timesteps: !!float 200e6 - env_hyperparams: &procgen-hard-env-defaults - <<: *procgen-env-defaults - n_envs: 256 - make_kwargs: - <<: *procgen-make-kwargs-defaults - distribution_mode: hard - algo_hyperparams: &procgen-hard-algo-defaults - <<: *procgen-algo-defaults - batch_size: 8192 - clip_range_decay: linear - learning_rate_decay: linear - eval_params: - <<: *procgen-eval-defaults - step_freq: !!float 5e5 - -procgen-starpilot-hard: &procgen-starpilot-hard-defaults - <<: *procgen-hard-defaults - env_id: starpilot - -procgen-starpilot-hard-2xIMPALA: - <<: *procgen-starpilot-hard-defaults - policy_hyperparams: - <<: *procgen-policy-defaults - impala_channels: [32, 64, 64] - algo_hyperparams: - <<: *procgen-hard-algo-defaults - learning_rate: !!float 3.3e-4 - -procgen-starpilot-hard-2xIMPALA-fat: - <<: *procgen-starpilot-hard-defaults - policy_hyperparams: - <<: *procgen-policy-defaults - impala_channels: [32, 64, 64] - cnn_feature_dim: 512 - algo_hyperparams: - <<: *procgen-hard-algo-defaults - learning_rate: !!float 2.5e-4 - -procgen-starpilot-hard-4xIMPALA: - <<: *procgen-starpilot-hard-defaults - policy_hyperparams: - <<: *procgen-policy-defaults - impala_channels: [64, 128, 128] - algo_hyperparams: - <<: *procgen-hard-algo-defaults - learning_rate: !!float 2.1e-4 diff --git a/hyperparams/vpg.yml b/hyperparams/vpg.yml deleted file mode 100644 index e472a9226b830c127f044718672d6d0c9e8c83dc..0000000000000000000000000000000000000000 --- a/hyperparams/vpg.yml +++ /dev/null @@ -1,197 +0,0 @@ -CartPole-v1: &cartpole-defaults - n_timesteps: !!float 4e5 - algo_hyperparams: - n_steps: 4096 - pi_lr: 0.01 - gamma: 0.99 - gae_lambda: 1 - val_lr: 0.01 - train_v_iters: 80 - eval_params: - step_freq: !!float 2.5e4 - -CartPole-v0: - <<: *cartpole-defaults - n_timesteps: !!float 1e5 - algo_hyperparams: - n_steps: 1024 - pi_lr: 0.01 - gamma: 0.99 - gae_lambda: 1 - val_lr: 0.01 - train_v_iters: 80 - -MountainCar-v0: - n_timesteps: !!float 1e6 - env_hyperparams: - normalize: true - n_envs: 16 - algo_hyperparams: - n_steps: 200 - pi_lr: 0.005 - gamma: 0.99 - gae_lambda: 0.97 - val_lr: 0.01 - train_v_iters: 80 - max_grad_norm: 0.5 - -MountainCarContinuous-v0: - n_timesteps: !!float 3e5 - env_hyperparams: - normalize: true - n_envs: 4 - # policy_hyperparams: - # init_layers_orthogonal: false - # log_std_init: -3.29 - # use_sde: true - algo_hyperparams: - n_steps: 1000 - pi_lr: !!float 5e-4 - gamma: 0.99 - gae_lambda: 0.9 - val_lr: !!float 1e-3 - train_v_iters: 80 - max_grad_norm: 5 - eval_params: - step_freq: 5000 - -Acrobot-v1: - n_timesteps: !!float 2e5 - algo_hyperparams: - n_steps: 2048 - pi_lr: 0.005 - gamma: 0.99 - gae_lambda: 0.97 - val_lr: 0.01 - train_v_iters: 80 - max_grad_norm: 0.5 - -LunarLander-v2: - n_timesteps: !!float 4e6 - policy_hyperparams: - hidden_sizes: [256, 256] - algo_hyperparams: - n_steps: 2048 - pi_lr: 0.0001 - gamma: 0.999 - gae_lambda: 0.97 - val_lr: 0.0001 - train_v_iters: 80 - max_grad_norm: 0.5 - eval_params: - deterministic: false - -BipedalWalker-v3: - n_timesteps: !!float 10e6 - env_hyperparams: - n_envs: 16 - normalize: true - policy_hyperparams: - hidden_sizes: [256, 256] - algo_hyperparams: - n_steps: 1600 - gae_lambda: 0.95 - gamma: 0.99 - pi_lr: !!float 1e-4 - val_lr: !!float 1e-4 - train_v_iters: 80 - max_grad_norm: 0.5 - eval_params: - deterministic: false - -CarRacing-v0: - n_timesteps: !!float 4e6 - env_hyperparams: - frame_stack: 4 - n_envs: 4 - vec_env_class: sync - policy_hyperparams: - use_sde: true - log_std_init: -2 - init_layers_orthogonal: false - activation_fn: relu - cnn_feature_dim: 256 - hidden_sizes: [256] - algo_hyperparams: - n_steps: 1000 - pi_lr: !!float 5e-5 - gamma: 0.99 - gae_lambda: 0.95 - val_lr: !!float 1e-4 - train_v_iters: 40 - max_grad_norm: 0.5 - sde_sample_freq: 4 - -HalfCheetahBulletEnv-v0: &pybullet-defaults - n_timesteps: !!float 2e6 - env_hyperparams: &pybullet-env-defaults - normalize: true - policy_hyperparams: &pybullet-policy-defaults - hidden_sizes: [256, 256] - algo_hyperparams: &pybullet-algo-defaults - n_steps: 4000 - pi_lr: !!float 3e-4 - gamma: 0.99 - gae_lambda: 0.97 - val_lr: !!float 1e-3 - train_v_iters: 80 - max_grad_norm: 0.5 - -AntBulletEnv-v0: - <<: *pybullet-defaults - policy_hyperparams: - <<: *pybullet-policy-defaults - hidden_sizes: [400, 300] - algo_hyperparams: - <<: *pybullet-algo-defaults - pi_lr: !!float 7e-4 - val_lr: !!float 7e-3 - -HopperBulletEnv-v0: - <<: *pybullet-defaults - -Walker2DBulletEnv-v0: - <<: *pybullet-defaults - -FrozenLake-v1: - n_timesteps: !!float 8e5 - env_params: - make_kwargs: - map_name: 8x8 - is_slippery: true - policy_hyperparams: - hidden_sizes: [64] - algo_hyperparams: - n_steps: 2048 - pi_lr: 0.01 - gamma: 0.99 - gae_lambda: 0.98 - val_lr: 0.01 - train_v_iters: 80 - max_grad_norm: 0.5 - eval_params: - step_freq: !!float 5e4 - n_episodes: 10 - save_best: true - -_atari: &atari-defaults - n_timesteps: !!float 25e6 - env_hyperparams: - n_envs: 4 - frame_stack: 4 - no_reward_timeout_steps: 1000 - no_reward_fire_steps: 500 - vec_env_class: async - policy_hyperparams: - activation_fn: relu - algo_hyperparams: - n_steps: 2048 - pi_lr: !!float 5e-5 - gamma: 0.99 - gae_lambda: 0.95 - val_lr: !!float 1e-4 - train_v_iters: 80 - max_grad_norm: 0.5 - ent_coef: 0.01 - eval_params: - deterministic: false diff --git a/lambda_labs/benchmark.sh b/lambda_labs/benchmark.sh deleted file mode 100644 index 624abe32380f7dfd37cffb1cf2693980a7eeeddd..0000000000000000000000000000000000000000 --- a/lambda_labs/benchmark.sh +++ /dev/null @@ -1,34 +0,0 @@ -source benchmarks/train_loop.sh - -# export WANDB_PROJECT_NAME="rl-algo-impls" - -BENCHMARK_MAX_PROCS="${BENCHMARK_MAX_PROCS:-6}" - -ALGOS=( - # "vpg" - # "dqn" - # "ppo" - "a2c" -) -ENVS=( - # Basic - "CartPole-v1" - "MountainCar-v0" - "MountainCarContinuous-v0" - "Acrobot-v1" - "LunarLander-v2" - "BipedalWalker-v3" - # PyBullet - "HalfCheetahBulletEnv-v0" - "AntBulletEnv-v0" - "HopperBulletEnv-v0" - "Walker2DBulletEnv-v0" - # CarRacing - "CarRacing-v0" - # Atari - "PongNoFrameskip-v4" - "BreakoutNoFrameskip-v4" - "SpaceInvadersNoFrameskip-v4" - "QbertNoFrameskip-v4" -) -train_loop "${ALGOS[*]}" "${ENVS[*]}" | xargs -I CMD -P $BENCHMARK_MAX_PROCS bash -c CMD diff --git a/lambda_labs/impala_atari_benchmark.sh b/lambda_labs/impala_atari_benchmark.sh deleted file mode 100644 index a9ae78022ef1ae1995ec14495fdd8af287e30e89..0000000000000000000000000000000000000000 --- a/lambda_labs/impala_atari_benchmark.sh +++ /dev/null @@ -1,19 +0,0 @@ -source benchmarks/train_loop.sh - -# export WANDB_PROJECT_NAME="rl-algo-impls" - -BENCHMARK_MAX_PROCS="${BENCHMARK_MAX_PROCS:-5}" - -ALGOS=( - # "vpg" - # "dqn" - "ppo" -) -ENVS=( - "impala-PongNoFrameskip-v4" - "impala-BreakoutNoFrameskip-v4" - "impala-SpaceInvadersNoFrameskip-v4" - "impala-QbertNoFrameskip-v4" - "impala-CarRacing-v0" -) -train_loop "${ALGOS[*]}" "${ENVS[*]}" | xargs -I CMD -P $BENCHMARK_MAX_PROCS bash -c CMD diff --git a/lambda_labs/lambda_requirements.txt b/lambda_labs/lambda_requirements.txt deleted file mode 100644 index 62e1bc45d79e95d758bc92915d99ee612092f56e..0000000000000000000000000000000000000000 --- a/lambda_labs/lambda_requirements.txt +++ /dev/null @@ -1,16 +0,0 @@ -scipy >= 1.10.0, < 1.11 -tensorboard >= ^2.11.0, < 2.12 -AutoROM.accept-rom-license >= 0.4.2, < 0.5 -stable-baselines3[extra] >= 1.7.0, < 1.8 -gym[box2d] >= 0.21.0, < 0.22 -pyglet == 1.5.27 -wandb >= 0.13.10, < 0.14 -pyvirtualdisplay == 3.0 -pybullet >= 3.2.5, < 3.3 -tabulate >= 0.9.0, < 0.10 -huggingface-hub >= 0.12.0, < 0.13 -numexpr >= 2.8.4, < 2.9 -gym3 >= 0.3.3, < 0.4 -glfw >= 1.12.0, < 1.13 -procgen >= 0.10.7, < 0.11 -ipython >= 8.10.0, < 8.11 \ No newline at end of file diff --git a/lambda_labs/procgen_benchmark.sh b/lambda_labs/procgen_benchmark.sh deleted file mode 100644 index 9e58f69ed4fcf6bbc58cca335ce3badbd9e3ca58..0000000000000000000000000000000000000000 --- a/lambda_labs/procgen_benchmark.sh +++ /dev/null @@ -1,18 +0,0 @@ -source benchmarks/train_loop.sh - -# export WANDB_PROJECT_NAME="rl-algo-impls" - -BENCHMARK_MAX_PROCS="${BENCHMARK_MAX_PROCS:-3}" - -ALGOS=( - # "vpg" - # "dqn" - "ppo" -) -ENVS=( - "procgen-coinrun-easy" - "procgen-starpilot-easy" - "procgen-bossfight-easy" - "procgen-bigfish-easy" -) -train_loop "${ALGOS[*]}" "${ENVS[*]}" | xargs -I CMD -P $BENCHMARK_MAX_PROCS bash -c CMD diff --git a/lambda_labs/setup.sh b/lambda_labs/setup.sh deleted file mode 100644 index 79d7f0a0b9bcc087b3b40065830bc8afef29ec18..0000000000000000000000000000000000000000 --- a/lambda_labs/setup.sh +++ /dev/null @@ -1,10 +0,0 @@ -sudo apt update -sudo apt install -y python-opengl -sudo apt install -y ffmpeg -sudo apt install -y xvfb -sudo apt install -y swig - -python3 -m pip install --upgrade pip -pip install --upgrade torch torchvision torchaudio - -pip install --upgrade -r ~/rl-algo-impls/lambda_labs/lambda_requirements.txt \ No newline at end of file diff --git a/lambda_labs/starpilot_hard_benchmark.sh b/lambda_labs/starpilot_hard_benchmark.sh deleted file mode 100644 index da6897b33e0f85917288ba743ba6eb06d20e2176..0000000000000000000000000000000000000000 --- a/lambda_labs/starpilot_hard_benchmark.sh +++ /dev/null @@ -1,16 +0,0 @@ -source benchmarks/train_loop.sh - -# export WANDB_PROJECT_NAME="rl-algo-impls" - -BENCHMARK_MAX_PROCS="${BENCHMARK_MAX_PROCS:-1}" - -ALGOS=( - "ppo" -) -ENVS=( - "procgen-starpilot-hard" - "procgen-starpilot-hard-2xIMPALA" - "procgen-starpilot-hard-2xIMPALA-fat" - "procgen-starpilot-hard-4xIMPALA" -) -train_loop "${ALGOS[*]}" "${ENVS[*]}" | xargs -I CMD -P $BENCHMARK_MAX_PROCS bash -c CMD diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index da115fe5e6e3297f30cd68c4a85ca151fe1414aa..0000000000000000000000000000000000000000 --- a/poetry.lock +++ /dev/null @@ -1,4466 +0,0 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. - -[[package]] -name = "absl-py" -version = "1.4.0" -description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "absl-py-1.4.0.tar.gz", hash = "sha256:d2c244d01048ba476e7c080bd2c6df5e141d211de80223460d5b3b8a2a58433d"}, - {file = "absl_py-1.4.0-py3-none-any.whl", hash = "sha256:0d3fe606adfa4f7db64792dd4c7aee4ee0c38ab75dfd353b7a83ed3e957fcb47"}, -] - -[[package]] -name = "ale-py" -version = "0.7.4" -description = "The Arcade Learning Environment (ALE) - a platform for AI research." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ale_py-0.7.4-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:418eea1539c2669c799274fedead4d44d05dfc3dcd6c536378d5984c42bc340b"}, - {file = "ale_py-0.7.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:38e4823be04761a2ebc0167ed710a318cc9f0fec3815576c45030fe8e67f9c98"}, - {file = "ale_py-0.7.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9af49488ec1b4facb299975a665e9e706921dd2d756daad813e2897debc5fc3c"}, - {file = "ale_py-0.7.4-cp310-cp310-win_amd64.whl", hash = "sha256:f600c55d6a7c6c30f5592b30afc34366101fc7561842bdd5740d5bca390201eb"}, - {file = "ale_py-0.7.4-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:da3e1400e02fb46659dfb3af92e8a4cf4c5b2d4f9d19a008ce9d5fa8eebb4ab6"}, - {file = "ale_py-0.7.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c073005b68901f0003ffe871d56021245eda9e88f27cc91745627c099932499f"}, - {file = "ale_py-0.7.4-cp37-cp37m-win_amd64.whl", hash = "sha256:913394ad1dbe22a8d489378d702f296234721ca0a0e76e5354764e8bf40bc623"}, - {file = "ale_py-0.7.4-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:4841f395e3166d4a7b1e9207cafab08de4b9e9b4178afd97a36f53844ade98a2"}, - {file = "ale_py-0.7.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5b2899b4cf659bc14a20047455e681e991cb96ceed937d22a5dac1a97a16bf3e"}, - {file = "ale_py-0.7.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9aff7a8ce37d00a87ef4114666db0b45d499744d08f5ff1683dbbbcac4783569"}, - {file = "ale_py-0.7.4-cp38-cp38-win_amd64.whl", hash = "sha256:a23f4c858a2c5cbfa3c0cb2c9ab167359c368104b67e19b332710c19b43c6091"}, - {file = "ale_py-0.7.4-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:0b9ab62f12a325e92ba2af99c5b231ad3b219a46913b14068c857d37837025fb"}, - {file = "ale_py-0.7.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:269dcf94024ba7a8276d4dcf04c526df695cb383aa2372e9903a08ec6f679262"}, - {file = "ale_py-0.7.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f65371c180779b115d8600d99780e9e83b229812e94c6b49be1686ce4d82573"}, - {file = "ale_py-0.7.4-cp39-cp39-win_amd64.whl", hash = "sha256:b53e7d0c8f8e8610ebaec88887da2427ce16811f9697ccbb39588ec784bea145"}, -] - -[package.dependencies] -importlib-resources = "*" -numpy = "*" - -[package.extras] -test = ["gym", "pytest"] - -[[package]] -name = "anyio" -version = "3.6.2" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" -optional = false -python-versions = ">=3.6.2" -files = [ - {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"}, - {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"}, -] - -[package.dependencies] -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"] -trio = ["trio (>=0.16,<0.22)"] - -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" -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 = "appnope" -version = "0.1.3" -description = "Disable App Nap on macOS >= 10.9" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, -] - -[[package]] -name = "argon2-cffi" -version = "21.3.0" -description = "The secure Argon2 password hashing algorithm." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "argon2-cffi-21.3.0.tar.gz", hash = "sha256:d384164d944190a7dd7ef22c6aa3ff197da12962bd04b17f64d4e93d934dba5b"}, - {file = "argon2_cffi-21.3.0-py3-none-any.whl", hash = "sha256:8c976986f2c5c0e5000919e6de187906cfd81fb1c72bf9d88c01177e77da7f80"}, -] - -[package.dependencies] -argon2-cffi-bindings = "*" - -[package.extras] -dev = ["cogapp", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "pre-commit", "pytest", "sphinx", "sphinx-notfound-page", "tomli"] -docs = ["furo", "sphinx", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] - -[[package]] -name = "argon2-cffi-bindings" -version = "21.2.0" -description = "Low-level CFFI bindings for Argon2" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, - {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, -] - -[package.dependencies] -cffi = ">=1.0.1" - -[package.extras] -dev = ["cogapp", "pre-commit", "pytest", "wheel"] -tests = ["pytest"] - -[[package]] -name = "arrow" -version = "1.2.3" -description = "Better dates & times for Python" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "arrow-1.2.3-py3-none-any.whl", hash = "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2"}, - {file = "arrow-1.2.3.tar.gz", hash = "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1"}, -] - -[package.dependencies] -python-dateutil = ">=2.7.0" - -[[package]] -name = "asttokens" -version = "2.2.1" -description = "Annotate AST trees with source code positions" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, - {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, -] - -[package.dependencies] -six = "*" - -[package.extras] -test = ["astroid", "pytest"] - -[[package]] -name = "attrs" -version = "22.2.0" -description = "Classes Without Boilerplate" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, - {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] -tests = ["attrs[tests-no-zope]", "zope.interface"] -tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] - -[[package]] -name = "autorom" -version = "0.4.2" -description = "Automated installation of Atari ROMs for Gym/ALE-Py" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "AutoROM-0.4.2-py3-none-any.whl", hash = "sha256:719c9d363ef08391fdb7003d70df235b68f36de628d289a946c4a59a3adefa13"}, - {file = "AutoROM-0.4.2.tar.gz", hash = "sha256:b426a39bc0ee3781c7791f28963a9b2e4385b6421eeaf2f368edc00c761d428a"}, -] - -[package.dependencies] -"AutoROM.accept-rom-license" = {version = "*", optional = true, markers = "extra == \"accept-rom-license\""} -click = "*" -requests = "*" -tqdm = "*" - -[package.extras] -accept-rom-license = ["AutoROM.accept-rom-license"] - -[[package]] -name = "autorom-accept-rom-license" -version = "0.4.2" -description = "Automated installation of Atari ROMs for Gym/ALE-Py" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "AutoROM.accept-rom-license-0.4.2.tar.gz", hash = "sha256:f08654c9d2a6837c5ec951c0364bda352510920ea0523005a2d4460c7d2be7f2"}, -] - -[package.dependencies] -click = "*" -requests = "*" -tqdm = "*" - -[package.extras] -tests = ["ale_py", "multi_agent_ale_py"] - -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] - -[[package]] -name = "beautifulsoup4" -version = "4.11.1" -description = "Screen-scraping library" -category = "main" -optional = false -python-versions = ">=3.6.0" -files = [ - {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, - {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, -] - -[package.dependencies] -soupsieve = ">1.2" - -[package.extras] -html5lib = ["html5lib"] -lxml = ["lxml"] - -[[package]] -name = "bleach" -version = "5.0.1" -description = "An easy safelist-based HTML-sanitizing tool." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "bleach-5.0.1-py3-none-any.whl", hash = "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a"}, - {file = "bleach-5.0.1.tar.gz", hash = "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c"}, -] - -[package.dependencies] -six = ">=1.9.0" -webencodings = "*" - -[package.extras] -css = ["tinycss2 (>=1.1.0,<1.2)"] -dev = ["Sphinx (==4.3.2)", "black (==22.3.0)", "build (==0.8.0)", "flake8 (==4.0.1)", "hashin (==0.17.0)", "mypy (==0.961)", "pip-tools (==6.6.2)", "pytest (==7.1.2)", "tox (==3.25.0)", "twine (==4.0.1)", "wheel (==0.37.1)"] - -[[package]] -name = "box2d-py" -version = "2.3.5" -description = "Python Box2D" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "box2d-py-2.3.5.tar.gz", hash = "sha256:b37dc38844bcd7def48a97111d2b082e4f81cca3cece7460feb3eacda0da2207"}, - {file = "box2d_py-2.3.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:287aa54005c0644b47bf7ad72966e4068d66e56bcf8458f5b4a653ffe42a2618"}, - {file = "box2d_py-2.3.5-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:483b3f9acd5d156b72bf2013f93cf7f8ca0ee1562e43d2353ab4c0cbec4ee49a"}, - {file = "box2d_py-2.3.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:a294c2d7cc73cc05dd491287079e15419eb98caa3158df94f40faf85eeb4b6e9"}, - {file = "box2d_py-2.3.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0d46068eb8d29e366ed698ab2a4833d4d2d34ed035ebd6a685888007dda05f64"}, -] - -[[package]] -name = "cachecontrol" -version = "0.12.11" -description = "httplib2 caching for requests" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "CacheControl-0.12.11-py2.py3-none-any.whl", hash = "sha256:2c75d6a8938cb1933c75c50184549ad42728a27e9f6b92fd677c3151aa72555b"}, - {file = "CacheControl-0.12.11.tar.gz", hash = "sha256:a5b9fcc986b184db101aa280b42ecdcdfc524892596f606858e0b7a8b4d9e144"}, -] - -[package.dependencies] -lockfile = {version = ">=0.9", optional = true, markers = "extra == \"filecache\""} -msgpack = ">=0.5.2" -requests = "*" - -[package.extras] -filecache = ["lockfile (>=0.9)"] -redis = ["redis (>=2.10.5)"] - -[[package]] -name = "cachetools" -version = "5.2.1" -description = "Extensible memoizing collections and decorators" -category = "main" -optional = false -python-versions = "~=3.7" -files = [ - {file = "cachetools-5.2.1-py3-none-any.whl", hash = "sha256:8462eebf3a6c15d25430a8c27c56ac61340b2ecf60c9ce57afc2b97e450e47da"}, - {file = "cachetools-5.2.1.tar.gz", hash = "sha256:5991bc0e08a1319bb618d3195ca5b6bc76646a49c21d55962977197b301cc1fe"}, -] - -[[package]] -name = "cachy" -version = "0.3.0" -description = "Cachy provides a simple yet effective caching library." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"}, - {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"}, -] - -[package.extras] -memcached = ["python-memcached (>=1.59,<2.0)"] -msgpack = ["msgpack-python (>=0.5,<0.6)"] -redis = ["redis (>=3.3.6,<4.0.0)"] - -[[package]] -name = "certifi" -version = "2022.12.7" -description = "Python package for providing Mozilla's CA Bundle." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, -] - -[[package]] -name = "cffi" -version = "1.15.1" -description = "Foreign Function Interface for Python calling C code." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, -] - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "charset-normalizer" -version = "3.0.1" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "charset-normalizer-3.0.1.tar.gz", hash = "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-win32.whl", hash = "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-win32.whl", hash = "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-win32.whl", hash = "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-win32.whl", hash = "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-win32.whl", hash = "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59"}, - {file = "charset_normalizer-3.0.1-py3-none-any.whl", hash = "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24"}, -] - -[[package]] -name = "click" -version = "8.1.3" -description = "Composable command line interface toolkit" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "click-default-group" -version = "1.2.2" -description = "Extends click.Group to invoke a command without explicit subcommand name" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "click-default-group-1.2.2.tar.gz", hash = "sha256:d9560e8e8dfa44b3562fbc9425042a0fd6d21956fcc2db0077f63f34253ab904"}, -] - -[package.dependencies] -click = "*" - -[[package]] -name = "clikit" -version = "0.6.2" -description = "CliKit is a group of utilities to build beautiful and testable command line interfaces." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "clikit-0.6.2-py2.py3-none-any.whl", hash = "sha256:71268e074e68082306e23d7369a7b99f824a0ef926e55ba2665e911f7208489e"}, - {file = "clikit-0.6.2.tar.gz", hash = "sha256:442ee5db9a14120635c5990bcdbfe7c03ada5898291f0c802f77be71569ded59"}, -] - -[package.dependencies] -crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} -pastel = ">=0.2.0,<0.3.0" -pylev = ">=1.3,<2.0" - -[[package]] -name = "cloudpickle" -version = "2.2.0" -description = "Extended pickling support for Python objects" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "cloudpickle-2.2.0-py3-none-any.whl", hash = "sha256:7428798d5926d8fcbfd092d18d01a2a03daf8237d8fcdc8095d256b8490796f0"}, - {file = "cloudpickle-2.2.0.tar.gz", hash = "sha256:3f4219469c55453cfe4737e564b67c2a149109dabf7f242478948b895f61106f"}, -] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -category = "main" -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 = "comm" -version = "0.1.2" -description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "comm-0.1.2-py3-none-any.whl", hash = "sha256:9f3abf3515112fa7c55a42a6a5ab358735c9dccc8b5910a9d8e3ef5998130666"}, - {file = "comm-0.1.2.tar.gz", hash = "sha256:3e2f5826578e683999b93716285b3b1f344f157bf75fa9ce0a797564e742f062"}, -] - -[package.dependencies] -traitlets = ">=5.3" - -[package.extras] -test = ["pytest"] - -[[package]] -name = "commonmark" -version = "0.9.1" -description = "Python parser for the CommonMark Markdown spec" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, - {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, -] - -[package.extras] -test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] - -[[package]] -name = "conda-lock" -version = "1.3.0" -description = "Lockfiles for conda" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "conda_lock-1.3.0-py3-none-any.whl", hash = "sha256:a4d5676bb6a422f17d4f4485de2c84ba9bf3d95592655382c95e6e76203d83d8"}, - {file = "conda_lock-1.3.0.tar.gz", hash = "sha256:8cf4b3a4e6037dadd74cc2b5325e2e76e0a42f3da31b5fd657a8030bce74ee06"}, -] - -[package.dependencies] -cachecontrol = {version = ">=0.12.9", extras = ["filecache"]} -cachy = ">=0.3.0" -click = ">=8.0" -click-default-group = "*" -clikit = ">=0.6.2" -crashtest = ">=0.3.0" -ensureconda = ">=1.3" -gitpython = "*" -html5lib = ">=1.0" -jinja2 = "*" -keyring = ">=21.2.0" -packaging = ">=20.4" -pkginfo = ">=1.4" -pydantic = ">=1.8.1" -pyyaml = ">=5.1" -requests = ">=2.18" -ruamel-yaml = "*" -tomli = {version = "*", markers = "python_version < \"3.11\""} -tomlkit = ">=0.7.0" -toolz = ">=0.12.0,<1.0.0" -typing-extensions = "*" -virtualenv = ">=20.0.26" - -[package.extras] -pip-support = ["poetry (>=1.1.0,<1.2.0)"] - -[[package]] -name = "contourpy" -version = "1.0.6" -description = "Python library for calculating contours of 2D quadrilateral grids" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "contourpy-1.0.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:613c665529899b5d9fade7e5d1760111a0b011231277a0d36c49f0d3d6914bd6"}, - {file = "contourpy-1.0.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78ced51807ccb2f45d4ea73aca339756d75d021069604c2fccd05390dc3c28eb"}, - {file = "contourpy-1.0.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3b1bd7577c530eaf9d2bc52d1a93fef50ac516a8b1062c3d1b9bcec9ebe329b"}, - {file = "contourpy-1.0.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8834c14b8c3dd849005e06703469db9bf96ba2d66a3f88ecc539c9a8982e0ee"}, - {file = "contourpy-1.0.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4052a8a4926d4468416fc7d4b2a7b2a3e35f25b39f4061a7e2a3a2748c4fc48"}, - {file = "contourpy-1.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c0e1308307a75e07d1f1b5f0f56b5af84538a5e9027109a7bcf6cb47c434e72"}, - {file = "contourpy-1.0.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fc4e7973ed0e1fe689435842a6e6b330eb7ccc696080dda9a97b1a1b78e41db"}, - {file = "contourpy-1.0.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:08e8d09d96219ace6cb596506fb9b64ea5f270b2fb9121158b976d88871fcfd1"}, - {file = "contourpy-1.0.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f33da6b5d19ad1bb5e7ad38bb8ba5c426d2178928bc2b2c44e8823ea0ecb6ff3"}, - {file = "contourpy-1.0.6-cp310-cp310-win32.whl", hash = "sha256:12a7dc8439544ed05c6553bf026d5e8fa7fad48d63958a95d61698df0e00092b"}, - {file = "contourpy-1.0.6-cp310-cp310-win_amd64.whl", hash = "sha256:eadad75bf91897f922e0fb3dca1b322a58b1726a953f98c2e5f0606bd8408621"}, - {file = "contourpy-1.0.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:913bac9d064cff033cf3719e855d4f1db9f1c179e0ecf3ba9fdef21c21c6a16a"}, - {file = "contourpy-1.0.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46deb310a276cc5c1fd27958e358cce68b1e8a515fa5a574c670a504c3a3fe30"}, - {file = "contourpy-1.0.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b64f747e92af7da3b85631a55d68c45a2d728b4036b03cdaba4bd94bcc85bd6f"}, - {file = "contourpy-1.0.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50627bf76abb6ba291ad08db583161939c2c5fab38c38181b7833423ab9c7de3"}, - {file = "contourpy-1.0.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:358f6364e4873f4d73360b35da30066f40387dd3c427a3e5432c6b28dd24a8fa"}, - {file = "contourpy-1.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c78bfbc1a7bff053baf7e508449d2765964d67735c909b583204e3240a2aca45"}, - {file = "contourpy-1.0.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e43255a83835a129ef98f75d13d643844d8c646b258bebd11e4a0975203e018f"}, - {file = "contourpy-1.0.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:375d81366afd547b8558c4720337218345148bc2fcffa3a9870cab82b29667f2"}, - {file = "contourpy-1.0.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b98c820608e2dca6442e786817f646d11057c09a23b68d2b3737e6dcb6e4a49b"}, - {file = "contourpy-1.0.6-cp311-cp311-win32.whl", hash = "sha256:0e4854cc02006ad6684ce092bdadab6f0912d131f91c2450ce6dbdea78ee3c0b"}, - {file = "contourpy-1.0.6-cp311-cp311-win_amd64.whl", hash = "sha256:d2eff2af97ea0b61381828b1ad6cd249bbd41d280e53aea5cccd7b2b31b8225c"}, - {file = "contourpy-1.0.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5b117d29433fc8393b18a696d794961464e37afb34a6eeb8b2c37b5f4128a83e"}, - {file = "contourpy-1.0.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:341330ed19074f956cb20877ad8d2ae50e458884bfa6a6df3ae28487cc76c768"}, - {file = "contourpy-1.0.6-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:371f6570a81dfdddbb837ba432293a63b4babb942a9eb7aaa699997adfb53278"}, - {file = "contourpy-1.0.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9447c45df407d3ecb717d837af3b70cfef432138530712263730783b3d016512"}, - {file = "contourpy-1.0.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:730c27978a0003b47b359935478b7d63fd8386dbb2dcd36c1e8de88cbfc1e9de"}, - {file = "contourpy-1.0.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:da1ef35fd79be2926ba80fbb36327463e3656c02526e9b5b4c2b366588b74d9a"}, - {file = "contourpy-1.0.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:cd2bc0c8f2e8de7dd89a7f1c10b8844e291bca17d359373203ef2e6100819edd"}, - {file = "contourpy-1.0.6-cp37-cp37m-win32.whl", hash = "sha256:3a1917d3941dd58732c449c810fa7ce46cc305ce9325a11261d740118b85e6f3"}, - {file = "contourpy-1.0.6-cp37-cp37m-win_amd64.whl", hash = "sha256:06ca79e1efbbe2df795822df2fa173d1a2b38b6e0f047a0ec7903fbca1d1847e"}, - {file = "contourpy-1.0.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e626cefff8491bce356221c22af5a3ea528b0b41fbabc719c00ae233819ea0bf"}, - {file = "contourpy-1.0.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dbe6fe7a1166b1ddd7b6d887ea6fa8389d3f28b5ed3f73a8f40ece1fc5a3d340"}, - {file = "contourpy-1.0.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e13b31d1b4b68db60b3b29f8e337908f328c7f05b9add4b1b5c74e0691180109"}, - {file = "contourpy-1.0.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79d239fc22c3b8d9d3de492aa0c245533f4f4c7608e5749af866949c0f1b1b9"}, - {file = "contourpy-1.0.6-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e8e686a6db92a46111a1ee0ee6f7fbfae4048f0019de207149f43ac1812cf95"}, - {file = "contourpy-1.0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2bd02f1a7adff3a1f33e431eb96ab6d7987b039d2946a9b39fe6fb16a1036"}, - {file = "contourpy-1.0.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:03d1b9c6b44a9e30d554654c72be89af94fab7510b4b9f62356c64c81cec8b7d"}, - {file = "contourpy-1.0.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b48d94386f1994db7c70c76b5808c12e23ed7a4ee13693c2fc5ab109d60243c0"}, - {file = "contourpy-1.0.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:208bc904889c910d95aafcf7be9e677726df9ef71e216780170dbb7e37d118fa"}, - {file = "contourpy-1.0.6-cp38-cp38-win32.whl", hash = "sha256:444fb776f58f4906d8d354eb6f6ce59d0a60f7b6a720da6c1ccb839db7c80eb9"}, - {file = "contourpy-1.0.6-cp38-cp38-win_amd64.whl", hash = "sha256:9bc407a6af672da20da74823443707e38ece8b93a04009dca25856c2d9adadb1"}, - {file = "contourpy-1.0.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:aa4674cf3fa2bd9c322982644967f01eed0c91bb890f624e0e0daf7a5c3383e9"}, - {file = "contourpy-1.0.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f56515e7c6fae4529b731f6c117752247bef9cdad2b12fc5ddf8ca6a50965a5"}, - {file = "contourpy-1.0.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:344cb3badf6fc7316ad51835f56ac387bdf86c8e1b670904f18f437d70da4183"}, - {file = "contourpy-1.0.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b1e66346acfb17694d46175a0cea7d9036f12ed0c31dfe86f0f405eedde2bdd"}, - {file = "contourpy-1.0.6-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8468b40528fa1e15181cccec4198623b55dcd58306f8815a793803f51f6c474a"}, - {file = "contourpy-1.0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dedf4c64185a216c35eb488e6f433297c660321275734401760dafaeb0ad5c2"}, - {file = "contourpy-1.0.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:494efed2c761f0f37262815f9e3c4bb9917c5c69806abdee1d1cb6611a7174a0"}, - {file = "contourpy-1.0.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:75a2e638042118118ab39d337da4c7908c1af74a8464cad59f19fbc5bbafec9b"}, - {file = "contourpy-1.0.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a628bba09ba72e472bf7b31018b6281fd4cc903f0888049a3724afba13b6e0b8"}, - {file = "contourpy-1.0.6-cp39-cp39-win32.whl", hash = "sha256:e1739496c2f0108013629aa095cc32a8c6363444361960c07493818d0dea2da4"}, - {file = "contourpy-1.0.6-cp39-cp39-win_amd64.whl", hash = "sha256:a457ee72d9032e86730f62c5eeddf402e732fdf5ca8b13b41772aa8ae13a4563"}, - {file = "contourpy-1.0.6-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d912f0154a20a80ea449daada904a7eb6941c83281a9fab95de50529bfc3a1da"}, - {file = "contourpy-1.0.6-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4081918147fc4c29fad328d5066cfc751da100a1098398742f9f364be63803fc"}, - {file = "contourpy-1.0.6-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0537cc1195245bbe24f2913d1f9211b8f04eb203de9044630abd3664c6cc339c"}, - {file = "contourpy-1.0.6-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcd556c8fc37a342dd636d7eef150b1399f823a4462f8c968e11e1ebeabee769"}, - {file = "contourpy-1.0.6-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:f6ca38dd8d988eca8f07305125dec6f54ac1c518f1aaddcc14d08c01aebb6efc"}, - {file = "contourpy-1.0.6-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c1baa49ab9fedbf19d40d93163b7d3e735d9cd8d5efe4cce9907902a6dad391f"}, - {file = "contourpy-1.0.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:211dfe2bd43bf5791d23afbe23a7952e8ac8b67591d24be3638cabb648b3a6eb"}, - {file = "contourpy-1.0.6-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c38c6536c2d71ca2f7e418acaf5bca30a3af7f2a2fa106083c7d738337848dbe"}, - {file = "contourpy-1.0.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b1ee48a130da4dd0eb8055bbab34abf3f6262957832fd575e0cab4979a15a41"}, - {file = "contourpy-1.0.6-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5641927cc5ae66155d0c80195dc35726eae060e7defc18b7ab27600f39dd1fe7"}, - {file = "contourpy-1.0.6-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ee394502026d68652c2824348a40bf50f31351a668977b51437131a90d777ea"}, - {file = "contourpy-1.0.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b97454ed5b1368b66ed414c754cba15b9750ce69938fc6153679787402e4cdf"}, - {file = "contourpy-1.0.6-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0236875c5a0784215b49d00ebbe80c5b6b5d5244b3655a36dda88105334dea17"}, - {file = "contourpy-1.0.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c593aeff7a0171f639da92cb86d24954bbb61f8a1b530f74eb750a14685832"}, - {file = "contourpy-1.0.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9b0e7fe7f949fb719b206548e5cde2518ffb29936afa4303d8a1c4db43dcb675"}, - {file = "contourpy-1.0.6.tar.gz", hash = "sha256:6e459ebb8bb5ee4c22c19cc000174f8059981971a33ce11e17dddf6aca97a142"}, -] - -[package.dependencies] -numpy = ">=1.16" - -[package.extras] -bokeh = ["bokeh", "selenium"] -docs = ["docutils (<0.18)", "sphinx (<=5.2.0)", "sphinx-rtd-theme"] -test = ["Pillow", "flake8", "isort", "matplotlib", "pytest"] -test-minimal = ["pytest"] -test-no-codebase = ["Pillow", "matplotlib", "pytest"] - -[[package]] -name = "crashtest" -version = "0.3.1" -description = "Manage Python errors with ease" -category = "main" -optional = false -python-versions = ">=3.6,<4.0" -files = [ - {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, - {file = "crashtest-0.3.1.tar.gz", hash = "sha256:42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd"}, -] - -[[package]] -name = "cryptography" -version = "39.0.1" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "cryptography-39.0.1-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:6687ef6d0a6497e2b58e7c5b852b53f62142cfa7cd1555795758934da363a965"}, - {file = "cryptography-39.0.1-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:706843b48f9a3f9b9911979761c91541e3d90db1ca905fd63fee540a217698bc"}, - {file = "cryptography-39.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:5d2d8b87a490bfcd407ed9d49093793d0f75198a35e6eb1a923ce1ee86c62b41"}, - {file = "cryptography-39.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83e17b26de248c33f3acffb922748151d71827d6021d98c70e6c1a25ddd78505"}, - {file = "cryptography-39.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e124352fd3db36a9d4a21c1aa27fd5d051e621845cb87fb851c08f4f75ce8be6"}, - {file = "cryptography-39.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:5aa67414fcdfa22cf052e640cb5ddc461924a045cacf325cd164e65312d99502"}, - {file = "cryptography-39.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:35f7c7d015d474f4011e859e93e789c87d21f6f4880ebdc29896a60403328f1f"}, - {file = "cryptography-39.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f24077a3b5298a5a06a8e0536e3ea9ec60e4c7ac486755e5fb6e6ea9b3500106"}, - {file = "cryptography-39.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:f0c64d1bd842ca2633e74a1a28033d139368ad959872533b1bab8c80e8240a0c"}, - {file = "cryptography-39.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:0f8da300b5c8af9f98111ffd512910bc792b4c77392a9523624680f7956a99d4"}, - {file = "cryptography-39.0.1-cp36-abi3-win32.whl", hash = "sha256:fe913f20024eb2cb2f323e42a64bdf2911bb9738a15dba7d3cce48151034e3a8"}, - {file = "cryptography-39.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:ced4e447ae29ca194449a3f1ce132ded8fcab06971ef5f618605aacaa612beac"}, - {file = "cryptography-39.0.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:807ce09d4434881ca3a7594733669bd834f5b2c6d5c7e36f8c00f691887042ad"}, - {file = "cryptography-39.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:96f1157a7c08b5b189b16b47bc9db2332269d6680a196341bf30046330d15388"}, - {file = "cryptography-39.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e422abdec8b5fa8462aa016786680720d78bdce7a30c652b7fadf83a4ba35336"}, - {file = "cryptography-39.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:b0afd054cd42f3d213bf82c629efb1ee5f22eba35bf0eec88ea9ea7304f511a2"}, - {file = "cryptography-39.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:6f8ba7f0328b79f08bdacc3e4e66fb4d7aab0c3584e0bd41328dce5262e26b2e"}, - {file = "cryptography-39.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ef8b72fa70b348724ff1218267e7f7375b8de4e8194d1636ee60510aae104cd0"}, - {file = "cryptography-39.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:aec5a6c9864be7df2240c382740fcf3b96928c46604eaa7f3091f58b878c0bb6"}, - {file = "cryptography-39.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fdd188c8a6ef8769f148f88f859884507b954cc64db6b52f66ef199bb9ad660a"}, - {file = "cryptography-39.0.1.tar.gz", hash = "sha256:d1f6198ee6d9148405e49887803907fe8962a23e6c6f83ea7d98f1c0de375695"}, -] - -[package.dependencies] -cffi = ">=1.12" - -[package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "check-manifest", "mypy", "ruff", "types-pytz", "types-requests"] -sdist = ["setuptools-rust (>=0.11.4)"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist", "pytz"] -test-randomorder = ["pytest-randomly"] -tox = ["tox"] - -[[package]] -name = "cycler" -version = "0.11.0" -description = "Composable style cycles" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, - {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, -] - -[[package]] -name = "debugpy" -version = "1.6.5" -description = "An implementation of the Debug Adapter Protocol for Python" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "debugpy-1.6.5-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:696165f021a6a17da08163eaae84f3faf5d8be68fb78cd78488dd347e625279c"}, - {file = "debugpy-1.6.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17039e392d6f38388a68bd02c5f823b32a92142a851e96ba3ec52aeb1ce9d900"}, - {file = "debugpy-1.6.5-cp310-cp310-win32.whl", hash = "sha256:62a06eb78378292ba6c427d861246574dc8b84471904973797b29dd33c7c2495"}, - {file = "debugpy-1.6.5-cp310-cp310-win_amd64.whl", hash = "sha256:9984fc00ab372c97f63786c400107f54224663ea293daab7b365a5b821d26309"}, - {file = "debugpy-1.6.5-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:048368f121c08b00bbded161e8583817af5055982d2722450a69efe2051621c2"}, - {file = "debugpy-1.6.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74e4eca42055759032e3f1909d1374ba1d729143e0c2729bb8cb5e8b5807c458"}, - {file = "debugpy-1.6.5-cp37-cp37m-win32.whl", hash = "sha256:0f9afcc8cad6424695f3356dc9a7406d5b18e37ee2e73f34792881a44b02cc50"}, - {file = "debugpy-1.6.5-cp37-cp37m-win_amd64.whl", hash = "sha256:b5a74ecebe5253344501d9b23f74459c46428b30437fa9254cfb8cb129943242"}, - {file = "debugpy-1.6.5-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:9e809ef787802c808995e5b6ade714a25fa187f892b41a412d418a15a9c4a432"}, - {file = "debugpy-1.6.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:947c686e8adb46726f3d5f19854f6aebf66c2edb91225643c7f44b40b064a235"}, - {file = "debugpy-1.6.5-cp38-cp38-win32.whl", hash = "sha256:377391341c4b86f403d93e467da8e2d05c22b683f08f9af3e16d980165b06b90"}, - {file = "debugpy-1.6.5-cp38-cp38-win_amd64.whl", hash = "sha256:286ae0c2def18ee0dc8a61fa76d51039ca8c11485b6ed3ef83e3efe8a23926ae"}, - {file = "debugpy-1.6.5-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:500dd4a9ff818f5c52dddb4a608c7de5371c2d7d905c505eb745556c579a9f11"}, - {file = "debugpy-1.6.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f3fab217fe7e2acb2d90732af1a871947def4e2b6654945ba1ebd94bd0bea26"}, - {file = "debugpy-1.6.5-cp39-cp39-win32.whl", hash = "sha256:15bc5febe0edc79726517b1f8d57d7ac7c784567b5ba804aab8b1c9d07a57018"}, - {file = "debugpy-1.6.5-cp39-cp39-win_amd64.whl", hash = "sha256:7e84d9e4420122384cb2cc762a00b4e17cbf998022890f89b195ce178f78ff47"}, - {file = "debugpy-1.6.5-py2.py3-none-any.whl", hash = "sha256:8116e40a1cd0593bd2aba01d4d560ee08f018da8e8fbd4cbd24ff09b5f0e41ef"}, - {file = "debugpy-1.6.5.zip", hash = "sha256:5e55e6c79e215239dd0794ee0bf655412b934735a58e9d705e5c544f596f1603"}, -] - -[[package]] -name = "decorator" -version = "5.1.1" -description = "Decorators for Humans" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, - {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, -] - -[[package]] -name = "defusedxml" -version = "0.7.1" -description = "XML bomb protection for Python stdlib modules" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, - {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, -] - -[[package]] -name = "distlib" -version = "0.3.6" -description = "Distribution utilities" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, - {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, -] - -[[package]] -name = "docker-pycreds" -version = "0.4.0" -description = "Python bindings for the docker credentials store API" -category = "main" -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 = "ensureconda" -version = "1.4.3" -description = "Lightweight bootstrapper for a conda executable" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ensureconda-1.4.3-py3-none-any.whl", hash = "sha256:a746630675e8d5a6a3fc1e8d2ec9c80459e1e722df94365a5099eec0079572a8"}, - {file = "ensureconda-1.4.3.tar.gz", hash = "sha256:e04ae2e2f872869df7e7da22dcca9bd7c42f839a55155dddb249bcdc9e6aae48"}, -] - -[package.dependencies] -appdirs = "*" -click = ">=5.1" -filelock = "*" -requests = ">=2" - -[[package]] -name = "entrypoints" -version = "0.4" -description = "Discover and load entry points from installed packages." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, - {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, -] - -[[package]] -name = "executing" -version = "1.2.0" -description = "Get the currently executing AST node of a frame, and other information" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, - {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, -] - -[package.extras] -tests = ["asttokens", "littleutils", "pytest", "rich"] - -[[package]] -name = "fastjsonschema" -version = "2.16.2" -description = "Fastest Python implementation of JSON schema" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "fastjsonschema-2.16.2-py3-none-any.whl", hash = "sha256:21f918e8d9a1a4ba9c22e09574ba72267a6762d47822db9add95f6454e51cc1c"}, - {file = "fastjsonschema-2.16.2.tar.gz", hash = "sha256:01e366f25d9047816fe3d288cbfc3e10541daf0af2044763f3d0ade42476da18"}, -] - -[package.extras] -devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] - -[[package]] -name = "filelock" -version = "3.9.0" -description = "A platform independent file lock." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "filelock-3.9.0-py3-none-any.whl", hash = "sha256:f58d535af89bb9ad5cd4df046f741f8553a418c01a7856bf0d173bbc9f6bd16d"}, - {file = "filelock-3.9.0.tar.gz", hash = "sha256:7b319f24340b51f55a2bf7a12ac0755a9b03e718311dac567a0f4f7fabd2f5de"}, -] - -[package.extras] -docs = ["furo (>=2022.12.7)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] -testing = ["covdefaults (>=2.2.2)", "coverage (>=7.0.1)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)"] - -[[package]] -name = "fonttools" -version = "4.38.0" -description = "Tools to manipulate font files" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "fonttools-4.38.0-py3-none-any.whl", hash = "sha256:820466f43c8be8c3009aef8b87e785014133508f0de64ec469e4efb643ae54fb"}, - {file = "fonttools-4.38.0.zip", hash = "sha256:2bb244009f9bf3fa100fc3ead6aeb99febe5985fa20afbfbaa2f8946c2fbdaf1"}, -] - -[package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=14.0.0)", "xattr", "zopfli (>=0.1.4)"] -graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "scipy"] -lxml = ["lxml (>=4.0,<5)"] -pathops = ["skia-pathops (>=0.5.0)"] -plot = ["matplotlib"] -repacker = ["uharfbuzz (>=0.23.0)"] -symfont = ["sympy"] -type1 = ["xattr"] -ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=14.0.0)"] -woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] - -[[package]] -name = "fqdn" -version = "1.5.1" -description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" -files = [ - {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, - {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, -] - -[[package]] -name = "gitdb" -version = "4.0.10" -description = "Git Object Database" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, - {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, -] - -[package.dependencies] -smmap = ">=3.0.1,<6" - -[[package]] -name = "gitpython" -version = "3.1.30" -description = "GitPython is a python library used to interact with Git repositories" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "GitPython-3.1.30-py3-none-any.whl", hash = "sha256:cd455b0000615c60e286208ba540271af9fe531fa6a87cc590a7298785ab2882"}, - {file = "GitPython-3.1.30.tar.gz", hash = "sha256:769c2d83e13f5d938b7688479da374c4e3d49f71549aaf462b646db9602ea6f8"}, -] - -[package.dependencies] -gitdb = ">=4.0.1,<5" - -[[package]] -name = "glcontext" -version = "2.3.7" -description = "Portable OpenGL Context" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "glcontext-2.3.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8ece87d8616bf12e55a08a05159f4303c8b82d348c2c43c7297c85d8e95dfa3e"}, - {file = "glcontext-2.3.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5dcd68b23b1a549a3b0851d3621630e492ff9015a18f29f2512088b4e03e4d9"}, - {file = "glcontext-2.3.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dc6a6133bffc33cb75bbc79dc08bd1e206017ac69ec68f703227aaf5f5129bb"}, - {file = "glcontext-2.3.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc906a19be96d2820dee8e681ca1d3129821eb6e5c4f1544db723edf0c0696bd"}, - {file = "glcontext-2.3.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89869925f4e1762878561fa1e3cbd1ee5ce73e5597275b5fc8bc054dd894fca4"}, - {file = "glcontext-2.3.7-cp310-cp310-win32.whl", hash = "sha256:088482e07aed6229a34fbb1d0c5fbe0ad9c413dbddb5eaaa8e5c83d933cbe8d6"}, - {file = "glcontext-2.3.7-cp310-cp310-win_amd64.whl", hash = "sha256:03b505fc8ce2dfcf800feac0e20cbb7b1899a5ef7407fa0cccb3267a5b2abbdb"}, - {file = "glcontext-2.3.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:155154084bdedfc8904524d8bd212e5896cc5d5caf1d45c19d13dc34aee4b5ab"}, - {file = "glcontext-2.3.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:65bf63b2068e13183e34a4beaf921f20cd144a25cebed0fa9a46f25e8b47577d"}, - {file = "glcontext-2.3.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51e04b162529f99c7b764129e07aaa3ec8edfc63ca7a212b71e348319f8b821b"}, - {file = "glcontext-2.3.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0961811d85ac551b1ce1f197296a8e5f497b35a149cfc6e128f74dfaef5e592f"}, - {file = "glcontext-2.3.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa4595600a699ed13e854b87116a1519a25e47a10100df01650c1be3532bd629"}, - {file = "glcontext-2.3.7-cp311-cp311-win32.whl", hash = "sha256:7dc827f119ccc3ea55b7bec73573516117c55319edc93bc2bbcf389bf1e7acfe"}, - {file = "glcontext-2.3.7-cp311-cp311-win_amd64.whl", hash = "sha256:a22a3fbb3abefd7a9f5a672af8fccb8d8d996b2eae2075ac9d8ca10f4a6f6653"}, - {file = "glcontext-2.3.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6df4cf354adb911a9ca58bc5c60fb1ae27544527878bc3ddf8f7ea56946c6fcc"}, - {file = "glcontext-2.3.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f1656e931c937f8bdce12c551fa0077db814b123e7f16b6db26e1e7c89dae16"}, - {file = "glcontext-2.3.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:058bf839884b5d5d8488978ed804023be64fc9bafb674a0ede1ba26c05bd9146"}, - {file = "glcontext-2.3.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f17be52c99e3eaeefaaac780bde40bfa99be3ad32bbfed346bb347c9d0b01967"}, - {file = "glcontext-2.3.7-cp37-cp37m-win32.whl", hash = "sha256:5a4cc4fef74dcab0b428ef750fad3c05311657ffb4f1dd3d4afa75e664551588"}, - {file = "glcontext-2.3.7-cp37-cp37m-win_amd64.whl", hash = "sha256:fd03d6d8dbfdd9bab97ada98759e345b29d50f690cec95dd01d22d02f616bfea"}, - {file = "glcontext-2.3.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:03b3925472771607d13feb9a0de93b04408ae86c91eee3f5e09e43744f90b1af"}, - {file = "glcontext-2.3.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f234ebcc3355155811389c320974056ce20233770205fc7cb41d8653d6137efa"}, - {file = "glcontext-2.3.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46ef33b616027a616dcceba33bc48e589ba24fa84ee43c5b8611c5b57d2dace3"}, - {file = "glcontext-2.3.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ff822473d498d606424f92a341d01121562af35bf1d3d0e2ccd1f9c2f86859b"}, - {file = "glcontext-2.3.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c90b525296c4930b1f74bf460b97af052c3cc9ba47d811f416ed82e1b16b03"}, - {file = "glcontext-2.3.7-cp38-cp38-win32.whl", hash = "sha256:f1444229f84a7aea48ce3f1143147acee92eee264826db4c41ea38c6b0a924a9"}, - {file = "glcontext-2.3.7-cp38-cp38-win_amd64.whl", hash = "sha256:59580776fd7e520995b82a6134c8ca7152a7881e174077fc785f4cc69c476d69"}, - {file = "glcontext-2.3.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8aa90a648f17bacacef95b09a5fab368e8feff3714fc4b81eb9374bd439850e6"}, - {file = "glcontext-2.3.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:867fe03c1c241d2416b719e23d1671537e34e03bab741dcc50d49298c1397073"}, - {file = "glcontext-2.3.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae930d226f9145ec580f3fe10fc23262b8c21a6a0cd6fbc081a6606e9000ce74"}, - {file = "glcontext-2.3.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc73099fa7525a20e2021a2f2befa61e9ef306364838c1859ba79f5bd8eda33a"}, - {file = "glcontext-2.3.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:755698083c6119e771ea3f5837143324636700e1e5b397885c05085a837d5876"}, - {file = "glcontext-2.3.7-cp39-cp39-win32.whl", hash = "sha256:ab8147607af85fc2ec2e02b4364ff36b636f63781295e74220dc5c5856794e07"}, - {file = "glcontext-2.3.7-cp39-cp39-win_amd64.whl", hash = "sha256:2fae2d4bcb0564e0eb8e72c97e149faebfad369aeaef74ed7fd17f5f84a07428"}, - {file = "glcontext-2.3.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e48550269c3baff04cc46ca79bd9d2d5a62216665751b10aa86d95ebe182d319"}, - {file = "glcontext-2.3.7-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82eff3e5664c5a17fc0cbb1dae2c32088cdd3c3bfbfe4b9c71012275c2a63e8e"}, - {file = "glcontext-2.3.7-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44f7dbf800e6f933a5c56e07b18ef70f44949f34bf57f5d5318e2199c12cbfbc"}, - {file = "glcontext-2.3.7-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d18b3e9e9259595dd5c538c1fd9238f8b26c22d6351397e721ef8a89ad55f12"}, - {file = "glcontext-2.3.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:376e12d230fd198a329dfe253b41480b0a015a2dabbac5eecf6b279fe3afb1b3"}, - {file = "glcontext-2.3.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:84dc3b831af386cb20cae8fb10ac78d8007bb29118730db2e9f21c329a528028"}, - {file = "glcontext-2.3.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c873315741dbc208c199cbe449aa77d1831551dd78d9b3d67e0a6f9eb576d"}, - {file = "glcontext-2.3.7-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94e47dd8cf39cabe20b41dd0c4c6589f0c7a4de2a5bad8e51ab0fc0b4a26ae6b"}, - {file = "glcontext-2.3.7-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79e561b67e606b6e13ba58e6ae3e688e3429dbb5d60e551ba40d649432044f37"}, - {file = "glcontext-2.3.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d986976c9b758d60d966fbaf8bdff129d125e8b2c58889d2220ca96991f1071e"}, - {file = "glcontext-2.3.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:891b56a3bbaf3470595c218e847e79448e95cecb412224c8585da640c61cf29a"}, - {file = "glcontext-2.3.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a349317c9d634aa56e30aae9ad408bc1b9de281af0e4f87de682b454ebaf540e"}, - {file = "glcontext-2.3.7-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1716d21d423a1a2261cd717bc66714eeb5464d6a061b92678f356ca69cfd1255"}, - {file = "glcontext-2.3.7-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:440ff5f59f318ce495c6bdddfa01a23dd64713fb960ceb87c3a9423745781d47"}, - {file = "glcontext-2.3.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ef0c7e534e53f14b7b09dc3fe1e207243c9bb3eb2543d9876ed253156ca7a8bf"}, - {file = "glcontext-2.3.7.tar.gz", hash = "sha256:bb2d0503f45ad85ca7319bd37fd983e374b3f824c38a450b5f72cfc974114156"}, -] - -[[package]] -name = "glfw" -version = "1.12.0" -description = "A ctypes-based wrapper for GLFW3." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "glfw-1.12.0-py2.py27.py3.py30.py31.py32.py33.py34.py35.py36.py37.py38-none-macosx_10_6_intel.whl", hash = "sha256:88bd1cd2ace036d275e9af8312993068d94b3ac19248421eedc35a4baf53bb8c"}, - {file = "glfw-1.12.0-py2.py27.py3.py30.py31.py32.py33.py34.py35.py36.py37.py38-none-manylinux2010_i686.whl", hash = "sha256:bb63f6121c40f5f17cd78328c040b40aeaca9ed748f440c40d2fcad824107a74"}, - {file = "glfw-1.12.0-py2.py27.py3.py30.py31.py32.py33.py34.py35.py36.py37.py38-none-manylinux2010_x86_64.whl", hash = "sha256:6324fed2c4fd1762ae580277c534b5dab6f360b8fb9aed3e1547cf33f63d207c"}, - {file = "glfw-1.12.0-py2.py27.py3.py30.py31.py32.py33.py34.py35.py36.py37.py38-none-manylinux2014_x86_64.whl", hash = "sha256:20c918a1ae413a009f7559be9559bc2ec1d6251888f588ffa7a174d6db69a942"}, - {file = "glfw-1.12.0-py2.py27.py3.py30.py31.py32.py33.py34.py35.py36.py37.py38-none-win32.whl", hash = "sha256:fe9622a48ec9dc436e67de0d0bb4c9443996b5bd5564df1734d3a4280b728d38"}, - {file = "glfw-1.12.0-py2.py27.py3.py30.py31.py32.py33.py34.py35.py36.py37.py38-none-win_amd64.whl", hash = "sha256:3723db5e5628b2cd8729421fb6fc5fed3e5d25c7d1631f72f13301b218ee1600"}, - {file = "glfw-1.12.0.tar.gz", hash = "sha256:f195ed7a43475e4f1603903d6999f3a6b470fda88bd1749ff10adc520abe8fb1"}, -] - -[[package]] -name = "google-auth" -version = "2.16.0" -description = "Google Authentication Library" -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" -files = [ - {file = "google-auth-2.16.0.tar.gz", hash = "sha256:ed7057a101af1146f0554a769930ac9de506aeca4fd5af6543ebe791851a9fbd"}, - {file = "google_auth-2.16.0-py2.py3-none-any.whl", hash = "sha256:5045648c821fb72384cdc0e82cc326df195f113a33049d9b62b74589243d2acc"}, -] - -[package.dependencies] -cachetools = ">=2.0.0,<6.0" -pyasn1-modules = ">=0.2.1" -rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} -six = ">=1.9.0" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] -enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] -pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] -reauth = ["pyu2f (>=0.1.5)"] -requests = ["requests (>=2.20.0,<3.0.0dev)"] - -[[package]] -name = "google-auth-oauthlib" -version = "0.4.6" -description = "Google Authentication Library" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "google-auth-oauthlib-0.4.6.tar.gz", hash = "sha256:a90a072f6993f2c327067bf65270046384cda5a8ecb20b94ea9a687f1f233a7a"}, - {file = "google_auth_oauthlib-0.4.6-py2.py3-none-any.whl", hash = "sha256:3f2a6e802eebbb6fb736a370fbf3b055edcb6b52878bf2f26330b5e041316c73"}, -] - -[package.dependencies] -google-auth = ">=1.0.0" -requests-oauthlib = ">=0.7.0" - -[package.extras] -tool = ["click (>=6.0.0)"] - -[[package]] -name = "grpcio" -version = "1.51.1" -description = "HTTP/2-based RPC framework" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "grpcio-1.51.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:cc2bece1737b44d878cc1510ea04469a8073dbbcdd762175168937ae4742dfb3"}, - {file = "grpcio-1.51.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:e223a9793522680beae44671b9ed8f6d25bbe5ddf8887e66aebad5e0686049ef"}, - {file = "grpcio-1.51.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:24ac1154c4b2ab4a0c5326a76161547e70664cd2c39ba75f00fc8a2170964ea2"}, - {file = "grpcio-1.51.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4ef09f8997c4be5f3504cefa6b5c6cc3cf648274ce3cede84d4342a35d76db6"}, - {file = "grpcio-1.51.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8a0b77e992c64880e6efbe0086fe54dfc0bbd56f72a92d9e48264dcd2a3db98"}, - {file = "grpcio-1.51.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:eacad297ea60c72dd280d3353d93fb1dcca952ec11de6bb3c49d12a572ba31dd"}, - {file = "grpcio-1.51.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:16c71740640ba3a882f50b01bf58154681d44b51f09a5728180a8fdc66c67bd5"}, - {file = "grpcio-1.51.1-cp310-cp310-win32.whl", hash = "sha256:29cb97d41a4ead83b7bcad23bdb25bdd170b1e2cba16db6d3acbb090bc2de43c"}, - {file = "grpcio-1.51.1-cp310-cp310-win_amd64.whl", hash = "sha256:9ff42c5620b4e4530609e11afefa4a62ca91fa0abb045a8957e509ef84e54d30"}, - {file = "grpcio-1.51.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:bc59f7ba87972ab236f8669d8ca7400f02a0eadf273ca00e02af64d588046f02"}, - {file = "grpcio-1.51.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:3c2b3842dcf870912da31a503454a33a697392f60c5e2697c91d133130c2c85d"}, - {file = "grpcio-1.51.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22b011674090594f1f3245960ced7386f6af35485a38901f8afee8ad01541dbd"}, - {file = "grpcio-1.51.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49d680356a975d9c66a678eb2dde192d5dc427a7994fb977363634e781614f7c"}, - {file = "grpcio-1.51.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:094e64236253590d9d4075665c77b329d707b6fca864dd62b144255e199b4f87"}, - {file = "grpcio-1.51.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:257478300735ce3c98d65a930bbda3db172bd4e00968ba743e6a1154ea6edf10"}, - {file = "grpcio-1.51.1-cp311-cp311-win32.whl", hash = "sha256:5a6ebcdef0ef12005d56d38be30f5156d1cb3373b52e96f147f4a24b0ddb3a9d"}, - {file = "grpcio-1.51.1-cp311-cp311-win_amd64.whl", hash = "sha256:3f9b0023c2c92bebd1be72cdfca23004ea748be1813a66d684d49d67d836adde"}, - {file = "grpcio-1.51.1-cp37-cp37m-linux_armv7l.whl", hash = "sha256:cd3baccea2bc5c38aeb14e5b00167bd4e2373a373a5e4d8d850bd193edad150c"}, - {file = "grpcio-1.51.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:17ec9b13cec4a286b9e606b48191e560ca2f3bbdf3986f91e480a95d1582e1a7"}, - {file = "grpcio-1.51.1-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:fbdbe9a849854fe484c00823f45b7baab159bdd4a46075302281998cb8719df5"}, - {file = "grpcio-1.51.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31bb6bc7ff145e2771c9baf612f4b9ebbc9605ccdc5f3ff3d5553de7fc0e0d79"}, - {file = "grpcio-1.51.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e473525c28251558337b5c1ad3fa969511e42304524a4e404065e165b084c9e4"}, - {file = "grpcio-1.51.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6f0b89967ee11f2b654c23b27086d88ad7bf08c0b3c2a280362f28c3698b2896"}, - {file = "grpcio-1.51.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7942b32a291421460d6a07883033e392167d30724aa84987e6956cd15f1a21b9"}, - {file = "grpcio-1.51.1-cp37-cp37m-win32.whl", hash = "sha256:f96ace1540223f26fbe7c4ebbf8a98e3929a6aa0290c8033d12526847b291c0f"}, - {file = "grpcio-1.51.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f1fec3abaf274cdb85bf3878167cfde5ad4a4d97c68421afda95174de85ba813"}, - {file = "grpcio-1.51.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:0e1a9e1b4a23808f1132aa35f968cd8e659f60af3ffd6fb00bcf9a65e7db279f"}, - {file = "grpcio-1.51.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:6df3b63538c362312bc5fa95fb965069c65c3ea91d7ce78ad9c47cab57226f54"}, - {file = "grpcio-1.51.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:172405ca6bdfedd6054c74c62085946e45ad4d9cec9f3c42b4c9a02546c4c7e9"}, - {file = "grpcio-1.51.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:506b9b7a4cede87d7219bfb31014d7b471cfc77157da9e820a737ec1ea4b0663"}, - {file = "grpcio-1.51.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fb93051331acbb75b49a2a0fd9239c6ba9528f6bdc1dd400ad1cb66cf864292"}, - {file = "grpcio-1.51.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5dca372268c6ab6372d37d6b9f9343e7e5b4bc09779f819f9470cd88b2ece3c3"}, - {file = "grpcio-1.51.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:471d39d3370ca923a316d49c8aac66356cea708a11e647e3bdc3d0b5de4f0a40"}, - {file = "grpcio-1.51.1-cp38-cp38-win32.whl", hash = "sha256:75e29a90dc319f0ad4d87ba6d20083615a00d8276b51512e04ad7452b5c23b04"}, - {file = "grpcio-1.51.1-cp38-cp38-win_amd64.whl", hash = "sha256:f1158bccbb919da42544a4d3af5d9296a3358539ffa01018307337365a9a0c64"}, - {file = "grpcio-1.51.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:59dffade859f157bcc55243714d57b286da6ae16469bf1ac0614d281b5f49b67"}, - {file = "grpcio-1.51.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:dad6533411d033b77f5369eafe87af8583178efd4039c41d7515d3336c53b4f1"}, - {file = "grpcio-1.51.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:4c4423ea38a7825b8fed8934d6d9aeebdf646c97e3c608c3b0bcf23616f33877"}, - {file = "grpcio-1.51.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0dc5354e38e5adf2498312f7241b14c7ce3484eefa0082db4297189dcbe272e6"}, - {file = "grpcio-1.51.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97d67983189e2e45550eac194d6234fc38b8c3b5396c153821f2d906ed46e0ce"}, - {file = "grpcio-1.51.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:538d981818e49b6ed1e9c8d5e5adf29f71c4e334e7d459bf47e9b7abb3c30e09"}, - {file = "grpcio-1.51.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9235dcd5144a83f9ca6f431bd0eccc46b90e2c22fe27b7f7d77cabb2fb515595"}, - {file = "grpcio-1.51.1-cp39-cp39-win32.whl", hash = "sha256:aacb54f7789ede5cbf1d007637f792d3e87f1c9841f57dd51abf89337d1b8472"}, - {file = "grpcio-1.51.1-cp39-cp39-win_amd64.whl", hash = "sha256:2b170eaf51518275c9b6b22ccb59450537c5a8555326fd96ff7391b5dd75303c"}, - {file = "grpcio-1.51.1.tar.gz", hash = "sha256:e6dfc2b6567b1c261739b43d9c59d201c1b89e017afd9e684d85aa7a186c9f7a"}, -] - -[package.extras] -protobuf = ["grpcio-tools (>=1.51.1)"] - -[[package]] -name = "gym" -version = "0.21.0" -description = "Gym: A universal API for reinforcement learning environments." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "gym-0.21.0.tar.gz", hash = "sha256:0fd1ce165c754b4017e37a617b097c032b8c3feb8a0394ccc8777c7c50dddff3"}, -] - -[package.dependencies] -box2d-py = {version = "2.3.5", optional = true, markers = "extra == \"box2d\""} -cloudpickle = ">=1.2.0" -numpy = ">=1.18.0" -pyglet = {version = ">=1.4.0", optional = true, markers = "extra == \"box2d\""} - -[package.extras] -accept-rom-license = ["autorom[accept-rom-license] (>=0.4.2,<0.5.0)"] -all = ["ale-py (>=0.7.1,<0.8.0)", "ale-py (>=0.7.1,<0.8.0)", "box2d-py (==2.3.5)", "box2d-py (==2.3.5)", "lz4 (>=3.1.0)", "lz4 (>=3.1.0)", "mujoco_py (>=1.50,<2.0)", "mujoco_py (>=1.50,<2.0)", "pyglet (>=1.4.0)", "pyglet (>=1.4.0)", "pyglet (>=1.4.0)", "pyglet (>=1.4.0)", "scipy (>=1.4.1)", "scipy (>=1.4.1)"] -atari = ["ale-py (>=0.7.1,<0.8.0)"] -box2d = ["box2d-py (==2.3.5)", "pyglet (>=1.4.0)"] -classic-control = ["pyglet (>=1.4.0)"] -mujoco = ["mujoco_py (>=1.50,<2.0)"] -nomujoco = ["ale-py (>=0.7.1,<0.8.0)", "box2d-py (==2.3.5)", "lz4 (>=3.1.0)", "pyglet (>=1.4.0)", "pyglet (>=1.4.0)", "scipy (>=1.4.1)"] -other = ["lz4 (>=3.1.0)"] -robotics = ["mujoco_py (>=1.50,<2.0)"] -toy-text = ["scipy (>=1.4.1)"] - -[[package]] -name = "gym3" -version = "0.3.3" -description = "Vectorized Reinforcement Learning Environment Interface" -category = "main" -optional = false -python-versions = ">=3.6.0" -files = [ - {file = "gym3-0.3.3-py3-none-any.whl", hash = "sha256:bacc0e124f8ce5e1d8a9dceb85725123332954f13ef4e226133506597548838a"}, -] - -[package.dependencies] -cffi = ">=1.13.0,<2.0.0" -glfw = ">=1.8.6,<2.0.0" -imageio = ">=2.6.0,<3.0.0" -imageio-ffmpeg = ">=0.3.0,<0.4.0" -moderngl = ">=5.5.4,<6.0.0" -numpy = ">=1.11.0,<2.0.0" - -[package.extras] -test = ["gym (==0.17.2)", "gym-retro (==0.8.0)", "mpi4py (==3.0.3)", "pytest (==5.2.1)", "pytest-benchmark (==3.2.2)", "tensorflow (==1.15.0)"] - -[[package]] -name = "html5lib" -version = "1.1" -description = "HTML parser based on the WHATWG HTML specification" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, - {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, -] - -[package.dependencies] -six = ">=1.9" -webencodings = "*" - -[package.extras] -all = ["chardet (>=2.2)", "genshi", "lxml"] -chardet = ["chardet (>=2.2)"] -genshi = ["genshi"] -lxml = ["lxml"] - -[[package]] -name = "huggingface-hub" -version = "0.12.0" -description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" -category = "main" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "huggingface_hub-0.12.0-py3-none-any.whl", hash = "sha256:93809eabbfb2058a808bddf8b2a70f645de3f9df73ce87ddf5163d4c74b71c0c"}, - {file = "huggingface_hub-0.12.0.tar.gz", hash = "sha256:da82c9ec8f9d8f976ffd3fd8249d20bb35c2dd3145a9f7ca1106f0ebefd9afa0"}, -] - -[package.dependencies] -filelock = "*" -packaging = ">=20.9" -pyyaml = ">=5.1" -requests = "*" -tqdm = ">=4.42.1" -typing-extensions = ">=3.7.4.3" - -[package.extras] -all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "black (==22.3)", "flake8 (>=3.8.3)", "flake8-bugbear", "isort (>=5.5.4)", "jedi", "mypy (==0.982)", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] -cli = ["InquirerPy (==0.3.4)"] -dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "black (==22.3)", "flake8 (>=3.8.3)", "flake8-bugbear", "isort (>=5.5.4)", "jedi", "mypy (==0.982)", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] -fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] -quality = ["black (==22.3)", "flake8 (>=3.8.3)", "flake8-bugbear", "isort (>=5.5.4)", "mypy (==0.982)"] -tensorflow = ["graphviz", "pydot", "tensorflow"] -testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "isort (>=5.5.4)", "jedi", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "soundfile"] -torch = ["torch"] -typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] - -[[package]] -name = "idna" -version = "3.4" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] - -[[package]] -name = "imageio" -version = "2.25.0" -description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "imageio-2.25.0-py3-none-any.whl", hash = "sha256:9ef2fdef1235eef849b1aea399f08508493624a2a2c8cc3bba957dabb7d0b79f"}, - {file = "imageio-2.25.0.tar.gz", hash = "sha256:b80796a1f8c38c697a940a2ad7397ee28900d5c4e51061b9a67d16aca867f33e"}, -] - -[package.dependencies] -numpy = "*" -pillow = ">=8.3.2" - -[package.extras] -all-plugins = ["astropy", "av", "imageio-ffmpeg", "opencv-python", "psutil", "tifffile"] -all-plugins-pypy = ["av", "imageio-ffmpeg", "psutil", "tifffile"] -build = ["wheel"] -dev = ["black", "flake8", "fsspec[github]", "invoke", "pytest", "pytest-cov"] -docs = ["numpydoc", "pydata-sphinx-theme", "sphinx (<6)"] -ffmpeg = ["imageio-ffmpeg", "psutil"] -fits = ["astropy"] -full = ["astropy", "av", "black", "flake8", "fsspec[github]", "gdal", "imageio-ffmpeg", "invoke", "itk", "numpydoc", "opencv-python", "psutil", "pydata-sphinx-theme", "pytest", "pytest-cov", "sphinx (<6)", "tifffile", "wheel"] -gdal = ["gdal"] -itk = ["itk"] -linting = ["black", "flake8"] -opencv = ["opencv-python"] -pyav = ["av"] -test = ["fsspec[github]", "invoke", "pytest", "pytest-cov"] -tifffile = ["tifffile"] - -[[package]] -name = "imageio-ffmpeg" -version = "0.3.0" -description = "FFMPEG wrapper for Python" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "imageio-ffmpeg-0.3.0.tar.gz", hash = "sha256:28500544acdebc195159d53a4670b76d596f368b218317bad5d3cbf43b00d6c2"}, - {file = "imageio_ffmpeg-0.3.0-py3-none-macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:f99476aa42aac2ca0657483b417874a825b2f526aaa8a7a823b8a803f366caab"}, - {file = "imageio_ffmpeg-0.3.0-py3-none-manylinux2010_x86_64.whl", hash = "sha256:f3d4096bf6e211540c4f6b9628c56d8e700cf12027ed842724173ab9c6666d1a"}, - {file = "imageio_ffmpeg-0.3.0-py3-none-win32.whl", hash = "sha256:400345dd194f2cb2b424294aa0f3c90afce1de96879ffe3266afeece3494d93c"}, - {file = "imageio_ffmpeg-0.3.0-py3-none-win_amd64.whl", hash = "sha256:991416c0eed0d221229e67342b8264a8b9defdec61d8a9e7688b90dbb838fb1e"}, -] - -[[package]] -name = "importlib-metadata" -version = "4.13.0" -description = "Read metadata from Python packages" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "importlib_metadata-4.13.0-py3-none-any.whl", hash = "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116"}, - {file = "importlib_metadata-4.13.0.tar.gz", hash = "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d"}, -] - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -perf = ["ipython"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] - -[[package]] -name = "importlib-resources" -version = "5.10.2" -description = "Read resources from Python packages" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "importlib_resources-5.10.2-py3-none-any.whl", hash = "sha256:7d543798b0beca10b6a01ac7cafda9f822c54db9e8376a6bf57e0cbd74d486b6"}, - {file = "importlib_resources-5.10.2.tar.gz", hash = "sha256:e4a96c8cc0339647ff9a5e0550d9f276fc5a01ffa276012b58ec108cfd7b8484"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[[package]] -name = "ipykernel" -version = "6.20.2" -description = "IPython Kernel for Jupyter" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "ipykernel-6.20.2-py3-none-any.whl", hash = "sha256:5d0675d5f48bf6a95fd517d7b70bcb3b2c5631b2069949b5c2d6e1d7477fb5a0"}, - {file = "ipykernel-6.20.2.tar.gz", hash = "sha256:1893c5b847033cd7a58f6843b04a9349ffb1031bc6588401cadc9adb58da428e"}, -] - -[package.dependencies] -appnope = {version = "*", markers = "platform_system == \"Darwin\""} -comm = ">=0.1.1" -debugpy = ">=1.0" -ipython = ">=7.23.1" -jupyter-client = ">=6.1.12" -matplotlib-inline = ">=0.1" -nest-asyncio = "*" -packaging = "*" -psutil = "*" -pyzmq = ">=17" -tornado = ">=6.1" -traitlets = ">=5.4.0" - -[package.extras] -cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] -pyqt5 = ["pyqt5"] -pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "ipython" -version = "8.10.0" -description = "IPython: Productive Interactive Computing" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "ipython-8.10.0-py3-none-any.whl", hash = "sha256:b38c31e8fc7eff642fc7c597061fff462537cf2314e3225a19c906b7b0d8a345"}, - {file = "ipython-8.10.0.tar.gz", hash = "sha256:b13a1d6c1f5818bd388db53b7107d17454129a70de2b87481d555daede5eb49e"}, -] - -[package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -decorator = "*" -jedi = ">=0.16" -matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=3.0.30,<3.1.0" -pygments = ">=2.4.0" -stack-data = "*" -traitlets = ">=5" - -[package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] -black = ["black"] -doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] -kernel = ["ipykernel"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["ipywidgets", "notebook"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] - -[[package]] -name = "ipython-genutils" -version = "0.2.0" -description = "Vestigial utilities from IPython" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, - {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, -] - -[[package]] -name = "ipywidgets" -version = "8.0.4" -description = "Jupyter interactive widgets" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ipywidgets-8.0.4-py3-none-any.whl", hash = "sha256:ebb195e743b16c3947fe8827190fb87b4d00979c0fbf685afe4d2c4927059fa1"}, - {file = "ipywidgets-8.0.4.tar.gz", hash = "sha256:c0005a77a47d77889cafed892b58e33b4a2a96712154404c6548ec22272811ea"}, -] - -[package.dependencies] -ipykernel = ">=4.5.1" -ipython = ">=6.1.0" -jupyterlab-widgets = ">=3.0,<4.0" -traitlets = ">=4.3.1" -widgetsnbextension = ">=4.0,<5.0" - -[package.extras] -test = ["jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] - -[[package]] -name = "isoduration" -version = "20.11.0" -description = "Operations with ISO 8601 durations" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, - {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, -] - -[package.dependencies] -arrow = ">=0.15.0" - -[[package]] -name = "jaraco-classes" -version = "3.2.3" -description = "Utility functions for Python class constructs" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, - {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, -] - -[package.dependencies] -more-itertools = "*" - -[package.extras] -docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[[package]] -name = "jedi" -version = "0.18.2" -description = "An autocompletion tool for Python that can be used for text editors." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, - {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, -] - -[package.dependencies] -parso = ">=0.8.0,<0.9.0" - -[package.extras] -docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] - -[[package]] -name = "jeepney" -version = "0.8.0" -description = "Low-level, pure Python DBus protocol wrapper." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, - {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, -] - -[package.extras] -test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] -trio = ["async_generator", "trio"] - -[[package]] -name = "jinja2" -version = "3.1.2" -description = "A very fast and expressive template engine." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "jsonpointer" -version = "2.3" -description = "Identify specific nodes in a JSON document (RFC 6901)" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "jsonpointer-2.3-py2.py3-none-any.whl", hash = "sha256:51801e558539b4e9cd268638c078c6c5746c9ac96bc38152d443400e4f3793e9"}, - {file = "jsonpointer-2.3.tar.gz", hash = "sha256:97cba51526c829282218feb99dab1b1e6bdf8efd1c43dc9d57be093c0d69c99a"}, -] - -[[package]] -name = "jsonschema" -version = "4.17.3" -description = "An implementation of JSON Schema validation for Python" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, - {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, -] - -[package.dependencies] -attrs = ">=17.4.0" -fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} -pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" -rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} -uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format-nongpl\""} - -[package.extras] -format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] - -[[package]] -name = "jupyter" -version = "1.0.0" -description = "Jupyter metapackage. Install all the Jupyter components in one go." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, - {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"}, - {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, -] - -[package.dependencies] -ipykernel = "*" -ipywidgets = "*" -jupyter-console = "*" -nbconvert = "*" -notebook = "*" -qtconsole = "*" - -[[package]] -name = "jupyter-client" -version = "7.4.9" -description = "Jupyter protocol implementation and client libraries" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jupyter_client-7.4.9-py3-none-any.whl", hash = "sha256:214668aaea208195f4c13d28eb272ba79f945fc0cf3f11c7092c20b2ca1980e7"}, - {file = "jupyter_client-7.4.9.tar.gz", hash = "sha256:52be28e04171f07aed8f20e1616a5a552ab9fee9cbbe6c1896ae170c3880d392"}, -] - -[package.dependencies] -entrypoints = "*" -jupyter-core = ">=4.9.2" -nest-asyncio = ">=1.5.4" -python-dateutil = ">=2.8.2" -pyzmq = ">=23.0" -tornado = ">=6.2" -traitlets = "*" - -[package.extras] -doc = ["ipykernel", "myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] -test = ["codecov", "coverage", "ipykernel (>=6.12)", "ipython", "mypy", "pre-commit", "pytest", "pytest-asyncio (>=0.18)", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "jupyter-console" -version = "6.4.4" -description = "Jupyter terminal console" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jupyter_console-6.4.4-py3-none-any.whl", hash = "sha256:756df7f4f60c986e7bc0172e4493d3830a7e6e75c08750bbe59c0a5403ad6dee"}, - {file = "jupyter_console-6.4.4.tar.gz", hash = "sha256:172f5335e31d600df61613a97b7f0352f2c8250bbd1092ef2d658f77249f89fb"}, -] - -[package.dependencies] -ipykernel = "*" -ipython = "*" -jupyter-client = ">=7.0.0" -prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" -pygments = "*" - -[package.extras] -test = ["pexpect"] - -[[package]] -name = "jupyter-core" -version = "5.1.3" -description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_core-5.1.3-py3-none-any.whl", hash = "sha256:d23ab7db81ca1759f13780cd6b65f37f59bf8e0186ac422d5ca4982cc7d56716"}, - {file = "jupyter_core-5.1.3.tar.gz", hash = "sha256:82e1cff0ef804c38677eff7070d5ff1d45037fef01a2d9ba9e6b7b8201831e9f"}, -] - -[package.dependencies] -platformdirs = ">=2.5" -pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} -traitlets = ">=5.3" - -[package.extras] -docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] -test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "jupyter-events" -version = "0.6.3" -description = "Jupyter Event System library" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jupyter_events-0.6.3-py3-none-any.whl", hash = "sha256:57a2749f87ba387cd1bfd9b22a0875b889237dbf2edc2121ebb22bde47036c17"}, - {file = "jupyter_events-0.6.3.tar.gz", hash = "sha256:9a6e9995f75d1b7146b436ea24d696ce3a35bfa8bfe45e0c33c334c79464d0b3"}, -] - -[package.dependencies] -jsonschema = {version = ">=3.2.0", extras = ["format-nongpl"]} -python-json-logger = ">=2.0.4" -pyyaml = ">=5.3" -rfc3339-validator = "*" -rfc3986-validator = ">=0.1.1" -traitlets = ">=5.3" - -[package.extras] -cli = ["click", "rich"] -docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] -test = ["click", "coverage", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "pytest-cov", "rich"] - -[[package]] -name = "jupyter-server" -version = "2.1.0" -description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_server-2.1.0-py3-none-any.whl", hash = "sha256:90cd6f2bd0581ddd9b2dbe82026a0f4c228a1d95c86e22460efbfdfc931fcf56"}, - {file = "jupyter_server-2.1.0.tar.gz", hash = "sha256:efaae5e4f0d5f22c7f2f2dc848635036ee74a2df02abed52d30d9d95121ad382"}, -] - -[package.dependencies] -anyio = ">=3.1.0,<4" -argon2-cffi = "*" -jinja2 = "*" -jupyter-client = ">=7.4.4" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" -jupyter-events = ">=0.4.0" -jupyter-server-terminals = "*" -nbconvert = ">=6.4.4" -nbformat = ">=5.3.0" -packaging = "*" -prometheus-client = "*" -pywinpty = {version = "*", markers = "os_name == \"nt\""} -pyzmq = ">=24" -send2trash = "*" -terminado = ">=0.8.3" -tornado = ">=6.2.0" -traitlets = ">=5.6.0" -websocket-client = "*" - -[package.extras] -docs = ["docutils (<0.20)", "ipykernel", "jinja2", "jupyter-client", "jupyter-server", "mistune (<1.0.0)", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] -test = ["ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.4)", "pytest-timeout", "requests"] - -[[package]] -name = "jupyter-server-terminals" -version = "0.4.4" -description = "A Jupyter Server Extension Providing Terminals." -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_server_terminals-0.4.4-py3-none-any.whl", hash = "sha256:75779164661cec02a8758a5311e18bb8eb70c4e86c6b699403100f1585a12a36"}, - {file = "jupyter_server_terminals-0.4.4.tar.gz", hash = "sha256:57ab779797c25a7ba68e97bcfb5d7740f2b5e8a83b5e8102b10438041a7eac5d"}, -] - -[package.dependencies] -pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} -terminado = ">=0.8.3" - -[package.extras] -docs = ["jinja2", "jupyter-server", "mistune (<3.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] -test = ["coverage", "jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-cov", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] - -[[package]] -name = "jupyterlab-pygments" -version = "0.2.2" -description = "Pygments theme using JupyterLab CSS variables" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"}, - {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, -] - -[[package]] -name = "jupyterlab-widgets" -version = "3.0.5" -description = "Jupyter interactive widgets for JupyterLab" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jupyterlab_widgets-3.0.5-py3-none-any.whl", hash = "sha256:a04a42e50231b355b7087e16a818f541e53589f7647144ea0344c4bf16f300e5"}, - {file = "jupyterlab_widgets-3.0.5.tar.gz", hash = "sha256:eeaecdeaf6c03afc960ddae201ced88d5979b4ca9c3891bcb8f6631af705f5ef"}, -] - -[[package]] -name = "keyring" -version = "23.13.1" -description = "Store and access your passwords safely." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "keyring-23.13.1-py3-none-any.whl", hash = "sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd"}, - {file = "keyring-23.13.1.tar.gz", hash = "sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678"}, -] - -[package.dependencies] -importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} -"jaraco.classes" = "*" -jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} -pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} -SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} - -[package.extras] -completion = ["shtab"] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[[package]] -name = "kiwisolver" -version = "1.4.4" -description = "A fast implementation of the Cassowary constraint solver" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, - {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, -] - -[[package]] -name = "lockfile" -version = "0.12.2" -description = "Platform-independent file locking module" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, - {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, -] - -[[package]] -name = "markdown" -version = "3.4.1" -description = "Python implementation of Markdown." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Markdown-3.4.1-py3-none-any.whl", hash = "sha256:08fb8465cffd03d10b9dd34a5c3fea908e20391a2a90b88d66362cb05beed186"}, - {file = "Markdown-3.4.1.tar.gz", hash = "sha256:3b809086bb6efad416156e00a0da66fe47618a5d6918dd688f53f40c8e4cfeff"}, -] - -[package.extras] -testing = ["coverage", "pyyaml"] - -[[package]] -name = "markupsafe" -version = "2.1.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] - -[[package]] -name = "matplotlib" -version = "3.6.3" -description = "Python plotting package" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "matplotlib-3.6.3-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:80c166a0e28512e26755f69040e6bf2f946a02ffdb7c00bf6158cca3d2b146e6"}, - {file = "matplotlib-3.6.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:eb9421c403ffd387fbe729de6d9a03005bf42faba5e8432f4e51e703215b49fc"}, - {file = "matplotlib-3.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5223affa21050fb6118353c1380c15e23aedfb436bf3e162c26dc950617a7519"}, - {file = "matplotlib-3.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d00c248ab6b92bea3f8148714837937053a083ff03b4c5e30ed37e28fc0e7e56"}, - {file = "matplotlib-3.6.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca94f0362f6b6f424b555b956971dcb94b12d0368a6c3e07dc7a40d32d6d873d"}, - {file = "matplotlib-3.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59400cc9451094b7f08cc3f321972e6e1db4cd37a978d4e8a12824bf7fd2f03b"}, - {file = "matplotlib-3.6.3-cp310-cp310-win32.whl", hash = "sha256:57ad1aee29043163374bfa8990e1a2a10ff72c9a1bfaa92e9c46f6ea59269121"}, - {file = "matplotlib-3.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:1fcc4cad498533d3c393a160975acc9b36ffa224d15a6b90ae579eacee5d8579"}, - {file = "matplotlib-3.6.3-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:d2cfaa7fd62294d945b8843ea24228a27c8e7c5b48fa634f3c168153b825a21b"}, - {file = "matplotlib-3.6.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c3f08df2ac4636249b8bc7a85b8b82c983bef1441595936f62c2918370ca7e1d"}, - {file = "matplotlib-3.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff2aa84e74f80891e6bcf292ebb1dd57714ffbe13177642d65fee25384a30894"}, - {file = "matplotlib-3.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11011c97d62c1db7bc20509572557842dbb8c2a2ddd3dd7f20501aa1cde3e54e"}, - {file = "matplotlib-3.6.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c235bf9be052347373f589e018988cad177abb3f997ab1a2e2210c41562cc0c"}, - {file = "matplotlib-3.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bebcff4c3ed02c6399d47329f3554193abd824d3d53b5ca02cf583bcd94470e2"}, - {file = "matplotlib-3.6.3-cp311-cp311-win32.whl", hash = "sha256:d5f18430f5cfa5571ab8f4c72c89af52aa0618e864c60028f11a857d62200cba"}, - {file = "matplotlib-3.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:dfba7057609ca9567b9704626756f0142e97ec8c5ba2c70c6e7bd1c25ef99f06"}, - {file = "matplotlib-3.6.3-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:9fb8fb19d03abf3c5dab89a8677e62c4023632f919a62b6dd1d6d2dbf42cd9f5"}, - {file = "matplotlib-3.6.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:bbf269e1d24bc25247095d71c7a969813f7080e2a7c6fa28931a603f747ab012"}, - {file = "matplotlib-3.6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:994637e2995b0342699b396a320698b07cd148bbcf2dd2fa2daba73f34dd19f2"}, - {file = "matplotlib-3.6.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:77b384cee7ab8cf75ffccbfea351a09b97564fc62d149827a5e864bec81526e5"}, - {file = "matplotlib-3.6.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:73b93af33634ed919e72811c9703e1105185cd3fb46d76f30b7f4cfbbd063f89"}, - {file = "matplotlib-3.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:debeab8e2ab07e5e3dac33e12456da79c7e104270d2b2d1df92b9e40347cca75"}, - {file = "matplotlib-3.6.3-cp38-cp38-win32.whl", hash = "sha256:acc3b1a4bddbf56fe461e36fb9ef94c2cb607fc90d24ccc650040bfcc7610de4"}, - {file = "matplotlib-3.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:1183877d008c752d7d535396096c910f4663e4b74a18313adee1213328388e1e"}, - {file = "matplotlib-3.6.3-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:6adc441b5b2098a4b904bbf9d9e92fb816fef50c55aa2ea6a823fc89b94bb838"}, - {file = "matplotlib-3.6.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:6d81b11ede69e3a751424b98dc869c96c10256b2206bfdf41f9c720eee86844c"}, - {file = "matplotlib-3.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:29f17b7f2e068dc346687cbdf80b430580bab42346625821c2d3abf3a1ec5417"}, - {file = "matplotlib-3.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f56a7252eee8f3438447f75f5e1148a1896a2756a92285fe5d73bed6deebff4"}, - {file = "matplotlib-3.6.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbddfeb1495484351fb5b30cf5bdf06b3de0bc4626a707d29e43dfd61af2a780"}, - {file = "matplotlib-3.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:809119d1cba3ece3c9742eb01827fe7a0e781ea3c5d89534655a75e07979344f"}, - {file = "matplotlib-3.6.3-cp39-cp39-win32.whl", hash = "sha256:e0a64d7cc336b52e90f59e6d638ae847b966f68582a7af041e063d568e814740"}, - {file = "matplotlib-3.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:79e501eb847f4a489eb7065bb8d3187117f65a4c02d12ea3a19d6c5bef173bcc"}, - {file = "matplotlib-3.6.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2787a16df07370dcba385fe20cdd0cc3cfaabd3c873ddabca78c10514c799721"}, - {file = "matplotlib-3.6.3-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68d94a436f62b8a861bf3ace82067a71bafb724b4e4f9133521e4d8012420dd7"}, - {file = "matplotlib-3.6.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b409b2790cf8d7c1ef35920f01676d2ae7afa8241844e7aa5484fdf493a9a0"}, - {file = "matplotlib-3.6.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:faff486b36530a836a6b4395850322e74211cd81fc17f28b4904e1bd53668e3e"}, - {file = "matplotlib-3.6.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:38d38cb1ea1d80ee0f6351b65c6f76cad6060bbbead015720ba001348ae90f0c"}, - {file = "matplotlib-3.6.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12f999661589981e74d793ee2f41b924b3b87d65fd929f6153bf0f30675c59b1"}, - {file = "matplotlib-3.6.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01b7f521a9a73c383825813af255f8c4485d1706e4f3e2ed5ae771e4403a40ab"}, - {file = "matplotlib-3.6.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9ceebaf73f1a3444fa11014f38b9da37ff7ea328d6efa1652241fe3777bfdab9"}, - {file = "matplotlib-3.6.3.tar.gz", hash = "sha256:1f4d69707b1677560cd952544ee4962f68ff07952fb9069ff8c12b56353cb8c9"}, -] - -[package.dependencies] -contourpy = ">=1.0.1" -cycler = ">=0.10" -fonttools = ">=4.22.0" -kiwisolver = ">=1.0.1" -numpy = ">=1.19" -packaging = ">=20.0" -pillow = ">=6.2.0" -pyparsing = ">=2.2.1" -python-dateutil = ">=2.7" - -[[package]] -name = "matplotlib-inline" -version = "0.1.6" -description = "Inline Matplotlib backend for Jupyter" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, - {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, -] - -[package.dependencies] -traitlets = "*" - -[[package]] -name = "mistune" -version = "2.0.4" -description = "A sane Markdown parser with useful plugins and renderers" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "mistune-2.0.4-py2.py3-none-any.whl", hash = "sha256:182cc5ee6f8ed1b807de6b7bb50155df7b66495412836b9a74c8fbdfc75fe36d"}, - {file = "mistune-2.0.4.tar.gz", hash = "sha256:9ee0a66053e2267aba772c71e06891fa8f1af6d4b01d5e84e267b4570d4d9808"}, -] - -[[package]] -name = "moderngl" -version = "5.7.4" -description = "ModernGL: High performance rendering for Python 3" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "moderngl-5.7.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1719892e83bda0b433b254f1be22a41745ee6b5a4fd3a6ee5aa799756383d4f"}, - {file = "moderngl-5.7.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c6fdea10f5176b8018d2e5a05ed9fa5010b8ab24fcbabe64c05a943d50b9ba7d"}, - {file = "moderngl-5.7.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:396b2bc0a09d409b40e7c559bb1092ee327f5394b125e2ebfa9fc2951e27550d"}, - {file = "moderngl-5.7.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8eea6a083e8737bbe666e83c460a2628556f7df489987405fe33b27db3df386c"}, - {file = "moderngl-5.7.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca77be80c96c0585d7dd0f0b65815883fb5416f22de60875bec0f87f8c1c2b6b"}, - {file = "moderngl-5.7.4-cp310-cp310-win32.whl", hash = "sha256:48c3677f0303a2c5887dccd4ff3c06cc60bc54f05646bb4575f87dd69f65f83b"}, - {file = "moderngl-5.7.4-cp310-cp310-win_amd64.whl", hash = "sha256:7d28d49892923c2cc8eb145266af95ed99a0c4f3fc686228af941d1e0cdbd9bb"}, - {file = "moderngl-5.7.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dd2446134c7bd71c8d47606545ca7820cb411723edf77d2b09301651a2356e91"}, - {file = "moderngl-5.7.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d549c518624975652ad511659d2b27827d2aa9ccbf09b17b4b53afe4226b68c7"}, - {file = "moderngl-5.7.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4441cc13384c41b7434eb1eab42f1c305f6c9b3dd8665e98ad8dc1870ff83d38"}, - {file = "moderngl-5.7.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc921e7b716a0260eeb352d3c6fd1c0fa5edb434de89e0325fc58611d3929f9e"}, - {file = "moderngl-5.7.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdab10cbe2b87394440a3678c1445fe7fe687e82fd6b3ae7ddd76ec68766115a"}, - {file = "moderngl-5.7.4-cp311-cp311-win32.whl", hash = "sha256:631876e886aebf293a9afdf54160d46f1dc2646631750837ef04518044c4de5f"}, - {file = "moderngl-5.7.4-cp311-cp311-win_amd64.whl", hash = "sha256:38c5409df54f6601b4df94f61609ef7519bb570061333ba2f7d58bddef0963df"}, - {file = "moderngl-5.7.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:875fe5701061a7bbe833cbd42cd779c68748ed277b2ab1ec06be61972e3e846f"}, - {file = "moderngl-5.7.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb49672482406f539968b10f30d982578242a850dd7f071dc57b34fa88aebe3d"}, - {file = "moderngl-5.7.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f502d3ac58a776a57f1f524efbd05b6b95a601e087082dc8cd5cd71cb315c577"}, - {file = "moderngl-5.7.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:918f11262c4724e2515c4afc76ad57c6148d486fd6e7c3b1c04470f43f57f97b"}, - {file = "moderngl-5.7.4-cp37-cp37m-win32.whl", hash = "sha256:dce7cb87d7faced6f78e06c7e2fa607a79a50cb8ff0aed3dc9bca77b814ee042"}, - {file = "moderngl-5.7.4-cp37-cp37m-win_amd64.whl", hash = "sha256:dd010370e30bc52e65baee5061eb2ec6965adc2b08e81c232ccf7ec76553af5e"}, - {file = "moderngl-5.7.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:49546570a7eb4594cc1a4109fdef47a035ffb0b11cc3d38aafe92ab81dc6d50f"}, - {file = "moderngl-5.7.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:824f6dc34316530a617fea9e6a46d008cfe82a01e9d34ae308ad51ef127720a7"}, - {file = "moderngl-5.7.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cb8c76c77c47cf05c29bd1940d95a641ad1b6052b5b0d29ffca816295ca364e"}, - {file = "moderngl-5.7.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b923f6644989cde6675394f63027914546fc33a380148cec449176980c25e47"}, - {file = "moderngl-5.7.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe9a40751133744018dcb19289a1f798908b1eff1a8455803dfe1bc4028f0f34"}, - {file = "moderngl-5.7.4-cp38-cp38-win32.whl", hash = "sha256:fcc0e5b557a67137a5c6944faf4dde096cf5afab296d11e86bbf20ead043eddf"}, - {file = "moderngl-5.7.4-cp38-cp38-win_amd64.whl", hash = "sha256:8ffbad06fb39116406a8988d19fd073bbbf973513a376b3c6b181ae67408237b"}, - {file = "moderngl-5.7.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:82cd399b152f3a775c1f93ef3192980a9d3d2d1c51a9df07a329ce4e4fc82430"}, - {file = "moderngl-5.7.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eb6ad78ecfc06c0aab0be9706b71be5ee0ad443efbc4f6578a315da88dc3d4ef"}, - {file = "moderngl-5.7.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1d6c79fad12df622fa0dc8b832a2c624368cd949a0326f65ebc234891726068"}, - {file = "moderngl-5.7.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9630a42cefafaeb19a816e23de2869d855af39b880c38d9efc16b50e354297c4"}, - {file = "moderngl-5.7.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:395f96f81ea9b3c8fcd9cf1e5aedd9fe81ef0a2475922fe8f1657fbfdbd03397"}, - {file = "moderngl-5.7.4-cp39-cp39-win32.whl", hash = "sha256:512d9287a9e80bdc706c6f54b190820d8f3887619a574d5f996eb27ff2385777"}, - {file = "moderngl-5.7.4-cp39-cp39-win_amd64.whl", hash = "sha256:664a0089abc845bba2198fcadbe6d78adf65e4e5f8e117147f0d36353e9a2090"}, - {file = "moderngl-5.7.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2f8ec6ddb6141751f35734e8ce2222868da3fca57fbcb83ce4f28c93a5fcb91c"}, - {file = "moderngl-5.7.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4660a33a093d44237d40adf884a4b678dc7c1237a6d634a2ffa4652cd476aa19"}, - {file = "moderngl-5.7.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70477f355e45a8c2cce4f97818191ab28313e4203b15554214a417853ee8cfcb"}, - {file = "moderngl-5.7.4-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35f5e916d3d33753ec7a0611b5cf5addbe88a8a1aa3d292f2693808381bb19c5"}, - {file = "moderngl-5.7.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a2e50913ab8e53b3c8da792f4b75ff7afcd117e596346110ec085de535d03ef1"}, - {file = "moderngl-5.7.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9dc27da2e9225fc9df21fa0522cd77e781ee0a2d7b75a03449c963516fb9b96c"}, - {file = "moderngl-5.7.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bfd84ac24d141b490293487e63eacebc0f198d12049adfe44d08168fc89f979a"}, - {file = "moderngl-5.7.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3cde28a2091222f51a743561cebc8d80314042a7db9a8e723e8fa5f1ad6618d"}, - {file = "moderngl-5.7.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7579e66c345342f9b3fdf33e23107b874499979577b14014249856e73071c06"}, - {file = "moderngl-5.7.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3a6d180fab423cbbaac1ee37e4d76821bf3a13e79776597c85199876f3053635"}, - {file = "moderngl-5.7.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9c3e825088a0acfb0080f3ccc0332584f99868ed39bf986e44f03581f6d33128"}, - {file = "moderngl-5.7.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44a69c62e468fd71c84384041242194f81a88fdfe08799a5f01393729c9928bd"}, - {file = "moderngl-5.7.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7963e49cadb621b7ffbd5effe43ce6472afb535dd5c074924b95fdce54d289e"}, - {file = "moderngl-5.7.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c226cb05022372b4e6b841b47d7c67d9da026d93dd38801351ce679e70beacf"}, - {file = "moderngl-5.7.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a20a575d9a5cab62554fbcb7b53e5459a13f380ee2e5c4888e9b537ef575f1ca"}, - {file = "moderngl-5.7.4.tar.gz", hash = "sha256:20f821bf66b2811bc8648d7cf7f64402afff7619fea271f42a6ee85fe03e4041"}, -] - -[package.dependencies] -glcontext = ">=2.3.6,<3" - -[[package]] -name = "more-itertools" -version = "9.0.0" -description = "More routines for operating on iterables, beyond itertools" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "more-itertools-9.0.0.tar.gz", hash = "sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab"}, - {file = "more_itertools-9.0.0-py3-none-any.whl", hash = "sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41"}, -] - -[[package]] -name = "msgpack" -version = "1.0.4" -description = "MessagePack serializer" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250"}, - {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88"}, - {file = "msgpack-1.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467"}, - {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6"}, - {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa"}, - {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6"}, - {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba"}, - {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e"}, - {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db"}, - {file = "msgpack-1.0.4-cp310-cp310-win32.whl", hash = "sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef"}, - {file = "msgpack-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075"}, - {file = "msgpack-1.0.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52"}, - {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9"}, - {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9"}, - {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08"}, - {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8"}, - {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6"}, - {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae"}, - {file = "msgpack-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6"}, - {file = "msgpack-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661"}, - {file = "msgpack-1.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c"}, - {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0"}, - {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227"}, - {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff"}, - {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd"}, - {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e"}, - {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236"}, - {file = "msgpack-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44"}, - {file = "msgpack-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1"}, - {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d"}, - {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab"}, - {file = "msgpack-1.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb"}, - {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9"}, - {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e"}, - {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1"}, - {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e"}, - {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43"}, - {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243"}, - {file = "msgpack-1.0.4-cp38-cp38-win32.whl", hash = "sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2"}, - {file = "msgpack-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6"}, - {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae"}, - {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55"}, - {file = "msgpack-1.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da"}, - {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f"}, - {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92"}, - {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f"}, - {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624"}, - {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8"}, - {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae"}, - {file = "msgpack-1.0.4-cp39-cp39-win32.whl", hash = "sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c"}, - {file = "msgpack-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce"}, - {file = "msgpack-1.0.4.tar.gz", hash = "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f"}, -] - -[[package]] -name = "nbclassic" -version = "0.4.8" -description = "A web-based notebook environment for interactive computing" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "nbclassic-0.4.8-py3-none-any.whl", hash = "sha256:cbf05df5842b420d5cece0143462380ea9d308ff57c2dc0eb4d6e035b18fbfb3"}, - {file = "nbclassic-0.4.8.tar.gz", hash = "sha256:c74d8a500f8e058d46b576a41e5bc640711e1032cf7541dde5f73ea49497e283"}, -] - -[package.dependencies] -argon2-cffi = "*" -ipykernel = "*" -ipython-genutils = "*" -jinja2 = "*" -jupyter-client = ">=6.1.1" -jupyter-core = ">=4.6.1" -jupyter-server = ">=1.8" -nbconvert = ">=5" -nbformat = "*" -nest-asyncio = ">=1.5" -notebook-shim = ">=0.1.0" -prometheus-client = "*" -pyzmq = ">=17" -Send2Trash = ">=1.8.0" -terminado = ">=0.8.3" -tornado = ">=6.1" -traitlets = ">=4.2.1" - -[package.extras] -docs = ["myst-parser", "nbsphinx", "sphinx", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] -json-logging = ["json-logging"] -test = ["coverage", "nbval", "pytest", "pytest-cov", "pytest-playwright", "pytest-tornasync", "requests", "requests-unixsocket", "testpath"] - -[[package]] -name = "nbclient" -version = "0.7.2" -description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -category = "main" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "nbclient-0.7.2-py3-none-any.whl", hash = "sha256:d97ac6257de2794f5397609df754fcbca1a603e94e924eb9b99787c031ae2e7c"}, - {file = "nbclient-0.7.2.tar.gz", hash = "sha256:884a3f4a8c4fc24bb9302f263e0af47d97f0d01fe11ba714171b320c8ac09547"}, -] - -[package.dependencies] -jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" -nbformat = ">=5.1" -traitlets = ">=5.3" - -[package.extras] -dev = ["pre-commit"] -docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme"] -test = ["ipykernel", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] - -[[package]] -name = "nbconvert" -version = "7.2.8" -description = "Converting Jupyter Notebooks" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "nbconvert-7.2.8-py3-none-any.whl", hash = "sha256:ac57f2812175441a883f50c8ff113133ca65fe7ae5a9f1e3da3bfd1a70dce2ee"}, - {file = "nbconvert-7.2.8.tar.gz", hash = "sha256:ccedacde57a972836bfb46466485be29ed1364ed7c2f379f62bad47d340ece99"}, -] - -[package.dependencies] -beautifulsoup4 = "*" -bleach = "*" -defusedxml = "*" -jinja2 = ">=3.0" -jupyter-core = ">=4.7" -jupyterlab-pygments = "*" -markupsafe = ">=2.0" -mistune = ">=2.0.3,<3" -nbclient = ">=0.5.0" -nbformat = ">=5.1" -packaging = "*" -pandocfilters = ">=1.4.1" -pygments = ">=2.4.1" -tinycss2 = "*" -traitlets = ">=5.0" - -[package.extras] -all = ["nbconvert[docs,qtpdf,serve,test,webpdf]"] -docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] -qtpdf = ["nbconvert[qtpng]"] -qtpng = ["pyqtwebengine (>=5.15)"] -serve = ["tornado (>=6.1)"] -test = ["ipykernel", "ipywidgets (>=7)", "pre-commit", "pytest", "pytest-dependency"] -webpdf = ["pyppeteer (>=1,<1.1)"] - -[[package]] -name = "nbformat" -version = "5.7.3" -description = "The Jupyter Notebook format" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "nbformat-5.7.3-py3-none-any.whl", hash = "sha256:22a98a6516ca216002b0a34591af5bcb8072ca6c63910baffc901cfa07fefbf0"}, - {file = "nbformat-5.7.3.tar.gz", hash = "sha256:4b021fca24d3a747bf4e626694033d792d594705829e5e35b14ee3369f9f6477"}, -] - -[package.dependencies] -fastjsonschema = "*" -jsonschema = ">=2.6" -jupyter-core = "*" -traitlets = ">=5.1" - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["pep440", "pre-commit", "pytest", "testpath"] - -[[package]] -name = "nest-asyncio" -version = "1.5.6" -description = "Patch asyncio to allow nested event loops" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, - {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, -] - -[[package]] -name = "notebook" -version = "6.5.2" -description = "A web-based notebook environment for interactive computing" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "notebook-6.5.2-py3-none-any.whl", hash = "sha256:e04f9018ceb86e4fa841e92ea8fb214f8d23c1cedfde530cc96f92446924f0e4"}, - {file = "notebook-6.5.2.tar.gz", hash = "sha256:c1897e5317e225fc78b45549a6ab4b668e4c996fd03a04e938fe5e7af2bfffd0"}, -] - -[package.dependencies] -argon2-cffi = "*" -ipykernel = "*" -ipython-genutils = "*" -jinja2 = "*" -jupyter-client = ">=5.3.4" -jupyter-core = ">=4.6.1" -nbclassic = ">=0.4.7" -nbconvert = ">=5" -nbformat = "*" -nest-asyncio = ">=1.5" -prometheus-client = "*" -pyzmq = ">=17" -Send2Trash = ">=1.8.0" -terminado = ">=0.8.3" -tornado = ">=6.1" -traitlets = ">=4.2.1" - -[package.extras] -docs = ["myst-parser", "nbsphinx", "sphinx", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] -json-logging = ["json-logging"] -test = ["coverage", "nbval", "pytest", "pytest-cov", "requests", "requests-unixsocket", "selenium (==4.1.5)", "testpath"] - -[[package]] -name = "notebook-shim" -version = "0.2.2" -description = "A shim layer for notebook traits and config" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "notebook_shim-0.2.2-py3-none-any.whl", hash = "sha256:9c6c30f74c4fbea6fce55c1be58e7fd0409b1c681b075dcedceb005db5026949"}, - {file = "notebook_shim-0.2.2.tar.gz", hash = "sha256:090e0baf9a5582ff59b607af523ca2db68ff216da0c69956b62cab2ef4fc9c3f"}, -] - -[package.dependencies] -jupyter-server = ">=1.8,<3" - -[package.extras] -test = ["pytest", "pytest-console-scripts", "pytest-tornasync"] - -[[package]] -name = "numexpr" -version = "2.8.4" -description = "Fast numerical expression evaluator for NumPy" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "numexpr-2.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a75967d46b6bd56455dd32da6285e5ffabe155d0ee61eef685bbfb8dafb2e484"}, - {file = "numexpr-2.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db93cf1842f068247de631bfc8af20118bf1f9447cd929b531595a5e0efc9346"}, - {file = "numexpr-2.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bca95f4473b444428061d4cda8e59ac564dc7dc6a1dea3015af9805c6bc2946"}, - {file = "numexpr-2.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e34931089a6bafc77aaae21f37ad6594b98aa1085bb8b45d5b3cd038c3c17d9"}, - {file = "numexpr-2.8.4-cp310-cp310-win32.whl", hash = "sha256:f3a920bfac2645017110b87ddbe364c9c7a742870a4d2f6120b8786c25dc6db3"}, - {file = "numexpr-2.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:6931b1e9d4f629f43c14b21d44f3f77997298bea43790cfcdb4dd98804f90783"}, - {file = "numexpr-2.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9400781553541f414f82eac056f2b4c965373650df9694286b9bd7e8d413f8d8"}, - {file = "numexpr-2.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ee9db7598dd4001138b482342b96d78110dd77cefc051ec75af3295604dde6a"}, - {file = "numexpr-2.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff5835e8af9a212e8480003d731aad1727aaea909926fd009e8ae6a1cba7f141"}, - {file = "numexpr-2.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:655d84eb09adfee3c09ecf4a89a512225da153fdb7de13c447404b7d0523a9a7"}, - {file = "numexpr-2.8.4-cp311-cp311-win32.whl", hash = "sha256:5538b30199bfc68886d2be18fcef3abd11d9271767a7a69ff3688defe782800a"}, - {file = "numexpr-2.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:3f039321d1c17962c33079987b675fb251b273dbec0f51aac0934e932446ccc3"}, - {file = "numexpr-2.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c867cc36cf815a3ec9122029874e00d8fbcef65035c4a5901e9b120dd5d626a2"}, - {file = "numexpr-2.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:059546e8f6283ccdb47c683101a890844f667fa6d56258d48ae2ecf1b3875957"}, - {file = "numexpr-2.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:845a6aa0ed3e2a53239b89c1ebfa8cf052d3cc6e053c72805e8153300078c0b1"}, - {file = "numexpr-2.8.4-cp37-cp37m-win32.whl", hash = "sha256:a38664e699526cb1687aefd9069e2b5b9387da7feac4545de446141f1ef86f46"}, - {file = "numexpr-2.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eaec59e9bf70ff05615c34a8b8d6c7bd042bd9f55465d7b495ea5436f45319d0"}, - {file = "numexpr-2.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b318541bf3d8326682ebada087ba0050549a16d8b3fa260dd2585d73a83d20a7"}, - {file = "numexpr-2.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b076db98ca65eeaf9bd224576e3ac84c05e451c0bd85b13664b7e5f7b62e2c70"}, - {file = "numexpr-2.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f12cc851240f7911a47c91aaf223dba753e98e46dff3017282e633602e76a7"}, - {file = "numexpr-2.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c368aa35ae9b18840e78b05f929d3a7b3abccdba9630a878c7db74ca2368339"}, - {file = "numexpr-2.8.4-cp38-cp38-win32.whl", hash = "sha256:b96334fc1748e9ec4f93d5fadb1044089d73fb08208fdb8382ed77c893f0be01"}, - {file = "numexpr-2.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:a6d2d7740ae83ba5f3531e83afc4b626daa71df1ef903970947903345c37bd03"}, - {file = "numexpr-2.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:77898fdf3da6bb96aa8a4759a8231d763a75d848b2f2e5c5279dad0b243c8dfe"}, - {file = "numexpr-2.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df35324666b693f13a016bc7957de7cc4d8801b746b81060b671bf78a52b9037"}, - {file = "numexpr-2.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ac9cfe6d0078c5fc06ba1c1bbd20b8783f28c6f475bbabd3cad53683075cab"}, - {file = "numexpr-2.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df3a1f6b24214a1ab826e9c1c99edf1686c8e307547a9aef33910d586f626d01"}, - {file = "numexpr-2.8.4-cp39-cp39-win32.whl", hash = "sha256:7d71add384adc9119568d7e9ffa8a35b195decae81e0abf54a2b7779852f0637"}, - {file = "numexpr-2.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:9f096d707290a6a00b6ffdaf581ee37331109fb7b6c8744e9ded7c779a48e517"}, - {file = "numexpr-2.8.4.tar.gz", hash = "sha256:d5432537418d18691b9115d615d6daa17ee8275baef3edf1afbbf8bc69806147"}, -] - -[package.dependencies] -numpy = ">=1.13.3" - -[[package]] -name = "numpy" -version = "1.24.1" -description = "Fundamental package for array computing in Python" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "numpy-1.24.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:179a7ef0889ab769cc03573b6217f54c8bd8e16cef80aad369e1e8185f994cd7"}, - {file = "numpy-1.24.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b09804ff570b907da323b3d762e74432fb07955701b17b08ff1b5ebaa8cfe6a9"}, - {file = "numpy-1.24.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1b739841821968798947d3afcefd386fa56da0caf97722a5de53e07c4ccedc7"}, - {file = "numpy-1.24.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e3463e6ac25313462e04aea3fb8a0a30fb906d5d300f58b3bc2c23da6a15398"}, - {file = "numpy-1.24.1-cp310-cp310-win32.whl", hash = "sha256:b31da69ed0c18be8b77bfce48d234e55d040793cebb25398e2a7d84199fbc7e2"}, - {file = "numpy-1.24.1-cp310-cp310-win_amd64.whl", hash = "sha256:b07b40f5fb4fa034120a5796288f24c1fe0e0580bbfff99897ba6267af42def2"}, - {file = "numpy-1.24.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7094891dcf79ccc6bc2a1f30428fa5edb1e6fb955411ffff3401fb4ea93780a8"}, - {file = "numpy-1.24.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28e418681372520c992805bb723e29d69d6b7aa411065f48216d8329d02ba032"}, - {file = "numpy-1.24.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e274f0f6c7efd0d577744f52032fdd24344f11c5ae668fe8d01aac0422611df1"}, - {file = "numpy-1.24.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0044f7d944ee882400890f9ae955220d29b33d809a038923d88e4e01d652acd9"}, - {file = "numpy-1.24.1-cp311-cp311-win32.whl", hash = "sha256:442feb5e5bada8408e8fcd43f3360b78683ff12a4444670a7d9e9824c1817d36"}, - {file = "numpy-1.24.1-cp311-cp311-win_amd64.whl", hash = "sha256:de92efa737875329b052982e37bd4371d52cabf469f83e7b8be9bb7752d67e51"}, - {file = "numpy-1.24.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b162ac10ca38850510caf8ea33f89edcb7b0bb0dfa5592d59909419986b72407"}, - {file = "numpy-1.24.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26089487086f2648944f17adaa1a97ca6aee57f513ba5f1c0b7ebdabbe2b9954"}, - {file = "numpy-1.24.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caf65a396c0d1f9809596be2e444e3bd4190d86d5c1ce21f5fc4be60a3bc5b36"}, - {file = "numpy-1.24.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0677a52f5d896e84414761531947c7a330d1adc07c3a4372262f25d84af7bf7"}, - {file = "numpy-1.24.1-cp38-cp38-win32.whl", hash = "sha256:dae46bed2cb79a58d6496ff6d8da1e3b95ba09afeca2e277628171ca99b99db1"}, - {file = "numpy-1.24.1-cp38-cp38-win_amd64.whl", hash = "sha256:6ec0c021cd9fe732e5bab6401adea5a409214ca5592cd92a114f7067febcba0c"}, - {file = "numpy-1.24.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:28bc9750ae1f75264ee0f10561709b1462d450a4808cd97c013046073ae64ab6"}, - {file = "numpy-1.24.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:84e789a085aabef2f36c0515f45e459f02f570c4b4c4c108ac1179c34d475ed7"}, - {file = "numpy-1.24.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e669fbdcdd1e945691079c2cae335f3e3a56554e06bbd45d7609a6cf568c700"}, - {file = "numpy-1.24.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef85cf1f693c88c1fd229ccd1055570cb41cdf4875873b7728b6301f12cd05bf"}, - {file = "numpy-1.24.1-cp39-cp39-win32.whl", hash = "sha256:87a118968fba001b248aac90e502c0b13606721b1343cdaddbc6e552e8dfb56f"}, - {file = "numpy-1.24.1-cp39-cp39-win_amd64.whl", hash = "sha256:ddc7ab52b322eb1e40521eb422c4e0a20716c271a306860979d450decbb51b8e"}, - {file = "numpy-1.24.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed5fb71d79e771ec930566fae9c02626b939e37271ec285e9efaf1b5d4370e7d"}, - {file = "numpy-1.24.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad2925567f43643f51255220424c23d204024ed428afc5aad0f86f3ffc080086"}, - {file = "numpy-1.24.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cfa1161c6ac8f92dea03d625c2d0c05e084668f4a06568b77a25a89111621566"}, - {file = "numpy-1.24.1.tar.gz", hash = "sha256:2386da9a471cc00a1f47845e27d916d5ec5346ae9696e01a8a34760858fe9dd2"}, -] - -[[package]] -name = "nvidia-cublas-cu11" -version = "11.10.3.66" -description = "CUBLAS native runtime libraries" -category = "main" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cublas_cu11-11.10.3.66-py3-none-manylinux1_x86_64.whl", hash = "sha256:d32e4d75f94ddfb93ea0a5dda08389bcc65d8916a25cb9f37ac89edaeed3bded"}, - {file = "nvidia_cublas_cu11-11.10.3.66-py3-none-win_amd64.whl", hash = "sha256:8ac17ba6ade3ed56ab898a036f9ae0756f1e81052a317bf98f8c6d18dc3ae49e"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cuda-nvrtc-cu11" -version = "11.7.99" -description = "NVRTC native runtime libraries" -category = "main" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cuda_nvrtc_cu11-11.7.99-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:9f1562822ea264b7e34ed5930567e89242d266448e936b85bc97a3370feabb03"}, - {file = "nvidia_cuda_nvrtc_cu11-11.7.99-py3-none-manylinux1_x86_64.whl", hash = "sha256:f7d9610d9b7c331fa0da2d1b2858a4a8315e6d49765091d28711c8946e7425e7"}, - {file = "nvidia_cuda_nvrtc_cu11-11.7.99-py3-none-win_amd64.whl", hash = "sha256:f2effeb1309bdd1b3854fc9b17eaf997808f8b25968ce0c7070945c4265d64a3"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cuda-runtime-cu11" -version = "11.7.99" -description = "CUDA Runtime native Libraries" -category = "main" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cuda_runtime_cu11-11.7.99-py3-none-manylinux1_x86_64.whl", hash = "sha256:cc768314ae58d2641f07eac350f40f99dcb35719c4faff4bc458a7cd2b119e31"}, - {file = "nvidia_cuda_runtime_cu11-11.7.99-py3-none-win_amd64.whl", hash = "sha256:bc77fa59a7679310df9d5c70ab13c4e34c64ae2124dd1efd7e5474b71be125c7"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cudnn-cu11" -version = "8.5.0.96" -description = "cuDNN runtime libraries" -category = "main" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cudnn_cu11-8.5.0.96-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:402f40adfc6f418f9dae9ab402e773cfed9beae52333f6d86ae3107a1b9527e7"}, - {file = "nvidia_cudnn_cu11-8.5.0.96-py3-none-manylinux1_x86_64.whl", hash = "sha256:71f8111eb830879ff2836db3cccf03bbd735df9b0d17cd93761732ac50a8a108"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "oauthlib" -version = "3.2.2" -description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, - {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, -] - -[package.extras] -rsa = ["cryptography (>=3.0.0)"] -signals = ["blinker (>=1.4.0)"] -signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] - -[[package]] -name = "opencv-python" -version = "4.7.0.68" -description = "Wrapper package for OpenCV python bindings." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "opencv-python-4.7.0.68.tar.gz", hash = "sha256:9829e6efedde1d1b8419c5bd4d62d289ecbf44ae35b843c6da9e3cbcba1a9a8a"}, - {file = "opencv_python-4.7.0.68-cp37-abi3-macosx_10_13_x86_64.whl", hash = "sha256:abc6adfa8694f71a4caffa922b279bd9d96954a37eee40b147f613c64310b411"}, - {file = "opencv_python-4.7.0.68-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:86f4b60b9536948f16d2170ba3a9b22d3955a957dc61a9bc56e53692c6db2c7e"}, - {file = "opencv_python-4.7.0.68-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d1c993811f92ddd7919314ada7b9be1f23db1c73f1384915c834dee8549c0b9"}, - {file = "opencv_python-4.7.0.68-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a00e12546e5578f6bb7ed408c37fcfea533d74e9691cfaf40926f6b43295577"}, - {file = "opencv_python-4.7.0.68-cp37-abi3-win32.whl", hash = "sha256:e770e9f653a0e5e72b973adb8213fae2df4642730ba1faf31e73a54287a4d5d4"}, - {file = "opencv_python-4.7.0.68-cp37-abi3-win_amd64.whl", hash = "sha256:7a08f9d1f9dd52de63a7bb448ab7d6d4a1a85b767c2358501d968d1e4d95098d"}, -] - -[package.dependencies] -numpy = [ - {version = ">=1.21.2", markers = "python_version >= \"3.10\""}, - {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\""}, - {version = ">=1.19.3", markers = "python_version >= \"3.6\" and platform_system == \"Linux\" and platform_machine == \"aarch64\" or python_version >= \"3.9\""}, - {version = ">=1.17.0", markers = "python_version >= \"3.7\""}, - {version = ">=1.17.3", markers = "python_version >= \"3.8\""}, -] - -[[package]] -name = "packaging" -version = "23.0" -description = "Core utilities for Python packages" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, - {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, -] - -[[package]] -name = "pandas" -version = "1.5.2" -description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pandas-1.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e9dbacd22555c2d47f262ef96bb4e30880e5956169741400af8b306bbb24a273"}, - {file = "pandas-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e2b83abd292194f350bb04e188f9379d36b8dfac24dd445d5c87575f3beaf789"}, - {file = "pandas-1.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2552bffc808641c6eb471e55aa6899fa002ac94e4eebfa9ec058649122db5824"}, - {file = "pandas-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fc87eac0541a7d24648a001d553406f4256e744d92df1df8ebe41829a915028"}, - {file = "pandas-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0d8fd58df5d17ddb8c72a5075d87cd80d71b542571b5f78178fb067fa4e9c72"}, - {file = "pandas-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:4aed257c7484d01c9a194d9a94758b37d3d751849c05a0050c087a358c41ad1f"}, - {file = "pandas-1.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:375262829c8c700c3e7cbb336810b94367b9c4889818bbd910d0ecb4e45dc261"}, - {file = "pandas-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc3cd122bea268998b79adebbb8343b735a5511ec14efb70a39e7acbc11ccbdc"}, - {file = "pandas-1.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4f5a82afa4f1ff482ab8ded2ae8a453a2cdfde2001567b3ca24a4c5c5ca0db3"}, - {file = "pandas-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8092a368d3eb7116e270525329a3e5c15ae796ccdf7ccb17839a73b4f5084a39"}, - {file = "pandas-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6257b314fc14958f8122779e5a1557517b0f8e500cfb2bd53fa1f75a8ad0af2"}, - {file = "pandas-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:82ae615826da838a8e5d4d630eb70c993ab8636f0eff13cb28aafc4291b632b5"}, - {file = "pandas-1.5.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:457d8c3d42314ff47cc2d6c54f8fc0d23954b47977b2caed09cd9635cb75388b"}, - {file = "pandas-1.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c009a92e81ce836212ce7aa98b219db7961a8b95999b97af566b8dc8c33e9519"}, - {file = "pandas-1.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:71f510b0efe1629bf2f7c0eadb1ff0b9cf611e87b73cd017e6b7d6adb40e2b3a"}, - {file = "pandas-1.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a40dd1e9f22e01e66ed534d6a965eb99546b41d4d52dbdb66565608fde48203f"}, - {file = "pandas-1.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ae7e989f12628f41e804847a8cc2943d362440132919a69429d4dea1f164da0"}, - {file = "pandas-1.5.2-cp38-cp38-win32.whl", hash = "sha256:530948945e7b6c95e6fa7aa4be2be25764af53fba93fe76d912e35d1c9ee46f5"}, - {file = "pandas-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:73f219fdc1777cf3c45fde7f0708732ec6950dfc598afc50588d0d285fddaefc"}, - {file = "pandas-1.5.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9608000a5a45f663be6af5c70c3cbe634fa19243e720eb380c0d378666bc7702"}, - {file = "pandas-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:315e19a3e5c2ab47a67467fc0362cb36c7c60a93b6457f675d7d9615edad2ebe"}, - {file = "pandas-1.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e18bc3764cbb5e118be139b3b611bc3fbc5d3be42a7e827d1096f46087b395eb"}, - {file = "pandas-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0183cb04a057cc38fde5244909fca9826d5d57c4a5b7390c0cc3fa7acd9fa883"}, - {file = "pandas-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:344021ed3e639e017b452aa8f5f6bf38a8806f5852e217a7594417fb9bbfa00e"}, - {file = "pandas-1.5.2-cp39-cp39-win32.whl", hash = "sha256:e7469271497960b6a781eaa930cba8af400dd59b62ec9ca2f4d31a19f2f91090"}, - {file = "pandas-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:c218796d59d5abd8780170c937b812c9637e84c32f8271bbf9845970f8c1351f"}, - {file = "pandas-1.5.2.tar.gz", hash = "sha256:220b98d15cee0b2cd839a6358bd1f273d0356bf964c1a1aeb32d47db0215488b"}, -] - -[package.dependencies] -numpy = {version = ">=1.21.0", markers = "python_version >= \"3.10\""} -python-dateutil = ">=2.8.1" -pytz = ">=2020.1" - -[package.extras] -test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] - -[[package]] -name = "pandocfilters" -version = "1.5.0" -description = "Utilities for writing pandoc filters in python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, - {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, -] - -[[package]] -name = "parso" -version = "0.8.3" -description = "A Python Parser" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, -] - -[package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] - -[[package]] -name = "pastel" -version = "0.2.1" -description = "Bring colors to your terminal." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, - {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, -] - -[[package]] -name = "pathtools" -version = "0.1.2" -description = "File system general utilities" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pathtools-0.1.2.tar.gz", hash = "sha256:7c35c5421a39bb82e58018febd90e3b6e5db34c5443aaaf742b3f33d4655f1c0"}, -] - -[[package]] -name = "pexpect" -version = "4.8.0" -description = "Pexpect allows easy control of interactive console applications." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, -] - -[package.dependencies] -ptyprocess = ">=0.5" - -[[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] - -[[package]] -name = "pillow" -version = "9.4.0" -description = "Python Imaging Library (Fork)" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Pillow-9.4.0-1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b4b4e9dda4f4e4c4e6896f93e84a8f0bcca3b059de9ddf67dac3c334b1195e1"}, - {file = "Pillow-9.4.0-1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fb5c1ad6bad98c57482236a21bf985ab0ef42bd51f7ad4e4538e89a997624e12"}, - {file = "Pillow-9.4.0-1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:f0caf4a5dcf610d96c3bd32932bfac8aee61c96e60481c2a0ea58da435e25acd"}, - {file = "Pillow-9.4.0-1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:3f4cc516e0b264c8d4ccd6b6cbc69a07c6d582d8337df79be1e15a5056b258c9"}, - {file = "Pillow-9.4.0-1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b8c2f6eb0df979ee99433d8b3f6d193d9590f735cf12274c108bd954e30ca858"}, - {file = "Pillow-9.4.0-1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b70756ec9417c34e097f987b4d8c510975216ad26ba6e57ccb53bc758f490dab"}, - {file = "Pillow-9.4.0-1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:43521ce2c4b865d385e78579a082b6ad1166ebed2b1a2293c3be1d68dd7ca3b9"}, - {file = "Pillow-9.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157"}, - {file = "Pillow-9.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070"}, - {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28"}, - {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35"}, - {file = "Pillow-9.4.0-cp310-cp310-win32.whl", hash = "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a"}, - {file = "Pillow-9.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391"}, - {file = "Pillow-9.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133"}, - {file = "Pillow-9.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d"}, - {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8"}, - {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a"}, - {file = "Pillow-9.4.0-cp311-cp311-win32.whl", hash = "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c"}, - {file = "Pillow-9.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee"}, - {file = "Pillow-9.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5f532a2ad4d174eb73494e7397988e22bf427f91acc8e6ebf5bb10597b49c493"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dd5a9c3091a0f414a963d427f920368e2b6a4c2f7527fdd82cde8ef0bc7a327"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef21af928e807f10bf4141cad4746eee692a0dd3ff56cfb25fce076ec3cc8abe"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:847b114580c5cc9ebaf216dd8c8dbc6b00a3b7ab0131e173d7120e6deade1f57"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:653d7fb2df65efefbcbf81ef5fe5e5be931f1ee4332c2893ca638c9b11a409c4"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:46f39cab8bbf4a384ba7cb0bc8bae7b7062b6a11cfac1ca4bc144dea90d4a9f5"}, - {file = "Pillow-9.4.0-cp37-cp37m-win32.whl", hash = "sha256:7ac7594397698f77bce84382929747130765f66406dc2cd8b4ab4da68ade4c6e"}, - {file = "Pillow-9.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:46c259e87199041583658457372a183636ae8cd56dbf3f0755e0f376a7f9d0e6"}, - {file = "Pillow-9.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:0e51f608da093e5d9038c592b5b575cadc12fd748af1479b5e858045fff955a9"}, - {file = "Pillow-9.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:765cb54c0b8724a7c12c55146ae4647e0274a839fb6de7bcba841e04298e1011"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:519e14e2c49fcf7616d6d2cfc5c70adae95682ae20f0395e9280db85e8d6c4df"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d197df5489004db87d90b918033edbeee0bd6df3848a204bca3ff0a903bef837"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0845adc64fe9886db00f5ab68c4a8cd933ab749a87747555cec1c95acea64b0b"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:e1339790c083c5a4de48f688b4841f18df839eb3c9584a770cbd818b33e26d5d"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:a96e6e23f2b79433390273eaf8cc94fec9c6370842e577ab10dabdcc7ea0a66b"}, - {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7cfc287da09f9d2a7ec146ee4d72d6ea1342e770d975e49a8621bf54eaa8f30f"}, - {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d7081c084ceb58278dd3cf81f836bc818978c0ccc770cbbb202125ddabec6628"}, - {file = "Pillow-9.4.0-cp38-cp38-win32.whl", hash = "sha256:df41112ccce5d47770a0c13651479fbcd8793f34232a2dd9faeccb75eb5d0d0d"}, - {file = "Pillow-9.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7a21222644ab69ddd9967cfe6f2bb420b460dae4289c9d40ff9a4896e7c35c9a"}, - {file = "Pillow-9.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0f3269304c1a7ce82f1759c12ce731ef9b6e95b6df829dccd9fe42912cc48569"}, - {file = "Pillow-9.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb362e3b0976dc994857391b776ddaa8c13c28a16f80ac6522c23d5257156bed"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e0f87144fcbbe54297cae708c5e7f9da21a4646523456b00cc956bd4c65815"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28676836c7796805914b76b1837a40f76827ee0d5398f72f7dcc634bae7c6264"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0884ba7b515163a1a05440a138adeb722b8a6ae2c2b33aea93ea3118dd3a899e"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:53dcb50fbdc3fb2c55431a9b30caeb2f7027fcd2aeb501459464f0214200a503"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:e8c5cf126889a4de385c02a2c3d3aba4b00f70234bfddae82a5eaa3ee6d5e3e6"}, - {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c6b1389ed66cdd174d040105123a5a1bc91d0aa7059c7261d20e583b6d8cbd2"}, - {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0dd4c681b82214b36273c18ca7ee87065a50e013112eea7d78c7a1b89a739153"}, - {file = "Pillow-9.4.0-cp39-cp39-win32.whl", hash = "sha256:6d9dfb9959a3b0039ee06c1a1a90dc23bac3b430842dcb97908ddde05870601c"}, - {file = "Pillow-9.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:54614444887e0d3043557d9dbc697dbb16cfb5a35d672b7a0fcc1ed0cf1c600b"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b9b752ab91e78234941e44abdecc07f1f0d8f51fb62941d32995b8161f68cfe5"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3b56206244dc8711f7e8b7d6cad4663917cd5b2d950799425076681e8766286"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aabdab8ec1e7ca7f1434d042bf8b1e92056245fb179790dc97ed040361f16bfd"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db74f5562c09953b2c5f8ec4b7dfd3f5421f31811e97d1dbc0a7c93d6e3a24df"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e9d7747847c53a16a729b6ee5e737cf170f7a16611c143d95aa60a109a59c336"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b52ff4f4e002f828ea6483faf4c4e8deea8d743cf801b74910243c58acc6eda3"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:575d8912dca808edd9acd6f7795199332696d3469665ef26163cd090fa1f8bfa"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c4ed2ff6760e98d262e0cc9c9a7f7b8a9f61aa4d47c58835cdaf7b0b8811bb"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e621b0246192d3b9cb1dc62c78cfa4c6f6d2ddc0ec207d43c0dedecb914f152a"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8f127e7b028900421cad64f51f75c051b628db17fb00e099eb148761eed598c9"}, - {file = "Pillow-9.4.0.tar.gz", hash = "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e"}, -] - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "pkginfo" -version = "1.9.6" -description = "Query metadata from sdists / bdists / installed packages." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pkginfo-1.9.6-py3-none-any.whl", hash = "sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546"}, - {file = "pkginfo-1.9.6.tar.gz", hash = "sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046"}, -] - -[package.extras] -testing = ["pytest", "pytest-cov"] - -[[package]] -name = "platformdirs" -version = "2.6.2" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "platformdirs-2.6.2-py3-none-any.whl", hash = "sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490"}, - {file = "platformdirs-2.6.2.tar.gz", hash = "sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2"}, -] - -[package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] - -[[package]] -name = "prometheus-client" -version = "0.15.0" -description = "Python client for the Prometheus monitoring system." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "prometheus_client-0.15.0-py3-none-any.whl", hash = "sha256:db7c05cbd13a0f79975592d112320f2605a325969b270a94b71dcabc47b931d2"}, - {file = "prometheus_client-0.15.0.tar.gz", hash = "sha256:be26aa452490cfcf6da953f9436e95a9f2b4d578ca80094b4458930e5f584ab1"}, -] - -[package.extras] -twisted = ["twisted"] - -[[package]] -name = "prompt-toolkit" -version = "3.0.36" -description = "Library for building powerful interactive command lines in Python" -category = "main" -optional = false -python-versions = ">=3.6.2" -files = [ - {file = "prompt_toolkit-3.0.36-py3-none-any.whl", hash = "sha256:aa64ad242a462c5ff0363a7b9cfe696c20d55d9fc60c11fd8e632d064804d305"}, - {file = "prompt_toolkit-3.0.36.tar.gz", hash = "sha256:3e163f254bef5a03b146397d7c1963bd3e2812f0964bb9a24e6ec761fd28db63"}, -] - -[package.dependencies] -wcwidth = "*" - -[[package]] -name = "protobuf" -version = "3.20.3" -description = "Protocol Buffers" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "protobuf-3.20.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99"}, - {file = "protobuf-3.20.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e"}, - {file = "protobuf-3.20.3-cp310-cp310-win32.whl", hash = "sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c"}, - {file = "protobuf-3.20.3-cp310-cp310-win_amd64.whl", hash = "sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7"}, - {file = "protobuf-3.20.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469"}, - {file = "protobuf-3.20.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4"}, - {file = "protobuf-3.20.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4"}, - {file = "protobuf-3.20.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454"}, - {file = "protobuf-3.20.3-cp37-cp37m-win32.whl", hash = "sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905"}, - {file = "protobuf-3.20.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c"}, - {file = "protobuf-3.20.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7"}, - {file = "protobuf-3.20.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee"}, - {file = "protobuf-3.20.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050"}, - {file = "protobuf-3.20.3-cp38-cp38-win32.whl", hash = "sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86"}, - {file = "protobuf-3.20.3-cp38-cp38-win_amd64.whl", hash = "sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9"}, - {file = "protobuf-3.20.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b"}, - {file = "protobuf-3.20.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b"}, - {file = "protobuf-3.20.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402"}, - {file = "protobuf-3.20.3-cp39-cp39-win32.whl", hash = "sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480"}, - {file = "protobuf-3.20.3-cp39-cp39-win_amd64.whl", hash = "sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7"}, - {file = "protobuf-3.20.3-py2.py3-none-any.whl", hash = "sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db"}, - {file = "protobuf-3.20.3.tar.gz", hash = "sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2"}, -] - -[[package]] -name = "psutil" -version = "5.9.4" -description = "Cross-platform lib for process and system monitoring in Python." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "psutil-5.9.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c1ca331af862803a42677c120aff8a814a804e09832f166f226bfd22b56feee8"}, - {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:68908971daf802203f3d37e78d3f8831b6d1014864d7a85937941bb35f09aefe"}, - {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3ff89f9b835100a825b14c2808a106b6fdcc4b15483141482a12c725e7f78549"}, - {file = "psutil-5.9.4-cp27-cp27m-win32.whl", hash = "sha256:852dd5d9f8a47169fe62fd4a971aa07859476c2ba22c2254d4a1baa4e10b95ad"}, - {file = "psutil-5.9.4-cp27-cp27m-win_amd64.whl", hash = "sha256:9120cd39dca5c5e1c54b59a41d205023d436799b1c8c4d3ff71af18535728e94"}, - {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6b92c532979bafc2df23ddc785ed116fced1f492ad90a6830cf24f4d1ea27d24"}, - {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:efeae04f9516907be44904cc7ce08defb6b665128992a56957abc9b61dca94b7"}, - {file = "psutil-5.9.4-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:54d5b184728298f2ca8567bf83c422b706200bcbbfafdc06718264f9393cfeb7"}, - {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16653106f3b59386ffe10e0bad3bb6299e169d5327d3f187614b1cb8f24cf2e1"}, - {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54c0d3d8e0078b7666984e11b12b88af2db11d11249a8ac8920dd5ef68a66e08"}, - {file = "psutil-5.9.4-cp36-abi3-win32.whl", hash = "sha256:149555f59a69b33f056ba1c4eb22bb7bf24332ce631c44a319cec09f876aaeff"}, - {file = "psutil-5.9.4-cp36-abi3-win_amd64.whl", hash = "sha256:fd8522436a6ada7b4aad6638662966de0d61d241cb821239b2ae7013d41a43d4"}, - {file = "psutil-5.9.4-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:6001c809253a29599bc0dfd5179d9f8a5779f9dffea1da0f13c53ee568115e1e"}, - {file = "psutil-5.9.4.tar.gz", hash = "sha256:3d7f9739eb435d4b1338944abe23f49584bde5395f27487d2ee25ad9a8774a62"}, -] - -[package.extras] -test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] - -[[package]] -name = "ptyprocess" -version = "0.7.0" -description = "Run a subprocess in a pseudo terminal" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] - -[[package]] -name = "pure-eval" -version = "0.2.2" -description = "Safely evaluate AST nodes without side effects" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, -] - -[package.extras] -tests = ["pytest"] - -[[package]] -name = "pyasn1" -version = "0.4.8" -description = "ASN.1 types and codecs" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, -] - -[[package]] -name = "pyasn1-modules" -version = "0.2.8" -description = "A collection of ASN.1-based protocols modules." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, - {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, -] - -[package.dependencies] -pyasn1 = ">=0.4.6,<0.5.0" - -[[package]] -name = "pybullet" -version = "3.2.5" -description = "Official Python Interface for the Bullet Physics SDK specialized for Robotics Simulation and Reinforcement Learning" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pybullet-3.2.5-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4970aec0dd968924f6b1820655a20f80650da2f85ba38b641937c9701a8a2b14"}, - {file = "pybullet-3.2.5-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b64e4523a11d03729035e0a5baa0ce4d2ca58de8d0a242c0b91e8253781b24c4"}, - {file = "pybullet-3.2.5-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:49e80fd708a3ffd1d0dac3149e13852bd59cca056bb328bf35b25ea26a8bf504"}, - {file = "pybullet-3.2.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:56456b7b53ab00f33d52a3eb96fb0d7b4b8e16f21987d727b34baecc2019702f"}, - {file = "pybullet-3.2.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3e22fdb949d0a67e18cc3e248d6199ff788704c68c3edbfc3b5c02fc58f52f9a"}, - {file = "pybullet-3.2.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3f9c4289f1773b55915f4efb7514b088539d59b4a082465d68ee7caac11355d1"}, - {file = "pybullet-3.2.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9adcaa00de674a02549949f6f8d51b485bd7a23fbc87a1defb2067e1364f8202"}, - {file = "pybullet-3.2.5.tar.gz", hash = "sha256:1bcb9afb87a086be1b2de18f084d1fdab8194da1bf71f264743ca26baa39c351"}, -] - -[[package]] -name = "pycparser" -version = "2.21" -description = "C parser in Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] - -[[package]] -name = "pydantic" -version = "1.10.4" -description = "Data validation and settings management using python type hints" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pydantic-1.10.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5635de53e6686fe7a44b5cf25fcc419a0d5e5c1a1efe73d49d48fe7586db854"}, - {file = "pydantic-1.10.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6dc1cc241440ed7ca9ab59d9929075445da6b7c94ced281b3dd4cfe6c8cff817"}, - {file = "pydantic-1.10.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51bdeb10d2db0f288e71d49c9cefa609bca271720ecd0c58009bd7504a0c464c"}, - {file = "pydantic-1.10.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78cec42b95dbb500a1f7120bdf95c401f6abb616bbe8785ef09887306792e66e"}, - {file = "pydantic-1.10.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8775d4ef5e7299a2f4699501077a0defdaac5b6c4321173bcb0f3c496fbadf85"}, - {file = "pydantic-1.10.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:572066051eeac73d23f95ba9a71349c42a3e05999d0ee1572b7860235b850cc6"}, - {file = "pydantic-1.10.4-cp310-cp310-win_amd64.whl", hash = "sha256:7feb6a2d401f4d6863050f58325b8d99c1e56f4512d98b11ac64ad1751dc647d"}, - {file = "pydantic-1.10.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39f4a73e5342b25c2959529f07f026ef58147249f9b7431e1ba8414a36761f53"}, - {file = "pydantic-1.10.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:983e720704431a6573d626b00662eb78a07148c9115129f9b4351091ec95ecc3"}, - {file = "pydantic-1.10.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75d52162fe6b2b55964fbb0af2ee58e99791a3138588c482572bb6087953113a"}, - {file = "pydantic-1.10.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fdf8d759ef326962b4678d89e275ffc55b7ce59d917d9f72233762061fd04a2d"}, - {file = "pydantic-1.10.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05a81b006be15655b2a1bae5faa4280cf7c81d0e09fcb49b342ebf826abe5a72"}, - {file = "pydantic-1.10.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d88c4c0e5c5dfd05092a4b271282ef0588e5f4aaf345778056fc5259ba098857"}, - {file = "pydantic-1.10.4-cp311-cp311-win_amd64.whl", hash = "sha256:6a05a9db1ef5be0fe63e988f9617ca2551013f55000289c671f71ec16f4985e3"}, - {file = "pydantic-1.10.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:887ca463c3bc47103c123bc06919c86720e80e1214aab79e9b779cda0ff92a00"}, - {file = "pydantic-1.10.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdf88ab63c3ee282c76d652fc86518aacb737ff35796023fae56a65ced1a5978"}, - {file = "pydantic-1.10.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a48f1953c4a1d9bd0b5167ac50da9a79f6072c63c4cef4cf2a3736994903583e"}, - {file = "pydantic-1.10.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a9f2de23bec87ff306aef658384b02aa7c32389766af3c5dee9ce33e80222dfa"}, - {file = "pydantic-1.10.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:cd8702c5142afda03dc2b1ee6bc358b62b3735b2cce53fc77b31ca9f728e4bc8"}, - {file = "pydantic-1.10.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6e7124d6855b2780611d9f5e1e145e86667eaa3bd9459192c8dc1a097f5e9903"}, - {file = "pydantic-1.10.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b53e1d41e97063d51a02821b80538053ee4608b9a181c1005441f1673c55423"}, - {file = "pydantic-1.10.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:55b1625899acd33229c4352ce0ae54038529b412bd51c4915349b49ca575258f"}, - {file = "pydantic-1.10.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:301d626a59edbe5dfb48fcae245896379a450d04baeed50ef40d8199f2733b06"}, - {file = "pydantic-1.10.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6f9d649892a6f54a39ed56b8dfd5e08b5f3be5f893da430bed76975f3735d15"}, - {file = "pydantic-1.10.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d7b5a3821225f5c43496c324b0d6875fde910a1c2933d726a743ce328fbb2a8c"}, - {file = "pydantic-1.10.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f2f7eb6273dd12472d7f218e1fef6f7c7c2f00ac2e1ecde4db8824c457300416"}, - {file = "pydantic-1.10.4-cp38-cp38-win_amd64.whl", hash = "sha256:4b05697738e7d2040696b0a66d9f0a10bec0efa1883ca75ee9e55baf511909d6"}, - {file = "pydantic-1.10.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a9a6747cac06c2beb466064dda999a13176b23535e4c496c9d48e6406f92d42d"}, - {file = "pydantic-1.10.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eb992a1ef739cc7b543576337bebfc62c0e6567434e522e97291b251a41dad7f"}, - {file = "pydantic-1.10.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:990406d226dea0e8f25f643b370224771878142155b879784ce89f633541a024"}, - {file = "pydantic-1.10.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e82a6d37a95e0b1b42b82ab340ada3963aea1317fd7f888bb6b9dfbf4fff57c"}, - {file = "pydantic-1.10.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9193d4f4ee8feca58bc56c8306bcb820f5c7905fd919e0750acdeeeef0615b28"}, - {file = "pydantic-1.10.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2b3ce5f16deb45c472dde1a0ee05619298c864a20cded09c4edd820e1454129f"}, - {file = "pydantic-1.10.4-cp39-cp39-win_amd64.whl", hash = "sha256:9cbdc268a62d9a98c56e2452d6c41c0263d64a2009aac69246486f01b4f594c4"}, - {file = "pydantic-1.10.4-py3-none-any.whl", hash = "sha256:4948f264678c703f3877d1c8877c4e3b2e12e549c57795107f08cf70c6ec7774"}, - {file = "pydantic-1.10.4.tar.gz", hash = "sha256:b9a3859f24eb4e097502a3be1fb4b2abb79b6103dd9e2e0edb70613a4459a648"}, -] - -[package.dependencies] -typing-extensions = ">=4.2.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] - -[[package]] -name = "pyglet" -version = "1.5.27" -description = "Cross-platform windowing and multimedia library" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pyglet-1.5.27-py3-none-any.whl", hash = "sha256:7ce2eb5a299cda92fcc099f533520cdaa2f157a175d6c1442a2ae4d769284d2d"}, - {file = "pyglet-1.5.27.zip", hash = "sha256:4d00e067451f3b10fd51b69764fddab65444372a2da344ee2b35f0a8e6ebf005"}, -] - -[[package]] -name = "pygments" -version = "2.14.0" -description = "Pygments is a syntax highlighting package written in Python." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, - {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, -] - -[package.extras] -plugins = ["importlib-metadata"] - -[[package]] -name = "pylev" -version = "1.4.0" -description = "A pure Python Levenshtein implementation that's not freaking GPL'd." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pylev-1.4.0-py2.py3-none-any.whl", hash = "sha256:7b2e2aa7b00e05bb3f7650eb506fc89f474f70493271a35c242d9a92188ad3dd"}, - {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, -] - -[[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "main" -optional = false -python-versions = ">=3.6.8" -files = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - -[[package]] -name = "pyrsistent" -version = "0.19.3" -description = "Persistent/Functional/Immutable data structures" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, - {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, - {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, - {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, - {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, - {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, - {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, - {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, - {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, - {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, - {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, - {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, - {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, - {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, - {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, - {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, - {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, - {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, - {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, - {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, - {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, - {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, -] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-json-logger" -version = "2.0.4" -description = "A python library adding a json log formatter" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "python-json-logger-2.0.4.tar.gz", hash = "sha256:764d762175f99fcc4630bd4853b09632acb60a6224acb27ce08cd70f0b1b81bd"}, - {file = "python_json_logger-2.0.4-py3-none-any.whl", hash = "sha256:3b03487b14eb9e4f77e4fc2a023358b5394b82fd89cecf5586259baed57d8c6f"}, -] - -[[package]] -name = "pytz" -version = "2022.7" -description = "World timezone definitions, modern and historical" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2022.7-py2.py3-none-any.whl", hash = "sha256:93007def75ae22f7cd991c84e02d434876818661f8df9ad5df9e950ff4e52cfd"}, - {file = "pytz-2022.7.tar.gz", hash = "sha256:7ccfae7b4b2c067464a6733c6261673fdb8fd1be905460396b97a073e9fa683a"}, -] - -[[package]] -name = "pyvirtualdisplay" -version = "3.0" -description = "python wrapper for Xvfb, Xephyr and Xvnc" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "PyVirtualDisplay-3.0-py3-none-any.whl", hash = "sha256:40d4b8dfe4b8de8552e28eb367647f311f88a130bf837fe910e7f180d5477f0e"}, - {file = "PyVirtualDisplay-3.0.tar.gz", hash = "sha256:09755bc3ceb6eb725fb07eca5425f43f2358d3bf08e00d2a9b792a1aedd16159"}, -] - -[[package]] -name = "pywin32" -version = "305" -description = "Python for Window Extensions" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pywin32-305-cp310-cp310-win32.whl", hash = "sha256:421f6cd86e84bbb696d54563c48014b12a23ef95a14e0bdba526be756d89f116"}, - {file = "pywin32-305-cp310-cp310-win_amd64.whl", hash = "sha256:73e819c6bed89f44ff1d690498c0a811948f73777e5f97c494c152b850fad478"}, - {file = "pywin32-305-cp310-cp310-win_arm64.whl", hash = "sha256:742eb905ce2187133a29365b428e6c3b9001d79accdc30aa8969afba1d8470f4"}, - {file = "pywin32-305-cp311-cp311-win32.whl", hash = "sha256:19ca459cd2e66c0e2cc9a09d589f71d827f26d47fe4a9d09175f6aa0256b51c2"}, - {file = "pywin32-305-cp311-cp311-win_amd64.whl", hash = "sha256:326f42ab4cfff56e77e3e595aeaf6c216712bbdd91e464d167c6434b28d65990"}, - {file = "pywin32-305-cp311-cp311-win_arm64.whl", hash = "sha256:4ecd404b2c6eceaca52f8b2e3e91b2187850a1ad3f8b746d0796a98b4cea04db"}, - {file = "pywin32-305-cp36-cp36m-win32.whl", hash = "sha256:48d8b1659284f3c17b68587af047d110d8c44837736b8932c034091683e05863"}, - {file = "pywin32-305-cp36-cp36m-win_amd64.whl", hash = "sha256:13362cc5aa93c2beaf489c9c9017c793722aeb56d3e5166dadd5ef82da021fe1"}, - {file = "pywin32-305-cp37-cp37m-win32.whl", hash = "sha256:a55db448124d1c1484df22fa8bbcbc45c64da5e6eae74ab095b9ea62e6d00496"}, - {file = "pywin32-305-cp37-cp37m-win_amd64.whl", hash = "sha256:109f98980bfb27e78f4df8a51a8198e10b0f347257d1e265bb1a32993d0c973d"}, - {file = "pywin32-305-cp38-cp38-win32.whl", hash = "sha256:9dd98384da775afa009bc04863426cb30596fd78c6f8e4e2e5bbf4edf8029504"}, - {file = "pywin32-305-cp38-cp38-win_amd64.whl", hash = "sha256:56d7a9c6e1a6835f521788f53b5af7912090674bb84ef5611663ee1595860fc7"}, - {file = "pywin32-305-cp39-cp39-win32.whl", hash = "sha256:9d968c677ac4d5cbdaa62fd3014ab241718e619d8e36ef8e11fb930515a1e918"}, - {file = "pywin32-305-cp39-cp39-win_amd64.whl", hash = "sha256:50768c6b7c3f0b38b7fb14dd4104da93ebced5f1a50dc0e834594bff6fbe1271"}, -] - -[[package]] -name = "pywin32-ctypes" -version = "0.2.0" -description = "" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, - {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, -] - -[[package]] -name = "pywinpty" -version = "2.0.10" -description = "Pseudo terminal support for Windows from Python." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pywinpty-2.0.10-cp310-none-win_amd64.whl", hash = "sha256:4c7d06ad10f6e92bc850a467f26d98f4f30e73d2fe5926536308c6ae0566bc16"}, - {file = "pywinpty-2.0.10-cp311-none-win_amd64.whl", hash = "sha256:7ffbd66310b83e42028fc9df7746118978d94fba8c1ebf15a7c1275fdd80b28a"}, - {file = "pywinpty-2.0.10-cp37-none-win_amd64.whl", hash = "sha256:38cb924f2778b5751ef91a75febd114776b3af0ae411bc667be45dd84fc881d3"}, - {file = "pywinpty-2.0.10-cp38-none-win_amd64.whl", hash = "sha256:902d79444b29ad1833b8d5c3c9aabdfd428f4f068504430df18074007c8c0de8"}, - {file = "pywinpty-2.0.10-cp39-none-win_amd64.whl", hash = "sha256:3c46aef80dd50979aff93de199e4a00a8ee033ba7a03cadf0a91fed45f0c39d7"}, - {file = "pywinpty-2.0.10.tar.gz", hash = "sha256:cdbb5694cf8c7242c2ecfaca35c545d31fa5d5814c3d67a4e628f803f680ebea"}, -] - -[[package]] -name = "pyyaml" -version = "6.0" -description = "YAML parser and emitter for Python" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] - -[[package]] -name = "pyzmq" -version = "25.0.0" -description = "Python bindings for 0MQ" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pyzmq-25.0.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:2d05d904f03ddf1e0d83d97341354dfe52244a619b5a1440a5f47a5b3451e84e"}, - {file = "pyzmq-25.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a154ef810d44f9d28868be04641f837374a64e7449df98d9208e76c260c7ef1"}, - {file = "pyzmq-25.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:487305c2a011fdcf3db1f24e8814bb76d23bc4d2f46e145bc80316a59a9aa07d"}, - {file = "pyzmq-25.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e7b87638ee30ab13230e37ce5331b3e730b1e0dda30120b9eeec3540ed292c8"}, - {file = "pyzmq-25.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75243e422e85a62f0ab7953dc315452a56b2c6a7e7d1a3c3109ac3cc57ed6b47"}, - {file = "pyzmq-25.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:31e523d067ce44a04e876bed3ff9ea1ff8d1b6636d16e5fcace9d22f8c564369"}, - {file = "pyzmq-25.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8539216173135e9e89f6b1cc392e74e6b935b91e8c76106cf50e7a02ab02efe5"}, - {file = "pyzmq-25.0.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2754fa68da08a854f4816e05160137fa938a2347276471103d31e04bcee5365c"}, - {file = "pyzmq-25.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1bc30f0c18444d51e9b0d0dd39e3a4e7c53ee74190bebef238cd58de577ea9"}, - {file = "pyzmq-25.0.0-cp310-cp310-win32.whl", hash = "sha256:01d53958c787cfea34091fcb8ef36003dbb7913b8e9f8f62a0715234ebc98b70"}, - {file = "pyzmq-25.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:58fc3ad5e1cfd2e6d24741fbb1e216b388115d31b0ca6670f894187f280b6ba6"}, - {file = "pyzmq-25.0.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:e4bba04ea779a3d7ef25a821bb63fd0939142c88e7813e5bd9c6265a20c523a2"}, - {file = "pyzmq-25.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:af1fbfb7ad6ac0009ccee33c90a1d303431c7fb594335eb97760988727a37577"}, - {file = "pyzmq-25.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85456f0d8f3268eecd63dede3b99d5bd8d3b306310c37d4c15141111d22baeaf"}, - {file = "pyzmq-25.0.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0645b5a2d2a06fd8eb738018490c514907f7488bf9359c6ee9d92f62e844b76f"}, - {file = "pyzmq-25.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f72ea279b2941a5203e935a4588b9ba8a48aeb9a926d9dfa1986278bd362cb8"}, - {file = "pyzmq-25.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:4e295f7928a31ae0f657e848c5045ba6d693fe8921205f408ca3804b1b236968"}, - {file = "pyzmq-25.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ac97e7d647d5519bcef48dd8d3d331f72975afa5c4496c95f6e854686f45e2d9"}, - {file = "pyzmq-25.0.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:656281d496aaf9ca4fd4cea84e6d893e3361057c4707bd38618f7e811759103c"}, - {file = "pyzmq-25.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1f6116991568aac48b94d6d8aaed6157d407942ea385335a6ed313692777fb9d"}, - {file = "pyzmq-25.0.0-cp311-cp311-win32.whl", hash = "sha256:0282bba9aee6e0346aa27d6c69b5f7df72b5a964c91958fc9e0c62dcae5fdcdc"}, - {file = "pyzmq-25.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:526f884a27e8bba62fe1f4e07c62be2cfe492b6d432a8fdc4210397f8cf15331"}, - {file = "pyzmq-25.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ccb3e1a863222afdbda42b7ca8ac8569959593d7abd44f5a709177d6fa27d266"}, - {file = "pyzmq-25.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4046d03100aca266e70d54a35694cb35d6654cfbef633e848b3c4a8d64b9d187"}, - {file = "pyzmq-25.0.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3100dddcada66ec5940ed6391ebf9d003cc3ede3d320748b2737553019f58230"}, - {file = "pyzmq-25.0.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7877264aa851c19404b1bb9dbe6eed21ea0c13698be1eda3784aab3036d1c861"}, - {file = "pyzmq-25.0.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:5049e75cc99db65754a3da5f079230fb8889230cf09462ec972d884d1704a3ed"}, - {file = "pyzmq-25.0.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:81f99fb1224d36eb91557afec8cdc2264e856f3464500b55749020ce4c848ef2"}, - {file = "pyzmq-25.0.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:a1cd4a95f176cdc0ee0a82d49d5830f13ae6015d89decbf834c273bc33eeb3d3"}, - {file = "pyzmq-25.0.0-cp36-cp36m-win32.whl", hash = "sha256:926236ca003aec70574754f39703528947211a406f5c6c8b3e50eca04a9e87fc"}, - {file = "pyzmq-25.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:94f0a7289d0f5c80807c37ebb404205e7deb737e8763eb176f4770839ee2a287"}, - {file = "pyzmq-25.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f3f96d452e9580cb961ece2e5a788e64abaecb1232a80e61deffb28e105ff84a"}, - {file = "pyzmq-25.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:930e6ad4f2eaac31a3d0c2130619d25db754b267487ebc186c6ad18af2a74018"}, - {file = "pyzmq-25.0.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e1081d7030a1229c8ff90120346fb7599b54f552e98fcea5170544e7c6725aab"}, - {file = "pyzmq-25.0.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:531866c491aee5a1e967c286cfa470dffac1e2a203b1afda52d62b58782651e9"}, - {file = "pyzmq-25.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fc7c1421c5b1c916acf3128bf3cc7ea7f5018b58c69a6866d70c14190e600ce9"}, - {file = "pyzmq-25.0.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9a2d5e419bd39a1edb6cdd326d831f0120ddb9b1ff397e7d73541bf393294973"}, - {file = "pyzmq-25.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:183e18742be3621acf8908903f689ec520aee3f08449bfd29f583010ca33022b"}, - {file = "pyzmq-25.0.0-cp37-cp37m-win32.whl", hash = "sha256:02f5cb60a7da1edd5591a15efa654ffe2303297a41e1b40c3c8942f8f11fc17c"}, - {file = "pyzmq-25.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:cac602e02341eaaf4edfd3e29bd3fdef672e61d4e6dfe5c1d065172aee00acee"}, - {file = "pyzmq-25.0.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:e14df47c1265356715d3d66e90282a645ebc077b70b3806cf47efcb7d1d630cb"}, - {file = "pyzmq-25.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:293a7c2128690f496057f1f1eb6074f8746058d13588389981089ec45d8fdc77"}, - {file = "pyzmq-25.0.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:731b208bc9412deeb553c9519dca47136b5a01ca66667cafd8733211941b17e4"}, - {file = "pyzmq-25.0.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b055a1cddf8035966ad13aa51edae5dc8f1bba0b5d5e06f7a843d8b83dc9b66b"}, - {file = "pyzmq-25.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17e1cb97d573ea84d7cd97188b42ca6f611ab3ee600f6a75041294ede58e3d20"}, - {file = "pyzmq-25.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:60ecbfe7669d3808ffa8a7dd1487d6eb8a4015b07235e3b723d4b2a2d4de7203"}, - {file = "pyzmq-25.0.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4c25c95416133942280faaf068d0fddfd642b927fb28aaf4ab201a738e597c1e"}, - {file = "pyzmq-25.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:be05504af0619d1cffa500af1e0ede69fb683f301003851f5993b5247cc2c576"}, - {file = "pyzmq-25.0.0-cp38-cp38-win32.whl", hash = "sha256:6bf3842af37af43fa953e96074ebbb5315f6a297198f805d019d788a1021dbc8"}, - {file = "pyzmq-25.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:b90bb8dfbbd138558f1f284fecfe328f7653616ff9a972433a00711d9475d1a9"}, - {file = "pyzmq-25.0.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:62b9e80890c0d2408eb42d5d7e1fc62a5ce71be3288684788f74cf3e59ffd6e2"}, - {file = "pyzmq-25.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:484c2c4ee02c1edc07039f42130bd16e804b1fe81c4f428e0042e03967f40c20"}, - {file = "pyzmq-25.0.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9ca6db34b26c4d3e9b0728841ec9aa39484eee272caa97972ec8c8e231b20c7e"}, - {file = "pyzmq-25.0.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:610d2d112acd4e5501fac31010064a6c6efd716ceb968e443cae0059eb7b86de"}, - {file = "pyzmq-25.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3594c0ff604e685d7e907860b61d0e10e46c74a9ffca168f6e9e50ea934ee440"}, - {file = "pyzmq-25.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c21a5f4e54a807df5afdef52b6d24ec1580153a6bcf0607f70a6e1d9fa74c5c3"}, - {file = "pyzmq-25.0.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4725412e27612f0d7d7c2f794d89807ad0227c2fc01dd6146b39ada49c748ef9"}, - {file = "pyzmq-25.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4d3d604fe0a67afd1aff906e54da557a5203368a99dcc50a70eef374f1d2abef"}, - {file = "pyzmq-25.0.0-cp39-cp39-win32.whl", hash = "sha256:3670e8c5644768f214a3b598fe46378a4a6f096d5fb82a67dfd3440028460565"}, - {file = "pyzmq-25.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:e99629a976809fe102ef73e856cf4b2660acd82a412a51e80ba2215e523dfd0a"}, - {file = "pyzmq-25.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:66509c48f7446b640eeae24b60c9c1461799a27b1b0754e438582e36b5af3315"}, - {file = "pyzmq-25.0.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9c464cc508177c09a5a6122b67f978f20e2954a21362bf095a0da4647e3e908"}, - {file = "pyzmq-25.0.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:28bcb2e66224a7ac2843eb632e4109d6b161479e7a2baf24e37210461485b4f1"}, - {file = "pyzmq-25.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0e7ef9ac807db50b4eb6f534c5dcc22f998f5dae920cc28873d2c1d080a4fc9"}, - {file = "pyzmq-25.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:5050f5c50b58a6e38ccaf9263a356f74ef1040f5ca4030225d1cb1a858c5b7b6"}, - {file = "pyzmq-25.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2a73af6504e0d2805e926abf136ebf536735a13c22f709be7113c2ec65b4bec3"}, - {file = "pyzmq-25.0.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0e8d00228db627ddd1b418c7afd81820b38575f237128c9650365f2dd6ac3443"}, - {file = "pyzmq-25.0.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5605621f2181f20b71f13f698944deb26a0a71af4aaf435b34dd90146092d530"}, - {file = "pyzmq-25.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6136bfb0e5a9cf8c60c6ac763eb21f82940a77e6758ea53516c8c7074f4ff948"}, - {file = "pyzmq-25.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:0a90b2480a26aef7c13cff18703ba8d68e181facb40f78873df79e6d42c1facc"}, - {file = "pyzmq-25.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00c94fd4c9dd3c95aace0c629a7fa713627a5c80c1819326b642adf6c4b8e2a2"}, - {file = "pyzmq-25.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20638121b0bdc80777ce0ec8c1f14f1ffec0697a1f88f0b564fa4a23078791c4"}, - {file = "pyzmq-25.0.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6f75b4b8574f3a8a0d6b4b52606fc75b82cb4391471be48ab0b8677c82f9ed4"}, - {file = "pyzmq-25.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cbb885f347eba7ab7681c450dee5b14aed9f153eec224ec0c3f299273d9241f"}, - {file = "pyzmq-25.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c48f257da280b3be6c94e05bd575eddb1373419dbb1a72c3ce64e88f29d1cd6d"}, - {file = "pyzmq-25.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:866eabf7c1315ef2e93e34230db7cbf672e0d7c626b37c11f7e870c8612c3dcc"}, - {file = "pyzmq-25.0.0.tar.gz", hash = "sha256:f330a1a2c7f89fd4b0aa4dcb7bf50243bf1c8da9a2f1efc31daf57a2046b31f2"}, -] - -[package.dependencies] -cffi = {version = "*", markers = "implementation_name == \"pypy\""} - -[[package]] -name = "qtconsole" -version = "5.4.0" -description = "Jupyter Qt console" -category = "main" -optional = false -python-versions = ">= 3.7" -files = [ - {file = "qtconsole-5.4.0-py3-none-any.whl", hash = "sha256:be13560c19bdb3b54ed9741a915aa701a68d424519e8341ac479a91209e694b2"}, - {file = "qtconsole-5.4.0.tar.gz", hash = "sha256:57748ea2fd26320a0b77adba20131cfbb13818c7c96d83fafcb110ff55f58b35"}, -] - -[package.dependencies] -ipykernel = ">=4.1" -ipython-genutils = "*" -jupyter-client = ">=4.1" -jupyter-core = "*" -pygments = "*" -pyzmq = ">=17.1" -qtpy = ">=2.0.1" -traitlets = "<5.2.1 || >5.2.1,<5.2.2 || >5.2.2" - -[package.extras] -doc = ["Sphinx (>=1.3)"] -test = ["flaky", "pytest", "pytest-qt"] - -[[package]] -name = "qtpy" -version = "2.3.0" -description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "QtPy-2.3.0-py3-none-any.whl", hash = "sha256:8d6d544fc20facd27360ea189592e6135c614785f0dec0b4f083289de6beb408"}, - {file = "QtPy-2.3.0.tar.gz", hash = "sha256:0603c9c83ccc035a4717a12908bf6bc6cb22509827ea2ec0e94c2da7c9ed57c5"}, -] - -[package.dependencies] -packaging = "*" - -[package.extras] -test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] - -[[package]] -name = "requests" -version = "2.28.2" -description = "Python HTTP for Humans." -category = "main" -optional = false -python-versions = ">=3.7, <4" -files = [ - {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, - {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "requests-oauthlib" -version = "1.3.1" -description = "OAuthlib authentication support for Requests." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, - {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, -] - -[package.dependencies] -oauthlib = ">=3.0.0" -requests = ">=2.0.0" - -[package.extras] -rsa = ["oauthlib[signedtoken] (>=3.0.0)"] - -[[package]] -name = "rfc3339-validator" -version = "0.1.4" -description = "A pure python RFC3339 validator" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, - {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, -] - -[package.dependencies] -six = "*" - -[[package]] -name = "rfc3986-validator" -version = "0.1.1" -description = "Pure python rfc3986 validator" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, - {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, -] - -[[package]] -name = "rich" -version = "13.0.1" -description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "main" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "rich-13.0.1-py3-none-any.whl", hash = "sha256:41fe1d05f433b0f4724cda8345219213d2bfa472ef56b2f64f415b5b94d51b04"}, - {file = "rich-13.0.1.tar.gz", hash = "sha256:25f83363f636995627a99f6e4abc52ed0970ebbd544960cc63cbb43aaac3d6f0"}, -] - -[package.dependencies] -commonmark = ">=0.9.0,<0.10.0" -pygments = ">=2.6.0,<3.0.0" - -[package.extras] -jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] - -[[package]] -name = "rsa" -version = "4.9" -description = "Pure-Python RSA implementation" -category = "main" -optional = false -python-versions = ">=3.6,<4" -files = [ - {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, - {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, -] - -[package.dependencies] -pyasn1 = ">=0.1.3" - -[[package]] -name = "ruamel-yaml" -version = "0.17.21" -description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" -category = "main" -optional = false -python-versions = ">=3" -files = [ - {file = "ruamel.yaml-0.17.21-py3-none-any.whl", hash = "sha256:742b35d3d665023981bd6d16b3d24248ce5df75fdb4e2924e93a05c1f8b61ca7"}, - {file = "ruamel.yaml-0.17.21.tar.gz", hash = "sha256:8b7ce697a2f212752a35c1ac414471dc16c424c9573be4926b56ff3f5d23b7af"}, -] - -[package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.2.6", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.11\""} - -[package.extras] -docs = ["ryd"] -jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] - -[[package]] -name = "ruamel-yaml-clib" -version = "0.2.7" -description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5859983f26d8cd7bb5c287ef452e8aacc86501487634573d260968f753e1d71"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:debc87a9516b237d0466a711b18b6ebeb17ba9f391eb7f91c649c5c4ec5006c7"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:df5828871e6648db72d1c19b4bd24819b80a755c4541d3409f0f7acd0f335c80"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:efa08d63ef03d079dcae1dfe334f6c8847ba8b645d08df286358b1f5293d24ab"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win32.whl", hash = "sha256:763d65baa3b952479c4e972669f679fe490eee058d5aa85da483ebae2009d231"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:d000f258cf42fec2b1bbf2863c61d7b8918d31ffee905da62dede869254d3b8a"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:045e0626baf1c52e5527bd5db361bc83180faaba2ff586e763d3d5982a876a9e"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_12_6_arm64.whl", hash = "sha256:721bc4ba4525f53f6a611ec0967bdcee61b31df5a56801281027a3a6d1c2daf5"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:41d0f1fa4c6830176eef5b276af04c89320ea616655d01327d5ce65e50575c94"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4b3a93bb9bc662fc1f99c5c3ea8e623d8b23ad22f861eb6fce9377ac07ad6072"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_12_0_arm64.whl", hash = "sha256:a234a20ae07e8469da311e182e70ef6b199d0fbeb6c6cc2901204dd87fb867e8"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:15910ef4f3e537eea7fe45f8a5d19997479940d9196f357152a09031c5be59f3"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:370445fd795706fd291ab00c9df38a0caed0f17a6fb46b0f607668ecb16ce763"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win32.whl", hash = "sha256:ecdf1a604009bd35c674b9225a8fa609e0282d9b896c03dd441a91e5f53b534e"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win_amd64.whl", hash = "sha256:f34019dced51047d6f70cb9383b2ae2853b7fc4dce65129a5acd49f4f9256646"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aa261c29a5545adfef9296b7e33941f46aa5bbd21164228e833412af4c9c75f"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f01da5790e95815eb5a8a138508c01c758e5f5bc0ce4286c4f7028b8dd7ac3d0"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:40d030e2329ce5286d6b231b8726959ebbe0404c92f0a578c0e2482182e38282"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c3ca1fbba4ae962521e5eb66d72998b51f0f4d0f608d3c0347a48e1af262efa7"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win32.whl", hash = "sha256:7bdb4c06b063f6fd55e472e201317a3bb6cdeeee5d5a38512ea5c01e1acbdd93"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:be2a7ad8fd8f7442b24323d24ba0b56c51219513cfa45b9ada3b87b76c374d4b"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91a789b4aa0097b78c93e3dc4b40040ba55bef518f84a40d4442f713b4094acb"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:99e77daab5d13a48a4054803d052ff40780278240a902b880dd37a51ba01a307"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3243f48ecd450eddadc2d11b5feb08aca941b5cd98c9b1db14b2fd128be8c697"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8831a2cedcd0f0927f788c5bdf6567d9dc9cc235646a434986a852af1cb54b4b"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win32.whl", hash = "sha256:3110a99e0f94a4a3470ff67fc20d3f96c25b13d24c6980ff841e82bafe827cac"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:92460ce908546ab69770b2e576e4f99fbb4ce6ab4b245345a3869a0a0410488f"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc0667c1eb8f83a3752b71b9c4ba55ef7c7058ae57022dd9b29065186a113d9"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:4a4d8d417868d68b979076a9be6a38c676eca060785abaa6709c7b31593c35d1"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf9a6bc4a0221538b1a7de3ed7bca4c93c02346853f44e1cd764be0023cd3640"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a7b301ff08055d73223058b5c46c55638917f04d21577c95e00e0c4d79201a6b"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win32.whl", hash = "sha256:d5e51e2901ec2366b79f16c2299a03e74ba4531ddcfacc1416639c557aef0ad8"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:184faeaec61dbaa3cace407cffc5819f7b977e75360e8d5ca19461cd851a5fc5"}, - {file = "ruamel.yaml.clib-0.2.7.tar.gz", hash = "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497"}, -] - -[[package]] -name = "scipy" -version = "1.10.0" -description = "Fundamental algorithms for scientific computing in Python" -category = "main" -optional = false -python-versions = "<3.12,>=3.8" -files = [ - {file = "scipy-1.10.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:b901b423c91281a974f6cd1c36f5c6c523e665b5a6d5e80fcb2334e14670eefd"}, - {file = "scipy-1.10.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:16ba05d3d1b9f2141004f3f36888e05894a525960b07f4c2bfc0456b955a00be"}, - {file = "scipy-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:151f066fe7d6653c3ffefd489497b8fa66d7316e3e0d0c0f7ff6acca1b802809"}, - {file = "scipy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f9ea0a37aca111a407cb98aa4e8dfde6e5d9333bae06dfa5d938d14c80bb5c3"}, - {file = "scipy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:27e548276b5a88b51212b61f6dda49a24acf5d770dff940bd372b3f7ced8c6c2"}, - {file = "scipy-1.10.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:42ab8b9e7dc1ebe248e55f54eea5307b6ab15011a7883367af48dd781d1312e4"}, - {file = "scipy-1.10.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e096b062d2efdea57f972d232358cb068413dc54eec4f24158bcbb5cb8bddfd8"}, - {file = "scipy-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df25a28bd22c990b22129d3c637fd5c3be4b7c94f975dca909d8bab3309b694"}, - {file = "scipy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ad449db4e0820e4b42baccefc98ec772ad7818dcbc9e28b85aa05a536b0f1a2"}, - {file = "scipy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:6faf86ef7717891195ae0537e48da7524d30bc3b828b30c9b115d04ea42f076f"}, - {file = "scipy-1.10.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:4bd0e3278126bc882d10414436e58fa3f1eca0aa88b534fcbf80ed47e854f46c"}, - {file = "scipy-1.10.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:38bfbd18dcc69eeb589811e77fae552fa923067fdfbb2e171c9eac749885f210"}, - {file = "scipy-1.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ab2a58064836632e2cec31ca197d3695c86b066bc4818052b3f5381bfd2a728"}, - {file = "scipy-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cd7a30970c29d9768a7164f564d1fbf2842bfc77b7d114a99bc32703ce0bf48"}, - {file = "scipy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:9b878c671655864af59c108c20e4da1e796154bd78c0ed6bb02bc41c84625686"}, - {file = "scipy-1.10.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:3afcbddb4488ac950ce1147e7580178b333a29cd43524c689b2e3543a080a2c8"}, - {file = "scipy-1.10.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:6e4497e5142f325a5423ff5fda2fff5b5d953da028637ff7c704378c8c284ea7"}, - {file = "scipy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:441cab2166607c82e6d7a8683779cb89ba0f475b983c7e4ab88f3668e268c143"}, - {file = "scipy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0490dc499fe23e4be35b8b6dd1e60a4a34f0c4adb30ac671e6332446b3cbbb5a"}, - {file = "scipy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:954ff69d2d1bf666b794c1d7216e0a746c9d9289096a64ab3355a17c7c59db54"}, - {file = "scipy-1.10.0.tar.gz", hash = "sha256:c8b3cbc636a87a89b770c6afc999baa6bcbb01691b5ccbbc1b1791c7c0a07540"}, -] - -[package.dependencies] -numpy = ">=1.19.5,<1.27.0" - -[package.extras] -dev = ["click", "doit (>=0.36.0)", "flake8", "mypy", "pycodestyle", "pydevtool", "rich-click", "typing_extensions"] -doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] - -[[package]] -name = "secretstorage" -version = "3.3.3" -description = "Python bindings to FreeDesktop.org Secret Service API" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, - {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, -] - -[package.dependencies] -cryptography = ">=2.0" -jeepney = ">=0.6" - -[[package]] -name = "send2trash" -version = "1.8.0" -description = "Send file to trash natively under Mac OS X, Windows and Linux." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "Send2Trash-1.8.0-py3-none-any.whl", hash = "sha256:f20eaadfdb517eaca5ce077640cb261c7d2698385a6a0f072a4a5447fd49fa08"}, - {file = "Send2Trash-1.8.0.tar.gz", hash = "sha256:d2c24762fd3759860a0aff155e45871447ea58d2be6bdd39b5c8f966a0c99c2d"}, -] - -[package.extras] -nativelib = ["pyobjc-framework-Cocoa", "pywin32"] -objc = ["pyobjc-framework-Cocoa"] -win32 = ["pywin32"] - -[[package]] -name = "sentry-sdk" -version = "1.13.0" -description = "Python client for Sentry (https://sentry.io)" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "sentry-sdk-1.13.0.tar.gz", hash = "sha256:72da0766c3069a3941eadbdfa0996f83f5a33e55902a19ba399557cfee1dddcc"}, - {file = "sentry_sdk-1.13.0-py2.py3-none-any.whl", hash = "sha256:b7ff6318183e551145b5c4766eb65b59ad5b63ff234dffddc5fb50340cad6729"}, -] - -[package.dependencies] -certifi = "*" -urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""} - -[package.extras] -aiohttp = ["aiohttp (>=3.5)"] -beam = ["apache-beam (>=2.12)"] -bottle = ["bottle (>=0.12.13)"] -celery = ["celery (>=3)"] -chalice = ["chalice (>=1.16.0)"] -django = ["django (>=1.8)"] -falcon = ["falcon (>=1.4)"] -fastapi = ["fastapi (>=0.79.0)"] -flask = ["blinker (>=1.1)", "flask (>=0.11)"] -httpx = ["httpx (>=0.16.0)"] -opentelemetry = ["opentelemetry-distro (>=0.350b0)"] -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 (>=5)"] - -[[package]] -name = "setproctitle" -version = "1.3.2" -description = "A Python module to customize the process title" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "setproctitle-1.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:288943dec88e178bb2fd868adf491197cc0fc8b6810416b1c6775e686bab87fe"}, - {file = "setproctitle-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:630f6fe5e24a619ccf970c78e084319ee8be5be253ecc9b5b216b0f474f5ef18"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c877691b90026670e5a70adfbcc735460a9f4c274d35ec5e8a43ce3f8443005"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a55fe05f15c10e8c705038777656fe45e3bd676d49ad9ac8370b75c66dd7cd7"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab45146c71ca6592c9cc8b354a2cc9cc4843c33efcbe1d245d7d37ce9696552d"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00c9d5c541a2713ba0e657e0303bf96ddddc412ef4761676adc35df35d7c246"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:265ecbe2c6eafe82e104f994ddd7c811520acdd0647b73f65c24f51374cf9494"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c2c46200656280a064073447ebd363937562debef329482fd7e570c8d498f806"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:fa2f50678f04fda7a75d0fe5dd02bbdd3b13cbe6ed4cf626e4472a7ccf47ae94"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7f2719a398e1a2c01c2a63bf30377a34d0b6ef61946ab9cf4d550733af8f1ef1"}, - {file = "setproctitle-1.3.2-cp310-cp310-win32.whl", hash = "sha256:e425be62524dc0c593985da794ee73eb8a17abb10fe692ee43bb39e201d7a099"}, - {file = "setproctitle-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:e85e50b9c67854f89635a86247412f3ad66b132a4d8534ac017547197c88f27d"}, - {file = "setproctitle-1.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a97d51c17d438cf5be284775a322d57b7ca9505bb7e118c28b1824ecaf8aeaa"}, - {file = "setproctitle-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:587c7d6780109fbd8a627758063d08ab0421377c0853780e5c356873cdf0f077"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d17c8bd073cbf8d141993db45145a70b307385b69171d6b54bcf23e5d644de"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e932089c35a396dc31a5a1fc49889dd559548d14cb2237adae260382a090382e"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e4f8f12258a8739c565292a551c3db62cca4ed4f6b6126664e2381acb4931bf"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:570d255fd99c7f14d8f91363c3ea96bd54f8742275796bca67e1414aeca7d8c3"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a8e0881568c5e6beff91ef73c0ec8ac2a9d3ecc9edd6bd83c31ca34f770910c4"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4bba3be4c1fabf170595b71f3af46c6d482fbe7d9e0563999b49999a31876f77"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:37ece938110cab2bb3957e3910af8152ca15f2b6efdf4f2612e3f6b7e5459b80"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db684d6bbb735a80bcbc3737856385b55d53f8a44ce9b46e9a5682c5133a9bf7"}, - {file = "setproctitle-1.3.2-cp311-cp311-win32.whl", hash = "sha256:ca58cd260ea02759238d994cfae844fc8b1e206c684beb8f38877dcab8451dfc"}, - {file = "setproctitle-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:88486e6cce2a18a033013d17b30a594f1c5cb42520c49c19e6ade40b864bb7ff"}, - {file = "setproctitle-1.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:92c626edc66169a1b09e9541b9c0c9f10488447d8a2b1d87c8f0672e771bc927"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:710e16fa3bade3b026907e4a5e841124983620046166f355bbb84be364bf2a02"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f29b75e86260b0ab59adb12661ef9f113d2f93a59951373eb6d68a852b13e83"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c8d9650154afaa86a44ff195b7b10d683c73509d085339d174e394a22cccbb9"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0452282258dfcc01697026a8841258dd2057c4438b43914b611bccbcd048f10"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e49ae693306d7624015f31cb3e82708916759d592c2e5f72a35c8f4cc8aef258"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1ff863a20d1ff6ba2c24e22436a3daa3cd80be1dfb26891aae73f61b54b04aca"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:55ce1e9925ce1765865442ede9dca0ba9bde10593fcd570b1f0fa25d3ec6b31c"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7fe9df7aeb8c64db6c34fc3b13271a363475d77bc157d3f00275a53910cb1989"}, - {file = "setproctitle-1.3.2-cp37-cp37m-win32.whl", hash = "sha256:e5c50e164cd2459bc5137c15288a9ef57160fd5cbf293265ea3c45efe7870865"}, - {file = "setproctitle-1.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a499fff50387c1520c085a07578a000123f519e5f3eee61dd68e1d301659651f"}, - {file = "setproctitle-1.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5b932c3041aa924163f4aab970c2f0e6b4d9d773f4d50326e0ea1cd69240e5c5"}, - {file = "setproctitle-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4bfc89bd33ebb8e4c0e9846a09b1f5a4a86f5cb7a317e75cc42fee1131b4f4f"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd3cf4286a60fdc95451d8d14e0389a6b4f5cebe02c7f2609325eb016535963"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5fb4f769c02f63fac90989711a3fee83919f47ae9afd4758ced5d86596318c65"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5194b4969f82ea842a4f6af2f82cd16ebdc3f1771fb2771796e6add9835c1973"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cde41857a644b7353a0060b5f94f7ba7cf593ebde5a1094da1be581ac9a31"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9124bedd8006b0e04d4e8a71a0945da9b67e7a4ab88fdad7b1440dc5b6122c42"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c8a09d570b39517de10ee5b718730e171251ce63bbb890c430c725c8c53d4484"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:8ff3c8cb26afaed25e8bca7b9dd0c1e36de71f35a3a0706b5c0d5172587a3827"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:589be87172b238f839e19f146b9ea47c71e413e951ef0dc6db4218ddacf3c202"}, - {file = "setproctitle-1.3.2-cp38-cp38-win32.whl", hash = "sha256:4749a2b0c9ac52f864d13cee94546606f92b981b50e46226f7f830a56a9dc8e1"}, - {file = "setproctitle-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:e43f315c68aa61cbdef522a2272c5a5b9b8fd03c301d3167b5e1343ef50c676c"}, - {file = "setproctitle-1.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:de3a540cd1817ede31f530d20e6a4935bbc1b145fd8f8cf393903b1e02f1ae76"}, - {file = "setproctitle-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4058564195b975ddc3f0462375c533cce310ccdd41b80ac9aed641c296c3eff4"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c5d5dad7c28bdd1ec4187d818e43796f58a845aa892bb4481587010dc4d362b"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ffc61a388a5834a97953d6444a2888c24a05f2e333f9ed49f977a87bb1ad4761"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fa1a0fbee72b47dc339c87c890d3c03a72ea65c061ade3204f285582f2da30f"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8a988c7220c002c45347430993830666e55bc350179d91fcee0feafe64e1d4"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bae283e85fc084b18ffeb92e061ff7ac5af9e183c9d1345c93e178c3e5069cbe"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fed18e44711c5af4b681c2b3b18f85e6f0f1b2370a28854c645d636d5305ccd8"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:b34baef93bfb20a8ecb930e395ccd2ae3268050d8cf4fe187de5e2bd806fd796"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7f0bed90a216ef28b9d227d8d73e28a8c9b88c0f48a082d13ab3fa83c581488f"}, - {file = "setproctitle-1.3.2-cp39-cp39-win32.whl", hash = "sha256:4d8938249a7cea45ab7e1e48b77685d0f2bab1ebfa9dde23e94ab97968996a7c"}, - {file = "setproctitle-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:a47d97a75fd2d10c37410b180f67a5835cb1d8fdea2648fd7f359d4277f180b9"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dad42e676c5261eb50fdb16bdf3e2771cf8f99a79ef69ba88729aeb3472d8575"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c91b9bc8985d00239f7dc08a49927a7ca1ca8a6af2c3890feec3ed9665b6f91e"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8579a43eafd246e285eb3a5b939e7158073d5087aacdd2308f23200eac2458b"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:2fbd8187948284293f43533c150cd69a0e4192c83c377da837dbcd29f6b83084"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:faec934cfe5fd6ac1151c02e67156c3f526e82f96b24d550b5d51efa4a5527c6"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1aafc91cbdacc9e5fe712c52077369168e6b6c346f3a9d51bf600b53eae56bb"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b617f12c9be61e8f4b2857be4a4319754756845dbbbd9c3718f468bbb1e17bcb"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b2c9cb2705fc84cb8798f1ba74194f4c080aaef19d9dae843591c09b97678e98"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a149a5f7f2c5a065d4e63cb0d7a4b6d3b66e6e80f12e3f8827c4f63974cbf122"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e3ac25bfc4a0f29d2409650c7532d5ddfdbf29f16f8a256fc31c47d0dc05172"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65d884e22037b23fa25b2baf1a3316602ed5c5971eb3e9d771a38c3a69ce6e13"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7aa0aac1711fadffc1d51e9d00a3bea61f68443d6ac0241a224e4d622489d665"}, - {file = "setproctitle-1.3.2.tar.gz", hash = "sha256:b9fb97907c830d260fa0658ed58afd48a86b2b88aac521135c352ff7fd3477fd"}, -] - -[package.extras] -test = ["pytest"] - -[[package]] -name = "setuptools" -version = "65.7.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "setuptools-65.7.0-py3-none-any.whl", hash = "sha256:8ab4f1dbf2b4a65f7eec5ad0c620e84c34111a68d3349833494b9088212214dd"}, - {file = "setuptools-65.7.0.tar.gz", hash = "sha256:4d3c92fac8f1118bb77a22181355e29c239cabfe2b9effdaa665c66b711136d7"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -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.0" -description = "A pure Python implementation of a sliding window memory map manager" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, - {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, -] - -[[package]] -name = "sniffio" -version = "1.3.0" -description = "Sniff out which async library your code is running under" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, -] - -[[package]] -name = "soupsieve" -version = "2.3.2.post1" -description = "A modern CSS selector implementation for Beautiful Soup." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, - {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, -] - -[[package]] -name = "stable-baselines3" -version = "1.7.0" -description = "Pytorch version of Stable Baselines, implementations of reinforcement learning algorithms." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "stable_baselines3-1.7.0-py3-none-any.whl", hash = "sha256:6cbb55918f15662e958a7088dd5effd230443b545c6f6a6248a3532c962dc1b0"}, - {file = "stable_baselines3-1.7.0.tar.gz", hash = "sha256:0b6d4b35b5b9060cf94bc09eb631a9a619d9a0d1eda06e690b0bf6336651f0a4"}, -] - -[package.dependencies] -ale-py = {version = "0.7.4", optional = true, markers = "extra == \"extra\""} -autorom = {version = ">=0.4.2,<0.5.0", extras = ["accept-rom-license"], optional = true, markers = "extra == \"extra\""} -cloudpickle = "*" -gym = "0.21" -importlib-metadata = ">=4.13,<5.0" -matplotlib = "*" -numpy = "*" -opencv-python = {version = "*", optional = true, markers = "extra == \"extra\""} -pandas = "*" -pillow = {version = "*", optional = true, markers = "extra == \"extra\""} -psutil = {version = "*", optional = true, markers = "extra == \"extra\""} -rich = {version = "*", optional = true, markers = "extra == \"extra\""} -tensorboard = {version = ">=2.9.1", optional = true, markers = "extra == \"extra\""} -torch = ">=1.11" -tqdm = {version = "*", optional = true, markers = "extra == \"extra\""} - -[package.extras] -docs = ["sphinx", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx-copybutton", "sphinx-rtd-theme", "sphinxcontrib.spelling"] -extra = ["ale-py (==0.7.4)", "autorom[accept-rom-license] (>=0.4.2,<0.5.0)", "opencv-python", "pillow", "psutil", "rich", "tensorboard (>=2.9.1)", "tqdm"] -tests = ["black", "flake8 (>=3.8)", "flake8-bugbear", "isort (>=5.0)", "mypy", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "pytype", "scipy (>=1.4.1)"] - -[[package]] -name = "stack-data" -version = "0.6.2" -description = "Extract data from python stack frames and tracebacks for informative displays" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, - {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, -] - -[package.dependencies] -asttokens = ">=2.1.0" -executing = ">=1.2.0" -pure-eval = "*" - -[package.extras] -tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] - -[[package]] -name = "tabulate" -version = "0.9.0" -description = "Pretty-print tabular data" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, - {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, -] - -[package.extras] -widechars = ["wcwidth"] - -[[package]] -name = "tensorboard" -version = "2.11.0" -description = "TensorBoard lets you watch Tensors Flow" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tensorboard-2.11.0-py3-none-any.whl", hash = "sha256:a0e592ee87962e17af3f0dce7faae3fbbd239030159e9e625cce810b7e35c53d"}, -] - -[package.dependencies] -absl-py = ">=0.4" -google-auth = ">=1.6.3,<3" -google-auth-oauthlib = ">=0.4.1,<0.5" -grpcio = ">=1.24.3" -markdown = ">=2.6.8" -numpy = ">=1.12.0" -protobuf = ">=3.9.2,<4" -requests = ">=2.21.0,<3" -setuptools = ">=41.0.0" -tensorboard-data-server = ">=0.6.0,<0.7.0" -tensorboard-plugin-wit = ">=1.6.0" -werkzeug = ">=1.0.1" -wheel = ">=0.26" - -[[package]] -name = "tensorboard-data-server" -version = "0.6.1" -description = "Fast data loading for TensorBoard" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "tensorboard_data_server-0.6.1-py3-none-any.whl", hash = "sha256:809fe9887682d35c1f7d1f54f0f40f98bb1f771b14265b453ca051e2ce58fca7"}, - {file = "tensorboard_data_server-0.6.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:fa8cef9be4fcae2f2363c88176638baf2da19c5ec90addb49b1cde05c95c88ee"}, - {file = "tensorboard_data_server-0.6.1-py3-none-manylinux2010_x86_64.whl", hash = "sha256:d8237580755e58eff68d1f3abefb5b1e39ae5c8b127cc40920f9c4fb33f4b98a"}, -] - -[[package]] -name = "tensorboard-plugin-wit" -version = "1.8.1" -description = "What-If Tool TensorBoard plugin." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "tensorboard_plugin_wit-1.8.1-py3-none-any.whl", hash = "sha256:ff26bdd583d155aa951ee3b152b3d0cffae8005dc697f72b44a8e8c2a77a8cbe"}, -] - -[[package]] -name = "terminado" -version = "0.17.1" -description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "terminado-0.17.1-py3-none-any.whl", hash = "sha256:8650d44334eba354dd591129ca3124a6ba42c3d5b70df5051b6921d506fdaeae"}, - {file = "terminado-0.17.1.tar.gz", hash = "sha256:6ccbbcd3a4f8a25a5ec04991f39a0b8db52dfcd487ea0e578d977e6752380333"}, -] - -[package.dependencies] -ptyprocess = {version = "*", markers = "os_name != \"nt\""} -pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} -tornado = ">=6.1.0" - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] - -[[package]] -name = "tinycss2" -version = "1.2.1" -description = "A tiny CSS parser" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847"}, - {file = "tinycss2-1.2.1.tar.gz", hash = "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627"}, -] - -[package.dependencies] -webencodings = ">=0.4" - -[package.extras] -doc = ["sphinx", "sphinx_rtd_theme"] -test = ["flake8", "isort", "pytest"] - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - -[[package]] -name = "tomlkit" -version = "0.11.6" -description = "Style preserving TOML library" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, - {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, -] - -[[package]] -name = "toolz" -version = "0.12.0" -description = "List processing tools and functional utilities" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "toolz-0.12.0-py3-none-any.whl", hash = "sha256:2059bd4148deb1884bb0eb770a3cde70e7f954cfbbdc2285f1f2de01fd21eb6f"}, - {file = "toolz-0.12.0.tar.gz", hash = "sha256:88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194"}, -] - -[[package]] -name = "torch" -version = "1.13.1" -description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" -category = "main" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "torch-1.13.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:fd12043868a34a8da7d490bf6db66991108b00ffbeecb034228bfcbbd4197143"}, - {file = "torch-1.13.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:d9fe785d375f2e26a5d5eba5de91f89e6a3be5d11efb497e76705fdf93fa3c2e"}, - {file = "torch-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:98124598cdff4c287dbf50f53fb455f0c1e3a88022b39648102957f3445e9b76"}, - {file = "torch-1.13.1-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:393a6273c832e047581063fb74335ff50b4c566217019cc6ace318cd79eb0566"}, - {file = "torch-1.13.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:0122806b111b949d21fa1a5f9764d1fd2fcc4a47cb7f8ff914204fd4fc752ed5"}, - {file = "torch-1.13.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:22128502fd8f5b25ac1cd849ecb64a418382ae81dd4ce2b5cebaa09ab15b0d9b"}, - {file = "torch-1.13.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:76024be052b659ac1304ab8475ab03ea0a12124c3e7626282c9c86798ac7bc11"}, - {file = "torch-1.13.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:ea8dda84d796094eb8709df0fcd6b56dc20b58fdd6bc4e8d7109930dafc8e419"}, - {file = "torch-1.13.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2ee7b81e9c457252bddd7d3da66fb1f619a5d12c24d7074de91c4ddafb832c93"}, - {file = "torch-1.13.1-cp37-none-macosx_10_9_x86_64.whl", hash = "sha256:0d9b8061048cfb78e675b9d2ea8503bfe30db43d583599ae8626b1263a0c1380"}, - {file = "torch-1.13.1-cp37-none-macosx_11_0_arm64.whl", hash = "sha256:f402ca80b66e9fbd661ed4287d7553f7f3899d9ab54bf5c67faada1555abde28"}, - {file = "torch-1.13.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:727dbf00e2cf858052364c0e2a496684b9cb5aa01dc8a8bc8bbb7c54502bdcdd"}, - {file = "torch-1.13.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:df8434b0695e9ceb8cc70650afc1310d8ba949e6db2a0525ddd9c3b2b181e5fe"}, - {file = "torch-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:5e1e722a41f52a3f26f0c4fcec227e02c6c42f7c094f32e49d4beef7d1e213ea"}, - {file = "torch-1.13.1-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:33e67eea526e0bbb9151263e65417a9ef2d8fa53cbe628e87310060c9dcfa312"}, - {file = "torch-1.13.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:eeeb204d30fd40af6a2d80879b46a7efbe3cf43cdbeb8838dd4f3d126cc90b2b"}, - {file = "torch-1.13.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:50ff5e76d70074f6653d191fe4f6a42fdbe0cf942fbe2a3af0b75eaa414ac038"}, - {file = "torch-1.13.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:2c3581a3fd81eb1f0f22997cddffea569fea53bafa372b2c0471db373b26aafc"}, - {file = "torch-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:0aa46f0ac95050c604bcf9ef71da9f1172e5037fdf2ebe051962d47b123848e7"}, - {file = "torch-1.13.1-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:6930791efa8757cb6974af73d4996b6b50c592882a324b8fb0589c6a9ba2ddaf"}, - {file = "torch-1.13.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:e0df902a7c7dd6c795698532ee5970ce898672625635d885eade9976e5a04949"}, -] - -[package.dependencies] -nvidia-cublas-cu11 = {version = "11.10.3.66", markers = "platform_system == \"Linux\""} -nvidia-cuda-nvrtc-cu11 = {version = "11.7.99", markers = "platform_system == \"Linux\""} -nvidia-cuda-runtime-cu11 = {version = "11.7.99", markers = "platform_system == \"Linux\""} -nvidia-cudnn-cu11 = {version = "8.5.0.96", markers = "platform_system == \"Linux\""} -typing-extensions = "*" - -[package.extras] -opt-einsum = ["opt-einsum (>=3.3)"] - -[[package]] -name = "torch-tb-profiler" -version = "0.4.1" -description = "PyTorch Profiler TensorBoard Plugin" -category = "main" -optional = false -python-versions = ">=3.6.2" -files = [ - {file = "torch_tb_profiler-0.4.1-py3-none-any.whl", hash = "sha256:df7428ce5564e8357d0d03c0f246398c448fc8cd91b3075370ca5c25defbc635"}, - {file = "torch_tb_profiler-0.4.1.tar.gz", hash = "sha256:f2c7fb27d420be443ffde50ada655c19f76a245d21e7772de753196fd0967685"}, -] - -[package.dependencies] -pandas = ">=1.0.0" -tensorboard = ">=1.15,<2.1.0 || >2.1.0" - -[package.extras] -blob = ["azure-storage-blob"] -gs = ["google-cloud-storage"] -s3 = ["boto3"] - -[[package]] -name = "tornado" -version = "6.2" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "main" -optional = false -python-versions = ">= 3.7" -files = [ - {file = "tornado-6.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72"}, - {file = "tornado-6.2-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9"}, - {file = "tornado-6.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba09ef14ca9893954244fd872798b4ccb2367c165946ce2dd7376aebdde8e3ac"}, - {file = "tornado-6.2-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8150f721c101abdef99073bf66d3903e292d851bee51910839831caba341a75"}, - {file = "tornado-6.2-cp37-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e"}, - {file = "tornado-6.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5f8c52d219d4995388119af7ccaa0bcec289535747620116a58d830e7c25d8a8"}, - {file = "tornado-6.2-cp37-abi3-musllinux_1_1_i686.whl", hash = "sha256:6fdfabffd8dfcb6cf887428849d30cf19a3ea34c2c248461e1f7d718ad30b66b"}, - {file = "tornado-6.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca"}, - {file = "tornado-6.2-cp37-abi3-win32.whl", hash = "sha256:5c87076709343557ef8032934ce5f637dbb552efa7b21d08e89ae7619ed0eb23"}, - {file = "tornado-6.2-cp37-abi3-win_amd64.whl", hash = "sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b"}, - {file = "tornado-6.2.tar.gz", hash = "sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13"}, -] - -[[package]] -name = "tqdm" -version = "4.64.1" -description = "Fast, Extensible Progress Meter" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -files = [ - {file = "tqdm-4.64.1-py2.py3-none-any.whl", hash = "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1"}, - {file = "tqdm-4.64.1.tar.gz", hash = "sha256:5f4f682a004951c1b450bc753c710e9280c5746ce6ffedee253ddbcbf54cf1e4"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] -notebook = ["ipywidgets (>=6)"] -slack = ["slack-sdk"] -telegram = ["requests"] - -[[package]] -name = "traitlets" -version = "5.8.1" -description = "Traitlets Python configuration system" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "traitlets-5.8.1-py3-none-any.whl", hash = "sha256:a1ca5df6414f8b5760f7c5f256e326ee21b581742114545b462b35ffe3f04861"}, - {file = "traitlets-5.8.1.tar.gz", hash = "sha256:32500888f5ff7bbf3b9267ea31748fa657aaf34d56d85e60f91dda7dc7f5785b"}, -] - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] - -[[package]] -name = "typing-extensions" -version = "4.4.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, -] - -[[package]] -name = "uri-template" -version = "1.2.0" -description = "RFC 6570 URI Template Processor" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "uri_template-1.2.0-py3-none-any.whl", hash = "sha256:f1699c77b73b925cf4937eae31ab282a86dc885c333f2e942513f08f691fc7db"}, - {file = "uri_template-1.2.0.tar.gz", hash = "sha256:934e4d09d108b70eb8a24410af8615294d09d279ce0e7cbcdaef1bd21f932b06"}, -] - -[package.extras] -dev = ["flake8 (<4.0.0)", "flake8-annotations", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-noqa", "flake8-requirements", "flake8-type-annotations", "flake8-use-fstring", "mypy", "pep8-naming"] - -[[package]] -name = "urllib3" -version = "1.26.14" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "urllib3-1.26.14-py2.py3-none-any.whl", hash = "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1"}, - {file = "urllib3-1.26.14.tar.gz", hash = "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "virtualenv" -version = "20.17.1" -description = "Virtual Python Environment builder" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "virtualenv-20.17.1-py3-none-any.whl", hash = "sha256:ce3b1684d6e1a20a3e5ed36795a97dfc6af29bc3970ca8dab93e11ac6094b3c4"}, - {file = "virtualenv-20.17.1.tar.gz", hash = "sha256:f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058"}, -] - -[package.dependencies] -distlib = ">=0.3.6,<1" -filelock = ">=3.4.1,<4" -platformdirs = ">=2.4,<3" - -[package.extras] -docs = ["proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-argparse (>=0.3.2)", "sphinx-rtd-theme (>=1)", "towncrier (>=22.8)"] -testing = ["coverage (>=6.2)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=21.3)", "pytest (>=7.0.1)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.6.1)", "pytest-randomly (>=3.10.3)", "pytest-timeout (>=2.1)"] - -[[package]] -name = "wandb" -version = "0.13.10" -description = "A CLI and library for interacting with the Weights and Biases API." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "wandb-0.13.10-py3-none-any.whl", hash = "sha256:d4a3397aed2790d5fa8adc5336e3607813dc498a49b1a0a48297f78d89a71b0b"}, - {file = "wandb-0.13.10.tar.gz", hash = "sha256:a2cde45dd6390ed1923ef3e1eca26487cb1e02e4732515856933c4494a975ad3"}, -] - -[package.dependencies] -appdirs = ">=1.4.3" -Click = ">=7.0,<8.0.0 || >8.0.0" -docker-pycreds = ">=0.4.0" -GitPython = ">=1.0.0" -pathtools = "*" -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] -aws = ["boto3"] -azure = ["azure-storage-blob"] -gcp = ["google-cloud-storage"] -grpc = ["grpcio (>=1.27.2)"] -kubeflow = ["google-cloud-storage", "kubernetes", "minio", "sh"] -launch = ["boto3", "botocore", "chardet", "google-cloud-storage", "iso8601", "kubernetes", "nbconvert", "nbformat", "typing-extensions"] -media = ["bokeh", "moviepy", "numpy", "pillow", "plotly", "rdkit-pypi", "soundfile"] -models = ["cloudpickle"] -sweeps = ["sweeps (>=0.2.0)"] - -[[package]] -name = "wcwidth" -version = "0.2.6" -description = "Measures the displayed width of unicode strings in a terminal" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, - {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, -] - -[[package]] -name = "webcolors" -version = "1.12" -description = "A library for working with color names and color values formats defined by HTML and CSS." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "webcolors-1.12-py3-none-any.whl", hash = "sha256:d98743d81d498a2d3eaf165196e65481f0d2ea85281463d856b1e51b09f62dce"}, - {file = "webcolors-1.12.tar.gz", hash = "sha256:16d043d3a08fd6a1b1b7e3e9e62640d09790dce80d2bdd4792a175b35fe794a9"}, -] - -[[package]] -name = "webencodings" -version = "0.5.1" -description = "Character encoding aliases for legacy web content" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] - -[[package]] -name = "websocket-client" -version = "1.4.2" -description = "WebSocket client for Python with low level API options" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "websocket-client-1.4.2.tar.gz", hash = "sha256:d6e8f90ca8e2dd4e8027c4561adeb9456b54044312dba655e7cae652ceb9ae59"}, - {file = "websocket_client-1.4.2-py3-none-any.whl", hash = "sha256:d6b06432f184438d99ac1f456eaf22fe1ade524c3dd16e661142dc54e9cba574"}, -] - -[package.extras] -docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] -optional = ["python-socks", "wsaccel"] -test = ["websockets"] - -[[package]] -name = "werkzeug" -version = "2.2.2" -description = "The comprehensive WSGI web application library." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Werkzeug-2.2.2-py3-none-any.whl", hash = "sha256:f979ab81f58d7318e064e99c4506445d60135ac5cd2e177a2de0089bfd4c9bd5"}, - {file = "Werkzeug-2.2.2.tar.gz", hash = "sha256:7ea2d48322cc7c0f8b3a215ed73eabd7b5d75d0b50e31ab006286ccff9e00b8f"}, -] - -[package.dependencies] -MarkupSafe = ">=2.1.1" - -[package.extras] -watchdog = ["watchdog"] - -[[package]] -name = "wheel" -version = "0.38.4" -description = "A built-package format for Python" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "wheel-0.38.4-py3-none-any.whl", hash = "sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8"}, - {file = "wheel-0.38.4.tar.gz", hash = "sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac"}, -] - -[package.extras] -test = ["pytest (>=3.0.0)"] - -[[package]] -name = "widgetsnbextension" -version = "4.0.5" -description = "Jupyter interactive widgets for Jupyter Notebook" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "widgetsnbextension-4.0.5-py3-none-any.whl", hash = "sha256:eaaaf434fb9b08bd197b2a14ffe45ddb5ac3897593d43c69287091e5f3147bf7"}, - {file = "widgetsnbextension-4.0.5.tar.gz", hash = "sha256:003f716d930d385be3fd9de42dd9bf008e30053f73bddde235d14fbeaeff19af"}, -] - -[[package]] -name = "zipp" -version = "3.11.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "zipp-3.11.0-py3-none-any.whl", hash = "sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa"}, - {file = "zipp-3.11.0.tar.gz", hash = "sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[metadata] -lock-version = "2.0" -python-versions = "~3.10" -content-hash = "ab3cf6f3768a3f2d608f049b0ee69c9224dd1530f0bd392a4116f23597aaf34a" diff --git a/ppo/ppo.py b/ppo/ppo.py deleted file mode 100644 index 0daae26ebb77c009cf9c9af51b802fe1efcfdd10..0000000000000000000000000000000000000000 --- a/ppo/ppo.py +++ /dev/null @@ -1,349 +0,0 @@ -import numpy as np -import torch -import torch.nn as nn -import torch.nn.functional as F - -from dataclasses import asdict, dataclass, field -from time import perf_counter -from torch.optim import Adam -from torch.utils.tensorboard.writer import SummaryWriter -from typing import List, Optional, NamedTuple, TypeVar - -from shared.algorithm import Algorithm -from shared.callbacks.callback import Callback -from shared.gae import compute_advantage, compute_rtg_and_advantage -from shared.policy.on_policy import ActorCritic -from shared.schedule import constant_schedule, linear_schedule, update_learning_rate -from shared.trajectory import Trajectory, TrajectoryAccumulator -from wrappers.vectorable_wrapper import VecEnv, VecEnvObs - - -@dataclass -class PPOTrajectory(Trajectory): - logp_a: List[float] = field(default_factory=list) - - def add( - self, - obs: np.ndarray, - act: np.ndarray, - next_obs: np.ndarray, - rew: float, - terminated: bool, - v: float, - logp_a: float, - ): - super().add(obs, act, next_obs, rew, terminated, v) - self.logp_a.append(logp_a) - - -class PPOTrajectoryAccumulator(TrajectoryAccumulator): - def __init__(self, num_envs: int) -> None: - super().__init__(num_envs, PPOTrajectory) - - def step( - self, - obs: VecEnvObs, - action: np.ndarray, - next_obs: VecEnvObs, - reward: np.ndarray, - done: np.ndarray, - val: np.ndarray, - logp_a: np.ndarray, - ) -> None: - super().step(obs, action, next_obs, reward, done, val, logp_a) - - -class TrainStepStats(NamedTuple): - loss: float - pi_loss: float - v_loss: float - entropy_loss: float - approx_kl: float - clipped_frac: float - val_clipped_frac: float - - -@dataclass -class TrainStats: - loss: float - pi_loss: float - v_loss: float - entropy_loss: float - approx_kl: float - clipped_frac: float - val_clipped_frac: float - explained_var: float - - def __init__(self, step_stats: List[TrainStepStats], explained_var: float) -> None: - self.loss = np.mean([s.loss for s in step_stats]).item() - self.pi_loss = np.mean([s.pi_loss for s in step_stats]).item() - self.v_loss = np.mean([s.v_loss for s in step_stats]).item() - self.entropy_loss = np.mean([s.entropy_loss for s in step_stats]).item() - self.approx_kl = np.mean([s.approx_kl for s in step_stats]).item() - self.clipped_frac = np.mean([s.clipped_frac for s in step_stats]).item() - self.val_clipped_frac = np.mean([s.val_clipped_frac for s in step_stats]).item() - self.explained_var = explained_var - - def write_to_tensorboard(self, tb_writer: SummaryWriter, global_step: int) -> None: - for name, value in asdict(self).items(): - tb_writer.add_scalar(f"losses/{name}", value, global_step=global_step) - - def __repr__(self) -> str: - return " | ".join( - [ - f"Loss: {round(self.loss, 2)}", - f"Pi L: {round(self.pi_loss, 2)}", - f"V L: {round(self.v_loss, 2)}", - f"E L: {round(self.entropy_loss, 2)}", - f"Apx KL Div: {round(self.approx_kl, 2)}", - f"Clip Frac: {round(self.clipped_frac, 2)}", - f"Val Clip Frac: {round(self.val_clipped_frac, 2)}", - ] - ) - - -PPOSelf = TypeVar("PPOSelf", bound="PPO") - - -class PPO(Algorithm): - def __init__( - self, - policy: ActorCritic, - env: VecEnv, - device: torch.device, - tb_writer: SummaryWriter, - learning_rate: float = 3e-4, - learning_rate_decay: str = "none", - n_steps: int = 2048, - batch_size: int = 64, - n_epochs: int = 10, - gamma: float = 0.99, - gae_lambda: float = 0.95, - clip_range: float = 0.2, - clip_range_decay: str = "none", - clip_range_vf: Optional[float] = None, - clip_range_vf_decay: str = "none", - normalize_advantage: bool = True, - ent_coef: float = 0.0, - ent_coef_decay: str = "none", - vf_coef: float = 0.5, - ppo2_vf_coef_halving: bool = False, - max_grad_norm: float = 0.5, - update_rtg_between_epochs: bool = False, - sde_sample_freq: int = -1, - ) -> None: - super().__init__(policy, env, device, tb_writer) - self.policy = policy - - self.gamma = gamma - self.gae_lambda = gae_lambda - self.optimizer = Adam(self.policy.parameters(), lr=learning_rate, eps=1e-7) - self.lr_schedule = ( - linear_schedule(learning_rate, 0) - if learning_rate_decay == "linear" - else constant_schedule(learning_rate) - ) - self.max_grad_norm = max_grad_norm - self.clip_range_schedule = ( - linear_schedule(clip_range, 0) - if clip_range_decay == "linear" - else constant_schedule(clip_range) - ) - self.clip_range_vf_schedule = None - if clip_range_vf: - self.clip_range_vf_schedule = ( - linear_schedule(clip_range_vf, 0) - if clip_range_vf_decay == "linear" - else constant_schedule(clip_range_vf) - ) - self.normalize_advantage = normalize_advantage - self.ent_coef_schedule = ( - linear_schedule(ent_coef, 0) - if ent_coef_decay == "linear" - else constant_schedule(ent_coef) - ) - self.vf_coef = vf_coef - self.ppo2_vf_coef_halving = ppo2_vf_coef_halving - - self.n_steps = n_steps - self.batch_size = batch_size - self.n_epochs = n_epochs - self.sde_sample_freq = sde_sample_freq - - self.update_rtg_between_epochs = update_rtg_between_epochs - - def learn( - self: PPOSelf, - total_timesteps: int, - callback: Optional[Callback] = None, - ) -> PPOSelf: - obs = self.env.reset() - ts_elapsed = 0 - while ts_elapsed < total_timesteps: - start_time = perf_counter() - accumulator = self._collect_trajectories(obs) - rollout_steps = self.n_steps * self.env.num_envs - ts_elapsed += rollout_steps - progress = ts_elapsed / total_timesteps - train_stats = self.train(accumulator.all_trajectories, progress, ts_elapsed) - train_stats.write_to_tensorboard(self.tb_writer, ts_elapsed) - end_time = perf_counter() - self.tb_writer.add_scalar( - "train/steps_per_second", - rollout_steps / (end_time - start_time), - ts_elapsed, - ) - if callback: - callback.on_step(timesteps_elapsed=rollout_steps) - - return self - - def _collect_trajectories(self, obs: VecEnvObs) -> PPOTrajectoryAccumulator: - self.policy.eval() - accumulator = PPOTrajectoryAccumulator(self.env.num_envs) - self.policy.reset_noise() - for i in range(self.n_steps): - if self.sde_sample_freq > 0 and i > 0 and i % self.sde_sample_freq == 0: - self.policy.reset_noise() - action, value, logp_a, clamped_action = self.policy.step(obs) - next_obs, reward, done, _ = self.env.step(clamped_action) - accumulator.step(obs, action, next_obs, reward, done, value, logp_a) - obs = next_obs - return accumulator - - def train( - self, trajectories: List[PPOTrajectory], progress: float, timesteps_elapsed: int - ) -> TrainStats: - self.policy.train() - learning_rate = self.lr_schedule(progress) - update_learning_rate(self.optimizer, learning_rate) - self.tb_writer.add_scalar( - "charts/learning_rate", - self.optimizer.param_groups[0]["lr"], - timesteps_elapsed, - ) - - pi_clip = self.clip_range_schedule(progress) - self.tb_writer.add_scalar("charts/pi_clip", pi_clip, timesteps_elapsed) - if self.clip_range_vf_schedule: - v_clip = self.clip_range_vf_schedule(progress) - self.tb_writer.add_scalar("charts/v_clip", v_clip, timesteps_elapsed) - else: - v_clip = None - ent_coef = self.ent_coef_schedule(progress) - self.tb_writer.add_scalar("charts/ent_coef", ent_coef, timesteps_elapsed) - - obs = torch.as_tensor( - np.concatenate([np.array(t.obs) for t in trajectories]), device=self.device - ) - act = torch.as_tensor( - np.concatenate([np.array(t.act) for t in trajectories]), device=self.device - ) - rtg, adv = compute_rtg_and_advantage( - trajectories, self.policy, self.gamma, self.gae_lambda, self.device - ) - orig_v = torch.as_tensor( - np.concatenate([np.array(t.v) for t in trajectories]), device=self.device - ) - orig_logp_a = torch.as_tensor( - np.concatenate([np.array(t.logp_a) for t in trajectories]), - device=self.device, - ) - - step_stats = [] - for _ in range(self.n_epochs): - step_stats.clear() - if self.update_rtg_between_epochs: - rtg, adv = compute_rtg_and_advantage( - trajectories, self.policy, self.gamma, self.gae_lambda, self.device - ) - else: - adv = compute_advantage( - trajectories, self.policy, self.gamma, self.gae_lambda, self.device - ) - idxs = torch.randperm(len(obs)) - for i in range(0, len(obs), self.batch_size): - mb_idxs = idxs[i : i + self.batch_size] - mb_adv = adv[mb_idxs] - if self.normalize_advantage: - mb_adv = (mb_adv - mb_adv.mean(-1)) / (mb_adv.std(-1) + 1e-8) - step_stats.append( - self._train_step( - pi_clip, - v_clip, - ent_coef, - obs[mb_idxs], - act[mb_idxs], - rtg[mb_idxs], - mb_adv, - orig_v[mb_idxs], - orig_logp_a[mb_idxs], - ) - ) - - y_pred, y_true = orig_v.cpu().numpy(), rtg.cpu().numpy() - var_y = np.var(y_true).item() - explained_var = ( - np.nan if var_y == 0 else 1 - np.var(y_true - y_pred).item() / var_y - ) - - return TrainStats(step_stats, explained_var) - - def _train_step( - self, - pi_clip: float, - v_clip: Optional[float], - ent_coef: float, - obs: torch.Tensor, - act: torch.Tensor, - rtg: torch.Tensor, - adv: torch.Tensor, - orig_v: torch.Tensor, - orig_logp_a: torch.Tensor, - ) -> TrainStepStats: - logp_a, entropy, v = self.policy(obs, act) - logratio = logp_a - orig_logp_a - ratio = torch.exp(logratio) - clip_ratio = torch.clamp(ratio, min=1 - pi_clip, max=1 + pi_clip) - pi_loss = torch.maximum(-ratio * adv, -clip_ratio * adv).mean() - - v_loss_unclipped = (v - rtg) ** 2 - if v_clip: - v_loss_clipped = ( - orig_v + torch.clamp(v - orig_v, -v_clip, v_clip) - rtg - ) ** 2 - v_loss = torch.max(v_loss_unclipped, v_loss_clipped).mean() - else: - v_loss = v_loss_unclipped.mean() - if self.ppo2_vf_coef_halving: - v_loss *= 0.5 - - entropy_loss = -entropy.mean() - - loss = pi_loss + ent_coef * entropy_loss + self.vf_coef * v_loss - - self.optimizer.zero_grad() - loss.backward() - nn.utils.clip_grad_norm_(self.policy.parameters(), self.max_grad_norm) - self.optimizer.step() - - with torch.no_grad(): - approx_kl = ((ratio - 1) - logratio).mean().cpu().numpy().item() - clipped_frac = ( - ((ratio - 1).abs() > pi_clip).float().mean().cpu().numpy().item() - ) - val_clipped_frac = ( - (((v - orig_v).abs() > v_clip).float().mean().cpu().numpy().item()) - if v_clip - else 0 - ) - - return TrainStepStats( - loss.item(), - pi_loss.item(), - v_loss.item(), - entropy_loss.item(), - approx_kl, - clipped_frac, - val_clipped_frac, - ) diff --git a/publish/markdown_format.py b/publish/markdown_format.py deleted file mode 100644 index 1e48fd1ef85ce19ad952b04433911b3fe11bf395..0000000000000000000000000000000000000000 --- a/publish/markdown_format.py +++ /dev/null @@ -1,210 +0,0 @@ -import os -import pandas as pd -import wandb.apis.public -import yaml - -from collections import defaultdict -from dataclasses import dataclass, asdict -from typing import Any, Dict, Iterable, List, NamedTuple, Optional, TypeVar -from urllib.parse import urlparse - -from runner.evaluate import Evaluation - -EvaluationRowSelf = TypeVar("EvaluationRowSelf", bound="EvaluationRow") - - -@dataclass -class EvaluationRow: - algo: str - env: str - seed: Optional[int] - reward_mean: float - reward_std: float - eval_episodes: int - best: str - wandb_url: str - - @staticmethod - def data_frame(rows: List[EvaluationRowSelf]) -> pd.DataFrame: - results = defaultdict(list) - for r in rows: - for k, v in asdict(r).items(): - results[k].append(v) - return pd.DataFrame(results) - - -class EvalTableData(NamedTuple): - run: wandb.apis.public.Run - evaluation: Evaluation - - -def evaluation_table(table_data: Iterable[EvalTableData]) -> str: - best_stats = sorted( - [d.evaluation.stats for d in table_data], key=lambda r: r.score, reverse=True - )[0] - table_data = sorted(table_data, key=lambda d: d.evaluation.config.seed() or 0) - rows = [ - EvaluationRow( - config.algo, - config.env_id, - config.seed(), - stats.score.mean, - stats.score.std, - len(stats), - "*" if stats == best_stats else "", - f"[wandb]({r.url})", - ) - for (r, (_, stats, config)) in table_data - ] - df = EvaluationRow.data_frame(rows) - return df.to_markdown(index=False) - - -def github_project_link(github_url: str) -> str: - return f"[{urlparse(github_url).path}]({github_url})" - - -def header_section(algo: str, env: str, github_url: str, wandb_report_url: str) -> str: - algo_caps = algo.upper() - lines = [ - f"# **{algo_caps}** Agent playing **{env}**", - f"This is a trained model of a **{algo_caps}** agent playing **{env}** using " - f"the {github_project_link(github_url)} repo.", - f"All models trained at this commit can be found at {wandb_report_url}.", - ] - return "\n\n".join(lines) - - -def github_tree_link(github_url: str, commit_hash: Optional[str]) -> str: - if not commit_hash: - return github_project_link(github_url) - return f"[{commit_hash[:7]}]({github_url}/tree/{commit_hash})" - - -def results_section( - table_data: List[EvalTableData], algo: str, github_url: str, commit_hash: str -) -> str: - # type: ignore - lines = [ - "## Training Results", - f"This model was trained from {len(table_data)} trainings of **{algo.upper()}** " - + "agents using different initial seeds. " - + f"These agents were trained by checking out " - + f"{github_tree_link(github_url, commit_hash)}. " - + "The best and last models were kept from each training. " - + "This submission has loaded the best models from each training, reevaluates " - + "them, and selects the best model from these latest evaluations (mean - std).", - ] - lines.append(evaluation_table(table_data)) - return "\n\n".join(lines) - - -def prerequisites_section() -> str: - return """ -### Prerequisites: Weights & Biases (WandB) -Training and benchmarking assumes you have a Weights & Biases project to upload runs to. -By default training goes to a rl-algo-impls project while benchmarks go to -rl-algo-impls-benchmarks. During training and benchmarking runs, videos of the best -models and the model weights are uploaded to WandB. - -Before doing anything below, you'll need to create a wandb account and run `wandb -login`. -""" - - -def usage_section(github_url: str, run_path: str, commit_hash: str) -> str: - return f""" -## Usage -{urlparse(github_url).path}: {github_url} - -Note: While the model state dictionary and hyperaparameters are saved, the latest -implementation could be sufficiently different to not be able to reproduce similar -results. You might need to checkout the commit the agent was trained on: -{github_tree_link(github_url, commit_hash)}. -``` -# Downloads the model, sets hyperparameters, and runs agent for 3 episodes -python enjoy.py --wandb-run-path={run_path} -``` - -Setup hasn't been completely worked out yet, so you might be best served by using Google -Colab starting from the -[colab_enjoy.ipynb](https://github.com/sgoodfriend/rl-algo-impls/blob/main/colab_enjoy.ipynb) -notebook. -""" - - -def training_setion( - github_url: str, commit_hash: str, algo: str, env: str, seed: Optional[int] -) -> str: - return f""" -## Training -If you want the highest chance to reproduce these results, you'll want to checkout the -commit the agent was trained on: {github_tree_link(github_url, commit_hash)}. While -training is deterministic, different hardware will give different results. - -``` -python train.py --algo {algo} --env {env} {'--seed ' + str(seed) if seed is not None else ''} -``` - -Setup hasn't been completely worked out yet, so you might be best served by using Google -Colab starting from the -[colab_train.ipynb](https://github.com/sgoodfriend/rl-algo-impls/blob/main/colab_train.ipynb) -notebook. -""" - - -def benchmarking_section(report_url: str) -> str: - return f""" -## Benchmarking (with Lambda Labs instance) -This and other models from {report_url} were generated by running a script on a Lambda -Labs instance. In a Lambda Labs instance terminal: -``` -git clone git@github.com:sgoodfriend/rl-algo-impls.git -cd rl-algo-impls -bash ./lambda_labs/setup.sh -wandb login -bash ./lambda_labs/benchmark.sh -``` - -### Alternative: Google Colab Pro+ -As an alternative, -[colab_benchmark.ipynb](https://github.com/sgoodfriend/rl-algo-impls/tree/main/benchmarks#:~:text=colab_benchmark.ipynb), -can be used. However, this requires a Google Colab Pro+ subscription and running across -4 separate instances because otherwise running all jobs will exceed the 24-hour limit. -""" - - -def hyperparams_section(run_config: Dict[str, Any]) -> str: - return f""" -## Hyperparameters -This isn't exactly the format of hyperparams in {os.path.join("hyperparams", -run_config["algo"] + ".yml")}, but instead the Wandb Run Config. However, it's very -close and has some additional data: -``` -{yaml.dump(run_config)} -``` -""" - - -def model_card_text( - algo: str, - env: str, - github_url: str, - commit_hash: str, - wandb_report_url: str, - table_data: List[EvalTableData], - best_eval: EvalTableData, -) -> str: - run, (_, _, config) = best_eval - run_path = "/".join(run.path) - return "\n\n".join( - [ - header_section(algo, env, github_url, wandb_report_url), - results_section(table_data, algo, github_url, commit_hash), - prerequisites_section(), - usage_section(github_url, run_path, commit_hash), - training_setion(github_url, commit_hash, algo, env, config.seed()), - benchmarking_section(wandb_report_url), - hyperparams_section(run.config), - ] - ) diff --git a/replay.meta.json b/replay.meta.json index e188b38d02ca6428ef0859fe4c532a68676d0f31..8cabcc56a89bf56325311b997f799572865a8faa 100644 --- a/replay.meta.json +++ b/replay.meta.json @@ -1 +1 @@ -{"content_type": "video/mp4", "encoder_version": {"backend": "ffmpeg", "version": "b'ffmpeg version 4.2.7-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers\\nbuilt with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)\\nconfiguration: --prefix=/usr --extra-version=0ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared\\nlibavutil 56. 31.100 / 56. 31.100\\nlibavcodec 58. 54.100 / 58. 54.100\\nlibavformat 58. 29.100 / 58. 29.100\\nlibavdevice 58. 8.100 / 58. 8.100\\nlibavfilter 7. 57.100 / 7. 57.100\\nlibavresample 4. 0. 0 / 4. 0. 0\\nlibswscale 5. 5.100 / 5. 5.100\\nlibswresample 3. 5.100 / 3. 5.100\\nlibpostproc 55. 5.100 / 55. 5.100\\n'", "cmdline": ["ffmpeg", "-nostats", "-loglevel", "error", "-y", "-f", "rawvideo", "-s:v", "160x210", "-pix_fmt", "rgb24", "-framerate", "30", "-i", "-", "-vf", "scale=trunc(iw/2)*2:trunc(ih/2)*2", "-vcodec", "libx264", "-pix_fmt", "yuv420p", "-r", "30", "/tmp/tmphug4aad8/a2c-PongNoFrameskip-v4/replay.mp4"]}, "episode": {"r": 21.0, "l": 7976, "t": 4.169723}} \ No newline at end of file +{"content_type": "video/mp4", "encoder_version": {"backend": "ffmpeg", "version": "b'ffmpeg version 4.2.7-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers\\nbuilt with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)\\nconfiguration: --prefix=/usr --extra-version=0ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared\\nlibavutil 56. 31.100 / 56. 31.100\\nlibavcodec 58. 54.100 / 58. 54.100\\nlibavformat 58. 29.100 / 58. 29.100\\nlibavdevice 58. 8.100 / 58. 8.100\\nlibavfilter 7. 57.100 / 7. 57.100\\nlibavresample 4. 0. 0 / 4. 0. 0\\nlibswscale 5. 5.100 / 5. 5.100\\nlibswresample 3. 5.100 / 3. 5.100\\nlibpostproc 55. 5.100 / 55. 5.100\\n'", "cmdline": ["ffmpeg", "-nostats", "-loglevel", "error", "-y", "-f", "rawvideo", "-s:v", "160x210", "-pix_fmt", "rgb24", "-framerate", "30", "-i", "-", "-vf", "scale=trunc(iw/2)*2:trunc(ih/2)*2", "-vcodec", "libx264", "-pix_fmt", "yuv420p", "-r", "30", "/tmp/tmp2jkzuuyi/a2c-PongNoFrameskip-v4/replay.mp4"]}, "episode": {"r": 21.0, "l": 7976, "t": 4.904409}} \ No newline at end of file diff --git a/rl_algo_impls/benchmark_publish.py b/rl_algo_impls/benchmark_publish.py index 1d2010efab9a48121f4b79cc7192ac6a7e5524b0..2e1045f01c316068f9192db791ae6cc10b617df6 100644 --- a/rl_algo_impls/benchmark_publish.py +++ b/rl_algo_impls/benchmark_publish.py @@ -54,8 +54,8 @@ def benchmark_publish() -> None: "--virtual-display", action="store_true", help="Use headless virtual display" ) # parser.set_defaults( - # wandb_tags=["benchmark_e47a44c", "host_129-146-2-230"], - # wandb_report_url="https://api.wandb.ai/links/sgoodfriend/v4wd7cp5", + # wandb_tags=["benchmark_2067e21", "host_155-248-199-228"], + # wandb_report_url="https://api.wandb.ai/links/sgoodfriend/09frjfcs", # envs=[], # exclude_envs=[], # ) diff --git a/rl_algo_impls/huggingface_publish.py b/rl_algo_impls/huggingface_publish.py index 5cf482357b0c44703a30f88b2e70a92542153781..afe1d57345bfc831044f65f331f1031310fc3dfe 100644 --- a/rl_algo_impls/huggingface_publish.py +++ b/rl_algo_impls/huggingface_publish.py @@ -162,6 +162,7 @@ def publish( path_in_repo="", commit_message=f"{algo.upper()} playing {env_id} from {github_url}/tree/{commit_hash}", token=huggingface_token, + delete_patterns="*", ) print(f"Pushed model to the hub: {repo_url}") diff --git a/runner/config.py b/runner/config.py deleted file mode 100644 index 32045975fdcb7a7d604cac75f43eceb0e8dfedae..0000000000000000000000000000000000000000 --- a/runner/config.py +++ /dev/null @@ -1,155 +0,0 @@ -import os - -from datetime import datetime -from dataclasses import dataclass -from typing import Any, Dict, NamedTuple, Optional, TypedDict, Union - - -@dataclass -class RunArgs: - algo: str - env: str - seed: Optional[int] = None - use_deterministic_algorithms: bool = True - - -class EnvHyperparams(NamedTuple): - env_type: str = "gymvec" - n_envs: int = 1 - frame_stack: int = 1 - make_kwargs: Optional[Dict[str, Any]] = None - no_reward_timeout_steps: Optional[int] = None - no_reward_fire_steps: Optional[int] = None - vec_env_class: str = "sync" - normalize: bool = False - normalize_kwargs: Optional[Dict[str, Any]] = None - rolling_length: int = 100 - train_record_video: bool = False - video_step_interval: Union[int, float] = 1_000_000 - initial_steps_to_truncate: Optional[int] = None - clip_atari_rewards: bool = True - - -class Hyperparams(TypedDict, total=False): - device: str - n_timesteps: Union[int, float] - env_hyperparams: Dict[str, Any] - policy_hyperparams: Dict[str, Any] - algo_hyperparams: Dict[str, Any] - eval_params: Dict[str, Any] - - -@dataclass -class Config: - args: RunArgs - hyperparams: Hyperparams - root_dir: str - run_id: str = datetime.now().isoformat() - - def seed(self, training: bool = True) -> Optional[int]: - seed = self.args.seed - if training or seed is None: - return seed - return seed + self.env_hyperparams.get("n_envs", 1) - - @property - def device(self) -> str: - return self.hyperparams.get("device", "auto") - - @property - def n_timesteps(self) -> int: - return int(self.hyperparams.get("n_timesteps", 100_000)) - - @property - def env_hyperparams(self) -> Dict[str, Any]: - return self.hyperparams.get("env_hyperparams", {}) - - @property - def policy_hyperparams(self) -> Dict[str, Any]: - return self.hyperparams.get("policy_hyperparams", {}) - - @property - def algo_hyperparams(self) -> Dict[str, Any]: - return self.hyperparams.get("algo_hyperparams", {}) - - @property - def eval_params(self) -> Dict[str, Any]: - return self.hyperparams.get("eval_params", {}) - - @property - def algo(self) -> str: - return self.args.algo - - @property - def env_id(self) -> str: - return self.hyperparams.get("env_id") or self.args.env - - def model_name(self, include_seed: bool = True) -> str: - # Use arg env name instead of environment name - parts = [self.algo, self.args.env] - if include_seed and self.args.seed is not None: - parts.append(f"S{self.args.seed}") - - # Assume that the custom arg name already has the necessary information - if not self.hyperparams.get("env_id"): - make_kwargs = self.env_hyperparams.get("make_kwargs", {}) - if make_kwargs: - for k, v in make_kwargs.items(): - if type(v) == bool and v: - parts.append(k) - elif type(v) == int and v: - parts.append(f"{k}{v}") - else: - parts.append(str(v)) - - return "-".join(parts) - - @property - def run_name(self) -> str: - parts = [self.model_name(), self.run_id] - return "-".join(parts) - - @property - def saved_models_dir(self) -> str: - return os.path.join(self.root_dir, "saved_models") - - @property - def downloaded_models_dir(self) -> str: - return os.path.join(self.root_dir, "downloaded_models") - - def model_dir_name( - self, - best: bool = False, - extension: str = "", - ) -> str: - return self.model_name() + ("-best" if best else "") + extension - - def model_dir_path(self, best: bool = False, downloaded: bool = False) -> str: - return os.path.join( - self.saved_models_dir if not downloaded else self.downloaded_models_dir, - self.model_dir_name(best=best), - ) - - @property - def runs_dir(self) -> str: - return os.path.join(self.root_dir, "runs") - - @property - def tensorboard_summary_path(self) -> str: - return os.path.join(self.runs_dir, self.run_name) - - @property - def logs_path(self) -> str: - return os.path.join(self.runs_dir, f"log.yml") - - @property - def videos_dir(self) -> str: - return os.path.join(self.root_dir, "videos") - - @property - def video_prefix(self) -> str: - return os.path.join(self.videos_dir, self.model_name()) - - @property - def best_videos_dir(self) -> str: - return os.path.join(self.videos_dir, f"{self.model_name()}-best") diff --git a/runner/env.py b/runner/env.py deleted file mode 100644 index b8a898a508dcb4aa5a19ccd931428b9e5e837069..0000000000000000000000000000000000000000 --- a/runner/env.py +++ /dev/null @@ -1,284 +0,0 @@ -import gym -import numpy as np -import os - -from gym.vector.async_vector_env import AsyncVectorEnv -from gym.vector.sync_vector_env import SyncVectorEnv -from gym.wrappers.resize_observation import ResizeObservation -from gym.wrappers.gray_scale_observation import GrayScaleObservation -from gym.wrappers.frame_stack import FrameStack -from stable_baselines3.common.atari_wrappers import ( - MaxAndSkipEnv, - NoopResetEnv, -) -from stable_baselines3.common.vec_env.dummy_vec_env import DummyVecEnv -from stable_baselines3.common.vec_env.subproc_vec_env import SubprocVecEnv -from stable_baselines3.common.vec_env.vec_normalize import VecNormalize -from torch.utils.tensorboard.writer import SummaryWriter -from typing import Callable, Optional - -from runner.config import Config, EnvHyperparams -from shared.policy.policy import VEC_NORMALIZE_FILENAME -from wrappers.atari_wrappers import EpisodicLifeEnv, FireOnLifeStarttEnv, ClipRewardEnv -from wrappers.episode_record_video import EpisodeRecordVideo -from wrappers.episode_stats_writer import EpisodeStatsWriter -from wrappers.initial_step_truncate_wrapper import InitialStepTruncateWrapper -from wrappers.is_vector_env import IsVectorEnv -from wrappers.noop_env_seed import NoopEnvSeed -from wrappers.normalize import NormalizeObservation, NormalizeReward -from wrappers.sync_vector_env_render_compat import SyncVectorEnvRenderCompat -from wrappers.transpose_image_observation import TransposeImageObservation -from wrappers.vectorable_wrapper import VecEnv -from wrappers.video_compat_wrapper import VideoCompatWrapper - - -def make_env( - config: Config, - hparams: EnvHyperparams, - training: bool = True, - render: bool = False, - normalize_load_path: Optional[str] = None, - tb_writer: Optional[SummaryWriter] = None, -) -> VecEnv: - if hparams.env_type == "procgen": - return _make_procgen_env( - config, - hparams, - training=training, - render=render, - normalize_load_path=normalize_load_path, - tb_writer=tb_writer, - ) - elif hparams.env_type in {"sb3vec", "gymvec"}: - return _make_vec_env( - config, - hparams, - training=training, - render=render, - normalize_load_path=normalize_load_path, - tb_writer=tb_writer, - ) - else: - raise ValueError(f"env_type {hparams.env_type} not supported") - - -def make_eval_env( - config: Config, - hparams: EnvHyperparams, - override_n_envs: Optional[int] = None, - **kwargs, -) -> VecEnv: - kwargs = kwargs.copy() - kwargs["training"] = False - if override_n_envs is not None: - hparams_kwargs = hparams._asdict() - hparams_kwargs["n_envs"] = override_n_envs - if override_n_envs == 1: - hparams_kwargs["vec_env_class"] = "sync" - hparams = EnvHyperparams(**hparams_kwargs) - return make_env(config, hparams, **kwargs) - - -def _make_vec_env( - config: Config, - hparams: EnvHyperparams, - training: bool = True, - render: bool = False, - normalize_load_path: Optional[str] = None, - tb_writer: Optional[SummaryWriter] = None, -) -> VecEnv: - ( - env_type, - n_envs, - frame_stack, - make_kwargs, - no_reward_timeout_steps, - no_reward_fire_steps, - vec_env_class, - normalize, - normalize_kwargs, - rolling_length, - train_record_video, - video_step_interval, - initial_steps_to_truncate, - clip_atari_rewards, - ) = hparams - - if "BulletEnv" in config.env_id: - import pybullet_envs - - spec = gym.spec(config.env_id) - seed = config.seed(training=training) - - make_kwargs = make_kwargs.copy() if make_kwargs is not None else {} - if "BulletEnv" in config.env_id and render: - make_kwargs["render"] = True - if "CarRacing" in config.env_id: - make_kwargs["verbose"] = 0 - if "procgen" in config.env_id: - if not render: - make_kwargs["render_mode"] = "rgb_array" - - def make(idx: int) -> Callable[[], gym.Env]: - def _make() -> gym.Env: - env = gym.make(config.env_id, **make_kwargs) - env = gym.wrappers.RecordEpisodeStatistics(env) - env = VideoCompatWrapper(env) - if training and train_record_video and idx == 0: - env = EpisodeRecordVideo( - env, - config.video_prefix, - step_increment=n_envs, - video_step_interval=int(video_step_interval), - ) - if training and initial_steps_to_truncate: - env = InitialStepTruncateWrapper( - env, idx * initial_steps_to_truncate // n_envs - ) - if "AtariEnv" in spec.entry_point: # type: ignore - env = NoopResetEnv(env, noop_max=30) - env = MaxAndSkipEnv(env, skip=4) - env = EpisodicLifeEnv(env, training=training) - action_meanings = env.unwrapped.get_action_meanings() - if "FIRE" in action_meanings: # type: ignore - env = FireOnLifeStarttEnv(env, action_meanings.index("FIRE")) - if clip_atari_rewards: - env = ClipRewardEnv(env, training=training) - env = ResizeObservation(env, (84, 84)) - env = GrayScaleObservation(env, keep_dim=False) - env = FrameStack(env, frame_stack) - elif "CarRacing" in config.env_id: - env = ResizeObservation(env, (64, 64)) - env = GrayScaleObservation(env, keep_dim=False) - env = FrameStack(env, frame_stack) - elif "procgen" in config.env_id: - # env = GrayScaleObservation(env, keep_dim=False) - env = NoopEnvSeed(env) - env = TransposeImageObservation(env) - if frame_stack > 1: - env = FrameStack(env, frame_stack) - - if no_reward_timeout_steps: - from wrappers.no_reward_timeout import NoRewardTimeout - - env = NoRewardTimeout( - env, no_reward_timeout_steps, n_fire_steps=no_reward_fire_steps - ) - - if seed is not None: - env.seed(seed + idx) - env.action_space.seed(seed + idx) - env.observation_space.seed(seed + idx) - - return env - - return _make - - if env_type == "sb3vec": - VecEnvClass = {"sync": DummyVecEnv, "async": SubprocVecEnv}[vec_env_class] - elif env_type == "gymvec": - VecEnvClass = {"sync": SyncVectorEnv, "async": AsyncVectorEnv}[vec_env_class] - else: - raise ValueError(f"env_type {env_type} unsupported") - envs = VecEnvClass([make(i) for i in range(n_envs)]) - if env_type == "gymvec" and vec_env_class == "sync": - envs = SyncVectorEnvRenderCompat(envs) - if training: - assert tb_writer - envs = EpisodeStatsWriter( - envs, tb_writer, training=training, rolling_length=rolling_length - ) - if normalize: - normalize_kwargs = normalize_kwargs or {} - if env_type == "sb3vec": - if normalize_load_path: - envs = VecNormalize.load( - os.path.join(normalize_load_path, VEC_NORMALIZE_FILENAME), - envs, # type: ignore - ) - else: - envs = VecNormalize( - envs, # type: ignore - training=training, - **normalize_kwargs, - ) - if not training: - envs.norm_reward = False - else: - if normalize_kwargs.get("norm_obs", True): - envs = NormalizeObservation( - envs, training=training, clip=normalize_kwargs.get("clip_obs", 10.0) - ) - if training and normalize_kwargs.get("norm_reward", True): - envs = NormalizeReward( - envs, - training=training, - clip=normalize_kwargs.get("clip_reward", 10.0), - ) - return envs - - -def _make_procgen_env( - config: Config, - hparams: EnvHyperparams, - training: bool = True, - render: bool = False, - normalize_load_path: Optional[str] = None, - tb_writer: Optional[SummaryWriter] = None, -) -> VecEnv: - from gym3 import ViewerWrapper, ExtractDictObWrapper - from procgen.env import ProcgenGym3Env, ToBaselinesVecEnv - - ( - _, - n_envs, - frame_stack, - make_kwargs, - _, # no_reward_timeout_steps - _, # no_reward_fire_steps - _, # vec_env_class - normalize, - normalize_kwargs, - rolling_length, - _, # train_record_video - _, # video_step_interval - _, # initial_steps_to_truncate - _, # clip_atari_rewards - ) = hparams - - seed = config.seed(training=training) - - make_kwargs = make_kwargs or {} - make_kwargs["render_mode"] = "rgb_array" - if seed is not None: - make_kwargs["rand_seed"] = seed - - envs = ProcgenGym3Env(n_envs, config.env_id, **make_kwargs) - envs = ExtractDictObWrapper(envs, key="rgb") - if render: - envs = ViewerWrapper(envs, info_key="rgb") - envs = ToBaselinesVecEnv(envs) - envs = IsVectorEnv(envs) - # TODO: Handle Grayscale and/or FrameStack - envs = TransposeImageObservation(envs) - - envs = gym.wrappers.RecordEpisodeStatistics(envs) - - if seed is not None: - envs.action_space.seed(seed) - envs.observation_space.seed(seed) - - if training: - assert tb_writer - envs = EpisodeStatsWriter( - envs, tb_writer, training=training, rolling_length=rolling_length - ) - if normalize and training: - normalize_kwargs = normalize_kwargs or {} - envs = gym.wrappers.NormalizeReward(envs) - clip_obs = normalize_kwargs.get("clip_reward", 10.0) - envs = gym.wrappers.TransformReward( - envs, lambda r: np.clip(r, -clip_obs, clip_obs) - ) - - return envs # type: ignore diff --git a/runner/evaluate.py b/runner/evaluate.py deleted file mode 100644 index 85893bacfbfdbcb7a1ba794b040d67fd6bff71b4..0000000000000000000000000000000000000000 --- a/runner/evaluate.py +++ /dev/null @@ -1,103 +0,0 @@ -import os -import shutil - -from dataclasses import dataclass -from typing import NamedTuple, Optional - -from runner.env import make_eval_env -from runner.config import Config, EnvHyperparams, RunArgs -from runner.running_utils import ( - load_hyperparams, - set_seeds, - get_device, - make_policy, -) -from shared.callbacks.eval_callback import evaluate -from shared.policy.policy import Policy -from shared.stats import EpisodesStats - - -@dataclass -class EvalArgs(RunArgs): - render: bool = True - best: bool = True - n_envs: Optional[int] = 1 - n_episodes: int = 3 - deterministic_eval: Optional[bool] = None - no_print_returns: bool = False - wandb_run_path: Optional[str] = None - - -class Evaluation(NamedTuple): - policy: Policy - stats: EpisodesStats - config: Config - - -def evaluate_model(args: EvalArgs, root_dir: str) -> Evaluation: - if args.wandb_run_path: - import wandb - - api = wandb.Api() - run = api.run(args.wandb_run_path) - hyperparams = run.config - - args.algo = hyperparams["algo"] - args.env = hyperparams["env"] - args.seed = hyperparams.get("seed", None) - args.use_deterministic_algorithms = hyperparams.get( - "use_deterministic_algorithms", True - ) - - config = Config(args, hyperparams, root_dir) - model_path = config.model_dir_path(best=args.best, downloaded=True) - - model_archive_name = config.model_dir_name(best=args.best, extension=".zip") - run.file(model_archive_name).download() - if os.path.isdir(model_path): - shutil.rmtree(model_path) - shutil.unpack_archive(model_archive_name, model_path) - os.remove(model_archive_name) - else: - hyperparams = load_hyperparams(args.algo, args.env, root_dir) - - config = Config(args, hyperparams, root_dir) - model_path = config.model_dir_path(best=args.best) - - print(args) - - set_seeds(args.seed, args.use_deterministic_algorithms) - - env = make_eval_env( - config, - EnvHyperparams(**config.env_hyperparams), - override_n_envs=args.n_envs, - render=args.render, - normalize_load_path=model_path, - ) - device = get_device(config.device, env) - policy = make_policy( - args.algo, - env, - device, - load_path=model_path, - **config.policy_hyperparams, - ).eval() - - deterministic = ( - args.deterministic_eval - if args.deterministic_eval is not None - else config.eval_params.get("deterministic", True) - ) - return Evaluation( - policy, - evaluate( - env, - policy, - args.n_episodes, - render=args.render, - deterministic=deterministic, - print_returns=not args.no_print_returns, - ), - config, - ) diff --git a/runner/running_utils.py b/runner/running_utils.py deleted file mode 100644 index cfbc25fb6c97606300fa6d9fbcd7e22138789515..0000000000000000000000000000000000000000 --- a/runner/running_utils.py +++ /dev/null @@ -1,195 +0,0 @@ -import argparse -import gym -import json -import matplotlib.pyplot as plt -import numpy as np -import os -import random -import torch -import torch.backends.cudnn -import yaml - -from gym.spaces import Box, Discrete -from torch.utils.tensorboard.writer import SummaryWriter -from typing import Dict, Optional, Type, Union - -from runner.config import Hyperparams -from shared.algorithm import Algorithm -from shared.callbacks.eval_callback import EvalCallback -from shared.policy.on_policy import ActorCritic -from shared.policy.policy import Policy - -from a2c.a2c import A2C -from dqn.dqn import DQN -from dqn.policy import DQNPolicy -from ppo.ppo import PPO -from vpg.vpg import VanillaPolicyGradient -from vpg.policy import VPGActorCritic -from wrappers.vectorable_wrapper import VecEnv, single_observation_space - -ALGOS: Dict[str, Type[Algorithm]] = { - "dqn": DQN, - "vpg": VanillaPolicyGradient, - "ppo": PPO, - "a2c": A2C, -} -POLICIES: Dict[str, Type[Policy]] = { - "dqn": DQNPolicy, - "vpg": VPGActorCritic, - "ppo": ActorCritic, - "a2c": ActorCritic, -} - -HYPERPARAMS_PATH = "hyperparams" - - -def base_parser(multiple: bool = True) -> argparse.ArgumentParser: - parser = argparse.ArgumentParser() - parser.add_argument( - "--algo", - default=["dqn"], - type=str, - choices=list(ALGOS.keys()), - nargs="+" if multiple else 1, - help="Abbreviation(s) of algorithm(s)", - ) - parser.add_argument( - "--env", - default=["CartPole-v1"], - type=str, - nargs="+" if multiple else 1, - help="Name of environment(s) in gym", - ) - parser.add_argument( - "--seed", - default=[1], - type=int, - nargs="*" if multiple else "?", - help="Seeds to run experiment. Unset will do one run with no set seed", - ) - parser.add_argument( - "--use-deterministic-algorithms", - default=True, - type=bool, - help="If seed set, set torch.use_deterministic_algorithms", - ) - return parser - - -def load_hyperparams(algo: str, env_id: str, root_path: str) -> Hyperparams: - hyperparams_path = os.path.join(root_path, HYPERPARAMS_PATH, f"{algo}.yml") - with open(hyperparams_path, "r") as f: - hyperparams_dict = yaml.safe_load(f) - - if env_id in hyperparams_dict: - return hyperparams_dict[env_id] - - if "BulletEnv" in env_id: - import pybullet_envs - spec = gym.spec(env_id) - if "AtariEnv" in str(spec.entry_point) and "_atari" in hyperparams_dict: - return hyperparams_dict["_atari"] - else: - raise ValueError(f"{env_id} not specified in {algo} hyperparameters file") - - -def get_device(device: str, env: VecEnv) -> torch.device: - # cuda by default - if device == "auto": - device = "cuda" - # Apple MPS is a second choice (sometimes) - if device == "cuda" and not torch.cuda.is_available(): - device = "mps" - # If no MPS, fallback to cpu - if device == "mps" and not torch.backends.mps.is_available(): - device = "cpu" - # Simple environments like Discreet and 1-D Boxes might also be better - # served with the CPU. - if device == "mps": - obs_space = single_observation_space(env) - if isinstance(obs_space, Discrete): - device = "cpu" - elif isinstance(obs_space, Box) and len(obs_space.shape) == 1: - device = "cpu" - print(f"Device: {device}") - return torch.device(device) - - -def set_seeds(seed: Optional[int], use_deterministic_algorithms: bool) -> None: - if seed is None: - return - random.seed(seed) - np.random.seed(seed) - torch.manual_seed(seed) - torch.backends.cudnn.benchmark = False - torch.use_deterministic_algorithms(use_deterministic_algorithms) - os.environ["CUBLAS_WORKSPACE_CONFIG"] = ":4096:8" - # Stop warning and it would introduce stochasticity if I was using TF - os.environ["TF_ENABLE_ONEDNN_OPTS"] = "0" - - -def make_policy( - algo: str, - env: VecEnv, - device: torch.device, - load_path: Optional[str] = None, - **kwargs, -) -> Policy: - policy = POLICIES[algo](env, **kwargs).to(device) - if load_path: - policy.load(load_path) - return policy - - -def plot_eval_callback(callback: EvalCallback, tb_writer: SummaryWriter, run_name: str): - figure = plt.figure() - cumulative_steps = [ - (idx + 1) * callback.step_freq for idx in range(len(callback.stats)) - ] - plt.plot( - cumulative_steps, - [s.score.mean for s in callback.stats], - "b-", - label="mean", - ) - plt.plot( - cumulative_steps, - [s.score.mean - s.score.std for s in callback.stats], - "g--", - label="mean-std", - ) - plt.fill_between( - cumulative_steps, - [s.score.min for s in callback.stats], # type: ignore - [s.score.max for s in callback.stats], # type: ignore - facecolor="cyan", - label="range", - ) - plt.xlabel("Steps") - plt.ylabel("Score") - plt.legend() - plt.title(f"Eval {run_name}") - tb_writer.add_figure("eval", figure) - - -Scalar = Union[bool, str, float, int, None] - - -def hparam_dict( - hyperparams: Hyperparams, args: Dict[str, Union[Scalar, list]] -) -> Dict[str, Scalar]: - flattened = args.copy() - for k, v in flattened.items(): - if isinstance(v, list): - flattened[k] = json.dumps(v) - for k, v in hyperparams.items(): - if isinstance(v, dict): - for sk, sv in v.items(): - key = f"{k}/{sk}" - if isinstance(sv, dict) or isinstance(sv, list): - flattened[key] = str(sv) - else: - flattened[key] = sv - else: - flattened[k] = v # type: ignore - return flattened # type: ignore diff --git a/runner/train.py b/runner/train.py deleted file mode 100644 index ef6f7ac7773498d5c7dd9291cc4821715ec0f6b9..0000000000000000000000000000000000000000 --- a/runner/train.py +++ /dev/null @@ -1,141 +0,0 @@ -# Support for PyTorch mps mode (https://pytorch.org/docs/stable/notes/mps.html) -import os - -os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1" - -import dataclasses -import shutil -import wandb -import yaml - -from dataclasses import dataclass -from torch.utils.tensorboard.writer import SummaryWriter -from typing import Any, Dict, Optional, Sequence - -from shared.callbacks.eval_callback import EvalCallback -from runner.config import Config, EnvHyperparams, RunArgs -from runner.env import make_env, make_eval_env -from runner.running_utils import ( - ALGOS, - load_hyperparams, - set_seeds, - get_device, - make_policy, - plot_eval_callback, - hparam_dict, -) -from shared.stats import EpisodesStats - - -@dataclass -class TrainArgs(RunArgs): - wandb_project_name: Optional[str] = None - wandb_entity: Optional[str] = None - wandb_tags: Sequence[str] = dataclasses.field(default_factory=list) - - -def train(args: TrainArgs): - print(args) - hyperparams = load_hyperparams(args.algo, args.env, os.getcwd()) - print(hyperparams) - config = Config(args, hyperparams, os.getcwd()) - - wandb_enabled = args.wandb_project_name - if wandb_enabled: - wandb.tensorboard.patch( - root_logdir=config.tensorboard_summary_path, pytorch=True - ) - wandb.init( - project=args.wandb_project_name, - entity=args.wandb_entity, - config=hyperparams, # type: ignore - name=config.run_name, - monitor_gym=True, - save_code=True, - tags=args.wandb_tags, - ) - wandb.config.update(args) - - tb_writer = SummaryWriter(config.tensorboard_summary_path) - - set_seeds(args.seed, args.use_deterministic_algorithms) - - env = make_env( - config, EnvHyperparams(**config.env_hyperparams), tb_writer=tb_writer - ) - device = get_device(config.device, env) - policy = make_policy(args.algo, env, device, **config.policy_hyperparams) - algo = ALGOS[args.algo](policy, env, device, tb_writer, **config.algo_hyperparams) - - num_parameters = policy.num_parameters() - num_trainable_parameters = policy.num_trainable_parameters() - if wandb_enabled: - wandb.run.summary["num_parameters"] = num_parameters - wandb.run.summary["num_trainable_parameters"] = num_trainable_parameters - else: - print( - f"num_parameters = {num_parameters} ; " - f"num_trainable_parameters = {num_trainable_parameters}" - ) - - eval_env = make_eval_env(config, EnvHyperparams(**config.env_hyperparams)) - record_best_videos = config.eval_params.get("record_best_videos", True) - callback = EvalCallback( - policy, - eval_env, - tb_writer, - best_model_path=config.model_dir_path(best=True), - **config.eval_params, - video_env=make_eval_env( - config, EnvHyperparams(**config.env_hyperparams), override_n_envs=1 - ) - if record_best_videos - else None, - best_video_dir=config.best_videos_dir, - ) - algo.learn(config.n_timesteps, callback=callback) - - policy.save(config.model_dir_path(best=False)) - - eval_stats = callback.evaluate(n_episodes=10, print_returns=True) - - plot_eval_callback(callback, tb_writer, config.run_name) - - log_dict: Dict[str, Any] = { - "eval": eval_stats._asdict(), - } - if callback.best: - log_dict["best_eval"] = callback.best._asdict() - log_dict.update(hyperparams) - log_dict.update(vars(args)) - with open(config.logs_path, "a") as f: - yaml.dump({config.run_name: log_dict}, f) - - best_eval_stats: EpisodesStats = callback.best # type: ignore - tb_writer.add_hparams( - hparam_dict(hyperparams, vars(args)), - { - "hparam/best_mean": best_eval_stats.score.mean, - "hparam/best_result": best_eval_stats.score.mean - - best_eval_stats.score.std, - "hparam/last_mean": eval_stats.score.mean, - "hparam/last_result": eval_stats.score.mean - eval_stats.score.std, - }, - None, - config.run_name, - ) - - tb_writer.close() - - if wandb_enabled: - shutil.make_archive( - os.path.join(wandb.run.dir, config.model_dir_name()), - "zip", - config.model_dir_path(), - ) - shutil.make_archive( - os.path.join(wandb.run.dir, config.model_dir_name(best=True)), - "zip", - config.model_dir_path(best=True), - ) - wandb.finish() diff --git a/shared/algorithm.py b/shared/algorithm.py deleted file mode 100644 index 2a6fd4c10a4ca5bb6fc67d9bb7cb22b2dd18c9bb..0000000000000000000000000000000000000000 --- a/shared/algorithm.py +++ /dev/null @@ -1,35 +0,0 @@ -import gym -import torch - -from abc import ABC, abstractmethod -from torch.utils.tensorboard.writer import SummaryWriter -from typing import List, Optional, TypeVar - -from shared.callbacks.callback import Callback -from shared.policy.policy import Policy -from wrappers.vectorable_wrapper import VecEnv - -AlgorithmSelf = TypeVar("AlgorithmSelf", bound="Algorithm") - - -class Algorithm(ABC): - @abstractmethod - def __init__( - self, - policy: Policy, - env: VecEnv, - device: torch.device, - tb_writer: SummaryWriter, - **kwargs, - ) -> None: - super().__init__() - self.policy = policy - self.env = env - self.device = device - self.tb_writer = tb_writer - - @abstractmethod - def learn( - self: AlgorithmSelf, total_timesteps: int, callback: Optional[Callback] = None - ) -> AlgorithmSelf: - ... diff --git a/shared/callbacks/callback.py b/shared/callbacks/callback.py deleted file mode 100644 index f53784b7070d680817f6b8d9fc1fd13085289b89..0000000000000000000000000000000000000000 --- a/shared/callbacks/callback.py +++ /dev/null @@ -1,12 +0,0 @@ -from abc import ABC, abstractmethod - - -class Callback(ABC): - - def __init__(self) -> None: - super().__init__() - self.timesteps_elapsed = 0 - - def on_step(self, timesteps_elapsed: int = 1) -> bool: - self.timesteps_elapsed += timesteps_elapsed - return True \ No newline at end of file diff --git a/shared/callbacks/eval_callback.py b/shared/callbacks/eval_callback.py deleted file mode 100644 index 5f9b393ce954d6e93e292d270388e31bd7f29636..0000000000000000000000000000000000000000 --- a/shared/callbacks/eval_callback.py +++ /dev/null @@ -1,199 +0,0 @@ -import itertools -import numpy as np -import os - -from time import perf_counter -from torch.utils.tensorboard.writer import SummaryWriter -from typing import List, Optional, Union - -from shared.callbacks.callback import Callback -from shared.policy.policy import Policy -from shared.stats import Episode, EpisodeAccumulator, EpisodesStats -from wrappers.vec_episode_recorder import VecEpisodeRecorder -from wrappers.vectorable_wrapper import VecEnv - - -class EvaluateAccumulator(EpisodeAccumulator): - def __init__( - self, - num_envs: int, - goal_episodes: int, - print_returns: bool = True, - ignore_first_episode: bool = False, - ): - super().__init__(num_envs) - self.completed_episodes_by_env_idx = [[] for _ in range(num_envs)] - self.goal_episodes_per_env = int(np.ceil(goal_episodes / num_envs)) - self.print_returns = print_returns - if ignore_first_episode: - first_done = set() - - def should_record_done(idx: int) -> bool: - has_done_first_episode = idx in first_done - first_done.add(idx) - return has_done_first_episode - - self.should_record_done = should_record_done - else: - self.should_record_done = lambda idx: True - - def on_done(self, ep_idx: int, episode: Episode) -> None: - if ( - self.should_record_done(ep_idx) - and len(self.completed_episodes_by_env_idx[ep_idx]) - >= self.goal_episodes_per_env - ): - return - self.completed_episodes_by_env_idx[ep_idx].append(episode) - if self.print_returns: - print( - f"Episode {len(self)} | " - f"Score {episode.score} | " - f"Length {episode.length}" - ) - - def __len__(self) -> int: - return sum(len(ce) for ce in self.completed_episodes_by_env_idx) - - @property - def episodes(self) -> List[Episode]: - return list(itertools.chain(*self.completed_episodes_by_env_idx)) - - def is_done(self) -> bool: - return all( - len(ce) == self.goal_episodes_per_env - for ce in self.completed_episodes_by_env_idx - ) - - -def evaluate( - env: VecEnv, - policy: Policy, - n_episodes: int, - render: bool = False, - deterministic: bool = True, - print_returns: bool = True, - ignore_first_episode: bool = False, -) -> EpisodesStats: - policy.sync_normalization(env) - policy.eval() - - episodes = EvaluateAccumulator( - env.num_envs, n_episodes, print_returns, ignore_first_episode - ) - - obs = env.reset() - while not episodes.is_done(): - act = policy.act(obs, deterministic=deterministic) - obs, rew, done, _ = env.step(act) - episodes.step(rew, done) - if render: - env.render() - stats = EpisodesStats(episodes.episodes) - if print_returns: - print(stats) - return stats - - -class EvalCallback(Callback): - def __init__( - self, - policy: Policy, - env: VecEnv, - tb_writer: SummaryWriter, - best_model_path: Optional[str] = None, - step_freq: Union[int, float] = 50_000, - n_episodes: int = 10, - save_best: bool = True, - deterministic: bool = True, - record_best_videos: bool = True, - video_env: Optional[VecEnv] = None, - best_video_dir: Optional[str] = None, - max_video_length: int = 3600, - ignore_first_episode: bool = False, - ) -> None: - super().__init__() - self.policy = policy - self.env = env - self.tb_writer = tb_writer - self.best_model_path = best_model_path - self.step_freq = int(step_freq) - self.n_episodes = n_episodes - self.save_best = save_best - self.deterministic = deterministic - self.stats: List[EpisodesStats] = [] - self.best = None - - self.record_best_videos = record_best_videos - assert video_env or not record_best_videos - self.video_env = video_env - assert best_video_dir or not record_best_videos - self.best_video_dir = best_video_dir - if best_video_dir: - os.makedirs(best_video_dir, exist_ok=True) - self.max_video_length = max_video_length - self.best_video_base_path = None - - self.ignore_first_episode = ignore_first_episode - - def on_step(self, timesteps_elapsed: int = 1) -> bool: - super().on_step(timesteps_elapsed) - if self.timesteps_elapsed // self.step_freq >= len(self.stats): - self.evaluate() - return True - - def evaluate( - self, n_episodes: Optional[int] = None, print_returns: Optional[bool] = None - ) -> EpisodesStats: - start_time = perf_counter() - eval_stat = evaluate( - self.env, - self.policy, - n_episodes or self.n_episodes, - deterministic=self.deterministic, - print_returns=print_returns or False, - ignore_first_episode=self.ignore_first_episode, - ) - end_time = perf_counter() - self.tb_writer.add_scalar( - "eval/steps_per_second", - eval_stat.length.sum() / (end_time - start_time), - self.timesteps_elapsed, - ) - self.policy.train(True) - print(f"Eval Timesteps: {self.timesteps_elapsed} | {eval_stat}") - - self.stats.append(eval_stat) - - if not self.best or eval_stat >= self.best: - strictly_better = not self.best or eval_stat > self.best - self.best = eval_stat - if self.save_best: - assert self.best_model_path - self.policy.save(self.best_model_path) - print("Saved best model") - self.best.write_to_tensorboard( - self.tb_writer, "best_eval", self.timesteps_elapsed - ) - if strictly_better and self.record_best_videos: - assert self.video_env and self.best_video_dir - self.best_video_base_path = os.path.join( - self.best_video_dir, str(self.timesteps_elapsed) - ) - video_wrapped = VecEpisodeRecorder( - self.video_env, - self.best_video_base_path, - max_video_length=self.max_video_length, - ) - video_stats = evaluate( - video_wrapped, - self.policy, - 1, - deterministic=self.deterministic, - print_returns=False, - ) - print(f"Saved best video: {video_stats}") - - eval_stat.write_to_tensorboard(self.tb_writer, "eval", self.timesteps_elapsed) - - return eval_stat diff --git a/shared/gae.py b/shared/gae.py deleted file mode 100644 index 05d87467d365696fb5cdb184aa690cce0ef745c5..0000000000000000000000000000000000000000 --- a/shared/gae.py +++ /dev/null @@ -1,67 +0,0 @@ -import numpy as np -import torch - -from typing import NamedTuple, Sequence - -from shared.policy.on_policy import OnPolicy -from shared.trajectory import Trajectory - - -class RtgAdvantage(NamedTuple): - rewards_to_go: torch.Tensor - advantage: torch.Tensor - - -def discounted_cumsum(x: np.ndarray, gamma: float) -> np.ndarray: - dc = x.copy() - for i in reversed(range(len(x) - 1)): - dc[i] += gamma * dc[i + 1] - return dc - - -def compute_advantage( - trajectories: Sequence[Trajectory], - policy: OnPolicy, - gamma: float, - gae_lambda: float, - device: torch.device, -) -> torch.Tensor: - advantage = [] - for traj in trajectories: - last_val = 0 - if not traj.terminated and traj.next_obs is not None: - last_val = policy.value(traj.next_obs) - rew = np.append(np.array(traj.rew), last_val) - v = np.append(np.array(traj.v), last_val) - deltas = rew[:-1] + gamma * v[1:] - v[:-1] - advantage.append(discounted_cumsum(deltas, gamma * gae_lambda)) - return torch.as_tensor( - np.concatenate(advantage), dtype=torch.float32, device=device - ) - - -def compute_rtg_and_advantage( - trajectories: Sequence[Trajectory], - policy: OnPolicy, - gamma: float, - gae_lambda: float, - device: torch.device, -) -> RtgAdvantage: - rewards_to_go = [] - advantages = [] - for traj in trajectories: - last_val = 0 - if not traj.terminated and traj.next_obs is not None: - last_val = policy.value(traj.next_obs) - rew = np.append(np.array(traj.rew), last_val) - v = np.append(np.array(traj.v), last_val) - deltas = rew[:-1] + gamma * v[1:] - v[:-1] - adv = discounted_cumsum(deltas, gamma * gae_lambda) - advantages.append(adv) - rewards_to_go.append(v[:-1] + adv) - return RtgAdvantage( - torch.as_tensor( - np.concatenate(rewards_to_go), dtype=torch.float32, device=device - ), - torch.as_tensor(np.concatenate(advantages), dtype=torch.float32, device=device), - ) diff --git a/shared/module/feature_extractor.py b/shared/module/feature_extractor.py deleted file mode 100644 index a3abeba287e9ff9da3408d0b362c6a11e878a060..0000000000000000000000000000000000000000 --- a/shared/module/feature_extractor.py +++ /dev/null @@ -1,215 +0,0 @@ -import gym -import torch -import torch.nn as nn -import torch.nn.functional as F - -from abc import ABC, abstractmethod -from gym.spaces import Box, Discrete -from stable_baselines3.common.preprocessing import get_flattened_obs_dim -from typing import Dict, Optional, Sequence, Type - -from shared.module.module import layer_init - - -class CnnFeatureExtractor(nn.Module, ABC): - @abstractmethod - def __init__( - self, - in_channels: int, - activation: Type[nn.Module] = nn.ReLU, - init_layers_orthogonal: Optional[bool] = None, - **kwargs, - ) -> None: - super().__init__() - - -class NatureCnn(CnnFeatureExtractor): - """ - CNN from DQN Nature paper: Mnih, Volodymyr, et al. - "Human-level control through deep reinforcement learning." - Nature 518.7540 (2015): 529-533. - """ - - def __init__( - self, - in_channels: int, - activation: Type[nn.Module] = nn.ReLU, - init_layers_orthogonal: Optional[bool] = None, - **kwargs, - ) -> None: - if init_layers_orthogonal is None: - init_layers_orthogonal = True - super().__init__(in_channels, activation, init_layers_orthogonal) - self.cnn = nn.Sequential( - layer_init( - nn.Conv2d(in_channels, 32, kernel_size=8, stride=4), - init_layers_orthogonal, - ), - activation(), - layer_init( - nn.Conv2d(32, 64, kernel_size=4, stride=2), - init_layers_orthogonal, - ), - activation(), - layer_init( - nn.Conv2d(64, 64, kernel_size=3, stride=1), - init_layers_orthogonal, - ), - activation(), - nn.Flatten(), - ) - - def forward(self, obs: torch.Tensor) -> torch.Tensor: - return self.cnn(obs) - - -class ResidualBlock(nn.Module): - def __init__( - self, - channels: int, - activation: Type[nn.Module] = nn.ReLU, - init_layers_orthogonal: bool = False, - ) -> None: - super().__init__() - self.residual = nn.Sequential( - activation(), - layer_init( - nn.Conv2d(channels, channels, 3, padding=1), init_layers_orthogonal - ), - activation(), - layer_init( - nn.Conv2d(channels, channels, 3, padding=1), init_layers_orthogonal - ), - ) - - def forward(self, x: torch.Tensor) -> torch.Tensor: - return x + self.residual(x) - - -class ConvSequence(nn.Module): - def __init__( - self, - in_channels: int, - out_channels: int, - activation: Type[nn.Module] = nn.ReLU, - init_layers_orthogonal: bool = False, - ) -> None: - super().__init__() - self.seq = nn.Sequential( - layer_init( - nn.Conv2d(in_channels, out_channels, 3, padding=1), - init_layers_orthogonal, - ), - nn.MaxPool2d(3, stride=2, padding=1), - ResidualBlock(out_channels, activation, init_layers_orthogonal), - ResidualBlock(out_channels, activation, init_layers_orthogonal), - ) - - def forward(self, x: torch.Tensor) -> torch.Tensor: - return self.seq(x) - - -class ImpalaCnn(CnnFeatureExtractor): - """ - IMPALA-style CNN architecture - """ - - def __init__( - self, - in_channels: int, - activation: Type[nn.Module] = nn.ReLU, - init_layers_orthogonal: Optional[bool] = None, - impala_channels: Sequence[int] = (16, 32, 32), - **kwargs, - ) -> None: - if init_layers_orthogonal is None: - init_layers_orthogonal = False - super().__init__(in_channels, activation, init_layers_orthogonal) - sequences = [] - for out_channels in impala_channels: - sequences.append( - ConvSequence( - in_channels, out_channels, activation, init_layers_orthogonal - ) - ) - in_channels = out_channels - sequences.extend( - [ - activation(), - nn.Flatten(), - ] - ) - self.seq = nn.Sequential(*sequences) - - def forward(self, obs: torch.Tensor) -> torch.Tensor: - return self.seq(obs) - - -CNN_EXTRACTORS_BY_STYLE: Dict[str, Type[CnnFeatureExtractor]] = { - "nature": NatureCnn, - "impala": ImpalaCnn, -} - - -class FeatureExtractor(nn.Module): - def __init__( - self, - obs_space: gym.Space, - activation: Type[nn.Module], - init_layers_orthogonal: bool = False, - cnn_feature_dim: int = 512, - cnn_style: str = "nature", - cnn_layers_init_orthogonal: Optional[bool] = None, - impala_channels: Sequence[int] = (16, 32, 32), - ) -> None: - super().__init__() - if isinstance(obs_space, Box): - # Conv2D: (channels, height, width) - if len(obs_space.shape) == 3: - cnn = CNN_EXTRACTORS_BY_STYLE[cnn_style]( - obs_space.shape[0], - activation, - init_layers_orthogonal=cnn_layers_init_orthogonal, - impala_channels=impala_channels, - ) - - def preprocess(obs: torch.Tensor) -> torch.Tensor: - if len(obs.shape) == 3: - obs = obs.unsqueeze(0) - return obs.float() / 255.0 - - with torch.no_grad(): - cnn_out = cnn(preprocess(torch.as_tensor(obs_space.sample()))) - self.preprocess = preprocess - self.feature_extractor = nn.Sequential( - cnn, - layer_init( - nn.Linear(cnn_out.shape[1], cnn_feature_dim), - init_layers_orthogonal, - ), - activation(), - ) - self.out_dim = cnn_feature_dim - elif len(obs_space.shape) == 1: - - def preprocess(obs: torch.Tensor) -> torch.Tensor: - if len(obs.shape) == 1: - obs = obs.unsqueeze(0) - return obs.float() - - self.preprocess = preprocess - self.feature_extractor = nn.Flatten() - self.out_dim = get_flattened_obs_dim(obs_space) - else: - raise ValueError(f"Unsupported observation space: {obs_space}") - elif isinstance(obs_space, Discrete): - self.preprocess = lambda x: F.one_hot(x, obs_space.n).float() - self.feature_extractor = nn.Flatten() - self.out_dim = obs_space.n - else: - raise NotImplementedError - - def forward(self, obs: torch.Tensor) -> torch.Tensor: - if self.preprocess: - obs = self.preprocess(obs) - return self.feature_extractor(obs) diff --git a/shared/module/module.py b/shared/module/module.py deleted file mode 100644 index c579fb2a3808de47ec8d4c5233eea947b5cf0d28..0000000000000000000000000000000000000000 --- a/shared/module/module.py +++ /dev/null @@ -1,40 +0,0 @@ -import numpy as np -import torch.nn as nn - -from typing import Sequence, Type - - -def mlp( - layer_sizes: Sequence[int], - activation: Type[nn.Module], - output_activation: Type[nn.Module] = nn.Identity, - init_layers_orthogonal: bool = False, - final_layer_gain: float = np.sqrt(2), -) -> nn.Module: - layers = [] - for i in range(len(layer_sizes) - 2): - layers.append( - layer_init( - nn.Linear(layer_sizes[i], layer_sizes[i + 1]), init_layers_orthogonal - ) - ) - layers.append(activation()) - layers.append( - layer_init( - nn.Linear(layer_sizes[-2], layer_sizes[-1]), - init_layers_orthogonal, - std=final_layer_gain, - ) - ) - layers.append(output_activation()) - return nn.Sequential(*layers) - - -def layer_init( - layer: nn.Module, init_layers_orthogonal: bool, std: float = np.sqrt(2) -) -> nn.Module: - if not init_layers_orthogonal: - return layer - nn.init.orthogonal_(layer.weight, std) # type: ignore - nn.init.constant_(layer.bias, 0.0) # type: ignore - return layer diff --git a/shared/policy/actor.py b/shared/policy/actor.py deleted file mode 100644 index 202280cb85bae1fded982c65f86520197a20ae51..0000000000000000000000000000000000000000 --- a/shared/policy/actor.py +++ /dev/null @@ -1,305 +0,0 @@ -import gym -import torch -import torch.nn as nn - -from abc import ABC, abstractmethod -from gym.spaces import Box, Discrete -from torch.distributions import Categorical, Distribution, Normal -from typing import NamedTuple, Optional, Sequence, Type, TypeVar, Union - -from shared.module.feature_extractor import FeatureExtractor -from shared.module.module import mlp - - -class PiForward(NamedTuple): - pi: Distribution - logp_a: Optional[torch.Tensor] - entropy: Optional[torch.Tensor] - - -class Actor(nn.Module, ABC): - @abstractmethod - def forward(self, obs: torch.Tensor, a: Optional[torch.Tensor] = None) -> PiForward: - ... - - -class CategoricalActorHead(Actor): - def __init__( - self, - act_dim: int, - hidden_sizes: Sequence[int] = (32,), - activation: Type[nn.Module] = nn.Tanh, - init_layers_orthogonal: bool = True, - ) -> None: - super().__init__() - layer_sizes = tuple(hidden_sizes) + (act_dim,) - self._fc = mlp( - layer_sizes, - activation, - init_layers_orthogonal=init_layers_orthogonal, - final_layer_gain=0.01, - ) - - def forward(self, obs: torch.Tensor, a: Optional[torch.Tensor] = None) -> PiForward: - logits = self._fc(obs) - pi = Categorical(logits=logits) - logp_a = None - entropy = None - if a is not None: - logp_a = pi.log_prob(a) - entropy = pi.entropy() - return PiForward(pi, logp_a, entropy) - - -class GaussianDistribution(Normal): - def log_prob(self, a: torch.Tensor) -> torch.Tensor: - return super().log_prob(a).sum(axis=-1) - - def sample(self) -> torch.Tensor: - return self.rsample() - - -class GaussianActorHead(Actor): - def __init__( - self, - act_dim: int, - hidden_sizes: Sequence[int] = (32,), - activation: Type[nn.Module] = nn.Tanh, - init_layers_orthogonal: bool = True, - log_std_init: float = -0.5, - ) -> None: - super().__init__() - layer_sizes = tuple(hidden_sizes) + (act_dim,) - self.mu_net = mlp( - layer_sizes, - activation, - init_layers_orthogonal=init_layers_orthogonal, - final_layer_gain=0.01, - ) - self.log_std = nn.Parameter( - torch.ones(act_dim, dtype=torch.float32) * log_std_init - ) - - def _distribution(self, obs: torch.Tensor) -> Distribution: - mu = self.mu_net(obs) - std = torch.exp(self.log_std) - return GaussianDistribution(mu, std) - - def forward(self, obs: torch.Tensor, a: Optional[torch.Tensor] = None) -> PiForward: - pi = self._distribution(obs) - logp_a = None - entropy = None - if a is not None: - logp_a = pi.log_prob(a) - entropy = pi.entropy() - return PiForward(pi, logp_a, entropy) - - -class TanhBijector: - def __init__(self, epsilon: float = 1e-6) -> None: - self.epsilon = epsilon - - @staticmethod - def forward(x: torch.Tensor) -> torch.Tensor: - return torch.tanh(x) - - @staticmethod - def inverse(y: torch.Tensor) -> torch.Tensor: - eps = torch.finfo(y.dtype).eps - clamped_y = y.clamp(min=-1.0 + eps, max=1.0 - eps) - return torch.atanh(clamped_y) - - def log_prob_correction(self, x: torch.Tensor) -> torch.Tensor: - return torch.log(1.0 - torch.tanh(x) ** 2 + self.epsilon) - - -class StateDependentNoiseDistribution(Normal): - def __init__( - self, - loc, - scale, - latent_sde: torch.Tensor, - exploration_mat: torch.Tensor, - exploration_matrices: torch.Tensor, - bijector: Optional[TanhBijector] = None, - validate_args=None, - ): - super().__init__(loc, scale, validate_args) - self.latent_sde = latent_sde - self.exploration_mat = exploration_mat - self.exploration_matrices = exploration_matrices - self.bijector = bijector - - def log_prob(self, a: torch.Tensor) -> torch.Tensor: - gaussian_a = self.bijector.inverse(a) if self.bijector else a - log_prob = super().log_prob(gaussian_a).sum(axis=-1) - if self.bijector: - log_prob -= torch.sum(self.bijector.log_prob_correction(gaussian_a), dim=1) - return log_prob - - def sample(self) -> torch.Tensor: - noise = self._get_noise() - actions = self.mean + noise - return self.bijector.forward(actions) if self.bijector else actions - - def _get_noise(self) -> torch.Tensor: - if len(self.latent_sde) == 1 or len(self.latent_sde) != len( - self.exploration_matrices - ): - return torch.mm(self.latent_sde, self.exploration_mat) - # (batch_size, n_features) -> (batch_size, 1, n_features) - latent_sde = self.latent_sde.unsqueeze(dim=1) - # (batch_size, 1, n_actions) - noise = torch.bmm(latent_sde, self.exploration_matrices) - return noise.squeeze(dim=1) - - @property - def mode(self) -> torch.Tensor: - mean = super().mode - return self.bijector.forward(mean) if self.bijector else mean - - -StateDependentNoiseActorHeadSelf = TypeVar( - "StateDependentNoiseActorHeadSelf", bound="StateDependentNoiseActorHead" -) - - -class StateDependentNoiseActorHead(Actor): - def __init__( - self, - act_dim: int, - hidden_sizes: Sequence[int] = (32,), - activation: Type[nn.Module] = nn.Tanh, - init_layers_orthogonal: bool = True, - log_std_init: float = -0.5, - full_std: bool = True, - squash_output: bool = False, - learn_std: bool = False, - ) -> None: - super().__init__() - self.act_dim = act_dim - layer_sizes = tuple(hidden_sizes) + (self.act_dim,) - if len(layer_sizes) == 2: - self.latent_net = nn.Identity() - elif len(layer_sizes) > 2: - self.latent_net = mlp( - layer_sizes[:-1], - activation, - output_activation=activation, - init_layers_orthogonal=init_layers_orthogonal, - ) - else: - raise ValueError("hidden_sizes must be of at least length 1") - self.mu_net = mlp( - layer_sizes[-2:], - activation, - init_layers_orthogonal=init_layers_orthogonal, - final_layer_gain=0.01, - ) - self.full_std = full_std - std_dim = (hidden_sizes[-1], act_dim if self.full_std else 1) - self.log_std = nn.Parameter( - torch.ones(std_dim, dtype=torch.float32) * log_std_init - ) - self.bijector = TanhBijector() if squash_output else None - self.learn_std = learn_std - self.device = None - - self.exploration_mat = None - self.exploration_matrices = None - self.sample_weights() - - def to( - self: StateDependentNoiseActorHeadSelf, - device: Optional[torch.device] = None, - dtype: Optional[Union[torch.dtype, str]] = None, - non_blocking: bool = False, - ) -> StateDependentNoiseActorHeadSelf: - super().to(device, dtype, non_blocking) - self.device = device - return self - - def _distribution(self, obs: torch.Tensor) -> Distribution: - latent = self.latent_net(obs) - mu = self.mu_net(latent) - latent_sde = latent if self.learn_std else latent.detach() - variance = torch.mm(latent_sde**2, self._get_std() ** 2) - assert self.exploration_mat is not None - assert self.exploration_matrices is not None - return StateDependentNoiseDistribution( - mu, - torch.sqrt(variance + 1e-6), - latent_sde, - self.exploration_mat, - self.exploration_matrices, - self.bijector, - ) - - def _get_std(self) -> torch.Tensor: - std = torch.exp(self.log_std) - if self.full_std: - return std - ones = torch.ones(self.log_std.shape[0], self.act_dim) - if self.device: - ones = ones.to(self.device) - return ones * std - - def forward(self, obs: torch.Tensor, a: Optional[torch.Tensor] = None) -> PiForward: - pi = self._distribution(obs) - logp_a = None - entropy = None - if a is not None: - logp_a = pi.log_prob(a) - entropy = -logp_a - return PiForward(pi, logp_a, entropy) - - def sample_weights(self, batch_size: int = 1) -> None: - std = self._get_std() - weights_dist = Normal(torch.zeros_like(std), std) - # Reparametrization trick to pass gradients - self.exploration_mat = weights_dist.rsample() - self.exploration_matrices = weights_dist.rsample(torch.Size((batch_size,))) - - -def actor_head( - action_space: gym.Space, - hidden_sizes: Sequence[int], - init_layers_orthogonal: bool, - activation: Type[nn.Module], - log_std_init: float = -0.5, - use_sde: bool = False, - full_std: bool = True, - squash_output: bool = False, -) -> Actor: - assert not use_sde or isinstance( - action_space, Box - ), "use_sde only valid if Box action_space" - assert not squash_output or use_sde, "squash_output only valid if use_sde" - if isinstance(action_space, Discrete): - return CategoricalActorHead( - action_space.n, - hidden_sizes=hidden_sizes, - activation=activation, - init_layers_orthogonal=init_layers_orthogonal, - ) - elif isinstance(action_space, Box): - if use_sde: - return StateDependentNoiseActorHead( - action_space.shape[0], - hidden_sizes=hidden_sizes, - activation=activation, - init_layers_orthogonal=init_layers_orthogonal, - log_std_init=log_std_init, - full_std=full_std, - squash_output=squash_output, - ) - else: - return GaussianActorHead( - action_space.shape[0], - hidden_sizes=hidden_sizes, - activation=activation, - init_layers_orthogonal=init_layers_orthogonal, - log_std_init=log_std_init, - ) - else: - raise ValueError(f"Unsupported action space: {action_space}") diff --git a/shared/policy/critic.py b/shared/policy/critic.py deleted file mode 100644 index 70ed0e0778c6809f943aab4da70bec3b88fc5cf2..0000000000000000000000000000000000000000 --- a/shared/policy/critic.py +++ /dev/null @@ -1,28 +0,0 @@ -import gym -import torch -import torch.nn as nn - -from typing import Sequence, Type -from shared.module.feature_extractor import FeatureExtractor -from shared.module.module import mlp - - -class CriticHead(nn.Module): - def __init__( - self, - hidden_sizes: Sequence[int] = (32,), - activation: Type[nn.Module] = nn.Tanh, - init_layers_orthogonal: bool = True, - ) -> None: - super().__init__() - layer_sizes = tuple(hidden_sizes) + (1,) - self._fc = mlp( - layer_sizes, - activation, - init_layers_orthogonal=init_layers_orthogonal, - final_layer_gain=1.0, - ) - - def forward(self, obs: torch.Tensor) -> torch.Tensor: - v = self._fc(obs) - return v.squeeze(-1) diff --git a/shared/policy/on_policy.py b/shared/policy/on_policy.py deleted file mode 100644 index 7c6517232d4cf0672594e354c4d3949c86d7c936..0000000000000000000000000000000000000000 --- a/shared/policy/on_policy.py +++ /dev/null @@ -1,222 +0,0 @@ -import gym -import numpy as np -import torch - -from abc import abstractmethod -from gym.spaces import Box, Discrete, Space -from typing import NamedTuple, Optional, Sequence, Tuple, TypeVar - -from shared.module.feature_extractor import FeatureExtractor -from shared.policy.actor import PiForward, StateDependentNoiseActorHead, actor_head -from shared.policy.critic import CriticHead -from shared.policy.policy import ACTIVATION, Policy -from wrappers.vectorable_wrapper import ( - VecEnv, - VecEnvObs, - single_observation_space, - single_action_space, -) - - -class Step(NamedTuple): - a: np.ndarray - v: np.ndarray - logp_a: np.ndarray - clamped_a: np.ndarray - - -class ACForward(NamedTuple): - logp_a: torch.Tensor - entropy: torch.Tensor - v: torch.Tensor - - -FEAT_EXT_FILE_NAME = "feat_ext.pt" -V_FEAT_EXT_FILE_NAME = "v_feat_ext.pt" -PI_FILE_NAME = "pi.pt" -V_FILE_NAME = "v.pt" -ActorCriticSelf = TypeVar("ActorCriticSelf", bound="ActorCritic") - - -def clamp_actions( - actions: np.ndarray, action_space: gym.Space, squash_output: bool -) -> np.ndarray: - if isinstance(action_space, Box): - low, high = action_space.low, action_space.high # type: ignore - if squash_output: - # Squashed output is already between -1 and 1. Rescale if the actual - # output needs to something other than -1 and 1 - return low + 0.5 * (actions + 1) * (high - low) - else: - return np.clip(actions, low, high) - return actions - - -def default_hidden_sizes(obs_space: Space) -> Sequence[int]: - if isinstance(obs_space, Box): - if len(obs_space.shape) == 3: - # By default feature extractor to output has no hidden layers - return [] - elif len(obs_space.shape) == 1: - return [64, 64] - else: - raise ValueError(f"Unsupported observation space: {obs_space}") - elif isinstance(obs_space, Discrete): - return [64] - else: - raise ValueError(f"Unsupported observation space: {obs_space}") - - -class OnPolicy(Policy): - @abstractmethod - def value(self, obs: VecEnvObs) -> np.ndarray: - ... - - @abstractmethod - def step(self, obs: VecEnvObs) -> Step: - ... - - -class ActorCritic(OnPolicy): - def __init__( - self, - env: VecEnv, - pi_hidden_sizes: Optional[Sequence[int]] = None, - v_hidden_sizes: Optional[Sequence[int]] = None, - init_layers_orthogonal: bool = True, - activation_fn: str = "tanh", - log_std_init: float = -0.5, - use_sde: bool = False, - full_std: bool = True, - squash_output: bool = False, - share_features_extractor: bool = True, - cnn_feature_dim: int = 512, - cnn_style: str = "nature", - cnn_layers_init_orthogonal: Optional[bool] = None, - impala_channels: Sequence[int] = (16, 32, 32), - **kwargs, - ) -> None: - super().__init__(env, **kwargs) - - observation_space = single_observation_space(env) - action_space = single_action_space(env) - - pi_hidden_sizes = ( - pi_hidden_sizes - if pi_hidden_sizes is not None - else default_hidden_sizes(observation_space) - ) - v_hidden_sizes = ( - v_hidden_sizes - if v_hidden_sizes is not None - else default_hidden_sizes(observation_space) - ) - - activation = ACTIVATION[activation_fn] - self.action_space = action_space - self.squash_output = squash_output - self.share_features_extractor = share_features_extractor - self._feature_extractor = FeatureExtractor( - observation_space, - activation, - init_layers_orthogonal=init_layers_orthogonal, - cnn_feature_dim=cnn_feature_dim, - cnn_style=cnn_style, - cnn_layers_init_orthogonal=cnn_layers_init_orthogonal, - impala_channels=impala_channels, - ) - self._pi = actor_head( - self.action_space, - (self._feature_extractor.out_dim,) + tuple(pi_hidden_sizes), - init_layers_orthogonal, - activation, - log_std_init=log_std_init, - use_sde=use_sde, - full_std=full_std, - squash_output=squash_output, - ) - - if not share_features_extractor: - self._v_feature_extractor = FeatureExtractor( - observation_space, - activation, - init_layers_orthogonal=init_layers_orthogonal, - cnn_feature_dim=cnn_feature_dim, - cnn_style=cnn_style, - cnn_layers_init_orthogonal=cnn_layers_init_orthogonal, - ) - v_hidden_sizes = (self._v_feature_extractor.out_dim,) + tuple( - v_hidden_sizes - ) - else: - self._v_feature_extractor = None - v_hidden_sizes = (self._feature_extractor.out_dim,) + tuple(v_hidden_sizes) - self._v = CriticHead( - hidden_sizes=v_hidden_sizes, - activation=activation, - init_layers_orthogonal=init_layers_orthogonal, - ) - - def _pi_forward( - self, obs: torch.Tensor, action: Optional[torch.Tensor] = None - ) -> Tuple[PiForward, torch.Tensor]: - p_fe = self._feature_extractor(obs) - pi_forward = self._pi(p_fe, action) - - return pi_forward, p_fe - - def _v_forward(self, obs: torch.Tensor, p_fc: torch.Tensor) -> torch.Tensor: - v_fe = self._v_feature_extractor(obs) if self._v_feature_extractor else p_fc - return self._v(v_fe) - - def forward(self, obs: torch.Tensor, action: torch.Tensor) -> ACForward: - (_, logp_a, entropy), p_fc = self._pi_forward(obs, action) - v = self._v_forward(obs, p_fc) - - assert logp_a is not None - assert entropy is not None - return ACForward(logp_a, entropy, v) - - def value(self, obs: VecEnvObs) -> np.ndarray: - o = self._as_tensor(obs) - with torch.no_grad(): - fe = ( - self._v_feature_extractor(o) - if self._v_feature_extractor - else self._feature_extractor(o) - ) - v = self._v(fe) - return v.cpu().numpy() - - def step(self, obs: VecEnvObs) -> Step: - o = self._as_tensor(obs) - with torch.no_grad(): - (pi, _, _), p_fc = self._pi_forward(o) - a = pi.sample() - logp_a = pi.log_prob(a) - - v = self._v_forward(o, p_fc) - - a_np = a.cpu().numpy() - clamped_a_np = clamp_actions(a_np, self.action_space, self.squash_output) - return Step(a_np, v.cpu().numpy(), logp_a.cpu().numpy(), clamped_a_np) - - def act(self, obs: np.ndarray, deterministic: bool = True) -> np.ndarray: - if not deterministic: - return self.step(obs).clamped_a - else: - o = self._as_tensor(obs) - with torch.no_grad(): - (pi, _, _), _ = self._pi_forward(o) - a = pi.mode - return clamp_actions(a.cpu().numpy(), self.action_space, self.squash_output) - - def load(self, path: str) -> None: - super().load(path) - self.reset_noise() - - def reset_noise(self, batch_size: Optional[int] = None) -> None: - if isinstance(self._pi, StateDependentNoiseActorHead): - self._pi.sample_weights( - batch_size=batch_size if batch_size else self.env.num_envs - ) diff --git a/shared/policy/policy.py b/shared/policy/policy.py deleted file mode 100644 index f0669a5c21094b9e815b7348cdb7b20606f69601..0000000000000000000000000000000000000000 --- a/shared/policy/policy.py +++ /dev/null @@ -1,114 +0,0 @@ -import numpy as np -import os -import torch -import torch.nn as nn - -from abc import ABC, abstractmethod -from copy import deepcopy -from stable_baselines3.common.vec_env import unwrap_vec_normalize -from stable_baselines3.common.vec_env.vec_normalize import VecNormalize -from typing import Dict, Optional, Type, TypeVar, Union - -from wrappers.normalize import NormalizeObservation, NormalizeReward -from wrappers.vectorable_wrapper import VecEnv, VecEnvObs, find_wrapper - -ACTIVATION: Dict[str, Type[nn.Module]] = { - "tanh": nn.Tanh, - "relu": nn.ReLU, -} - -VEC_NORMALIZE_FILENAME = "vecnormalize.pkl" -MODEL_FILENAME = "model.pth" -NORMALIZE_OBSERVATION_FILENAME = "norm_obs.npz" -NORMALIZE_REWARD_FILENAME = "norm_reward.npz" - -PolicySelf = TypeVar("PolicySelf", bound="Policy") - - -class Policy(nn.Module, ABC): - @abstractmethod - def __init__(self, env: VecEnv, **kwargs) -> None: - super().__init__() - self.env = env - self.vec_normalize = unwrap_vec_normalize(env) - self.norm_observation = find_wrapper(env, NormalizeObservation) - self.norm_reward = find_wrapper(env, NormalizeReward) - self.device = None - - def to( - self: PolicySelf, - device: Optional[torch.device] = None, - dtype: Optional[Union[torch.dtype, str]] = None, - non_blocking: bool = False, - ) -> PolicySelf: - super().to(device, dtype, non_blocking) - self.device = device - return self - - @abstractmethod - def act(self, obs: VecEnvObs, deterministic: bool = True) -> np.ndarray: - ... - - def save(self, path: str) -> None: - os.makedirs(path, exist_ok=True) - - if self.vec_normalize: - self.vec_normalize.save(os.path.join(path, VEC_NORMALIZE_FILENAME)) - if self.norm_observation: - self.norm_observation.save( - os.path.join(path, NORMALIZE_OBSERVATION_FILENAME) - ) - if self.norm_reward: - self.norm_reward.save(os.path.join(path, NORMALIZE_REWARD_FILENAME)) - torch.save( - self.state_dict(), - os.path.join(path, MODEL_FILENAME), - ) - - def load(self, path: str) -> None: - # VecNormalize load occurs in env.py - self.load_state_dict( - torch.load(os.path.join(path, MODEL_FILENAME), map_location=self.device) - ) - if self.norm_observation: - self.norm_observation.load( - os.path.join(path, NORMALIZE_OBSERVATION_FILENAME) - ) - if self.norm_reward: - self.norm_reward.load(os.path.join(path, NORMALIZE_REWARD_FILENAME)) - - def reset_noise(self) -> None: - pass - - def _as_tensor(self, obs: VecEnvObs) -> torch.Tensor: - assert isinstance(obs, np.ndarray) - o = torch.as_tensor(obs) - if self.device is not None: - o = o.to(self.device) - return o - - def num_trainable_parameters(self) -> int: - return sum(p.numel() for p in self.parameters() if p.requires_grad) - - def num_parameters(self) -> int: - return sum(p.numel() for p in self.parameters()) - - def sync_normalization(self, destination_env) -> None: - current = destination_env - while current != current.unwrapped: - if isinstance(current, VecNormalize): - assert self.vec_normalize - current.ret_rms = deepcopy(self.vec_normalize.ret_rms) - if hasattr(self.vec_normalize, "obs_rms"): - current.obs_rms = deepcopy(self.vec_normalize.obs_rms) - elif isinstance(current, NormalizeObservation): - assert self.norm_observation - current.rms = deepcopy(self.norm_observation.rms) - elif isinstance(current, NormalizeReward): - assert self.norm_reward - current.rms = deepcopy(self.norm_reward.rms) - current = getattr(current, "venv", getattr(current, "env", current)) - if not current: - raise AttributeError( - f"{type(current)} doesn't include env or venv attribute" - ) diff --git a/shared/schedule.py b/shared/schedule.py deleted file mode 100644 index 1461a782341eff5d89a53f16aebdc268bf9f7f52..0000000000000000000000000000000000000000 --- a/shared/schedule.py +++ /dev/null @@ -1,31 +0,0 @@ -from torch.optim import Optimizer -from typing import Callable - -Schedule = Callable[[float], float] - - -def linear_schedule( - start_val: float, end_val: float, end_fraction: float = 1.0 -) -> Schedule: - def func(progress_fraction: float) -> float: - if progress_fraction >= end_fraction: - return end_val - else: - return start_val + (end_val - start_val) * progress_fraction / end_fraction - - return func - - -def constant_schedule(val: float) -> Schedule: - return lambda f: val - - -def schedule(name: str, start_val: float) -> Schedule: - if name == "linear": - return linear_schedule(start_val, 0) - return constant_schedule(start_val) - - -def update_learning_rate(optimizer: Optimizer, learning_rate: float) -> None: - for param_group in optimizer.param_groups: - param_group["lr"] = learning_rate diff --git a/shared/stats.py b/shared/stats.py deleted file mode 100644 index 2315e6bb0de04ee56ca577cb7444f17e93e88fc0..0000000000000000000000000000000000000000 --- a/shared/stats.py +++ /dev/null @@ -1,160 +0,0 @@ -import numpy as np - -from dataclasses import dataclass -from torch.utils.tensorboard.writer import SummaryWriter -from typing import Dict, List, Optional, Sequence, Union, TypeVar - - -@dataclass -class Episode: - score: float = 0 - length: int = 0 - - -StatisticSelf = TypeVar("StatisticSelf", bound="Statistic") - - -@dataclass -class Statistic: - values: np.ndarray - round_digits: int = 2 - - @property - def mean(self) -> float: - return np.mean(self.values).item() - - @property - def std(self) -> float: - return np.std(self.values).item() - - @property - def min(self) -> float: - return np.min(self.values).item() - - @property - def max(self) -> float: - return np.max(self.values).item() - - def sum(self) -> float: - return np.sum(self.values).item() - - def __len__(self) -> int: - return len(self.values) - - def _diff(self: StatisticSelf, o: StatisticSelf) -> float: - return (self.mean - self.std) - (o.mean - o.std) - - def __gt__(self: StatisticSelf, o: StatisticSelf) -> bool: - return self._diff(o) > 0 - - def __ge__(self: StatisticSelf, o: StatisticSelf) -> bool: - return self._diff(o) >= 0 - - def __repr__(self) -> str: - mean = round(self.mean, self.round_digits) - std = round(self.std, self.round_digits) - if self.round_digits == 0: - mean = int(mean) - std = int(std) - return f"{mean} +/- {std}" - - def to_dict(self) -> Dict[str, float]: - return { - "mean": self.mean, - "std": self.std, - "min": self.min, - "max": self.max, - } - - -EpisodesStatsSelf = TypeVar("EpisodesStatsSelf", bound="EpisodesStats") - - -class EpisodesStats: - episodes: Sequence[Episode] - simple: bool - score: Statistic - length: Statistic - - def __init__(self, episodes: Sequence[Episode], simple: bool = False) -> None: - self.episodes = episodes - self.simple = simple - self.score = Statistic(np.array([e.score for e in episodes])) - self.length = Statistic(np.array([e.length for e in episodes]), round_digits=0) - - def __gt__(self: EpisodesStatsSelf, o: EpisodesStatsSelf) -> bool: - return self.score > o.score - - def __ge__(self: EpisodesStatsSelf, o: EpisodesStatsSelf) -> bool: - return self.score >= o.score - - def __repr__(self) -> str: - return ( - f"Score: {self.score} ({round(self.score.mean - self.score.std, 2)}) | " - f"Length: {self.length}" - ) - - def __len__(self) -> int: - return len(self.episodes) - - def _asdict(self) -> dict: - return { - "n_episodes": len(self.episodes), - "score": self.score.to_dict(), - "length": self.length.to_dict(), - } - - def write_to_tensorboard( - self, tb_writer: SummaryWriter, main_tag: str, global_step: Optional[int] = None - ) -> None: - stats = {"mean": self.score.mean} - if not self.simple: - stats.update( - { - "min": self.score.min, - "max": self.score.max, - "result": self.score.mean - self.score.std, - "n_episodes": len(self.episodes), - "length": self.length.mean, - } - ) - for name, value in stats.items(): - tb_writer.add_scalar(f"{main_tag}/{name}", value, global_step=global_step) - - -class EpisodeAccumulator: - def __init__(self, num_envs: int): - self._episodes = [] - self.current_episodes = [Episode() for _ in range(num_envs)] - - @property - def episodes(self) -> List[Episode]: - return self._episodes - - def step(self, reward: np.ndarray, done: np.ndarray) -> None: - for idx, current in enumerate(self.current_episodes): - current.score += reward[idx] - current.length += 1 - if done[idx]: - self._episodes.append(current) - self.current_episodes[idx] = Episode() - self.on_done(idx, current) - - def __len__(self) -> int: - return len(self.episodes) - - def on_done(self, ep_idx: int, episode: Episode) -> None: - pass - - def stats(self) -> EpisodesStats: - return EpisodesStats(self.episodes) - - -def log_scalars( - tb_writer: SummaryWriter, - main_tag: str, - tag_scalar_dict: Dict[str, Union[int, float]], - global_step: int, -) -> None: - for tag, value in tag_scalar_dict.items(): - tb_writer.add_scalar(f"{main_tag}/{tag}", value, global_step) diff --git a/shared/trajectory.py b/shared/trajectory.py deleted file mode 100644 index def6fc8e6876dafe777eb23d9d2e57ba93db5b45..0000000000000000000000000000000000000000 --- a/shared/trajectory.py +++ /dev/null @@ -1,81 +0,0 @@ -import numpy as np - -from dataclasses import dataclass, field -from typing import Generic, List, Optional, Type, TypeVar - -from wrappers.vectorable_wrapper import VecEnvObs - - -@dataclass -class Trajectory: - obs: List[np.ndarray] = field(default_factory=list) - act: List[np.ndarray] = field(default_factory=list) - next_obs: Optional[np.ndarray] = None - rew: List[float] = field(default_factory=list) - terminated: bool = False - v: List[float] = field(default_factory=list) - - def add( - self, - obs: np.ndarray, - act: np.ndarray, - next_obs: np.ndarray, - rew: float, - terminated: bool, - v: float, - ): - self.obs.append(obs) - self.act.append(act) - self.next_obs = next_obs if not terminated else None - self.rew.append(rew) - self.terminated = terminated - self.v.append(v) - - def __len__(self) -> int: - return len(self.obs) - - -T = TypeVar("T", bound=Trajectory) - - -class TrajectoryAccumulator(Generic[T]): - def __init__(self, num_envs: int, trajectory_class: Type[T] = Trajectory) -> None: - self.num_envs = num_envs - self.trajectory_class = trajectory_class - - self._trajectories = [] - self._current_trajectories = [trajectory_class() for _ in range(num_envs)] - - def step( - self, - obs: VecEnvObs, - action: np.ndarray, - next_obs: VecEnvObs, - reward: np.ndarray, - done: np.ndarray, - val: np.ndarray, - *args, - ) -> None: - assert isinstance(obs, np.ndarray) - assert isinstance(next_obs, np.ndarray) - for i, args in enumerate(zip(obs, action, next_obs, reward, done, val, *args)): - trajectory = self._current_trajectories[i] - # TODO: Eventually take advantage of terminated/truncated differentiation in - # later versions of gym. - trajectory.add(*args) - if done[i]: - self._trajectories.append(trajectory) - self._current_trajectories[i] = self.trajectory_class() - self.on_done(i, trajectory) - - @property - def all_trajectories(self) -> List[T]: - return self._trajectories + list( - filter(lambda t: len(t), self._current_trajectories) - ) - - def n_timesteps(self) -> int: - return sum(len(t) for t in self.all_trajectories) - - def on_done(self, env_idx: int, trajectory: T) -> None: - pass diff --git a/vpg/policy.py b/vpg/policy.py deleted file mode 100644 index 2e2553fbf0ab40f28509bb4d9d99084e2201aa96..0000000000000000000000000000000000000000 --- a/vpg/policy.py +++ /dev/null @@ -1,128 +0,0 @@ -import numpy as np -import torch -import torch.nn as nn - -from typing import Optional, Sequence - -from shared.module.feature_extractor import FeatureExtractor -from shared.policy.actor import ( - PiForward, - Actor, - StateDependentNoiseActorHead, - actor_head, -) -from shared.policy.critic import CriticHead -from shared.policy.on_policy import ( - Step, - ACForward, - OnPolicy, - clamp_actions, - default_hidden_sizes, -) -from shared.policy.policy import ACTIVATION -from wrappers.vectorable_wrapper import VecEnv, VecEnvObs, single_observation_space, single_action_space - -PI_FILE_NAME = "pi.pt" -V_FILE_NAME = "v.pt" - - -class VPGActor(Actor): - def __init__(self, feature_extractor: FeatureExtractor, head: Actor) -> None: - super().__init__() - self.feature_extractor = feature_extractor - self.head = head - - def forward(self, obs: torch.Tensor, a: Optional[torch.Tensor] = None) -> PiForward: - fe = self.feature_extractor(obs) - return self.head(fe, a) - - -class VPGActorCritic(OnPolicy): - def __init__( - self, - env: VecEnv, - hidden_sizes: Optional[Sequence[int]] = None, - init_layers_orthogonal: bool = True, - activation_fn: str = "tanh", - log_std_init: float = -0.5, - use_sde: bool = False, - full_std: bool = True, - squash_output: bool = False, - **kwargs, - ) -> None: - super().__init__(env, **kwargs) - activation = ACTIVATION[activation_fn] - obs_space = single_observation_space(env) - self.action_space = single_action_space(env) - self.use_sde = use_sde - self.squash_output = squash_output - - hidden_sizes = ( - hidden_sizes - if hidden_sizes is not None - else default_hidden_sizes(obs_space) - ) - - pi_feature_extractor = FeatureExtractor( - obs_space, activation, init_layers_orthogonal=init_layers_orthogonal - ) - pi_head = actor_head( - self.action_space, - (pi_feature_extractor.out_dim,) + tuple(hidden_sizes), - init_layers_orthogonal, - activation, - log_std_init=log_std_init, - use_sde=use_sde, - full_std=full_std, - squash_output=squash_output, - ) - self.pi = VPGActor(pi_feature_extractor, pi_head) - - v_feature_extractor = FeatureExtractor( - obs_space, activation, init_layers_orthogonal=init_layers_orthogonal - ) - v_head = CriticHead( - (v_feature_extractor.out_dim,) + tuple(hidden_sizes), - activation=activation, - init_layers_orthogonal=init_layers_orthogonal, - ) - self.v = nn.Sequential(v_feature_extractor, v_head) - - def value(self, obs: VecEnvObs) -> np.ndarray: - o = self._as_tensor(obs) - with torch.no_grad(): - v = self.v(o) - return v.cpu().numpy() - - def step(self, obs: VecEnvObs) -> Step: - o = self._as_tensor(obs) - with torch.no_grad(): - pi, _, _ = self.pi(o) - a = pi.sample() - logp_a = pi.log_prob(a) - - v = self.v(o) - - a_np = a.cpu().numpy() - clamped_a_np = clamp_actions(a_np, self.action_space, self.squash_output) - return Step(a_np, v.cpu().numpy(), logp_a.cpu().numpy(), clamped_a_np) - - def act(self, obs: np.ndarray, deterministic: bool = True) -> np.ndarray: - if not deterministic: - return self.step(obs).clamped_a - else: - o = self._as_tensor(obs) - with torch.no_grad(): - pi, _, _ = self.pi(o) - a = pi.mode - return clamp_actions(a.cpu().numpy(), self.action_space, self.squash_output) - - def load(self, path: str) -> None: - super().load(path) - self.reset_noise() - - def reset_noise(self, batch_size: Optional[int] = None) -> None: - if isinstance(self.pi.head, StateDependentNoiseActorHead): - self.pi.head.sample_weights( - batch_size=batch_size if batch_size else self.env.num_envs - ) diff --git a/vpg/vpg.py b/vpg/vpg.py deleted file mode 100644 index 6f47ebe532f37270eab10e7c388bc78754d01bc3..0000000000000000000000000000000000000000 --- a/vpg/vpg.py +++ /dev/null @@ -1,168 +0,0 @@ -import numpy as np -import torch -import torch.nn as nn - -from collections import defaultdict -from dataclasses import dataclass, asdict -from torch.optim import Adam -from torch.utils.tensorboard.writer import SummaryWriter -from typing import Optional, Sequence, TypeVar - -from shared.algorithm import Algorithm -from shared.callbacks.callback import Callback -from shared.gae import compute_rtg_and_advantage, compute_advantage -from shared.trajectory import Trajectory, TrajectoryAccumulator -from vpg.policy import VPGActorCritic -from wrappers.vectorable_wrapper import VecEnv - - -@dataclass -class TrainEpochStats: - pi_loss: float - entropy_loss: float - v_loss: float - envs_with_done: int = 0 - episodes_done: int = 0 - - def write_to_tensorboard(self, tb_writer: SummaryWriter, global_step: int) -> None: - for name, value in asdict(self).items(): - tb_writer.add_scalar(f"losses/{name}", value, global_step=global_step) - - -class VPGTrajectoryAccumulator(TrajectoryAccumulator): - def __init__(self, num_envs: int) -> None: - super().__init__(num_envs, trajectory_class=Trajectory) - self.completed_per_env: defaultdict[int, int] = defaultdict(int) - - def on_done(self, env_idx: int, trajectory: Trajectory) -> None: - self.completed_per_env[env_idx] += 1 - - -VanillaPolicyGradientSelf = TypeVar( - "VanillaPolicyGradientSelf", bound="VanillaPolicyGradient" -) - - -class VanillaPolicyGradient(Algorithm): - def __init__( - self, - policy: VPGActorCritic, - env: VecEnv, - device: torch.device, - tb_writer: SummaryWriter, - gamma: float = 0.99, - pi_lr: float = 3e-4, - val_lr: float = 1e-3, - train_v_iters: int = 80, - gae_lambda: float = 0.97, - max_grad_norm: float = 10.0, - n_steps: int = 4_000, - sde_sample_freq: int = -1, - update_rtg_between_v_iters: bool = False, - ent_coef: float = 0.0, - ) -> None: - super().__init__(policy, env, device, tb_writer) - self.policy = policy - - self.gamma = gamma - self.gae_lambda = gae_lambda - self.pi_optim = Adam(self.policy.pi.parameters(), lr=pi_lr) - self.val_optim = Adam(self.policy.v.parameters(), lr=val_lr) - self.max_grad_norm = max_grad_norm - - self.n_steps = n_steps - self.train_v_iters = train_v_iters - self.sde_sample_freq = sde_sample_freq - self.update_rtg_between_v_iters = update_rtg_between_v_iters - - self.ent_coef = ent_coef - - def learn( - self: VanillaPolicyGradientSelf, - total_timesteps: int, - callback: Optional[Callback] = None, - ) -> VanillaPolicyGradientSelf: - timesteps_elapsed = 0 - epoch_cnt = 0 - while timesteps_elapsed < total_timesteps: - epoch_cnt += 1 - accumulator = self._collect_trajectories() - epoch_stats = self.train(accumulator.all_trajectories) - epoch_stats.envs_with_done = len(accumulator.completed_per_env) - epoch_stats.episodes_done = sum(accumulator.completed_per_env.values()) - epoch_steps = accumulator.n_timesteps() - timesteps_elapsed += epoch_steps - epoch_stats.write_to_tensorboard( - self.tb_writer, global_step=timesteps_elapsed - ) - print( - " | ".join( - [ - f"Epoch: {epoch_cnt}", - f"Pi Loss: {round(epoch_stats.pi_loss, 2)}", - f"Epoch Loss: {round(epoch_stats.entropy_loss, 2)}", - f"V Loss: {round(epoch_stats.v_loss, 2)}", - f"Total Steps: {timesteps_elapsed}", - ] - ) - ) - if callback: - callback.on_step(timesteps_elapsed=epoch_steps) - return self - - def train(self, trajectories: Sequence[Trajectory]) -> TrainEpochStats: - self.policy.train() - obs = torch.as_tensor( - np.concatenate([np.array(t.obs) for t in trajectories]), device=self.device - ) - act = torch.as_tensor( - np.concatenate([np.array(t.act) for t in trajectories]), device=self.device - ) - rtg, adv = compute_rtg_and_advantage( - trajectories, self.policy, self.gamma, self.gae_lambda, self.device - ) - - _, logp, entropy = self.policy.pi(obs, act) - pi_loss = -(logp * adv).mean() - entropy_loss = entropy.mean() - - actor_loss = pi_loss - self.ent_coef * entropy_loss - - self.pi_optim.zero_grad() - actor_loss.backward() - nn.utils.clip_grad_norm_(self.policy.pi.parameters(), self.max_grad_norm) - self.pi_optim.step() - - v_loss = 0 - for _ in range(self.train_v_iters): - if self.update_rtg_between_v_iters: - rtg = compute_advantage( - trajectories, self.policy, self.gamma, self.gae_lambda, self.device - ) - v = self.policy.v(obs) - v_loss = ((v - rtg) ** 2).mean() - - self.val_optim.zero_grad() - v_loss.backward() - nn.utils.clip_grad_norm_(self.policy.v.parameters(), self.max_grad_norm) - self.val_optim.step() - - return TrainEpochStats( - pi_loss.item(), - entropy_loss.item(), - v_loss.item(), # type: ignore - ) - - def _collect_trajectories(self) -> VPGTrajectoryAccumulator: - self.policy.eval() - obs = self.env.reset() - accumulator = VPGTrajectoryAccumulator(self.env.num_envs) - self.policy.reset_noise() - for i in range(self.n_steps): - if self.sde_sample_freq > 0 and i > 0 and i % self.sde_sample_freq == 0: - self.policy.reset_noise() - action, value, _, clamped_action = self.policy.step(obs) - next_obs, reward, done, _ = self.env.step(clamped_action) - accumulator.step(obs, action, next_obs, reward, done, value) - obs = next_obs - return accumulator diff --git a/wrappers/atari_wrappers.py b/wrappers/atari_wrappers.py deleted file mode 100644 index 6b866eb9c0a80d7428de3468b8bb33d1a3c4d01a..0000000000000000000000000000000000000000 --- a/wrappers/atari_wrappers.py +++ /dev/null @@ -1,84 +0,0 @@ -import gym -import numpy as np - -from typing import Any, Dict, Tuple, Union - -from wrappers.vectorable_wrapper import VecotarableWrapper - -ObsType = Union[np.ndarray, dict] -ActType = Union[int, float, np.ndarray, dict] - - -class EpisodicLifeEnv(VecotarableWrapper): - def __init__(self, env: gym.Env, training: bool = True, noop_act: int = 0) -> None: - super().__init__(env) - self.training = training - self.noop_act = noop_act - self.life_done_continue = False - self.lives = 0 - - def step(self, action: ActType) -> Tuple[ObsType, float, bool, Dict[str, Any]]: - obs, rew, done, info = self.env.step(action) - new_lives = self.env.unwrapped.ale.lives() - self.life_done_continue = new_lives != self.lives and not done - # Only if training should life-end be marked as done - if self.training and 0 < new_lives < self.lives: - done = True - self.lives = new_lives - return obs, rew, done, info - - def reset(self, **kwargs) -> ObsType: - # If life_done_continue (but not game over), then a reset should just allow the - # game to progress to the next life. - if self.training and self.life_done_continue: - obs, _, _, _ = self.env.step(self.noop_act) - else: - obs = self.env.reset(**kwargs) - self.lives = self.env.unwrapped.ale.lives() - return obs - - -class FireOnLifeStarttEnv(VecotarableWrapper): - def __init__(self, env: gym.Env, fire_act: int = 1) -> None: - super().__init__(env) - self.fire_act = fire_act - action_meanings = env.unwrapped.get_action_meanings() - assert action_meanings[fire_act] == "FIRE" - assert len(action_meanings) >= 3 - self.lives = 0 - self.fire_on_next_step = True - - def step(self, action: ActType) -> Tuple[ObsType, float, bool, Dict[str, Any]]: - if self.fire_on_next_step: - action = self.fire_act - self.fire_on_next_step = False - obs, rew, done, info = self.env.step(action) - new_lives = self.env.unwrapped.ale.lives() - if 0 < new_lives < self.lives and not done: - self.fire_on_next_step = True - self.lives = new_lives - return obs, rew, done, info - - def reset(self, **kwargs) -> ObsType: - self.env.reset(**kwargs) - obs, _, done, _ = self.env.step(self.fire_act) - if done: - self.env.reset(**kwargs) - obs, _, done, _ = self.env.step(2) - if done: - self.env.reset(**kwargs) - self.fire_on_next_step = False - return obs - - -class ClipRewardEnv(VecotarableWrapper): - def __init__(self, env: gym.Env, training: bool = True) -> None: - super().__init__(env) - self.training = training - - def step(self, action: ActType) -> Tuple[ObsType, float, bool, Dict[str, Any]]: - obs, rew, done, info = self.env.step(action) - if self.training: - info["unclipped_reward"] = rew - rew = np.sign(rew) - return obs, rew, done, info diff --git a/wrappers/episode_record_video.py b/wrappers/episode_record_video.py deleted file mode 100644 index 13aa32813b9318a549de799980a851a168821254..0000000000000000000000000000000000000000 --- a/wrappers/episode_record_video.py +++ /dev/null @@ -1,75 +0,0 @@ -import gym -import numpy as np - -from gym.wrappers.monitoring.video_recorder import VideoRecorder -from typing import Tuple, Union - -from wrappers.vectorable_wrapper import VecotarableWrapper - -ObsType = Union[np.ndarray, dict] -ActType = Union[int, float, np.ndarray, dict] - - -class EpisodeRecordVideo(VecotarableWrapper): - def __init__( - self, - env: gym.Env, - video_path_prefix: str, - step_increment: int = 1, - video_step_interval: int = 1_000_000, - max_video_length: int = 3600, - ) -> None: - super().__init__(env) - self.video_path_prefix = video_path_prefix - self.step_increment = step_increment - self.video_step_interval = video_step_interval - self.max_video_length = max_video_length - self.total_steps = 0 - self.next_record_video_step = 0 - self.video_recorder = None - self.recorded_frames = 0 - - def step(self, action: ActType) -> Tuple[ObsType, float, bool, dict]: - obs, rew, done, info = self.env.step(action) - self.total_steps += self.step_increment - # Using first env to record episodes - if self.video_recorder: - self.video_recorder.capture_frame() - self.recorded_frames += 1 - if info.get("episode"): - episode_info = { - k: v.item() if hasattr(v, "item") else v - for k, v in info["episode"].items() - } - self.video_recorder.metadata["episode"] = episode_info - if self.recorded_frames > self.max_video_length: - self._close_video_recorder() - return obs, rew, done, info - - def reset(self, **kwargs) -> ObsType: - obs = self.env.reset(**kwargs) - if self.video_recorder: - self._close_video_recorder() - elif self.total_steps >= self.next_record_video_step: - self._start_video_recorder() - return obs - - def _start_video_recorder(self) -> None: - self._close_video_recorder() - - video_path = f"{self.video_path_prefix}-{self.next_record_video_step}" - self.video_recorder = VideoRecorder( - self.env, - base_path=video_path, - metadata={"step": self.total_steps}, - ) - - self.video_recorder.capture_frame() - self.recorded_frames = 1 - self.next_record_video_step += self.video_step_interval - - def _close_video_recorder(self) -> None: - if self.video_recorder: - self.video_recorder.close() - self.video_recorder = None - self.recorded_frames = 0 diff --git a/wrappers/episode_stats_writer.py b/wrappers/episode_stats_writer.py deleted file mode 100644 index 05bcaf8a697097c987d36e11035da65b37b93a40..0000000000000000000000000000000000000000 --- a/wrappers/episode_stats_writer.py +++ /dev/null @@ -1,66 +0,0 @@ -import numpy as np - -from collections import deque -from torch.utils.tensorboard.writer import SummaryWriter -from typing import Any, Dict, List - -from shared.stats import Episode, EpisodesStats -from wrappers.vectorable_wrapper import VecotarableWrapper, VecEnvStepReturn, VecEnvObs - - -class EpisodeStatsWriter(VecotarableWrapper): - def __init__( - self, - env, - tb_writer: SummaryWriter, - training: bool = True, - rolling_length=100, - ): - super().__init__(env) - self.training = training - self.tb_writer = tb_writer - self.rolling_length = rolling_length - self.episodes = deque(maxlen=rolling_length) - self.total_steps = 0 - self.episode_cnt = 0 - self.last_episode_cnt_print = 0 - - def step(self, actions: np.ndarray) -> VecEnvStepReturn: - obs, rews, dones, infos = self.env.step(actions) - self._record_stats(infos) - return obs, rews, dones, infos - - # Support for stable_baselines3.common.vec_env.VecEnvWrapper - def step_wait(self) -> VecEnvStepReturn: - obs, rews, dones, infos = self.env.step_wait() - self._record_stats(infos) - return obs, rews, dones, infos - - def _record_stats(self, infos: List[Dict[str, Any]]) -> None: - self.total_steps += getattr(self.env, "num_envs", 1) - step_episodes = [] - for info in infos: - ep_info = info.get("episode") - if ep_info: - episode = Episode(ep_info["r"], ep_info["l"]) - step_episodes.append(episode) - self.episodes.append(episode) - if step_episodes: - tag = "train" if self.training else "eval" - step_stats = EpisodesStats(step_episodes, simple=True) - step_stats.write_to_tensorboard(self.tb_writer, tag, self.total_steps) - rolling_stats = EpisodesStats(self.episodes) - rolling_stats.write_to_tensorboard( - self.tb_writer, f"{tag}_rolling", self.total_steps - ) - self.episode_cnt += len(step_episodes) - if self.episode_cnt >= self.last_episode_cnt_print + self.rolling_length: - print( - f"Episode: {self.episode_cnt} | " - f"Steps: {self.total_steps} | " - f"{rolling_stats}" - ) - self.last_episode_cnt_print += self.rolling_length - - def reset(self) -> VecEnvObs: - return self.env.reset() diff --git a/wrappers/initial_step_truncate_wrapper.py b/wrappers/initial_step_truncate_wrapper.py deleted file mode 100644 index ffb82afdeb7b2da98ee3386284016917b8be588b..0000000000000000000000000000000000000000 --- a/wrappers/initial_step_truncate_wrapper.py +++ /dev/null @@ -1,27 +0,0 @@ -import gym -import numpy as np - -from typing import Any, Dict, Tuple, Union - -from wrappers.vectorable_wrapper import VecotarableWrapper - -ObsType = Union[np.ndarray, dict] -ActType = Union[int, float, np.ndarray, dict] - - -class InitialStepTruncateWrapper(VecotarableWrapper): - def __init__(self, env: gym.Env, initial_steps_to_truncate: int) -> None: - super().__init__(env) - self.initial_steps_to_truncate = initial_steps_to_truncate - self.initialized = initial_steps_to_truncate == 0 - self.steps = 0 - - def step(self, action: ActType) -> Tuple[ObsType, float, bool, Dict[str, Any]]: - obs, rew, done, info = self.env.step(action) - if not self.initialized: - self.steps += 1 - if self.steps >= self.initial_steps_to_truncate: - print(f"Truncation at {self.steps} steps") - done = True - self.initialized = True - return obs, rew, done, info diff --git a/wrappers/is_vector_env.py b/wrappers/is_vector_env.py deleted file mode 100644 index 668890fee7b02686f270b5c27ee2100f4331b827..0000000000000000000000000000000000000000 --- a/wrappers/is_vector_env.py +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Any - -from wrappers.vectorable_wrapper import VecotarableWrapper - - -class IsVectorEnv(VecotarableWrapper): - """ - Override to set properties to match gym.vector.VectorEnv - """ - - def __init__(self, env: Any) -> None: - super().__init__(env) - self.is_vector_env = True diff --git a/wrappers/no_reward_timeout.py b/wrappers/no_reward_timeout.py deleted file mode 100644 index fbefe131a83a7b58dfa8fa404095aba2ec5513c1..0000000000000000000000000000000000000000 --- a/wrappers/no_reward_timeout.py +++ /dev/null @@ -1,65 +0,0 @@ -import gym -import numpy as np - -from typing import Optional, Tuple, Union - -from wrappers.vectorable_wrapper import VecotarableWrapper - -ObsType = Union[np.ndarray, dict] -ActType = Union[int, float, np.ndarray, dict] - - -class NoRewardTimeout(VecotarableWrapper): - def __init__( - self, env: gym.Env, n_timeout_steps: int, n_fire_steps: Optional[int] = None - ) -> None: - super().__init__(env) - self.n_timeout_steps = n_timeout_steps - self.n_fire_steps = n_fire_steps - - self.fire_act = None - if n_fire_steps is not None: - action_meanings = env.unwrapped.get_action_meanings() - assert "FIRE" in action_meanings - self.fire_act = action_meanings.index("FIRE") - - self.steps_since_reward = 0 - - self.episode_score = 0 - self.episode_step_idx = 0 - - def step(self, action: ActType) -> Tuple[ObsType, float, bool, dict]: - if self.steps_since_reward == self.n_fire_steps: - assert self.fire_act is not None - self.print_intervention("Force fire action") - action = self.fire_act - obs, rew, done, info = self.env.step(action) - - self.episode_score += rew - self.episode_step_idx += 1 - - if rew != 0 or done: - self.steps_since_reward = 0 - else: - self.steps_since_reward += 1 - if self.steps_since_reward >= self.n_timeout_steps: - self.print_intervention("Early terminate") - done = True - - return obs, rew, done, info - - def reset(self, **kwargs) -> ObsType: - self._reset_state() - return self.env.reset(**kwargs) - - def _reset_state(self) -> None: - self.steps_since_reward = 0 - self.episode_score = 0 - self.episode_step_idx = 0 - - def print_intervention(self, tag: str) -> None: - print( - f"{self.__class__.__name__}: {tag} | " - f"Score: {self.episode_score} | " - f"Length: {self.episode_step_idx}" - ) diff --git a/wrappers/noop_env_seed.py b/wrappers/noop_env_seed.py deleted file mode 100644 index 027b56d35be750d0d765e6af94ce4fd3ead0544f..0000000000000000000000000000000000000000 --- a/wrappers/noop_env_seed.py +++ /dev/null @@ -1,11 +0,0 @@ -from typing import List, Optional - -from wrappers.vectorable_wrapper import VecotarableWrapper - -class NoopEnvSeed(VecotarableWrapper): - """ - Wrapper to stop a seed call going to the underlying environment. - """ - - def seed(self, seed: Optional[int] = None) -> Optional[List[int]]: - return None diff --git a/wrappers/normalize.py b/wrappers/normalize.py deleted file mode 100644 index 550762b7ab729f41ae0cb8c84f949d3ddf4d56dd..0000000000000000000000000000000000000000 --- a/wrappers/normalize.py +++ /dev/null @@ -1,140 +0,0 @@ -import gym -import numpy as np - -from numpy.typing import NDArray -from typing import Tuple - -from wrappers.vectorable_wrapper import ( - VecotarableWrapper, - single_observation_space, -) - - -class RunningMeanStd: - def __init__(self, episilon: float = 1e-4, shape: Tuple[int, ...]=()) -> None: - self.mean = np.zeros(shape, np.float64) - self.var = np.ones(shape, np.float64) - self.count = episilon - - def update(self, x: NDArray) -> None: - batch_mean = np.mean(x, axis=0) - batch_var = np.var(x, axis=0) - batch_count = x.shape[0] - - delta = batch_mean - self.mean - total_count = self.count + batch_count - - self.mean += delta * batch_count / total_count - - m_a = self.var * self.count - m_b = batch_var * batch_count - M2 = m_a + m_b + np.square(delta) * self.count * batch_count / total_count - self.var = M2 / total_count - self.count = total_count - - -class NormalizeObservation(VecotarableWrapper): - def __init__( - self, - env: gym.Env, - training: bool = True, - epsilon: float = 1e-8, - clip: float = 10.0, - ) -> None: - super().__init__(env) - self.rms = RunningMeanStd(shape=single_observation_space(env).shape) - self.training = training - self.epsilon = epsilon - self.clip = clip - - def step(self, action): - obs, reward, done, info = self.env.step(action) - return self.normalize(obs), reward, done, info - - def reset(self, **kwargs): - obs = self.env.reset(**kwargs) - return self.normalize(obs) - - def normalize(self, obs: NDArray) -> NDArray: - obs_array = np.array([obs]) if not self.is_vector_env else obs - if self.training: - self.rms.update(obs_array) - normalized = np.clip( - (obs_array - self.rms.mean) / np.sqrt(self.rms.var + self.epsilon), - -self.clip, - self.clip, - ) - return normalized[0] if not self.is_vector_env else normalized - - def save(self, path: str) -> None: - np.savez_compressed( - path, - mean=self.rms.mean, - var=self.rms.var, - count=self.rms.count, - ) - - def load(self, path: str) -> None: - data = np.load(path) - self.rms.mean = data["mean"] - self.rms.var = data["var"] - self.rms.count = data["count"] - - -class NormalizeReward(VecotarableWrapper): - def __init__( - self, - env: gym.Env, - training: bool = True, - gamma: float = 0.99, - epsilon: float = 1e-8, - clip: float = 10.0, - ) -> None: - super().__init__(env) - self.rms = RunningMeanStd(shape=()) - self.training = training - self.gamma = gamma - self.epsilon = epsilon - self.clip = clip - - self.returns = np.zeros(self.num_envs) - - def step(self, action): - obs, reward, done, info = self.env.step(action) - - if not self.is_vector_env: - reward = np.array([reward]) - reward = self.normalize(reward) - if not self.is_vector_env: - reward = reward[0] - - dones = done if self.is_vector_env else np.array([done]) - self.returns[dones] = 0 - - return obs, reward, done, info - - def reset(self, **kwargs): - self.returns = np.zeros(self.num_envs) - return self.env.reset(**kwargs) - - def normalize(self, rewards): - if self.training: - self.returns = self.returns * self.gamma + rewards - self.rms.update(self.returns) - return np.clip( - rewards / np.sqrt(self.rms.var + self.epsilon), -self.clip, self.clip - ) - - def save(self, path: str) -> None: - np.savez_compressed( - path, - mean=self.rms.mean, - var=self.rms.var, - count=self.rms.count, - ) - - def load(self, path: str) -> None: - data = np.load(path) - self.rms.mean = data["mean"] - self.rms.var = data["var"] - self.rms.count = data["count"] diff --git a/wrappers/sync_vector_env_render_compat.py b/wrappers/sync_vector_env_render_compat.py deleted file mode 100644 index 01b7e5c9f621c0405772837a852c7a19072974dc..0000000000000000000000000000000000000000 --- a/wrappers/sync_vector_env_render_compat.py +++ /dev/null @@ -1,31 +0,0 @@ -import numpy as np - -from gym.vector.sync_vector_env import SyncVectorEnv -from stable_baselines3.common.vec_env.base_vec_env import tile_images -from typing import Optional - -from wrappers.vectorable_wrapper import ( - VecotarableWrapper, -) - - -class SyncVectorEnvRenderCompat(VecotarableWrapper): - def __init__(self, env) -> None: - super().__init__(env) - - def render(self, mode: str = "human") -> Optional[np.ndarray]: - base_env = self.env.unwrapped - if isinstance(base_env, SyncVectorEnv): - imgs = [env.render(mode="rgb_array") for env in base_env.envs] - bigimg = tile_images(imgs) - if mode == "human": - import cv2 - - cv2.imshow("vecenv", bigimg[:, :, ::-1]) - cv2.waitKey(1) - elif mode == "rgb_array": - return bigimg - else: - raise NotImplemented(f"Render mode {mode} is not supported") - else: - return self.env.render(mode=mode) diff --git a/wrappers/transpose_image_observation.py b/wrappers/transpose_image_observation.py deleted file mode 100644 index 7076c9146fa28cd266a2466b58ac6a6b6555d59b..0000000000000000000000000000000000000000 --- a/wrappers/transpose_image_observation.py +++ /dev/null @@ -1,34 +0,0 @@ -import gym -import numpy as np - -from gym import ObservationWrapper -from gym.spaces import Box - - -class TransposeImageObservation(ObservationWrapper): - def __init__(self, env: gym.Env) -> None: - super().__init__(env) - - assert isinstance(env.observation_space, Box) - - obs_space = env.observation_space - axes = tuple(i for i in range(len(obs_space.shape))) - self._transpose_axes = axes[:-3] + (axes[-1],) + axes[-3:-1] - - self.observation_space = Box( - low=np.transpose(obs_space.low, axes=self._transpose_axes), - high=np.transpose(obs_space.high, axes=self._transpose_axes), - shape=[obs_space.shape[idx] for idx in self._transpose_axes], - dtype=obs_space.dtype, - ) - - def observation(self, obs: np.ndarray) -> np.ndarray: - full_shape = obs.shape - obs_shape = self.observation_space.shape - addl_dims = len(full_shape) - len(obs_shape) - if addl_dims > 0: - transpose_axes = list(range(addl_dims)) - transpose_axes.extend(a + addl_dims for a in self._transpose_axes) - else: - transpose_axes = self._transpose_axes - return np.transpose(obs, axes=transpose_axes) diff --git a/wrappers/vec_episode_recorder.py b/wrappers/vec_episode_recorder.py deleted file mode 100644 index 929dd7285fd1427d14cc0d5f27803ce9ca868bb4..0000000000000000000000000000000000000000 --- a/wrappers/vec_episode_recorder.py +++ /dev/null @@ -1,55 +0,0 @@ -import numpy as np - -from gym.wrappers.monitoring.video_recorder import VideoRecorder - -from wrappers.vectorable_wrapper import ( - VecotarableWrapper, - VecEnvObs, - VecEnvStepReturn, -) - - -class VecEpisodeRecorder(VecotarableWrapper): - def __init__(self, env, base_path: str, max_video_length: int = 3600): - super().__init__(env) - self.base_path = base_path - self.max_video_length = max_video_length - self.video_recorder = None - self.recorded_frames = 0 - - def step(self, actions: np.ndarray) -> VecEnvStepReturn: - obs, rew, dones, infos = self.env.step(actions) - # Using first env to record episodes - if self.video_recorder: - self.video_recorder.capture_frame() - self.recorded_frames += 1 - if dones[0] and infos[0].get("episode"): - episode_info = { - k: v.item() if hasattr(v, "item") else v - for k, v in infos[0]["episode"].items() - } - self.video_recorder.metadata["episode"] = episode_info - if dones[0] or self.recorded_frames > self.max_video_length: - self._close_video_recorder() - return obs, rew, dones, infos - - def reset(self) -> VecEnvObs: - obs = self.env.reset() - self._start_video_recorder() - return obs - - def _start_video_recorder(self) -> None: - self._close_video_recorder() - - self.video_recorder = VideoRecorder( - self.env, - base_path=self.base_path, - ) - - self.video_recorder.capture_frame() - self.recorded_frames = 1 - - def _close_video_recorder(self) -> None: - if self.video_recorder: - self.video_recorder.close() - self.video_recorder = None diff --git a/wrappers/vectorable_wrapper.py b/wrappers/vectorable_wrapper.py deleted file mode 100644 index 03df8d1400ab84242353f5dc1288a4394158b941..0000000000000000000000000000000000000000 --- a/wrappers/vectorable_wrapper.py +++ /dev/null @@ -1,46 +0,0 @@ -import numpy as np -from gym import Env, Space, Wrapper - -from stable_baselines3.common.vec_env import VecEnv as SB3VecEnv -from typing import Dict, List, Optional, Type, TypeVar, Tuple, Union - -VecEnvObs = Union[np.ndarray, Dict[str, np.ndarray], Tuple[np.ndarray, ...]] -VecEnvStepReturn = Tuple[VecEnvObs, np.ndarray, np.ndarray, List[Dict]] - - -class VecotarableWrapper(Wrapper): - def __init__(self, env: Env) -> None: - super().__init__(env) - self.num_envs = getattr(env, "num_envs", 1) - self.is_vector_env = getattr(env, "is_vector_env", False) - self.single_observation_space = single_observation_space(env) - self.single_action_space = single_action_space(env) - - def step(self, action) -> VecEnvStepReturn: - return self.env.step(action) - - def reset(self) -> VecEnvObs: - return self.env.reset() - - -VecEnv = Union[VecotarableWrapper, SB3VecEnv] - - -def single_observation_space(env: Union[VecEnv, Env]) -> Space: - return getattr(env, "single_observation_space", env.observation_space) - - -def single_action_space(env: Union[VecEnv, Env]) -> Space: - return getattr(env, "single_action_space", env.action_space) - - -W = TypeVar("W", bound=Wrapper) - - -def find_wrapper(env: VecEnv, wrapper_class: Type[W]) -> Optional[W]: - current = env - while current and current != current.unwrapped: - if isinstance(current, wrapper_class): - return current - current = getattr(current, "env") - return None diff --git a/wrappers/video_compat_wrapper.py b/wrappers/video_compat_wrapper.py deleted file mode 100644 index d2e91c7beeee8f5e04bf1c125214aee1e495dcb5..0000000000000000000000000000000000000000 --- a/wrappers/video_compat_wrapper.py +++ /dev/null @@ -1,15 +0,0 @@ -import gym -import numpy as np - -from wrappers.vectorable_wrapper import VecotarableWrapper - - -class VideoCompatWrapper(VecotarableWrapper): - def __init__(self, env: gym.Env) -> None: - super().__init__(env) - - def render(self, mode="human", **kwargs): - r = super().render(mode=mode, **kwargs) - if mode == "rgb_array" and isinstance(r, np.ndarray) and r.dtype != np.uint8: - r = r.astype(np.uint8) - return r