From 2e9306680fb85866433fa7fb3b0bf7055c7b8c0c Mon Sep 17 00:00:00 2001 From: Julius Date: Wed, 7 Oct 2020 17:24:30 -0400 Subject: [PATCH 01/48] allow default environments --- envs/__init__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/envs/__init__.py b/envs/__init__.py index ec2a070..70580b3 100644 --- a/envs/__init__.py +++ b/envs/__init__.py @@ -1,7 +1,8 @@ import copy import os -import minerl +from minerl.herobraine.env_spec import MISSIONS_DIR +from minerl.herobraine.envs import ENVS from ray.tune.registry import register_env from envs.env import LazyMineRLEnv, MineRLRandomDebugEnv @@ -13,12 +14,12 @@ def register(): Must be called to register the MineRL environments for RLlib """ - for env_spec in minerl.herobraine.envs.obfuscated_envs: + for env_spec in ENVS: env_kwargs = copy.deepcopy(dict( observation_space=env_spec.observation_space, action_space=env_spec.action_space, docstr=env_spec.get_docstring(), - xml=os.path.join(minerl.herobraine.env_spec.MISSIONS_DIR, env_spec.xml), + xml=os.path.join(MISSIONS_DIR, env_spec.xml), env_spec=env_spec, )) From 39a4106c3015773fdc7ce58c6b54c3e04050fe05 Mon Sep 17 00:00:00 2001 From: Julius Date: Tue, 20 Jul 2021 21:36:23 -0400 Subject: [PATCH 02/48] update input api and use minerl-wrappers package --- envs/__init__.py | 32 ++---------- envs/env.py | 37 +++++++++---- envs/input.py | 132 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 164 insertions(+), 37 deletions(-) create mode 100644 envs/input.py diff --git a/envs/__init__.py b/envs/__init__.py index 70580b3..31a65a4 100644 --- a/envs/__init__.py +++ b/envs/__init__.py @@ -1,34 +1,10 @@ -import copy -import os - -from minerl.herobraine.env_spec import MISSIONS_DIR -from minerl.herobraine.envs import ENVS -from ray.tune.registry import register_env - -from envs.env import LazyMineRLEnv, MineRLRandomDebugEnv -from envs.wrappers import wrap +from envs.env import register_minerl_envs +from envs.input import register_minerl_input def register(): """ Must be called to register the MineRL environments for RLlib """ - - for env_spec in ENVS: - env_kwargs = copy.deepcopy(dict( - observation_space=env_spec.observation_space, - action_space=env_spec.action_space, - docstr=env_spec.get_docstring(), - xml=os.path.join(MISSIONS_DIR, env_spec.xml), - env_spec=env_spec, - )) - - def env_creator(env_config): - return wrap(LazyMineRLEnv(**env_kwargs), **env_config) - - register_env(env_spec.name, env_creator) - - def env_creator(env_config): - return wrap(MineRLRandomDebugEnv(), **env_config) - - register_env('MineRLRandomDebug-v0', env_creator) + register_minerl_envs() + register_minerl_input() diff --git a/envs/env.py b/envs/env.py index a66127c..9c3289a 100644 --- a/envs/env.py +++ b/envs/env.py @@ -1,23 +1,27 @@ import filelock import gym import gym.wrappers -import minerl +from minerl.herobraine.env_spec import EnvSpec +from minerl.herobraine.envs import BASIC_ENV_SPECS, COMPETITION_ENV_SPECS, BASALT_COMPETITION_ENV_SPECS +from minerl.herobraine.envs import MINERL_OBTAIN_DIAMOND_OBF_V0 as DEBUG_ENV_SPEC +from minerl_wrappers import wrap +from ray.tune.registry import register_env class LazyMineRLEnv(gym.Env): - def __init__(self, *args, **kwargs): - self._args = args + def __init__(self, env_spec, **kwargs): self._kwargs = kwargs + self.env_spec: EnvSpec = env_spec self._env = None - self.observation_space = kwargs.get('observation_space') - self.action_space = kwargs.get('action_space') - self.env_spec = kwargs.get('env_spec') super().__init__() + def init_env(self): + with filelock.FileLock('minerl_env.lock'): + self._env = self.env_spec.make(**self._kwargs) + def reset(self, **kwargs): if self._env is None: - with filelock.FileLock('minerl_env.lock'): - self._env = minerl.env.MineRLEnv(*self._args, **self._kwargs) + self.init_env() return self._env.reset() def step(self, action): @@ -29,6 +33,8 @@ def render(self, mode='human'): def __getattr__(self, name): if name.startswith('_'): raise AttributeError("attempted to get missing private attribute '{}'".format(name)) + if self._env is None: + self.init_env() return getattr(self._env, name) @@ -42,7 +48,7 @@ def __init__(self): self.action_space = gym.spaces.Dict(dict(vector=action_space)) self.done = False self.t = 0 - self.env_spec = minerl.herobraine.envs.MINERL_OBTAIN_DIAMOND_OBF_V0 + self.env_spec = DEBUG_ENV_SPEC def _obs(self): return self.observation_space.sample() @@ -65,3 +71,16 @@ def reset(self): def render(self, mode='human'): pass + + +def register_minerl_envs(): + for env_spec in (BASIC_ENV_SPECS + COMPETITION_ENV_SPECS + BASALT_COMPETITION_ENV_SPECS): + def env_creator(env_config): + return wrap(LazyMineRLEnv(env_spec), **env_config) + + register_env(env_spec.name, env_creator) + + def env_creator(env_config): + return wrap(MineRLRandomDebugEnv(), **env_config) + + register_env('MineRLRandomDebug-v0', env_creator) diff --git a/envs/input.py b/envs/input.py new file mode 100644 index 0000000..74bce95 --- /dev/null +++ b/envs/input.py @@ -0,0 +1,132 @@ +import os + +import gym +import numpy as np +from ray.rllib.models.preprocessors import get_preprocessor + +from ray.rllib.offline import IOContext +from ray.rllib.offline.input_reader import InputReader +from ray.rllib.policy.sample_batch import SampleBatch +from ray.rllib.utils.typing import SampleBatchType +from ray.tune.registry import register_input + +from envs.data import MinerRLDataEnv, wrap_env + + +class MineRLInputReader(InputReader): + def __init__(self, ioctx: IOContext = None): + super().__init__() + print('Input reader initialization success!') + import minerl + input_config = ioctx.input_config + env_name = ioctx.config.get('env') + env_config = ioctx.config.get('env_config', {}) + self.data = minerl.data.make(env_name, + data_dir=os.getenv('MINERL_DATA_ROOT', input_config.get('data_dir', 'data')), + num_workers=input_config.get('num_workers', 4), + worker_batch_size=input_config.get('worker_batch_size', 32), + minimum_size_to_dequeue=input_config.get('minimum_size_to_dequeue', 32), + force_download=input_config.get('force_download', False)) + batch_size = input_config.get('batch_size', 1) + seq_len = input_config.get('seq_len', 32) + num_epochs = input_config.get('num_epochs', -1) + preload_buffer_size = input_config.get('preload_buffer_size', 2) + seed = input_config.get('seed', None) + include_metadata = input_config.get('include_metadata', False) + self.generator = self.data.batch_iter(batch_size, seq_len, num_epochs=num_epochs, + preload_buffer_size=preload_buffer_size, seed=seed, + include_metadata=include_metadata) + env = MinerRLDataEnv(self.data) + env = wrap_env(env, env_config) + print(env.observation_space) + self.prep = get_preprocessor(env.observation_space)(env.observation_space) + + env_ptr = env + self.obs_fns = [] + self.action_fns = [] + self.reverse_action_fns = [] + self.reward_fns = [] + while hasattr(env_ptr, 'env'): + if isinstance(env_ptr, gym.ObservationWrapper): + self.obs_fns.append(env_ptr.observation) + if isinstance(env_ptr, gym.ActionWrapper): + self.action_fns.append(env_ptr.action) + self.reverse_action_fns.append(env_ptr.reverse_action) + if isinstance(env_ptr, gym.RewardWrapper): + self.reward_fns.append(env_ptr.reward) + env_ptr = env_ptr.env + + def process_obs(self, obs): + for i in range(len(self.obs_fns) - 1, -1, -1): + f = self.obs_fns[i] + obs = f(obs) + return self.prep.transform(obs) + + def process_action(self, action): + for i in range(len(self.action_fns) - 1, -1, -1): + f = self.action_fns[i] + action = f(action) + return action + + def process_reverse_action(self, action): + for i in range(len(self.reverse_action_fns)): + f = self.reverse_action_fns[i] + action = f(action) + return action + + def process_reward(self, reward): + for i in range(len(self.reward_fns) - 1, -1, -1): + f = self.reward_fns[i] + reward = f(reward) + return reward + + def next(self) -> SampleBatchType: + obs, action, reward, next_obs, done = self.process_batch(next(self.generator)) + d = { + SampleBatch.OBS: obs, + SampleBatch.ACTIONS: action, + SampleBatch.NEXT_OBS: next_obs, + SampleBatch.REWARDS: reward, + SampleBatch.DONES: done + } + # recursive_print(d) + return SampleBatch(d) + + def process_batch(self, batch): + obs, action, reward, next_obs, done = batch + batch_n, batch_t = obs['vector'].shape[0], obs['vector'].shape[1] + action = [[self.process_reverse_action({'vector': action['vector'][i][t]}) for i in range(batch_n)] for t in + range(batch_t)] + reward = [[self.process_reward(reward[i][t]) for i in range(batch_n)] for t in range(batch_t)] + obs = [[self.process_obs({'pov': obs['pov'][i][t], 'vector': obs['vector'][i][t]}) for i in range(batch_n)] for + t in range(batch_t)] + next_obs = [[self.process_obs({'pov': next_obs['pov'][i][t], 'vector': next_obs['vector'][i][t]}) for i in + range(batch_n)] for t in range(batch_t)] + # print(len(obs), len(obs[0]), obs[0][0].shape) + return np.array(obs).squeeze(1), np.array(action).squeeze(1), np.array(reward).squeeze(1), np.array( + next_obs).squeeze(1), np.transpose(done).squeeze(1) + + +def minerl_input_creator(ioctx: IOContext = None): + return MineRLInputReader(ioctx=ioctx) + + +def recursive_print(d): + if isinstance(d, dict): + print('{') + for k, v in d.items(): + print(f'key={k}') + recursive_print(v) + print('}') + elif isinstance(d, list) or isinstance(d, tuple): + print('[') + for v in d: + recursive_print(v) + print(']') + elif isinstance(d, np.ndarray): + print(d.shape) + else: + print(d) + +def register_minerl_input(): + register_input('minerl', minerl_input_creator) \ No newline at end of file From 147c10f1d7df180e0f874fda0e38482f5568a75b Mon Sep 17 00:00:00 2001 From: Julius Date: Tue, 20 Jul 2021 21:39:41 -0400 Subject: [PATCH 03/48] black format --- envs/data.py | 58 ++++++++++++++++++-------- envs/env.py | 39 ++++++++++++------ envs/input.py | 110 +++++++++++++++++++++++++++++++++----------------- 3 files changed, 143 insertions(+), 64 deletions(-) diff --git a/envs/data.py b/envs/data.py index 81ccfaf..597d162 100644 --- a/envs/data.py +++ b/envs/data.py @@ -28,25 +28,27 @@ def __init__(self, data_pipeline: minerl.data.DataPipeline): def step(self, action): prev_obs, action, reward, obs, done = self.trajectory[self.step_index] info = { - 'prev_obs': prev_obs, - 'action': action, + "prev_obs": prev_obs, + "action": action, } self.step_index += 1 if self.step_index >= len(self.trajectory): if not done: - print('Encountered end of trajectory when done returned False!') + print("Encountered end of trajectory when done returned False!") done = True return obs, reward, done, info def reset(self): - self.trajectory = list(self.data_pipeline.load_data(self.trajectory_names[self.index])) + self.trajectory = list( + self.data_pipeline.load_data(self.trajectory_names[self.index]) + ) self.index += 1 self.index %= len(self.trajectory_names) self.step_index = 0 obs, _, _, _, _ = self.trajectory[self.step_index] return obs - def render(self, mode='human'): + def render(self, mode="human"): pass @@ -54,7 +56,15 @@ def wrap_env(env: MinerRLDataEnv, env_config): return wrap(env, **env_config) -def write_jsons(environment, data_dir, env_config, save_path, overwrite=False, fail_safe=True, **kwargs): +def write_jsons( + environment, + data_dir, + env_config, + save_path, + overwrite=False, + fail_safe=True, + **kwargs, +): data_pipeline = minerl.data.make(environment, data_dir, **kwargs) env = MinerRLDataEnv(data_pipeline) env = wrap_env(env, env_config) @@ -64,15 +74,17 @@ def write_jsons(environment, data_dir, env_config, save_path, overwrite=False, f if len(os.listdir(save_path)) != 0: abs_save_path = os.path.abspath(save_path) if overwrite: - print(f'Overwriting! {abs_save_path}') + print(f"Overwriting! {abs_save_path}") shutil.rmtree(abs_save_path) else: if fail_safe: - print(f'Json data already exists at {abs_save_path}') + print(f"Json data already exists at {abs_save_path}") return else: - raise ValueError(f'Directory {abs_save_path} not empty!' - f'Cannot overwrite existing data automatically, please delete old data if unused.') + raise ValueError( + f"Directory {abs_save_path} not empty!" + f"Cannot overwrite existing data automatically, please delete old data if unused." + ) batch_builder = SampleBatchBuilder() writer = JsonWriter(save_path) @@ -89,7 +101,7 @@ def write_jsons(environment, data_dir, env_config, save_path, overwrite=False, f continue while not done: new_obs, reward, done, info = env.step(env.action_space.sample()) - action = info['action'] + action = info["action"] action = env.reverse_action(action) if prev_action is None: prev_action = np.zeros_like(action) @@ -105,7 +117,7 @@ def write_jsons(environment, data_dir, env_config, save_path, overwrite=False, f prev_actions=prev_action, prev_rewards=prev_reward, dones=done, - infos={'trajectory_name': trajectory_name}, + infos={"trajectory_name": trajectory_name}, new_obs=prep.transform(new_obs), ) obs = new_obs @@ -116,12 +128,26 @@ def write_jsons(environment, data_dir, env_config, save_path, overwrite=False, f class MineRLReader(InputReader): - def __init__(self, env_config, environment, data_dir, num_workers, worker_batch_size=4, minimum_size_to_dequeue=32): + def __init__( + self, + env_config, + environment, + data_dir, + num_workers, + worker_batch_size=4, + minimum_size_to_dequeue=32, + ): super().__init__() - self.data_pipeline = minerl.data.make(environment, data_dir, num_workers, worker_batch_size, - minimum_size_to_dequeue, force_download=False) + self.data_pipeline = minerl.data.make( + environment, + data_dir, + num_workers, + worker_batch_size, + minimum_size_to_dequeue, + force_download=False, + ) self.env_config = env_config - self.env_config.update({'data_dir': data_dir}) + self.env_config.update({"data_dir": data_dir}) def get_env(self, env): return wrap(env, **self.env_config) diff --git a/envs/env.py b/envs/env.py index 9c3289a..5233a68 100644 --- a/envs/env.py +++ b/envs/env.py @@ -2,7 +2,11 @@ import gym import gym.wrappers from minerl.herobraine.env_spec import EnvSpec -from minerl.herobraine.envs import BASIC_ENV_SPECS, COMPETITION_ENV_SPECS, BASALT_COMPETITION_ENV_SPECS +from minerl.herobraine.envs import ( + BASIC_ENV_SPECS, + COMPETITION_ENV_SPECS, + BASALT_COMPETITION_ENV_SPECS, +) from minerl.herobraine.envs import MINERL_OBTAIN_DIAMOND_OBF_V0 as DEBUG_ENV_SPEC from minerl_wrappers import wrap from ray.tune.registry import register_env @@ -16,7 +20,7 @@ def __init__(self, env_spec, **kwargs): super().__init__() def init_env(self): - with filelock.FileLock('minerl_env.lock'): + with filelock.FileLock("minerl_env.lock"): self._env = self.env_spec.make(**self._kwargs) def reset(self, **kwargs): @@ -27,12 +31,14 @@ def reset(self, **kwargs): def step(self, action): return self._env.step(action) - def render(self, mode='human'): + def render(self, mode="human"): return self._env.render(mode) def __getattr__(self, name): - if name.startswith('_'): - raise AttributeError("attempted to get missing private attribute '{}'".format(name)) + if name.startswith("_"): + raise AttributeError( + "attempted to get missing private attribute '{}'".format(name) + ) if self._env is None: self.init_env() return getattr(self._env, name) @@ -42,9 +48,15 @@ class MineRLRandomDebugEnv(gym.Env): def __init__(self): super(MineRLRandomDebugEnv, self).__init__() pov_space = gym.spaces.Box(low=0, high=255, shape=(64, 64, 3)) - vector_space = gym.spaces.Box(low=-1.2000000476837158, high=1.2000000476837158, shape=(64,)) - self.observation_space = gym.spaces.Dict(dict(pov=pov_space, vector=vector_space)) - action_space = gym.spaces.Box(low=-1.0499999523162842, high=1.0499999523162842, shape=(64,)) + vector_space = gym.spaces.Box( + low=-1.2000000476837158, high=1.2000000476837158, shape=(64,) + ) + self.observation_space = gym.spaces.Dict( + dict(pov=pov_space, vector=vector_space) + ) + action_space = gym.spaces.Box( + low=-1.0499999523162842, high=1.0499999523162842, shape=(64,) + ) self.action_space = gym.spaces.Dict(dict(vector=action_space)) self.done = False self.t = 0 @@ -55,7 +67,7 @@ def _obs(self): def step(self, action): obs = self._obs() - reward = 0. + reward = 0.0 if self.t < 100: self.done = False else: @@ -69,12 +81,15 @@ def reset(self): self.t = 0 return self._obs() - def render(self, mode='human'): + def render(self, mode="human"): pass def register_minerl_envs(): - for env_spec in (BASIC_ENV_SPECS + COMPETITION_ENV_SPECS + BASALT_COMPETITION_ENV_SPECS): + for env_spec in ( + BASIC_ENV_SPECS + COMPETITION_ENV_SPECS + BASALT_COMPETITION_ENV_SPECS + ): + def env_creator(env_config): return wrap(LazyMineRLEnv(env_spec), **env_config) @@ -83,4 +98,4 @@ def env_creator(env_config): def env_creator(env_config): return wrap(MineRLRandomDebugEnv(), **env_config) - register_env('MineRLRandomDebug-v0', env_creator) + register_env("MineRLRandomDebug-v0", env_creator) diff --git a/envs/input.py b/envs/input.py index 74bce95..dbdc620 100644 --- a/envs/input.py +++ b/envs/input.py @@ -16,26 +16,36 @@ class MineRLInputReader(InputReader): def __init__(self, ioctx: IOContext = None): super().__init__() - print('Input reader initialization success!') + print("Input reader initialization success!") import minerl + input_config = ioctx.input_config - env_name = ioctx.config.get('env') - env_config = ioctx.config.get('env_config', {}) - self.data = minerl.data.make(env_name, - data_dir=os.getenv('MINERL_DATA_ROOT', input_config.get('data_dir', 'data')), - num_workers=input_config.get('num_workers', 4), - worker_batch_size=input_config.get('worker_batch_size', 32), - minimum_size_to_dequeue=input_config.get('minimum_size_to_dequeue', 32), - force_download=input_config.get('force_download', False)) - batch_size = input_config.get('batch_size', 1) - seq_len = input_config.get('seq_len', 32) - num_epochs = input_config.get('num_epochs', -1) - preload_buffer_size = input_config.get('preload_buffer_size', 2) - seed = input_config.get('seed', None) - include_metadata = input_config.get('include_metadata', False) - self.generator = self.data.batch_iter(batch_size, seq_len, num_epochs=num_epochs, - preload_buffer_size=preload_buffer_size, seed=seed, - include_metadata=include_metadata) + env_name = ioctx.config.get("env") + env_config = ioctx.config.get("env_config", {}) + self.data = minerl.data.make( + env_name, + data_dir=os.getenv( + "MINERL_DATA_ROOT", input_config.get("data_dir", "data") + ), + num_workers=input_config.get("num_workers", 4), + worker_batch_size=input_config.get("worker_batch_size", 32), + minimum_size_to_dequeue=input_config.get("minimum_size_to_dequeue", 32), + force_download=input_config.get("force_download", False), + ) + batch_size = input_config.get("batch_size", 1) + seq_len = input_config.get("seq_len", 32) + num_epochs = input_config.get("num_epochs", -1) + preload_buffer_size = input_config.get("preload_buffer_size", 2) + seed = input_config.get("seed", None) + include_metadata = input_config.get("include_metadata", False) + self.generator = self.data.batch_iter( + batch_size, + seq_len, + num_epochs=num_epochs, + preload_buffer_size=preload_buffer_size, + seed=seed, + include_metadata=include_metadata, + ) env = MinerRLDataEnv(self.data) env = wrap_env(env, env_config) print(env.observation_space) @@ -46,7 +56,7 @@ def __init__(self, ioctx: IOContext = None): self.action_fns = [] self.reverse_action_fns = [] self.reward_fns = [] - while hasattr(env_ptr, 'env'): + while hasattr(env_ptr, "env"): if isinstance(env_ptr, gym.ObservationWrapper): self.obs_fns.append(env_ptr.observation) if isinstance(env_ptr, gym.ActionWrapper): @@ -87,24 +97,51 @@ def next(self) -> SampleBatchType: SampleBatch.ACTIONS: action, SampleBatch.NEXT_OBS: next_obs, SampleBatch.REWARDS: reward, - SampleBatch.DONES: done + SampleBatch.DONES: done, } # recursive_print(d) return SampleBatch(d) def process_batch(self, batch): obs, action, reward, next_obs, done = batch - batch_n, batch_t = obs['vector'].shape[0], obs['vector'].shape[1] - action = [[self.process_reverse_action({'vector': action['vector'][i][t]}) for i in range(batch_n)] for t in - range(batch_t)] - reward = [[self.process_reward(reward[i][t]) for i in range(batch_n)] for t in range(batch_t)] - obs = [[self.process_obs({'pov': obs['pov'][i][t], 'vector': obs['vector'][i][t]}) for i in range(batch_n)] for - t in range(batch_t)] - next_obs = [[self.process_obs({'pov': next_obs['pov'][i][t], 'vector': next_obs['vector'][i][t]}) for i in - range(batch_n)] for t in range(batch_t)] + batch_n, batch_t = obs["vector"].shape[0], obs["vector"].shape[1] + action = [ + [ + self.process_reverse_action({"vector": action["vector"][i][t]}) + for i in range(batch_n) + ] + for t in range(batch_t) + ] + reward = [ + [self.process_reward(reward[i][t]) for i in range(batch_n)] + for t in range(batch_t) + ] + obs = [ + [ + self.process_obs( + {"pov": obs["pov"][i][t], "vector": obs["vector"][i][t]} + ) + for i in range(batch_n) + ] + for t in range(batch_t) + ] + next_obs = [ + [ + self.process_obs( + {"pov": next_obs["pov"][i][t], "vector": next_obs["vector"][i][t]} + ) + for i in range(batch_n) + ] + for t in range(batch_t) + ] # print(len(obs), len(obs[0]), obs[0][0].shape) - return np.array(obs).squeeze(1), np.array(action).squeeze(1), np.array(reward).squeeze(1), np.array( - next_obs).squeeze(1), np.transpose(done).squeeze(1) + return ( + np.array(obs).squeeze(1), + np.array(action).squeeze(1), + np.array(reward).squeeze(1), + np.array(next_obs).squeeze(1), + np.transpose(done).squeeze(1), + ) def minerl_input_creator(ioctx: IOContext = None): @@ -113,20 +150,21 @@ def minerl_input_creator(ioctx: IOContext = None): def recursive_print(d): if isinstance(d, dict): - print('{') + print("{") for k, v in d.items(): - print(f'key={k}') + print(f"key={k}") recursive_print(v) - print('}') + print("}") elif isinstance(d, list) or isinstance(d, tuple): - print('[') + print("[") for v in d: recursive_print(v) - print(']') + print("]") elif isinstance(d, np.ndarray): print(d.shape) else: print(d) + def register_minerl_input(): - register_input('minerl', minerl_input_creator) \ No newline at end of file + register_input("minerl", minerl_input_creator) From 1ddf869c70c41b84158ddae1f6b90033f61f59fa Mon Sep 17 00:00:00 2001 From: Julius Date: Tue, 20 Jul 2021 21:44:14 -0400 Subject: [PATCH 04/48] update url --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f08e8bd..3e09c18 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Here we benchmark various reinforcement learning algorithms available in [RLlib](https://docs.ray.io/en/releases-0.8.6/rllib.html) on the [MineRL](https://minerl.io/docs/) environment. -[RLlib](https://docs.ray.io/en/releases-0.8.6/rllib.html) is an open-source library for reinforcement learning that offers both high scalability and a unified API for a variety of applications. +[RLlib](https://docs.ray.io/en/master/rllib.html) is an open-source library for reinforcement learning that offers both high scalability and a unified API for a variety of applications. RLlib natively supports TensorFlow, TensorFlow Eager, and PyTorch, but most of its internals are framework agnostic. ## Installation From af271031c68b7450b8b21be5b665a21ed477c4c2 Mon Sep 17 00:00:00 2001 From: Julius Date: Tue, 20 Jul 2021 21:46:17 -0400 Subject: [PATCH 05/48] remove old data pipeline --- rllib_train.py | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/rllib_train.py b/rllib_train.py index f43b858..ddf5b5a 100644 --- a/rllib_train.py +++ b/rllib_train.py @@ -3,9 +3,7 @@ See help with: $ python rllib_train.py --help """ -import subprocess -import yaml from ray.rllib.train import create_parser, run import envs @@ -15,39 +13,9 @@ models.register() -def generate_kmeans(env): - command = f'python generate_kmeans.py --env {env}' - print('running:', command) - subprocess.run(command.split()) - - -def convert_data(args): - command = f'python convert_data.py -f {args.config_file}' - print('running:', command) - subprocess.run(command.split()) - - -def check_data(args): - if args.config_file is not None: - config = yaml.safe_load(open(args.config_file)) - settings = list(config.values())[0] - if 'env' in settings: - env = settings['env'] - if 'config' in settings: - if 'env' in settings['config']: - env = settings['config']['env'] - if 'env_config' in settings['config']: - env_config = settings['config']['env_config'] - if env_config.get('discrete', False): - generate_kmeans(env) - if 'input' in settings['config']: - convert_data(args) - - def main(): parser = create_parser() args = parser.parse_args() - check_data(args) run(args, parser) From b47d314c3ebf5f6f5dc2f0f0322428d1b6c1b891 Mon Sep 17 00:00:00 2001 From: Julius Date: Tue, 20 Jul 2021 21:50:16 -0400 Subject: [PATCH 06/48] refactor into minerl_rllib package --- {models/tf => minerl_rllib}/__init__.py | 0 .../convert_data.py | 2 +- {envs => minerl_rllib/envs}/__init__.py | 4 +- {envs => minerl_rllib/envs}/data.py | 2 +- {envs => minerl_rllib/envs}/env.py | 0 {envs => minerl_rllib/envs}/input.py | 2 +- .../envs}/wrappers/__init__.py | 18 ++--- .../envs}/wrappers/action_repeat_wrapper.py | 0 .../envs}/wrappers/action_wrapper.py | 0 .../envs}/wrappers/deterministic_wrapper.py | 0 .../envs}/wrappers/discrete_action_wrapper.py | 0 .../envs}/wrappers/gray_scale_wrapper.py | 0 .../envs}/wrappers/normalize.py | 0 .../wrappers/observation_stack_wrapper.py | 0 .../envs}/wrappers/observation_wrapper.py | 0 .../envs}/wrappers/reward_penalty_wrapper.py | 0 .../envs}/wrappers/time_limit_wrapper.py | 0 .../generate_kmeans.py | 0 {models => minerl_rllib/models}/__init__.py | 5 +- minerl_rllib/models/tf/__init__.py | 0 minerl_rllib/models/torch/__init__.py | 1 + .../models}/torch/action.py | 0 .../models}/torch/baseline.py | 76 ++++++++++++++----- minerl_rllib/models/torch/cql.py | 10 +++ {models => minerl_rllib/models}/torch/pov.py | 0 .../models}/torch/reward.py | 0 {models => minerl_rllib/models}/torch/rnn.py | 0 .../models}/torch/vector.py | 0 rllib_train.py => minerl_rllib/rllib_train.py | 3 +- models/torch/__init__.py | 6 -- rllib_test.py | 38 ---------- tests/discrete.py | 2 +- train.py | 2 +- 33 files changed, 88 insertions(+), 83 deletions(-) rename {models/tf => minerl_rllib}/__init__.py (100%) rename convert_data.py => minerl_rllib/convert_data.py (98%) rename {envs => minerl_rllib/envs}/__init__.py (57%) rename {envs => minerl_rllib/envs}/data.py (99%) rename {envs => minerl_rllib/envs}/env.py (100%) rename {envs => minerl_rllib/envs}/input.py (98%) rename {envs => minerl_rllib/envs}/wrappers/__init__.py (64%) rename {envs => minerl_rllib/envs}/wrappers/action_repeat_wrapper.py (100%) rename {envs => minerl_rllib/envs}/wrappers/action_wrapper.py (100%) rename {envs => minerl_rllib/envs}/wrappers/deterministic_wrapper.py (100%) rename {envs => minerl_rllib/envs}/wrappers/discrete_action_wrapper.py (100%) rename {envs => minerl_rllib/envs}/wrappers/gray_scale_wrapper.py (100%) rename {envs => minerl_rllib/envs}/wrappers/normalize.py (100%) rename {envs => minerl_rllib/envs}/wrappers/observation_stack_wrapper.py (100%) rename {envs => minerl_rllib/envs}/wrappers/observation_wrapper.py (100%) rename {envs => minerl_rllib/envs}/wrappers/reward_penalty_wrapper.py (100%) rename {envs => minerl_rllib/envs}/wrappers/time_limit_wrapper.py (100%) rename generate_kmeans.py => minerl_rllib/generate_kmeans.py (100%) rename {models => minerl_rllib/models}/__init__.py (57%) create mode 100644 minerl_rllib/models/tf/__init__.py create mode 100644 minerl_rllib/models/torch/__init__.py rename {models => minerl_rllib/models}/torch/action.py (100%) rename {models => minerl_rllib/models}/torch/baseline.py (73%) create mode 100644 minerl_rllib/models/torch/cql.py rename {models => minerl_rllib/models}/torch/pov.py (100%) rename {models => minerl_rllib/models}/torch/reward.py (100%) rename {models => minerl_rllib/models}/torch/rnn.py (100%) rename {models => minerl_rllib/models}/torch/vector.py (100%) rename rllib_train.py => minerl_rllib/rllib_train.py (89%) delete mode 100644 models/torch/__init__.py delete mode 100644 rllib_test.py diff --git a/models/tf/__init__.py b/minerl_rllib/__init__.py similarity index 100% rename from models/tf/__init__.py rename to minerl_rllib/__init__.py diff --git a/convert_data.py b/minerl_rllib/convert_data.py similarity index 98% rename from convert_data.py rename to minerl_rllib/convert_data.py index 736dca4..d189e13 100644 --- a/convert_data.py +++ b/minerl_rllib/convert_data.py @@ -6,7 +6,7 @@ from minerl.herobraine.envs import obfuscated_envs from ray.tune.utils import merge_dicts -from envs.data import write_jsons +from minerl_rllib.envs.data import write_jsons parser = argparse.ArgumentParser() parser.add_argument('--data-dir', type=str, default=os.getenv('MINERL_DATA_ROOT', 'data'), diff --git a/envs/__init__.py b/minerl_rllib/envs/__init__.py similarity index 57% rename from envs/__init__.py rename to minerl_rllib/envs/__init__.py index 31a65a4..afc6cdd 100644 --- a/envs/__init__.py +++ b/minerl_rllib/envs/__init__.py @@ -1,5 +1,5 @@ -from envs.env import register_minerl_envs -from envs.input import register_minerl_input +from minerl_rllib.envs.env import register_minerl_envs +from minerl_rllib.envs.input import register_minerl_input def register(): diff --git a/envs/data.py b/minerl_rllib/envs/data.py similarity index 99% rename from envs/data.py rename to minerl_rllib/envs/data.py index 597d162..9a41126 100644 --- a/envs/data.py +++ b/minerl_rllib/envs/data.py @@ -9,7 +9,7 @@ from ray.rllib.offline import InputReader from ray.rllib.offline.json_writer import JsonWriter -from envs.wrappers import wrap +from minerl_rllib.envs.wrappers import wrap class MinerRLDataEnv(gym.Env): diff --git a/envs/env.py b/minerl_rllib/envs/env.py similarity index 100% rename from envs/env.py rename to minerl_rllib/envs/env.py diff --git a/envs/input.py b/minerl_rllib/envs/input.py similarity index 98% rename from envs/input.py rename to minerl_rllib/envs/input.py index dbdc620..04e82f8 100644 --- a/envs/input.py +++ b/minerl_rllib/envs/input.py @@ -10,7 +10,7 @@ from ray.rllib.utils.typing import SampleBatchType from ray.tune.registry import register_input -from envs.data import MinerRLDataEnv, wrap_env +from minerl_rllib.envs.data import MinerRLDataEnv, wrap_env class MineRLInputReader(InputReader): diff --git a/envs/wrappers/__init__.py b/minerl_rllib/envs/wrappers/__init__.py similarity index 64% rename from envs/wrappers/__init__.py rename to minerl_rllib/envs/wrappers/__init__.py index 0ddb3a5..8f09484 100644 --- a/envs/wrappers/__init__.py +++ b/minerl_rllib/envs/wrappers/__init__.py @@ -1,13 +1,13 @@ -from envs.wrappers.action_repeat_wrapper import MineRLActionRepeat -from envs.wrappers.action_wrapper import MineRLActionWrapper -from envs.wrappers.deterministic_wrapper import MineRLDeterministic -from envs.wrappers.discrete_action_wrapper import MineRLDiscreteActionWrapper -from envs.wrappers.gray_scale_wrapper import MineRLGrayScale -from envs.wrappers.normalize import MineRLNormalizeObservationWrapper, MineRLNormalizeActionWrapper, \ +from minerl_rllib.envs.wrappers.action_repeat_wrapper import MineRLActionRepeat +from minerl_rllib.envs.wrappers.action_wrapper import MineRLActionWrapper +from minerl_rllib.envs.wrappers.deterministic_wrapper import MineRLDeterministic +from minerl_rllib.envs.wrappers.discrete_action_wrapper import MineRLDiscreteActionWrapper +from minerl_rllib.envs.wrappers.gray_scale_wrapper import MineRLGrayScale +from minerl_rllib.envs.wrappers.normalize import MineRLNormalizeObservationWrapper, MineRLNormalizeActionWrapper, \ MineRLRewardScaleWrapper -from envs.wrappers.observation_stack_wrapper import MineRLObservationStack -from envs.wrappers.observation_wrapper import MineRLObservationWrapper -from envs.wrappers.time_limit_wrapper import MineRLTimeLimitWrapper +from minerl_rllib.envs.wrappers.observation_stack_wrapper import MineRLObservationStack +from minerl_rllib.envs.wrappers.observation_wrapper import MineRLObservationWrapper +from minerl_rllib.envs.wrappers.time_limit_wrapper import MineRLTimeLimitWrapper def wrap(env, discrete=False, num_actions=32, data_dir=None, num_stack=1, action_repeat=1, diff --git a/envs/wrappers/action_repeat_wrapper.py b/minerl_rllib/envs/wrappers/action_repeat_wrapper.py similarity index 100% rename from envs/wrappers/action_repeat_wrapper.py rename to minerl_rllib/envs/wrappers/action_repeat_wrapper.py diff --git a/envs/wrappers/action_wrapper.py b/minerl_rllib/envs/wrappers/action_wrapper.py similarity index 100% rename from envs/wrappers/action_wrapper.py rename to minerl_rllib/envs/wrappers/action_wrapper.py diff --git a/envs/wrappers/deterministic_wrapper.py b/minerl_rllib/envs/wrappers/deterministic_wrapper.py similarity index 100% rename from envs/wrappers/deterministic_wrapper.py rename to minerl_rllib/envs/wrappers/deterministic_wrapper.py diff --git a/envs/wrappers/discrete_action_wrapper.py b/minerl_rllib/envs/wrappers/discrete_action_wrapper.py similarity index 100% rename from envs/wrappers/discrete_action_wrapper.py rename to minerl_rllib/envs/wrappers/discrete_action_wrapper.py diff --git a/envs/wrappers/gray_scale_wrapper.py b/minerl_rllib/envs/wrappers/gray_scale_wrapper.py similarity index 100% rename from envs/wrappers/gray_scale_wrapper.py rename to minerl_rllib/envs/wrappers/gray_scale_wrapper.py diff --git a/envs/wrappers/normalize.py b/minerl_rllib/envs/wrappers/normalize.py similarity index 100% rename from envs/wrappers/normalize.py rename to minerl_rllib/envs/wrappers/normalize.py diff --git a/envs/wrappers/observation_stack_wrapper.py b/minerl_rllib/envs/wrappers/observation_stack_wrapper.py similarity index 100% rename from envs/wrappers/observation_stack_wrapper.py rename to minerl_rllib/envs/wrappers/observation_stack_wrapper.py diff --git a/envs/wrappers/observation_wrapper.py b/minerl_rllib/envs/wrappers/observation_wrapper.py similarity index 100% rename from envs/wrappers/observation_wrapper.py rename to minerl_rllib/envs/wrappers/observation_wrapper.py diff --git a/envs/wrappers/reward_penalty_wrapper.py b/minerl_rllib/envs/wrappers/reward_penalty_wrapper.py similarity index 100% rename from envs/wrappers/reward_penalty_wrapper.py rename to minerl_rllib/envs/wrappers/reward_penalty_wrapper.py diff --git a/envs/wrappers/time_limit_wrapper.py b/minerl_rllib/envs/wrappers/time_limit_wrapper.py similarity index 100% rename from envs/wrappers/time_limit_wrapper.py rename to minerl_rllib/envs/wrappers/time_limit_wrapper.py diff --git a/generate_kmeans.py b/minerl_rllib/generate_kmeans.py similarity index 100% rename from generate_kmeans.py rename to minerl_rllib/generate_kmeans.py diff --git a/models/__init__.py b/minerl_rllib/models/__init__.py similarity index 57% rename from models/__init__.py rename to minerl_rllib/models/__init__.py index a30bf48..78da858 100644 --- a/models/__init__.py +++ b/minerl_rllib/models/__init__.py @@ -1,8 +1,5 @@ -import models.torch - - def register(): """ Registers all models as available for RLlib """ - models.torch.baseline.register() + minerl_rllib.models.torch.baseline.register() diff --git a/minerl_rllib/models/tf/__init__.py b/minerl_rllib/models/tf/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/minerl_rllib/models/torch/__init__.py b/minerl_rllib/models/torch/__init__.py new file mode 100644 index 0000000..b3836d0 --- /dev/null +++ b/minerl_rllib/models/torch/__init__.py @@ -0,0 +1 @@ +import minerl_rllib.models.torch.action diff --git a/models/torch/action.py b/minerl_rllib/models/torch/action.py similarity index 100% rename from models/torch/action.py rename to minerl_rllib/models/torch/action.py diff --git a/models/torch/baseline.py b/minerl_rllib/models/torch/baseline.py similarity index 73% rename from models/torch/baseline.py rename to minerl_rllib/models/torch/baseline.py index d3da1d1..e9b5633 100644 --- a/models/torch/baseline.py +++ b/minerl_rllib/models/torch/baseline.py @@ -1,13 +1,12 @@ +import gym import numpy as np import torch import torch.nn as nn -import gym - from ray.rllib.models import ModelCatalog from ray.rllib.models.torch.torch_modelv2 import TorchModelV2 from ray.tune.utils import merge_dicts -import models +from minerl_rllib import models BASELINE_CONFIG = { # specifies the size of the state embedding @@ -19,7 +18,7 @@ # implemented: [gru, lstm] 'rnn_type': 'gru', # specifies whether to include the previous action and reward as part of the observation - 'use_prev_action_reward': True, + 'use_prev_action_reward': False, # specifies extra key word arguments for the RNN class 'rnn_config': { # specifies the rnn hidden layer size @@ -104,9 +103,9 @@ def get_factory(network_name): if self.use_rnn: state_embed_size = rnn_config['hidden_size'] if rnn_type == 'lstm': - self._rnn = models.torch.rnn.LSTMBaseline(state_input_size, **rnn_config) + self._rnn = minerl_rllib.models.torch.rnn.LSTMBaseline(state_input_size, **rnn_config) elif rnn_type == 'gru': - self._rnn = models.torch.rnn.GRUBaseline(state_input_size, **rnn_config) + self._rnn = minerl_rllib.models.torch.rnn.GRUBaseline(state_input_size, **rnn_config) else: raise NotImplementedError else: @@ -127,8 +126,33 @@ def get_initial_state(self): return [] def forward(self, input_dict, state, seq_lens): + recursive_print(dict(input_dict=input_dict, state=state, seq_lens=seq_lens)) + includes_time_dim = False if seq_lens is None else len(seq_lens) > 0 + + flat_shape = input_dict['obs_flat'].shape + if len(flat_shape) == 3: + batch_t = flat_shape[0] + batch_n = flat_shape[1] + raise ValueError(f"obs_flat shape = {flat_shape}") + elif len(flat_shape) == 2: + if includes_time_dim: + batch_n = len(seq_lens) + batch_t = flat_shape[0] // batch_n + else: + batch_t = 1 + batch_n = flat_shape[0] + else: + batch_t = 1 + batch_n = 1 + device = next(self.parameters()).device pov = input_dict['obs'][0].permute(0, 3, 1, 2) # n,c,h,w + # if len(input_dict['obs'][0].shape) == 4: + # pov = input_dict['obs'][0].permute(0, 3, 1, 2) # n,c,h,w + # elif len(input_dict['obs'][0].shape) == 5: + # pov = input_dict['obs'][0].permute(0, 1, 4, 2, 3) # t,n,c,h,w + # else: + # raise ValueError('expected different shape for pov input') vector = input_dict['obs'][1] pov_embed = self._pov_network(pov.to(device)) pov_embed = torch.reshape(pov_embed, pov_embed.shape[:2]) @@ -139,7 +163,6 @@ def forward(self, input_dict, state, seq_lens): if self.discrete: prev_actions = prev_actions.long() prev_rewards = input_dict['prev_rewards'] - prev_rewards = torch.reshape(prev_rewards, (-1, 1)) action_embed = self._action_network(prev_actions.to(device)) reward_embed = self._reward_network(prev_rewards.to(device)) @@ -149,16 +172,17 @@ def forward(self, input_dict, state, seq_lens): state_inputs = torch.cat((pov_embed, vector_embed), dim=-1) if self.use_rnn: - batch_t, batch_n, state_size = 1, state_inputs.size(0), state_inputs.size(1) - if isinstance(seq_lens, np.ndarray): - batch_t, batch_n = state_inputs.size(0) // len(seq_lens), len(seq_lens) - state_inputs = torch.reshape(state_inputs, (batch_t, batch_n, state_size)) - state_inputs = torch.nn.utils.rnn.pack_padded_sequence(state_inputs, seq_lens, enforce_sorted=False) - else: - state_inputs = torch.reshape(state_inputs, (batch_t, batch_n, state_size)) + state_size = state_inputs.shape[-1] + state_inputs = torch.reshape(state_inputs, (batch_t, batch_n, state_size)) + # if includes_time_dim: + # state_inputs = torch.reshape(state_inputs, (batch_t, batch_n, state_size)) + # print(state_inputs, state_inputs.shape, seq_lens) + # state_inputs = torch.nn.utils.rnn.pack_padded_sequence(state_inputs, seq_lens, enforce_sorted=False) + # else: + # state_inputs = torch.reshape(state_inputs, (batch_t, batch_n, state_size)) rnn_output, rnn_state = self._rnn(state_inputs, state) - if isinstance(seq_lens, np.ndarray): - rnn_output, _ = torch.nn.utils.rnn.pad_packed_sequence(rnn_output) + # if includes_time_dim: + # rnn_output, _ = torch.nn.utils.rnn.pad_packed_sequence(rnn_output) self._logits = torch.reshape(rnn_output, (batch_t * batch_n, self._rnn.hidden_size)) else: self._logits = self._state_network(state_inputs) @@ -168,7 +192,7 @@ def forward(self, input_dict, state, seq_lens): return outputs, rnn_state def value_function(self): - values = self._value_head(self._logits).squeeze() + values = self._value_head(self._logits) return values def import_from_h5(self, h5_file): @@ -182,3 +206,21 @@ def custom_loss(self, policy_loss, loss_inputs): def register(): ModelCatalog.register_custom_model('minerl_torch_model', MineRLTorchModel) + + +def recursive_print(d): + if isinstance(d, dict): + print('{') + for k, v in d.items(): + print(f'key={k}') + recursive_print(v) + print('}') + elif isinstance(d, list) or isinstance(d, tuple): + print('[') + for v in d: + recursive_print(v) + print(']') + elif isinstance(d, np.ndarray) or isinstance(d, torch.Tensor): + print(d.shape) + else: + print(d) diff --git a/minerl_rllib/models/torch/cql.py b/minerl_rllib/models/torch/cql.py new file mode 100644 index 0000000..2260419 --- /dev/null +++ b/minerl_rllib/models/torch/cql.py @@ -0,0 +1,10 @@ +from ray.rllib.agents.sac.sac_torch_model import SACTorchModel +from ray.rllib.utils.framework import TensorType + + +class CQLModel(SACTorchModel): + def value_function(self) -> TensorType: + pass + + def import_from_h5(self, h5_file: str) -> None: + pass diff --git a/models/torch/pov.py b/minerl_rllib/models/torch/pov.py similarity index 100% rename from models/torch/pov.py rename to minerl_rllib/models/torch/pov.py diff --git a/models/torch/reward.py b/minerl_rllib/models/torch/reward.py similarity index 100% rename from models/torch/reward.py rename to minerl_rllib/models/torch/reward.py diff --git a/models/torch/rnn.py b/minerl_rllib/models/torch/rnn.py similarity index 100% rename from models/torch/rnn.py rename to minerl_rllib/models/torch/rnn.py diff --git a/models/torch/vector.py b/minerl_rllib/models/torch/vector.py similarity index 100% rename from models/torch/vector.py rename to minerl_rllib/models/torch/vector.py diff --git a/rllib_train.py b/minerl_rllib/rllib_train.py similarity index 89% rename from rllib_train.py rename to minerl_rllib/rllib_train.py index ddf5b5a..527ac42 100644 --- a/rllib_train.py +++ b/minerl_rllib/rllib_train.py @@ -6,8 +6,7 @@ from ray.rllib.train import create_parser, run -import envs -import models +from minerl_rllib import models, envs envs.register() models.register() diff --git a/models/torch/__init__.py b/models/torch/__init__.py deleted file mode 100644 index a724dc5..0000000 --- a/models/torch/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -import models.torch.action -import models.torch.baseline -import models.torch.pov -import models.torch.reward -import models.torch.rnn -import models.torch.vector diff --git a/rllib_test.py b/rllib_test.py deleted file mode 100644 index 70af870..0000000 --- a/rllib_test.py +++ /dev/null @@ -1,38 +0,0 @@ -from ray.rllib.rollout import create_parser, deprecation_warning, run - -import envs -import models - -envs.register() -models.register() - - -def main(): - parser = create_parser() - args = parser.parse_args() - - # Old option: monitor, use video-dir instead. - if args.monitor: - deprecation_warning("--monitor", "--video-dir=[some dir]") - # User tries to record videos, but no-render is set: Error. - if (args.monitor or args.video_dir) and args.no_render: - raise ValueError( - "You have --no-render set, but are trying to record rollout videos" - " (via options --video-dir/--monitor)! " - "Either unset --no-render or do not use --video-dir/--monitor.") - # --use_shelve w/o --out option. - if args.use_shelve and not args.out: - raise ValueError( - "If you set --use-shelve, you must provide an output file via " - "--out as well!") - # --track-progress w/o --out option. - if args.track_progress and not args.out: - raise ValueError( - "If you set --track-progress, you must provide an output file via " - "--out as well!") - - run(args, parser) - - -if __name__ == '__main__': - main() diff --git a/tests/discrete.py b/tests/discrete.py index 9ad81af..d8bd28d 100644 --- a/tests/discrete.py +++ b/tests/discrete.py @@ -2,7 +2,7 @@ import numpy as np import gym from tqdm import tqdm -from envs import wrap +from minerl_rllib.envs import wrap def test_discrete(): diff --git a/train.py b/train.py index 416716e..5c081bd 100644 --- a/train.py +++ b/train.py @@ -1,4 +1,4 @@ -import rllib_train +from minerl_rllib import rllib_train if __name__ == '__main__': rllib_train.main() From 5d1cbb1626300bc671a4e82cc05c153be09360bd Mon Sep 17 00:00:00 2001 From: Julius Date: Tue, 20 Jul 2021 21:52:56 -0400 Subject: [PATCH 07/48] black format --- minerl_rllib/convert_data.py | 72 ++++++---- minerl_rllib/envs/wrappers/__init__.py | 48 +++++-- minerl_rllib/envs/wrappers/action_wrapper.py | 4 +- .../envs/wrappers/discrete_action_wrapper.py | 6 +- minerl_rllib/envs/wrappers/normalize.py | 54 ++++++-- .../wrappers/observation_stack_wrapper.py | 16 ++- .../envs/wrappers/observation_wrapper.py | 6 +- .../envs/wrappers/reward_penalty_wrapper.py | 2 +- minerl_rllib/generate_kmeans.py | 28 ++-- minerl_rllib/models/torch/baseline.py | 128 ++++++++++-------- minerl_rllib/models/torch/rnn.py | 8 +- minerl_rllib/rllib_train.py | 2 +- tests/discrete.py | 6 +- train.py | 2 +- 14 files changed, 244 insertions(+), 138 deletions(-) diff --git a/minerl_rllib/convert_data.py b/minerl_rllib/convert_data.py index d189e13..86bdfa4 100644 --- a/minerl_rllib/convert_data.py +++ b/minerl_rllib/convert_data.py @@ -9,22 +9,46 @@ from minerl_rllib.envs.data import write_jsons parser = argparse.ArgumentParser() -parser.add_argument('--data-dir', type=str, default=os.getenv('MINERL_DATA_ROOT', 'data'), - help='path to the data directory of the MineRL data') -parser.add_argument('--save-path', default=None, type=str, - help='directory to write jsons. defaults to the rllib subdirectory of the MineRL data path') -parser.add_argument('--env', type=str, default=None, help='Environment name to write jsons') -parser.add_argument('-f', '--config-file', default=None, type=str, help='config file to load environment config') -parser.add_argument('--env-config', default='{}', type=json.loads, - help='specifies environment configuration options. overrides config file specifications') -parser.add_argument('--overwrite', action='store_true', help='overwrite existing data if directory not empty') +parser.add_argument( + "--data-dir", + type=str, + default=os.getenv("MINERL_DATA_ROOT", "data"), + help="path to the data directory of the MineRL data", +) +parser.add_argument( + "--save-path", + default=None, + type=str, + help="directory to write jsons. defaults to the rllib subdirectory of the MineRL data path", +) +parser.add_argument( + "--env", type=str, default=None, help="Environment name to write jsons" +) +parser.add_argument( + "-f", + "--config-file", + default=None, + type=str, + help="config file to load environment config", +) +parser.add_argument( + "--env-config", + default="{}", + type=json.loads, + help="specifies environment configuration options. overrides config file specifications", +) +parser.add_argument( + "--overwrite", + action="store_true", + help="overwrite existing data if directory not empty", +) def get_save_path(data_dir, env_config, env_name=None): - save_dir = 'env-config' + save_dir = "env-config" for key, value in env_config.items(): - save_dir += f'--{key}-{value}' - save_path = os.path.join(data_dir, 'rllib', save_dir) + save_dir += f"--{key}-{value}" + save_path = os.path.join(data_dir, "rllib", save_dir) if env_name is not None: save_path = os.path.join(save_path, env_name) return save_path @@ -39,13 +63,13 @@ def main(): if args.config_file is not None: config = yaml.safe_load(open(args.config_file)) settings = list(config.values())[0] - if 'config' in settings: - if 'env_config' in settings['config']: - env_config = settings['config']['env_config'] - if 'env' in settings['config']: - env_list.append(settings['config']['env']) - if 'env' in settings: - env_list.append(settings['env']) + if "config" in settings: + if "env_config" in settings["config"]: + env_config = settings["config"]["env_config"] + if "env" in settings["config"]: + env_list.append(settings["config"]["env"]) + if "env" in settings: + env_list.append(settings["env"]) else: if args.env is None: for env_spec in obfuscated_envs: @@ -58,13 +82,15 @@ def main(): save_path = get_save_path(args.data_dir, env_config) else: save_path = args.save_path - print(f'saving jsons to {save_path}') + print(f"saving jsons to {save_path}") for env_name in env_list: - print(f'Writing data to json files for environment {env_name}') + print(f"Writing data to json files for environment {env_name}") env_save_path = os.path.join(save_path, env_name) - write_jsons(env_name, args.data_dir, env_config, env_save_path, overwrite=args.overwrite) + write_jsons( + env_name, args.data_dir, env_config, env_save_path, overwrite=args.overwrite + ) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/minerl_rllib/envs/wrappers/__init__.py b/minerl_rllib/envs/wrappers/__init__.py index 8f09484..f4596e3 100644 --- a/minerl_rllib/envs/wrappers/__init__.py +++ b/minerl_rllib/envs/wrappers/__init__.py @@ -1,17 +1,34 @@ from minerl_rllib.envs.wrappers.action_repeat_wrapper import MineRLActionRepeat from minerl_rllib.envs.wrappers.action_wrapper import MineRLActionWrapper from minerl_rllib.envs.wrappers.deterministic_wrapper import MineRLDeterministic -from minerl_rllib.envs.wrappers.discrete_action_wrapper import MineRLDiscreteActionWrapper +from minerl_rllib.envs.wrappers.discrete_action_wrapper import ( + MineRLDiscreteActionWrapper, +) from minerl_rllib.envs.wrappers.gray_scale_wrapper import MineRLGrayScale -from minerl_rllib.envs.wrappers.normalize import MineRLNormalizeObservationWrapper, MineRLNormalizeActionWrapper, \ - MineRLRewardScaleWrapper +from minerl_rllib.envs.wrappers.normalize import ( + MineRLNormalizeObservationWrapper, + MineRLNormalizeActionWrapper, + MineRLRewardScaleWrapper, +) from minerl_rllib.envs.wrappers.observation_stack_wrapper import MineRLObservationStack from minerl_rllib.envs.wrappers.observation_wrapper import MineRLObservationWrapper from minerl_rllib.envs.wrappers.time_limit_wrapper import MineRLTimeLimitWrapper -def wrap(env, discrete=False, num_actions=32, data_dir=None, num_stack=1, action_repeat=1, - gray_scale=False, seed=None, normalize_observation=False, normalize_action=False, reward_scale=1., **kwargs): +def wrap( + env, + discrete=False, + num_actions=32, + data_dir=None, + num_stack=1, + action_repeat=1, + gray_scale=False, + seed=None, + normalize_observation=False, + normalize_action=False, + reward_scale=1.0, + **kwargs +): env = MineRLTimeLimitWrapper(env) env = MineRLObservationWrapper(env) env = MineRLActionWrapper(env) @@ -20,15 +37,24 @@ def wrap(env, discrete=False, num_actions=32, data_dir=None, num_stack=1, action if gray_scale: env = MineRLGrayScale(env) if normalize_observation: - env = MineRLNormalizeObservationWrapper(env, kwargs.get('norm_pov_low', 0.), kwargs.get('norm_pov_high', 1.), - kwargs.get('norm_vec_low', -1.), kwargs.get('norm_vec_high', 1.)) + env = MineRLNormalizeObservationWrapper( + env, + kwargs.get("norm_pov_low", 0.0), + kwargs.get("norm_pov_high", 1.0), + kwargs.get("norm_vec_low", -1.0), + kwargs.get("norm_vec_high", 1.0), + ) if normalize_action: if discrete: - print('Tried to normalize discrete actions which is not possible! ' - 'Skipping the normalizing action wrapper.') + print( + "Tried to normalize discrete actions which is not possible! " + "Skipping the normalizing action wrapper." + ) else: - env = MineRLNormalizeActionWrapper(env, kwargs.get('norm_act_low', -1.), kwargs.get('norm_act_high', 1.)) - if reward_scale != 1.: + env = MineRLNormalizeActionWrapper( + env, kwargs.get("norm_act_low", -1.0), kwargs.get("norm_act_high", 1.0) + ) + if reward_scale != 1.0: env = MineRLRewardScaleWrapper(env, reward_scale) if num_stack > 1: env = MineRLObservationStack(env, num_stack) diff --git a/minerl_rllib/envs/wrappers/action_wrapper.py b/minerl_rllib/envs/wrappers/action_wrapper.py index 80b708c..d664a52 100644 --- a/minerl_rllib/envs/wrappers/action_wrapper.py +++ b/minerl_rllib/envs/wrappers/action_wrapper.py @@ -4,10 +4,10 @@ class MineRLActionWrapper(gym.ActionWrapper): def __init__(self, env): super().__init__(env) - self.action_space = self.action_space['vector'] + self.action_space = self.action_space["vector"] def action(self, action): return dict(vector=action) def reverse_action(self, action): - return action['vector'] + return action["vector"] diff --git a/minerl_rllib/envs/wrappers/discrete_action_wrapper.py b/minerl_rllib/envs/wrappers/discrete_action_wrapper.py index 9bc60be..b9ad262 100644 --- a/minerl_rllib/envs/wrappers/discrete_action_wrapper.py +++ b/minerl_rllib/envs/wrappers/discrete_action_wrapper.py @@ -10,8 +10,10 @@ def __init__(self, env, num_actions=32, data_dir=None): super().__init__(env) self.num_actions = num_actions if data_dir is None: - data_dir = os.environ.get('MINERL_DATA_ROOT', 'data') - kmeans_file = os.path.join(data_dir, f'{num_actions}-means', f'{env.env_spec.name}.npy') + data_dir = os.environ.get("MINERL_DATA_ROOT", "data") + kmeans_file = os.path.join( + data_dir, f"{num_actions}-means", f"{env.env_spec.name}.npy" + ) self.kmeans = np.load(kmeans_file) self.action_space = gym.spaces.Discrete(num_actions) self.nearest_neighbors = NearestNeighbors(n_neighbors=1).fit(self.kmeans) diff --git a/minerl_rllib/envs/wrappers/normalize.py b/minerl_rllib/envs/wrappers/normalize.py index c86cb7e..c7c5005 100644 --- a/minerl_rllib/envs/wrappers/normalize.py +++ b/minerl_rllib/envs/wrappers/normalize.py @@ -8,42 +8,68 @@ def normalize(a, prev_low, prev_high, new_low, new_high): class MineRLNormalizeObservationWrapper(gym.ObservationWrapper): - def __init__(self, env, pov_low=0., pov_high=1., vec_low=-1., vec_high=1.): + def __init__(self, env, pov_low=0.0, pov_high=1.0, vec_low=-1.0, vec_high=1.0): super().__init__(env) self._old_pov_space: gym.spaces.Box = self.env.observation_space.spaces[0] self._old_vec_space: gym.spaces.Box = self.env.observation_space.spaces[1] - self._pov_space = gym.spaces.Box(pov_low, pov_high, self._old_pov_space.low.shape, np.float32) - self._vec_space = gym.spaces.Box(vec_low, vec_high, self._old_vec_space.low.shape, np.float32) + self._pov_space = gym.spaces.Box( + pov_low, pov_high, self._old_pov_space.low.shape, np.float32 + ) + self._vec_space = gym.spaces.Box( + vec_low, vec_high, self._old_vec_space.low.shape, np.float32 + ) self.observation_space = gym.spaces.Tuple((self._pov_space, self._vec_space)) def observation(self, observation): pov, vec = observation - pov = normalize(pov, self._old_pov_space.low, self._old_pov_space.high, self._pov_space.low, - self._pov_space.high) - vec = normalize(vec, self._old_vec_space.low, self._old_vec_space.high, self._vec_space.low, - self._vec_space.high) + pov = normalize( + pov, + self._old_pov_space.low, + self._old_pov_space.high, + self._pov_space.low, + self._pov_space.high, + ) + vec = normalize( + vec, + self._old_vec_space.low, + self._old_vec_space.high, + self._vec_space.low, + self._vec_space.high, + ) return pov, vec class MineRLNormalizeActionWrapper(gym.ActionWrapper): - def __init__(self, env, low=-1., high=1.): + def __init__(self, env, low=-1.0, high=1.0): super().__init__(env) self._old_vec_space: gym.spaces.Box = self.env.action_space - self._vec_space = gym.spaces.Box(low, high, self._old_vec_space.low.shape, np.float32) + self._vec_space = gym.spaces.Box( + low, high, self._old_vec_space.low.shape, np.float32 + ) self.action_space = self._vec_space def action(self, action): - return normalize(action, self._old_vec_space.low, self._old_vec_space.high, self._vec_space.low, - self._vec_space.high) + return normalize( + action, + self._old_vec_space.low, + self._old_vec_space.high, + self._vec_space.low, + self._vec_space.high, + ) def reverse_action(self, action): action = self.env.reverse_action(action) - return normalize(action, self._vec_space.low, self._vec_space.high, self._old_vec_space.low, - self._old_vec_space.high) + return normalize( + action, + self._vec_space.low, + self._vec_space.high, + self._old_vec_space.low, + self._old_vec_space.high, + ) class MineRLRewardScaleWrapper(TransformReward): - def __init__(self, env, reward_scale=1.): + def __init__(self, env, reward_scale=1.0): def f(reward): return reward * reward_scale diff --git a/minerl_rllib/envs/wrappers/observation_stack_wrapper.py b/minerl_rllib/envs/wrappers/observation_stack_wrapper.py index 3b3d8f9..b390ac6 100644 --- a/minerl_rllib/envs/wrappers/observation_stack_wrapper.py +++ b/minerl_rllib/envs/wrappers/observation_stack_wrapper.py @@ -28,16 +28,24 @@ def __init__(self, env, num_stack, lz4_compress=False): self.tuple_len += 1 self.observation_space = gym.spaces.Tuple(new_spaces) elif isinstance(self.observation_space, gym.spaces.Box): - low = np.repeat(self.observation_space.low[np.newaxis, ...], num_stack, axis=0) - high = np.repeat(self.observation_space.high[np.newaxis, ...], num_stack, axis=0) - self.observation_space = gym.spaces.Box(low=low, high=high, dtype=self.observation_space.dtype) + low = np.repeat( + self.observation_space.low[np.newaxis, ...], num_stack, axis=0 + ) + high = np.repeat( + self.observation_space.high[np.newaxis, ...], num_stack, axis=0 + ) + self.observation_space = gym.spaces.Box( + low=low, high=high, dtype=self.observation_space.dtype + ) else: raise NotImplementedError def _get_observation(self): assert len(self.frames) == self.num_stack, (len(self.frames), self.num_stack) if not self.tuple: - return gym.wrappers.frame_stack.LazyFrames(list(self.frames), self.lz4_compress) + return gym.wrappers.frame_stack.LazyFrames( + list(self.frames), self.lz4_compress + ) obs = [] for i in range(self.tuple_len): frames = [f[i] for f in self.frames] diff --git a/minerl_rllib/envs/wrappers/observation_wrapper.py b/minerl_rllib/envs/wrappers/observation_wrapper.py index 20d7c11..5ae01b2 100644 --- a/minerl_rllib/envs/wrappers/observation_wrapper.py +++ b/minerl_rllib/envs/wrappers/observation_wrapper.py @@ -4,7 +4,9 @@ class MineRLObservationWrapper(gym.ObservationWrapper): def __init__(self, env): super().__init__(env) - self.observation_space = gym.spaces.Tuple((self.observation_space['pov'], self.observation_space['vector'])) + self.observation_space = gym.spaces.Tuple( + (self.observation_space["pov"], self.observation_space["vector"]) + ) def observation(self, observation): - return observation['pov'], observation['vector'] + return observation["pov"], observation["vector"] diff --git a/minerl_rllib/envs/wrappers/reward_penalty_wrapper.py b/minerl_rllib/envs/wrappers/reward_penalty_wrapper.py index c034819..5d39fff 100644 --- a/minerl_rllib/envs/wrappers/reward_penalty_wrapper.py +++ b/minerl_rllib/envs/wrappers/reward_penalty_wrapper.py @@ -3,4 +3,4 @@ class MineRLRewardPenaltyWrapper(gym.wrappers.TransformReward): def __init__(self, env, reward_penalty=0.001): - super().__init__(env, lambda r: r - reward_penalty) \ No newline at end of file + super().__init__(env, lambda r: r - reward_penalty) diff --git a/minerl_rllib/generate_kmeans.py b/minerl_rllib/generate_kmeans.py index 25552d8..16d0ac0 100644 --- a/minerl_rllib/generate_kmeans.py +++ b/minerl_rllib/generate_kmeans.py @@ -8,10 +8,10 @@ parser = argparse.ArgumentParser() -parser.add_argument('--env', default=None) -parser.add_argument('--num-actions', type=int, default=32) -parser.add_argument('--data-dir', default=os.getenv('MINERL_DATA_ROOT', 'data')) -parser.add_argument('--overwrite', action='store_true') +parser.add_argument("--env", default=None) +parser.add_argument("--num-actions", type=int, default=32) +parser.add_argument("--data-dir", default=os.getenv("MINERL_DATA_ROOT", "data")) +parser.add_argument("--overwrite", action="store_true") def main(): @@ -19,18 +19,18 @@ def main(): if args.env is None: env_list = [] for env_name in os.listdir(args.data_dir): - if 'VectorObf' in env_name: + if "VectorObf" in env_name: env_list.append(env_name) else: env_list = [args.env] for env_name in env_list: - print(f'Generating {args.num_actions}-means for {env_name}') + print(f"Generating {args.num_actions}-means for {env_name}") - file_dir = os.path.join(args.data_dir, f'{args.num_actions}-means') - file = os.path.join(file_dir, env_name + '.npy') + file_dir = os.path.join(args.data_dir, f"{args.num_actions}-means") + file = os.path.join(file_dir, env_name + ".npy") if os.path.exists(file) and not args.overwrite: - print(f'k-means file already exists at {file}') + print(f"k-means file already exists at {file}") continue if not os.path.exists(file_dir): os.mkdir(file_dir) @@ -40,15 +40,17 @@ def main(): for trajectory_name in tqdm(list(data.get_trajectory_names())): try: for _, action, _, _, _ in data.load_data(trajectory_name): - actions.append(action['vector']) + actions.append(action["vector"]) except TypeError: pass actions = np.stack(actions) - print('computing k-means...') - kmeans = KMeans(n_clusters=args.num_actions, verbose=1, random_state=0).fit(actions) + print("computing k-means...") + kmeans = KMeans(n_clusters=args.num_actions, verbose=1, random_state=0).fit( + actions + ) print(kmeans) np.save(file, kmeans.cluster_centers_) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/minerl_rllib/models/torch/baseline.py b/minerl_rllib/models/torch/baseline.py index e9b5633..f79f8e9 100644 --- a/minerl_rllib/models/torch/baseline.py +++ b/minerl_rllib/models/torch/baseline.py @@ -11,55 +11,45 @@ BASELINE_CONFIG = { # specifies the size of the state embedding # this is the rnn hidden size if use_rnn = True - 'state_embed_size': 512, + "state_embed_size": 512, # specifies whether to use a recurrent neural network for the state embedding - 'use_rnn': True, + "use_rnn": True, # specifies the type of rnn layer # implemented: [gru, lstm] - 'rnn_type': 'gru', + "rnn_type": "gru", # specifies whether to include the previous action and reward as part of the observation - 'use_prev_action_reward': False, + "use_prev_action_reward": False, # specifies extra key word arguments for the RNN class - 'rnn_config': { + "rnn_config": { # specifies the rnn hidden layer size - 'hidden_size': 512, + "hidden_size": 512, # specifies the number of rnn layers - 'num_layers': 1, + "num_layers": 1, }, - # specifies the network architecture for pov image observations # gets the pov network factory method from pov.py # takes in pov_net_kwargs as input and produces pov_network and pov_embed_size - 'pov_net': 'baseline', + "pov_net": "baseline", # specifies the network architecture for vector observations # gets the vector network factory method from vector.py # takes in vector_net_kwargs as input and produces vector_network and vector_embed_size - 'vector_net': 'baseline', + "vector_net": "baseline", # specifies the network architecture for action observations (discrete or continuous) # gets the action network factory method from action.py # takes in action_net_kwargs as input and produces action_network and action_embed_size - 'action_net': 'baseline', + "action_net": "baseline", # specifies the network architecture for reward observations # gets the reward network factory method from reward.py # takes in reward_net_kwargs as input and produces reward_network and reward_embed_size - 'reward_net': 'baseline', - + "reward_net": "baseline", # key word arguments for the pov network factory method - 'pov_net_kwargs': { - 'pov_embed_size': 256 - }, + "pov_net_kwargs": {"pov_embed_size": 256}, # key word arguments for the vector network factory method - 'vector_net_kwargs': { - 'vector_embed_size': 512 - }, + "vector_net_kwargs": {"vector_embed_size": 512}, # key word arguments for the action network factory method - 'action_net_kwargs': { - 'action_embed_size': 128 - }, + "action_net_kwargs": {"action_embed_size": 128}, # key word arguments for the reward network factory method - 'reward_net_kwargs': { - 'reward_embed_size': 128 - }, + "reward_net_kwargs": {"reward_embed_size": 128}, } @@ -69,43 +59,61 @@ class MineRLTorchModel(TorchModelV2, nn.Module): See rllib documentation on custom models: https://docs.ray.io/en/master/rllib-models.html#pytorch-models """ - def __init__(self, obs_space, action_space, num_outputs, model_config, name, **kwargs): - TorchModelV2.__init__(self, obs_space, action_space, num_outputs, model_config, name) + def __init__( + self, obs_space, action_space, num_outputs, model_config, name, **kwargs + ): + TorchModelV2.__init__( + self, obs_space, action_space, num_outputs, model_config, name + ) nn.Module.__init__(self) - model_config = merge_dicts(BASELINE_CONFIG, model_config['custom_model_config']) + model_config = merge_dicts(BASELINE_CONFIG, model_config["custom_model_config"]) # new way to get model config directly from keyword arguments model_config = merge_dicts(model_config, kwargs) - state_embed_size = model_config['state_embed_size'] - self.use_rnn = model_config['use_rnn'] - rnn_type = model_config['rnn_type'] - self.use_prev_action_reward = model_config['use_prev_action_reward'] + state_embed_size = model_config["state_embed_size"] + self.use_rnn = model_config["use_rnn"] + rnn_type = model_config["rnn_type"] + self.use_prev_action_reward = model_config["use_prev_action_reward"] - action_net_kwargs = model_config['action_net_kwargs'] + action_net_kwargs = model_config["action_net_kwargs"] if isinstance(action_space, gym.spaces.Discrete): - action_net_kwargs.update({'discrete': True, 'n': action_space.n}) + action_net_kwargs.update({"discrete": True, "n": action_space.n}) self.discrete = True else: self.discrete = False def get_factory(network_name): - return getattr(getattr(models.torch, network_name), model_config[f'{network_name}_net']) + return getattr( + getattr(models.torch, network_name), model_config[f"{network_name}_net"] + ) - self._pov_network, pov_embed_size = get_factory('pov')(**model_config['pov_net_kwargs']) - self._vector_network, vector_embed_size = get_factory('vector')(**model_config['vector_net_kwargs']) + self._pov_network, pov_embed_size = get_factory("pov")( + **model_config["pov_net_kwargs"] + ) + self._vector_network, vector_embed_size = get_factory("vector")( + **model_config["vector_net_kwargs"] + ) state_input_size = pov_embed_size + vector_embed_size if self.use_prev_action_reward: - self._action_network, action_embed_size = get_factory('action')(**action_net_kwargs) - self._reward_network, reward_embed_size = get_factory('reward')(**model_config['reward_net_kwargs']) + self._action_network, action_embed_size = get_factory("action")( + **action_net_kwargs + ) + self._reward_network, reward_embed_size = get_factory("reward")( + **model_config["reward_net_kwargs"] + ) state_input_size += action_embed_size + reward_embed_size - rnn_config = model_config.get('rnn_config') + rnn_config = model_config.get("rnn_config") if self.use_rnn: - state_embed_size = rnn_config['hidden_size'] - if rnn_type == 'lstm': - self._rnn = minerl_rllib.models.torch.rnn.LSTMBaseline(state_input_size, **rnn_config) - elif rnn_type == 'gru': - self._rnn = minerl_rllib.models.torch.rnn.GRUBaseline(state_input_size, **rnn_config) + state_embed_size = rnn_config["hidden_size"] + if rnn_type == "lstm": + self._rnn = minerl_rllib.models.torch.rnn.LSTMBaseline( + state_input_size, **rnn_config + ) + elif rnn_type == "gru": + self._rnn = minerl_rllib.models.torch.rnn.GRUBaseline( + state_input_size, **rnn_config + ) else: raise NotImplementedError else: @@ -129,7 +137,7 @@ def forward(self, input_dict, state, seq_lens): recursive_print(dict(input_dict=input_dict, state=state, seq_lens=seq_lens)) includes_time_dim = False if seq_lens is None else len(seq_lens) > 0 - flat_shape = input_dict['obs_flat'].shape + flat_shape = input_dict["obs_flat"].shape if len(flat_shape) == 3: batch_t = flat_shape[0] batch_n = flat_shape[1] @@ -146,28 +154,30 @@ def forward(self, input_dict, state, seq_lens): batch_n = 1 device = next(self.parameters()).device - pov = input_dict['obs'][0].permute(0, 3, 1, 2) # n,c,h,w + pov = input_dict["obs"][0].permute(0, 3, 1, 2) # n,c,h,w # if len(input_dict['obs'][0].shape) == 4: # pov = input_dict['obs'][0].permute(0, 3, 1, 2) # n,c,h,w # elif len(input_dict['obs'][0].shape) == 5: # pov = input_dict['obs'][0].permute(0, 1, 4, 2, 3) # t,n,c,h,w # else: # raise ValueError('expected different shape for pov input') - vector = input_dict['obs'][1] + vector = input_dict["obs"][1] pov_embed = self._pov_network(pov.to(device)) pov_embed = torch.reshape(pov_embed, pov_embed.shape[:2]) vector_embed = self._vector_network(vector.to(device)) if self.use_prev_action_reward: - prev_actions = input_dict['prev_actions'] + prev_actions = input_dict["prev_actions"] if self.discrete: prev_actions = prev_actions.long() - prev_rewards = input_dict['prev_rewards'] + prev_rewards = input_dict["prev_rewards"] action_embed = self._action_network(prev_actions.to(device)) reward_embed = self._reward_network(prev_rewards.to(device)) - state_inputs = torch.cat((pov_embed, vector_embed, action_embed, reward_embed), dim=-1) + state_inputs = torch.cat( + (pov_embed, vector_embed, action_embed, reward_embed), dim=-1 + ) else: state_inputs = torch.cat((pov_embed, vector_embed), dim=-1) @@ -183,7 +193,9 @@ def forward(self, input_dict, state, seq_lens): rnn_output, rnn_state = self._rnn(state_inputs, state) # if includes_time_dim: # rnn_output, _ = torch.nn.utils.rnn.pad_packed_sequence(rnn_output) - self._logits = torch.reshape(rnn_output, (batch_t * batch_n, self._rnn.hidden_size)) + self._logits = torch.reshape( + rnn_output, (batch_t * batch_n, self._rnn.hidden_size) + ) else: self._logits = self._state_network(state_inputs) rnn_state = [] @@ -205,21 +217,21 @@ def custom_loss(self, policy_loss, loss_inputs): def register(): - ModelCatalog.register_custom_model('minerl_torch_model', MineRLTorchModel) + ModelCatalog.register_custom_model("minerl_torch_model", MineRLTorchModel) def recursive_print(d): if isinstance(d, dict): - print('{') + print("{") for k, v in d.items(): - print(f'key={k}') + print(f"key={k}") recursive_print(v) - print('}') + print("}") elif isinstance(d, list) or isinstance(d, tuple): - print('[') + print("[") for v in d: recursive_print(v) - print(']') + print("]") elif isinstance(d, np.ndarray) or isinstance(d, torch.Tensor): print(d.shape) else: diff --git a/minerl_rllib/models/torch/rnn.py b/minerl_rllib/models/torch/rnn.py index 8af0788..2d05004 100644 --- a/minerl_rllib/models/torch/rnn.py +++ b/minerl_rllib/models/torch/rnn.py @@ -14,7 +14,9 @@ def __init__(self, input_size: int, hidden_size: int, num_layers: int, name: str self.num_layers = num_layers self.name = name - def forward(self, x: Union[Tensor, PackedSequence], state: List[Tensor]) -> Tuple[Union[Tensor, PackedSequence]]: + def forward( + self, x: Union[Tensor, PackedSequence], state: List[Tensor] + ) -> Tuple[Union[Tensor, PackedSequence]]: """ Forward pass through the recurrent network :param x: input tensor for the RNN with shape (seq, batch, feature) which can be a packed sequence @@ -44,7 +46,7 @@ def custom_loss(self): class GRUBaseline(RecurrentBaseline): def __init__(self, input_size, hidden_size, num_layers=1, **kwargs): - super().__init__(input_size, hidden_size, num_layers, 'gru') + super().__init__(input_size, hidden_size, num_layers, "gru") self.rnn = nn.GRU(input_size, hidden_size, num_layers, **kwargs) def initial_state(self): @@ -75,7 +77,7 @@ def forward(self, x, state): class LSTMBaseline(RecurrentBaseline): def __init__(self, input_size, hidden_size, num_layers=1, **kwargs): - super().__init__(input_size, hidden_size, num_layers, 'lstm') + super().__init__(input_size, hidden_size, num_layers, "lstm") self.rnn = nn.LSTM(input_size, hidden_size, num_layers, **kwargs) def initial_state(self): diff --git a/minerl_rllib/rllib_train.py b/minerl_rllib/rllib_train.py index 527ac42..474272f 100644 --- a/minerl_rllib/rllib_train.py +++ b/minerl_rllib/rllib_train.py @@ -18,5 +18,5 @@ def main(): run(args, parser) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/tests/discrete.py b/tests/discrete.py index d8bd28d..ddedc37 100644 --- a/tests/discrete.py +++ b/tests/discrete.py @@ -6,8 +6,8 @@ def test_discrete(): - os.chdir('..') - env = gym.make('MineRLTreechopVectorObf-v0') + os.chdir("..") + env = gym.make("MineRLTreechopVectorObf-v0") env = wrap(env, discrete=True, num_actions=32) for _ in tqdm(range(100)): @@ -22,5 +22,5 @@ def test_discrete(): obs, reward, done, info = env.step(action) -if __name__ == '__main__': +if __name__ == "__main__": test_discrete() diff --git a/train.py b/train.py index 5c081bd..9e9f57d 100644 --- a/train.py +++ b/train.py @@ -1,4 +1,4 @@ from minerl_rllib import rllib_train -if __name__ == '__main__': +if __name__ == "__main__": rllib_train.main() From f23c075d92684f7272091db982ec0a90cacd8755 Mon Sep 17 00:00:00 2001 From: Julius Date: Thu, 22 Jul 2021 02:11:23 -0400 Subject: [PATCH 08/48] updated requirements --- README.md | 7 ++++--- requirements.txt | 11 +++-------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 3e09c18..37eb403 100644 --- a/README.md +++ b/README.md @@ -7,15 +7,16 @@ RLlib natively supports TensorFlow, TensorFlow Eager, and PyTorch, but most of i ## Installation +Requires Python 3.7 or 3.8. + 1. Make sure you have JDK 1.8 on your system for [MineRL](https://minerl.io/docs/tutorials/index.html#installation). -2. Install [PyTorch](https://pytorch.org/get-started/locally/) and [TensorFlow](https://www.tensorflow.org/install) with correct cuda version -3. Install [Ray Latest Snapshots (Nightlies)](https://docs.ray.io/en/master/installation.html#latest-snapshots-nightlies) -4. Finally, ``` git clone https://github.com/juliusfrost/minerl-rllib.git cd minerl-rllib pip install -r requirements.txt ``` +2. Install [Ray Latest Snapshots (Nightlies)](https://docs.ray.io/en/master/installation.html#latest-snapshots-nightlies) +3. Install [PyTorch](https://pytorch.org/get-started/locally/) and [TensorFlow](https://www.tensorflow.org/install) with correct cuda version. ## Implementation Details See [Implementation Details](Implementation.md) diff --git a/requirements.txt b/requirements.txt index 421fc62..a90d487 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,3 @@ -tqdm -numpy -sklearn -gym -minerl -pyyaml -filelock -ray[rllib] \ No newline at end of file +ray[default,tune,rllib]>=1.4.1 +git+https://github.com/minerl-wrappers/minerl-wrappers.git +scikit-learn>=0.24.2 \ No newline at end of file From de41be2bbae9194802f245c54d8c0127b8d38cdb Mon Sep 17 00:00:00 2001 From: Julius Date: Thu, 22 Jul 2021 02:11:34 -0400 Subject: [PATCH 09/48] fix import error --- minerl_rllib/models/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/minerl_rllib/models/__init__.py b/minerl_rllib/models/__init__.py index 78da858..e3a0fb8 100644 --- a/minerl_rllib/models/__init__.py +++ b/minerl_rllib/models/__init__.py @@ -1,3 +1,6 @@ +import minerl_rllib.models.torch.baseline + + def register(): """ Registers all models as available for RLlib From f7f54d1af94fd5c0ee438756527d8141c84cde00 Mon Sep 17 00:00:00 2001 From: Julius Date: Sun, 25 Jul 2021 20:23:11 -0400 Subject: [PATCH 10/48] don't use lazy environment --- minerl_rllib/envs/env.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/minerl_rllib/envs/env.py b/minerl_rllib/envs/env.py index 5233a68..0ba49c2 100644 --- a/minerl_rllib/envs/env.py +++ b/minerl_rllib/envs/env.py @@ -91,7 +91,9 @@ def register_minerl_envs(): ): def env_creator(env_config): - return wrap(LazyMineRLEnv(env_spec), **env_config) + with filelock.FileLock("minerl_env.lock"): + env = wrap(env_spec.make(), **env_config) + return env register_env(env_spec.name, env_creator) From 9e434acefa17e940521d0a3fdc34d8ae13f07f40 Mon Sep 17 00:00:00 2001 From: Julius Date: Sun, 25 Jul 2021 20:30:10 -0400 Subject: [PATCH 11/48] fix imports --- minerl_rllib/models/torch/baseline.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/minerl_rllib/models/torch/baseline.py b/minerl_rllib/models/torch/baseline.py index f79f8e9..415cede 100644 --- a/minerl_rllib/models/torch/baseline.py +++ b/minerl_rllib/models/torch/baseline.py @@ -1,3 +1,5 @@ +import importlib + import gym import numpy as np import torch @@ -6,7 +8,7 @@ from ray.rllib.models.torch.torch_modelv2 import TorchModelV2 from ray.tune.utils import merge_dicts -from minerl_rllib import models +from minerl_rllib.models.torch.rnn import GRUBaseline, LSTMBaseline BASELINE_CONFIG = { # specifies the size of the state embedding @@ -83,9 +85,8 @@ def __init__( self.discrete = False def get_factory(network_name): - return getattr( - getattr(models.torch, network_name), model_config[f"{network_name}_net"] - ) + base_module = importlib.import_module(f"minerl_rllib.models.torch.{network_name}") + return getattr(base_module, model_config[f"{network_name}_net"]) self._pov_network, pov_embed_size = get_factory("pov")( **model_config["pov_net_kwargs"] @@ -107,11 +108,11 @@ def get_factory(network_name): if self.use_rnn: state_embed_size = rnn_config["hidden_size"] if rnn_type == "lstm": - self._rnn = minerl_rllib.models.torch.rnn.LSTMBaseline( + self._rnn = LSTMBaseline( state_input_size, **rnn_config ) elif rnn_type == "gru": - self._rnn = minerl_rllib.models.torch.rnn.GRUBaseline( + self._rnn = GRUBaseline( state_input_size, **rnn_config ) else: From d55c97ef23b635b88d94fe9224d06c2bae7e5c4a Mon Sep 17 00:00:00 2001 From: Julius Date: Mon, 26 Jul 2021 23:28:59 -0400 Subject: [PATCH 12/48] remove old config files --- config/custom_model/impala.yaml | 16 ----------- config/custom_model/marwil.yaml | 16 ----------- config/custom_model/sac.yaml | 43 ----------------------------- config/untuned/a2c.yaml | 11 -------- config/untuned/apex.yaml | 32 ---------------------- config/untuned/dist-dqn.yaml | 31 --------------------- config/untuned/dqn.yaml | 29 -------------------- config/untuned/dueling-ddqn.yaml | 29 -------------------- config/untuned/impala.yaml | 12 --------- config/untuned/ppo.yaml | 21 --------------- config/untuned/rainbow.yaml | 46 -------------------------------- config/untuned/sac.yaml | 36 ------------------------- 12 files changed, 322 deletions(-) delete mode 100644 config/custom_model/impala.yaml delete mode 100644 config/custom_model/marwil.yaml delete mode 100644 config/custom_model/sac.yaml delete mode 100644 config/untuned/a2c.yaml delete mode 100644 config/untuned/apex.yaml delete mode 100644 config/untuned/dist-dqn.yaml delete mode 100644 config/untuned/dqn.yaml delete mode 100644 config/untuned/dueling-ddqn.yaml delete mode 100644 config/untuned/impala.yaml delete mode 100644 config/untuned/ppo.yaml delete mode 100644 config/untuned/rainbow.yaml delete mode 100644 config/untuned/sac.yaml diff --git a/config/custom_model/impala.yaml b/config/custom_model/impala.yaml deleted file mode 100644 index 126be13..0000000 --- a/config/custom_model/impala.yaml +++ /dev/null @@ -1,16 +0,0 @@ -minerl-impala: - run: IMPALA - config: - rollout_fragment_length: 50 - train_batch_size: 500 - num_workers: 2 - num_envs_per_worker: 1 - clip_rewards: True - lr_schedule: [ - [0, 0.0001], - [20000000, 0.000000000001], - ] - - framework: torch - model: - custom_model: minerl_torch_model diff --git a/config/custom_model/marwil.yaml b/config/custom_model/marwil.yaml deleted file mode 100644 index de571d6..0000000 --- a/config/custom_model/marwil.yaml +++ /dev/null @@ -1,16 +0,0 @@ -minerl-marwil: - run: MARWIL - config: - framework: torch - model: - custom_model: minerl_torch_model - - # In order to evaluate on an actual environment, use these following - # settings: -# evaluation_num_workers: 1 -# evaluation_interval: 1 -# evaluation_config: -# input: sampler - # Compare IL (beta=0) vs MARWIL. -# beta: -# grid_search: [0, 1] \ No newline at end of file diff --git a/config/custom_model/sac.yaml b/config/custom_model/sac.yaml deleted file mode 100644 index 9e84762..0000000 --- a/config/custom_model/sac.yaml +++ /dev/null @@ -1,43 +0,0 @@ -atari-sac: - run: SAC - config: - gamma: 0.99 - # state-preprocessor=Our default Atari Conv2D-net. - use_state_preprocessor: true - Q_model: - fcnet_activation: relu - fcnet_hiddens: [512] - policy_model: - fcnet_activation: relu - fcnet_hiddens: [512] - # Do hard syncs. - # Soft-syncs seem to work less reliably for discrete action spaces. - tau: 1.0 - target_network_update_freq: 8000 - # auto = 0.98 * -log(1/|A|) - target_entropy: auto - clip_rewards: 1.0 - no_done_at_end: False - n_step: 1 - rollout_fragment_length: 1 - prioritized_replay: true - train_batch_size: 64 - timesteps_per_iteration: 4 - # Paper uses 20k random timesteps, which is not exactly the same, but - # seems to work nevertheless. We use 100k here for the longer Atari - # runs (DQN style: filling up the buffer a bit before learning). - learning_starts: 20000 - optimization: - actor_learning_rate: 0.0003 - critic_learning_rate: 0.0003 - entropy_learning_rate: 0.0003 - num_workers: 0 - num_gpus: 1 - metrics_smoothing_episodes: 5 - - framework: torch - model: - custom_model: minerl_torch_model - custom_model_config: - use_rnn: false - use_prev_action_reward: false diff --git a/config/untuned/a2c.yaml b/config/untuned/a2c.yaml deleted file mode 100644 index 49e5eb6..0000000 --- a/config/untuned/a2c.yaml +++ /dev/null @@ -1,11 +0,0 @@ -atari-a2c: - run: A2C - config: - rollout_fragment_length: 20 - num_workers: 5 - num_envs_per_worker: 5 - num_gpus: 1 - lr_schedule: [ - [0, 0.0007], - [20000000, 0.000000000001], - ] diff --git a/config/untuned/apex.yaml b/config/untuned/apex.yaml deleted file mode 100644 index 90bce81..0000000 --- a/config/untuned/apex.yaml +++ /dev/null @@ -1,32 +0,0 @@ -atari-apex: - run: APEX - config: - double_q: false - dueling: false - num_atoms: 1 - noisy: false - n_step: 3 - lr: .0001 - adam_epsilon: .00015 - hiddens: [512] - buffer_size: 1000000 - exploration_config: - final_epsilon: 0.01 - epsilon_timesteps: 200000 - prioritized_replay_alpha: 0.5 - final_prioritized_replay_beta: 1.0 - prioritized_replay_beta_annealing_timesteps: 2000000 - - num_gpus: 1 - - # APEX - num_workers: 8 - num_envs_per_worker: 8 - rollout_fragment_length: 20 - train_batch_size: 512 - target_network_update_freq: 50000 - timesteps_per_iteration: 25000 - - # MineRL - env_config: - discrete: true diff --git a/config/untuned/dist-dqn.yaml b/config/untuned/dist-dqn.yaml deleted file mode 100644 index 281ddcb..0000000 --- a/config/untuned/dist-dqn.yaml +++ /dev/null @@ -1,31 +0,0 @@ -atari-dist-dqn: - run: DQN - config: - # only works on tf for now - framework: tf - double_q: false - dueling: false - num_atoms: 51 - noisy: false - prioritized_replay: false - n_step: 1 - target_network_update_freq: 8000 - lr: .0000625 - adam_epsilon: .00015 - hiddens: [512] - learning_starts: 20000 - buffer_size: 1000000 - rollout_fragment_length: 4 - train_batch_size: 32 - exploration_config: - epsilon_timesteps: 200000 - final_epsilon: 0.01 - prioritized_replay_alpha: 0.5 - final_prioritized_replay_beta: 1.0 - prioritized_replay_beta_annealing_timesteps: 2000000 - num_gpus: 0.2 - timesteps_per_iteration: 10000 - - # MineRL - env_config: - discrete: true diff --git a/config/untuned/dqn.yaml b/config/untuned/dqn.yaml deleted file mode 100644 index 7d3a0c5..0000000 --- a/config/untuned/dqn.yaml +++ /dev/null @@ -1,29 +0,0 @@ -atari-basic-dqn: - run: DQN - config: - double_q: false - dueling: false - num_atoms: 1 - noisy: false - prioritized_replay: false - n_step: 1 - target_network_update_freq: 8000 - lr: .0000625 - adam_epsilon: .00015 - hiddens: [512] - learning_starts: 20000 - buffer_size: 1000000 - rollout_fragment_length: 4 - train_batch_size: 32 - exploration_config: - epsilon_timesteps: 200000 - final_epsilon: 0.01 - prioritized_replay_alpha: 0.5 - final_prioritized_replay_beta: 1.0 - prioritized_replay_beta_annealing_timesteps: 2000000 - num_gpus: 0.2 - timesteps_per_iteration: 10000 - - # MineRL - env_config: - discrete: true diff --git a/config/untuned/dueling-ddqn.yaml b/config/untuned/dueling-ddqn.yaml deleted file mode 100644 index c2242c9..0000000 --- a/config/untuned/dueling-ddqn.yaml +++ /dev/null @@ -1,29 +0,0 @@ -atari-dueling-ddqn: - run: DQN - config: - double_q: true - dueling: true - num_atoms: 1 - noisy: false - prioritized_replay: false - n_step: 1 - target_network_update_freq: 8000 - lr: .0000625 - adam_epsilon: .00015 - hiddens: [512] - learning_starts: 20000 - buffer_size: 1000000 - rollout_fragment_length: 4 - train_batch_size: 32 - exploration_config: - epsilon_timesteps: 200000 - final_epsilon: 0.01 - prioritized_replay_alpha: 0.5 - final_prioritized_replay_beta: 1.0 - prioritized_replay_beta_annealing_timesteps: 2000000 - num_gpus: 0.2 - timesteps_per_iteration: 10000 - - # MineRL - env_config: - discrete: true diff --git a/config/untuned/impala.yaml b/config/untuned/impala.yaml deleted file mode 100644 index 43e8ad1..0000000 --- a/config/untuned/impala.yaml +++ /dev/null @@ -1,12 +0,0 @@ -atari-impala: - run: IMPALA - config: - rollout_fragment_length: 50 - train_batch_size: 500 - num_workers: 32 - num_envs_per_worker: 5 - clip_rewards: True - lr_schedule: [ - [0, 0.0005], - [20000000, 0.000000000001], - ] diff --git a/config/untuned/ppo.yaml b/config/untuned/ppo.yaml deleted file mode 100644 index 9d72fab..0000000 --- a/config/untuned/ppo.yaml +++ /dev/null @@ -1,21 +0,0 @@ -atari-ppo: - run: PPO - config: - lambda: 0.95 - kl_coeff: 0.5 - clip_rewards: True - clip_param: 0.1 - vf_clip_param: 10.0 - entropy_coeff: 0.01 - train_batch_size: 5000 - rollout_fragment_length: 100 - sgd_minibatch_size: 500 - num_sgd_iter: 10 - num_workers: 10 - num_envs_per_worker: 5 - batch_mode: truncate_episodes - observation_filter: NoFilter - vf_share_layers: true - num_gpus: 1 - model: - use_lstm: true diff --git a/config/untuned/rainbow.yaml b/config/untuned/rainbow.yaml deleted file mode 100644 index 433c03f..0000000 --- a/config/untuned/rainbow.yaml +++ /dev/null @@ -1,46 +0,0 @@ -# base hyperparameters used from sample efficient rainbow: https://arxiv.org/abs/1906.05243 -atari-rainbow: - run: DQN - config: - double_q: true - dueling: true - num_atoms: 51 - noisy: True - sigma0: 0.1 # noisy nets parameter - gamma: 0.99 - lr: .0001 - adam_epsilon: .00015 - grad_clip: 10 - hiddens: [512] - learning_starts: 1600 # 20000 -> 1600 - buffer_size: 100000 - rollout_fragment_length: 1 # 4 -> 1 - train_batch_size: 32 - exploration_config: - epsilon_timesteps: 2 - final_epsilon: 0.0 - target_network_update_freq: 2000 - prioritized_replay: True - prioritized_replay_alpha: 0.5 - prioritized_replay_beta: 0.4 - final_prioritized_replay_beta: 1.0 - prioritized_replay_beta_annealing_timesteps: 8000000 # set to the expected maximum number of time steps - n_step: 20 # 3 -> 20 - num_gpus: 1 - - model: - # Filter config. List of [out_channels, kernel, stride] for each filter - conv_filters: [ - [32, [5, 5], 5], - [64, [5, 5], 5], - ] - fcnet_hiddens: [256] - framestack: false - dim: 64 # this shouldn't do anything in the preprocessor but MineRL pov observations are 64x64 - - # MineRL - env_config: - discrete: true - action_repeat: 4 - num_stack: 4 - gray_scale: true diff --git a/config/untuned/sac.yaml b/config/untuned/sac.yaml deleted file mode 100644 index 5460a0d..0000000 --- a/config/untuned/sac.yaml +++ /dev/null @@ -1,36 +0,0 @@ -atari-sac: - run: SAC - config: - gamma: 0.99 - # state-preprocessor=Our default Atari Conv2D-net. - use_state_preprocessor: true - Q_model: - fcnet_activation: relu - fcnet_hiddens: [512] - policy_model: - fcnet_activation: relu - fcnet_hiddens: [512] - # Do hard syncs. - # Soft-syncs seem to work less reliably for discrete action spaces. - tau: 1.0 - target_network_update_freq: 8000 - # auto = 0.98 * -log(1/|A|) - target_entropy: auto - clip_rewards: 1.0 - no_done_at_end: False - n_step: 1 - rollout_fragment_length: 1 - prioritized_replay: true - train_batch_size: 64 - timesteps_per_iteration: 4 - # Paper uses 20k random timesteps, which is not exactly the same, but - # seems to work nevertheless. We use 100k here for the longer Atari - # runs (DQN style: filling up the buffer a bit before learning). - learning_starts: 20000 - optimization: - actor_learning_rate: 0.0003 - critic_learning_rate: 0.0003 - entropy_learning_rate: 0.0003 - num_workers: 0 - num_gpus: 1 - metrics_smoothing_episodes: 5 From 35bf4f3ffaf82dbc110434f2371c05531202ff4a Mon Sep 17 00:00:00 2001 From: Julius Date: Mon, 26 Jul 2021 23:50:19 -0400 Subject: [PATCH 13/48] remove invalid argument --- minerl_rllib/envs/input.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/minerl_rllib/envs/input.py b/minerl_rllib/envs/input.py index 04e82f8..2868f4f 100644 --- a/minerl_rllib/envs/input.py +++ b/minerl_rllib/envs/input.py @@ -37,14 +37,12 @@ def __init__(self, ioctx: IOContext = None): num_epochs = input_config.get("num_epochs", -1) preload_buffer_size = input_config.get("preload_buffer_size", 2) seed = input_config.get("seed", None) - include_metadata = input_config.get("include_metadata", False) self.generator = self.data.batch_iter( batch_size, seq_len, num_epochs=num_epochs, preload_buffer_size=preload_buffer_size, seed=seed, - include_metadata=include_metadata, ) env = MinerRLDataEnv(self.data) env = wrap_env(env, env_config) From 69ee229e8fea2968e0199c55bc7f12376d9c9f71 Mon Sep 17 00:00:00 2001 From: Julius Date: Sat, 31 Jul 2021 02:00:14 -0400 Subject: [PATCH 14/48] format --- minerl_rllib/models/torch/baseline.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/minerl_rllib/models/torch/baseline.py b/minerl_rllib/models/torch/baseline.py index 415cede..23934bc 100644 --- a/minerl_rllib/models/torch/baseline.py +++ b/minerl_rllib/models/torch/baseline.py @@ -85,7 +85,9 @@ def __init__( self.discrete = False def get_factory(network_name): - base_module = importlib.import_module(f"minerl_rllib.models.torch.{network_name}") + base_module = importlib.import_module( + f"minerl_rllib.models.torch.{network_name}" + ) return getattr(base_module, model_config[f"{network_name}_net"]) self._pov_network, pov_embed_size = get_factory("pov")( @@ -108,13 +110,9 @@ def get_factory(network_name): if self.use_rnn: state_embed_size = rnn_config["hidden_size"] if rnn_type == "lstm": - self._rnn = LSTMBaseline( - state_input_size, **rnn_config - ) + self._rnn = LSTMBaseline(state_input_size, **rnn_config) elif rnn_type == "gru": - self._rnn = GRUBaseline( - state_input_size, **rnn_config - ) + self._rnn = GRUBaseline(state_input_size, **rnn_config) else: raise NotImplementedError else: From 364d8f20690dc8f7b8d016e4042a031d21b24968 Mon Sep 17 00:00:00 2001 From: Julius Date: Sat, 31 Jul 2021 02:01:17 -0400 Subject: [PATCH 15/48] add episode based data loader --- minerl_rllib/envs/env.py | 6 +++- minerl_rllib/envs/input.py | 71 ++++++++++++++++++++++++++++++++++---- 2 files changed, 70 insertions(+), 7 deletions(-) diff --git a/minerl_rllib/envs/env.py b/minerl_rllib/envs/env.py index 0ba49c2..3c25229 100644 --- a/minerl_rllib/envs/env.py +++ b/minerl_rllib/envs/env.py @@ -85,6 +85,10 @@ def render(self, mode="human"): pass +def wrap_env(env, **kwargs): + return wrap(env, **kwargs) + + def register_minerl_envs(): for env_spec in ( BASIC_ENV_SPECS + COMPETITION_ENV_SPECS + BASALT_COMPETITION_ENV_SPECS @@ -92,7 +96,7 @@ def register_minerl_envs(): def env_creator(env_config): with filelock.FileLock("minerl_env.lock"): - env = wrap(env_spec.make(), **env_config) + env = wrap_env(env_spec.make(), **env_config) return env register_env(env_spec.name, env_creator) diff --git a/minerl_rllib/envs/input.py b/minerl_rllib/envs/input.py index 2868f4f..415e45c 100644 --- a/minerl_rllib/envs/input.py +++ b/minerl_rllib/envs/input.py @@ -2,15 +2,62 @@ import gym import numpy as np +from ray.rllib.evaluation import SampleBatchBuilder from ray.rllib.models.preprocessors import get_preprocessor - from ray.rllib.offline import IOContext from ray.rllib.offline.input_reader import InputReader from ray.rllib.policy.sample_batch import SampleBatch from ray.rllib.utils.typing import SampleBatchType from ray.tune.registry import register_input -from minerl_rllib.envs.data import MinerRLDataEnv, wrap_env +from minerl_rllib.envs.data import MinerRLDataEnv +from minerl_rllib.envs.env import wrap_env +from minerl_rllib.envs.utils import patch_data_pipeline + + +def simulate_env_interaction(env, restart=True) -> SampleBatch: + prep = get_preprocessor(env.observation_space)(env.observation_space) + batch_builder = SampleBatchBuilder() + while restart: + for eps_id, trajectory_name in enumerate(env.trajectory_names): + t = 0 + prev_action = None + prev_reward = 0 + done = False + try: + obs = env.reset() + except TypeError: + continue + while not done: + new_obs, reward, done, info = env.step(env.action_space.sample()) + action = info["action"] + action = env.reverse_action(action) + if prev_action is None: + prev_action = np.zeros_like(action) + + batch = { + "t": t, + SampleBatch.EPS_ID: eps_id, + SampleBatch.AGENT_INDEX: eps_id, + SampleBatch.OBS: prep.transform(obs), + SampleBatch.ACTIONS: action, + SampleBatch.ACTION_PROB: 1.0, + SampleBatch.ACTION_LOGP: 0, + SampleBatch.ACTION_DIST_INPUTS: 0, + SampleBatch.REWARDS: reward, + SampleBatch.PREV_ACTIONS: prev_action, + SampleBatch.PREV_REWARDS: prev_reward, + SampleBatch.DONES: done, + SampleBatch.INFOS: {"trajectory_name": trajectory_name}, + SampleBatch.NEXT_OBS: prep.transform(new_obs), + } + + batch_builder.add_values(**batch) + obs = new_obs + prev_action = action + prev_reward = reward + t += 1 + yield batch_builder.build_and_reset() class MineRLInputReader(InputReader): @@ -19,6 +66,8 @@ def __init__(self, ioctx: IOContext = None): print("Input reader initialization success!") import minerl + patch_data_pipeline() + input_config = ioctx.input_config env_name = ioctx.config.get("env") env_config = ioctx.config.get("env_config", {}) @@ -37,6 +86,7 @@ def __init__(self, ioctx: IOContext = None): num_epochs = input_config.get("num_epochs", -1) preload_buffer_size = input_config.get("preload_buffer_size", 2) seed = input_config.get("seed", None) + self.load_complete_episodes = input_config.get("load_complete_episodes", True) self.generator = self.data.batch_iter( batch_size, seq_len, @@ -45,8 +95,8 @@ def __init__(self, ioctx: IOContext = None): seed=seed, ) env = MinerRLDataEnv(self.data) - env = wrap_env(env, env_config) - print(env.observation_space) + env = wrap_env(env, **env_config) + self.episode_generator = simulate_env_interaction(env) self.prep = get_preprocessor(env.observation_space)(env.observation_space) env_ptr = env @@ -89,7 +139,17 @@ def process_reward(self, reward): return reward def next(self) -> SampleBatchType: - obs, action, reward, next_obs, done = self.process_batch(next(self.generator)) + if self.load_complete_episodes: + return self.next_episode_batch() + else: + return self.next_trajectory_batch() + + def next_episode_batch(self) -> SampleBatch: + return next(self.episode_generator) + + def next_trajectory_batch(self) -> SampleBatch: + data = self.process_batch(next(self.generator)) + obs, action, reward, next_obs, done = data[:5] d = { SampleBatch.OBS: obs, SampleBatch.ACTIONS: action, @@ -97,7 +157,6 @@ def next(self) -> SampleBatchType: SampleBatch.REWARDS: reward, SampleBatch.DONES: done, } - # recursive_print(d) return SampleBatch(d) def process_batch(self, batch): From 78ea58cfbc3528227988216e26a31f6598319fe1 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Sun, 5 Sep 2021 19:46:09 -0400 Subject: [PATCH 16/48] update requirements --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a90d487..bc53cb7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ ray[default,tune,rllib]>=1.4.1 -git+https://github.com/minerl-wrappers/minerl-wrappers.git +minerl-wrappers>=0.1.3 scikit-learn>=0.24.2 \ No newline at end of file From 88e5d51619841d9e50319b197df598b627c825a1 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Thu, 9 Sep 2021 00:51:51 -0400 Subject: [PATCH 17/48] add LICENSE.md --- LICENSE.md | 674 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 674 insertions(+) create mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..e72bfdd --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file From bd962e6b0025276c23512e2b009f736b1d229212 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Thu, 9 Sep 2021 00:52:12 -0400 Subject: [PATCH 18/48] add poetry as dependency manager --- poetry.lock | 2672 ++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 30 + 2 files changed, 2702 insertions(+) create mode 100644 poetry.lock create mode 100644 pyproject.toml diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..75926aa --- /dev/null +++ b/poetry.lock @@ -0,0 +1,2672 @@ +[[package]] +name = "aiohttp" +version = "3.7.4.post0" +description = "Async http client/server framework (asyncio)" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +async-timeout = ">=3.0,<4.0" +attrs = ">=17.3.0" +chardet = ">=2.0,<5.0" +multidict = ">=4.5,<7.0" +typing-extensions = ">=3.6.5" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["aiodns", "brotlipy", "cchardet"] + +[[package]] +name = "aiohttp-cors" +version = "0.7.0" +description = "CORS support for aiohttp" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +aiohttp = ">=1.1" + +[[package]] +name = "aioredis" +version = "1.3.1" +description = "asyncio (PEP 3156) Redis support" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +async-timeout = "*" +hiredis = "*" + +[[package]] +name = "appnope" +version = "0.1.2" +description = "Disable App Nap on macOS >= 10.9" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "async-timeout" +version = "3.0.1" +description = "Timeout context manager for asyncio programs" +category = "main" +optional = false +python-versions = ">=3.5.3" + +[[package]] +name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "21.2.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] + +[[package]] +name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "black" +version = "21.8b0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +click = ">=7.1.2" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0,<1" +platformdirs = ">=2" +regex = ">=2020.1.8" +tomli = ">=0.2.6,<2.0.0" +typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\""} +typing-extensions = [ + {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, + {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, +] + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +python2 = ["typed-ast (>=1.4.2)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "blessings" +version = "1.7" +description = "A thin, practical wrapper around terminal coloring, styling, and positioning" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +six = "*" + +[[package]] +name = "bullet" +version = "2.2.0" +description = "Beautiful Python prompts made simple." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "cachetools" +version = "4.2.2" +description = "Extensible memoizing collections and decorators" +category = "main" +optional = false +python-versions = "~=3.5" + +[[package]] +name = "certifi" +version = "2021.5.30" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "chardet" +version = "4.0.0" +description = "Universal encoding detector for Python 2 and 3" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "charset-normalizer" +version = "2.0.4" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.5.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "click" +version = "8.0.1" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} + +[[package]] +name = "cloudpickle" +version = "1.6.0" +description = "Extended pickling support for Python objects" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "coloredlogs" +version = "15.0.1" +description = "Colored terminal output for Python's logging module" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +humanfriendly = ">=9.1" + +[package.extras] +cron = ["capturer (>=2.4)"] + +[[package]] +name = "colorful" +version = "0.5.4" +description = "Terminal string styling done right, in Python." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "cycler" +version = "0.10.0" +description = "Composable style cycles" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + +[[package]] +name = "daemoniker" +version = "0.2.3" +description = "Cross-platform daemonization tools." +category = "main" +optional = false +python-versions = "*" + +[package.extras] +test = ["psutil"] + +[[package]] +name = "decorator" +version = "5.0.9" +description = "Decorators for Humans" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "dill" +version = "0.3.4" +description = "serialize all of python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*" + +[package.extras] +graph = ["objgraph (>=1.7.2)"] + +[[package]] +name = "dm-tree" +version = "0.1.6" +description = "Tree is a library for working with nested data structures." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.12.0" + +[[package]] +name = "filelock" +version = "3.0.12" +description = "A platform independent file lock." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "getch" +version = "1.0" +description = "Does single char input, like C getch/getche" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "google-api-core" +version = "1.31.2" +description = "Google API client core library" +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" + +[package.dependencies] +google-auth = ">=1.25.0,<2.0dev" +googleapis-common-protos = ">=1.6.0,<2.0dev" +packaging = ">=14.3" +protobuf = ">=3.12.0" +pytz = "*" +requests = ">=2.18.0,<3.0.0dev" +six = ">=1.13.0" + +[package.extras] +grpc = ["grpcio (>=1.29.0,<2.0dev)"] +grpcgcp = ["grpcio-gcp (>=0.2.2)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2)"] + +[[package]] +name = "google-auth" +version = "1.35.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.*" + +[package.dependencies] +cachetools = ">=2.0.0,<5.0" +pyasn1-modules = ">=0.2.1" +rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} +six = ">=1.9.0" + +[package.extras] +aiohttp = ["requests (>=2.20.0,<3.0.0dev)", "aiohttp (>=3.6.2,<4.0.0dev)"] +pyopenssl = ["pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] + +[[package]] +name = "googleapis-common-protos" +version = "1.53.0" +description = "Common protobufs used in Google APIs" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +protobuf = ">=3.12.0" + +[package.extras] +grpc = ["grpcio (>=1.0.0)"] + +[[package]] +name = "gpustat" +version = "0.6.0" +description = "An utility to monitor NVIDIA GPU status and usage" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +blessings = ">=1.6" +nvidia-ml-py3 = ">=7.352.0" +psutil = "*" +six = ">=1.7" + +[package.extras] +test = ["mock (>=2.0.0)", "pytest (<5.0)"] + +[[package]] +name = "grpcio" +version = "1.40.0" +description = "HTTP/2-based RPC framework" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.5.2" + +[package.extras] +protobuf = ["grpcio-tools (>=1.40.0)"] + +[[package]] +name = "gym" +version = "0.19.0" +description = "The OpenAI Gym: A toolkit for developing and comparing your reinforcement learning agents." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cloudpickle = ">=1.2.0,<1.7.0" +numpy = ">=1.18.0" + +[package.extras] +all = ["atari-py (==0.2.6)", "box2d-py (>=2.3.5,<2.4.0)", "opencv-python (>=3)", "mujoco_py (>=1.50,<2.0)", "scipy", "imageio", "pyglet (>=1.4.0)"] +atari = ["atari-py (==0.2.6)", "opencv-python (>=3)"] +box2d = ["box2d-py (>=2.3.5,<2.4.0)", "pyglet (>=1.4.0)"] +classic_control = ["pyglet (>=1.4.0)"] +mujoco = ["mujoco_py (>=1.50,<2.0)", "imageio"] +nomujoco = ["atari-py (==0.2.6)", "box2d-py (>=2.3.5,<2.4.0)", "opencv-python (>=3)", "scipy", "pyglet (>=1.4.0)"] +robotics = ["mujoco_py (>=1.50,<2.0)", "imageio"] +toy_text = ["scipy"] + +[[package]] +name = "hiredis" +version = "2.0.0" +description = "Python wrapper for hiredis" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "humanfriendly" +version = "9.2" +description = "Human friendly output for text interfaces using Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +pyreadline = {version = "*", markers = "sys_platform == \"win32\""} + +[[package]] +name = "idna" +version = "3.2" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "imageio" +version = "2.9.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.5" + +[package.dependencies] +numpy = "*" +pillow = "*" + +[package.extras] +ffmpeg = ["imageio-ffmpeg"] +fits = ["astropy"] +full = ["astropy", "gdal", "imageio-ffmpeg", "itk"] +gdal = ["gdal"] +itk = ["itk"] + +[[package]] +name = "importlib-metadata" +version = "4.8.1" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +perf = ["ipython"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] + +[[package]] +name = "inflection" +version = "0.5.1" +description = "A port of Ruby on Rails inflector to Python" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "ipython" +version = "7.27.0" +description = "IPython: Productive Interactive Computing" +category = "main" +optional = false +python-versions = ">=3.7" + +[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 = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" +pygments = "*" +traitlets = ">=4.2" + +[package.extras] +all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.17)", "pygments", "qtconsole", "requests", "testpath"] +doc = ["Sphinx (>=1.3)"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["notebook", "ipywidgets"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.17)"] + +[[package]] +name = "jedi" +version = "0.18.0" +description = "An autocompletion tool for Python that can be used for text editors." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +parso = ">=0.8.0,<0.9.0" + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<6.0.0)"] + +[[package]] +name = "jinja2" +version = "3.0.1" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "joblib" +version = "1.0.1" +description = "Lightweight pipelining with Python functions" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "jsonschema" +version = "3.2.0" +description = "An implementation of JSON Schema validation for Python" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +attrs = ">=17.4.0" +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +pyrsistent = ">=0.14.0" +six = ">=1.11.0" + +[package.extras] +format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] +format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] + +[[package]] +name = "kiwisolver" +version = "1.3.2" +description = "A fast implementation of the Cassowary constraint solver" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "lxml" +version = "4.6.3" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["beautifulsoup4"] +source = ["Cython (>=0.29.7)"] + +[[package]] +name = "lz4" +version = "3.1.3" +description = "LZ4 Bindings for Python" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +docs = ["sphinx (>=1.6.0)", "sphinx-bootstrap-theme"] +flake8 = ["flake8"] +tests = ["pytest (!=3.3.0)", "psutil", "pytest-cov"] + +[[package]] +name = "markupsafe" +version = "2.0.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "matplotlib" +version = "3.4.2" +description = "Python plotting package" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +cycler = ">=0.10" +kiwisolver = ">=1.0.1" +numpy = ">=1.16" +pillow = ">=6.2.0" +pyparsing = ">=2.2.1" +python-dateutil = ">=2.7" + +[[package]] +name = "matplotlib-inline" +version = "0.1.3" +description = "Inline Matplotlib backend for Jupyter" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "minerl" +version = "0.4.1a2" +description = "MineRL environment and data loader for reinforcement learning from human demonstration in Minecraft" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +bullet = "*" +coloredlogs = ">=10.0" +daemoniker = ">=0.2.3" +dill = ">=0.3.1.1" +filelock = "*" +getch = {version = ">=1.0", markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\""} +gym = ">=0.13.1" +inflection = ">=0.3.1" +ipython = ">=7.5.0" +jinja2 = ">=2.11.2" +lxml = ">=4.3.3" +matplotlib = ">=3.2.2" +numpy = ">=1.16.2" +opencv-python = ">=4.1.0.25" +pillow = ">=8.0.0" +psutil = ">=5.6.2" +Pyro4 = ">=4.76" +pytest = "*" +requests = ">=2.20.0" +simple-term-menu = "*" +tqdm = ">=4.32.2" +typing = ">=3.6.6" +xmltodict = "0.12.0" + +[package.extras] +docs = ["sphinx-rtd-theme", "sphinxcontrib-napoleon"] + +[[package]] +name = "minerl-wrappers" +version = "0.1.4" +description = "minerl-wrappers compiles common wrappers and standardizes code for reproducibility in the MineRL environment!" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" + +[package.dependencies] +gym = ">=0.19.0,<0.20.0" +minerl = "0.4.1a2" +numpy = ">=1.21.0,<2.0.0" +opencv-python = ">=4.5.3,<5.0.0" +PyYAML = ">=5.4.1,<6.0.0" + +[[package]] +name = "msgpack" +version = "1.0.2" +description = "MessagePack (de)serializer." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "multidict" +version = "5.1.0" +description = "multidict implementation" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "networkx" +version = "2.6.2" +description = "Python package for creating and manipulating graphs and networks" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +default = ["numpy (>=1.19)", "scipy (>=1.5,!=1.6.1)", "matplotlib (>=3.3)", "pandas (>=1.1)"] +developer = ["black (==21.5b1)", "pre-commit (>=2.12)"] +doc = ["sphinx (>=4.0,<5.0)", "pydata-sphinx-theme (>=0.6,<1.0)", "sphinx-gallery (>=0.9,<1.0)", "numpydoc (>=1.1)", "pillow (>=8.2)", "nb2plots (>=0.6)", "texext (>=0.6.6)"] +extra = ["lxml (>=4.5)", "pygraphviz (>=1.7)", "pydot (>=1.4.1)"] +test = ["pytest (>=6.2)", "pytest-cov (>=2.12)", "codecov (>=2.1)"] + +[[package]] +name = "numpy" +version = "1.21.1" +description = "NumPy is the fundamental package for array computing with Python." +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "nvidia-ml-py3" +version = "7.352.0" +description = "Python Bindings for the NVIDIA Management Library" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "opencensus" +version = "0.7.13" +description = "A stats collection and distributed tracing framework" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +google-api-core = ">=1.0.0,<2.0.0" +opencensus-context = "0.1.2" + +[[package]] +name = "opencensus-context" +version = "0.1.2" +description = "OpenCensus Runtime Context" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "opencv-python" +version = "4.5.3.56" +description = "Wrapper package for OpenCV python bindings." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +numpy = ">=1.21.0" + +[[package]] +name = "packaging" +version = "21.0" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2" + +[[package]] +name = "pandas" +version = "1.3.2" +description = "Powerful data structures for data analysis, time series, and statistics" +category = "main" +optional = false +python-versions = ">=3.7.1" + +[package.dependencies] +numpy = ">=1.17.3" +python-dateutil = ">=2.7.3" +pytz = ">=2017.3" + +[package.extras] +test = ["hypothesis (>=3.58)", "pytest (>=6.0)", "pytest-xdist"] + +[[package]] +name = "parso" +version = "0.8.2" +description = "A Python Parser" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "pathspec" +version = "0.9.0" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "main" +optional = false +python-versions = "*" + +[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 = "*" + +[[package]] +name = "pillow" +version = "8.3.2" +description = "Python Imaging Library (Fork)" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "platformdirs" +version = "2.3.0" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] +test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "prometheus-client" +version = "0.11.0" +description = "Python client for the Prometheus monitoring system." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.20" +description = "Library for building powerful interactive command lines in Python" +category = "main" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "protobuf" +version = "3.17.3" +description = "Protocol Buffers" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.9" + +[[package]] +name = "psutil" +version = "5.8.0" +description = "Cross-platform lib for process and system monitoring in Python." +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "py" +version = "1.10.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "py-spy" +version = "0.3.8" +description = "Sampling profiler for Python programs" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pyasn1" +version = "0.4.8" +description = "ASN.1 types and codecs" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pyasn1-modules" +version = "0.2.8" +description = "A collection of ASN.1-based protocols modules." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.5.0" + +[[package]] +name = "pygments" +version = "2.10.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "pyparsing" +version = "2.4.7" +description = "Python parsing module" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "pyreadline" +version = "2.1" +description = "A python implmementation of GNU readline." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pyro4" +version = "4.80" +description = "distributed object middleware for Python (RPC)" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +serpent = {version = ">=1.27", markers = "python_version >= \"3.2\""} + +[[package]] +name = "pyrsistent" +version = "0.18.0" +description = "Persistent/Functional/Immutable data structures" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pytest" +version = "6.2.5" +description = "pytest: simple powerful testing with Python" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +toml = "*" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[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" + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytz" +version = "2021.1" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pywavelets" +version = "1.1.1" +description = "PyWavelets, wavelet transform module" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +numpy = ">=1.13.3" + +[[package]] +name = "pyyaml" +version = "5.4.1" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[[package]] +name = "ray" +version = "2.0.0.dev0" +description = "Ray provides a simple, universal API for building distributed applications." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +aiohttp = {version = "*", optional = true, markers = "extra == \"default\""} +aiohttp-cors = {version = "*", optional = true, markers = "extra == \"default\""} +aioredis = {version = "<2", optional = true, markers = "extra == \"default\""} +attrs = "*" +click = ">=7.0" +colorful = {version = "*", optional = true, markers = "extra == \"default\""} +dm-tree = {version = "*", optional = true, markers = "extra == \"rllib\""} +filelock = "*" +gpustat = {version = "*", optional = true, markers = "extra == \"default\""} +grpcio = ">=1.28.1" +gym = {version = "*", optional = true, markers = "extra == \"rllib\""} +jsonschema = {version = "*", optional = true, markers = "extra == \"default\""} +lz4 = {version = "*", optional = true, markers = "extra == \"rllib\""} +matplotlib = {version = "!=3.4.3", optional = true, markers = "extra == \"rllib\""} +msgpack = ">=1.0.0,<2.0.0" +numpy = [ + {version = ">=1.16", markers = "python_version < \"3.9\""}, + {version = ">=1.19.3", markers = "python_version >= \"3.9\""}, +] +opencensus = {version = "*", optional = true, markers = "extra == \"default\""} +pandas = {version = "*", optional = true, markers = "extra == \"rllib\""} +prometheus-client = {version = ">=0.7.1", optional = true, markers = "extra == \"default\""} +protobuf = ">=3.15.3" +py-spy = {version = ">=0.2.0", optional = true, markers = "extra == \"default\""} +pyyaml = "*" +redis = ">=3.5.0" +requests = {version = "*", optional = true, markers = "extra == \"default\""} +scikit-image = {version = "*", optional = true, markers = "extra == \"rllib\""} +scipy = {version = "*", optional = true, markers = "extra == \"rllib\""} +tabulate = {version = "*", optional = true, markers = "extra == \"rllib\""} +tensorboardX = {version = ">=1.9", optional = true, markers = "extra == \"rllib\""} + +[package.extras] +all = ["opentelemetry-exporter-otlp (==1.1.0)", "kubernetes", "lz4", "scikit-image", "aioredis (<2)", "prometheus-client (>=0.7.1)", "aiohttp-cors", "opentelemetry-api (==1.1.0)", "uvicorn", "tabulate", "pandas", "py-spy (>=0.2.0)", "starlette", "fastapi", "opencensus", "dm-tree", "scipy", "urllib3", "tensorboardX (>=1.9)", "colorful", "ray-cpp (==2.0.0.dev0)", "kopf", "aiohttp", "pyyaml", "jsonschema", "matplotlib (!=3.4.3)", "gym", "requests", "gpustat", "opentelemetry-sdk (==1.1.0)"] +cpp = ["ray-cpp (==2.0.0.dev0)"] +default = ["aiohttp", "aiohttp-cors", "aioredis (<2)", "colorful", "py-spy (>=0.2.0)", "jsonschema", "requests", "gpustat", "opencensus", "prometheus-client (>=0.7.1)"] +k8s = ["kubernetes", "urllib3", "kopf"] +observability = ["opentelemetry-api (==1.1.0)", "opentelemetry-sdk (==1.1.0)", "opentelemetry-exporter-otlp (==1.1.0)"] +rllib = ["pandas", "tabulate", "tensorboardX (>=1.9)", "requests", "dm-tree", "gym", "lz4", "matplotlib (!=3.4.3)", "scikit-image", "pyyaml", "scipy"] +serve = ["uvicorn", "requests", "starlette", "fastapi"] +tune = ["pandas", "tabulate", "tensorboardX (>=1.9)", "requests"] + +[package.source] +type = "url" +url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/cd22a7d1bbf38f66aa8b735459319ff24f102a20/ray-2.0.0.dev0-cp39-cp39-manylinux2014_x86_64.whl" +[[package]] +name = "redis" +version = "3.5.3" +description = "Python client for Redis key-value store" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.extras] +hiredis = ["hiredis (>=0.1.3)"] + +[[package]] +name = "regex" +version = "2021.8.28" +description = "Alternative regular expression module, to replace re." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "requests" +version = "2.26.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] + +[[package]] +name = "rsa" +version = "4.7.2" +description = "Pure-Python RSA implementation" +category = "main" +optional = false +python-versions = ">=3.5, <4" + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "scikit-image" +version = "0.18.3" +description = "Image processing in Python" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +imageio = ">=2.3.0" +matplotlib = ">=2.0.0,<3.0.0 || >3.0.0" +networkx = ">=2.0" +numpy = ">=1.16.5" +pillow = ">=4.3.0,<7.1.0 || >7.1.0,<7.1.1 || >7.1.1" +PyWavelets = ">=1.1.1" +scipy = ">=1.0.1" +tifffile = ">=2019.7.26" + +[package.extras] +data = ["pooch (>=1.3.0)"] +docs = ["sphinx (>=1.8,<=2.4.4)", "sphinx-gallery (>=0.7.0,!=0.8.0)", "numpydoc (>=1.0)", "sphinx-copybutton", "pytest-runner", "scikit-learn", "matplotlib (>=3.0.1)", "dask[array] (>=0.15.0,!=2.17.0)", "cloudpickle (>=0.2.1)", "pandas (>=0.23.0)", "seaborn (>=0.7.1)", "pooch (>=1.3.0)", "tifffile (>=2020.5.30)", "myst-parser", "ipywidgets", "plotly (>=4.10.0)"] +optional = ["simpleitk", "astropy (>=3.1.2)", "qtpy", "pyamg", "dask[array] (>=1.0.0,!=2.17.0)", "cloudpickle (>=0.2.1)", "pooch (>=1.3.0)"] +test = ["pytest (>=5.2.0)", "pytest-cov (>=2.7.0)", "pytest-localserver", "pytest-faulthandler", "flake8", "codecov", "pooch (>=1.3.0)"] + +[[package]] +name = "scikit-learn" +version = "0.24.2" +description = "A set of python modules for machine learning and data mining" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +joblib = ">=0.11" +numpy = ">=1.13.3" +scipy = ">=0.19.1" +threadpoolctl = ">=2.0.0" + +[package.extras] +benchmark = ["matplotlib (>=2.1.1)", "pandas (>=0.25.0)", "memory-profiler (>=0.57.0)"] +docs = ["matplotlib (>=2.1.1)", "scikit-image (>=0.13)", "pandas (>=0.25.0)", "seaborn (>=0.9.0)", "memory-profiler (>=0.57.0)", "sphinx (>=3.2.0)", "sphinx-gallery (>=0.7.0)", "numpydoc (>=1.0.0)", "Pillow (>=7.1.2)", "sphinx-prompt (>=1.3.0)"] +examples = ["matplotlib (>=2.1.1)", "scikit-image (>=0.13)", "pandas (>=0.25.0)", "seaborn (>=0.9.0)"] +tests = ["matplotlib (>=2.1.1)", "scikit-image (>=0.13)", "pandas (>=0.25.0)", "pytest (>=5.0.1)", "pytest-cov (>=2.9.0)", "flake8 (>=3.8.2)", "mypy (>=0.770)", "pyamg (>=4.0.0)"] + +[[package]] +name = "scipy" +version = "1.6.1" +description = "SciPy: Scientific Library for Python" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +numpy = ">=1.16.5" + +[[package]] +name = "serpent" +version = "1.40" +description = "Serialization based on ast.literal_eval" +category = "main" +optional = false +python-versions = ">=3.2" + +[[package]] +name = "simple-term-menu" +version = "1.4.1" +description = "A Python package which creates simple interactive menus on the command line." +category = "main" +optional = false +python-versions = "~=3.5" + +[[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.*" + +[[package]] +name = "tabulate" +version = "0.8.9" +description = "Pretty-print tabular data" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +widechars = ["wcwidth"] + +[[package]] +name = "tensorboardx" +version = "2.4" +description = "TensorBoardX lets you watch Tensors Flow without Tensorflow" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +numpy = "*" +protobuf = ">=3.8.0" + +[[package]] +name = "threadpoolctl" +version = "2.2.0" +description = "threadpoolctl" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "tifffile" +version = "2021.8.30" +description = "Read and write TIFF files" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +numpy = ">=1.15.1" + +[package.extras] +all = ["imagecodecs (>=2021.7.30)", "matplotlib (>=3.2)", "lxml"] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "tomli" +version = "1.2.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "tqdm" +version = "4.62.2" +description = "Fast, Extensible Progress Meter" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] +telegram = ["requests"] + +[[package]] +name = "traitlets" +version = "5.1.0" +description = "Traitlets Python configuration system" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "typed-ast" +version = "1.4.3" +description = "a fork of Python 2 and 3 ast modules with type comment support" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "typing" +version = "3.7.4.3" +description = "Type Hints for Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "typing-extensions" +version = "3.10.0.2" +description = "Backported and Experimental Type Hints for Python 3.5+" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "urllib3" +version = "1.26.6" +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.*, <4" + +[package.extras] +brotli = ["brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "wcwidth" +version = "0.2.5" +description = "Measures the displayed width of unicode strings in a terminal" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "xmltodict" +version = "0.12.0" +description = "Makes working with XML feel like you are working with JSON" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "yarl" +version = "1.6.3" +description = "Yet another URL library" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" +typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} + +[[package]] +name = "zipp" +version = "3.5.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.7.1" +content-hash = "77e59ba63c88b601e79bddfd9d9675b77367f6acbff2db6e199ab2815dbd6065" + +[metadata.files] +aiohttp = [ + {file = "aiohttp-3.7.4.post0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:3cf75f7cdc2397ed4442594b935a11ed5569961333d49b7539ea741be2cc79d5"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4b302b45040890cea949ad092479e01ba25911a15e648429c7c5aae9650c67a8"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:fe60131d21b31fd1a14bd43e6bb88256f69dfc3188b3a89d736d6c71ed43ec95"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:393f389841e8f2dfc86f774ad22f00923fdee66d238af89b70ea314c4aefd290"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:c6e9dcb4cb338d91a73f178d866d051efe7c62a7166653a91e7d9fb18274058f"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:5df68496d19f849921f05f14f31bd6ef53ad4b00245da3195048c69934521809"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:0563c1b3826945eecd62186f3f5c7d31abb7391fedc893b7e2b26303b5a9f3fe"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-win32.whl", hash = "sha256:3d78619672183be860b96ed96f533046ec97ca067fd46ac1f6a09cd9b7484287"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-win_amd64.whl", hash = "sha256:f705e12750171c0ab4ef2a3c76b9a4024a62c4103e3a55dd6f99265b9bc6fcfc"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:230a8f7e24298dea47659251abc0fd8b3c4e38a664c59d4b89cca7f6c09c9e87"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2e19413bf84934d651344783c9f5e22dee452e251cfd220ebadbed2d9931dbf0"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e4b2b334e68b18ac9817d828ba44d8fcb391f6acb398bcc5062b14b2cbeac970"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:d012ad7911653a906425d8473a1465caa9f8dea7fcf07b6d870397b774ea7c0f"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:40eced07f07a9e60e825554a31f923e8d3997cfc7fb31dbc1328c70826e04cde"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:209b4a8ee987eccc91e2bd3ac36adee0e53a5970b8ac52c273f7f8fd4872c94c"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:14762875b22d0055f05d12abc7f7d61d5fd4fe4642ce1a249abdf8c700bf1fd8"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-win32.whl", hash = "sha256:7615dab56bb07bff74bc865307aeb89a8bfd9941d2ef9d817b9436da3a0ea54f"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-win_amd64.whl", hash = "sha256:d9e13b33afd39ddeb377eff2c1c4f00544e191e1d1dee5b6c51ddee8ea6f0cf5"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:547da6cacac20666422d4882cfcd51298d45f7ccb60a04ec27424d2f36ba3eaf"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:af9aa9ef5ba1fd5b8c948bb11f44891968ab30356d65fd0cc6707d989cd521df"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:64322071e046020e8797117b3658b9c2f80e3267daec409b350b6a7a05041213"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bb437315738aa441251214dad17428cafda9cdc9729499f1d6001748e1d432f4"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:e54962802d4b8b18b6207d4a927032826af39395a3bd9196a5af43fc4e60b009"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:a00bb73540af068ca7390e636c01cbc4f644961896fa9363154ff43fd37af2f5"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:79ebfc238612123a713a457d92afb4096e2148be17df6c50fb9bf7a81c2f8013"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-win32.whl", hash = "sha256:515dfef7f869a0feb2afee66b957cc7bbe9ad0cdee45aec7fdc623f4ecd4fb16"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-win_amd64.whl", hash = "sha256:114b281e4d68302a324dd33abb04778e8557d88947875cbf4e842c2c01a030c5"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:7b18b97cf8ee5452fa5f4e3af95d01d84d86d32c5e2bfa260cf041749d66360b"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:15492a6368d985b76a2a5fdd2166cddfea5d24e69eefed4630cbaae5c81d89bd"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bdb230b4943891321e06fc7def63c7aace16095be7d9cf3b1e01be2f10fba439"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:cffe3ab27871bc3ea47df5d8f7013945712c46a3cc5a95b6bee15887f1675c22"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:f881853d2643a29e643609da57b96d5f9c9b93f62429dcc1cbb413c7d07f0e1a"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:a5ca29ee66f8343ed336816c553e82d6cade48a3ad702b9ffa6125d187e2dedb"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:17c073de315745a1510393a96e680d20af8e67e324f70b42accbd4cb3315c9fb"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-win32.whl", hash = "sha256:932bb1ea39a54e9ea27fc9232163059a0b8855256f4052e776357ad9add6f1c9"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-win_amd64.whl", hash = "sha256:02f46fc0e3c5ac58b80d4d56eb0a7c7d97fcef69ace9326289fb9f1955e65cfe"}, + {file = "aiohttp-3.7.4.post0.tar.gz", hash = "sha256:493d3299ebe5f5a7c66b9819eacdcfbbaaf1a8e84911ddffcdc48888497afecf"}, +] +aiohttp-cors = [ + {file = "aiohttp-cors-0.7.0.tar.gz", hash = "sha256:4d39c6d7100fd9764ed1caf8cebf0eb01bf5e3f24e2e073fda6234bc48b19f5d"}, + {file = "aiohttp_cors-0.7.0-py3-none-any.whl", hash = "sha256:0451ba59fdf6909d0e2cd21e4c0a43752bc0703d33fc78ae94d9d9321710193e"}, +] +aioredis = [ + {file = "aioredis-1.3.1-py3-none-any.whl", hash = "sha256:b61808d7e97b7cd5a92ed574937a079c9387fdadd22bfbfa7ad2fd319ecc26e3"}, + {file = "aioredis-1.3.1.tar.gz", hash = "sha256:15f8af30b044c771aee6787e5ec24694c048184c7b9e54c3b60c750a4b93273a"}, +] +appnope = [ + {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, + {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, +] +async-timeout = [ + {file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"}, + {file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] +attrs = [ + {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, + {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, +] +backcall = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] +black = [ + {file = "black-21.8b0-py3-none-any.whl", hash = "sha256:2a0f9a8c2b2a60dbcf1ccb058842fb22bdbbcb2f32c6cc02d9578f90b92ce8b7"}, + {file = "black-21.8b0.tar.gz", hash = "sha256:570608d28aa3af1792b98c4a337dbac6367877b47b12b88ab42095cfc1a627c2"}, +] +blessings = [ + {file = "blessings-1.7-py2-none-any.whl", hash = "sha256:caad5211e7ba5afe04367cdd4cfc68fa886e2e08f6f35e76b7387d2109ccea6e"}, + {file = "blessings-1.7-py3-none-any.whl", hash = "sha256:b1fdd7e7a675295630f9ae71527a8ebc10bfefa236b3d6aa4932ee4462c17ba3"}, + {file = "blessings-1.7.tar.gz", hash = "sha256:98e5854d805f50a5b58ac2333411b0482516a8210f23f43308baeb58d77c157d"}, +] +bullet = [ + {file = "bullet-2.2.0-py3-none-any.whl", hash = "sha256:d22528deb914ce3ff20a4a000fa5ba37179697f384a0748f90691de8a74cf006"}, + {file = "bullet-2.2.0.tar.gz", hash = "sha256:dfa0fa81810ad1a9e688815ca04f24af87ff5cdbe803b42fa634b1f50fc9d887"}, +] +cachetools = [ + {file = "cachetools-4.2.2-py3-none-any.whl", hash = "sha256:2cc0b89715337ab6dbba85b5b50effe2b0c74e035d83ee8ed637cf52f12ae001"}, + {file = "cachetools-4.2.2.tar.gz", hash = "sha256:61b5ed1e22a0924aed1d23b478f37e8d52549ff8a961de2909c69bf950020cff"}, +] +certifi = [ + {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, + {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, +] +chardet = [ + {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, + {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.0.4.tar.gz", hash = "sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3"}, + {file = "charset_normalizer-2.0.4-py3-none-any.whl", hash = "sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b"}, +] +click = [ + {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, + {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"}, +] +cloudpickle = [ + {file = "cloudpickle-1.6.0-py3-none-any.whl", hash = "sha256:3a32d0eb0bc6f4d0c57fbc4f3e3780f7a81e6fee0fa935072884d58ae8e1cc7c"}, + {file = "cloudpickle-1.6.0.tar.gz", hash = "sha256:9bc994f9e9447593bd0a45371f0e7ac7333710fcf64a4eb9834bf149f4ef2f32"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +coloredlogs = [ + {file = "coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934"}, + {file = "coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0"}, +] +colorful = [ + {file = "colorful-0.5.4-py2.py3-none-any.whl", hash = "sha256:8d264b52a39aae4c0ba3e2a46afbaec81b0559a99be0d2cfe2aba4cf94531348"}, + {file = "colorful-0.5.4.tar.gz", hash = "sha256:86848ad4e2eda60cd2519d8698945d22f6f6551e23e95f3f14dfbb60997807ea"}, +] +cycler = [ + {file = "cycler-0.10.0-py2.py3-none-any.whl", hash = "sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d"}, + {file = "cycler-0.10.0.tar.gz", hash = "sha256:cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8"}, +] +daemoniker = [ + {file = "daemoniker-0.2.3-py3-none-any.whl", hash = "sha256:72df5fb977b7951a1a48039dad349a06d9326e700f032f2e0114ad9643b93e98"}, + {file = "daemoniker-0.2.3.tar.gz", hash = "sha256:d9b62c8d75227b3da88c0ca22b82e19d88d32dade4ffa838427235e0cdd5e578"}, +] +decorator = [ + {file = "decorator-5.0.9-py3-none-any.whl", hash = "sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323"}, + {file = "decorator-5.0.9.tar.gz", hash = "sha256:72ecfba4320a893c53f9706bebb2d55c270c1e51a28789361aa93e4a21319ed5"}, +] +dill = [ + {file = "dill-0.3.4-py2.py3-none-any.whl", hash = "sha256:7e40e4a70304fd9ceab3535d36e58791d9c4a776b38ec7f7ec9afc8d3dca4d4f"}, + {file = "dill-0.3.4.zip", hash = "sha256:9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675"}, +] +dm-tree = [ + {file = "dm-tree-0.1.6.tar.gz", hash = "sha256:6776404b23b4522c01012ffb314632aba092c9541577004ab153321e87da439a"}, + {file = "dm_tree-0.1.6-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:a8814a5c838f79e9db22a51369c74f4d92e7f1485ec55d7f665ae4d98478cb4f"}, + {file = "dm_tree-0.1.6-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:e28ba91d3d97230b831716db401ce116ae5c7dcd025161ac16ecb8bd5c870a85"}, + {file = "dm_tree-0.1.6-cp36-cp36m-manylinux_2_24_x86_64.whl", hash = "sha256:603392f1a7818a4f43a7033c2061ae7c2085a4a728171b0bbca76bd107fcdfb0"}, + {file = "dm_tree-0.1.6-cp36-cp36m-win_amd64.whl", hash = "sha256:2c91e472aab5c5e083c12d0a9396bbd7695031348721f709a9c6f2449e53dab6"}, + {file = "dm_tree-0.1.6-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:889eae86e0d2d4b8da8eb2edc7186b45a5f92e00c8dd77f2a5c8422f03db18f4"}, + {file = "dm_tree-0.1.6-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:2fa9c6e56cbd22cdffec42dc8b20464872b07c4535d8effc537fe0d31930b084"}, + {file = "dm_tree-0.1.6-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:c4e8d868fc9a75cbdb67e78069b33e62a4c69bc182c1d2adc29ab08e283912d8"}, + {file = "dm_tree-0.1.6-cp37-cp37m-win_amd64.whl", hash = "sha256:6d5f64d89f657b11f429e13b1378c8cfbe4baef50e7ab31f3689bfe0cf4a2508"}, + {file = "dm_tree-0.1.6-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8d59c5098456667b28c607110537c86c25cbd0ee455f21d033c60ef2d7f48d81"}, + {file = "dm_tree-0.1.6-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:f3bec40e658fe7546c3a56849c743ac9a498e620b3236e82e171801938a56679"}, + {file = "dm_tree-0.1.6-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:e87d06478356a2d92c3940dedebcd92a14ad37fba10ebb1839c8140693b83c0a"}, + {file = "dm_tree-0.1.6-cp38-cp38-win_amd64.whl", hash = "sha256:02ffa673f20b1756dcf085ef2c354bc59416d843b384c7b71c421f873ffc36c0"}, + {file = "dm_tree-0.1.6-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:affc7a6d29442a143c60efb2f03bcb95424d4fe6168f3d31de892c1e601fa0e6"}, + {file = "dm_tree-0.1.6-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:bd347c74254ba320d57b0e102558c1189e3b4ae1bae952f9aef156b5914567c8"}, + {file = "dm_tree-0.1.6-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:8425454192e954692d9a1e0f7b374b3b7030916b17b6055951dc17d58b6fe1b8"}, + {file = "dm_tree-0.1.6-cp39-cp39-win_amd64.whl", hash = "sha256:5269183f80f1ae37543a2a30a8f78e4b0460d5da74fb5ac42dc8a476ef8d707e"}, +] +filelock = [ + {file = "filelock-3.0.12-py3-none-any.whl", hash = "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836"}, + {file = "filelock-3.0.12.tar.gz", hash = "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59"}, +] +getch = [ + {file = "getch-1.0-python2.tar.gz", hash = "sha256:be451438f7a2b389f96753aea39b6ed2540a390f1b9a12badcbc110cf9a5ce7f"}, + {file = "getch-1.0.tar.gz", hash = "sha256:a6c22717c10051ce65b8fb7bddb171af705b1175e694a73be956990f6089d8b1"}, +] +google-api-core = [ + {file = "google-api-core-1.31.2.tar.gz", hash = "sha256:8500aded318fdb235130bf183c726a05a9cb7c4b09c266bd5119b86cdb8a4d10"}, + {file = "google_api_core-1.31.2-py2.py3-none-any.whl", hash = "sha256:384459a0dc98c1c8cd90b28dc5800b8705e0275a673a7144a513ae80fc77950b"}, +] +google-auth = [ + {file = "google-auth-1.35.0.tar.gz", hash = "sha256:b7033be9028c188ee30200b204ea00ed82ea1162e8ac1df4aa6ded19a191d88e"}, + {file = "google_auth-1.35.0-py2.py3-none-any.whl", hash = "sha256:997516b42ecb5b63e8d80f5632c1a61dddf41d2a4c2748057837e06e00014258"}, +] +googleapis-common-protos = [ + {file = "googleapis-common-protos-1.53.0.tar.gz", hash = "sha256:a88ee8903aa0a81f6c3cec2d5cf62d3c8aa67c06439b0496b49048fb1854ebf4"}, + {file = "googleapis_common_protos-1.53.0-py2.py3-none-any.whl", hash = "sha256:f6d561ab8fb16b30020b940e2dd01cd80082f4762fa9f3ee670f4419b4b8dbd0"}, +] +gpustat = [ + {file = "gpustat-0.6.0.tar.gz", hash = "sha256:f69135080b2668b662822633312c2180002c10111597af9631bb02e042755b6c"}, +] +grpcio = [ + {file = "grpcio-1.40.0-cp35-cp35m-macosx_10_10_intel.whl", hash = "sha256:6f8f581787e739945e6cda101f312ea8a7e7082bdbb4993901eb828da6a49092"}, + {file = "grpcio-1.40.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:a4389e26a8f9338ca91effdc5436dfec67d6ecd296368dba115799ae8f8e5bdb"}, + {file = "grpcio-1.40.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:fb06708e3d173e387326abcd5182d52beb60e049db5c3d317bd85509e938afdc"}, + {file = "grpcio-1.40.0-cp35-cp35m-manylinux2014_i686.whl", hash = "sha256:f06e07161c21391682bfcac93a181a037a8aa3d561546690e9d0501189729aac"}, + {file = "grpcio-1.40.0-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:5ff0dcf66315f3f00e1a8eb7244c6a49bdb0cc59bef4fb65b9db8adbd78e6acb"}, + {file = "grpcio-1.40.0-cp35-cp35m-win32.whl", hash = "sha256:ba9dd97ea1738be3e81d34e6bab8ff91a0b80668a4ec81454b283d3c828cebde"}, + {file = "grpcio-1.40.0-cp35-cp35m-win_amd64.whl", hash = "sha256:e12d776a240fee3ebd002519c02d165d94ec636d3fe3d6185b361bfc9a2d3106"}, + {file = "grpcio-1.40.0-cp36-cp36m-linux_armv7l.whl", hash = "sha256:6b9b432f5665dfc802187384693b6338f05c7fc3707ebf003a89bd5132074e27"}, + {file = "grpcio-1.40.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:886d056f5101ac513f4aefe4d21a816d98ee3f9a8e77fc3bcb4ae1a3a24efe26"}, + {file = "grpcio-1.40.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:b1b34e5a6f1285d1576099c663dae28c07b474015ed21e35a243aff66a0c2aed"}, + {file = "grpcio-1.40.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:17ed13d43450ef9d1f9b78cc932bcf42844ca302235b93026dfd07fb5208d146"}, + {file = "grpcio-1.40.0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:e19de138199502d575fcec5cf68ae48815a6efe7e5c0d0b8c97eba8c77ae9f0e"}, + {file = "grpcio-1.40.0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:a812164ceb48cb62c3217bd6245274e693c624cc2ac0c1b11b4cea96dab054dd"}, + {file = "grpcio-1.40.0-cp36-cp36m-manylinux_2_24_aarch64.whl", hash = "sha256:eedc8c3514c10b6f11c6f406877e424ca29610883b97bb97e33b1dd2a9077f6c"}, + {file = "grpcio-1.40.0-cp36-cp36m-win32.whl", hash = "sha256:1708a0ba90c798b4313f541ffbcc25ed47e790adaafb02111204362723dabef0"}, + {file = "grpcio-1.40.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d760a66c9773780837915be85a39d2cd4ab42ef32657c5f1d28475e23ab709fc"}, + {file = "grpcio-1.40.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:8a35b5f87247c893b01abf2f4f7493a18c2c5bf8eb3923b8dd1654d8377aa1a7"}, + {file = "grpcio-1.40.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:45704b9b5b85f9bcb027f90f2563d11d995c1b870a9ee4b3766f6c7ff6fc3505"}, + {file = "grpcio-1.40.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:4967949071c9e435f9565ec2f49700cebeda54836a04710fe21f7be028c0125a"}, + {file = "grpcio-1.40.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:1f9ccc9f5c0d5084d1cd917a0b5ff0142a8d269d0755592d751f8ce9e7d3d7f1"}, + {file = "grpcio-1.40.0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:5729ca9540049f52c2e608ca110048cfabab3aeaa0d9f425361d9f8ba8506cac"}, + {file = "grpcio-1.40.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:edddc849bed3c5dfe215a9f9532a9bd9f670b57d7b8af603be80148b4c69e9a8"}, + {file = "grpcio-1.40.0-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:49155dfdf725c0862c428039123066b25ce61bd38ce50a21ce325f1735aac1bd"}, + {file = "grpcio-1.40.0-cp37-cp37m-win32.whl", hash = "sha256:913916823efa2e487b2ee9735b7759801d97fd1974bacdb1900e3bbd17f7d508"}, + {file = "grpcio-1.40.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24277aab99c346ca36a1aa8589a0624e19a8e6f2b74c83f538f7bb1cc5ee8dbc"}, + {file = "grpcio-1.40.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:a66a30513d2e080790244a7ac3d7a3f45001f936c5c2c9613e41e2a5d7a11794"}, + {file = "grpcio-1.40.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:e2367f2b18dd4ba64cdcd9f626a920f9ec2e8228630839dc8f4a424d461137ea"}, + {file = "grpcio-1.40.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:27dee6dcd1c04c4e9ceea49f6143003569292209d2c24ca100166660805e2440"}, + {file = "grpcio-1.40.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d271e52038dec0db7c39ad9303442d6087c55e09b900e2931b86e837cf0cbc2e"}, + {file = "grpcio-1.40.0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:41e250ec7cd7523bf49c815b5509d5821728c26fac33681d4b0d1f5f34f59f06"}, + {file = "grpcio-1.40.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:33dc4259fecb96e6eac20f760656b911bcb1616aa3e58b3a1d2f125714a2f5d3"}, + {file = "grpcio-1.40.0-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:72b7b8075ee822dad4b39c150d73674c1398503d389e38981e9e35a894c476de"}, + {file = "grpcio-1.40.0-cp38-cp38-win32.whl", hash = "sha256:a93490e6eff5fce3748fb2757cb4273dc21eb1b56732b8c9640fd82c1997b215"}, + {file = "grpcio-1.40.0-cp38-cp38-win_amd64.whl", hash = "sha256:d3b4b41eb0148fca3e6e6fc61d1332a7e8e7c4074fb0d1543f0b255d7f5f1588"}, + {file = "grpcio-1.40.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:fbe3b66bfa2c2f94535f6063f6db62b5b150d55a120f2f9e1175d3087429c4d9"}, + {file = "grpcio-1.40.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:ecfd80e8ea03c46b3ea7ed37d2040fcbfe739004b9e4329b8b602d06ac6fb113"}, + {file = "grpcio-1.40.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:d487b4daf84a14741ca1dc1c061ffb11df49d13702cd169b5837fafb5e84d9c0"}, + {file = "grpcio-1.40.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c26de909cfd54bacdb7e68532a1591a128486af47ee3a5f828df9aa2165ae457"}, + {file = "grpcio-1.40.0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:1d9eabe2eb2f78208f9ae67a591f73b024488449d4e0a5b27c7fca2d6901a2d4"}, + {file = "grpcio-1.40.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:4c2baa438f51152c9b7d0835ff711add0b4bc5056c0f5df581a6112153010696"}, + {file = "grpcio-1.40.0-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:bf114be0023b145f7101f392a344692c1efd6de38a610c54a65ed3cba035e669"}, + {file = "grpcio-1.40.0-cp39-cp39-win32.whl", hash = "sha256:5f6d6b638698fa6decf7f040819aade677b583eaa21b43366232cb254a2bbac8"}, + {file = "grpcio-1.40.0-cp39-cp39-win_amd64.whl", hash = "sha256:005fe14e67291498989da67d454d805be31d57a988af28ed3a2a0a7cabb05c53"}, + {file = "grpcio-1.40.0.tar.gz", hash = "sha256:3d172158fe886a2604db1b6e17c2de2ab465fe0fe36aba2ec810ca8441cefe3a"}, +] +gym = [ + {file = "gym-0.19.0.tar.gz", hash = "sha256:940069b983806e1ccc400fa6d47b4e34e462accf6a4fb0acb0a5e509ad0f502d"}, +] +hiredis = [ + {file = "hiredis-2.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b4c8b0bc5841e578d5fb32a16e0c305359b987b850a06964bd5a62739d688048"}, + {file = "hiredis-2.0.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0adea425b764a08270820531ec2218d0508f8ae15a448568109ffcae050fee26"}, + {file = "hiredis-2.0.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:3d55e36715ff06cdc0ab62f9591607c4324297b6b6ce5b58cb9928b3defe30ea"}, + {file = "hiredis-2.0.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:5d2a48c80cf5a338d58aae3c16872f4d452345e18350143b3bf7216d33ba7b99"}, + {file = "hiredis-2.0.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:240ce6dc19835971f38caf94b5738092cb1e641f8150a9ef9251b7825506cb05"}, + {file = "hiredis-2.0.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:5dc7a94bb11096bc4bffd41a3c4f2b958257085c01522aa81140c68b8bf1630a"}, + {file = "hiredis-2.0.0-cp36-cp36m-win32.whl", hash = "sha256:139705ce59d94eef2ceae9fd2ad58710b02aee91e7fa0ccb485665ca0ecbec63"}, + {file = "hiredis-2.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:c39c46d9e44447181cd502a35aad2bb178dbf1b1f86cf4db639d7b9614f837c6"}, + {file = "hiredis-2.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:adf4dd19d8875ac147bf926c727215a0faf21490b22c053db464e0bf0deb0485"}, + {file = "hiredis-2.0.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0f41827028901814c709e744060843c77e78a3aca1e0d6875d2562372fcb405a"}, + {file = "hiredis-2.0.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:508999bec4422e646b05c95c598b64bdbef1edf0d2b715450a078ba21b385bcc"}, + {file = "hiredis-2.0.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:0d5109337e1db373a892fdcf78eb145ffb6bbd66bb51989ec36117b9f7f9b579"}, + {file = "hiredis-2.0.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:04026461eae67fdefa1949b7332e488224eac9e8f2b5c58c98b54d29af22093e"}, + {file = "hiredis-2.0.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:a00514362df15af041cc06e97aebabf2895e0a7c42c83c21894be12b84402d79"}, + {file = "hiredis-2.0.0-cp37-cp37m-win32.whl", hash = "sha256:09004096e953d7ebd508cded79f6b21e05dff5d7361771f59269425108e703bc"}, + {file = "hiredis-2.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f8196f739092a78e4f6b1b2172679ed3343c39c61a3e9d722ce6fcf1dac2824a"}, + {file = "hiredis-2.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:294a6697dfa41a8cba4c365dd3715abc54d29a86a40ec6405d677ca853307cfb"}, + {file = "hiredis-2.0.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:3dddf681284fe16d047d3ad37415b2e9ccdc6c8986c8062dbe51ab9a358b50a5"}, + {file = "hiredis-2.0.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:dcef843f8de4e2ff5e35e96ec2a4abbdf403bd0f732ead127bd27e51f38ac298"}, + {file = "hiredis-2.0.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:87c7c10d186f1743a8fd6a971ab6525d60abd5d5d200f31e073cd5e94d7e7a9d"}, + {file = "hiredis-2.0.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:7f0055f1809b911ab347a25d786deff5e10e9cf083c3c3fd2dd04e8612e8d9db"}, + {file = "hiredis-2.0.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:11d119507bb54e81f375e638225a2c057dda748f2b1deef05c2b1a5d42686048"}, + {file = "hiredis-2.0.0-cp38-cp38-win32.whl", hash = "sha256:7492af15f71f75ee93d2a618ca53fea8be85e7b625e323315169977fae752426"}, + {file = "hiredis-2.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:65d653df249a2f95673976e4e9dd7ce10de61cfc6e64fa7eeaa6891a9559c581"}, + {file = "hiredis-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae8427a5e9062ba66fc2c62fb19a72276cf12c780e8db2b0956ea909c48acff5"}, + {file = "hiredis-2.0.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:3f5f7e3a4ab824e3de1e1700f05ad76ee465f5f11f5db61c4b297ec29e692b2e"}, + {file = "hiredis-2.0.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:e3447d9e074abf0e3cd85aef8131e01ab93f9f0e86654db7ac8a3f73c63706ce"}, + {file = "hiredis-2.0.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:8b42c0dc927b8d7c0eb59f97e6e34408e53bc489f9f90e66e568f329bff3e443"}, + {file = "hiredis-2.0.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:b84f29971f0ad4adaee391c6364e6f780d5aae7e9226d41964b26b49376071d0"}, + {file = "hiredis-2.0.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:0b39ec237459922c6544d071cdcf92cbb5bc6685a30e7c6d985d8a3e3a75326e"}, + {file = "hiredis-2.0.0-cp39-cp39-win32.whl", hash = "sha256:a7928283143a401e72a4fad43ecc85b35c27ae699cf5d54d39e1e72d97460e1d"}, + {file = "hiredis-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:a4ee8000454ad4486fb9f28b0cab7fa1cd796fc36d639882d0b34109b5b3aec9"}, + {file = "hiredis-2.0.0-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1f03d4dadd595f7a69a75709bc81902673fa31964c75f93af74feac2f134cc54"}, + {file = "hiredis-2.0.0-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:04927a4c651a0e9ec11c68e4427d917e44ff101f761cd3b5bc76f86aaa431d27"}, + {file = "hiredis-2.0.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:a39efc3ade8c1fb27c097fd112baf09d7fd70b8cb10ef1de4da6efbe066d381d"}, + {file = "hiredis-2.0.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:07bbf9bdcb82239f319b1f09e8ef4bdfaec50ed7d7ea51a56438f39193271163"}, + {file = "hiredis-2.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:807b3096205c7cec861c8803a6738e33ed86c9aae76cac0e19454245a6bbbc0a"}, + {file = "hiredis-2.0.0-pp37-pypy37_pp73-manylinux1_x86_64.whl", hash = "sha256:1233e303645f468e399ec906b6b48ab7cd8391aae2d08daadbb5cad6ace4bd87"}, + {file = "hiredis-2.0.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:cb2126603091902767d96bcb74093bd8b14982f41809f85c9b96e519c7e1dc41"}, + {file = "hiredis-2.0.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:f52010e0a44e3d8530437e7da38d11fb822acfb0d5b12e9cd5ba655509937ca0"}, + {file = "hiredis-2.0.0.tar.gz", hash = "sha256:81d6d8e39695f2c37954d1011c0480ef7cf444d4e3ae24bc5e89ee5de360139a"}, +] +humanfriendly = [ + {file = "humanfriendly-9.2-py2.py3-none-any.whl", hash = "sha256:332da98c24cc150efcc91b5508b19115209272bfdf4b0764a56795932f854271"}, + {file = "humanfriendly-9.2.tar.gz", hash = "sha256:f7dba53ac7935fd0b4a2fc9a29e316ddd9ea135fb3052d3d0279d10c18ff9c48"}, +] +idna = [ + {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"}, + {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"}, +] +imageio = [ + {file = "imageio-2.9.0-py3-none-any.whl", hash = "sha256:3604d751f03002e8e0e7650aa71d8d9148144a87daf17cb1f3228e80747f2e6b"}, + {file = "imageio-2.9.0.tar.gz", hash = "sha256:52ddbaeca2dccf53ba2d6dec5676ca7bc3b2403ef8b37f7da78b7654bb3e10f0"}, +] +importlib-metadata = [ + {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"}, + {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"}, +] +inflection = [ + {file = "inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2"}, + {file = "inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +ipython = [ + {file = "ipython-7.27.0-py3-none-any.whl", hash = "sha256:75b5e060a3417cf64f138e0bb78e58512742c57dc29db5a5058a2b1f0c10df02"}, + {file = "ipython-7.27.0.tar.gz", hash = "sha256:58b55ebfdfa260dad10d509702dc2857cb25ad82609506b070cf2d7b7df5af13"}, +] +jedi = [ + {file = "jedi-0.18.0-py2.py3-none-any.whl", hash = "sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93"}, + {file = "jedi-0.18.0.tar.gz", hash = "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"}, +] +jinja2 = [ + {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, + {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, +] +joblib = [ + {file = "joblib-1.0.1-py3-none-any.whl", hash = "sha256:feeb1ec69c4d45129954f1b7034954241eedfd6ba39b5e9e4b6883be3332d5e5"}, + {file = "joblib-1.0.1.tar.gz", hash = "sha256:9c17567692206d2f3fb9ecf5e991084254fe631665c450b443761c4186a613f7"}, +] +jsonschema = [ + {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, + {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, +] +kiwisolver = [ + {file = "kiwisolver-1.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1d819553730d3c2724582124aee8a03c846ec4362ded1034c16fb3ef309264e6"}, + {file = "kiwisolver-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d93a1095f83e908fc253f2fb569c2711414c0bfd451cab580466465b235b470"}, + {file = "kiwisolver-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4550a359c5157aaf8507e6820d98682872b9100ce7607f8aa070b4b8af6c298"}, + {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2210f28778c7d2ee13f3c2a20a3a22db889e75f4ec13a21072eabb5693801e84"}, + {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:82f49c5a79d3839bc8f38cb5f4bfc87e15f04cbafa5fbd12fb32c941cb529cfb"}, + {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9661a04ca3c950a8ac8c47f53cbc0b530bce1b52f516a1e87b7736fec24bfff0"}, + {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ddb500a2808c100e72c075cbb00bf32e62763c82b6a882d403f01a119e3f402"}, + {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72be6ebb4e92520b9726d7146bc9c9b277513a57a38efcf66db0620aec0097e0"}, + {file = "kiwisolver-1.3.2-cp310-cp310-win32.whl", hash = "sha256:83d2c9db5dfc537d0171e32de160461230eb14663299b7e6d18ca6dca21e4977"}, + {file = "kiwisolver-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:cba430db673c29376135e695c6e2501c44c256a81495da849e85d1793ee975ad"}, + {file = "kiwisolver-1.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4116ba9a58109ed5e4cb315bdcbff9838f3159d099ba5259c7c7fb77f8537492"}, + {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19554bd8d54cf41139f376753af1a644b63c9ca93f8f72009d50a2080f870f77"}, + {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a4cf5bbdc861987a7745aed7a536c6405256853c94abc9f3287c3fa401b174"}, + {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0007840186bacfaa0aba4466d5890334ea5938e0bb7e28078a0eb0e63b5b59d5"}, + {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec2eba188c1906b05b9b49ae55aae4efd8150c61ba450e6721f64620c50b59eb"}, + {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3dbb3cea20b4af4f49f84cffaf45dd5f88e8594d18568e0225e6ad9dec0e7967"}, + {file = "kiwisolver-1.3.2-cp37-cp37m-win32.whl", hash = "sha256:5326ddfacbe51abf9469fe668944bc2e399181a2158cb5d45e1d40856b2a0589"}, + {file = "kiwisolver-1.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c6572c2dab23c86a14e82c245473d45b4c515314f1f859e92608dcafbd2f19b8"}, + {file = "kiwisolver-1.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b5074fb09429f2b7bc82b6fb4be8645dcbac14e592128beeff5461dcde0af09f"}, + {file = "kiwisolver-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:22521219ca739654a296eea6d4367703558fba16f98688bd8ce65abff36eaa84"}, + {file = "kiwisolver-1.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c358721aebd40c243894298f685a19eb0491a5c3e0b923b9f887ef1193ddf829"}, + {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ba5a1041480c6e0a8b11a9544d53562abc2d19220bfa14133e0cdd9967e97af"}, + {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44e6adf67577dbdfa2d9f06db9fbc5639afefdb5bf2b4dfec25c3a7fbc619536"}, + {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d45d1c74f88b9f41062716c727f78f2a59a5476ecbe74956fafb423c5c87a76"}, + {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:70adc3658138bc77a36ce769f5f183169bc0a2906a4f61f09673f7181255ac9b"}, + {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6a5431940f28b6de123de42f0eb47b84a073ee3c3345dc109ad550a3307dd28"}, + {file = "kiwisolver-1.3.2-cp38-cp38-win32.whl", hash = "sha256:ee040a7de8d295dbd261ef2d6d3192f13e2b08ec4a954de34a6fb8ff6422e24c"}, + {file = "kiwisolver-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:8dc3d842fa41a33fe83d9f5c66c0cc1f28756530cd89944b63b072281e852031"}, + {file = "kiwisolver-1.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a498bcd005e8a3fedd0022bb30ee0ad92728154a8798b703f394484452550507"}, + {file = "kiwisolver-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:80efd202108c3a4150e042b269f7c78643420cc232a0a771743bb96b742f838f"}, + {file = "kiwisolver-1.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f8eb7b6716f5b50e9c06207a14172cf2de201e41912ebe732846c02c830455b9"}, + {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f441422bb313ab25de7b3dbfd388e790eceb76ce01a18199ec4944b369017009"}, + {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:30fa008c172355c7768159983a7270cb23838c4d7db73d6c0f6b60dde0d432c6"}, + {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f8f6c8f4f1cff93ca5058d6ec5f0efda922ecb3f4c5fb76181f327decff98b8"}, + {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba677bcaff9429fd1bf01648ad0901cea56c0d068df383d5f5856d88221fe75b"}, + {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7843b1624d6ccca403a610d1277f7c28ad184c5aa88a1750c1a999754e65b439"}, + {file = "kiwisolver-1.3.2-cp39-cp39-win32.whl", hash = "sha256:e6f5eb2f53fac7d408a45fbcdeda7224b1cfff64919d0f95473420a931347ae9"}, + {file = "kiwisolver-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:eedd3b59190885d1ebdf6c5e0ca56828beb1949b4dfe6e5d0256a461429ac386"}, + {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dedc71c8eb9c5096037766390172c34fb86ef048b8e8958b4e484b9e505d66bc"}, + {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bf7eb45d14fc036514c09554bf983f2a72323254912ed0c3c8e697b62c4c158f"}, + {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b65bd35f3e06a47b5c30ea99e0c2b88f72c6476eedaf8cfbc8e66adb5479dcf"}, + {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25405f88a37c5f5bcba01c6e350086d65e7465fd1caaf986333d2a045045a223"}, + {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:bcadb05c3d4794eb9eee1dddf1c24215c92fb7b55a80beae7a60530a91060560"}, + {file = "kiwisolver-1.3.2.tar.gz", hash = "sha256:fc4453705b81d03568d5b808ad8f09c77c47534f6ac2e72e733f9ca4714aa75c"}, +] +lxml = [ + {file = "lxml-4.6.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:df7c53783a46febb0e70f6b05df2ba104610f2fb0d27023409734a3ecbb78fb2"}, + {file = "lxml-4.6.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1b7584d421d254ab86d4f0b13ec662a9014397678a7c4265a02a6d7c2b18a75f"}, + {file = "lxml-4.6.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:079f3ae844f38982d156efce585bc540c16a926d4436712cf4baee0cce487a3d"}, + {file = "lxml-4.6.3-cp27-cp27m-win32.whl", hash = "sha256:bc4313cbeb0e7a416a488d72f9680fffffc645f8a838bd2193809881c67dd106"}, + {file = "lxml-4.6.3-cp27-cp27m-win_amd64.whl", hash = "sha256:8157dadbb09a34a6bd95a50690595e1fa0af1a99445e2744110e3dca7831c4ee"}, + {file = "lxml-4.6.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7728e05c35412ba36d3e9795ae8995e3c86958179c9770e65558ec3fdfd3724f"}, + {file = "lxml-4.6.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:4bff24dfeea62f2e56f5bab929b4428ae6caba2d1eea0c2d6eb618e30a71e6d4"}, + {file = "lxml-4.6.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:74f7d8d439b18fa4c385f3f5dfd11144bb87c1da034a466c5b5577d23a1d9b51"}, + {file = "lxml-4.6.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f90ba11136bfdd25cae3951af8da2e95121c9b9b93727b1b896e3fa105b2f586"}, + {file = "lxml-4.6.3-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:4c61b3a0db43a1607d6264166b230438f85bfed02e8cff20c22e564d0faff354"}, + {file = "lxml-4.6.3-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:5c8c163396cc0df3fd151b927e74f6e4acd67160d6c33304e805b84293351d16"}, + {file = "lxml-4.6.3-cp35-cp35m-win32.whl", hash = "sha256:f2380a6376dfa090227b663f9678150ef27543483055cc327555fb592c5967e2"}, + {file = "lxml-4.6.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c4f05c5a7c49d2fb70223d0d5bcfbe474cf928310ac9fa6a7c6dddc831d0b1d4"}, + {file = "lxml-4.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d2e35d7bf1c1ac8c538f88d26b396e73dd81440d59c1ef8522e1ea77b345ede4"}, + {file = "lxml-4.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:289e9ca1a9287f08daaf796d96e06cb2bc2958891d7911ac7cae1c5f9e1e0ee3"}, + {file = "lxml-4.6.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bccbfc27563652de7dc9bdc595cb25e90b59c5f8e23e806ed0fd623755b6565d"}, + {file = "lxml-4.6.3-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d916d31fd85b2f78c76400d625076d9124de3e4bda8b016d25a050cc7d603f24"}, + {file = "lxml-4.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:820628b7b3135403540202e60551e741f9b6d3304371712521be939470b454ec"}, + {file = "lxml-4.6.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:c47ff7e0a36d4efac9fd692cfa33fbd0636674c102e9e8d9b26e1b93a94e7617"}, + {file = "lxml-4.6.3-cp36-cp36m-win32.whl", hash = "sha256:5a0a14e264069c03e46f926be0d8919f4105c1623d620e7ec0e612a2e9bf1c04"}, + {file = "lxml-4.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:92e821e43ad382332eade6812e298dc9701c75fe289f2a2d39c7960b43d1e92a"}, + {file = "lxml-4.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:efd7a09678fd8b53117f6bae4fa3825e0a22b03ef0a932e070c0bdbb3a35e654"}, + {file = "lxml-4.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:efac139c3f0bf4f0939f9375af4b02c5ad83a622de52d6dfa8e438e8e01d0eb0"}, + {file = "lxml-4.6.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0fbcf5565ac01dff87cbfc0ff323515c823081c5777a9fc7703ff58388c258c3"}, + {file = "lxml-4.6.3-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:36108c73739985979bf302006527cf8a20515ce444ba916281d1c43938b8bb96"}, + {file = "lxml-4.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:122fba10466c7bd4178b07dba427aa516286b846b2cbd6f6169141917283aae2"}, + {file = "lxml-4.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:cdaf11d2bd275bf391b5308f86731e5194a21af45fbaaaf1d9e8147b9160ea92"}, + {file = "lxml-4.6.3-cp37-cp37m-win32.whl", hash = "sha256:3439c71103ef0e904ea0a1901611863e51f50b5cd5e8654a151740fde5e1cade"}, + {file = "lxml-4.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:4289728b5e2000a4ad4ab8da6e1db2e093c63c08bdc0414799ee776a3f78da4b"}, + {file = "lxml-4.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b007cbb845b28db4fb8b6a5cdcbf65bacb16a8bd328b53cbc0698688a68e1caa"}, + {file = "lxml-4.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:76fa7b1362d19f8fbd3e75fe2fb7c79359b0af8747e6f7141c338f0bee2f871a"}, + {file = "lxml-4.6.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:26e761ab5b07adf5f555ee82fb4bfc35bf93750499c6c7614bd64d12aaa67927"}, + {file = "lxml-4.6.3-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:e1cbd3f19a61e27e011e02f9600837b921ac661f0c40560eefb366e4e4fb275e"}, + {file = "lxml-4.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:66e575c62792c3f9ca47cb8b6fab9e35bab91360c783d1606f758761810c9791"}, + {file = "lxml-4.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:1b38116b6e628118dea5b2186ee6820ab138dbb1e24a13e478490c7db2f326ae"}, + {file = "lxml-4.6.3-cp38-cp38-win32.whl", hash = "sha256:89b8b22a5ff72d89d48d0e62abb14340d9e99fd637d046c27b8b257a01ffbe28"}, + {file = "lxml-4.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:2a9d50e69aac3ebee695424f7dbd7b8c6d6eb7de2a2eb6b0f6c7db6aa41e02b7"}, + {file = "lxml-4.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ce256aaa50f6cc9a649c51be3cd4ff142d67295bfc4f490c9134d0f9f6d58ef0"}, + {file = "lxml-4.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:7610b8c31688f0b1be0ef882889817939490a36d0ee880ea562a4e1399c447a1"}, + {file = "lxml-4.6.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f8380c03e45cf09f8557bdaa41e1fa7c81f3ae22828e1db470ab2a6c96d8bc23"}, + {file = "lxml-4.6.3-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:3082c518be8e97324390614dacd041bb1358c882d77108ca1957ba47738d9d59"}, + {file = "lxml-4.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:884ab9b29feaca361f7f88d811b1eea9bfca36cf3da27768d28ad45c3ee6f969"}, + {file = "lxml-4.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:6f12e1427285008fd32a6025e38e977d44d6382cf28e7201ed10d6c1698d2a9a"}, + {file = "lxml-4.6.3-cp39-cp39-win32.whl", hash = "sha256:33bb934a044cf32157c12bfcfbb6649807da20aa92c062ef51903415c704704f"}, + {file = "lxml-4.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:542d454665a3e277f76954418124d67516c5f88e51a900365ed54a9806122b83"}, + {file = "lxml-4.6.3.tar.gz", hash = "sha256:39b78571b3b30645ac77b95f7c69d1bffc4cf8c3b157c435a34da72e78c82468"}, +] +lz4 = [ + {file = "lz4-3.1.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:5aa4dd12debc5cb90980e6bb26be8b1586e57b87aaf6c773b9b799bca16edd99"}, + {file = "lz4-3.1.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:7cf0e6e1020dbf8ea72ff57ece3f321f603cfa54f14337b96f7b68a7c1a742b4"}, + {file = "lz4-3.1.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:af1bc2952214c5a3ec6706cb86bd3e321570c62136539d32e4a57da777b002f0"}, + {file = "lz4-3.1.3-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:57dbd50d6abeb85f8d273b9f24f0063c4b97aae07d267302101884611a2413da"}, + {file = "lz4-3.1.3-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:1f8320b7b047ec4ba9a7de3509a067ccaac84dab2cadf629d0518760594c3b6a"}, + {file = "lz4-3.1.3-cp36-cp36m-win32.whl", hash = "sha256:502d6dc17aca64e4dc95d6e7920dca906b5eabc1e657213bd07066c97fbc8cd3"}, + {file = "lz4-3.1.3-cp36-cp36m-win_amd64.whl", hash = "sha256:b91fbc9571d3f3fea587ce541f38a2e71ef192075b59c2846182cb98f99862a0"}, + {file = "lz4-3.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0f889e854114f87b5f99e8c82c9bf85417468b291b99a2cb27bcdcc864841a33"}, + {file = "lz4-3.1.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c41759a97ccac751f69e48f12671c2c3e5e1ae3000d3ee5dfe750b31511d1576"}, + {file = "lz4-3.1.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0acbc2b797fe3c51917011c8d7f6c99398ae33cc4a1ca23c3a246d60bbf56fc8"}, + {file = "lz4-3.1.3-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:c0a5f9b6962aaa4632e4385143a12f5b49ee8605a42589073e54c8f23ce111b2"}, + {file = "lz4-3.1.3-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3c00b56fd9aef8d3f776653c92cec262d42b6ea144e9a41b58b8c22a85f90045"}, + {file = "lz4-3.1.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:4c3558f4b98adb7acee6f4b45edd848684daae6a92a5ff31f8071eb910779568"}, + {file = "lz4-3.1.3-cp37-cp37m-win32.whl", hash = "sha256:e3029738e64a0af1b04a32a39b32b0bba0e2088f61805e074c9a7e4bc212568f"}, + {file = "lz4-3.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:511c755d89048a2583ab88088fe451f7e3f15cde30560c058d80c9ac097dab21"}, + {file = "lz4-3.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:81b54fc66555fc7653467bf5b789d0e480ab88d17c858405e326d9c898baff2e"}, + {file = "lz4-3.1.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:57e5b0a818addacae254b9160a183122b6bc4737bc77c988b72e1c57bd22ed9e"}, + {file = "lz4-3.1.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:41a388a34eab3cca6180cdb179bd8fdfcf7fd1a569f0e9e6084ad0540a0d53a9"}, + {file = "lz4-3.1.3-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:de2aac0cfda79c5a3eda9dbed21d78dc05c4a9ac00061748c3b57ea0e4a0b6a8"}, + {file = "lz4-3.1.3-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d6afa929d2c8afafd8b89e898498484b145a94cf3c140bb68094a94590ab2c2a"}, + {file = "lz4-3.1.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0a3b7eeb879577f2c7c0872156c70f4ddfbb023c1198e33d54422e24fa5494ae"}, + {file = "lz4-3.1.3-cp38-cp38-win32.whl", hash = "sha256:c25dffdb8ab9eb449aacf94ba45b3e6f573b38a1041be9370716cc68dea445a6"}, + {file = "lz4-3.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:b4b56ae630a41980b6cf17a043b57691ff1f1677425b67556453fd96257b2a9b"}, + {file = "lz4-3.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:71f6f4dc48669ba3807a5cb5876048dc9b6467c3db312acf2040a61ea9487161"}, + {file = "lz4-3.1.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:408b2c1b65697d9bc6468c987977314acefc71573b996bd86190053ae7ffe8d1"}, + {file = "lz4-3.1.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:19d3b8dca0c18991ee243acf86932eb917f14e2e61dd34c7852a1088659d5499"}, + {file = "lz4-3.1.3-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:d50c9584fb355d5d51414b802f7012578240bcb259550b48de628e19cd5bff6c"}, + {file = "lz4-3.1.3-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:38266a6fa124e3ec2ce3ed6fd34f8e86b13c588f12b005873421afb295caee2d"}, + {file = "lz4-3.1.3-cp39-cp39-win32.whl", hash = "sha256:869734b6f0e8a19af10a75c769db179dcd3d867e29c29b3808ef884e76799071"}, + {file = "lz4-3.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:37c23ca41040751649e0266f9f267c0148db12968a0a031272ee2a99cef7c753"}, + {file = "lz4-3.1.3.tar.gz", hash = "sha256:081ef0a3b5941cb03127f314229a1c78bd70c9c220bb3f4dd80033e707feaa18"}, +] +markupsafe = [ + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, +] +matplotlib = [ + {file = "matplotlib-3.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c541ee5a3287efe066bbe358320853cf4916bc14c00c38f8f3d8d75275a405a9"}, + {file = "matplotlib-3.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:3a5c18dbd2c7c366da26a4ad1462fe3e03a577b39e3b503bbcf482b9cdac093c"}, + {file = "matplotlib-3.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a9d8cb5329df13e0cdaa14b3b43f47b5e593ec637f13f14db75bb16e46178b05"}, + {file = "matplotlib-3.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:7ad19f3fb6145b9eb41c08e7cbb9f8e10b91291396bee21e9ce761bb78df63ec"}, + {file = "matplotlib-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:7a58f3d8fe8fac3be522c79d921c9b86e090a59637cb88e3bc51298d7a2c862a"}, + {file = "matplotlib-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6382bc6e2d7e481bcd977eb131c31dee96e0fb4f9177d15ec6fb976d3b9ace1a"}, + {file = "matplotlib-3.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a6a44f27aabe720ec4fd485061e8a35784c2b9ffa6363ad546316dfc9cea04e"}, + {file = "matplotlib-3.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1c1779f7ab7d8bdb7d4c605e6ffaa0614b3e80f1e3c8ccf7b9269a22dbc5986b"}, + {file = "matplotlib-3.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5826f56055b9b1c80fef82e326097e34dc4af8c7249226b7dd63095a686177d1"}, + {file = "matplotlib-3.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0bea5ec5c28d49020e5d7923c2725b837e60bc8be99d3164af410eb4b4c827da"}, + {file = "matplotlib-3.4.2-cp38-cp38-win32.whl", hash = "sha256:6475d0209024a77f869163ec3657c47fed35d9b6ed8bccba8aa0f0099fbbdaa8"}, + {file = "matplotlib-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:21b31057bbc5e75b08e70a43cefc4c0b2c2f1b1a850f4a0f7af044eb4163086c"}, + {file = "matplotlib-3.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b26535b9de85326e6958cdef720ecd10bcf74a3f4371bf9a7e5b2e659c17e153"}, + {file = "matplotlib-3.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:32fa638cc10886885d1ca3d409d4473d6a22f7ceecd11322150961a70fab66dd"}, + {file = "matplotlib-3.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:956c8849b134b4a343598305a3ca1bdd3094f01f5efc8afccdebeffe6b315247"}, + {file = "matplotlib-3.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:85f191bb03cb1a7b04b5c2cca4792bef94df06ef473bc49e2818105671766fee"}, + {file = "matplotlib-3.4.2-cp39-cp39-win32.whl", hash = "sha256:b1d5a2cedf5de05567c441b3a8c2651fbde56df08b82640e7f06c8cd91e201f6"}, + {file = "matplotlib-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:df815378a754a7edd4559f8c51fc7064f779a74013644a7f5ac7a0c31f875866"}, + {file = "matplotlib-3.4.2.tar.gz", hash = "sha256:d8d994cefdff9aaba45166eb3de4f5211adb4accac85cbf97137e98f26ea0219"}, +] +matplotlib-inline = [ + {file = "matplotlib-inline-0.1.3.tar.gz", hash = "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee"}, + {file = "matplotlib_inline-0.1.3-py3-none-any.whl", hash = "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"}, +] +minerl = [ + {file = "minerl-0.4.1a2.tar.gz", hash = "sha256:ddeff068c75d586d9b36cd839a611feabff594d9549d93c8bbdfad3bb5d1dd53"}, +] +minerl-wrappers = [ + {file = "minerl-wrappers-0.1.4.tar.gz", hash = "sha256:e005ce75fcfe5fd345384635e692050848ffafe5a6b7e10e43073238c6522060"}, + {file = "minerl_wrappers-0.1.4-py3-none-any.whl", hash = "sha256:7675201bb81347c94b67659dbd05f496b167a15ed6e7035953bbd5f641fcd7cf"}, +] +msgpack = [ + {file = "msgpack-1.0.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:b6d9e2dae081aa35c44af9c4298de4ee72991305503442a5c74656d82b581fe9"}, + {file = "msgpack-1.0.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:a99b144475230982aee16b3d249170f1cccebf27fb0a08e9f603b69637a62192"}, + {file = "msgpack-1.0.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1026dcc10537d27dd2d26c327e552f05ce148977e9d7b9f1718748281b38c841"}, + {file = "msgpack-1.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:fe07bc6735d08e492a327f496b7850e98cb4d112c56df69b0c844dbebcbb47f6"}, + {file = "msgpack-1.0.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:9ea52fff0473f9f3000987f313310208c879493491ef3ccf66268eff8d5a0326"}, + {file = "msgpack-1.0.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:26a1759f1a88df5f1d0b393eb582ec022326994e311ba9c5818adc5374736439"}, + {file = "msgpack-1.0.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:497d2c12426adcd27ab83144057a705efb6acc7e85957a51d43cdcf7f258900f"}, + {file = "msgpack-1.0.2-cp36-cp36m-win32.whl", hash = "sha256:e89ec55871ed5473a041c0495b7b4e6099f6263438e0bd04ccd8418f92d5d7f2"}, + {file = "msgpack-1.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a4355d2193106c7aa77c98fc955252a737d8550320ecdb2e9ac701e15e2943bc"}, + {file = "msgpack-1.0.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:d6c64601af8f3893d17ec233237030e3110f11b8a962cb66720bf70c0141aa54"}, + {file = "msgpack-1.0.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f484cd2dca68502de3704f056fa9b318c94b1539ed17a4c784266df5d6978c87"}, + {file = "msgpack-1.0.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f3e6aaf217ac1c7ce1563cf52a2f4f5d5b1f64e8729d794165db71da57257f0c"}, + {file = "msgpack-1.0.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:8521e5be9e3b93d4d5e07cb80b7e32353264d143c1f072309e1863174c6aadb1"}, + {file = "msgpack-1.0.2-cp37-cp37m-win32.whl", hash = "sha256:31c17bbf2ae5e29e48d794c693b7ca7a0c73bd4280976d408c53df421e838d2a"}, + {file = "msgpack-1.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8ffb24a3b7518e843cd83538cf859e026d24ec41ac5721c18ed0c55101f9775b"}, + {file = "msgpack-1.0.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:b28c0876cce1466d7c2195d7658cf50e4730667196e2f1355c4209444717ee06"}, + {file = "msgpack-1.0.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:87869ba567fe371c4555d2e11e4948778ab6b59d6cc9d8460d543e4cfbbddd1c"}, + {file = "msgpack-1.0.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:b55f7db883530b74c857e50e149126b91bb75d35c08b28db12dcb0346f15e46e"}, + {file = "msgpack-1.0.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:ac25f3e0513f6673e8b405c3a80500eb7be1cf8f57584be524c4fa78fe8e0c83"}, + {file = "msgpack-1.0.2-cp38-cp38-win32.whl", hash = "sha256:0cb94ee48675a45d3b86e61d13c1e6f1696f0183f0715544976356ff86f741d9"}, + {file = "msgpack-1.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:e36a812ef4705a291cdb4a2fd352f013134f26c6ff63477f20235138d1d21009"}, + {file = "msgpack-1.0.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2a5866bdc88d77f6e1370f82f2371c9bc6fc92fe898fa2dec0c5d4f5435a2694"}, + {file = "msgpack-1.0.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:92be4b12de4806d3c36810b0fe2aeedd8d493db39e2eb90742b9c09299eb5759"}, + {file = "msgpack-1.0.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:de6bd7990a2c2dabe926b7e62a92886ccbf809425c347ae7de277067f97c2887"}, + {file = "msgpack-1.0.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5a9ee2540c78659a1dd0b110f73773533ee3108d4e1219b5a15a8d635b7aca0e"}, + {file = "msgpack-1.0.2-cp39-cp39-win32.whl", hash = "sha256:c747c0cc08bd6d72a586310bda6ea72eeb28e7505990f342552315b229a19b33"}, + {file = "msgpack-1.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:d8167b84af26654c1124857d71650404336f4eb5cc06900667a493fc619ddd9f"}, + {file = "msgpack-1.0.2.tar.gz", hash = "sha256:fae04496f5bc150eefad4e9571d1a76c55d021325dcd484ce45065ebbdd00984"}, +] +multidict = [ + {file = "multidict-5.1.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:b7993704f1a4b204e71debe6095150d43b2ee6150fa4f44d6d966ec356a8d61f"}, + {file = "multidict-5.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:9dd6e9b1a913d096ac95d0399bd737e00f2af1e1594a787e00f7975778c8b2bf"}, + {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:f21756997ad8ef815d8ef3d34edd98804ab5ea337feedcd62fb52d22bf531281"}, + {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab820665e67373de5802acae069a6a05567ae234ddb129f31d290fc3d1aa56d"}, + {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:9436dc58c123f07b230383083855593550c4d301d2532045a17ccf6eca505f6d"}, + {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:830f57206cc96ed0ccf68304141fec9481a096c4d2e2831f311bde1c404401da"}, + {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:2e68965192c4ea61fff1b81c14ff712fc7dc15d2bd120602e4a3494ea6584224"}, + {file = "multidict-5.1.0-cp36-cp36m-win32.whl", hash = "sha256:2f1a132f1c88724674271d636e6b7351477c27722f2ed789f719f9e3545a3d26"}, + {file = "multidict-5.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:3a4f32116f8f72ecf2a29dabfb27b23ab7cdc0ba807e8459e59a93a9be9506f6"}, + {file = "multidict-5.1.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:46c73e09ad374a6d876c599f2328161bcd95e280f84d2060cf57991dec5cfe76"}, + {file = "multidict-5.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:018132dbd8688c7a69ad89c4a3f39ea2f9f33302ebe567a879da8f4ca73f0d0a"}, + {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:4b186eb7d6ae7c06eb4392411189469e6a820da81447f46c0072a41c748ab73f"}, + {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3a041b76d13706b7fff23b9fc83117c7b8fe8d5fe9e6be45eee72b9baa75f348"}, + {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:051012ccee979b2b06be928a6150d237aec75dd6bf2d1eeeb190baf2b05abc93"}, + {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:6a4d5ce640e37b0efcc8441caeea8f43a06addace2335bd11151bc02d2ee31f9"}, + {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:5cf3443199b83ed9e955f511b5b241fd3ae004e3cb81c58ec10f4fe47c7dce37"}, + {file = "multidict-5.1.0-cp37-cp37m-win32.whl", hash = "sha256:f200755768dc19c6f4e2b672421e0ebb3dd54c38d5a4f262b872d8cfcc9e93b5"}, + {file = "multidict-5.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:05c20b68e512166fddba59a918773ba002fdd77800cad9f55b59790030bab632"}, + {file = "multidict-5.1.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:54fd1e83a184e19c598d5e70ba508196fd0bbdd676ce159feb412a4a6664f952"}, + {file = "multidict-5.1.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:0e3c84e6c67eba89c2dbcee08504ba8644ab4284863452450520dad8f1e89b79"}, + {file = "multidict-5.1.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:dc862056f76443a0db4509116c5cd480fe1b6a2d45512a653f9a855cc0517456"}, + {file = "multidict-5.1.0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:0e929169f9c090dae0646a011c8b058e5e5fb391466016b39d21745b48817fd7"}, + {file = "multidict-5.1.0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:d81eddcb12d608cc08081fa88d046c78afb1bf8107e6feab5d43503fea74a635"}, + {file = "multidict-5.1.0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:585fd452dd7782130d112f7ddf3473ffdd521414674c33876187e101b588738a"}, + {file = "multidict-5.1.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:37e5438e1c78931df5d3c0c78ae049092877e5e9c02dd1ff5abb9cf27a5914ea"}, + {file = "multidict-5.1.0-cp38-cp38-win32.whl", hash = "sha256:07b42215124aedecc6083f1ce6b7e5ec5b50047afa701f3442054373a6deb656"}, + {file = "multidict-5.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:929006d3c2d923788ba153ad0de8ed2e5ed39fdbe8e7be21e2f22ed06c6783d3"}, + {file = "multidict-5.1.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b797515be8743b771aa868f83563f789bbd4b236659ba52243b735d80b29ed93"}, + {file = "multidict-5.1.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d5c65bdf4484872c4af3150aeebe101ba560dcfb34488d9a8ff8dbcd21079647"}, + {file = "multidict-5.1.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b47a43177a5e65b771b80db71e7be76c0ba23cc8aa73eeeb089ed5219cdbe27d"}, + {file = "multidict-5.1.0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:806068d4f86cb06af37cd65821554f98240a19ce646d3cd24e1c33587f313eb8"}, + {file = "multidict-5.1.0-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:46dd362c2f045095c920162e9307de5ffd0a1bfbba0a6e990b344366f55a30c1"}, + {file = "multidict-5.1.0-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:ace010325c787c378afd7f7c1ac66b26313b3344628652eacd149bdd23c68841"}, + {file = "multidict-5.1.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:ecc771ab628ea281517e24fd2c52e8f31c41e66652d07599ad8818abaad38cda"}, + {file = "multidict-5.1.0-cp39-cp39-win32.whl", hash = "sha256:fc13a9524bc18b6fb6e0dbec3533ba0496bbed167c56d0aabefd965584557d80"}, + {file = "multidict-5.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:7df80d07818b385f3129180369079bd6934cf70469f99daaebfac89dca288359"}, + {file = "multidict-5.1.0.tar.gz", hash = "sha256:25b4e5f22d3a37ddf3effc0710ba692cfc792c2b9edfb9c05aefe823256e84d5"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +networkx = [ + {file = "networkx-2.6.2-py3-none-any.whl", hash = "sha256:5fcb7004be69e8fbdf07dcb502efa5c77cadcaad6982164134eeb9721f826c2e"}, + {file = "networkx-2.6.2.tar.gz", hash = "sha256:2306f1950ce772c5a59a57f5486d59bb9cab98497c45fc49cbc45ac0dec119bb"}, +] +numpy = [ + {file = "numpy-1.21.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38e8648f9449a549a7dfe8d8755a5979b45b3538520d1e735637ef28e8c2dc50"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd7d7409fa643a91d0a05c7554dd68aa9c9bb16e186f6ccfe40d6e003156e33a"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a75b4498b1e93d8b700282dc8e655b8bd559c0904b3910b144646dbbbc03e062"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1412aa0aec3e00bc23fbb8664d76552b4efde98fb71f60737c83efbac24112f1"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e46ceaff65609b5399163de5893d8f2a82d3c77d5e56d976c8b5fb01faa6b671"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c6a2324085dd52f96498419ba95b5777e40b6bcbc20088fddb9e8cbb58885e8e"}, + {file = "numpy-1.21.1-cp37-cp37m-win32.whl", hash = "sha256:73101b2a1fef16602696d133db402a7e7586654682244344b8329cdcbbb82172"}, + {file = "numpy-1.21.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7a708a79c9a9d26904d1cca8d383bf869edf6f8e7650d85dbc77b041e8c5a0f8"}, + {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95b995d0c413f5d0428b3f880e8fe1660ff9396dcd1f9eedbc311f37b5652e16"}, + {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:635e6bd31c9fb3d475c8f44a089569070d10a9ef18ed13738b03049280281267"}, + {file = "numpy-1.21.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a3d5fb89bfe21be2ef47c0614b9c9c707b7362386c9a3ff1feae63e0267ccb6"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a326af80e86d0e9ce92bcc1e65c8ff88297de4fa14ee936cb2293d414c9ec63"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:791492091744b0fe390a6ce85cc1bf5149968ac7d5f0477288f78c89b385d9af"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0318c465786c1f63ac05d7c4dbcecd4d2d7e13f0959b01b534ea1e92202235c5"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a513bd9c1551894ee3d31369f9b07460ef223694098cf27d399513415855b68"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:91c6f5fc58df1e0a3cc0c3a717bb3308ff850abdaa6d2d802573ee2b11f674a8"}, + {file = "numpy-1.21.1-cp38-cp38-win32.whl", hash = "sha256:978010b68e17150db8765355d1ccdd450f9fc916824e8c4e35ee620590e234cd"}, + {file = "numpy-1.21.1-cp38-cp38-win_amd64.whl", hash = "sha256:9749a40a5b22333467f02fe11edc98f022133ee1bfa8ab99bda5e5437b831214"}, + {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d7a4aeac3b94af92a9373d6e77b37691b86411f9745190d2c351f410ab3a791f"}, + {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d9e7912a56108aba9b31df688a4c4f5cb0d9d3787386b87d504762b6754fbb1b"}, + {file = "numpy-1.21.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:25b40b98ebdd272bc3020935427a4530b7d60dfbe1ab9381a39147834e985eac"}, + {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a92c5aea763d14ba9d6475803fc7904bda7decc2a0a68153f587ad82941fec1"}, + {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05a0f648eb28bae4bcb204e6fd14603de2908de982e761a2fc78efe0f19e96e1"}, + {file = "numpy-1.21.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f01f28075a92eede918b965e86e8f0ba7b7797a95aa8d35e1cc8821f5fc3ad6a"}, + {file = "numpy-1.21.1-cp39-cp39-win32.whl", hash = "sha256:88c0b89ad1cc24a5efbb99ff9ab5db0f9a86e9cc50240177a571fbe9c2860ac2"}, + {file = "numpy-1.21.1-cp39-cp39-win_amd64.whl", hash = "sha256:01721eefe70544d548425a07c80be8377096a54118070b8a62476866d5208e33"}, + {file = "numpy-1.21.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d4d1de6e6fb3d28781c73fbde702ac97f03d79e4ffd6598b880b2d95d62ead4"}, + {file = "numpy-1.21.1.zip", hash = "sha256:dff4af63638afcc57a3dfb9e4b26d434a7a602d225b42d746ea7fe2edf1342fd"}, +] +nvidia-ml-py3 = [ + {file = "nvidia-ml-py3-7.352.0.tar.gz", hash = "sha256:390f02919ee9d73fe63a98c73101061a6b37fa694a793abf56673320f1f51277"}, +] +opencensus = [ + {file = "opencensus-0.7.13-py2.py3-none-any.whl", hash = "sha256:2d84b36d06aff4f0f00c7c5adee7c621d8a87d2813247724d96aa997c67dcfbc"}, + {file = "opencensus-0.7.13.tar.gz", hash = "sha256:b58b86e5ac7c7760cf9716702dc09d1faf0c9606a8659d836a9bd30ba74ad169"}, +] +opencensus-context = [ + {file = "opencensus-context-0.1.2.tar.gz", hash = "sha256:8cf64ce901e6b35f491bd1521e6541676e034c52d00c95500e9364600f835c06"}, + {file = "opencensus_context-0.1.2-py2.py3-none-any.whl", hash = "sha256:8bfb461d18f1dd243420224603c71544d7ac888bb236cf0d0a58545942561478"}, +] +opencv-python = [ + {file = "opencv-python-4.5.3.56.tar.gz", hash = "sha256:3c001d3feec7f3140f1fb78dfc52ca28122db8240826882d175a208a89d2731b"}, + {file = "opencv_python-4.5.3.56-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:9a78558b5ae848386edbb843c761e5fed5a8480be9af16274a5a78838529edeb"}, + {file = "opencv_python-4.5.3.56-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:8d3282138f3a8646941089aae142684910ebe40776266448eab5f4bb609fc63f"}, + {file = "opencv_python-4.5.3.56-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:881f3d85269500e0c7d72b140a6ebb5c14a089f8140fb9da7ce01f12a245858e"}, + {file = "opencv_python-4.5.3.56-cp36-cp36m-win32.whl", hash = "sha256:f1bda4d144f5204e077ca4571453ebb2015e5748d5e0043386c92c2bbf7f52eb"}, + {file = "opencv_python-4.5.3.56-cp36-cp36m-win_amd64.whl", hash = "sha256:6763729fcfee2a08e069aa1982c9a8c1abf55b9cdf2fb9640eda1d85bdece19a"}, + {file = "opencv_python-4.5.3.56-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:68813b720b88e4951e84399b9a8a7b532d45a07a96ea8f539636242f862e32e0"}, + {file = "opencv_python-4.5.3.56-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:c360cb76ad1ddbd5d2d3e730b42f2ff6e4be08ea6f4a6eefacca175d27467e8f"}, + {file = "opencv_python-4.5.3.56-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:437f30e300725e1d1b3744dbfbc66a523a4744792b58f3dbe1e9140c8f4dfba5"}, + {file = "opencv_python-4.5.3.56-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:e42c644a70d5c54f53a4b114dbd88b4eb83f42a9ca998f07bd5682f3f404efcc"}, + {file = "opencv_python-4.5.3.56-cp37-cp37m-win32.whl", hash = "sha256:f3ac2355217114a683f3f72a9c40a5890914a59c4a2df62e4083c66ff65c9cf9"}, + {file = "opencv_python-4.5.3.56-cp37-cp37m-win_amd64.whl", hash = "sha256:7f41b97d84ac66bdf13cb4d9f4dad3e159525ba1e3f421e670c787ce536eb70a"}, + {file = "opencv_python-4.5.3.56-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:cdc3363c2911d7cfc6c9f55308c51c2841a7aecbf0bf5e791499d220ce89d880"}, + {file = "opencv_python-4.5.3.56-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:18a4a14015eee30d9cd514db8cdefbf594b1d5c234762d27abe512d62a333bc3"}, + {file = "opencv_python-4.5.3.56-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:05c5139d620e8d02f7ce0921796d55736fa19fa15e2ec00a388db2eb1ae1e9a1"}, + {file = "opencv_python-4.5.3.56-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:831b92fe63ce18dd628f71104da7e60596658b75e2fa16b83aefa3eb10c115e2"}, + {file = "opencv_python-4.5.3.56-cp38-cp38-win32.whl", hash = "sha256:e1f54736272830a1e895cedf7a4ee67737e31e966d380c82a81ef22515d043a3"}, + {file = "opencv_python-4.5.3.56-cp38-cp38-win_amd64.whl", hash = "sha256:b42bbba9f5421865377c7960bd4f3dd881003b322a6bf46ed2302b89224d102b"}, + {file = "opencv_python-4.5.3.56-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5366fcd6eae4243add3c8c92142045850f1db8e464bcf0b75313e1596b2e3671"}, + {file = "opencv_python-4.5.3.56-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:54c64e86a087841869901fd34462bb6bec01cd4652800fdf5d92fe7b0596c82f"}, + {file = "opencv_python-4.5.3.56-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:8852be06c0749fef0d9c58f532bbcb0570968c59e41cf56b90f5c92593c6e108"}, + {file = "opencv_python-4.5.3.56-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8b5bc61be7fc8565140b746288b370a4bfdb4edb9d680b66bb914e7690485db1"}, + {file = "opencv_python-4.5.3.56-cp39-cp39-win32.whl", hash = "sha256:085232718f28bddd265da480874c37db5c7354cb08f23f4a68a8639b16276a89"}, + {file = "opencv_python-4.5.3.56-cp39-cp39-win_amd64.whl", hash = "sha256:205a73adb29c37e42475645519e612e843a985475da993d10b4d5daa6afec36a"}, +] +packaging = [ + {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, + {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, +] +pandas = [ + {file = "pandas-1.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ba7ceb8abc6dbdb1e34612d1173d61e4941f1a1eb7e6f703b2633134ae6a6c89"}, + {file = "pandas-1.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb71b1935249de80e3a808227189eee381d4d74a31760ced2df21eedc92a8e3"}, + {file = "pandas-1.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa54dc1d3e5d004a09ab0b1751473698011ddf03e14f1f59b84ad9a6ac630975"}, + {file = "pandas-1.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34ced9ce5d5b17b556486da7256961b55b471d64a8990b56e67a84ebeb259416"}, + {file = "pandas-1.3.2-cp37-cp37m-win32.whl", hash = "sha256:a56246de744baf646d1f3e050c4653d632bc9cd2e0605f41051fea59980e880a"}, + {file = "pandas-1.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:53b17e4debba26b7446b1e4795c19f94f0c715e288e08145e44bdd2865e819b3"}, + {file = "pandas-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f07a9745ca075ae73a5ce116f5e58f691c0dc9de0bff163527858459df5c176f"}, + {file = "pandas-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9e8e0ce5284ebebe110efd652c164ed6eab77f5de4c3533abc756302ee77765"}, + {file = "pandas-1.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59a78d7066d1c921a77e3306aa0ebf6e55396c097d5dfcc4df8defe3dcecb735"}, + {file = "pandas-1.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:132def05e73d292c949b02e7ef873debb77acc44a8b119d215921046f0c3a91d"}, + {file = "pandas-1.3.2-cp38-cp38-win32.whl", hash = "sha256:69e1b2f5811f46827722fd641fdaeedb26002bd1e504eacc7a8ec36bdc25393e"}, + {file = "pandas-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:7996d311413379136baf0f3cf2a10e331697657c87ced3f17ac7c77f77fe34a3"}, + {file = "pandas-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1738154049062156429a5cf2fd79a69c9f3fa4f231346a7ec6fd156cd1a9a621"}, + {file = "pandas-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cce01f6d655b4add966fcd36c32c5d1fe84628e200626b3f5e2f40db2d16a0f"}, + {file = "pandas-1.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1099e2a0cd3a01ec62cca183fc1555833a2d43764950ef8cb5948c8abfc51014"}, + {file = "pandas-1.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0cd5776be891331a3e6b425b5abeab9596abea18435c5982191356f9b24ae731"}, + {file = "pandas-1.3.2-cp39-cp39-win32.whl", hash = "sha256:66a95361b81b4ba04b699ecd2416b0591f40cd1e24c60a8bfe0d19009cfa575a"}, + {file = "pandas-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:89f40e5d21814192802421df809f948247d39ffe171e45fe2ab4abf7bd4279d8"}, + {file = "pandas-1.3.2.tar.gz", hash = "sha256:cbcb84d63867af3411fa063af3de64902665bb5b3d40b25b2059e40603594e87"}, +] +parso = [ + {file = "parso-0.8.2-py2.py3-none-any.whl", hash = "sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22"}, + {file = "parso-0.8.2.tar.gz", hash = "sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398"}, +] +pathspec = [ + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, +] +pexpect = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] +pickleshare = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] +pillow = [ + {file = "Pillow-8.3.2-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:c691b26283c3a31594683217d746f1dad59a7ae1d4cfc24626d7a064a11197d4"}, + {file = "Pillow-8.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f514c2717012859ccb349c97862568fdc0479aad85b0270d6b5a6509dbc142e2"}, + {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be25cb93442c6d2f8702c599b51184bd3ccd83adebd08886b682173e09ef0c3f"}, + {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d675a876b295afa114ca8bf42d7f86b5fb1298e1b6bb9a24405a3f6c8338811c"}, + {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59697568a0455764a094585b2551fd76bfd6b959c9f92d4bdec9d0e14616303a"}, + {file = "Pillow-8.3.2-cp310-cp310-win32.whl", hash = "sha256:2d5e9dc0bf1b5d9048a94c48d0813b6c96fccfa4ccf276d9c36308840f40c228"}, + {file = "Pillow-8.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:11c27e74bab423eb3c9232d97553111cc0be81b74b47165f07ebfdd29d825875"}, + {file = "Pillow-8.3.2-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:11eb7f98165d56042545c9e6db3ce394ed8b45089a67124298f0473b29cb60b2"}, + {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f23b2d3079522fdf3c09de6517f625f7a964f916c956527bed805ac043799b8"}, + {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19ec4cfe4b961edc249b0e04b5618666c23a83bc35842dea2bfd5dfa0157f81b"}, + {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5a31c07cea5edbaeb4bdba6f2b87db7d3dc0f446f379d907e51cc70ea375629"}, + {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15ccb81a6ffc57ea0137f9f3ac2737ffa1d11f786244d719639df17476d399a7"}, + {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8f284dc1695caf71a74f24993b7c7473d77bc760be45f776a2c2f4e04c170550"}, + {file = "Pillow-8.3.2-cp36-cp36m-win32.whl", hash = "sha256:4abc247b31a98f29e5224f2d31ef15f86a71f79c7f4d2ac345a5d551d6393073"}, + {file = "Pillow-8.3.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a048dad5ed6ad1fad338c02c609b862dfaa921fcd065d747194a6805f91f2196"}, + {file = "Pillow-8.3.2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:06d1adaa284696785375fa80a6a8eb309be722cf4ef8949518beb34487a3df71"}, + {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd24054aaf21e70a51e2a2a5ed1183560d3a69e6f9594a4bfe360a46f94eba83"}, + {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a330bf7014ee034046db43ccbb05c766aa9e70b8d6c5260bfc38d73103b0ba"}, + {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13654b521fb98abdecec105ea3fb5ba863d1548c9b58831dd5105bb3873569f1"}, + {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a1bd983c565f92779be456ece2479840ec39d386007cd4ae83382646293d681b"}, + {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4326ea1e2722f3dc00ed77c36d3b5354b8fb7399fb59230249ea6d59cbed90da"}, + {file = "Pillow-8.3.2-cp37-cp37m-win32.whl", hash = "sha256:085a90a99404b859a4b6c3daa42afde17cb3ad3115e44a75f0d7b4a32f06a6c9"}, + {file = "Pillow-8.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:18a07a683805d32826c09acfce44a90bf474e6a66ce482b1c7fcd3757d588df3"}, + {file = "Pillow-8.3.2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4e59e99fd680e2b8b11bbd463f3c9450ab799305d5f2bafb74fefba6ac058616"}, + {file = "Pillow-8.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4d89a2e9219a526401015153c0e9dd48319ea6ab9fe3b066a20aa9aee23d9fd3"}, + {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56fd98c8294f57636084f4b076b75f86c57b2a63a8410c0cd172bc93695ee979"}, + {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b11c9d310a3522b0fd3c35667914271f570576a0e387701f370eb39d45f08a4"}, + {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0412516dcc9de9b0a1e0ae25a280015809de8270f134cc2c1e32c4eeb397cf30"}, + {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bcb04ff12e79b28be6c9988f275e7ab69f01cc2ba319fb3114f87817bb7c74b6"}, + {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0b9911ec70731711c3b6ebcde26caea620cbdd9dcb73c67b0730c8817f24711b"}, + {file = "Pillow-8.3.2-cp38-cp38-win32.whl", hash = "sha256:ce2e5e04bb86da6187f96d7bab3f93a7877830981b37f0287dd6479e27a10341"}, + {file = "Pillow-8.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:35d27687f027ad25a8d0ef45dd5208ef044c588003cdcedf05afb00dbc5c2deb"}, + {file = "Pillow-8.3.2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:04835e68ef12904bc3e1fd002b33eea0779320d4346082bd5b24bec12ad9c3e9"}, + {file = "Pillow-8.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:10e00f7336780ca7d3653cf3ac26f068fa11b5a96894ea29a64d3dc4b810d630"}, + {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cde7a4d3687f21cffdf5bb171172070bb95e02af448c4c8b2f223d783214056"}, + {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c3ff00110835bdda2b1e2b07f4a2548a39744bb7de5946dc8e95517c4fb2ca6"}, + {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35d409030bf3bd05fa66fb5fdedc39c521b397f61ad04309c90444e893d05f7d"}, + {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bff50ba9891be0a004ef48828e012babaaf7da204d81ab9be37480b9020a82b"}, + {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7dbfbc0020aa1d9bc1b0b8bcf255a7d73f4ad0336f8fd2533fcc54a4ccfb9441"}, + {file = "Pillow-8.3.2-cp39-cp39-win32.whl", hash = "sha256:963ebdc5365d748185fdb06daf2ac758116deecb2277ec5ae98139f93844bc09"}, + {file = "Pillow-8.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:cc9d0dec711c914ed500f1d0d3822868760954dce98dfb0b7382a854aee55d19"}, + {file = "Pillow-8.3.2-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2c661542c6f71dfd9dc82d9d29a8386287e82813b0375b3a02983feac69ef864"}, + {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:548794f99ff52a73a156771a0402f5e1c35285bd981046a502d7e4793e8facaa"}, + {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8b68f565a4175e12e68ca900af8910e8fe48aaa48fd3ca853494f384e11c8bcd"}, + {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:838eb85de6d9307c19c655c726f8d13b8b646f144ca6b3771fa62b711ebf7624"}, + {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:feb5db446e96bfecfec078b943cc07744cc759893cef045aa8b8b6d6aaa8274e"}, + {file = "Pillow-8.3.2-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:fc0db32f7223b094964e71729c0361f93db43664dd1ec86d3df217853cedda87"}, + {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd4fd83aa912d7b89b4b4a1580d30e2a4242f3936882a3f433586e5ab97ed0d5"}, + {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d0c8ebbfd439c37624db98f3877d9ed12c137cadd99dde2d2eae0dab0bbfc355"}, + {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cb3dd7f23b044b0737317f892d399f9e2f0b3a02b22b2c692851fb8120d82c6"}, + {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a66566f8a22561fc1a88dc87606c69b84fa9ce724f99522cf922c801ec68f5c1"}, + {file = "Pillow-8.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ce651ca46d0202c302a535d3047c55a0131a720cf554a578fc1b8a2aff0e7d96"}, + {file = "Pillow-8.3.2.tar.gz", hash = "sha256:dde3f3ed8d00c72631bc19cbfff8ad3b6215062a5eed402381ad365f82f0c18c"}, +] +platformdirs = [ + {file = "platformdirs-2.3.0-py3-none-any.whl", hash = "sha256:8003ac87717ae2c7ee1ea5a84a1a61e87f3fbd16eb5aadba194ea30a9019f648"}, + {file = "platformdirs-2.3.0.tar.gz", hash = "sha256:15b056538719b1c94bdaccb29e5f81879c7f7f0f4a153f46086d155dffcd4f0f"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +prometheus-client = [ + {file = "prometheus_client-0.11.0-py2.py3-none-any.whl", hash = "sha256:b014bc76815eb1399da8ce5fc84b7717a3e63652b0c0f8804092c9363acab1b2"}, + {file = "prometheus_client-0.11.0.tar.gz", hash = "sha256:3a8baade6cb80bcfe43297e33e7623f3118d660d41387593758e2fb1ea173a86"}, +] +prompt-toolkit = [ + {file = "prompt_toolkit-3.0.20-py3-none-any.whl", hash = "sha256:6076e46efae19b1e0ca1ec003ed37a933dc94b4d20f486235d436e64771dcd5c"}, + {file = "prompt_toolkit-3.0.20.tar.gz", hash = "sha256:eb71d5a6b72ce6db177af4a7d4d7085b99756bf656d98ffcc4fecd36850eea6c"}, +] +protobuf = [ + {file = "protobuf-3.17.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ab6bb0e270c6c58e7ff4345b3a803cc59dbee19ddf77a4719c5b635f1d547aa8"}, + {file = "protobuf-3.17.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:13ee7be3c2d9a5d2b42a1030976f760f28755fcf5863c55b1460fd205e6cd637"}, + {file = "protobuf-3.17.3-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:1556a1049ccec58c7855a78d27e5c6e70e95103b32de9142bae0576e9200a1b0"}, + {file = "protobuf-3.17.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f0e59430ee953184a703a324b8ec52f571c6c4259d496a19d1cabcdc19dabc62"}, + {file = "protobuf-3.17.3-cp35-cp35m-win32.whl", hash = "sha256:a981222367fb4210a10a929ad5983ae93bd5a050a0824fc35d6371c07b78caf6"}, + {file = "protobuf-3.17.3-cp35-cp35m-win_amd64.whl", hash = "sha256:6d847c59963c03fd7a0cd7c488cadfa10cda4fff34d8bc8cba92935a91b7a037"}, + {file = "protobuf-3.17.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:145ce0af55c4259ca74993ddab3479c78af064002ec8227beb3d944405123c71"}, + {file = "protobuf-3.17.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6ce4d8bf0321e7b2d4395e253f8002a1a5ffbcfd7bcc0a6ba46712c07d47d0b4"}, + {file = "protobuf-3.17.3-cp36-cp36m-win32.whl", hash = "sha256:7a4c97961e9e5b03a56f9a6c82742ed55375c4a25f2692b625d4087d02ed31b9"}, + {file = "protobuf-3.17.3-cp36-cp36m-win_amd64.whl", hash = "sha256:a22b3a0dbac6544dacbafd4c5f6a29e389a50e3b193e2c70dae6bbf7930f651d"}, + {file = "protobuf-3.17.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ffea251f5cd3c0b9b43c7a7a912777e0bc86263436a87c2555242a348817221b"}, + {file = "protobuf-3.17.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:9b7a5c1022e0fa0dbde7fd03682d07d14624ad870ae52054849d8960f04bc764"}, + {file = "protobuf-3.17.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8727ee027157516e2c311f218ebf2260a18088ffb2d29473e82add217d196b1c"}, + {file = "protobuf-3.17.3-cp37-cp37m-win32.whl", hash = "sha256:14c1c9377a7ffbeaccd4722ab0aa900091f52b516ad89c4b0c3bb0a4af903ba5"}, + {file = "protobuf-3.17.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c56c050a947186ba51de4f94ab441d7f04fcd44c56df6e922369cc2e1a92d683"}, + {file = "protobuf-3.17.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2ae692bb6d1992afb6b74348e7bb648a75bb0d3565a3f5eea5bec8f62bd06d87"}, + {file = "protobuf-3.17.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:99938f2a2d7ca6563c0ade0c5ca8982264c484fdecf418bd68e880a7ab5730b1"}, + {file = "protobuf-3.17.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6902a1e4b7a319ec611a7345ff81b6b004b36b0d2196ce7a748b3493da3d226d"}, + {file = "protobuf-3.17.3-cp38-cp38-win32.whl", hash = "sha256:59e5cf6b737c3a376932fbfb869043415f7c16a0cf176ab30a5bbc419cd709c1"}, + {file = "protobuf-3.17.3-cp38-cp38-win_amd64.whl", hash = "sha256:ebcb546f10069b56dc2e3da35e003a02076aaa377caf8530fe9789570984a8d2"}, + {file = "protobuf-3.17.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4ffbd23640bb7403574f7aff8368e2aeb2ec9a5c6306580be48ac59a6bac8bde"}, + {file = "protobuf-3.17.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:26010f693b675ff5a1d0e1bdb17689b8b716a18709113288fead438703d45539"}, + {file = "protobuf-3.17.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e76d9686e088fece2450dbc7ee905f9be904e427341d289acbe9ad00b78ebd47"}, + {file = "protobuf-3.17.3-cp39-cp39-win32.whl", hash = "sha256:a38bac25f51c93e4be4092c88b2568b9f407c27217d3dd23c7a57fa522a17554"}, + {file = "protobuf-3.17.3-cp39-cp39-win_amd64.whl", hash = "sha256:85d6303e4adade2827e43c2b54114d9a6ea547b671cb63fafd5011dc47d0e13d"}, + {file = "protobuf-3.17.3-py2.py3-none-any.whl", hash = "sha256:2bfb815216a9cd9faec52b16fd2bfa68437a44b67c56bee59bc3926522ecb04e"}, + {file = "protobuf-3.17.3.tar.gz", hash = "sha256:72804ea5eaa9c22a090d2803813e280fb273b62d5ae497aaf3553d141c4fdd7b"}, +] +psutil = [ + {file = "psutil-5.8.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64"}, + {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0ae6f386d8d297177fd288be6e8d1afc05966878704dad9847719650e44fc49c"}, + {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:12d844996d6c2b1d3881cfa6fa201fd635971869a9da945cf6756105af73d2df"}, + {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:02b8292609b1f7fcb34173b25e48d0da8667bc85f81d7476584d889c6e0f2131"}, + {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6ffe81843131ee0ffa02c317186ed1e759a145267d54fdef1bc4ea5f5931ab60"}, + {file = "psutil-5.8.0-cp27-none-win32.whl", hash = "sha256:ea313bb02e5e25224e518e4352af4bf5e062755160f77e4b1767dd5ccb65f876"}, + {file = "psutil-5.8.0-cp27-none-win_amd64.whl", hash = "sha256:5da29e394bdedd9144c7331192e20c1f79283fb03b06e6abd3a8ae45ffecee65"}, + {file = "psutil-5.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:74fb2557d1430fff18ff0d72613c5ca30c45cdbfcddd6a5773e9fc1fe9364be8"}, + {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:74f2d0be88db96ada78756cb3a3e1b107ce8ab79f65aa885f76d7664e56928f6"}, + {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99de3e8739258b3c3e8669cb9757c9a861b2a25ad0955f8e53ac662d66de61ac"}, + {file = "psutil-5.8.0-cp36-cp36m-win32.whl", hash = "sha256:36b3b6c9e2a34b7d7fbae330a85bf72c30b1c827a4366a07443fc4b6270449e2"}, + {file = "psutil-5.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:52de075468cd394ac98c66f9ca33b2f54ae1d9bff1ef6b67a212ee8f639ec06d"}, + {file = "psutil-5.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c6a5fd10ce6b6344e616cf01cc5b849fa8103fbb5ba507b6b2dee4c11e84c935"}, + {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:61f05864b42fedc0771d6d8e49c35f07efd209ade09a5afe6a5059e7bb7bf83d"}, + {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:0dd4465a039d343925cdc29023bb6960ccf4e74a65ad53e768403746a9207023"}, + {file = "psutil-5.8.0-cp37-cp37m-win32.whl", hash = "sha256:1bff0d07e76114ec24ee32e7f7f8d0c4b0514b3fae93e3d2aaafd65d22502394"}, + {file = "psutil-5.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:fcc01e900c1d7bee2a37e5d6e4f9194760a93597c97fee89c4ae51701de03563"}, + {file = "psutil-5.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6223d07a1ae93f86451d0198a0c361032c4c93ebd4bf6d25e2fb3edfad9571ef"}, + {file = "psutil-5.8.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d225cd8319aa1d3c85bf195c4e07d17d3cd68636b8fc97e6cf198f782f99af28"}, + {file = "psutil-5.8.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:28ff7c95293ae74bf1ca1a79e8805fcde005c18a122ca983abf676ea3466362b"}, + {file = "psutil-5.8.0-cp38-cp38-win32.whl", hash = "sha256:ce8b867423291cb65cfc6d9c4955ee9bfc1e21fe03bb50e177f2b957f1c2469d"}, + {file = "psutil-5.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:90f31c34d25b1b3ed6c40cdd34ff122b1887a825297c017e4cbd6796dd8b672d"}, + {file = "psutil-5.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6323d5d845c2785efb20aded4726636546b26d3b577aded22492908f7c1bdda7"}, + {file = "psutil-5.8.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:245b5509968ac0bd179287d91210cd3f37add77dad385ef238b275bad35fa1c4"}, + {file = "psutil-5.8.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:90d4091c2d30ddd0a03e0b97e6a33a48628469b99585e2ad6bf21f17423b112b"}, + {file = "psutil-5.8.0-cp39-cp39-win32.whl", hash = "sha256:ea372bcc129394485824ae3e3ddabe67dc0b118d262c568b4d2602a7070afdb0"}, + {file = "psutil-5.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3"}, + {file = "psutil-5.8.0.tar.gz", hash = "sha256:0c9ccb99ab76025f2f0bbecf341d4656e9c1351db8cc8a03ccd62e318ab4b5c6"}, +] +ptyprocess = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] +py = [ + {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, + {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, +] +py-spy = [ + {file = "py_spy-0.3.8-py2.py3-none-macosx_10_7_x86_64.whl", hash = "sha256:f13a61fc643fb99bfb3e133d6d92534121ce21a9e5a237da919bd635ad438e5e"}, + {file = "py_spy-0.3.8-py2.py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ee84219d9187f8e6693ff02f3cea975f7edf75440fef3fa060bac4338615e1ed"}, + {file = "py_spy-0.3.8-py2.py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b085fb41994006c4e29be6605bda5275e23c7cf78993f1fe64203d6811dad77"}, + {file = "py_spy-0.3.8-py2.py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0503a0189b2030f7bb794e72f4b08b30d99efb5fc42d3d6ed901a21118280c60"}, + {file = "py_spy-0.3.8-py2.py3-none-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ef21e03dfc8d6ae55d3da450daeb8495f96e47ca150a535a7c98de85bfbe290"}, + {file = "py_spy-0.3.8-py2.py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:281afa786bd3a70a8375029f47f34b23aec02d9b06ed9b7cab8741c4e8cb8e32"}, + {file = "py_spy-0.3.8-py2.py3-none-win_amd64.whl", hash = "sha256:3f55b6ef89b069166b6bd8927cccf0f960d6233875110f1de92159498c7a38c5"}, + {file = "py_spy-0.3.8.tar.gz", hash = "sha256:eeb8961605e9071a8d501e43f9cd4896bc50efd58a891aa435735fb8d2ba21dd"}, +] +pyasn1 = [ + {file = "pyasn1-0.4.8-py2.4.egg", hash = "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3"}, + {file = "pyasn1-0.4.8-py2.5.egg", hash = "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf"}, + {file = "pyasn1-0.4.8-py2.6.egg", hash = "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00"}, + {file = "pyasn1-0.4.8-py2.7.egg", hash = "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8"}, + {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, + {file = "pyasn1-0.4.8-py3.1.egg", hash = "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86"}, + {file = "pyasn1-0.4.8-py3.2.egg", hash = "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7"}, + {file = "pyasn1-0.4.8-py3.3.egg", hash = "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576"}, + {file = "pyasn1-0.4.8-py3.4.egg", hash = "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12"}, + {file = "pyasn1-0.4.8-py3.5.egg", hash = "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2"}, + {file = "pyasn1-0.4.8-py3.6.egg", hash = "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359"}, + {file = "pyasn1-0.4.8-py3.7.egg", hash = "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776"}, + {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, +] +pyasn1-modules = [ + {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, + {file = "pyasn1_modules-0.2.8-py2.4.egg", hash = "sha256:0fe1b68d1e486a1ed5473f1302bd991c1611d319bba158e98b106ff86e1d7199"}, + {file = "pyasn1_modules-0.2.8-py2.5.egg", hash = "sha256:fe0644d9ab041506b62782e92b06b8c68cca799e1a9636ec398675459e031405"}, + {file = "pyasn1_modules-0.2.8-py2.6.egg", hash = "sha256:a99324196732f53093a84c4369c996713eb8c89d360a496b599fb1a9c47fc3eb"}, + {file = "pyasn1_modules-0.2.8-py2.7.egg", hash = "sha256:0845a5582f6a02bb3e1bde9ecfc4bfcae6ec3210dd270522fee602365430c3f8"}, + {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, + {file = "pyasn1_modules-0.2.8-py3.1.egg", hash = "sha256:f39edd8c4ecaa4556e989147ebf219227e2cd2e8a43c7e7fcb1f1c18c5fd6a3d"}, + {file = "pyasn1_modules-0.2.8-py3.2.egg", hash = "sha256:b80486a6c77252ea3a3e9b1e360bc9cf28eaac41263d173c032581ad2f20fe45"}, + {file = "pyasn1_modules-0.2.8-py3.3.egg", hash = "sha256:65cebbaffc913f4fe9e4808735c95ea22d7a7775646ab690518c056784bc21b4"}, + {file = "pyasn1_modules-0.2.8-py3.4.egg", hash = "sha256:15b7c67fabc7fc240d87fb9aabf999cf82311a6d6fb2c70d00d3d0604878c811"}, + {file = "pyasn1_modules-0.2.8-py3.5.egg", hash = "sha256:426edb7a5e8879f1ec54a1864f16b882c2837bfd06eee62f2c982315ee2473ed"}, + {file = "pyasn1_modules-0.2.8-py3.6.egg", hash = "sha256:cbac4bc38d117f2a49aeedec4407d23e8866ea4ac27ff2cf7fb3e5b570df19e0"}, + {file = "pyasn1_modules-0.2.8-py3.7.egg", hash = "sha256:c29a5e5cc7a3f05926aff34e097e84f8589cd790ce0ed41b67aed6857b26aafd"}, +] +pygments = [ + {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, + {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, +] +pyparsing = [ + {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, + {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, +] +pyreadline = [ + {file = "pyreadline-2.1.win-amd64.exe", hash = "sha256:9ce5fa65b8992dfa373bddc5b6e0864ead8f291c94fbfec05fbd5c836162e67b"}, + {file = "pyreadline-2.1.win32.exe", hash = "sha256:65540c21bfe14405a3a77e4c085ecfce88724743a4ead47c66b84defcf82c32e"}, + {file = "pyreadline-2.1.zip", hash = "sha256:4530592fc2e85b25b1a9f79664433da09237c1a270e4d78ea5aa3a2c7229e2d1"}, +] +pyro4 = [ + {file = "Pyro4-4.80-py2.py3-none-any.whl", hash = "sha256:f195a4a9403f58807e66ca269c771e1d268064945f65cfbbf59a1feb12a1695f"}, + {file = "Pyro4-4.80.tar.gz", hash = "sha256:46847ca703de3f483fbd0b2d22622f36eff03e6ef7ec7704d4ecaa3964cb2220"}, +] +pyrsistent = [ + {file = "pyrsistent-0.18.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f4c8cabb46ff8e5d61f56a037974228e978f26bfefce4f61a4b1ac0ba7a2ab72"}, + {file = "pyrsistent-0.18.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:da6e5e818d18459fa46fac0a4a4e543507fe1110e808101277c5a2b5bab0cd2d"}, + {file = "pyrsistent-0.18.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5e4395bbf841693eaebaa5bb5c8f5cdbb1d139e07c975c682ec4e4f8126e03d2"}, + {file = "pyrsistent-0.18.0-cp36-cp36m-win32.whl", hash = "sha256:527be2bfa8dc80f6f8ddd65242ba476a6c4fb4e3aedbf281dfbac1b1ed4165b1"}, + {file = "pyrsistent-0.18.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2aaf19dc8ce517a8653746d98e962ef480ff34b6bc563fc067be6401ffb457c7"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58a70d93fb79dc585b21f9d72487b929a6fe58da0754fa4cb9f279bb92369396"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4916c10896721e472ee12c95cdc2891ce5890898d2f9907b1b4ae0f53588b710"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:73ff61b1411e3fb0ba144b8f08d6749749775fe89688093e1efef9839d2dcc35"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-win32.whl", hash = "sha256:b29b869cf58412ca5738d23691e96d8aff535e17390128a1a52717c9a109da4f"}, + {file = "pyrsistent-0.18.0-cp37-cp37m-win_amd64.whl", hash = "sha256:097b96f129dd36a8c9e33594e7ebb151b1515eb52cceb08474c10a5479e799f2"}, + {file = "pyrsistent-0.18.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:772e94c2c6864f2cd2ffbe58bb3bdefbe2a32afa0acb1a77e472aac831f83427"}, + {file = "pyrsistent-0.18.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c1a9ff320fa699337e05edcaae79ef8c2880b52720bc031b219e5b5008ebbdef"}, + {file = "pyrsistent-0.18.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cd3caef37a415fd0dae6148a1b6957a8c5f275a62cca02e18474608cb263640c"}, + {file = "pyrsistent-0.18.0-cp38-cp38-win32.whl", hash = "sha256:e79d94ca58fcafef6395f6352383fa1a76922268fa02caa2272fff501c2fdc78"}, + {file = "pyrsistent-0.18.0-cp38-cp38-win_amd64.whl", hash = "sha256:a0c772d791c38bbc77be659af29bb14c38ced151433592e326361610250c605b"}, + {file = "pyrsistent-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d5ec194c9c573aafaceebf05fc400656722793dac57f254cd4741f3c27ae57b4"}, + {file = "pyrsistent-0.18.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:6b5eed00e597b5b5773b4ca30bd48a5774ef1e96f2a45d105db5b4ebb4bca680"}, + {file = "pyrsistent-0.18.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:48578680353f41dca1ca3dc48629fb77dfc745128b56fc01096b2530c13fd426"}, + {file = "pyrsistent-0.18.0-cp39-cp39-win32.whl", hash = "sha256:f3ef98d7b76da5eb19c37fda834d50262ff9167c65658d1d8f974d2e4d90676b"}, + {file = "pyrsistent-0.18.0-cp39-cp39-win_amd64.whl", hash = "sha256:404e1f1d254d314d55adb8d87f4f465c8693d6f902f67eb6ef5b4526dc58e6ea"}, + {file = "pyrsistent-0.18.0.tar.gz", hash = "sha256:773c781216f8c2900b42a7b638d5b517bb134ae1acbebe4d1e8f1f41ea60eb4b"}, +] +pytest = [ + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] +python-dateutil = [ + {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"}, +] +pytz = [ + {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, + {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, +] +pywavelets = [ + {file = "PyWavelets-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:35959c041ec014648575085a97b498eafbbaa824f86f6e4a59bfdef8a3fe6308"}, + {file = "PyWavelets-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:55e39ec848ceec13c9fa1598253ae9dd5c31d09dfd48059462860d2b908fb224"}, + {file = "PyWavelets-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c06d2e340c7bf8b9ec71da2284beab8519a3908eab031f4ea126e8ccfc3fd567"}, + {file = "PyWavelets-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:be105382961745f88d8196bba5a69ee2c4455d87ad2a2e5d1eed6bd7fda4d3fd"}, + {file = "PyWavelets-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:076ca8907001fdfe4205484f719d12b4a0262dfe6652fa1cfc3c5c362d14dc84"}, + {file = "PyWavelets-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7947e51ca05489b85928af52a34fe67022ab5b81d4ae32a4109a99e883a0635e"}, + {file = "PyWavelets-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:9e2528823ccf5a0a1d23262dfefe5034dce89cd84e4e124dc553dfcdf63ebb92"}, + {file = "PyWavelets-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:80b924edbc012ded8aa8b91cb2fd6207fb1a9a3a377beb4049b8a07445cec6f0"}, + {file = "PyWavelets-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c2a799e79cee81a862216c47e5623c97b95f1abee8dd1f9eed736df23fb653fb"}, + {file = "PyWavelets-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:d510aef84d9852653d079c84f2f81a82d5d09815e625f35c95714e7364570ad4"}, + {file = "PyWavelets-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:889d4c5c5205a9c90118c1980df526857929841df33e4cd1ff1eff77c6817a65"}, + {file = "PyWavelets-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:68b5c33741d26c827074b3d8f0251de1c3019bb9567b8d303eb093c822ce28f1"}, + {file = "PyWavelets-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:18a51b3f9416a2ae6e9a35c4af32cf520dd7895f2b69714f4aa2f4342fca47f9"}, + {file = "PyWavelets-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cfe79844526dd92e3ecc9490b5031fca5f8ab607e1e858feba232b1b788ff0ea"}, + {file = "PyWavelets-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:2f7429eeb5bf9c7068002d0d7f094ed654c77a70ce5e6198737fd68ab85f8311"}, + {file = "PyWavelets-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:720dbcdd3d91c6dfead79c80bf8b00a1d8aa4e5d551dc528c6d5151e4efc3403"}, + {file = "PyWavelets-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:bc5e87b72371da87c9bebc68e54882aada9c3114e640de180f62d5da95749cd3"}, + {file = "PyWavelets-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:98b2669c5af842a70cfab33a7043fcb5e7535a690a00cd251b44c9be0be418e5"}, + {file = "PyWavelets-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e02a0558e0c2ac8b8bbe6a6ac18c136767ec56b96a321e0dfde2173adfa5a504"}, + {file = "PyWavelets-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6162dc0ae04669ea04b4b51420777b9ea2d30b0a9d02901b2a3b4d61d159c2e9"}, + {file = "PyWavelets-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:39c74740718e420d38c78ca4498568fa57976d78d5096277358e0fa9629a7aea"}, + {file = "PyWavelets-1.1.1-cp38-cp38-win32.whl", hash = "sha256:79f5b54f9dc353e5ee47f0c3f02bebd2c899d49780633aa771fed43fa20b3149"}, + {file = "PyWavelets-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:935ff247b8b78bdf77647fee962b1cc208c51a7b229db30b9ba5f6da3e675178"}, + {file = "PyWavelets-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6ebfefebb5c6494a3af41ad8c60248a95da267a24b79ed143723d4502b1fe4d7"}, + {file = "PyWavelets-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:6bc78fb9c42a716309b4ace56f51965d8b5662c3ba19d4591749f31773db1125"}, + {file = "PyWavelets-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:411e17ca6ed8cf5e18a7ca5ee06a91c25800cc6c58c77986202abf98d749273a"}, + {file = "PyWavelets-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:83c5e3eb78ce111c2f0b45f46106cc697c3cb6c4e5f51308e1f81b512c70c8fb"}, + {file = "PyWavelets-1.1.1-cp39-cp39-win32.whl", hash = "sha256:2b634a54241c190ee989a4af87669d377b37c91bcc9cf0efe33c10ff847f7841"}, + {file = "PyWavelets-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:732bab78435c48be5d6bc75486ef629d7c8f112e07b313bf1f1a2220ab437277"}, + {file = "PyWavelets-1.1.1.tar.gz", hash = "sha256:1a64b40f6acb4ffbaccce0545d7fc641744f95351f62e4c6aaa40549326008c9"}, +] +pyyaml = [ + {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, + {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, + {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, + {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, + {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, + {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, + {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, + {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, + {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, + {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, + {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, + {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, + {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, + {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, + {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, + {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, + {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, +] +ray = [] +redis = [ + {file = "redis-3.5.3-py2.py3-none-any.whl", hash = "sha256:432b788c4530cfe16d8d943a09d40ca6c16149727e4afe8c2c9d5580c59d9f24"}, + {file = "redis-3.5.3.tar.gz", hash = "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2"}, +] +regex = [ + {file = "regex-2021.8.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9d05ad5367c90814099000442b2125535e9d77581855b9bee8780f1b41f2b1a2"}, + {file = "regex-2021.8.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3bf1bc02bc421047bfec3343729c4bbbea42605bcfd6d6bfe2c07ade8b12d2a"}, + {file = "regex-2021.8.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f6a808044faae658f546dd5f525e921de9fa409de7a5570865467f03a626fc0"}, + {file = "regex-2021.8.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a617593aeacc7a691cc4af4a4410031654f2909053bd8c8e7db837f179a630eb"}, + {file = "regex-2021.8.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79aef6b5cd41feff359acaf98e040844613ff5298d0d19c455b3d9ae0bc8c35a"}, + {file = "regex-2021.8.28-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0fc1f8f06977c2d4f5e3d3f0d4a08089be783973fc6b6e278bde01f0544ff308"}, + {file = "regex-2021.8.28-cp310-cp310-win32.whl", hash = "sha256:6eebf512aa90751d5ef6a7c2ac9d60113f32e86e5687326a50d7686e309f66ed"}, + {file = "regex-2021.8.28-cp310-cp310-win_amd64.whl", hash = "sha256:ac88856a8cbccfc14f1b2d0b829af354cc1743cb375e7f04251ae73b2af6adf8"}, + {file = "regex-2021.8.28-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c206587c83e795d417ed3adc8453a791f6d36b67c81416676cad053b4104152c"}, + {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8690ed94481f219a7a967c118abaf71ccc440f69acd583cab721b90eeedb77c"}, + {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:328a1fad67445550b982caa2a2a850da5989fd6595e858f02d04636e7f8b0b13"}, + {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c7cb4c512d2d3b0870e00fbbac2f291d4b4bf2634d59a31176a87afe2777c6f0"}, + {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66256b6391c057305e5ae9209941ef63c33a476b73772ca967d4a2df70520ec1"}, + {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8e44769068d33e0ea6ccdf4b84d80c5afffe5207aa4d1881a629cf0ef3ec398f"}, + {file = "regex-2021.8.28-cp36-cp36m-win32.whl", hash = "sha256:08d74bfaa4c7731b8dac0a992c63673a2782758f7cfad34cf9c1b9184f911354"}, + {file = "regex-2021.8.28-cp36-cp36m-win_amd64.whl", hash = "sha256:abb48494d88e8a82601af905143e0de838c776c1241d92021e9256d5515b3645"}, + {file = "regex-2021.8.28-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b4c220a1fe0d2c622493b0a1fd48f8f991998fb447d3cd368033a4b86cf1127a"}, + {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4a332404baa6665b54e5d283b4262f41f2103c255897084ec8f5487ce7b9e8e"}, + {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c61dcc1cf9fd165127a2853e2c31eb4fb961a4f26b394ac9fe5669c7a6592892"}, + {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ee329d0387b5b41a5dddbb6243a21cb7896587a651bebb957e2d2bb8b63c0791"}, + {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60667673ff9c249709160529ab39667d1ae9fd38634e006bec95611f632e759"}, + {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b844fb09bd9936ed158ff9df0ab601e2045b316b17aa8b931857365ea8586906"}, + {file = "regex-2021.8.28-cp37-cp37m-win32.whl", hash = "sha256:4cde065ab33bcaab774d84096fae266d9301d1a2f5519d7bd58fc55274afbf7a"}, + {file = "regex-2021.8.28-cp37-cp37m-win_amd64.whl", hash = "sha256:1413b5022ed6ac0d504ba425ef02549a57d0f4276de58e3ab7e82437892704fc"}, + {file = "regex-2021.8.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ed4b50355b066796dacdd1cf538f2ce57275d001838f9b132fab80b75e8c84dd"}, + {file = "regex-2021.8.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28fc475f560d8f67cc8767b94db4c9440210f6958495aeae70fac8faec631797"}, + {file = "regex-2021.8.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdc178caebd0f338d57ae445ef8e9b737ddf8fbc3ea187603f65aec5b041248f"}, + {file = "regex-2021.8.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:999ad08220467b6ad4bd3dd34e65329dd5d0df9b31e47106105e407954965256"}, + {file = "regex-2021.8.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:808ee5834e06f57978da3e003ad9d6292de69d2bf6263662a1a8ae30788e080b"}, + {file = "regex-2021.8.28-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d5111d4c843d80202e62b4fdbb4920db1dcee4f9366d6b03294f45ed7b18b42e"}, + {file = "regex-2021.8.28-cp38-cp38-win32.whl", hash = "sha256:473858730ef6d6ff7f7d5f19452184cd0caa062a20047f6d6f3e135a4648865d"}, + {file = "regex-2021.8.28-cp38-cp38-win_amd64.whl", hash = "sha256:31a99a4796bf5aefc8351e98507b09e1b09115574f7c9dbb9cf2111f7220d2e2"}, + {file = "regex-2021.8.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:04f6b9749e335bb0d2f68c707f23bb1773c3fb6ecd10edf0f04df12a8920d468"}, + {file = "regex-2021.8.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b006628fe43aa69259ec04ca258d88ed19b64791693df59c422b607b6ece8bb"}, + {file = "regex-2021.8.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:121f4b3185feaade3f85f70294aef3f777199e9b5c0c0245c774ae884b110a2d"}, + {file = "regex-2021.8.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a577a21de2ef8059b58f79ff76a4da81c45a75fe0bfb09bc8b7bb4293fa18983"}, + {file = "regex-2021.8.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1743345e30917e8c574f273f51679c294effba6ad372db1967852f12c76759d8"}, + {file = "regex-2021.8.28-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e1e8406b895aba6caa63d9fd1b6b1700d7e4825f78ccb1e5260551d168db38ed"}, + {file = "regex-2021.8.28-cp39-cp39-win32.whl", hash = "sha256:ed283ab3a01d8b53de3a05bfdf4473ae24e43caee7dcb5584e86f3f3e5ab4374"}, + {file = "regex-2021.8.28-cp39-cp39-win_amd64.whl", hash = "sha256:610b690b406653c84b7cb6091facb3033500ee81089867ee7d59e675f9ca2b73"}, + {file = "regex-2021.8.28.tar.gz", hash = "sha256:f585cbbeecb35f35609edccb95efd95a3e35824cd7752b586503f7e6087303f1"}, +] +requests = [ + {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, + {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, +] +rsa = [ + {file = "rsa-4.7.2-py3-none-any.whl", hash = "sha256:78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2"}, + {file = "rsa-4.7.2.tar.gz", hash = "sha256:9d689e6ca1b3038bc82bf8d23e944b6b6037bc02301a574935b2dd946e0353b9"}, +] +scikit-image = [ + {file = "scikit-image-0.18.3.tar.gz", hash = "sha256:ecae99f93f4c5e9b1bf34959f4dc596c41f2f6b2fc407d9d9ddf85aebd3137ca"}, + {file = "scikit_image-0.18.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7f27357adae9225df10fd152224d4c43978ae222f44bad7fedbfc2b81b985f9d"}, + {file = "scikit_image-0.18.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bf3cdadc15db90f875bf59bdd0db080337e6353bb3d165c281f9af456d9d3f2"}, + {file = "scikit_image-0.18.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2f24eb3df859ba5b3fb66947fe2d7240653b38f307d574e25f1ae29cc2a212ee"}, + {file = "scikit_image-0.18.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e2148846fae22e12b7a20d11d951adae57213dd097af5960407eb5c4421c0ab3"}, + {file = "scikit_image-0.18.3-cp37-cp37m-win32.whl", hash = "sha256:142d070a41f9dfed0c3661e0dd9ce3cdb59a20a5b5ab071f529577d6d3e1fb81"}, + {file = "scikit_image-0.18.3-cp37-cp37m-win_amd64.whl", hash = "sha256:05b430b1f8e25f7ba4a55afc6bf592af00f0ec809ab1d80bdede8893e7c6af57"}, + {file = "scikit_image-0.18.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ef92f42d8a0794c47df1eeb1937119b6686b523dc663ecc5ffdf3c91645719ac"}, + {file = "scikit_image-0.18.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b60fe0bc6e770c126c625f8c2d8af3b20fea53dac845abdf474bef1bd526490"}, + {file = "scikit_image-0.18.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:088bf793696a3d5f56cce27c75d415fa795d1db9336b7e8257a1764dc03c7c52"}, + {file = "scikit_image-0.18.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7994866857a1bb388cf3ede4ca7a8fba0b89ef980d5d802ec25e30124a2a34db"}, + {file = "scikit_image-0.18.3-cp38-cp38-win32.whl", hash = "sha256:b29982f07231f60d6170f4c2c6f2fe88051a7b4194d775aefd81bfee107452b9"}, + {file = "scikit_image-0.18.3-cp38-cp38-win_amd64.whl", hash = "sha256:3f3aa984638a6868171d176d26d6bd17b7b16a9fd505eaa97482f00a4310e3ff"}, + {file = "scikit_image-0.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f698fc715202eeccabb371190c19c2d6713696de4d07609a0fa0cae3acb0b3dd"}, + {file = "scikit_image-0.18.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0bf23d3d182ba8fe4ef8a0935e843be1f6c99e7eebeb492ac07c305e8cbb1dcd"}, + {file = "scikit_image-0.18.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bfa6eb04dc0b8773043f9994eccd8c517d713cd0f9e960dcb6754e19c1abceb1"}, + {file = "scikit_image-0.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8394ad148685ed6ea8d84eb9c41e70cef1adda6c6d9a0ff8476c3126818a9340"}, + {file = "scikit_image-0.18.3-cp39-cp39-win32.whl", hash = "sha256:ec242ff35bd4bc531aaf00c6edb9f0f64ff36ff353bd6ecd8f1c77886ddc0a7a"}, + {file = "scikit_image-0.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:3068af85682e90fda021070969dd2fce667f89a868c6aacb2fffbc5aa002e39e"}, +] +scikit-learn = [ + {file = "scikit-learn-0.24.2.tar.gz", hash = "sha256:d14701a12417930392cd3898e9646cf5670c190b933625ebe7511b1f7d7b8736"}, + {file = "scikit_learn-0.24.2-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:d5bf9c863ba4717b3917b5227463ee06860fc43931dc9026747de416c0a10fee"}, + {file = "scikit_learn-0.24.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5beaeb091071625e83f5905192d8aecde65ba2f26f8b6719845bbf586f7a04a1"}, + {file = "scikit_learn-0.24.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:06ffdcaaf81e2a3b1b50c3ac6842cfb13df2d8b737d61f64643ed61da7389cde"}, + {file = "scikit_learn-0.24.2-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:fec42690a2eb646b384eafb021c425fab48991587edb412d4db77acc358b27ce"}, + {file = "scikit_learn-0.24.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:5ff3e4e4cf7592d36541edec434e09fb8ab9ba6b47608c4ffe30c9038d301897"}, + {file = "scikit_learn-0.24.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:3cbd734e1aefc7c5080e6b6973fe062f97c26a1cdf1a991037ca196ce1c8f427"}, + {file = "scikit_learn-0.24.2-cp36-cp36m-win32.whl", hash = "sha256:f74429a07fedb36a03c159332b914e6de757176064f9fed94b5f79ebac07d913"}, + {file = "scikit_learn-0.24.2-cp36-cp36m-win_amd64.whl", hash = "sha256:dd968a174aa82f3341a615a033fa6a8169e9320cbb46130686562db132d7f1f0"}, + {file = "scikit_learn-0.24.2-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:49ec0b1361da328da9bb7f1a162836028e72556356adeb53342f8fae6b450d47"}, + {file = "scikit_learn-0.24.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f18c3ed484eeeaa43a0d45dc2efb4d00fc6542ccdcfa2c45d7b635096a2ae534"}, + {file = "scikit_learn-0.24.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cdf24c1b9bbeb4936456b42ac5bd32c60bb194a344951acb6bfb0cddee5439a4"}, + {file = "scikit_learn-0.24.2-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d177fe1ff47cc235942d628d41ee5b1c6930d8f009f1a451c39b5411e8d0d4cf"}, + {file = "scikit_learn-0.24.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f3ec00f023d84526381ad0c0f2cff982852d035c921bbf8ceb994f4886c00c64"}, + {file = "scikit_learn-0.24.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:ae19ac105cf7ce8c205a46166992fdec88081d6e783ab6e38ecfbe45729f3c39"}, + {file = "scikit_learn-0.24.2-cp37-cp37m-win32.whl", hash = "sha256:f0ed4483c258fb23150e31b91ea7d25ff8495dba108aea0b0d4206a777705350"}, + {file = "scikit_learn-0.24.2-cp37-cp37m-win_amd64.whl", hash = "sha256:39b7e3b71bcb1fe46397185d6c1a5db1c441e71c23c91a31e7ad8cc3f7305f9a"}, + {file = "scikit_learn-0.24.2-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:90a297330f608adeb4d2e9786c6fda395d3150739deb3d42a86d9a4c2d15bc1d"}, + {file = "scikit_learn-0.24.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:f1d2108e770907540b5248977e4cff9ffaf0f73d0d13445ee938df06ca7579c6"}, + {file = "scikit_learn-0.24.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:1eec963fe9ffc827442c2e9333227c4d49749a44e592f305398c1db5c1563393"}, + {file = "scikit_learn-0.24.2-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:2db429090b98045d71218a9ba913cc9b3fe78e0ba0b6b647d8748bc6d5a44080"}, + {file = "scikit_learn-0.24.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:62214d2954377fcf3f31ec867dd4e436df80121e7a32947a0b3244f58f45e455"}, + {file = "scikit_learn-0.24.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8fac72b9688176922f9f54fda1ba5f7ffd28cbeb9aad282760186e8ceba9139a"}, + {file = "scikit_learn-0.24.2-cp38-cp38-win32.whl", hash = "sha256:ae426e3a52842c6b6d77d00f906b6031c8c2cfdfabd6af7511bb4bc9a68d720e"}, + {file = "scikit_learn-0.24.2-cp38-cp38-win_amd64.whl", hash = "sha256:038f4e9d6ef10e1f3fe82addc3a14735c299866eb10f2c77c090410904828312"}, + {file = "scikit_learn-0.24.2-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:48f273836e19901ba2beecd919f7b352f09310ce67c762f6e53bc6b81cacf1f0"}, + {file = "scikit_learn-0.24.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:a2a47449093dcf70babc930beba2ca0423cb7df2fa5fd76be5260703d67fa574"}, + {file = "scikit_learn-0.24.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:0e71ce9c7cbc20f6f8b860107ce15114da26e8675238b4b82b7e7cd37ca0c087"}, + {file = "scikit_learn-0.24.2-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2754c85b2287333f9719db7f23fb7e357f436deed512db3417a02bf6f2830aa5"}, + {file = "scikit_learn-0.24.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:7be1b88c23cfac46e06404582215a917017cd2edaa2e4d40abe6aaff5458f24b"}, + {file = "scikit_learn-0.24.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:4e6198675a6f9d333774671bd536668680eea78e2e81c0b19e57224f58d17f37"}, + {file = "scikit_learn-0.24.2-cp39-cp39-win32.whl", hash = "sha256:cbdb0b3db99dd1d5f69d31b4234367d55475add31df4d84a3bd690ef017b55e2"}, + {file = "scikit_learn-0.24.2-cp39-cp39-win_amd64.whl", hash = "sha256:40556bea1ef26ef54bc678d00cf138a63069144a0b5f3a436eecd8f3468b903e"}, +] +scipy = [ + {file = "scipy-1.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a15a1f3fc0abff33e792d6049161b7795909b40b97c6cc2934ed54384017ab76"}, + {file = "scipy-1.6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e79570979ccdc3d165456dd62041d9556fb9733b86b4b6d818af7a0afc15f092"}, + {file = "scipy-1.6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a423533c55fec61456dedee7b6ee7dce0bb6bfa395424ea374d25afa262be261"}, + {file = "scipy-1.6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:33d6b7df40d197bdd3049d64e8e680227151673465e5d85723b3b8f6b15a6ced"}, + {file = "scipy-1.6.1-cp37-cp37m-win32.whl", hash = "sha256:6725e3fbb47da428794f243864f2297462e9ee448297c93ed1dcbc44335feb78"}, + {file = "scipy-1.6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:5fa9c6530b1661f1370bcd332a1e62ca7881785cc0f80c0d559b636567fab63c"}, + {file = "scipy-1.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd50daf727f7c195e26f27467c85ce653d41df4358a25b32434a50d8870fc519"}, + {file = "scipy-1.6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:f46dd15335e8a320b0fb4685f58b7471702234cba8bb3442b69a3e1dc329c345"}, + {file = "scipy-1.6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0e5b0ccf63155d90da576edd2768b66fb276446c371b73841e3503be1d63fb5d"}, + {file = "scipy-1.6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2481efbb3740977e3c831edfd0bd9867be26387cacf24eb5e366a6a374d3d00d"}, + {file = "scipy-1.6.1-cp38-cp38-win32.whl", hash = "sha256:68cb4c424112cd4be886b4d979c5497fba190714085f46b8ae67a5e4416c32b4"}, + {file = "scipy-1.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:5f331eeed0297232d2e6eea51b54e8278ed8bb10b099f69c44e2558c090d06bf"}, + {file = "scipy-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8a51d33556bf70367452d4d601d1742c0e806cd0194785914daf19775f0e67"}, + {file = "scipy-1.6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:83bf7c16245c15bc58ee76c5418e46ea1811edcc2e2b03041b804e46084ab627"}, + {file = "scipy-1.6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:794e768cc5f779736593046c9714e0f3a5940bc6dcc1dba885ad64cbfb28e9f0"}, + {file = "scipy-1.6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5da5471aed911fe7e52b86bf9ea32fb55ae93e2f0fac66c32e58897cfb02fa07"}, + {file = "scipy-1.6.1-cp39-cp39-win32.whl", hash = "sha256:8e403a337749ed40af60e537cc4d4c03febddcc56cd26e774c9b1b600a70d3e4"}, + {file = "scipy-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a5193a098ae9f29af283dcf0041f762601faf2e595c0db1da929875b7570353f"}, + {file = "scipy-1.6.1.tar.gz", hash = "sha256:c4fceb864890b6168e79b0e714c585dbe2fd4222768ee90bc1aa0f8218691b11"}, +] +serpent = [ + {file = "serpent-1.40-py3-none-any.whl", hash = "sha256:14d531cedeed593e793bae4e14eb1463445e8b161cb24ddf795800a50973d3d3"}, + {file = "serpent-1.40.tar.gz", hash = "sha256:10b34e7f8e3207ee6fb70dcdc9bce473851ee3daf0b47c58aec1b48032ac11ce"}, +] +simple-term-menu = [ + {file = "simple-term-menu-1.4.1.tar.gz", hash = "sha256:401e7efc6726e195b8e62bfcede51298dc0daf8c5f043a521c8828191b0b012e"}, + {file = "simple_term_menu-1.4.1-py3-none-any.whl", hash = "sha256:35cfbf6e855c347938c2da27a619cf0e212bc72a48bb86e43fa462ec7d7bccec"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +tabulate = [ + {file = "tabulate-0.8.9-py3-none-any.whl", hash = "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4"}, + {file = "tabulate-0.8.9.tar.gz", hash = "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7"}, +] +tensorboardx = [ + {file = "tensorboardX-2.4-py2.py3-none-any.whl", hash = "sha256:2742b1ac3fdef2b938b1110b503c6986b7100a3250394a5a44ef12784b563b55"}, + {file = "tensorboardX-2.4.tar.gz", hash = "sha256:e56331ee79b7656c6f0974ab2e918045d5e9393701f83cac8884de4b5b360130"}, +] +threadpoolctl = [ + {file = "threadpoolctl-2.2.0-py3-none-any.whl", hash = "sha256:e5a995e3ffae202758fa8a90082e35783b9370699627ae2733cd1c3a73553616"}, + {file = "threadpoolctl-2.2.0.tar.gz", hash = "sha256:86d4b6801456d780e94681d155779058759eaef3c3564758b17b6c99db5f81cb"}, +] +tifffile = [ + {file = "tifffile-2021.8.30-py3-none-any.whl", hash = "sha256:524f9f3a96ca91d12e5b5ddce80209d2b07769c1764ceecf505613668143f63c"}, + {file = "tifffile-2021.8.30.tar.gz", hash = "sha256:8760e61e30106ea0dab9ec42a238d70a3ff55dde9c54456e7b748fe717cb782d"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +tomli = [ + {file = "tomli-1.2.1-py3-none-any.whl", hash = "sha256:8dd0e9524d6f386271a36b41dbf6c57d8e32fd96fd22b6584679dc569d20899f"}, + {file = "tomli-1.2.1.tar.gz", hash = "sha256:a5b75cb6f3968abb47af1b40c1819dc519ea82bcc065776a866e8d74c5ca9442"}, +] +tqdm = [ + {file = "tqdm-4.62.2-py2.py3-none-any.whl", hash = "sha256:80aead664e6c1672c4ae20dc50e1cdc5e20eeff9b14aa23ecd426375b28be588"}, + {file = "tqdm-4.62.2.tar.gz", hash = "sha256:a4d6d112e507ef98513ac119ead1159d286deab17dffedd96921412c2d236ff5"}, +] +traitlets = [ + {file = "traitlets-5.1.0-py3-none-any.whl", hash = "sha256:03f172516916220b58c9f19d7f854734136dd9528103d04e9bf139a92c9f54c4"}, + {file = "traitlets-5.1.0.tar.gz", hash = "sha256:bd382d7ea181fbbcce157c133db9a829ce06edffe097bcf3ab945b435452b46d"}, +] +typed-ast = [ + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, + {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, + {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, + {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, + {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, + {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, + {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, + {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, + {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, + {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, + {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, + {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, + {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, + {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, + {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, + {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, +] +typing = [ + {file = "typing-3.7.4.3-py2-none-any.whl", hash = "sha256:283d868f5071ab9ad873e5e52268d611e851c870a2ba354193026f2dfb29d8b5"}, + {file = "typing-3.7.4.3.tar.gz", hash = "sha256:1187fb9c82fd670d10aa07bbb6cfcfe4bdda42d6fab8d5134f04e8c4d0b71cc9"}, +] +typing-extensions = [ + {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, + {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, + {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, +] +urllib3 = [ + {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"}, + {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"}, +] +wcwidth = [ + {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, + {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, +] +xmltodict = [ + {file = "xmltodict-0.12.0-py2.py3-none-any.whl", hash = "sha256:8bbcb45cc982f48b2ca8fe7e7827c5d792f217ecf1792626f808bf41c3b86051"}, + {file = "xmltodict-0.12.0.tar.gz", hash = "sha256:50d8c638ed7ecb88d90561beedbf720c9b4e851a9fa6c47ebd64e99d166d8a21"}, +] +yarl = [ + {file = "yarl-1.6.3-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366"}, + {file = "yarl-1.6.3-cp36-cp36m-win32.whl", hash = "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721"}, + {file = "yarl-1.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643"}, + {file = "yarl-1.6.3-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970"}, + {file = "yarl-1.6.3-cp37-cp37m-win32.whl", hash = "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e"}, + {file = "yarl-1.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50"}, + {file = "yarl-1.6.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2"}, + {file = "yarl-1.6.3-cp38-cp38-win32.whl", hash = "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896"}, + {file = "yarl-1.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a"}, + {file = "yarl-1.6.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4"}, + {file = "yarl-1.6.3-cp39-cp39-win32.whl", hash = "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424"}, + {file = "yarl-1.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6"}, + {file = "yarl-1.6.3.tar.gz", hash = "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10"}, +] +zipp = [ + {file = "zipp-3.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"}, + {file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"}, +] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..4498847 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,30 @@ +[tool.poetry] +name = "minerl-rllib" +version = "0.1.0" +description = "minerl-rllib is a reinforcement learning suite that benchmarks algorithms in RLLib on the MineRL environment." +license = "GPL-3.0-only" +authors = ["Julius Frost"] +readme = "README.md" +homepage = "https://github.com/juliusfrost/minerl-rllib/" +repository = "https://github.com/juliusfrost/minerl-rllib/" + +[tool.poetry.dependencies] +python = "^3.7.1" +scikit-learn = "^0.24.2" +ray = [ + {extras = ["default", "tune", "rllib"], markers = "python_version == '3.9' and sys_platform == 'linux'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/cd22a7d1bbf38f66aa8b735459319ff24f102a20/ray-2.0.0.dev0-cp39-cp39-manylinux2014_x86_64.whl"}, + {extras = ["default", "tune", "rllib"], markers = "python_version == '3.8' and sys_platform == 'linux'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/cd22a7d1bbf38f66aa8b735459319ff24f102a20/ray-2.0.0.dev0-cp38-cp38-manylinux2014_x86_64.whl"}, + {extras = ["default", "tune", "rllib"], markers = "python_version == '3.7' and sys_platform == 'linux'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/cd22a7d1bbf38f66aa8b735459319ff24f102a20/ray-2.0.0.dev0-cp37-cp37m-manylinux2014_x86_64.whl"}, + {extras = ["default", "tune", "rllib"], markers = "python_version == '3.9' and sys_platform == 'win32'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/cd22a7d1bbf38f66aa8b735459319ff24f102a20/ray-2.0.0.dev0-cp39-cp39-win_amd64.whl"}, + {extras = ["default", "tune", "rllib"], markers = "python_version == '3.8' and sys_platform == 'win32'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/cd22a7d1bbf38f66aa8b735459319ff24f102a20/ray-2.0.0.dev0-cp38-cp38-win_amd64.whl"}, + {extras = ["default", "tune", "rllib"], markers = "python_version == '3.7' and sys_platform == 'win32'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/cd22a7d1bbf38f66aa8b735459319ff24f102a20/ray-2.0.0.dev0-cp37-cp37m-win_amd64.whl"} +] +minerl-wrappers = "^0.1.4" + +[tool.poetry.dev-dependencies] +pytest = "^6.2.4" +black = "^21.7b0" + +[build-system] +requires = ["poetry-core=1.1.8"] +build-backend = "poetry.core.masonry.api" From c49e2231ab55cc9542fed876675f98fe55ea6f15 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Thu, 9 Sep 2021 00:57:33 -0400 Subject: [PATCH 19/48] update .gitignore --- .gitignore | 238 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 238 insertions(+) diff --git a/.gitignore b/.gitignore index 8b63158..5762a63 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,241 @@ +# Project Specific data/ logs/ results/ + +# Created by https://www.toptal.com/developers/gitignore/api/pycharm+all,python +# Edit at https://www.toptal.com/developers/gitignore?templates=pycharm+all,python + +### PyCharm+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### PyCharm+all Patch ### +# Ignores the whole .idea folder and all .iml files +# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360 + +.idea/ + +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + +*.iml +modules.xml +.idea/misc.xml +*.ipr + +# Sonarlint plugin +.idea/sonarlint + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# End of https://www.toptal.com/developers/gitignore/api/pycharm+all,python From 88be6074ac65709bfbb750ab89d893946e9dcf19 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Thu, 9 Sep 2021 19:18:25 -0400 Subject: [PATCH 20/48] update --- poetry.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/poetry.lock b/poetry.lock index 75926aa..741f19d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -710,7 +710,7 @@ python-versions = "*" [[package]] name = "networkx" -version = "2.6.2" +version = "2.6.3" description = "Python package for creating and manipulating graphs and networks" category = "main" optional = false @@ -933,7 +933,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "py-spy" -version = "0.3.8" +version = "0.3.9" description = "Sampling profiler for Python programs" category = "main" optional = false @@ -1993,8 +1993,8 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] networkx = [ - {file = "networkx-2.6.2-py3-none-any.whl", hash = "sha256:5fcb7004be69e8fbdf07dcb502efa5c77cadcaad6982164134eeb9721f826c2e"}, - {file = "networkx-2.6.2.tar.gz", hash = "sha256:2306f1950ce772c5a59a57f5486d59bb9cab98497c45fc49cbc45ac0dec119bb"}, + {file = "networkx-2.6.3-py3-none-any.whl", hash = "sha256:80b6b89c77d1dfb64a4c7854981b60aeea6360ac02c6d4e4913319e0a313abef"}, + {file = "networkx-2.6.3.tar.gz", hash = "sha256:c0946ed31d71f1b732b5aaa6da5a0388a345019af232ce2f49c766e2d6795c51"}, ] numpy = [ {file = "numpy-1.21.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38e8648f9449a549a7dfe8d8755a5979b45b3538520d1e735637ef28e8c2dc50"}, @@ -2243,14 +2243,14 @@ py = [ {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, ] py-spy = [ - {file = "py_spy-0.3.8-py2.py3-none-macosx_10_7_x86_64.whl", hash = "sha256:f13a61fc643fb99bfb3e133d6d92534121ce21a9e5a237da919bd635ad438e5e"}, - {file = "py_spy-0.3.8-py2.py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ee84219d9187f8e6693ff02f3cea975f7edf75440fef3fa060bac4338615e1ed"}, - {file = "py_spy-0.3.8-py2.py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b085fb41994006c4e29be6605bda5275e23c7cf78993f1fe64203d6811dad77"}, - {file = "py_spy-0.3.8-py2.py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0503a0189b2030f7bb794e72f4b08b30d99efb5fc42d3d6ed901a21118280c60"}, - {file = "py_spy-0.3.8-py2.py3-none-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ef21e03dfc8d6ae55d3da450daeb8495f96e47ca150a535a7c98de85bfbe290"}, - {file = "py_spy-0.3.8-py2.py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:281afa786bd3a70a8375029f47f34b23aec02d9b06ed9b7cab8741c4e8cb8e32"}, - {file = "py_spy-0.3.8-py2.py3-none-win_amd64.whl", hash = "sha256:3f55b6ef89b069166b6bd8927cccf0f960d6233875110f1de92159498c7a38c5"}, - {file = "py_spy-0.3.8.tar.gz", hash = "sha256:eeb8961605e9071a8d501e43f9cd4896bc50efd58a891aa435735fb8d2ba21dd"}, + {file = "py_spy-0.3.9-py2.py3-none-macosx_10_7_x86_64.whl", hash = "sha256:3c80c50a5b6b25a761c3688f9205330d20e4862152ef65a821349d5993ffe4a0"}, + {file = "py_spy-0.3.9-py2.py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:c39178711e83e921aa15c61ebd37fbcd205cce8250c6844bfa3ce493ec09ff49"}, + {file = "py_spy-0.3.9-py2.py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a43be414930cae73672d89d2c57c45fffa0d68a2c259047c50eab174f635528f"}, + {file = "py_spy-0.3.9-py2.py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1f76f97029f8839306d8a38e10319b8695d1ed4fa693396341b3ba9a9b4c8ff6"}, + {file = "py_spy-0.3.9-py2.py3-none-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3df9b490c40882ce9291037997496c281b3f0c6f50c5f0b9b0a159ba0f5ad43c"}, + {file = "py_spy-0.3.9-py2.py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8105e691eca41849e7940db49b340697a117f4b7a091fc248cf7d13be2bbc7d2"}, + {file = "py_spy-0.3.9-py2.py3-none-win_amd64.whl", hash = "sha256:31e556317501dbf70ef14cb180f652905e7776228b79ba2c642f5deb5e826cf5"}, + {file = "py_spy-0.3.9.tar.gz", hash = "sha256:127148a0de9264c9e036509c1596ca7402438bf7906c16a082e335af7a0d4261"}, ] pyasn1 = [ {file = "pyasn1-0.4.8-py2.4.egg", hash = "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3"}, From 39448055bb9d188046c837d771d8869f92d5c283 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Thu, 9 Sep 2021 19:18:51 -0400 Subject: [PATCH 21/48] outdated requirements.txt --- requirements.txt | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index bc53cb7..0000000 --- a/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -ray[default,tune,rllib]>=1.4.1 -minerl-wrappers>=0.1.3 -scikit-learn>=0.24.2 \ No newline at end of file From f3509b7e8b589756b6d0c0d3a762cd3e7cac2153 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Thu, 9 Sep 2021 20:05:21 -0400 Subject: [PATCH 22/48] fix build system --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 4498847..9bd62e9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,5 +26,5 @@ pytest = "^6.2.4" black = "^21.7b0" [build-system] -requires = ["poetry-core=1.1.8"] +requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" From c6a4d77eed98e23aebc1590ed69704b7ea2b2300 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Sat, 11 Sep 2021 23:02:21 -0400 Subject: [PATCH 23/48] update dependencies --- poetry.lock | 25 ++++++++++++------------- pyproject.toml | 20 +++++++++++++------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/poetry.lock b/poetry.lock index 741f19d..fe84076 100644 --- a/poetry.lock +++ b/poetry.lock @@ -245,7 +245,7 @@ test = ["psutil"] [[package]] name = "decorator" -version = "5.0.9" +version = "5.1.0" description = "Decorators for Humans" category = "main" optional = false @@ -635,7 +635,7 @@ traitlets = "*" [[package]] name = "minerl" -version = "0.4.1a2" +version = "0.4.2" description = "MineRL environment and data loader for reinforcement learning from human demonstration in Minecraft" category = "main" optional = false @@ -671,7 +671,7 @@ docs = ["sphinx-rtd-theme", "sphinxcontrib-napoleon"] [[package]] name = "minerl-wrappers" -version = "0.1.4" +version = "0.1.5" description = "minerl-wrappers compiles common wrappers and standardizes code for reproducibility in the MineRL environment!" category = "main" optional = false @@ -679,7 +679,7 @@ python-versions = ">=3.7,<4.0" [package.dependencies] gym = ">=0.19.0,<0.20.0" -minerl = "0.4.1a2" +minerl = "0.4.2" numpy = ">=1.21.0,<2.0.0" opencv-python = ">=4.5.3,<5.0.0" PyYAML = ">=5.4.1,<6.0.0" @@ -1103,8 +1103,7 @@ tabulate = {version = "*", optional = true, markers = "extra == \"rllib\""} tensorboardX = {version = ">=1.9", optional = true, markers = "extra == \"rllib\""} [package.extras] -all = ["opentelemetry-exporter-otlp (==1.1.0)", "kubernetes", "lz4", "scikit-image", "aioredis (<2)", "prometheus-client (>=0.7.1)", "aiohttp-cors", "opentelemetry-api (==1.1.0)", "uvicorn", "tabulate", "pandas", "py-spy (>=0.2.0)", "starlette", "fastapi", "opencensus", "dm-tree", "scipy", "urllib3", "tensorboardX (>=1.9)", "colorful", "ray-cpp (==2.0.0.dev0)", "kopf", "aiohttp", "pyyaml", "jsonschema", "matplotlib (!=3.4.3)", "gym", "requests", "gpustat", "opentelemetry-sdk (==1.1.0)"] -cpp = ["ray-cpp (==2.0.0.dev0)"] +all = ["aioredis (<2)", "starlette", "opencensus", "scikit-image", "prometheus-client (>=0.7.1)", "aiohttp-cors", "tabulate", "tensorboardX (>=1.9)", "jsonschema", "scipy", "uvicorn", "kubernetes", "requests", "gym", "gpustat", "aiohttp", "urllib3", "dm-tree", "py-spy (>=0.2.0)", "pandas", "opentelemetry-api (==1.1.0)", "kopf", "matplotlib (!=3.4.3)", "opentelemetry-sdk (==1.1.0)", "fastapi", "colorful", "pyyaml", "opentelemetry-exporter-otlp (==1.1.0)", "lz4"] default = ["aiohttp", "aiohttp-cors", "aioredis (<2)", "colorful", "py-spy (>=0.2.0)", "jsonschema", "requests", "gpustat", "opencensus", "prometheus-client (>=0.7.1)"] k8s = ["kubernetes", "urllib3", "kopf"] observability = ["opentelemetry-api (==1.1.0)", "opentelemetry-sdk (==1.1.0)", "opentelemetry-exporter-otlp (==1.1.0)"] @@ -1114,7 +1113,7 @@ tune = ["pandas", "tabulate", "tensorboardX (>=1.9)", "requests"] [package.source] type = "url" -url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/cd22a7d1bbf38f66aa8b735459319ff24f102a20/ray-2.0.0.dev0-cp39-cp39-manylinux2014_x86_64.whl" +url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/ea4a22249c7029fef1d7686e94ddde28c67ee5c8/ray-2.0.0.dev0-cp39-cp39-manylinux2014_x86_64.whl" [[package]] name = "redis" version = "3.5.3" @@ -1411,7 +1410,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.7.1" -content-hash = "77e59ba63c88b601e79bddfd9d9675b77367f6acbff2db6e199ab2815dbd6065" +content-hash = "8496b7df4a4b60a43fe04bd4f68ea41be7abdb16c4cf05c9766acafc37e5ff31" [metadata.files] aiohttp = [ @@ -1539,8 +1538,8 @@ daemoniker = [ {file = "daemoniker-0.2.3.tar.gz", hash = "sha256:d9b62c8d75227b3da88c0ca22b82e19d88d32dade4ffa838427235e0cdd5e578"}, ] decorator = [ - {file = "decorator-5.0.9-py3-none-any.whl", hash = "sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323"}, - {file = "decorator-5.0.9.tar.gz", hash = "sha256:72ecfba4320a893c53f9706bebb2d55c270c1e51a28789361aa93e4a21319ed5"}, + {file = "decorator-5.1.0-py3-none-any.whl", hash = "sha256:7b12e7c3c6ab203a29e157335e9122cb03de9ab7264b137594103fd4a683b374"}, + {file = "decorator-5.1.0.tar.gz", hash = "sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7"}, ] dill = [ {file = "dill-0.3.4-py2.py3-none-any.whl", hash = "sha256:7e40e4a70304fd9ceab3535d36e58791d9c4a776b38ec7f7ec9afc8d3dca4d4f"}, @@ -1913,11 +1912,11 @@ matplotlib-inline = [ {file = "matplotlib_inline-0.1.3-py3-none-any.whl", hash = "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"}, ] minerl = [ - {file = "minerl-0.4.1a2.tar.gz", hash = "sha256:ddeff068c75d586d9b36cd839a611feabff594d9549d93c8bbdfad3bb5d1dd53"}, + {file = "minerl-0.4.2.tar.gz", hash = "sha256:653d2fe1079e003736dccee09fd957570e238dce1ac411ffa3e2d342bafa4006"}, ] minerl-wrappers = [ - {file = "minerl-wrappers-0.1.4.tar.gz", hash = "sha256:e005ce75fcfe5fd345384635e692050848ffafe5a6b7e10e43073238c6522060"}, - {file = "minerl_wrappers-0.1.4-py3-none-any.whl", hash = "sha256:7675201bb81347c94b67659dbd05f496b167a15ed6e7035953bbd5f641fcd7cf"}, + {file = "minerl-wrappers-0.1.5.tar.gz", hash = "sha256:1ce39c8849061a244d98815fe6c4ff36d13cfa1782344d78601bb75d3ea23cec"}, + {file = "minerl_wrappers-0.1.5-py3-none-any.whl", hash = "sha256:15246bbf96ba0f37188dd8c83c2810141ee5b178637b6b3716efc72c61d74598"}, ] msgpack = [ {file = "msgpack-1.0.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:b6d9e2dae081aa35c44af9c4298de4ee72991305503442a5c74656d82b581fe9"}, diff --git a/pyproject.toml b/pyproject.toml index 9bd62e9..3352bbb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,14 +12,14 @@ repository = "https://github.com/juliusfrost/minerl-rllib/" python = "^3.7.1" scikit-learn = "^0.24.2" ray = [ - {extras = ["default", "tune", "rllib"], markers = "python_version == '3.9' and sys_platform == 'linux'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/cd22a7d1bbf38f66aa8b735459319ff24f102a20/ray-2.0.0.dev0-cp39-cp39-manylinux2014_x86_64.whl"}, - {extras = ["default", "tune", "rllib"], markers = "python_version == '3.8' and sys_platform == 'linux'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/cd22a7d1bbf38f66aa8b735459319ff24f102a20/ray-2.0.0.dev0-cp38-cp38-manylinux2014_x86_64.whl"}, - {extras = ["default", "tune", "rllib"], markers = "python_version == '3.7' and sys_platform == 'linux'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/cd22a7d1bbf38f66aa8b735459319ff24f102a20/ray-2.0.0.dev0-cp37-cp37m-manylinux2014_x86_64.whl"}, - {extras = ["default", "tune", "rllib"], markers = "python_version == '3.9' and sys_platform == 'win32'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/cd22a7d1bbf38f66aa8b735459319ff24f102a20/ray-2.0.0.dev0-cp39-cp39-win_amd64.whl"}, - {extras = ["default", "tune", "rllib"], markers = "python_version == '3.8' and sys_platform == 'win32'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/cd22a7d1bbf38f66aa8b735459319ff24f102a20/ray-2.0.0.dev0-cp38-cp38-win_amd64.whl"}, - {extras = ["default", "tune", "rllib"], markers = "python_version == '3.7' and sys_platform == 'win32'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/cd22a7d1bbf38f66aa8b735459319ff24f102a20/ray-2.0.0.dev0-cp37-cp37m-win_amd64.whl"} + {extras = ["default", "tune", "rllib"], markers = "python_version == '3.9' and sys_platform == 'linux'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/ea4a22249c7029fef1d7686e94ddde28c67ee5c8/ray-2.0.0.dev0-cp39-cp39-manylinux2014_x86_64.whl"}, + {extras = ["default", "tune", "rllib"], markers = "python_version == '3.8' and sys_platform == 'linux'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/ea4a22249c7029fef1d7686e94ddde28c67ee5c8/ray-2.0.0.dev0-cp38-cp38-manylinux2014_x86_64.whl"}, + {extras = ["default", "tune", "rllib"], markers = "python_version == '3.7' and sys_platform == 'linux'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/ea4a22249c7029fef1d7686e94ddde28c67ee5c8/ray-2.0.0.dev0-cp37-cp37m-manylinux2014_x86_64.whl"}, + {extras = ["default", "tune", "rllib"], markers = "python_version == '3.9' and sys_platform == 'win32'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/ea4a22249c7029fef1d7686e94ddde28c67ee5c8/ray-2.0.0.dev0-cp39-cp39-win_amd64.whl"}, + {extras = ["default", "tune", "rllib"], markers = "python_version == '3.8' and sys_platform == 'win32'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/ea4a22249c7029fef1d7686e94ddde28c67ee5c8/ray-2.0.0.dev0-cp38-cp38-win_amd64.whl"}, + {extras = ["default", "tune", "rllib"], markers = "python_version == '3.7' and sys_platform == 'win32'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/ea4a22249c7029fef1d7686e94ddde28c67ee5c8/ray-2.0.0.dev0-cp37-cp37m-win_amd64.whl"} ] -minerl-wrappers = "^0.1.4" +minerl-wrappers = "^0.1.5" [tool.poetry.dev-dependencies] pytest = "^6.2.4" @@ -28,3 +28,9 @@ black = "^21.7b0" [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" + +[tool.pytest.ini_options] +log_cli = true +log_cli_level = "DEBUG" +log_cli_format = "%(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)" +log_cli_date_format = "%Y-%m-%d %H:%M:%S" From 67f1f22c36ca50d5b7f8ae7055cd35f9e3db4f99 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Mon, 13 Sep 2021 01:46:49 -0400 Subject: [PATCH 24/48] test behavioral cloning --- config/bc.yaml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 config/bc.yaml diff --git a/config/bc.yaml b/config/bc.yaml new file mode 100644 index 0000000..15e3d3a --- /dev/null +++ b/config/bc.yaml @@ -0,0 +1,31 @@ +minerl-marwil: + run: MARWIL + # check point file located results/experiment-name/unique-name/checkpoint_X/checkpoint-X +# checkpoint_freq: 1 + checkpoint_at_end: true +# keep_checkpoints_num: 1 # keep the best checkpoint around +# checkpoint_score_attr: episode_reward_mean +# restore: path_to_checkpoint_file # does not restore the replay buffer so use with caution + local_dir: results # specifies the results folder + num_samples: 1 # number of random seeds to try + log_to_file: log.txt # useful for debugging with print statements, errors are logged to error.txt + config: + # minerl-rllib config changes + env: MineRLObtainDiamondVectorObf-v0 + env_config: + diamond: true + input: minerl + input_evaluation: [ ] + model: + conv_filters: [ [ 64, 4, 4 ], [ 128, 4, 4 ], [ 256, 4, 4 ] ] + framework: torch + num_gpus: 1 + log_level: DEBUG + # marwil config + # In order to evaluate on an actual environment, use these following + # settings: +# evaluation_num_workers: 1 +# evaluation_interval: 1 +# evaluation_config: +# input: sampler + beta: 0 \ No newline at end of file From adcec2f8a2bceacac00f31ae622039a96ba8250a Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Mon, 13 Sep 2021 01:47:04 -0400 Subject: [PATCH 25/48] build minerl script --- tests/build_minerl.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 tests/build_minerl.py diff --git a/tests/build_minerl.py b/tests/build_minerl.py new file mode 100644 index 0000000..3b1779f --- /dev/null +++ b/tests/build_minerl.py @@ -0,0 +1,15 @@ +import logging + +import gym +import minerl + + +def main(): + logging.basicConfig(level=logging.DEBUG) + env = gym.make("MineRLNavigateDense-v0") + env.reset() + env.close() + + +if __name__ == "__main__": + main() From 06d2ba7ffa68b5c597008d872dbd473faf1ec4f7 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Mon, 13 Sep 2021 21:39:45 -0400 Subject: [PATCH 26/48] docker --- .dockerignore | 241 ++++++++++++++++++++++++++++++++++++++++++++++++++ Dockerfile | 34 +++++++ 2 files changed, 275 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..5762a63 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,241 @@ +# Project Specific +data/ +logs/ +results/ + +# Created by https://www.toptal.com/developers/gitignore/api/pycharm+all,python +# Edit at https://www.toptal.com/developers/gitignore?templates=pycharm+all,python + +### PyCharm+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### PyCharm+all Patch ### +# Ignores the whole .idea folder and all .iml files +# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360 + +.idea/ + +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + +*.iml +modules.xml +.idea/misc.xml +*.ipr + +# Sonarlint plugin +.idea/sonarlint + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# End of https://www.toptal.com/developers/gitignore/api/pycharm+all,python diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a672385 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,34 @@ +FROM pytorch/pytorch:1.9.0-cuda10.2-cudnn7-runtime AS dependencies + +ENV POETRY_VERSION=1.1.8 \ + PYTHONFAULTHANDLER=1 \ + PYTHONUNBUFFERED=1 \ + PYTHONHASHSEED=random \ + PIP_NO_CACHE_DIR=off \ + PIP_DISABLE_PIP_VERSION_CHECK=on \ + PIP_DEFAULT_TIMEOUT=100 \ + MINERL_HEADLESS=1 + +RUN apt-get update \ + && apt-get install -y \ + build-essential \ + xvfb \ + x11-xserver-utils \ + openjdk-8-jdk \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /minerl-rllib +COPY poetry.lock pyproject.toml /minerl-rllib/ + +RUN pip install poetry==$POETRY_VERSION +RUN poetry config virtualenvs.create false \ + && poetry install --no-interaction --no-ansi + +COPY tests/build_minerl.py /minerl-rllib/tests/build_minerl.py +RUN python /minerl-rllib/tests/build_minerl.py + +COPY . /minerl-rllib + +FROM dependencies AS train +#ENTRYPOINT ["python", "minerl_rllib/rllib_train.py"] +#CMD ["-f bc.yaml"] \ No newline at end of file From f5da450508e89c76eeeea939c220c42f90defbec Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Mon, 13 Sep 2021 21:56:58 -0400 Subject: [PATCH 27/48] install development package for training --- Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Dockerfile b/Dockerfile index a672385..0028d2f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,5 +30,7 @@ RUN python /minerl-rllib/tests/build_minerl.py COPY . /minerl-rllib FROM dependencies AS train +# Installs the minerl-rllib package +RUN poetry install --no-interaction --no-ansi #ENTRYPOINT ["python", "minerl_rllib/rllib_train.py"] #CMD ["-f bc.yaml"] \ No newline at end of file From d56ef7d6b879d6d097de74d4d97e357226dd1843 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Mon, 13 Sep 2021 21:59:45 -0400 Subject: [PATCH 28/48] forgot to commit this for input.py --- minerl_rllib/envs/utils.py | 84 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 minerl_rllib/envs/utils.py diff --git a/minerl_rllib/envs/utils.py b/minerl_rllib/envs/utils.py new file mode 100644 index 0000000..a5b2357 --- /dev/null +++ b/minerl_rllib/envs/utils.py @@ -0,0 +1,84 @@ +import collections +import copy +import os + +import gym +from minerl.data.data_pipeline import DataPipeline, tree_slice + + +def patch_data_pipeline(): + # copied from the DataPipeline class and removed tqdm + def load_data( + self, + stream_name: str, + skip_interval=0, + include_metadata=False, + include_monitor_data=False, + ): + """Iterates over an individual trajectory named stream_name. + + Args: + stream_name (str): The stream name desired to be iterated through. + skip_interval (int, optional): How many sices should be skipped.. Defaults to 0. + include_metadata (bool, optional): Whether or not meta data about the loaded trajectory should be included.. Defaults to False. + include_monitor_data (bool, optional): Whether to include all of the monitor data from the environment. Defaults to False. + Yields: + A tuple of (state, player_action, reward_from_action, next_state, is_next_state_terminal). + These are tuples are yielded in order of the episode. + """ + if "/" in stream_name: + file_dir = stream_name + else: + file_dir = os.path.join(self.data_dir, stream_name) + + if DataPipeline._is_blacklisted(stream_name): + raise RuntimeError( + "This stream is corrupted (and will be removed in the next version of the data!)" + ) + + seq = DataPipeline._load_data_pyfunc( + file_dir, + -1, + None, + self.environment, + skip_interval=skip_interval, + include_metadata=include_metadata, + ) + + observation_seq, action_seq, reward_seq, next_observation_seq, done_seq = seq[ + :5 + ] + remainder = iter(seq[5:]) + + monitor_seq = next(remainder) if include_monitor_data else None + meta = next(remainder) if include_monitor_data else None + + # make a copty + gym_spec = gym.envs.registration.spec(self.environment) + target_space = copy.deepcopy(self.observation_space) + + x = list(target_space.spaces.items()) + target_space.spaces = collections.OrderedDict( + sorted(x, key=lambda x: x[0] if x[0] != "pov" else "z") + ) + + # Now we just need to slice the dict. + for idx in range(len(reward_seq)): + # Wrap in dict + action_dict = tree_slice(action_seq, idx) + observation_dict = tree_slice(observation_seq, idx) + next_observation_dict = tree_slice(next_observation_seq, idx) + + yield_list = [ + observation_dict, + action_dict, + reward_seq[idx], + next_observation_dict, + done_seq[idx], + ] + yield yield_list + ( + ([tree_slice(monitor_seq, idx)] if include_monitor_data else []) + + ([meta] if include_metadata else []) + ) + + DataPipeline.load_data = load_data From f35027a9bf50a86be1c761a1ecaa25f80c6b8728 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Tue, 14 Sep 2021 00:17:53 -0400 Subject: [PATCH 29/48] add sac-offline.yaml --- config/sac-offline.yaml | 56 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 config/sac-offline.yaml diff --git a/config/sac-offline.yaml b/config/sac-offline.yaml new file mode 100644 index 0000000..82140fd --- /dev/null +++ b/config/sac-offline.yaml @@ -0,0 +1,56 @@ +minerl-sac: + run: SAC + stop: + time_total_s: 345600 # 4 days in seconds + info/num_steps_sampled: 8000000 # competition sample limit + # check point file located results/experiment-name/unique-name/checkpoint_X/checkpoint-X +# checkpoint_freq: 1 + checkpoint_at_end: true +# keep_checkpoints_num: 1 # keep the best checkpoint around +# checkpoint_score_attr: episode_reward_mean + # restore: path_to_checkpoint_file # does not restore the replay buffer so use with caution + local_dir: results # specifies the results folder + num_samples: 1 # number of random seeds to try + log_to_file: log.txt # useful for debugging with print statements, errors are logged to error.txt + config: + env: MineRLObtainDiamondVectorObf-v0 + env_config: + diamond: true + input: minerl + input_evaluation: [] + evaluation_interval: 10 + evaluation_config: + input: sampler +# train_batch_size: 1 + buffer_size: 50000 + # SAC Configs + framework: torch + soft_horizon: False + horizon: 1000 + Q_model: + conv_filters: [[64, 4, 4], [128, 4, 4], [256, 4, 4]] + fcnet_activation: relu + fcnet_hiddens: [ 256, 256, 256 ] + policy_model: + conv_filters: [[64, 4, 4], [128, 4, 4], [256, 4, 4]] + fcnet_activation: relu + fcnet_hiddens: [ 256, 256, 256 ] + tau: 0.005 + target_entropy: auto + no_done_at_end: false + n_step: 1 + rollout_fragment_length: 1 + prioritized_replay: false + train_batch_size: 256 + target_network_update_freq: 0 + timesteps_per_iteration: 1000 + learning_starts: 10 + optimization: + actor_learning_rate: 0.0001 + critic_learning_rate: 0.0003 + entropy_learning_rate: 0.0001 + num_workers: 0 + num_gpus: 1 + clip_actions: false + normalize_actions: true + metrics_smoothing_episodes: 5 \ No newline at end of file From 6334bd85bf8363a805050fc517ff303f5d3ce4c0 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Tue, 14 Sep 2021 00:18:49 -0400 Subject: [PATCH 30/48] remove unused --- config/minerl-impala-debug.yaml | 39 --------------------------------- config/minerl-marwil.yaml | 39 --------------------------------- 2 files changed, 78 deletions(-) delete mode 100644 config/minerl-impala-debug.yaml delete mode 100644 config/minerl-marwil.yaml diff --git a/config/minerl-impala-debug.yaml b/config/minerl-impala-debug.yaml deleted file mode 100644 index 65fa622..0000000 --- a/config/minerl-impala-debug.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# use this config with $ python rllib_train.py -f config/minerl-impala-debug.yaml -# see Experiment.spec for valid config options: -# https://docs.ray.io/en/master/_modules/ray/tune/experiment.html#Experiment -minerl-impala-debug: # name of the experiment - name of the folder in results - run: IMPALA # RL Algorithm - env: MineRLRandomDebug-v0 # MineRL Environment - stop: - time_total_s: 169200 # two days minus one hour in seconds - info/num_steps_sampled: 8000000 # competition sample limit - - # check point file located results/experiment-name/unique-name/checkpoint_X/checkpoint-X - checkpoint_freq: 1 - checkpoint_at_end: true - keep_checkpoints_num: 1 # keep the best checkpoint around - checkpoint_score_attr: episode_reward_mean - # restore: path_to_checkpoint_file # does not restore the replay buffer so use with caution - - local_dir: results # specifies the results folder - num_samples: 1 # number of random seeds to try - log_to_file: log.txt # useful for debugging with print statements, errors are logged to error.txt - - # config specific to algorithm - # see rllib documentation: https://docs.ray.io/en/master/rllib-training.html#common-parameters - config: - rollout_fragment_length: 50 - train_batch_size: 500 - num_workers: 2 - num_envs_per_worker: 1 - num_gpus: 0 # set to 0 if cpu - clip_rewards: True - lr_schedule: [ - [0, 0.0001], - [20000000, 0.000000000001], - ] - - framework: torch - model: - custom_model: minerl_torch_model - # custom_model_config: # use this to add any custom model configuration diff --git a/config/minerl-marwil.yaml b/config/minerl-marwil.yaml deleted file mode 100644 index 40671d9..0000000 --- a/config/minerl-marwil.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# use this config with $ python rllib_train.py -f config/minerl-impala-debug.yaml -# see Experiment.spec for valid config options: -# https://docs.ray.io/en/master/_modules/ray/tune/experiment.html#Experiment -minerl-marwil: # name of the experiment - name of the folder in results - run: MARWIL # RL Algorithm - env: MineRLObtainDiamondVectorObf-v0 # MineRL Environment - stop: - time_total_s: 169200 # two days minus one hour in seconds - info/num_steps_sampled: 8000000 # competition sample limit - - # check point file located results/experiment-name/unique-name/checkpoint_X/checkpoint-X - checkpoint_freq: 1 - checkpoint_at_end: true - keep_checkpoints_num: 1 # keep the best checkpoint around - checkpoint_score_attr: episode_reward_mean - # restore: path_to_checkpoint_file # does not restore the replay buffer so use with caution - - local_dir: results # specifies the results folder - num_samples: 1 # number of random seeds to try - log_to_file: log.txt # useful for debugging with print statements, errors are logged to error.txt - - # config specific to algorithm - # see rllib documentation: https://docs.ray.io/en/master/rllib-training.html#common-parameters - config: - framework: torch - model: - custom_model: minerl_torch_model - # custom_model_config: # use this to add any custom model configuration - # input data must be absolute path - # input: path_to_json_files - # In order to evaluate on an actual environment, use these following - # settings: -# evaluation_num_workers: 1 -# evaluation_interval: 1 -# evaluation_config: -# input: sampler - # Compare IL (beta=0) vs MARWIL. -# beta: -# grid_search: [0, 1] \ No newline at end of file From 433eb710eb42de38b7c63100f4b415510b85fec2 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Tue, 14 Sep 2021 00:24:00 -0400 Subject: [PATCH 31/48] fix configs --- config/bc.yaml | 19 +++++++++---------- config/sac-offline.yaml | 5 +++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/config/bc.yaml b/config/bc.yaml index 15e3d3a..6860226 100644 --- a/config/bc.yaml +++ b/config/bc.yaml @@ -1,5 +1,9 @@ -minerl-marwil: - run: MARWIL +minerl-bc: + run: BC + stop: + time_total_s: 345600 # 4 days in seconds + # no sample limit since using offline rl + # info/num_steps_sampled: 8000000 # competition sample limit # check point file located results/experiment-name/unique-name/checkpoint_X/checkpoint-X # checkpoint_freq: 1 checkpoint_at_end: true @@ -16,16 +20,11 @@ minerl-marwil: diamond: true input: minerl input_evaluation: [ ] + evaluation_interval: 10 + evaluation_config: + input: sampler model: conv_filters: [ [ 64, 4, 4 ], [ 128, 4, 4 ], [ 256, 4, 4 ] ] framework: torch num_gpus: 1 log_level: DEBUG - # marwil config - # In order to evaluate on an actual environment, use these following - # settings: -# evaluation_num_workers: 1 -# evaluation_interval: 1 -# evaluation_config: -# input: sampler - beta: 0 \ No newline at end of file diff --git a/config/sac-offline.yaml b/config/sac-offline.yaml index 82140fd..e3c2292 100644 --- a/config/sac-offline.yaml +++ b/config/sac-offline.yaml @@ -1,8 +1,9 @@ -minerl-sac: +minerl-sac-offline: run: SAC stop: time_total_s: 345600 # 4 days in seconds - info/num_steps_sampled: 8000000 # competition sample limit + # no sample limit since using offline rl + # info/num_steps_sampled: 8000000 # competition sample limit # check point file located results/experiment-name/unique-name/checkpoint_X/checkpoint-X # checkpoint_freq: 1 checkpoint_at_end: true From 2132cbce29656a443869b4e214725a62bc0a3afe Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Tue, 14 Sep 2021 21:58:44 -0400 Subject: [PATCH 32/48] add tensorflow --- poetry.lock | 765 +++++++++++++++++++++++++++++++------------------ pyproject.toml | 6 +- 2 files changed, 495 insertions(+), 276 deletions(-) diff --git a/poetry.lock b/poetry.lock index fe84076..b026df4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,3 +1,14 @@ +[[package]] +name = "absl-py" +version = "0.13.0" +description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + [[package]] name = "aiohttp" version = "3.7.4.post0" @@ -48,6 +59,17 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "astunparse" +version = "1.6.3" +description = "An AST unparser for Python" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.6.1,<2.0" + [[package]] name = "async-timeout" version = "3.0.1" @@ -86,34 +108,6 @@ category = "main" optional = false python-versions = "*" -[[package]] -name = "black" -version = "21.8b0" -description = "The uncompromising code formatter." -category = "dev" -optional = false -python-versions = ">=3.6.2" - -[package.dependencies] -click = ">=7.1.2" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0,<1" -platformdirs = ">=2" -regex = ">=2020.1.8" -tomli = ">=0.2.6,<2.0.0" -typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\""} -typing-extensions = [ - {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, - {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, -] - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -python2 = ["typed-ast (>=1.4.2)"] -uvloop = ["uvloop (>=0.15.2)"] - [[package]] name = "blessings" version = "1.7" @@ -133,6 +127,14 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "cached-property" +version = "1.5.2" +description = "A decorator for caching properties in classes." +category = "main" +optional = false +python-versions = "*" + [[package]] name = "cachetools" version = "4.2.2" @@ -159,7 +161,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "charset-normalizer" -version = "2.0.4" +version = "2.0.5" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false @@ -168,6 +170,14 @@ python-versions = ">=3.5.0" [package.extras] unicode_backport = ["unicodedata2"] +[[package]] +name = "clang" +version = "5.0" +description = "libclang python bindings" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "click" version = "8.0.1" @@ -281,6 +291,22 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "flatbuffers" +version = "1.12" +description = "The FlatBuffers serialization format for Python" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "gast" +version = "0.4.0" +description = "Python AST that abstracts the underlying Python version" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + [[package]] name = "getch" version = "1.0" @@ -330,6 +356,32 @@ aiohttp = ["requests (>=2.20.0,<3.0.0dev)", "aiohttp (>=3.6.2,<4.0.0dev)"] pyopenssl = ["pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] +[[package]] +name = "google-auth-oauthlib" +version = "0.4.6" +description = "Google Authentication Library" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +google-auth = ">=1.0.0" +requests-oauthlib = ">=0.7.0" + +[package.extras] +tool = ["click (>=6.0.0)"] + +[[package]] +name = "google-pasta" +version = "0.2.0" +description = "pasta is an AST-based Python refactoring library" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + [[package]] name = "googleapis-common-protos" version = "1.53.0" @@ -397,6 +449,22 @@ nomujoco = ["atari-py (==0.2.6)", "box2d-py (>=2.3.5,<2.4.0)", "opencv-python (> robotics = ["mujoco_py (>=1.50,<2.0)", "imageio"] toy_text = ["scipy"] +[[package]] +name = "h5py" +version = "3.1.0" +description = "Read and write HDF5 files from Python" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cached-property = {version = "*", markers = "python_version < \"3.8\""} +numpy = [ + {version = ">=1.14.5", markers = "python_version == \"3.7\""}, + {version = ">=1.17.5", markers = "python_version == \"3.8\""}, + {version = ">=1.19.3", markers = "python_version >= \"3.9\""}, +] + [[package]] name = "hiredis" version = "2.0.0" @@ -563,6 +631,31 @@ six = ">=1.11.0" format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] +[[package]] +name = "keras" +version = "2.6.0" +description = "TensorFlow Keras." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "keras-preprocessing" +version = "1.1.2" +description = "Easy data preprocessing and data augmentation for deep learning models" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +numpy = ">=1.9.1" +six = ">=1.9.0" + +[package.extras] +image = ["scipy (>=0.14)", "Pillow (>=5.2.0)"] +pep8 = ["flake8"] +tests = ["pandas", "pillow", "tensorflow", "keras", "pytest", "pytest-xdist", "pytest-cov"] + [[package]] name = "kiwisolver" version = "1.3.2" @@ -598,6 +691,20 @@ docs = ["sphinx (>=1.6.0)", "sphinx-bootstrap-theme"] flake8 = ["flake8"] tests = ["pytest (!=3.3.0)", "psutil", "pytest-cov"] +[[package]] +name = "markdown" +version = "3.3.4" +description = "Python implementation of Markdown." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} + +[package.extras] +testing = ["coverage", "pyyaml"] + [[package]] name = "markupsafe" version = "2.0.1" @@ -671,18 +778,18 @@ docs = ["sphinx-rtd-theme", "sphinxcontrib-napoleon"] [[package]] name = "minerl-wrappers" -version = "0.1.5" +version = "0.1.6" description = "minerl-wrappers compiles common wrappers and standardizes code for reproducibility in the MineRL environment!" category = "main" optional = false python-versions = ">=3.7,<4.0" [package.dependencies] -gym = ">=0.19.0,<0.20.0" -minerl = "0.4.2" -numpy = ">=1.21.0,<2.0.0" -opencv-python = ">=4.5.3,<5.0.0" -PyYAML = ">=5.4.1,<6.0.0" +gym = "*" +minerl = ">=0.4.0,<0.5.0" +numpy = "*" +opencv-python = "*" +PyYAML = "*" [[package]] name = "msgpack" @@ -700,14 +807,6 @@ category = "main" optional = false python-versions = ">=3.6" -[[package]] -name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "networkx" version = "2.6.3" @@ -725,11 +824,11 @@ test = ["pytest (>=6.2)", "pytest-cov (>=2.12)", "codecov (>=2.1)"] [[package]] name = "numpy" -version = "1.21.1" +version = "1.19.5" description = "NumPy is the fundamental package for array computing with Python." category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" [[package]] name = "nvidia-ml-py3" @@ -739,6 +838,19 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "oauthlib" +version = "3.1.1" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +rsa = ["cryptography (>=3.0.0,<4)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0,<4)", "pyjwt (>=2.0.0,<3)"] + [[package]] name = "opencensus" version = "0.7.13" @@ -761,14 +873,29 @@ python-versions = "*" [[package]] name = "opencv-python" -version = "4.5.3.56" +version = "4.5.2.54" description = "Wrapper package for OpenCV python bindings." category = "main" optional = false python-versions = ">=3.6" [package.dependencies] -numpy = ">=1.21.0" +numpy = ">=1.13.3" + +[[package]] +name = "opt-einsum" +version = "3.3.0" +description = "Optimizing numpys einsum function" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +numpy = ">=1.7" + +[package.extras] +docs = ["sphinx (==1.2.3)", "sphinxcontrib-napoleon", "sphinx-rtd-theme", "numpydoc"] +tests = ["pytest", "pytest-cov", "pytest-pep8"] [[package]] name = "packaging" @@ -783,7 +910,7 @@ pyparsing = ">=2.0.2" [[package]] name = "pandas" -version = "1.3.2" +version = "1.3.3" description = "Powerful data structures for data analysis, time series, and statistics" category = "main" optional = false @@ -809,14 +936,6 @@ python-versions = ">=3.6" qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] testing = ["docopt", "pytest (<6.0.0)"] -[[package]] -name = "pathspec" -version = "0.9.0" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - [[package]] name = "pexpect" version = "4.8.0" @@ -844,18 +963,6 @@ category = "main" optional = false python-versions = ">=3.6" -[[package]] -name = "platformdirs" -version = "2.3.0" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] - [[package]] name = "pluggy" version = "1.0.0" @@ -984,7 +1091,7 @@ python-versions = "*" [[package]] name = "pyro4" -version = "4.80" +version = "4.81" description = "distributed object middleware for Python (RPC)" category = "main" optional = false @@ -1114,6 +1221,7 @@ tune = ["pandas", "tabulate", "tensorboardX (>=1.9)", "requests"] [package.source] type = "url" url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/ea4a22249c7029fef1d7686e94ddde28c67ee5c8/ray-2.0.0.dev0-cp39-cp39-manylinux2014_x86_64.whl" + [[package]] name = "redis" version = "3.5.3" @@ -1125,14 +1233,6 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.extras] hiredis = ["hiredis (>=0.1.3)"] -[[package]] -name = "regex" -version = "2021.8.28" -description = "Alternative regular expression module, to replace re." -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "requests" version = "2.26.0" @@ -1151,6 +1251,21 @@ urllib3 = ">=1.21.1,<1.27" socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] +[[package]] +name = "requests-oauthlib" +version = "1.3.0" +description = "OAuthlib authentication support for Requests." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +oauthlib = ">=3.0.0" +requests = ">=2.0.0" + +[package.extras] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] + [[package]] name = "rsa" version = "4.7.2" @@ -1235,7 +1350,7 @@ python-versions = "~=3.5" [[package]] name = "six" -version = "1.16.0" +version = "1.15.0" description = "Python 2 and 3 compatibility utilities" category = "main" optional = false @@ -1252,6 +1367,43 @@ python-versions = "*" [package.extras] widechars = ["wcwidth"] +[[package]] +name = "tensorboard" +version = "2.6.0" +description = "TensorBoard lets you watch Tensors Flow" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +absl-py = ">=0.4" +google-auth = ">=1.6.3,<2" +google-auth-oauthlib = ">=0.4.1,<0.5" +grpcio = ">=1.24.3" +markdown = ">=2.6.8" +numpy = ">=1.12.0" +protobuf = ">=3.6.0" +requests = ">=2.21.0,<3" +tensorboard-data-server = ">=0.6.0,<0.7.0" +tensorboard-plugin-wit = ">=1.6.0" +werkzeug = ">=0.11.15" + +[[package]] +name = "tensorboard-data-server" +version = "0.6.1" +description = "Fast data loading for TensorBoard" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "tensorboard-plugin-wit" +version = "1.8.0" +description = "What-If Tool TensorBoard plugin." +category = "main" +optional = false +python-versions = "*" + [[package]] name = "tensorboardx" version = "2.4" @@ -1264,6 +1416,51 @@ python-versions = "*" numpy = "*" protobuf = ">=3.8.0" +[[package]] +name = "tensorflow" +version = "2.6.0" +description = "TensorFlow is an open source machine learning framework for everyone." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +absl-py = ">=0.10,<1.0" +astunparse = ">=1.6.3,<1.7.0" +clang = ">=5.0,<6.0" +flatbuffers = ">=1.12.0,<1.13.0" +gast = "0.4.0" +google-pasta = ">=0.2,<1.0" +grpcio = ">=1.37.0,<2.0" +h5py = ">=3.1.0,<3.2.0" +keras = ">=2.6,<3.0" +keras-preprocessing = ">=1.1.2,<1.2.0" +numpy = ">=1.19.2,<1.20.0" +opt-einsum = ">=3.3.0,<3.4.0" +protobuf = ">=3.9.2" +six = ">=1.15.0,<1.16.0" +tensorboard = ">=2.6,<3.0" +tensorflow-estimator = ">=2.6,<3.0" +termcolor = ">=1.1.0,<1.2.0" +typing-extensions = ">=3.7.4,<3.8.0" +wrapt = ">=1.12.1,<1.13.0" + +[[package]] +name = "tensorflow-estimator" +version = "2.6.0" +description = "TensorFlow Estimator." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "termcolor" +version = "1.1.0" +description = "ANSII Color formatting for output in terminal." +category = "main" +optional = false +python-versions = "*" + [[package]] name = "threadpoolctl" version = "2.2.0" @@ -1294,14 +1491,6 @@ category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -[[package]] -name = "tomli" -version = "1.2.1" -description = "A lil' TOML parser" -category = "dev" -optional = false -python-versions = ">=3.6" - [[package]] name = "tqdm" version = "4.62.2" @@ -1329,14 +1518,6 @@ python-versions = ">=3.7" [package.extras] test = ["pytest"] -[[package]] -name = "typed-ast" -version = "1.4.3" -description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "typing" version = "3.7.4.3" @@ -1347,7 +1528,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "typing-extensions" -version = "3.10.0.2" +version = "3.7.4.3" description = "Backported and Experimental Type Hints for Python 3.5+" category = "main" optional = false @@ -1374,6 +1555,25 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "werkzeug" +version = "2.0.1" +description = "The comprehensive WSGI web application library." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +watchdog = ["watchdog"] + +[[package]] +name = "wrapt" +version = "1.12.1" +description = "Module for decorators, wrappers and monkey patching." +category = "main" +optional = false +python-versions = "*" + [[package]] name = "xmltodict" version = "0.12.0" @@ -1410,9 +1610,13 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" python-versions = "^3.7.1" -content-hash = "8496b7df4a4b60a43fe04bd4f68ea41be7abdb16c4cf05c9766acafc37e5ff31" +content-hash = "b4bfc03df2ceba2e70e0cdbefd9255fd28a85e8c2a630936c92f49f178e2805c" [metadata.files] +absl-py = [ + {file = "absl-py-0.13.0.tar.gz", hash = "sha256:6953272383486044699fd0e9f00aad167a27e08ce19aae66c6c4b10e7e767793"}, + {file = "absl_py-0.13.0-py3-none-any.whl", hash = "sha256:62bd4e248ddb19d81aec8f9446b407ff37c8175c2ba88266a7afa9b4ce4a333b"}, +] aiohttp = [ {file = "aiohttp-3.7.4.post0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:3cf75f7cdc2397ed4442594b935a11ed5569961333d49b7539ea741be2cc79d5"}, {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4b302b45040890cea949ad092479e01ba25911a15e648429c7c5aae9650c67a8"}, @@ -1464,6 +1668,10 @@ appnope = [ {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, ] +astunparse = [ + {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, + {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, +] async-timeout = [ {file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"}, {file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"}, @@ -1480,10 +1688,6 @@ backcall = [ {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, ] -black = [ - {file = "black-21.8b0-py3-none-any.whl", hash = "sha256:2a0f9a8c2b2a60dbcf1ccb058842fb22bdbbcb2f32c6cc02d9578f90b92ce8b7"}, - {file = "black-21.8b0.tar.gz", hash = "sha256:570608d28aa3af1792b98c4a337dbac6367877b47b12b88ab42095cfc1a627c2"}, -] blessings = [ {file = "blessings-1.7-py2-none-any.whl", hash = "sha256:caad5211e7ba5afe04367cdd4cfc68fa886e2e08f6f35e76b7387d2109ccea6e"}, {file = "blessings-1.7-py3-none-any.whl", hash = "sha256:b1fdd7e7a675295630f9ae71527a8ebc10bfefa236b3d6aa4932ee4462c17ba3"}, @@ -1493,6 +1697,10 @@ bullet = [ {file = "bullet-2.2.0-py3-none-any.whl", hash = "sha256:d22528deb914ce3ff20a4a000fa5ba37179697f384a0748f90691de8a74cf006"}, {file = "bullet-2.2.0.tar.gz", hash = "sha256:dfa0fa81810ad1a9e688815ca04f24af87ff5cdbe803b42fa634b1f50fc9d887"}, ] +cached-property = [ + {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, + {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, +] cachetools = [ {file = "cachetools-4.2.2-py3-none-any.whl", hash = "sha256:2cc0b89715337ab6dbba85b5b50effe2b0c74e035d83ee8ed637cf52f12ae001"}, {file = "cachetools-4.2.2.tar.gz", hash = "sha256:61b5ed1e22a0924aed1d23b478f37e8d52549ff8a961de2909c69bf950020cff"}, @@ -1506,8 +1714,12 @@ chardet = [ {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.4.tar.gz", hash = "sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3"}, - {file = "charset_normalizer-2.0.4-py3-none-any.whl", hash = "sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b"}, + {file = "charset-normalizer-2.0.5.tar.gz", hash = "sha256:7098e7e862f6370a2a8d1a6398cd359815c45d12626267652c3f13dec58e2367"}, + {file = "charset_normalizer-2.0.5-py3-none-any.whl", hash = "sha256:fa471a601dfea0f492e4f4fca035cd82155e65dc45c9b83bf4322dfab63755dd"}, +] +clang = [ + {file = "clang-5.0-py2-none-any.whl", hash = "sha256:b9301dff507041b5019b30ae710b78b0552c1ca1d4441b8dfa93c2e85078a5f8"}, + {file = "clang-5.0.tar.gz", hash = "sha256:ceccae97eda0225a5b44d42ffd61102e248325c2865ca53e4407746464a5333a"}, ] click = [ {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, @@ -1568,6 +1780,14 @@ filelock = [ {file = "filelock-3.0.12-py3-none-any.whl", hash = "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836"}, {file = "filelock-3.0.12.tar.gz", hash = "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59"}, ] +flatbuffers = [ + {file = "flatbuffers-1.12-py2.py3-none-any.whl", hash = "sha256:9e9ef47fa92625c4721036e7c4124182668dc6021d9e7c73704edd395648deb9"}, + {file = "flatbuffers-1.12.tar.gz", hash = "sha256:63bb9a722d5e373701913e226135b28a6f6ac200d5cc7b4d919fa38d73b44610"}, +] +gast = [ + {file = "gast-0.4.0-py3-none-any.whl", hash = "sha256:b7adcdd5adbebf1adf17378da5ba3f543684dbec47b1cda1f3997e573cd542c4"}, + {file = "gast-0.4.0.tar.gz", hash = "sha256:40feb7b8b8434785585ab224d1568b857edb18297e5a3047f1ba012bc83b42c1"}, +] getch = [ {file = "getch-1.0-python2.tar.gz", hash = "sha256:be451438f7a2b389f96753aea39b6ed2540a390f1b9a12badcbc110cf9a5ce7f"}, {file = "getch-1.0.tar.gz", hash = "sha256:a6c22717c10051ce65b8fb7bddb171af705b1175e694a73be956990f6089d8b1"}, @@ -1580,6 +1800,15 @@ google-auth = [ {file = "google-auth-1.35.0.tar.gz", hash = "sha256:b7033be9028c188ee30200b204ea00ed82ea1162e8ac1df4aa6ded19a191d88e"}, {file = "google_auth-1.35.0-py2.py3-none-any.whl", hash = "sha256:997516b42ecb5b63e8d80f5632c1a61dddf41d2a4c2748057837e06e00014258"}, ] +google-auth-oauthlib = [ + {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"}, +] +google-pasta = [ + {file = "google-pasta-0.2.0.tar.gz", hash = "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e"}, + {file = "google_pasta-0.2.0-py2-none-any.whl", hash = "sha256:4612951da876b1a10fe3960d7226f0c7682cf901e16ac06e473b267a5afa8954"}, + {file = "google_pasta-0.2.0-py3-none-any.whl", hash = "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed"}, +] googleapis-common-protos = [ {file = "googleapis-common-protos-1.53.0.tar.gz", hash = "sha256:a88ee8903aa0a81f6c3cec2d5cf62d3c8aa67c06439b0496b49048fb1854ebf4"}, {file = "googleapis_common_protos-1.53.0-py2.py3-none-any.whl", hash = "sha256:f6d561ab8fb16b30020b940e2dd01cd80082f4762fa9f3ee670f4419b4b8dbd0"}, @@ -1636,6 +1865,21 @@ grpcio = [ gym = [ {file = "gym-0.19.0.tar.gz", hash = "sha256:940069b983806e1ccc400fa6d47b4e34e462accf6a4fb0acb0a5e509ad0f502d"}, ] +h5py = [ + {file = "h5py-3.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1cd367f89a5441236bdbb795e9fb9a9e3424929c00b4a54254ca760437f83d69"}, + {file = "h5py-3.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fea05349f63625a8fb808e57e42bb4c76930cf5d50ac58b678c52f913a48a89b"}, + {file = "h5py-3.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2e37352ddfcf9d77a2a47f7c8f7e125c6d20cc06c2995edeb7be222d4e152636"}, + {file = "h5py-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e33f61d3eb862614c0f273a1f993a64dc2f093e1a3094932c50ada9d2db2170f"}, + {file = "h5py-3.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:236ac8d943be30b617ab615c3d4a4bf4a438add2be87e54af3687ab721a18fac"}, + {file = "h5py-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:02c391fdb980762a1cc03a4bcaecd03dc463994a9a63a02264830114a96e111f"}, + {file = "h5py-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f89a3dae38843ffa49d17a31a3509a8129e9b46ece602a0138e1ed79e685c361"}, + {file = "h5py-3.1.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ba71f6229d2013fbb606476ecc29c6223fc16b244d35fcd8566ad9dbaf910857"}, + {file = "h5py-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:dccb89358bc84abcd711363c3e138f9f4eccfdf866f2139a8e72308328765b2c"}, + {file = "h5py-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cb74df83709d6d03d11e60b9480812f58da34f194beafa8c8314dbbeeedfe0a6"}, + {file = "h5py-3.1.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:80c623be10479e81b64fa713b7ed4c0bbe9f02e8e7d2a2e5382336087b615ce4"}, + {file = "h5py-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:1cdfd1c5449ca1329d152f0b66830e93226ebce4f5e07dd8dc16bfc2b1a49d7b"}, + {file = "h5py-3.1.0.tar.gz", hash = "sha256:1e2516f190652beedcb8c7acfa1c6fa92d99b42331cbef5e5c7ec2d65b0fc3c2"}, +] hiredis = [ {file = "hiredis-2.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b4c8b0bc5841e578d5fb32a16e0c305359b987b850a06964bd5a62739d688048"}, {file = "hiredis-2.0.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0adea425b764a08270820531ec2218d0508f8ae15a448568109ffcae050fee26"}, @@ -1723,6 +1967,13 @@ jsonschema = [ {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, ] +keras = [ + {file = "keras-2.6.0-py2.py3-none-any.whl", hash = "sha256:504af5656a9829fe803ce48a8580ef16916e89906aceddad9e098614269437e7"}, +] +keras-preprocessing = [ + {file = "Keras_Preprocessing-1.1.2-py2.py3-none-any.whl", hash = "sha256:7b82029b130ff61cc99b55f3bd27427df4838576838c5b2f65940e4fcec99a7b"}, + {file = "Keras_Preprocessing-1.1.2.tar.gz", hash = "sha256:add82567c50c8bc648c14195bf544a5ce7c1f76761536956c3d2978970179ef3"}, +] kiwisolver = [ {file = "kiwisolver-1.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1d819553730d3c2724582124aee8a03c846ec4362ded1034c16fb3ef309264e6"}, {file = "kiwisolver-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d93a1095f83e908fc253f2fb569c2711414c0bfd451cab580466465b235b470"}, @@ -1850,6 +2101,10 @@ lz4 = [ {file = "lz4-3.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:37c23ca41040751649e0266f9f267c0148db12968a0a031272ee2a99cef7c753"}, {file = "lz4-3.1.3.tar.gz", hash = "sha256:081ef0a3b5941cb03127f314229a1c78bd70c9c220bb3f4dd80033e707feaa18"}, ] +markdown = [ + {file = "Markdown-3.3.4-py3-none-any.whl", hash = "sha256:96c3ba1261de2f7547b46a00ea8463832c921d3f9d6aba3f255a6f71386db20c"}, + {file = "Markdown-3.3.4.tar.gz", hash = "sha256:31b5b491868dcc87d6c24b7e3d19a0d730d59d3e46f4eea6430a321bed387a49"}, +] markupsafe = [ {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, @@ -1915,8 +2170,8 @@ minerl = [ {file = "minerl-0.4.2.tar.gz", hash = "sha256:653d2fe1079e003736dccee09fd957570e238dce1ac411ffa3e2d342bafa4006"}, ] minerl-wrappers = [ - {file = "minerl-wrappers-0.1.5.tar.gz", hash = "sha256:1ce39c8849061a244d98815fe6c4ff36d13cfa1782344d78601bb75d3ea23cec"}, - {file = "minerl_wrappers-0.1.5-py3-none-any.whl", hash = "sha256:15246bbf96ba0f37188dd8c83c2810141ee5b178637b6b3716efc72c61d74598"}, + {file = "minerl-wrappers-0.1.6.tar.gz", hash = "sha256:87fba6e3c0a3e83851e66f953c9c11a0d4796fbd3e0e9379fdb064f98299b84a"}, + {file = "minerl_wrappers-0.1.6-py3-none-any.whl", hash = "sha256:4c17bda1c43a375e4208ea81e645e15dad3c2d4266db25e044e89523268a387d"}, ] msgpack = [ {file = "msgpack-1.0.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:b6d9e2dae081aa35c44af9c4298de4ee72991305503442a5c74656d82b581fe9"}, @@ -1987,47 +2242,53 @@ multidict = [ {file = "multidict-5.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:7df80d07818b385f3129180369079bd6934cf70469f99daaebfac89dca288359"}, {file = "multidict-5.1.0.tar.gz", hash = "sha256:25b4e5f22d3a37ddf3effc0710ba692cfc792c2b9edfb9c05aefe823256e84d5"}, ] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] networkx = [ {file = "networkx-2.6.3-py3-none-any.whl", hash = "sha256:80b6b89c77d1dfb64a4c7854981b60aeea6360ac02c6d4e4913319e0a313abef"}, {file = "networkx-2.6.3.tar.gz", hash = "sha256:c0946ed31d71f1b732b5aaa6da5a0388a345019af232ce2f49c766e2d6795c51"}, ] numpy = [ - {file = "numpy-1.21.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38e8648f9449a549a7dfe8d8755a5979b45b3538520d1e735637ef28e8c2dc50"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd7d7409fa643a91d0a05c7554dd68aa9c9bb16e186f6ccfe40d6e003156e33a"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a75b4498b1e93d8b700282dc8e655b8bd559c0904b3910b144646dbbbc03e062"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1412aa0aec3e00bc23fbb8664d76552b4efde98fb71f60737c83efbac24112f1"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e46ceaff65609b5399163de5893d8f2a82d3c77d5e56d976c8b5fb01faa6b671"}, - {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c6a2324085dd52f96498419ba95b5777e40b6bcbc20088fddb9e8cbb58885e8e"}, - {file = "numpy-1.21.1-cp37-cp37m-win32.whl", hash = "sha256:73101b2a1fef16602696d133db402a7e7586654682244344b8329cdcbbb82172"}, - {file = "numpy-1.21.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7a708a79c9a9d26904d1cca8d383bf869edf6f8e7650d85dbc77b041e8c5a0f8"}, - {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95b995d0c413f5d0428b3f880e8fe1660ff9396dcd1f9eedbc311f37b5652e16"}, - {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:635e6bd31c9fb3d475c8f44a089569070d10a9ef18ed13738b03049280281267"}, - {file = "numpy-1.21.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a3d5fb89bfe21be2ef47c0614b9c9c707b7362386c9a3ff1feae63e0267ccb6"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a326af80e86d0e9ce92bcc1e65c8ff88297de4fa14ee936cb2293d414c9ec63"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:791492091744b0fe390a6ce85cc1bf5149968ac7d5f0477288f78c89b385d9af"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0318c465786c1f63ac05d7c4dbcecd4d2d7e13f0959b01b534ea1e92202235c5"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a513bd9c1551894ee3d31369f9b07460ef223694098cf27d399513415855b68"}, - {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:91c6f5fc58df1e0a3cc0c3a717bb3308ff850abdaa6d2d802573ee2b11f674a8"}, - {file = "numpy-1.21.1-cp38-cp38-win32.whl", hash = "sha256:978010b68e17150db8765355d1ccdd450f9fc916824e8c4e35ee620590e234cd"}, - {file = "numpy-1.21.1-cp38-cp38-win_amd64.whl", hash = "sha256:9749a40a5b22333467f02fe11edc98f022133ee1bfa8ab99bda5e5437b831214"}, - {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d7a4aeac3b94af92a9373d6e77b37691b86411f9745190d2c351f410ab3a791f"}, - {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d9e7912a56108aba9b31df688a4c4f5cb0d9d3787386b87d504762b6754fbb1b"}, - {file = "numpy-1.21.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:25b40b98ebdd272bc3020935427a4530b7d60dfbe1ab9381a39147834e985eac"}, - {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a92c5aea763d14ba9d6475803fc7904bda7decc2a0a68153f587ad82941fec1"}, - {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05a0f648eb28bae4bcb204e6fd14603de2908de982e761a2fc78efe0f19e96e1"}, - {file = "numpy-1.21.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f01f28075a92eede918b965e86e8f0ba7b7797a95aa8d35e1cc8821f5fc3ad6a"}, - {file = "numpy-1.21.1-cp39-cp39-win32.whl", hash = "sha256:88c0b89ad1cc24a5efbb99ff9ab5db0f9a86e9cc50240177a571fbe9c2860ac2"}, - {file = "numpy-1.21.1-cp39-cp39-win_amd64.whl", hash = "sha256:01721eefe70544d548425a07c80be8377096a54118070b8a62476866d5208e33"}, - {file = "numpy-1.21.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d4d1de6e6fb3d28781c73fbde702ac97f03d79e4ffd6598b880b2d95d62ead4"}, - {file = "numpy-1.21.1.zip", hash = "sha256:dff4af63638afcc57a3dfb9e4b26d434a7a602d225b42d746ea7fe2edf1342fd"}, + {file = "numpy-1.19.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc6bd4fd593cb261332568485e20a0712883cf631f6f5e8e86a52caa8b2b50ff"}, + {file = "numpy-1.19.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:aeb9ed923be74e659984e321f609b9ba54a48354bfd168d21a2b072ed1e833ea"}, + {file = "numpy-1.19.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8b5e972b43c8fc27d56550b4120fe6257fdc15f9301914380b27f74856299fea"}, + {file = "numpy-1.19.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:43d4c81d5ffdff6bae58d66a3cd7f54a7acd9a0e7b18d97abb255defc09e3140"}, + {file = "numpy-1.19.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:a4646724fba402aa7504cd48b4b50e783296b5e10a524c7a6da62e4a8ac9698d"}, + {file = "numpy-1.19.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:2e55195bc1c6b705bfd8ad6f288b38b11b1af32f3c8289d6c50d47f950c12e76"}, + {file = "numpy-1.19.5-cp36-cp36m-win32.whl", hash = "sha256:39b70c19ec771805081578cc936bbe95336798b7edf4732ed102e7a43ec5c07a"}, + {file = "numpy-1.19.5-cp36-cp36m-win_amd64.whl", hash = "sha256:dbd18bcf4889b720ba13a27ec2f2aac1981bd41203b3a3b27ba7a33f88ae4827"}, + {file = "numpy-1.19.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:603aa0706be710eea8884af807b1b3bc9fb2e49b9f4da439e76000f3b3c6ff0f"}, + {file = "numpy-1.19.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:cae865b1cae1ec2663d8ea56ef6ff185bad091a5e33ebbadd98de2cfa3fa668f"}, + {file = "numpy-1.19.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:36674959eed6957e61f11c912f71e78857a8d0604171dfd9ce9ad5cbf41c511c"}, + {file = "numpy-1.19.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:06fab248a088e439402141ea04f0fffb203723148f6ee791e9c75b3e9e82f080"}, + {file = "numpy-1.19.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6149a185cece5ee78d1d196938b2a8f9d09f5a5ebfbba66969302a778d5ddd1d"}, + {file = "numpy-1.19.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:50a4a0ad0111cc1b71fa32dedd05fa239f7fb5a43a40663269bb5dc7877cfd28"}, + {file = "numpy-1.19.5-cp37-cp37m-win32.whl", hash = "sha256:d051ec1c64b85ecc69531e1137bb9751c6830772ee5c1c426dbcfe98ef5788d7"}, + {file = "numpy-1.19.5-cp37-cp37m-win_amd64.whl", hash = "sha256:a12ff4c8ddfee61f90a1633a4c4afd3f7bcb32b11c52026c92a12e1325922d0d"}, + {file = "numpy-1.19.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf2402002d3d9f91c8b01e66fbb436a4ed01c6498fffed0e4c7566da1d40ee1e"}, + {file = "numpy-1.19.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1ded4fce9cfaaf24e7a0ab51b7a87be9038ea1ace7f34b841fe3b6894c721d1c"}, + {file = "numpy-1.19.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:012426a41bc9ab63bb158635aecccc7610e3eff5d31d1eb43bc099debc979d94"}, + {file = "numpy-1.19.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:759e4095edc3c1b3ac031f34d9459fa781777a93ccc633a472a5468587a190ff"}, + {file = "numpy-1.19.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:a9d17f2be3b427fbb2bce61e596cf555d6f8a56c222bd2ca148baeeb5e5c783c"}, + {file = "numpy-1.19.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:99abf4f353c3d1a0c7a5f27699482c987cf663b1eac20db59b8c7b061eabd7fc"}, + {file = "numpy-1.19.5-cp38-cp38-win32.whl", hash = "sha256:384ec0463d1c2671170901994aeb6dce126de0a95ccc3976c43b0038a37329c2"}, + {file = "numpy-1.19.5-cp38-cp38-win_amd64.whl", hash = "sha256:811daee36a58dc79cf3d8bdd4a490e4277d0e4b7d103a001a4e73ddb48e7e6aa"}, + {file = "numpy-1.19.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c843b3f50d1ab7361ca4f0b3639bf691569493a56808a0b0c54a051d260b7dbd"}, + {file = "numpy-1.19.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d6631f2e867676b13026e2846180e2c13c1e11289d67da08d71cacb2cd93d4aa"}, + {file = "numpy-1.19.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7fb43004bce0ca31d8f13a6eb5e943fa73371381e53f7074ed21a4cb786c32f8"}, + {file = "numpy-1.19.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2ea52bd92ab9f768cc64a4c3ef8f4b2580a17af0a5436f6126b08efbd1838371"}, + {file = "numpy-1.19.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:400580cbd3cff6ffa6293df2278c75aef2d58d8d93d3c5614cd67981dae68ceb"}, + {file = "numpy-1.19.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:df609c82f18c5b9f6cb97271f03315ff0dbe481a2a02e56aeb1b1a985ce38e60"}, + {file = "numpy-1.19.5-cp39-cp39-win32.whl", hash = "sha256:ab83f24d5c52d60dbc8cd0528759532736b56db58adaa7b5f1f76ad551416a1e"}, + {file = "numpy-1.19.5-cp39-cp39-win_amd64.whl", hash = "sha256:0eef32ca3132a48e43f6a0f5a82cb508f22ce5a3d6f67a8329c81c8e226d3f6e"}, + {file = "numpy-1.19.5-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:a0d53e51a6cb6f0d9082decb7a4cb6dfb33055308c4c44f53103c073f649af73"}, + {file = "numpy-1.19.5.zip", hash = "sha256:a76f502430dd98d7546e1ea2250a7360c065a5fdea52b2dffe8ae7180909b6f4"}, ] nvidia-ml-py3 = [ {file = "nvidia-ml-py3-7.352.0.tar.gz", hash = "sha256:390f02919ee9d73fe63a98c73101061a6b37fa694a793abf56673320f1f51277"}, ] +oauthlib = [ + {file = "oauthlib-3.1.1-py2.py3-none-any.whl", hash = "sha256:42bf6354c2ed8c6acb54d971fce6f88193d97297e18602a3a886603f9d7730cc"}, + {file = "oauthlib-3.1.1.tar.gz", hash = "sha256:8f0215fcc533dd8dd1bee6f4c412d4f0cd7297307d43ac61666389e3bc3198a3"}, +] opencensus = [ {file = "opencensus-0.7.13-py2.py3-none-any.whl", hash = "sha256:2d84b36d06aff4f0f00c7c5adee7c621d8a87d2813247724d96aa997c67dcfbc"}, {file = "opencensus-0.7.13.tar.gz", hash = "sha256:b58b86e5ac7c7760cf9716702dc09d1faf0c9606a8659d836a9bd30ba74ad169"}, @@ -2037,64 +2298,62 @@ opencensus-context = [ {file = "opencensus_context-0.1.2-py2.py3-none-any.whl", hash = "sha256:8bfb461d18f1dd243420224603c71544d7ac888bb236cf0d0a58545942561478"}, ] opencv-python = [ - {file = "opencv-python-4.5.3.56.tar.gz", hash = "sha256:3c001d3feec7f3140f1fb78dfc52ca28122db8240826882d175a208a89d2731b"}, - {file = "opencv_python-4.5.3.56-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:9a78558b5ae848386edbb843c761e5fed5a8480be9af16274a5a78838529edeb"}, - {file = "opencv_python-4.5.3.56-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:8d3282138f3a8646941089aae142684910ebe40776266448eab5f4bb609fc63f"}, - {file = "opencv_python-4.5.3.56-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:881f3d85269500e0c7d72b140a6ebb5c14a089f8140fb9da7ce01f12a245858e"}, - {file = "opencv_python-4.5.3.56-cp36-cp36m-win32.whl", hash = "sha256:f1bda4d144f5204e077ca4571453ebb2015e5748d5e0043386c92c2bbf7f52eb"}, - {file = "opencv_python-4.5.3.56-cp36-cp36m-win_amd64.whl", hash = "sha256:6763729fcfee2a08e069aa1982c9a8c1abf55b9cdf2fb9640eda1d85bdece19a"}, - {file = "opencv_python-4.5.3.56-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:68813b720b88e4951e84399b9a8a7b532d45a07a96ea8f539636242f862e32e0"}, - {file = "opencv_python-4.5.3.56-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:c360cb76ad1ddbd5d2d3e730b42f2ff6e4be08ea6f4a6eefacca175d27467e8f"}, - {file = "opencv_python-4.5.3.56-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:437f30e300725e1d1b3744dbfbc66a523a4744792b58f3dbe1e9140c8f4dfba5"}, - {file = "opencv_python-4.5.3.56-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:e42c644a70d5c54f53a4b114dbd88b4eb83f42a9ca998f07bd5682f3f404efcc"}, - {file = "opencv_python-4.5.3.56-cp37-cp37m-win32.whl", hash = "sha256:f3ac2355217114a683f3f72a9c40a5890914a59c4a2df62e4083c66ff65c9cf9"}, - {file = "opencv_python-4.5.3.56-cp37-cp37m-win_amd64.whl", hash = "sha256:7f41b97d84ac66bdf13cb4d9f4dad3e159525ba1e3f421e670c787ce536eb70a"}, - {file = "opencv_python-4.5.3.56-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:cdc3363c2911d7cfc6c9f55308c51c2841a7aecbf0bf5e791499d220ce89d880"}, - {file = "opencv_python-4.5.3.56-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:18a4a14015eee30d9cd514db8cdefbf594b1d5c234762d27abe512d62a333bc3"}, - {file = "opencv_python-4.5.3.56-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:05c5139d620e8d02f7ce0921796d55736fa19fa15e2ec00a388db2eb1ae1e9a1"}, - {file = "opencv_python-4.5.3.56-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:831b92fe63ce18dd628f71104da7e60596658b75e2fa16b83aefa3eb10c115e2"}, - {file = "opencv_python-4.5.3.56-cp38-cp38-win32.whl", hash = "sha256:e1f54736272830a1e895cedf7a4ee67737e31e966d380c82a81ef22515d043a3"}, - {file = "opencv_python-4.5.3.56-cp38-cp38-win_amd64.whl", hash = "sha256:b42bbba9f5421865377c7960bd4f3dd881003b322a6bf46ed2302b89224d102b"}, - {file = "opencv_python-4.5.3.56-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5366fcd6eae4243add3c8c92142045850f1db8e464bcf0b75313e1596b2e3671"}, - {file = "opencv_python-4.5.3.56-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:54c64e86a087841869901fd34462bb6bec01cd4652800fdf5d92fe7b0596c82f"}, - {file = "opencv_python-4.5.3.56-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:8852be06c0749fef0d9c58f532bbcb0570968c59e41cf56b90f5c92593c6e108"}, - {file = "opencv_python-4.5.3.56-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8b5bc61be7fc8565140b746288b370a4bfdb4edb9d680b66bb914e7690485db1"}, - {file = "opencv_python-4.5.3.56-cp39-cp39-win32.whl", hash = "sha256:085232718f28bddd265da480874c37db5c7354cb08f23f4a68a8639b16276a89"}, - {file = "opencv_python-4.5.3.56-cp39-cp39-win_amd64.whl", hash = "sha256:205a73adb29c37e42475645519e612e843a985475da993d10b4d5daa6afec36a"}, + {file = "opencv_python-4.5.2.54-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:4e6c2d8320168a4f76822fbb76df3b18688ac5e068d49ac38a4ce39af0f8e1a6"}, + {file = "opencv_python-4.5.2.54-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9680ab256ab31bdafd74f6cf55eb570e5629b5604d50fd69dd1bd2a8124f0611"}, + {file = "opencv_python-4.5.2.54-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ef3102b70aa59ab3fed69df30465c1b7587d681e963dfff5146de233c75df7ba"}, + {file = "opencv_python-4.5.2.54-cp36-cp36m-win32.whl", hash = "sha256:89a2b45429bf945988a17b0404431d9d8fdc9e04fb2450b56fa01f6f9477101d"}, + {file = "opencv_python-4.5.2.54-cp36-cp36m-win_amd64.whl", hash = "sha256:08327a38564786bf73e387736f080e8ad4c110b394ca4af2ecec8277b305bf44"}, + {file = "opencv_python-4.5.2.54-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:6b2573c6367ec0052b37e375d18638a885dd7a10a5ef8dd726b391969c227f23"}, + {file = "opencv_python-4.5.2.54-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b724a96eeb88842bd2371b1ffe2da73b6295063ba5c029aa34139d25b8315a3f"}, + {file = "opencv_python-4.5.2.54-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:4b8814d3f0cf01e8b8624125f7dcfb095893abcc04083cb4968fa1629bc81161"}, + {file = "opencv_python-4.5.2.54-cp37-cp37m-win32.whl", hash = "sha256:d9004e2cc90bb2862cdc1d062fac5163d3def55b200081d4520d3e90b4c7197b"}, + {file = "opencv_python-4.5.2.54-cp37-cp37m-win_amd64.whl", hash = "sha256:2436b71346d1eed423577fac8cd3aa9c0832ea97452444dc7f856b2f09600dba"}, + {file = "opencv_python-4.5.2.54-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:0118a086fad8d77acdf46ac68df49d4167fbb85420f8bcf2615d7b74fc03aae0"}, + {file = "opencv_python-4.5.2.54-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:b3bef3f2a2ab3c201784d12ec6b5c9e61c920c15b6854d8d2f62fd019e3df846"}, + {file = "opencv_python-4.5.2.54-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:6e2070e35f2aaca3d1259093c786d4e373004b36d89a94e81943247c6ed3d4e1"}, + {file = "opencv_python-4.5.2.54-cp38-cp38-win32.whl", hash = "sha256:f12f39c1e5001e1c00df5873e3eee6f0232b7723a60b7ef438b1e23f1341df0e"}, + {file = "opencv_python-4.5.2.54-cp38-cp38-win_amd64.whl", hash = "sha256:10325c3fd571e33a11eb5f0e5d265d73baef22dbb34c977f28df7e22de47b0bc"}, + {file = "opencv_python-4.5.2.54-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:050227e5728ea8316ec114aca8f43d56253cbb1c50983e3b136a988254a83118"}, + {file = "opencv_python-4.5.2.54-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:c446555cbbc4f5e809f9c15ac1b6200024032d9859f5ac5a2ca7669d09e4c91c"}, + {file = "opencv_python-4.5.2.54-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8cf81f53ac5ad900ca443a8252c4e0bc1256f1c2cb2d8459df2ba1ac014dfa36"}, + {file = "opencv_python-4.5.2.54-cp39-cp39-win32.whl", hash = "sha256:a8020cc6145c6934192189058743a55189750df6dff894396edb8b35a380cc48"}, + {file = "opencv_python-4.5.2.54-cp39-cp39-win_amd64.whl", hash = "sha256:0a3aef70b7c53bbd22ade86a4318b8a2ad98d3c3ed3d0c315f18bf1a2d868709"}, +] +opt-einsum = [ + {file = "opt_einsum-3.3.0-py3-none-any.whl", hash = "sha256:2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147"}, + {file = "opt_einsum-3.3.0.tar.gz", hash = "sha256:59f6475f77bbc37dcf7cd748519c0ec60722e91e63ca114e68821c0c54a46549"}, ] packaging = [ {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, ] pandas = [ - {file = "pandas-1.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ba7ceb8abc6dbdb1e34612d1173d61e4941f1a1eb7e6f703b2633134ae6a6c89"}, - {file = "pandas-1.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb71b1935249de80e3a808227189eee381d4d74a31760ced2df21eedc92a8e3"}, - {file = "pandas-1.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa54dc1d3e5d004a09ab0b1751473698011ddf03e14f1f59b84ad9a6ac630975"}, - {file = "pandas-1.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34ced9ce5d5b17b556486da7256961b55b471d64a8990b56e67a84ebeb259416"}, - {file = "pandas-1.3.2-cp37-cp37m-win32.whl", hash = "sha256:a56246de744baf646d1f3e050c4653d632bc9cd2e0605f41051fea59980e880a"}, - {file = "pandas-1.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:53b17e4debba26b7446b1e4795c19f94f0c715e288e08145e44bdd2865e819b3"}, - {file = "pandas-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f07a9745ca075ae73a5ce116f5e58f691c0dc9de0bff163527858459df5c176f"}, - {file = "pandas-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9e8e0ce5284ebebe110efd652c164ed6eab77f5de4c3533abc756302ee77765"}, - {file = "pandas-1.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59a78d7066d1c921a77e3306aa0ebf6e55396c097d5dfcc4df8defe3dcecb735"}, - {file = "pandas-1.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:132def05e73d292c949b02e7ef873debb77acc44a8b119d215921046f0c3a91d"}, - {file = "pandas-1.3.2-cp38-cp38-win32.whl", hash = "sha256:69e1b2f5811f46827722fd641fdaeedb26002bd1e504eacc7a8ec36bdc25393e"}, - {file = "pandas-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:7996d311413379136baf0f3cf2a10e331697657c87ced3f17ac7c77f77fe34a3"}, - {file = "pandas-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1738154049062156429a5cf2fd79a69c9f3fa4f231346a7ec6fd156cd1a9a621"}, - {file = "pandas-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cce01f6d655b4add966fcd36c32c5d1fe84628e200626b3f5e2f40db2d16a0f"}, - {file = "pandas-1.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1099e2a0cd3a01ec62cca183fc1555833a2d43764950ef8cb5948c8abfc51014"}, - {file = "pandas-1.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0cd5776be891331a3e6b425b5abeab9596abea18435c5982191356f9b24ae731"}, - {file = "pandas-1.3.2-cp39-cp39-win32.whl", hash = "sha256:66a95361b81b4ba04b699ecd2416b0591f40cd1e24c60a8bfe0d19009cfa575a"}, - {file = "pandas-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:89f40e5d21814192802421df809f948247d39ffe171e45fe2ab4abf7bd4279d8"}, - {file = "pandas-1.3.2.tar.gz", hash = "sha256:cbcb84d63867af3411fa063af3de64902665bb5b3d40b25b2059e40603594e87"}, + {file = "pandas-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68408a39a54ebadb9014ee5a4fae27b2fe524317bc80adf56c9ac59e8f8ea431"}, + {file = "pandas-1.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b16b1b920c4cb27fdd65a2c20258bcd9c794be491290660722bb0ea765054d"}, + {file = "pandas-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:37d63e78e87eb3791da7be4100a65da0383670c2b59e493d9e73098d7a879226"}, + {file = "pandas-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e2fb11f86f6253bb1df26e3aeab3bf2e000aaa32a953ec394571bec5dc6fd6"}, + {file = "pandas-1.3.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7326b37de08d42dd3fff5b7ef7691d0fd0bf2428f4ba5a2bdc3b3247e9a52e4c"}, + {file = "pandas-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2f29b4da6f6ae7c68f4b3708d9d9e59fa89b2f9e87c2b64ce055cbd39f729e"}, + {file = "pandas-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:3f5020613c1d8e304840c34aeb171377dc755521bf5e69804991030c2a48aec3"}, + {file = "pandas-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c399200631db9bd9335d013ec7fce4edb98651035c249d532945c78ad453f23a"}, + {file = "pandas-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a800df4e101b721e94d04c355e611863cc31887f24c0b019572e26518cbbcab6"}, + {file = "pandas-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3334a5a9eeaca953b9db1b2b165dcdc5180b5011f3bec3a57a3580c9c22eae68"}, + {file = "pandas-1.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49fd2889d8116d7acef0709e4c82b8560a8b22b0f77471391d12c27596e90267"}, + {file = "pandas-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7557b39c8e86eb0543a17a002ac1ea0f38911c3c17095bc9350d0a65b32d801c"}, + {file = "pandas-1.3.3-cp38-cp38-win32.whl", hash = "sha256:629138b7cf81a2e55aa29ce7b04c1cece20485271d1f6c469c6a0c03857db6a4"}, + {file = "pandas-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:45649503e167d45360aa7c52f18d1591a6d5c70d2f3a26bc90a3297a30ce9a66"}, + {file = "pandas-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebbed7312547a924df0cbe133ff1250eeb94cdff3c09a794dc991c5621c8c735"}, + {file = "pandas-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9f1b54d7efc9df05320b14a48fb18686f781aa66cc7b47bb62fabfc67a0985c"}, + {file = "pandas-1.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9bc59855598cb57f68fdabd4897d3ed2bc3a3b3bef7b868a0153c4cd03f3207"}, + {file = "pandas-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4def2ef2fb7fcd62f2aa51bacb817ee9029e5c8efe42fe527ba21f6a3ddf1a9f"}, + {file = "pandas-1.3.3-cp39-cp39-win32.whl", hash = "sha256:f7d84f321674c2f0f31887ee6d5755c54ca1ea5e144d6d54b3bbf566dd9ea0cc"}, + {file = "pandas-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:e574c2637c9d27f322e911650b36e858c885702c5996eda8a5a60e35e6648cf2"}, + {file = "pandas-1.3.3.tar.gz", hash = "sha256:272c8cb14aa9793eada6b1ebe81994616e647b5892a370c7135efb2924b701df"}, ] parso = [ {file = "parso-0.8.2-py2.py3-none-any.whl", hash = "sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22"}, {file = "parso-0.8.2.tar.gz", hash = "sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398"}, ] -pathspec = [ - {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, - {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, -] pexpect = [ {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, @@ -2158,10 +2417,6 @@ pillow = [ {file = "Pillow-8.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ce651ca46d0202c302a535d3047c55a0131a720cf554a578fc1b8a2aff0e7d96"}, {file = "Pillow-8.3.2.tar.gz", hash = "sha256:dde3f3ed8d00c72631bc19cbfff8ad3b6215062a5eed402381ad365f82f0c18c"}, ] -platformdirs = [ - {file = "platformdirs-2.3.0-py3-none-any.whl", hash = "sha256:8003ac87717ae2c7ee1ea5a84a1a61e87f3fbd16eb5aadba194ea30a9019f648"}, - {file = "platformdirs-2.3.0.tar.gz", hash = "sha256:15b056538719b1c94bdaccb29e5f81879c7f7f0f4a153f46086d155dffcd4f0f"}, -] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, @@ -2295,8 +2550,8 @@ pyreadline = [ {file = "pyreadline-2.1.zip", hash = "sha256:4530592fc2e85b25b1a9f79664433da09237c1a270e4d78ea5aa3a2c7229e2d1"}, ] pyro4 = [ - {file = "Pyro4-4.80-py2.py3-none-any.whl", hash = "sha256:f195a4a9403f58807e66ca269c771e1d268064945f65cfbbf59a1feb12a1695f"}, - {file = "Pyro4-4.80.tar.gz", hash = "sha256:46847ca703de3f483fbd0b2d22622f36eff03e6ef7ec7704d4ecaa3964cb2220"}, + {file = "Pyro4-4.81-py2.py3-none-any.whl", hash = "sha256:589e233511b620884dd115d0ae51dc2e8bd8eb5deb255b7dab99c3cbb9ec64b0"}, + {file = "Pyro4-4.81.tar.gz", hash = "sha256:e130da06478b813173b959f7013d134865e07fbf58cc5f1a2598f99479cdac5f"}, ] pyrsistent = [ {file = "pyrsistent-0.18.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f4c8cabb46ff8e5d61f56a037974228e978f26bfefce4f61a4b1ac0ba7a2ab72"}, @@ -2401,53 +2656,15 @@ redis = [ {file = "redis-3.5.3-py2.py3-none-any.whl", hash = "sha256:432b788c4530cfe16d8d943a09d40ca6c16149727e4afe8c2c9d5580c59d9f24"}, {file = "redis-3.5.3.tar.gz", hash = "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2"}, ] -regex = [ - {file = "regex-2021.8.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9d05ad5367c90814099000442b2125535e9d77581855b9bee8780f1b41f2b1a2"}, - {file = "regex-2021.8.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3bf1bc02bc421047bfec3343729c4bbbea42605bcfd6d6bfe2c07ade8b12d2a"}, - {file = "regex-2021.8.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f6a808044faae658f546dd5f525e921de9fa409de7a5570865467f03a626fc0"}, - {file = "regex-2021.8.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a617593aeacc7a691cc4af4a4410031654f2909053bd8c8e7db837f179a630eb"}, - {file = "regex-2021.8.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79aef6b5cd41feff359acaf98e040844613ff5298d0d19c455b3d9ae0bc8c35a"}, - {file = "regex-2021.8.28-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0fc1f8f06977c2d4f5e3d3f0d4a08089be783973fc6b6e278bde01f0544ff308"}, - {file = "regex-2021.8.28-cp310-cp310-win32.whl", hash = "sha256:6eebf512aa90751d5ef6a7c2ac9d60113f32e86e5687326a50d7686e309f66ed"}, - {file = "regex-2021.8.28-cp310-cp310-win_amd64.whl", hash = "sha256:ac88856a8cbccfc14f1b2d0b829af354cc1743cb375e7f04251ae73b2af6adf8"}, - {file = "regex-2021.8.28-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c206587c83e795d417ed3adc8453a791f6d36b67c81416676cad053b4104152c"}, - {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8690ed94481f219a7a967c118abaf71ccc440f69acd583cab721b90eeedb77c"}, - {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:328a1fad67445550b982caa2a2a850da5989fd6595e858f02d04636e7f8b0b13"}, - {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c7cb4c512d2d3b0870e00fbbac2f291d4b4bf2634d59a31176a87afe2777c6f0"}, - {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66256b6391c057305e5ae9209941ef63c33a476b73772ca967d4a2df70520ec1"}, - {file = "regex-2021.8.28-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8e44769068d33e0ea6ccdf4b84d80c5afffe5207aa4d1881a629cf0ef3ec398f"}, - {file = "regex-2021.8.28-cp36-cp36m-win32.whl", hash = "sha256:08d74bfaa4c7731b8dac0a992c63673a2782758f7cfad34cf9c1b9184f911354"}, - {file = "regex-2021.8.28-cp36-cp36m-win_amd64.whl", hash = "sha256:abb48494d88e8a82601af905143e0de838c776c1241d92021e9256d5515b3645"}, - {file = "regex-2021.8.28-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b4c220a1fe0d2c622493b0a1fd48f8f991998fb447d3cd368033a4b86cf1127a"}, - {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4a332404baa6665b54e5d283b4262f41f2103c255897084ec8f5487ce7b9e8e"}, - {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c61dcc1cf9fd165127a2853e2c31eb4fb961a4f26b394ac9fe5669c7a6592892"}, - {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ee329d0387b5b41a5dddbb6243a21cb7896587a651bebb957e2d2bb8b63c0791"}, - {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60667673ff9c249709160529ab39667d1ae9fd38634e006bec95611f632e759"}, - {file = "regex-2021.8.28-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b844fb09bd9936ed158ff9df0ab601e2045b316b17aa8b931857365ea8586906"}, - {file = "regex-2021.8.28-cp37-cp37m-win32.whl", hash = "sha256:4cde065ab33bcaab774d84096fae266d9301d1a2f5519d7bd58fc55274afbf7a"}, - {file = "regex-2021.8.28-cp37-cp37m-win_amd64.whl", hash = "sha256:1413b5022ed6ac0d504ba425ef02549a57d0f4276de58e3ab7e82437892704fc"}, - {file = "regex-2021.8.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ed4b50355b066796dacdd1cf538f2ce57275d001838f9b132fab80b75e8c84dd"}, - {file = "regex-2021.8.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28fc475f560d8f67cc8767b94db4c9440210f6958495aeae70fac8faec631797"}, - {file = "regex-2021.8.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdc178caebd0f338d57ae445ef8e9b737ddf8fbc3ea187603f65aec5b041248f"}, - {file = "regex-2021.8.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:999ad08220467b6ad4bd3dd34e65329dd5d0df9b31e47106105e407954965256"}, - {file = "regex-2021.8.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:808ee5834e06f57978da3e003ad9d6292de69d2bf6263662a1a8ae30788e080b"}, - {file = "regex-2021.8.28-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d5111d4c843d80202e62b4fdbb4920db1dcee4f9366d6b03294f45ed7b18b42e"}, - {file = "regex-2021.8.28-cp38-cp38-win32.whl", hash = "sha256:473858730ef6d6ff7f7d5f19452184cd0caa062a20047f6d6f3e135a4648865d"}, - {file = "regex-2021.8.28-cp38-cp38-win_amd64.whl", hash = "sha256:31a99a4796bf5aefc8351e98507b09e1b09115574f7c9dbb9cf2111f7220d2e2"}, - {file = "regex-2021.8.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:04f6b9749e335bb0d2f68c707f23bb1773c3fb6ecd10edf0f04df12a8920d468"}, - {file = "regex-2021.8.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b006628fe43aa69259ec04ca258d88ed19b64791693df59c422b607b6ece8bb"}, - {file = "regex-2021.8.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:121f4b3185feaade3f85f70294aef3f777199e9b5c0c0245c774ae884b110a2d"}, - {file = "regex-2021.8.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a577a21de2ef8059b58f79ff76a4da81c45a75fe0bfb09bc8b7bb4293fa18983"}, - {file = "regex-2021.8.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1743345e30917e8c574f273f51679c294effba6ad372db1967852f12c76759d8"}, - {file = "regex-2021.8.28-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e1e8406b895aba6caa63d9fd1b6b1700d7e4825f78ccb1e5260551d168db38ed"}, - {file = "regex-2021.8.28-cp39-cp39-win32.whl", hash = "sha256:ed283ab3a01d8b53de3a05bfdf4473ae24e43caee7dcb5584e86f3f3e5ab4374"}, - {file = "regex-2021.8.28-cp39-cp39-win_amd64.whl", hash = "sha256:610b690b406653c84b7cb6091facb3033500ee81089867ee7d59e675f9ca2b73"}, - {file = "regex-2021.8.28.tar.gz", hash = "sha256:f585cbbeecb35f35609edccb95efd95a3e35824cd7752b586503f7e6087303f1"}, -] requests = [ {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, ] +requests-oauthlib = [ + {file = "requests-oauthlib-1.3.0.tar.gz", hash = "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a"}, + {file = "requests_oauthlib-1.3.0-py2.py3-none-any.whl", hash = "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d"}, + {file = "requests_oauthlib-1.3.0-py3.7.egg", hash = "sha256:fa6c47b933f01060936d87ae9327fead68768b69c6c9ea2109c48be30f2d4dbc"}, +] rsa = [ {file = "rsa-4.7.2-py3-none-any.whl", hash = "sha256:78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2"}, {file = "rsa-4.7.2.tar.gz", hash = "sha256:9d689e6ca1b3038bc82bf8d23e944b6b6037bc02301a574935b2dd946e0353b9"}, @@ -2538,17 +2755,48 @@ simple-term-menu = [ {file = "simple_term_menu-1.4.1-py3-none-any.whl", hash = "sha256:35cfbf6e855c347938c2da27a619cf0e212bc72a48bb86e43fa462ec7d7bccec"}, ] six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, + {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, ] tabulate = [ {file = "tabulate-0.8.9-py3-none-any.whl", hash = "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4"}, {file = "tabulate-0.8.9.tar.gz", hash = "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7"}, ] +tensorboard = [ + {file = "tensorboard-2.6.0-py3-none-any.whl", hash = "sha256:f7dac4cdfb52d14c9e3f74585ce2aaf8e6203620a864e51faf84988b09f7bbdb"}, +] +tensorboard-data-server = [ + {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"}, +] +tensorboard-plugin-wit = [ + {file = "tensorboard_plugin_wit-1.8.0-py3-none-any.whl", hash = "sha256:2a80d1c551d741e99b2f197bb915d8a133e24adb8da1732b840041860f91183a"}, +] tensorboardx = [ {file = "tensorboardX-2.4-py2.py3-none-any.whl", hash = "sha256:2742b1ac3fdef2b938b1110b503c6986b7100a3250394a5a44ef12784b563b55"}, {file = "tensorboardX-2.4.tar.gz", hash = "sha256:e56331ee79b7656c6f0974ab2e918045d5e9393701f83cac8884de4b5b360130"}, ] +tensorflow = [ + {file = "tensorflow-2.6.0-cp36-cp36m-macosx_10_11_x86_64.whl", hash = "sha256:c67fad296a3a2133b7a14da5f06c9937e7911b02c5d7a3ff6ba52a1d79b6bc9e"}, + {file = "tensorflow-2.6.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:8b5ce09ede0fe45ef100f4dc65cf3f46722194e75139f85d524058315e2ce9fa"}, + {file = "tensorflow-2.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:dea97f664246e185d79cbe40a86309527affd4232f06afa8a6500c4fc4b64a03"}, + {file = "tensorflow-2.6.0-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:4716c9b25a61a2c79b1f253d1e114f1f8679241559c13ad18c657c626a7d5924"}, + {file = "tensorflow-2.6.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:e45e026a9d08c89cecc1160d8248135e2fb79bdc3267328399e1fb25ce583bd6"}, + {file = "tensorflow-2.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6e38b6969414d16afc560c58ca34e1328cc0a5dbd644b64e060f5be8a6653274"}, + {file = "tensorflow-2.6.0-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:2a067d22a356c2cd4753bdd16ee492c55a610f5ebc52713e2954c642f070321c"}, + {file = "tensorflow-2.6.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:2c9b8c6adc060acfcf805a2ea501db0124b679d95b522fd5983a4c110e8e0264"}, + {file = "tensorflow-2.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:d6468e05552720100e8f94097feb770de320e4c8c244323a8746bd84e5ba4052"}, + {file = "tensorflow-2.6.0-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:00b1af0a0c5c102db19caceffac4bd4e6c536e6d7512144c241a4ace4428e7c6"}, + {file = "tensorflow-2.6.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:bc73ebdd30c48cfc27ba307271117e6dbb795b37396ed817b2fec9393380b115"}, + {file = "tensorflow-2.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:bfb255c2b0400bc5b4060dda098d46cd7ddeb53b7cbac1dfa29435612cba828c"}, +] +tensorflow-estimator = [ + {file = "tensorflow_estimator-2.6.0-py2.py3-none-any.whl", hash = "sha256:cf78528998efdb637ac0abaf525c929bf192767544eb24ae20d9266effcf5afd"}, +] +termcolor = [ + {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"}, +] threadpoolctl = [ {file = "threadpoolctl-2.2.0-py3-none-any.whl", hash = "sha256:e5a995e3ffae202758fa8a90082e35783b9370699627ae2733cd1c3a73553616"}, {file = "threadpoolctl-2.2.0.tar.gz", hash = "sha256:86d4b6801456d780e94681d155779058759eaef3c3564758b17b6c99db5f81cb"}, @@ -2561,10 +2809,6 @@ toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] -tomli = [ - {file = "tomli-1.2.1-py3-none-any.whl", hash = "sha256:8dd0e9524d6f386271a36b41dbf6c57d8e32fd96fd22b6584679dc569d20899f"}, - {file = "tomli-1.2.1.tar.gz", hash = "sha256:a5b75cb6f3968abb47af1b40c1819dc519ea82bcc065776a866e8d74c5ca9442"}, -] tqdm = [ {file = "tqdm-4.62.2-py2.py3-none-any.whl", hash = "sha256:80aead664e6c1672c4ae20dc50e1cdc5e20eeff9b14aa23ecd426375b28be588"}, {file = "tqdm-4.62.2.tar.gz", hash = "sha256:a4d6d112e507ef98513ac119ead1159d286deab17dffedd96921412c2d236ff5"}, @@ -2573,46 +2817,14 @@ traitlets = [ {file = "traitlets-5.1.0-py3-none-any.whl", hash = "sha256:03f172516916220b58c9f19d7f854734136dd9528103d04e9bf139a92c9f54c4"}, {file = "traitlets-5.1.0.tar.gz", hash = "sha256:bd382d7ea181fbbcce157c133db9a829ce06edffe097bcf3ab945b435452b46d"}, ] -typed-ast = [ - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, - {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, - {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, - {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, - {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, - {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, - {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, - {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, - {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, - {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, - {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, - {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, - {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, - {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, - {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, - {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, -] typing = [ {file = "typing-3.7.4.3-py2-none-any.whl", hash = "sha256:283d868f5071ab9ad873e5e52268d611e851c870a2ba354193026f2dfb29d8b5"}, {file = "typing-3.7.4.3.tar.gz", hash = "sha256:1187fb9c82fd670d10aa07bbb6cfcfe4bdda42d6fab8d5134f04e8c4d0b71cc9"}, ] typing-extensions = [ - {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, - {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, - {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, + {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, + {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, + {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, ] urllib3 = [ {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"}, @@ -2622,6 +2834,13 @@ wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, ] +werkzeug = [ + {file = "Werkzeug-2.0.1-py3-none-any.whl", hash = "sha256:6c1ec500dcdba0baa27600f6a22f6333d8b662d22027ff9f6202e3367413caa8"}, + {file = "Werkzeug-2.0.1.tar.gz", hash = "sha256:1de1db30d010ff1af14a009224ec49ab2329ad2cde454c8a708130642d579c42"}, +] +wrapt = [ + {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, +] xmltodict = [ {file = "xmltodict-0.12.0-py2.py3-none-any.whl", hash = "sha256:8bbcb45cc982f48b2ca8fe7e7827c5d792f217ecf1792626f808bf41c3b86051"}, {file = "xmltodict-0.12.0.tar.gz", hash = "sha256:50d8c638ed7ecb88d90561beedbf720c9b4e851a9fa6c47ebd64e99d166d8a21"}, diff --git a/pyproject.toml b/pyproject.toml index 3352bbb..127805b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,7 @@ repository = "https://github.com/juliusfrost/minerl-rllib/" [tool.poetry.dependencies] python = "^3.7.1" -scikit-learn = "^0.24.2" +scikit-learn = "*" ray = [ {extras = ["default", "tune", "rllib"], markers = "python_version == '3.9' and sys_platform == 'linux'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/ea4a22249c7029fef1d7686e94ddde28c67ee5c8/ray-2.0.0.dev0-cp39-cp39-manylinux2014_x86_64.whl"}, {extras = ["default", "tune", "rllib"], markers = "python_version == '3.8' and sys_platform == 'linux'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/ea4a22249c7029fef1d7686e94ddde28c67ee5c8/ray-2.0.0.dev0-cp38-cp38-manylinux2014_x86_64.whl"}, @@ -19,11 +19,11 @@ ray = [ {extras = ["default", "tune", "rllib"], markers = "python_version == '3.8' and sys_platform == 'win32'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/ea4a22249c7029fef1d7686e94ddde28c67ee5c8/ray-2.0.0.dev0-cp38-cp38-win_amd64.whl"}, {extras = ["default", "tune", "rllib"], markers = "python_version == '3.7' and sys_platform == 'win32'", url = "https://s3-us-west-2.amazonaws.com/ray-wheels/master/ea4a22249c7029fef1d7686e94ddde28c67ee5c8/ray-2.0.0.dev0-cp37-cp37m-win_amd64.whl"} ] -minerl-wrappers = "^0.1.5" +minerl-wrappers = "^0.1.6" +tensorflow = "^2.6.0" [tool.poetry.dev-dependencies] pytest = "^6.2.4" -black = "^21.7b0" [build-system] requires = ["poetry-core>=1.0.0"] From 2ec2b26c0cd0605dfb98ed0ac199e9276198e488 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Thu, 16 Sep 2021 23:35:20 -0400 Subject: [PATCH 33/48] lazy minerl env --- minerl_rllib/envs/env.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/minerl_rllib/envs/env.py b/minerl_rllib/envs/env.py index 3c25229..3c56295 100644 --- a/minerl_rllib/envs/env.py +++ b/minerl_rllib/envs/env.py @@ -85,10 +85,6 @@ def render(self, mode="human"): pass -def wrap_env(env, **kwargs): - return wrap(env, **kwargs) - - def register_minerl_envs(): for env_spec in ( BASIC_ENV_SPECS + COMPETITION_ENV_SPECS + BASALT_COMPETITION_ENV_SPECS @@ -96,7 +92,7 @@ def register_minerl_envs(): def env_creator(env_config): with filelock.FileLock("minerl_env.lock"): - env = wrap_env(env_spec.make(), **env_config) + env = wrap(LazyMineRLEnv(env_spec), **env_config) return env register_env(env_spec.name, env_creator) From 9910ddcbc02c74a19ec1a2b81c125b1db55b9042 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Thu, 16 Sep 2021 23:37:38 -0400 Subject: [PATCH 34/48] fix input.py --- minerl_rllib/envs/input.py | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/minerl_rllib/envs/input.py b/minerl_rllib/envs/input.py index 415e45c..ca8c3e1 100644 --- a/minerl_rllib/envs/input.py +++ b/minerl_rllib/envs/input.py @@ -11,7 +11,7 @@ from ray.tune.registry import register_input from minerl_rllib.envs.data import MinerRLDataEnv -from minerl_rllib.envs.env import wrap_env +from minerl_rllib.envs.env import wrap from minerl_rllib.envs.utils import patch_data_pipeline @@ -95,7 +95,7 @@ def __init__(self, ioctx: IOContext = None): seed=seed, ) env = MinerRLDataEnv(self.data) - env = wrap_env(env, **env_config) + env = wrap(env, **env_config) self.episode_generator = simulate_env_interaction(env) self.prep = get_preprocessor(env.observation_space)(env.observation_space) @@ -205,23 +205,5 @@ def minerl_input_creator(ioctx: IOContext = None): return MineRLInputReader(ioctx=ioctx) -def recursive_print(d): - if isinstance(d, dict): - print("{") - for k, v in d.items(): - print(f"key={k}") - recursive_print(v) - print("}") - elif isinstance(d, list) or isinstance(d, tuple): - print("[") - for v in d: - recursive_print(v) - print("]") - elif isinstance(d, np.ndarray): - print(d.shape) - else: - print(d) - - def register_minerl_input(): register_input("minerl", minerl_input_creator) From 2308013bd0fc24a8995c6515507c3c867eddd8ce Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Thu, 16 Sep 2021 23:39:12 -0400 Subject: [PATCH 35/48] outdated test --- tests/discrete.py | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 tests/discrete.py diff --git a/tests/discrete.py b/tests/discrete.py deleted file mode 100644 index ddedc37..0000000 --- a/tests/discrete.py +++ /dev/null @@ -1,26 +0,0 @@ -import os -import numpy as np -import gym -from tqdm import tqdm -from minerl_rllib.envs import wrap - - -def test_discrete(): - os.chdir("..") - env = gym.make("MineRLTreechopVectorObf-v0") - env = wrap(env, discrete=True, num_actions=32) - - for _ in tqdm(range(100)): - print(env.reverse_action(np.random.randn(1, 64))) - - done = False - obs = env.reset() - for _ in tqdm(range(100)): - if done: - break - action = env.action_space.sample() - obs, reward, done, info = env.step(action) - - -if __name__ == "__main__": - test_discrete() From 59121cffb3fd1b257639b1be37102eb3bef78f13 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Fri, 17 Sep 2021 00:02:00 -0400 Subject: [PATCH 36/48] update README.md --- README.md | 72 ++++++++++++++++++------------------------------------- 1 file changed, 23 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 37eb403..43fe104 100644 --- a/README.md +++ b/README.md @@ -7,66 +7,40 @@ RLlib natively supports TensorFlow, TensorFlow Eager, and PyTorch, but most of i ## Installation +Make sure you have JDK 1.8 on your system for [MineRL](https://minerl.io/docs/tutorials/index.html#installation) + Requires Python 3.7 or 3.8. -1. Make sure you have JDK 1.8 on your system for [MineRL](https://minerl.io/docs/tutorials/index.html#installation). -``` -git clone https://github.com/juliusfrost/minerl-rllib.git -cd minerl-rllib -pip install -r requirements.txt +#### Use a conda virtual environment +```bash +conda create --name minerl-rllib python=3.8 +conda activate minerl-rllib ``` -2. Install [Ray Latest Snapshots (Nightlies)](https://docs.ray.io/en/master/installation.html#latest-snapshots-nightlies) -3. Install [PyTorch](https://pytorch.org/get-started/locally/) and [TensorFlow](https://www.tensorflow.org/install) with correct cuda version. - -## Implementation Details -See [Implementation Details](Implementation.md) - -For discrete action spaces, make sure you have the environment variable `MINERL_DATA_ROOT` set, -otherwise it defaults to the `data` folder. -Then, run `python generate_kmeans.py` - -### Configuration -This repository comes with a modular configuration system. -We specify configuration `yaml` files according to the rllib specification. -You can see an example config at `config/minerl-impala-debug.yaml` +#### Install dependencies +```bash +pip install poetry +poetry install +``` +Install [PyTorch](https://pytorch.org/get-started/locally/) with correct cuda version. +## How to Use ### Data +Make sure you have the environment variable `MINERL_DATA_ROOT` set, +otherwise it defaults to the `data` folder. + #### Downloading the MineRL dataset Follow the official instructions: https://minerl.io/dataset/ If you download the data to `./data` then you don't need to set `MINERL_DATA_ROOT` in your environment variables. -#### Discrete Action Space with K-means clustering -You can use a discrete action space by running the `generate_kmeans.py` script. For example, -``` -python generate_kmeans.py --num-actions 32 --env MineRLObtainDiamondVectorObf-v0 -``` -Then to use discrete actions with your agent, set `discrete: true` in the `env_config` of your config file. - -#### Input data to your RLLib algorithm -To feed data to your rllib algorithm, you must first convert the minerl dataset into the json format -that is specified by the [RLLib Input API](https://docs.ray.io/en/master/rllib-offline.html#input-api). -Use the `convert_data.py` script to convert the data into the correct format. -You can specify the environment configuration `env_config` -with either the `-f` / `--config-file` or `--env-config` flag. -Example: -``` -# if you use an env_config different from the default settings, you must specify it -python convert_data.py --env MineRLObtainDiamondVectorObf-v0 -f example_config.yaml -``` - ### Training -We use `rllib_train.py` to train our RL algorithm on MineRL. -The easiest way to get started is to specify all of your configurations first as stated in the previous section. -See help with `python rllib_train.py --help` - -Here is an example command: +Do `train.py --help` to see all options. +See the following command trains the SAC algorithm on offline data in the `MineRLObtainDiamondVectorObf-v0` environment. ``` -python rllib_train.py -f config/minerl-impala-debug.yaml +python train.py -f config/sac-offline.yaml ``` -This will run the IMPALA RL algorithm on the MineRL Debug Environment, -which has the same observation space and action space as the competition environments -but doesn't run Minecraft explicitly. -### Testing -See help with `python rllib_test.py --help` +#### Configuration + +This repository comes with a modular configuration system. +We specify configuration `yaml` files according to the rllib specification. From 4fc336a9c537e696c15c1e69b71ea4a97a5cab23 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Sat, 18 Sep 2021 22:02:59 -0400 Subject: [PATCH 37/48] automate kmeans generation --- minerl_rllib/convert_data.py | 10 ++++++++- minerl_rllib/envs/env.py | 37 +++++++++++++++++++++++++++++++-- minerl_rllib/envs/input.py | 4 ++-- minerl_rllib/generate_kmeans.py | 9 ++++++-- 4 files changed, 53 insertions(+), 7 deletions(-) diff --git a/minerl_rllib/convert_data.py b/minerl_rllib/convert_data.py index 86bdfa4..6cf58c7 100644 --- a/minerl_rllib/convert_data.py +++ b/minerl_rllib/convert_data.py @@ -8,7 +8,10 @@ from minerl_rllib.envs.data import write_jsons -parser = argparse.ArgumentParser() +parser = argparse.ArgumentParser( + "This script is outdated. " + "Use the 'input: minerl' option to load the correct data automatically." +) parser.add_argument( "--data-dir", type=str, @@ -57,6 +60,11 @@ def get_save_path(data_dir, env_config, env_name=None): def main(): args = parser.parse_args() + print( + "This script is outdated. " + "Use the 'input: minerl' option to load the correct data automatically." + ) + env_list = [] env_config = {} diff --git a/minerl_rllib/envs/env.py b/minerl_rllib/envs/env.py index 3c56295..2e1035b 100644 --- a/minerl_rllib/envs/env.py +++ b/minerl_rllib/envs/env.py @@ -1,3 +1,5 @@ +import os + import filelock import gym import gym.wrappers @@ -11,6 +13,8 @@ from minerl_wrappers import wrap from ray.tune.registry import register_env +from minerl_rllib.generate_kmeans import main as generate_kmeans + class LazyMineRLEnv(gym.Env): def __init__(self, env_spec, **kwargs): @@ -85,14 +89,43 @@ def render(self, mode="human"): pass +def wrap_env(env, env_config, env_name): + if env_config.get("kmeans", False): + # generate kmeans actions or load from data path if exists + # sets the minerl-wrappers config to use these action means + kmeans_config = env_config.get("kmeans_config", {}) + args = [ + "--env", + env_name, + "--num-actions", + str(kmeans_config.get("num_actions", 32)), + "--data-dir", + kmeans_config.get("data_dir", os.getenv("MINERL_DATA_ROOT", "data")) + ] + with filelock.FileLock("minerl_env.lock"): + means = generate_kmeans(args) + if env_config.get("diamond", False): + if "diamond_config" in env_config: + env_config["diamond_config"]["action_choices"] = means + else: + env_config["diamond_config"] = {"action_choices": means} + if env_config.get("pfrl_2020", False): + if "pfrl_2020_config" in env_config: + env_config["pfrl_2020_config"]["action_choices"] = means + else: + env_config["pfrl_2020_config"] = {"action_choices": means} + env = wrap(env, **env_config) + return env + + def register_minerl_envs(): for env_spec in ( BASIC_ENV_SPECS + COMPETITION_ENV_SPECS + BASALT_COMPETITION_ENV_SPECS ): def env_creator(env_config): - with filelock.FileLock("minerl_env.lock"): - env = wrap(LazyMineRLEnv(env_spec), **env_config) + env = LazyMineRLEnv(env_spec) + env = wrap_env(env, env_config, env_spec.name) return env register_env(env_spec.name, env_creator) diff --git a/minerl_rllib/envs/input.py b/minerl_rllib/envs/input.py index ca8c3e1..7f065b5 100644 --- a/minerl_rllib/envs/input.py +++ b/minerl_rllib/envs/input.py @@ -11,7 +11,7 @@ from ray.tune.registry import register_input from minerl_rllib.envs.data import MinerRLDataEnv -from minerl_rllib.envs.env import wrap +from minerl_rllib.envs.env import wrap_env from minerl_rllib.envs.utils import patch_data_pipeline @@ -95,7 +95,7 @@ def __init__(self, ioctx: IOContext = None): seed=seed, ) env = MinerRLDataEnv(self.data) - env = wrap(env, **env_config) + env = wrap_env(env, env_config, env_name) self.episode_generator = simulate_env_interaction(env) self.prep = get_preprocessor(env.observation_space)(env.observation_space) diff --git a/minerl_rllib/generate_kmeans.py b/minerl_rllib/generate_kmeans.py index 16d0ac0..58dfd02 100644 --- a/minerl_rllib/generate_kmeans.py +++ b/minerl_rllib/generate_kmeans.py @@ -14,8 +14,8 @@ parser.add_argument("--overwrite", action="store_true") -def main(): - args = parser.parse_args() +def main(args=None): + args = parser.parse_args(args=args) if args.env is None: env_list = [] for env_name in os.listdir(args.data_dir): @@ -24,11 +24,13 @@ def main(): else: env_list = [args.env] + return_path = None for env_name in env_list: print(f"Generating {args.num_actions}-means for {env_name}") file_dir = os.path.join(args.data_dir, f"{args.num_actions}-means") file = os.path.join(file_dir, env_name + ".npy") + return_path = file if os.path.exists(file) and not args.overwrite: print(f"k-means file already exists at {file}") continue @@ -51,6 +53,9 @@ def main(): print(kmeans) np.save(file, kmeans.cluster_centers_) + if len(env_list) == 1: + return return_path + if __name__ == "__main__": main() From 24b18dab526aec8929d7ae09ab22eb1da9369bd5 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Sun, 19 Sep 2021 01:58:21 -0400 Subject: [PATCH 38/48] fix tqdm --- minerl_rllib/envs/env.py | 6 ++++-- minerl_rllib/generate_kmeans.py | 12 ++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/minerl_rllib/envs/env.py b/minerl_rllib/envs/env.py index 2e1035b..4540f2b 100644 --- a/minerl_rllib/envs/env.py +++ b/minerl_rllib/envs/env.py @@ -16,11 +16,13 @@ from minerl_rllib.generate_kmeans import main as generate_kmeans -class LazyMineRLEnv(gym.Env): +class LazyMineRLEnv: def __init__(self, env_spec, **kwargs): self._kwargs = kwargs self.env_spec: EnvSpec = env_spec self._env = None + self.observation_space = self.env_spec.observation_space + self.action_space = self.env_spec.action_space super().__init__() def init_env(self): @@ -30,7 +32,7 @@ def init_env(self): def reset(self, **kwargs): if self._env is None: self.init_env() - return self._env.reset() + return self._env.reset(**kwargs) def step(self, action): return self._env.step(action) diff --git a/minerl_rllib/generate_kmeans.py b/minerl_rllib/generate_kmeans.py index 58dfd02..9011fae 100644 --- a/minerl_rllib/generate_kmeans.py +++ b/minerl_rllib/generate_kmeans.py @@ -6,16 +6,20 @@ from sklearn.cluster import KMeans from tqdm import tqdm +from minerl_rllib.envs.utils import patch_data_pipeline + parser = argparse.ArgumentParser() parser.add_argument("--env", default=None) parser.add_argument("--num-actions", type=int, default=32) parser.add_argument("--data-dir", default=os.getenv("MINERL_DATA_ROOT", "data")) parser.add_argument("--overwrite", action="store_true") +parser.add_argument("--use-tqdm", action="store_true") def main(args=None): args = parser.parse_args(args=args) + patch_data_pipeline() if args.env is None: env_list = [] for env_name in os.listdir(args.data_dir): @@ -39,7 +43,10 @@ def main(args=None): data = minerl.data.make(env_name) actions = [] - for trajectory_name in tqdm(list(data.get_trajectory_names())): + iter = list(data.get_trajectory_names()) + if args.use_tqdm: + iter = tqdm(iter) + for trajectory_name in iter: try: for _, action, _, _, _ in data.load_data(trajectory_name): actions.append(action["vector"]) @@ -53,7 +60,8 @@ def main(args=None): print(kmeans) np.save(file, kmeans.cluster_centers_) - if len(env_list) == 1: + if args.env is not None: + assert isinstance(return_path, str) return return_path From 6ce37f3d17083d4667cb4a8ba93dc72a65d0b0b3 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Sun, 19 Sep 2021 01:59:00 -0400 Subject: [PATCH 39/48] add sac-discrete.yaml --- config/sac-discrete.yaml | 59 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 config/sac-discrete.yaml diff --git a/config/sac-discrete.yaml b/config/sac-discrete.yaml new file mode 100644 index 0000000..bf10774 --- /dev/null +++ b/config/sac-discrete.yaml @@ -0,0 +1,59 @@ +minerl-sac-discrete: + run: SAC + stop: + time_total_s: 345600 # 4 days in seconds + info/num_steps_sampled: 8000000 # competition sample limit + # check point file located results/experiment-name/unique-name/checkpoint_X/checkpoint-X +# checkpoint_freq: 1 + checkpoint_at_end: true +# keep_checkpoints_num: 1 # keep the best checkpoint around +# checkpoint_score_attr: episode_reward_mean + # restore: path_to_checkpoint_file # does not restore the replay buffer so use with caution + local_dir: results # specifies the results folder + num_samples: 1 # number of random seeds to try + log_to_file: log.txt # useful for debugging with print statements, errors are logged to error.txt + config: + env: MineRLObtainDiamondVectorObf-v0 + env_config: + diamond: true + kmeans: true # setting this automatically generates, saves, and uses kmeans actions to discretize the action space. + kmeans_config: + num_actions: 30 + input: sampler + input_evaluation: [] + evaluation_interval: 10 + evaluation_config: + input: sampler +# train_batch_size: 1 + buffer_size: 50000 + # SAC Configs + framework: torch + soft_horizon: False + horizon: 1000 + Q_model: + conv_filters: [[64, 4, 4], [128, 4, 4], [256, 4, 4]] + fcnet_activation: relu + fcnet_hiddens: [ 256, 256, 256 ] + policy_model: + conv_filters: [[64, 4, 4], [128, 4, 4], [256, 4, 4]] + fcnet_activation: relu + fcnet_hiddens: [ 256, 256, 256 ] + tau: 0.005 + target_entropy: auto + no_done_at_end: false + n_step: 1 + rollout_fragment_length: 1 + prioritized_replay: false + train_batch_size: 256 + target_network_update_freq: 0 + timesteps_per_iteration: 1000 + learning_starts: 10 + optimization: + actor_learning_rate: 0.0001 + critic_learning_rate: 0.0003 + entropy_learning_rate: 0.0001 + num_workers: 0 + num_gpus: 1 + clip_actions: false + normalize_actions: true + metrics_smoothing_episodes: 5 \ No newline at end of file From 62530eada1472196e3102135ca7e90a660b3618c Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Sun, 19 Sep 2021 15:11:58 -0400 Subject: [PATCH 40/48] fix reverse actions --- minerl_rllib/envs/input.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/minerl_rllib/envs/input.py b/minerl_rllib/envs/input.py index 7f065b5..16a3627 100644 --- a/minerl_rllib/envs/input.py +++ b/minerl_rllib/envs/input.py @@ -18,6 +18,20 @@ def simulate_env_interaction(env, restart=True) -> SampleBatch: prep = get_preprocessor(env.observation_space)(env.observation_space) batch_builder = SampleBatchBuilder() + + # get reverse action functions + env_ptr = env + reverse_action_fns = [] + while hasattr(env_ptr, "env"): + if isinstance(env_ptr, gym.ActionWrapper): + reverse_action_fns.append(env_ptr.reverse_action) + env_ptr = env_ptr.env + + def reverse_action(action): + for f in reversed(reverse_action_fns): + action = f(action) + return action + while restart: for eps_id, trajectory_name in enumerate(env.trajectory_names): t = 0 @@ -31,7 +45,7 @@ def simulate_env_interaction(env, restart=True) -> SampleBatch: while not done: new_obs, reward, done, info = env.step(env.action_space.sample()) action = info["action"] - action = env.reverse_action(action) + action = reverse_action(action) if prev_action is None: prev_action = np.zeros_like(action) From cb8ec26cccf3b6b50757f71a47ea3782202615a4 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Thu, 23 Sep 2021 00:14:52 -0400 Subject: [PATCH 41/48] rainbow --- config/rainbow.yaml | 74 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 config/rainbow.yaml diff --git a/config/rainbow.yaml b/config/rainbow.yaml new file mode 100644 index 0000000..2d67677 --- /dev/null +++ b/config/rainbow.yaml @@ -0,0 +1,74 @@ +# base hyperparameters used from sample efficient rainbow (Appendix F) +# https://arxiv.org/abs/1906.05243 +minerl-rainbow: + run: DQN + stop: + time_total_s: 345600 # 4 days in seconds + info/num_steps_sampled: 8000000 # competition sample limit + local_dir: results # specifies the results folder + num_samples: 1 # number of random seeds to try + log_to_file: log.txt # useful for debugging with print statements, errors are logged to error.txt + checkpoint_freq: 1000 + checkpoint_at_end: true + keep_checkpoints_num: 1 # keep the best checkpoint around + checkpoint_score_attr: eval/episode_reward_mean + config: + log_level: INFO + # MineRL config + env: MineRLObtainDiamondVectorObf-v0 + env_config: + diamond: true +# diamond_config: +# gray_scale: true # (rainbow setting) +# frame_skip: 4 # (rainbow setting) +# frame_stack: 4 # (rainbow setting) + kmeans: true + kmeans_config: + num_actions: 30 + framework: torch + # evaluation + evaluation_interval: 1000 + evaluation_num_workers: 1 + evaluation_parallel_to_training: true + evaluation_config: + input: sampler + explore: false + # Rainbow config + gamma: 0.99 # (rainbow setting) + num_atoms: 51 # (rainbow setting) + noisy: True # (rainbow setting) + sigma0: 0.1 # (rainbow setting) + dueling: true # (rainbow setting) + hiddens: [ 256 ] # (sample-efficient rainbow setting) + double_q: true # (rainbow setting) + n_step: 20 # (sample-efficient rainbow setting) + model: + # Filter config. List of [out_channels, kernel, stride] for each filter + conv_filters: [ [ 64, 4, 4 ], [ 128, 4, 4 ], [ 256, 4, 4 ] ] + fcnet_hiddens: [ 256 ] + framestack: false + # exploration settings + exploration_config: # (default setting) + initial_epsilon: 1.0 + final_epsilon: 0.02 + epsilon_timesteps: 10000 + # do a train op every step + timesteps_per_iteration: 1 # (sample-efficient rainbow setting) + target_network_update_freq: 2000 # (rainbow setting) + # optimization settings + lr: .0001 # (sample-efficient rainbow setting) + adam_epsilon: .00015 # (rainbow setting) + grad_clip: 10 # (rainbow setting) + learning_starts: 1600 # (sample-efficient rainbow setting) + rollout_fragment_length: 1 # (sample-efficient rainbow setting) + train_batch_size: 32 # (rainbow setting) + # replay buffer settings + # tweak this according to how much memory you have + buffer_size: 500000 # (rainbow setting) + replay_sequence_length: 1 # (sample-efficient rainbow setting) + prioritized_replay: True # (rainbow setting) + prioritized_replay_alpha: 0.5 # (rainbow setting) + prioritized_replay_beta: 0.4 # (rainbow setting) + final_prioritized_replay_beta: 1.0 # (rainbow setting) + prioritized_replay_beta_annealing_timesteps: 8000000 # set to the expected maximum number of time steps + num_gpus: 1 \ No newline at end of file From 33272359703b3131773141d08b4e5bfc498b024e Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Thu, 23 Sep 2021 00:34:17 -0400 Subject: [PATCH 42/48] update config --- config/sac-offline.yaml | 114 ++++++++++++++++++++-------------------- 1 file changed, 58 insertions(+), 56 deletions(-) diff --git a/config/sac-offline.yaml b/config/sac-offline.yaml index e3c2292..a962776 100644 --- a/config/sac-offline.yaml +++ b/config/sac-offline.yaml @@ -1,57 +1,59 @@ minerl-sac-offline: - run: SAC - stop: - time_total_s: 345600 # 4 days in seconds - # no sample limit since using offline rl - # info/num_steps_sampled: 8000000 # competition sample limit - # check point file located results/experiment-name/unique-name/checkpoint_X/checkpoint-X -# checkpoint_freq: 1 - checkpoint_at_end: true -# keep_checkpoints_num: 1 # keep the best checkpoint around -# checkpoint_score_attr: episode_reward_mean - # restore: path_to_checkpoint_file # does not restore the replay buffer so use with caution - local_dir: results # specifies the results folder - num_samples: 1 # number of random seeds to try - log_to_file: log.txt # useful for debugging with print statements, errors are logged to error.txt - config: - env: MineRLObtainDiamondVectorObf-v0 - env_config: - diamond: true - input: minerl - input_evaluation: [] - evaluation_interval: 10 - evaluation_config: - input: sampler -# train_batch_size: 1 - buffer_size: 50000 - # SAC Configs - framework: torch - soft_horizon: False - horizon: 1000 - Q_model: - conv_filters: [[64, 4, 4], [128, 4, 4], [256, 4, 4]] - fcnet_activation: relu - fcnet_hiddens: [ 256, 256, 256 ] - policy_model: - conv_filters: [[64, 4, 4], [128, 4, 4], [256, 4, 4]] - fcnet_activation: relu - fcnet_hiddens: [ 256, 256, 256 ] - tau: 0.005 - target_entropy: auto - no_done_at_end: false - n_step: 1 - rollout_fragment_length: 1 - prioritized_replay: false - train_batch_size: 256 - target_network_update_freq: 0 - timesteps_per_iteration: 1000 - learning_starts: 10 - optimization: - actor_learning_rate: 0.0001 - critic_learning_rate: 0.0003 - entropy_learning_rate: 0.0001 - num_workers: 0 - num_gpus: 1 - clip_actions: false - normalize_actions: true - metrics_smoothing_episodes: 5 \ No newline at end of file + run: SAC + stop: + time_total_s: 345600 # 4 days in seconds + # no sample limit since using offline rl + # info/num_steps_sampled: 8000000 # competition sample limit + # check point file located results/experiment-name/unique-name/checkpoint_X/checkpoint-X + checkpoint_freq: 1000 + checkpoint_at_end: true + keep_checkpoints_num: 1 # keep the best checkpoint around + checkpoint_score_attr: eval/episode_reward_mean + # restore: path_to_checkpoint_file # does not restore the replay buffer so use with caution + local_dir: results # specifies the results folder + num_samples: 1 # number of random seeds to try + log_to_file: log.txt # useful for debugging with print statements, errors are logged to error.txt + config: + log_level: INFO + env: MineRLObtainDiamondVectorObf-v0 + env_config: + diamond: true + input: minerl + input_evaluation: [ ] + evaluation_interval: 1000 + evaluation_num_workers: 1 + evaluation_parallel_to_training: true + evaluation_config: + input: sampler + buffer_size: 500000 # runs on 128 GB memory system + # SAC Configs + framework: torch + soft_horizon: False + horizon: 1000 + Q_model: + conv_filters: [ [ 64, 4, 4 ], [ 128, 4, 4 ], [ 256, 4, 4 ] ] + fcnet_activation: relu + fcnet_hiddens: [ 256, 256, 256 ] + policy_model: + conv_filters: [ [ 64, 4, 4 ], [ 128, 4, 4 ], [ 256, 4, 4 ] ] + fcnet_activation: relu + fcnet_hiddens: [ 256, 256, 256 ] + tau: 0.005 + target_entropy: auto + no_done_at_end: false + n_step: 1 + rollout_fragment_length: 1 + prioritized_replay: false + train_batch_size: 256 + target_network_update_freq: 0 + timesteps_per_iteration: 1000 + learning_starts: 10 + optimization: + actor_learning_rate: 0.0001 + critic_learning_rate: 0.0003 + entropy_learning_rate: 0.0001 + num_workers: 0 + num_gpus: 1 + clip_actions: false + normalize_actions: true + metrics_smoothing_episodes: 5 \ No newline at end of file From 31f4272b8dc2dfe42c2380c03592af676760ace5 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Thu, 23 Sep 2021 00:42:36 -0400 Subject: [PATCH 43/48] update config --- config/sac-discrete.yaml | 118 ++++++++++++++++++++------------------- 1 file changed, 60 insertions(+), 58 deletions(-) diff --git a/config/sac-discrete.yaml b/config/sac-discrete.yaml index bf10774..e3e2c8c 100644 --- a/config/sac-discrete.yaml +++ b/config/sac-discrete.yaml @@ -1,59 +1,61 @@ minerl-sac-discrete: - run: SAC - stop: - time_total_s: 345600 # 4 days in seconds - info/num_steps_sampled: 8000000 # competition sample limit - # check point file located results/experiment-name/unique-name/checkpoint_X/checkpoint-X -# checkpoint_freq: 1 - checkpoint_at_end: true -# keep_checkpoints_num: 1 # keep the best checkpoint around -# checkpoint_score_attr: episode_reward_mean - # restore: path_to_checkpoint_file # does not restore the replay buffer so use with caution - local_dir: results # specifies the results folder - num_samples: 1 # number of random seeds to try - log_to_file: log.txt # useful for debugging with print statements, errors are logged to error.txt - config: - env: MineRLObtainDiamondVectorObf-v0 - env_config: - diamond: true - kmeans: true # setting this automatically generates, saves, and uses kmeans actions to discretize the action space. - kmeans_config: - num_actions: 30 - input: sampler - input_evaluation: [] - evaluation_interval: 10 - evaluation_config: - input: sampler -# train_batch_size: 1 - buffer_size: 50000 - # SAC Configs - framework: torch - soft_horizon: False - horizon: 1000 - Q_model: - conv_filters: [[64, 4, 4], [128, 4, 4], [256, 4, 4]] - fcnet_activation: relu - fcnet_hiddens: [ 256, 256, 256 ] - policy_model: - conv_filters: [[64, 4, 4], [128, 4, 4], [256, 4, 4]] - fcnet_activation: relu - fcnet_hiddens: [ 256, 256, 256 ] - tau: 0.005 - target_entropy: auto - no_done_at_end: false - n_step: 1 - rollout_fragment_length: 1 - prioritized_replay: false - train_batch_size: 256 - target_network_update_freq: 0 - timesteps_per_iteration: 1000 - learning_starts: 10 - optimization: - actor_learning_rate: 0.0001 - critic_learning_rate: 0.0003 - entropy_learning_rate: 0.0001 - num_workers: 0 - num_gpus: 1 - clip_actions: false - normalize_actions: true - metrics_smoothing_episodes: 5 \ No newline at end of file + run: SAC + stop: + time_total_s: 345600 # 4 days in seconds + info/num_steps_sampled: 8000000 # competition sample limit + # check point file located results/experiment-name/unique-name/checkpoint_X/checkpoint-X + checkpoint_freq: 100 + checkpoint_at_end: true + keep_checkpoints_num: 1 # keep the best checkpoint around + checkpoint_score_attr: eval/episode_reward_mean + # restore: path_to_checkpoint_file # does not restore the replay buffer so use with caution + local_dir: results # specifies the results folder + num_samples: 1 # number of random seeds to try + log_to_file: log.txt # useful for debugging with print statements, errors are logged to error.txt + config: + log_level: INFO + env: MineRLObtainDiamondVectorObf-v0 + env_config: + diamond: true + kmeans: true # setting this automatically generates, saves, and uses kmeans actions to discretize the action space. + kmeans_config: + num_actions: 30 + input: sampler + input_evaluation: [ ] + evaluation_interval: 100 + evaluation_num_workers: 1 + evaluation_parallel_to_training: true + evaluation_config: + input: sampler + buffer_size: 500000 # runs on 128 GB memory system + # SAC Configs + framework: torch + soft_horizon: False + horizon: 1000 + Q_model: + conv_filters: [ [ 64, 4, 4 ], [ 128, 4, 4 ], [ 256, 4, 4 ] ] + fcnet_activation: relu + fcnet_hiddens: [ 256, 256, 256 ] + policy_model: + conv_filters: [ [ 64, 4, 4 ], [ 128, 4, 4 ], [ 256, 4, 4 ] ] + fcnet_activation: relu + fcnet_hiddens: [ 256, 256, 256 ] + tau: 0.005 + target_entropy: auto + no_done_at_end: false + n_step: 1 + rollout_fragment_length: 1 + prioritized_replay: false + train_batch_size: 256 + target_network_update_freq: 0 + timesteps_per_iteration: 1000 + learning_starts: 10 + optimization: + actor_learning_rate: 0.0001 + critic_learning_rate: 0.0003 + entropy_learning_rate: 0.0001 + num_workers: 0 + num_gpus: 1 + clip_actions: false + normalize_actions: true + metrics_smoothing_episodes: 5 \ No newline at end of file From 216c60f408124588ae2780d318db73844bda814a Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Thu, 23 Sep 2021 00:44:49 -0400 Subject: [PATCH 44/48] update config --- config/bc.yaml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/config/bc.yaml b/config/bc.yaml index 6860226..16539ab 100644 --- a/config/bc.yaml +++ b/config/bc.yaml @@ -5,26 +5,28 @@ minerl-bc: # no sample limit since using offline rl # info/num_steps_sampled: 8000000 # competition sample limit # check point file located results/experiment-name/unique-name/checkpoint_X/checkpoint-X -# checkpoint_freq: 1 + checkpoint_freq: 1000 checkpoint_at_end: true -# keep_checkpoints_num: 1 # keep the best checkpoint around -# checkpoint_score_attr: episode_reward_mean + keep_checkpoints_num: 1 # keep the best checkpoint around + checkpoint_score_attr: eval/episode_reward_mean # restore: path_to_checkpoint_file # does not restore the replay buffer so use with caution local_dir: results # specifies the results folder num_samples: 1 # number of random seeds to try log_to_file: log.txt # useful for debugging with print statements, errors are logged to error.txt config: + log_level: INFO # minerl-rllib config changes env: MineRLObtainDiamondVectorObf-v0 env_config: diamond: true input: minerl input_evaluation: [ ] - evaluation_interval: 10 + evaluation_interval: 1000 + evaluation_num_workers: 1 + evaluation_parallel_to_training: true evaluation_config: input: sampler model: conv_filters: [ [ 64, 4, 4 ], [ 128, 4, 4 ], [ 256, 4, 4 ] ] framework: torch num_gpus: 1 - log_level: DEBUG From 37a94c985313d0627f0897801adc00d0e724a57c Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Thu, 23 Sep 2021 00:47:00 -0400 Subject: [PATCH 45/48] add README.md --- config/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 config/README.md diff --git a/config/README.md b/config/README.md new file mode 100644 index 0000000..64266b9 --- /dev/null +++ b/config/README.md @@ -0,0 +1,11 @@ +# Algorithms + +All algorithm configs here are an MVP and not tuned. All of them do not obtain good reward. + +`bc.yaml`: currently bugged because rllib + +`rainbow.yaml`: sometimes discovers rewarding episodes but data is too sparse to learn + +`sac-discrete.yaml`: extremely slow to train + +`sac-offline.yaml`: Q function drastically overestimates values highlighted due to OOD actions From 1a3bc52ee478bb46a78d20f6ef49444ba109e300 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Thu, 23 Sep 2021 00:49:00 -0400 Subject: [PATCH 46/48] typo --- config/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/README.md b/config/README.md index 64266b9..82c4e07 100644 --- a/config/README.md +++ b/config/README.md @@ -4,8 +4,8 @@ All algorithm configs here are an MVP and not tuned. All of them do not obtain g `bc.yaml`: currently bugged because rllib -`rainbow.yaml`: sometimes discovers rewarding episodes but data is too sparse to learn +`rainbow.yaml`: sometimes discovers rewarding episodes but rewards are too sparse to learn `sac-discrete.yaml`: extremely slow to train -`sac-offline.yaml`: Q function drastically overestimates values highlighted due to OOD actions +`sac-offline.yaml`: Q function drastically overestimates values due to OOD actions From 41ec1477240019b1de6a62df8d9a4a9b3ed5a92c Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Thu, 23 Sep 2021 01:14:07 -0400 Subject: [PATCH 47/48] more documentation --- README.md | 36 ++++++++++++++++++++++++++++++++++-- config/rainbow.yaml | 2 ++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 43fe104..b4a7938 100644 --- a/README.md +++ b/README.md @@ -34,9 +34,13 @@ Follow the official instructions: https://minerl.io/dataset/ If you download the data to `./data` then you don't need to set `MINERL_DATA_ROOT` in your environment variables. ### Training -Do `train.py --help` to see all options. -See the following command trains the SAC algorithm on offline data in the `MineRLObtainDiamondVectorObf-v0` environment. +Training is simple with just one command. Do `python train.py --help` to see all options. +```bash +python train.py -f path/to/config.yaml ``` + +For example, see the following command trains the SAC algorithm on offline data in the `MineRLObtainDiamondVectorObf-v0` environment. +```bash python train.py -f config/sac-offline.yaml ``` @@ -44,3 +48,31 @@ python train.py -f config/sac-offline.yaml This repository comes with a modular configuration system. We specify configuration `yaml` files according to the rllib specification. +Read more about rllib config specification [here](https://docs.ray.io/en/master/rllib-training.html#common-parameters). +Check out the [`config/`](https://github.com/juliusfrost/minerl-rllib/tree/master/config) +directory for more example configs. + +You can specify the [`minerl-wrappers`](https://github.com/minerl-wrappers/minerl-wrappers) +configuration arguments with the `env_config` setting. +Check [here](https://github.com/minerl-wrappers/minerl-wrappers/blob/main/minerl_wrappers/config.py) +for other config options for different wrappers. +```yaml +training-run-name: + ... + config: + ... + env: MineRLObtainDiamondVectorObf-v0 + env_config: + # use diamond wrappers from minerl-wrappers + diamond: true + diamond_config: + gray_scale: true + frame_skip: 4 + frame_stack: 4 + # This repo-exclusive API discretizes the action space by calculating the kmeans actions + # from the minerl dataset for the chosen env. Kmeans results are cached to data location. + kmeans: true + kmeans_config: + num_actions: 30 +``` + diff --git a/config/rainbow.yaml b/config/rainbow.yaml index 2d67677..6b8b32e 100644 --- a/config/rainbow.yaml +++ b/config/rainbow.yaml @@ -22,6 +22,8 @@ minerl-rainbow: # gray_scale: true # (rainbow setting) # frame_skip: 4 # (rainbow setting) # frame_stack: 4 # (rainbow setting) + # This repo-exclusive API discretizes the action space by calculating the kmeans actions + # from the minerl dataset for the chosen env. Kmeans results are cached to data location. kmeans: true kmeans_config: num_actions: 30 From 463757f5a43d98f58e5aaa10c771a29de0d6ae50 Mon Sep 17 00:00:00 2001 From: Julius Frost <33183774+juliusfrost@users.noreply.github.com> Date: Thu, 23 Sep 2021 01:16:29 -0400 Subject: [PATCH 48/48] add CITATION.cff --- CITATION.cff | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 CITATION.cff diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000..b0b426d --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,14 @@ +# YAML 1.2 +--- +authors: + - + family-names: Frost + given-names: Julius + orcid: "https://orcid.org/0000-0002-8401-8122" +cff-version: "1.1.0" +date-released: 2020-06-24 +license: "GPL-3.0-only" +message: "If you use this software, please cite it using these metadata." +repository-code: "https://github.com/juliusfrost/minerl-rllib" +title: "minerl-wrappers" +... \ No newline at end of file